|
|
|
@ -19,7 +19,19 @@ class Pathname |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
class Base |
|
|
|
|
module OutputHelper |
|
|
|
|
def d msg, eq |
|
|
|
|
raise ProgrammError, msg, caller[1..-1] unless eq |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def err *args |
|
|
|
|
STDERR.puts "\e[31;1m#{args.join ' '}\e[0m" |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def msg first, *args |
|
|
|
|
STDERR.puts "\e[33m#{first}\e[35m #{args.join ' '}\e[0m" |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def task name, &exe |
|
|
|
|
STDERR.puts "\e[30;1m***\e[0m #{name} \e[30;1m#{'*' * [0,80-name.length].max}\e[0m" |
|
|
|
|
if yield |
|
|
|
@ -31,23 +43,15 @@ class Base |
|
|
|
|
STDERR.puts "\n\e[31;1m|||\e[0m #{name} \e[31;1m#{'|' * [0,80-name.length].max}\e[0m\n" |
|
|
|
|
raise |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
class Base |
|
|
|
|
include OutputHelper |
|
|
|
|
|
|
|
|
|
def self.run *args, &exe |
|
|
|
|
new( *args).instance_eval &exe |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def d msg, eq |
|
|
|
|
raise ProgrammError, msg, caller[1..-1] unless eq |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def err *args |
|
|
|
|
STDERR.puts "\e[31;1m#{args.join ' '}\e[0m" |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def msg first, *args |
|
|
|
|
STDERR.puts "\e[33m#{first}\e[35m #{args.join ' '}\e[0m" |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def kpartx image, read_only: nil |
|
|
|
|
sh.kpartx "-sa#{read_only ? :r : ''}", image |
|
|
|
|
lpartx image |
|
|
|
@ -103,10 +107,10 @@ class Base |
|
|
|
|
msg :manipulate, file |
|
|
|
|
File.open file.to_s, flags do |file| |
|
|
|
|
lines = [] |
|
|
|
|
exe.call file, &lines.method(:push) |
|
|
|
|
exe.call file, &lines.method( :push) |
|
|
|
|
file.truncate 0 |
|
|
|
|
file.pos = 0 |
|
|
|
|
lines.each &file.method(:puts) |
|
|
|
|
lines.each &file.method( :puts) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
@ -158,22 +162,22 @@ class Base |
|
|
|
|
#end |
|
|
|
|
#STDERR.puts x.inspect |
|
|
|
|
#exit 1 |
|
|
|
|
@mounted, @activated_vgs = [], [] |
|
|
|
|
@mounted, @activated_vgs = Hash.new.tap {|h| h.default = 0 }, [] |
|
|
|
|
@looped = Hash.new {|h,k| h[k] = [] } |
|
|
|
|
@base = Image.new self, 'base', image: @baseimage |
|
|
|
|
@dest = Image.new self, 'dest', image: @destination |
|
|
|
|
|
|
|
|
|
@qemu_bin = dest.root.join 'usr/bin/qemu-arm-static' |
|
|
|
|
|
|
|
|
|
STDERR.print <<EOF |
|
|
|
|
Settings: |
|
|
|
|
username: #{@username || '(default)'} |
|
|
|
|
password: #{@password ? '*********' : '(default)'} |
|
|
|
|
baseimage: #{@base.image} |
|
|
|
|
destination: #{@dest.image} |
|
|
|
|
vgname: #{@vgname} |
|
|
|
|
hostname: #{@hostname || '(default)'} |
|
|
|
|
EOF |
|
|
|
|
STDERR.print <<-EOF.gsub( /^\s+#/, '') |
|
|
|
|
#Settings: |
|
|
|
|
# username: #{@username || '(default)'} |
|
|
|
|
# password: #{@password ? '*********' : '(default)'} |
|
|
|
|
# baseimage: #{@base.image} |
|
|
|
|
# destination: #{@dest.image} |
|
|
|
|
# vgname: #{@vgname} |
|
|
|
|
# hostname: #{@hostname || '(default)'} |
|
|
|
|
EOF |
|
|
|
|
|
|
|
|
|
sh.def_system_commands *%i[echo sed mount umount partx kpartx sync rsync xz gzip bzip2 zip tar bash dpkg apt] |
|
|
|
|
sh.def_system_commands *%i[losetup dmsetup lvcreate vgcreate pvcreate vgchange mkswap vgscan] |
|
|
|
@ -188,8 +192,8 @@ EOF |
|
|
|
|
sh.alias_command :mkvfat, *%w[mkfs.vfat] |
|
|
|
|
sh.alias_command :rsync_all, *%w[rsync --archive --hard-links --acls --xattrs --sparse] |
|
|
|
|
sh.alias_command :mount_ro, *%w[mount -oro] |
|
|
|
|
sh.alias_command :fs_uuid, *%w[blkid -o value -s UUID], return: :line |
|
|
|
|
sh.alias_command :fs_type, *%w[blkid -o value -s TYPE], return: :line |
|
|
|
|
sh.alias_command :fs_uuid, *%w[blkid -ovalue -sUUID], return: :line |
|
|
|
|
sh.alias_command :fs_type, *%w[blkid -ovalue -sTYPE], return: :line |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def getopts opts |
|
|
|
@ -241,12 +245,12 @@ EOF |
|
|
|
|
|
|
|
|
|
def cleanup &exe |
|
|
|
|
@cleanup ||= [] |
|
|
|
|
@cleanup.shift exe |
|
|
|
|
@cleanup.unshift exe |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def after &exe |
|
|
|
|
@after ||= [] |
|
|
|
|
@after.shift exe |
|
|
|
|
@after.unshift exe |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def run |
|
|
|
@ -304,31 +308,38 @@ EOF |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def mount from, to, *opts, &exe |
|
|
|
|
@mounted.push to |
|
|
|
|
sh.mount *opts, from, to |
|
|
|
|
def mount dev, mp, *opts, &exe |
|
|
|
|
@mounted[mp] += 1 |
|
|
|
|
sh.mount *opts, dev, mp |
|
|
|
|
if block_given? |
|
|
|
|
begin |
|
|
|
|
yield |
|
|
|
|
ensure |
|
|
|
|
umount to |
|
|
|
|
umount mp |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def umount mp, *opts |
|
|
|
|
r = sh.umount *opts, mp |
|
|
|
|
@mounted.delete to |
|
|
|
|
r |
|
|
|
|
if 0 < @mounted[mp] |
|
|
|
|
@mounted[mp] -= 1 |
|
|
|
|
if 0 == @mounted[mp] |
|
|
|
|
r = sh.umount *opts, mp |
|
|
|
|
@mounted.delete mp |
|
|
|
|
r |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def umount_all ignore_exceptions: nil |
|
|
|
|
until @mounted.empty? |
|
|
|
|
m = @mounted.keys.first |
|
|
|
|
if ignore_exceptions |
|
|
|
|
capsulated_rescue { sh.umount @mounted.pop } |
|
|
|
|
capsulated_rescue { sh.umount m } |
|
|
|
|
else |
|
|
|
|
sh.umount @mounted.pop |
|
|
|
|
sh.umount m |
|
|
|
|
end |
|
|
|
|
@mounted.delete m |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|