# HG changeset patch # User Heiko Schlittermann # Date 1264020148 -3600 # Node ID de0a255128449f02c12fdb3c1ae736f2a6dde486 # Parent d4942418a9ea19ae0f398c2d57149f6c83b96dac# Parent 39421a9700c5e9d0f51652ec4c344a75f8ae725d merged from stable diff -r d4942418a9ea -r de0a25512844 SI/dumper.pm --- a/SI/dumper.pm Tue Jan 19 23:48:10 2010 +0100 +++ b/SI/dumper.pm Wed Jan 20 21:42:28 2010 +0100 @@ -9,14 +9,13 @@ sub dump($\%) { my ($file, $devs) = @_; - foreach my $volume (map { { name => $_, %{ $devs->{volume}{$_} } } } - keys %{ $devs->{volume} }) + foreach my $volume ( + map { { name => $_, %{ $devs->{volume}{$_} } } } + keys %{ $devs->{volume} } + ) { next if !defined $volume->{type} or $volume->{type} !~ /^ext/i; - system("fsck -f -C0 $volume->{name}"); - die "ERR: fsck failed\n" if $? > 2; - verbose("dumping volume $volume->{name}"); my $dumpdev = $volume->{name}; my $of = sprintf $file, basename($volume->{name}); diff -r d4942418a9ea -r de0a25512844 SI/lvm.pm --- a/SI/lvm.pm Tue Jan 19 23:48:10 2010 +0100 +++ b/SI/lvm.pm Wed Jan 20 21:42:28 2010 +0100 @@ -24,6 +24,9 @@ grep { $_ ~~ @known } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`; @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs 2>/dev/null`; run("vgchange -ay @volumegroups 2>&1 >/dev/null"); + + # we wait for the /dev/mapper devices to appear + run("udevadm settle"); return @volumegroups; } @@ -41,6 +44,8 @@ foreach (@lvs) { $devs->{volume}{$_} = { origin => "lvm" }; } + + push @{ $devs->{volumes} }, @lvs; } sub vgcfgbackup($\%) { diff -r d4942418a9ea -r de0a25512844 SI/ptable.pm --- a/SI/ptable.pm Tue Jan 19 23:48:10 2010 +0100 +++ b/SI/ptable.pm Wed Jan 20 21:42:28 2010 +0100 @@ -31,8 +31,10 @@ # only useful on KVM - the usb stick doesn't appear as a removeable # device next - if (stat $0)[0] ~~ [map { (stat)[6] } - map { "/dev/" . basename(dirname $_) } glob("$_/*/partition")]; + if (stat $0)[0] ~~ [ + map { (stat)[6] } + map { "/dev/" . basename(dirname $_) } glob("$_/*/partition") + ]; verbose("\n"); verbose("device $dev\n"); @@ -57,6 +59,7 @@ origin => "ptable", ptable_type => $2, }; + push @{ $devs->{volumes} }, $1; } } diff -r d4942418a9ea -r de0a25512844 SI/system.pm --- a/SI/system.pm Tue Jan 19 23:48:10 2010 +0100 +++ b/SI/system.pm Wed Jan 20 21:42:28 2010 +0100 @@ -20,23 +20,38 @@ sub hostname(\%) { my $devs = shift; my $mnt = tempdir(CLEANUP => 1); - my $r; + my $h; foreach my $fs ( - grep { $devs->{volume}{$_}{type} =~ /^ext/i } - grep { exists $devs->{volume}{$_}{type} } - keys %{ $devs->{volume} } + grep { + exists $devs->{volume}{$_}{type} + and $devs->{volume}{$_}{type} =~ /^ext/i + } @{ $devs->{volumes} } ) { run("mount -r $fs $mnt"); if (-f "$mnt/etc/hostname") { - die "ERR: found 2nd hostname" if defined $r; - chomp($r = cat("$mnt/etc/hostname")); + chomp($h = cat("$mnt/etc/hostname")); } run("umount $mnt"); + return $h if defined $h; } - return $r; + return $h; +} + +sub fsck(\%) { + my $devs = shift; + + foreach + my $v (grep { exists $devs->{volume}{type} } keys %{ $devs->{volume} }) + { + my $volume = $devs->{volume}{$v}; + next if $volume->{type} !~ /^ext/i; + + system("fsck -C0 $v"); + die "ERR: fsck failed\n" if $? > 2; + } } 1; diff -r d4942418a9ea -r de0a25512844 si --- a/si Tue Jan 19 23:48:10 2010 +0100 +++ b/si Wed Jan 20 21:42:28 2010 +0100 @@ -19,12 +19,17 @@ use SI::lvm; use SI::mbr; use SI::dumper; +use SI::tools; use SI::system; my $opt_exit = ""; my $opt_dir = ""; MAIN: { + my %id = ( + mac => SI::system::id, + name => undef, + ); GetOptions( "exit=s" => \$opt_exit, @@ -38,11 +43,11 @@ $dir = $opt_dir; } else { - $dir = dirname($0) . "/../image-" . SI::system::id(); + $dir = dirname($0) . "/../image-$id{mac}"; remove_tree($dir); -d $dir or mkdir($dir, 0700) or die "Can't mkdir $dir: $!\n"; } - make_path(map { "$dir/$_" } qw(ptable lvm blkid mbr dump)); + make_path(map { "$dir/$_" } qw(info ptable lvm blkid mbr dump)); SI::ptable::volumes("$dir/ptable/%s", %devices); die Dumper \%devices if $opt_exit =~ /ptable/; @@ -59,18 +64,25 @@ SI::mbr::save("$dir/mbr/%s", %devices); die Dumper \%devices if $opt_exit =~ /mbr/; + SI::system::fsck(%devices); + die Dumper \%devices if $opt_exit =~ /fsck/; + + $id{name} = SI::system::hostname(%devices); + unlink("../image-$id{name}") if -l "../image-$id{name}"; + symlink(basename($dir), "../image-$id{name}"); + + print { new IO::File ">$dir/info/mac" } "$id{mac}\n"; + print { new IO::File ">$dir/info/name" } "$id{name}\n"; + print { new IO::File ">$dir/info/devices" } Dumper \%devices + or die "ERR: Can't open $dir/info/devices: $!\n"; + SI::dumper::dump("$dir/dump/%s", %devices); - my $o = new IO::File ">$dir/devices" - or die "ERR: Can't open $dir/devices: $!\n"; - $o->print(Dumper \%devices); + # HACK ... fixme + system("rmdir ../* 2>/dev/null"); - # we wait until now, since now it's sure that - # the filesystems are checked and that we mount the - # devices we need - my $hostname = SI::system::hostname(%devices); - symlink(basename($dir), "../image-$hostname"); - + print { new IO::File ">$dir/done" } localtime() . "\n"; + run("sync"); exit; }