--- 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});
--- 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($\%) {
--- 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;
}
}
--- 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;
--- 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;
}