added hgignore, prepared dumping
authorHeiko Schlittermann <hs@schlittermann.de>
Sat, 16 Jan 2010 23:53:50 +0100
changeset 7 03ca6d811a17
parent 6 df6ca24871d4
child 9 1a6f6cfc46ea
child 10 23dd30396607
added hgignore, prepared dumping
.hgignore
SI/blkid.pm
SI/dumper.pm
SI/lvm.pm
SI/mbr.pm
SI/ptable.pm
SI/tools.pm
si
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Sat Jan 16 23:53:50 2010 +0100
@@ -0,0 +1,2 @@
+syntax: glob
+out/
--- a/SI/blkid.pm	Fri Jan 15 23:17:23 2010 +0100
+++ b/SI/blkid.pm	Sat Jan 16 23:53:50 2010 +0100
@@ -4,38 +4,12 @@
 use warnings;
 use File::Find;
 
-sub ff($$);
 
-sub save($\%) {
-    my ($file, $part) = @_;
-
-    foreach (`blkid -c /dev/null`) {
-        my ($dev) = (split /:/)[0];
-
-        my ($uuid)  = /\sUUID=.(.*?).\s/;
-        my ($type)  = /\sTYPE=.(.*?).\s/;
-        my ($label) = /\sLABEL=.(.*?).\s/;
+use if $ENV{DEBUG} ~~ /blkid|all/ => "Smart::Comments";
 
-        if ($dev ~~ $part->{physical}) {
-            $part->{physical}{$dev}{uuid}  = $uuid;
-            $part->{physical}{$dev}{type}  = $type;
-            $part->{physical}{$dev}{label} = $label;
-            next;
-        }
+use SI::tools;
 
-        # dev mapper names should be replace by nicer ones
-        if ($dev ~~ /^\/dev\/dm-/) {
-            $dev = ff("/dev/mapper", (stat $dev)[6])
-              or next;
-            $part->{logical}{$dev}{uuid}  = $uuid;
-            $part->{logical}{$dev}{type}  = $type;
-            $part->{logical}{$dev}{label} = $label;
-        }
-
-    }
-}
-
-sub ff($$) {
+sub find_by_devid($$) {
     my ($dir, $id) = @_;
     my $found;
     find(
@@ -49,5 +23,41 @@
     return $found;
 }
 
+
+sub ids($\%) {
+    my ($file, $devs) = @_;
+
+    verbose("reading blkids:");
+    foreach (`blkid -c /dev/null`) {
+        my $dev = (split /:/)[0];
+	### $dev
+	verbose($dev);
+
+        my ($uuid)  = /\sUUID=.(.*?).\s/;
+        my ($type)  = /\sTYPE=.(.*?).\s/;
+        my ($label) = /\sLABEL=.(.*?).\s/;
+
+        #if ($dev ~~ $devs->{physical}) {
+            #$devs->{physical}{$dev}{uuid}  = $uuid;
+            #$devs->{physical}{$dev}{type}  = $type;
+            #$devs->{physical}{$dev}{label} = $label;
+            #next;
+        #}
+
+        # dev mapper names should be replaced by nicer ones
+        if ($dev ~~ /^\/dev\/dm-/) {
+            $dev = find_by_devid("/dev/mapper", (stat $dev)[6]);
+	};
+
+	if (exists $devs->{volume}{$dev}) {
+            $devs->{volume}{$dev}{uuid}  = $uuid;
+            $devs->{volume}{$dev}{type}  = $type;
+            $devs->{volume}{$dev}{label} = $label;
+	}
+
+    }
+    verbose("\n");
+}
+
 1;
 # vim:sts=4 sw=4 aw ai si:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SI/dumper.pm	Sat Jan 16 23:53:50 2010 +0100
@@ -0,0 +1,22 @@
+package SI::dumper;
+
+use strict;
+use warnings;
+use SI::tools;
+use if $ENV{DEBUG} ~~ /dumper|all/ => "Smart::Comments";
+
+sub dump($\%) {
+    my ($file, $devs) = @_;
+
+    ### $devs
+
+    my %volume = %{$devs->{volume}};
+
+    foreach my $v ( grep { $volume{$_}{type} ~~ /^ext/ } keys %volume ) {
+	verbose("dumping $v\n");
+    }
+}
+
+1;
+
+# vim:sts=4 sw=4 aw ai sm:
--- a/SI/lvm.pm	Fri Jan 15 23:17:23 2010 +0100
+++ b/SI/lvm.pm	Sat Jan 16 23:53:50 2010 +0100
@@ -2,16 +2,61 @@
 
 use strict;
 use warnings;
+use IO::File;
+
+use if $ENV{DEBUG} ~~ /lvm|all/ => qw(Smart::Comments);
+
 use SI::tools;
 
+my @volumegroups = ();
+
+sub _vgs(\%) {
+    return @volumegroups if @volumegroups;
+
+    my $devs = shift;
+
+    my @pvs = grep { $devs->{volume}{$_}{type} =~ /^lvm/ } 
+	grep { defined $devs->{volume}{$_} }
+	keys %{$devs->{volume}};
+
+    return @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs`;
+}
+
+sub volumes(\%) {
+    my ($devs) = @_;
+
+    # we can't just use `pvs', since this would return *all*
+    # physical devices known to lvm, not just the non-removable
+    my @pvs = grep { $devs->{volume}{$_}{type} =~ /^lvm/ } 
+	grep { defined $devs->{volume}{$_} }
+	keys %{$devs->{volume}};
+
+    my @vgs = _vgs(%$devs);
+    my @lvs = map { readlink } 
+	      map { s/^\s*//; (split /:/)[0] } 
+	      grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;
+
+    @{$devs->{volume}}{@lvs} = ();
+
+
+}
+
 sub vgcfgbackup($\%) {
-    my ($file, $part) = @_;
-    foreach (map { (split /:/)[0] }
-        map { /^\s*(.*)/; } `vgs --noheadings --separator :`)
+    my ($file, $devs) = @_;
+
+    # we save it vg by vg to have the restore more easy
+    my @vgs = _vgs(%$devs);
+    foreach ( map { s/^\s*(.*)/$1/; $_ = (split /:/)[0] } `vgs --noheadings --separator : @vgs`)
     {
+	verbose("saving vg $_\n");
         my $file = sprintf $file, $_;
-        run("vgcfgbackup -f $file >/dev/null");
+        run("vgcfgbackup -f $file $_ >/dev/null");
     }
+
+    # for testing let's save it all
+    verbose("saving vg *\n");
+    $file = sprintf $file, "*";
+    run("vgcfgbackup -f '$file' >/dev/null");
 }
 
 1;
--- a/SI/mbr.pm	Fri Jan 15 23:17:23 2010 +0100
+++ b/SI/mbr.pm	Sat Jan 16 23:53:50 2010 +0100
@@ -5,11 +5,14 @@
 use File::Basename;
 use if $ENV{DEBUG} ~~ q(mbr) => "Smart::Comments";
 
+use SI::tools;
+
 sub save($\%) {
-	my ($file, $devices) = @_;
+	my ($file, $devs) = @_;
 	
 
-	foreach my $disk (keys %{$devices->{disks}}) {
+	foreach my $disk (keys %{$devs->{disks}}) {
+		verbose("saving mbr of $disk\n");
 		open((my $o), $_ = sprintf(">$file", basename($disk))) or die "Can't open $_: $!\n";
 		local $/ = \512;
 
--- a/SI/ptable.pm	Fri Jan 15 23:17:23 2010 +0100
+++ b/SI/ptable.pm	Sat Jan 16 23:53:50 2010 +0100
@@ -2,60 +2,55 @@
 
 use strict;
 use warnings;
-use if $ENV{DEBUG} ~~ "ptable" => "Smart::Comments";
 use File::Find;
+use IO::File;
 
-$ENV{LC_ALL} = "C";
+use if $ENV{DEBUG} ~~ /ptable|all/ => qw(Smart::Comments);
 
 use SI::tools;
-
-sub save($\%) {
-    my ($file, $part) = @_;
+$ENV{LC_ALL} = "C";
 
-    # find the major number of the devmapper
-    my $devmapper = 0;
-    {
-        local $/ = undef;
-        open(my ($i), "/proc/devices")
-          or die "ERR: Can't open /proc/devices: $!\n";
-        ($devmapper) = <$i> =~ /^\s*(\d+)\s+device.mapper\b/m;
-    }
+sub volumes($\%) {
+    my ($file, $devs) = @_;
 
-    # find the non-removable devices, store their
-    # names as $part->{disks}{DEVICE}
-    # and save the current sfdisk dump of these devices
-    # in @{$dev{DEVICE}}
-    my ($current, %dev);
+    # find the non-removable devices
+    my ($current, $of);
     foreach (`sfdisk -d 2>/dev/null`) {
         chomp;
         if (/^# partition table .*?(\/\S+\/(\S+))/) {
 	    # skip the removable devices
 	    my ($device, $name) = ($1, $2);
-	    $_ = (grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0];
-	    $current = /==.0./ ? $device : undef;
-	    $part->{disks}{$current} = undef if $current;
+	    verbose("device $device");
+	    if ((grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./) {
+		    $current = undef;
+		    verbose("skipping (removable)\n");
+		    next;
+	    }
+
+	    # save in our data structure
+	    verbose("scanning\n");
+	    $current = $device;
+	    push @{$devs->{disk}{$current}{pt}}, $_;
+
+	    # and open the outfile
+	    my $f = sprintf ">$file", $name;
+	    $of = new IO::File $f or die "ERR: Can't open $f: $!\n";
+	    print $of "$_\n";
+
 	    next;
         }
         next if not $current;
-        push @{ $dev{$current} }, $_;
+	push @{$devs->{disk}{$current}{pt}}, $_;
+	print $of "$_\n";
+
+	if (/^(\/dev\/\S+)\s*:/) {
+	    $devs->{volume}{$1} = undef;
+	}
+
     }
 
-    ### %dev
-### exit
-
-    # process the partition tables
-    # and output the tables for relevant devices
-    foreach my $dev (keys %dev) {
-        ($_ = $dev) =~ s/^.*\///;
-        my $file = sprintf $file, $_;
-        die "ERR: $file exists already\n" if -f $file;
-        open(my $o, ">$file") or die "ERR: Can't open $file: $!\n";
-        print $o join "\n", @{ $dev{$dev} }, "";
-    }
-
-    # reserve entries in %part, one for each partition
-    @{ $part->{physical} }{ map { (split)[0] }
-          grep { /^\// } map { @$_ } values %dev } = ();
+### $devs
+    return;
 }
 1;
 # vim:sts=4 sw=4 aw ai si:
--- a/SI/tools.pm	Fri Jan 15 23:17:23 2010 +0100
+++ b/SI/tools.pm	Sat Jan 16 23:53:50 2010 +0100
@@ -3,7 +3,8 @@
 use strict;
 use warnings;
 use base "Exporter";
-our @EXPORT = qw(&run);
+our @EXPORT = qw(&run &verbose);
+use if $ENV{DEBUG} ~~ /tools|all/ => "Smart::Comments";
 
 sub run(@) {
 	system(@_);
@@ -11,5 +12,13 @@
 	if $?;
 }
 
+my $last = "\n";
+sub verbose(@) { 
+    print $last eq "\n" ? "" : " "
+	if not(@_ == 1 and length($_[0]) == 1);
+    print @_;
+    $last = substr($_[-1], -1, 1);
+};
+
 1;
 # vim:sts=4 sw=4 aw ai si:
--- a/si	Fri Jan 15 23:17:23 2010 +0100
+++ b/si	Sat Jan 16 23:53:50 2010 +0100
@@ -3,7 +3,7 @@
 
 use strict;
 use warnings;
-use if $ENV{DEBUG} => "Smart::Comments";
+use if $ENV{DEBUG} ~~ /main|all/ => "Smart::Comments";
 
 use Sys::Hostname;
 
@@ -11,19 +11,27 @@
 use SI::blkid;
 use SI::lvm;
 use SI::mbr;
-
-my $OUT = "../out-" . hostname;
+use SI::dumper;
 
-unlink(glob("$OUT/*"));
--d $OUT or mkdir($OUT, 0700) or die "Can't mkdir $OUT: $!\n";
+MAIN: {
+    my $OUT = "../out-" . hostname;
+
+    unlink(glob("$OUT/*"));
+    -d $OUT or mkdir($OUT, 0700) or die "Can't mkdir $OUT: $!\n";
 
-my %devices;
+    my %devices;
 
-SI::ptable::save("$OUT/partitions.%s", %devices);
-SI::blkid::save("$OUT/blkid", %devices);
-SI::lvm::vgcfgbackup("$OUT/vg.%s", %devices);
-SI::mbr::save("$OUT/mbr.%s", %devices);
+    SI::ptable::volumes("$OUT/partitions.%s", %devices);
+    SI::lvm::volumes(%devices);
+    SI::blkid::ids("$OUT/blkid", %devices);
+    SI::lvm::vgcfgbackup("$OUT/vg.%s", %devices);
+    SI::mbr::save("$OUT/mbr.%s", %devices);
+    SI::dumper::dump("$OUT/dump.%s", %devices);
+### %devices
+    exit;
 
 ### %devices;
 
+    }
+
 # vim:sts=4 sw=4 aw ai si: