mounted: counter for each mountpoint, for umount after last release. moving output-methods to OutputHelper.
This commit is contained in:
parent
6307b9a273
commit
e9831ba31b
|
@ -19,7 +19,19 @@ class Pathname
|
||||||
end
|
end
|
||||||
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
|
def task name, &exe
|
||||||
STDERR.puts "\e[30;1m***\e[0m #{name} \e[30;1m#{'*' * [0,80-name.length].max}\e[0m"
|
STDERR.puts "\e[30;1m***\e[0m #{name} \e[30;1m#{'*' * [0,80-name.length].max}\e[0m"
|
||||||
if yield
|
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"
|
STDERR.puts "\n\e[31;1m|||\e[0m #{name} \e[31;1m#{'|' * [0,80-name.length].max}\e[0m\n"
|
||||||
raise
|
raise
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Base
|
||||||
|
include OutputHelper
|
||||||
|
|
||||||
def self.run *args, &exe
|
def self.run *args, &exe
|
||||||
new( *args).instance_eval &exe
|
new( *args).instance_eval &exe
|
||||||
end
|
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
|
def kpartx image, read_only: nil
|
||||||
sh.kpartx "-sa#{read_only ? :r : ''}", image
|
sh.kpartx "-sa#{read_only ? :r : ''}", image
|
||||||
lpartx image
|
lpartx image
|
||||||
|
@ -158,21 +162,21 @@ class Base
|
||||||
#end
|
#end
|
||||||
#STDERR.puts x.inspect
|
#STDERR.puts x.inspect
|
||||||
#exit 1
|
#exit 1
|
||||||
@mounted, @activated_vgs = [], []
|
@mounted, @activated_vgs = Hash.new.tap {|h| h.default = 0 }, []
|
||||||
@looped = Hash.new {|h,k| h[k] = [] }
|
@looped = Hash.new {|h,k| h[k] = [] }
|
||||||
@base = Image.new self, 'base', image: @baseimage
|
@base = Image.new self, 'base', image: @baseimage
|
||||||
@dest = Image.new self, 'dest', image: @destination
|
@dest = Image.new self, 'dest', image: @destination
|
||||||
|
|
||||||
@qemu_bin = dest.root.join 'usr/bin/qemu-arm-static'
|
@qemu_bin = dest.root.join 'usr/bin/qemu-arm-static'
|
||||||
|
|
||||||
STDERR.print <<EOF
|
STDERR.print <<-EOF.gsub( /^\s+#/, '')
|
||||||
Settings:
|
#Settings:
|
||||||
username: #{@username || '(default)'}
|
# username: #{@username || '(default)'}
|
||||||
password: #{@password ? '*********' : '(default)'}
|
# password: #{@password ? '*********' : '(default)'}
|
||||||
baseimage: #{@base.image}
|
# baseimage: #{@base.image}
|
||||||
destination: #{@dest.image}
|
# destination: #{@dest.image}
|
||||||
vgname: #{@vgname}
|
# vgname: #{@vgname}
|
||||||
hostname: #{@hostname || '(default)'}
|
# hostname: #{@hostname || '(default)'}
|
||||||
EOF
|
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[echo sed mount umount partx kpartx sync rsync xz gzip bzip2 zip tar bash dpkg apt]
|
||||||
|
@ -241,12 +245,12 @@ EOF
|
||||||
|
|
||||||
def cleanup &exe
|
def cleanup &exe
|
||||||
@cleanup ||= []
|
@cleanup ||= []
|
||||||
@cleanup.shift exe
|
@cleanup.unshift exe
|
||||||
end
|
end
|
||||||
|
|
||||||
def after &exe
|
def after &exe
|
||||||
@after ||= []
|
@after ||= []
|
||||||
@after.shift exe
|
@after.unshift exe
|
||||||
end
|
end
|
||||||
|
|
||||||
def run
|
def run
|
||||||
|
@ -304,31 +308,38 @@ EOF
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def mount from, to, *opts, &exe
|
def mount dev, mp, *opts, &exe
|
||||||
@mounted.push to
|
@mounted[mp] += 1
|
||||||
sh.mount *opts, from, to
|
sh.mount *opts, dev, mp
|
||||||
if block_given?
|
if block_given?
|
||||||
begin
|
begin
|
||||||
yield
|
yield
|
||||||
ensure
|
ensure
|
||||||
umount to
|
umount mp
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def umount mp, *opts
|
def umount mp, *opts
|
||||||
|
if 0 < @mounted[mp]
|
||||||
|
@mounted[mp] -= 1
|
||||||
|
if 0 == @mounted[mp]
|
||||||
r = sh.umount *opts, mp
|
r = sh.umount *opts, mp
|
||||||
@mounted.delete to
|
@mounted.delete mp
|
||||||
r
|
r
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def umount_all ignore_exceptions: nil
|
def umount_all ignore_exceptions: nil
|
||||||
until @mounted.empty?
|
until @mounted.empty?
|
||||||
|
m = @mounted.keys.first
|
||||||
if ignore_exceptions
|
if ignore_exceptions
|
||||||
capsulated_rescue { sh.umount @mounted.pop }
|
capsulated_rescue { sh.umount m }
|
||||||
else
|
else
|
||||||
sh.umount @mounted.pop
|
sh.umount m
|
||||||
end
|
end
|
||||||
|
@mounted.delete m
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -167,22 +167,32 @@ class Raspbian < Base
|
||||||
'pi1' => { initramfs: 'initramfs initrd.img followkernel', },
|
'pi1' => { initramfs: 'initramfs initrd.img followkernel', },
|
||||||
'pi0' => { initramfs: 'initramfs initrd.img followkernel', },
|
'pi0' => { initramfs: 'initramfs initrd.img followkernel', },
|
||||||
}
|
}
|
||||||
blocks = [nil]
|
|
||||||
content = Hash.new {|h,block| h[block] = [] }
|
content = Hash.new {|h,block| h[block] = [] }
|
||||||
block = nil
|
block = nil
|
||||||
|
blocks = Set.new
|
||||||
|
blocks.add nil
|
||||||
f.each_line do |l|
|
f.each_line do |l|
|
||||||
l.chomp!
|
l.chomp!
|
||||||
case l
|
case l
|
||||||
when /\A\[([^\]]*)\]\z/
|
when /\A\[([^\]]*)\]\z/
|
||||||
block = $1
|
block = $1
|
||||||
blocks.push block
|
l = nil
|
||||||
when /\Ainitramfs /
|
blocks.add block
|
||||||
l = replace[block].delete :initramfs
|
when /\A\s*(\w+)\s*=/i, /\A\s*(initramfs)\s+/
|
||||||
|
b = $1.to_sym
|
||||||
|
l = replace[block].delete b if replace[block]&.has_key? b
|
||||||
end
|
end
|
||||||
content[block].push l
|
unless l.nil?
|
||||||
|
content[block].push l if ''==l or l.start_with?( '#') or not content[block].include?( l)
|
||||||
end
|
end
|
||||||
replace.each {|block, rpl| content[block] += rpl.values + [''] unless rpl.empty? }
|
end
|
||||||
blocks.flat_map {|block| content[block] }
|
replace.each do |block, rpl|
|
||||||
|
unless rpl.empty?
|
||||||
|
content[block] += rpl.values + ['']
|
||||||
|
blocks.add block
|
||||||
|
end
|
||||||
|
end
|
||||||
|
blocks.flat_map {|block| ["[#{block}]"] + content[block] }
|
||||||
end
|
end
|
||||||
|
|
||||||
addmp[:boot].join( 'ssh').write ''
|
addmp[:boot].join( 'ssh').write ''
|
||||||
|
|
Loading…
Reference in a new issue