merged from stable
authorHeiko Schlittermann <hs@schlittermann.de>
Wed, 20 Jan 2010 21:42:28 +0100
changeset 27 de0a25512844
parent 17 d4942418a9ea (current diff)
parent 26 39421a9700c5 (diff)
child 28 7d7ca3f05f25
merged from stable
--- 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;
 
 }