[savepoint]
authorHeiko Schlittermann <hs@schlittermann.de>
Mon, 18 Jan 2010 20:35:27 +0100
changeset 12 a1aee1136609
parent 11 42c603eb6301
child 13 2e3ad71484ea
[savepoint]
SI/blkid.pm
SI/dumper.pm
SI/lvm.pm
SI/ptable.pm
SI/tools.pm
si
--- a/SI/blkid.pm	Sun Jan 17 16:40:08 2010 +0100
+++ b/SI/blkid.pm	Mon Jan 18 20:35:27 2010 +0100
@@ -4,25 +4,9 @@
 
 use strict;
 use warnings;
-use File::Find;
-
 
 use SI::tools;
 
-sub find_by_devid($$) {
-    my ($dir, $id) = @_;
-    my $found;
-    find(
-        sub {
-            return if $found;
-            $found = (stat)[6] == $id ? $File::Find::name : undef;
-            return;
-        },
-        $dir
-    );
-    return $found;
-}
-
 
 sub ids($\%) {
     my ($file, $devs) = @_;
@@ -37,15 +21,8 @@
         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-/) {
+        if ($dev =~ /\/dev\/dm-/) {
             $dev = find_by_devid("/dev/mapper", (stat $dev)[6]);
 	};
 
--- a/SI/dumper.pm	Sun Jan 17 16:40:08 2010 +0100
+++ b/SI/dumper.pm	Mon Jan 18 20:35:27 2010 +0100
@@ -8,15 +8,11 @@
 sub dump($\%) {
     my ($file, $devs) = @_;
 
-    ### $devs
-    use Data::Dumper;
-    print Dumper $devs;
-    exit;
-
     my %volume = %{$devs->{volume}};
 
     foreach my $v ( grep { $volume{$_}{type} ~~ /^ext/ } keys %volume ) {
 	verbose("dumping $v\n");
+	### v: $volume{$v}
     }
 }
 
--- a/SI/lvm.pm	Sun Jan 17 16:40:08 2010 +0100
+++ b/SI/lvm.pm	Mon Jan 18 20:35:27 2010 +0100
@@ -16,10 +16,8 @@
 
     my $devs = shift;
 
-    use Data::Dumper;
-    die Dumper \@pvs;
-    my @pvs = grep { exists $devs->{disk}{$_} } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`;
-
+    # find the physical volumes we already recognised as „non-removable“
+    my @pvs = grep { $_ ~~ $devs->{disk} } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`;
     return @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs 2>/dev/null`;
 }
 
@@ -34,8 +32,14 @@
 	      map { s/^\s*//; (split /:/)[0] } 
 	      grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;
 
-    @{$devs->{volume}}{@lvs} = ();
-
+    foreach (keys %{$devs->{volume}}) {
+	warn "---> $_\n";
+	$devs->{volume}{$_} = {
+	    vol_type => ($_ ~~ @lvs) ? "lv" : "",
+	}
+    }
+### $devs
+    #@{$devs->{volume}}{@lvs} = map { { vol_type => "lv"  } } @lvs;
 
 }
 
--- a/SI/ptable.pm	Sun Jan 17 16:40:08 2010 +0100
+++ b/SI/ptable.pm	Mon Jan 18 20:35:27 2010 +0100
@@ -15,21 +15,33 @@
     my ($file, $devs) = @_;
 
     # 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);
-	    verbose("device $device");
+
+	# new entry, new disk
+        if (my ($device, $name) = /^# partition table .*?(\/\S+\/(\S+))/) {
+	    verbose("scanning device $device");
+
 	    if ((grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./) {
 		    $current = undef;
 		    verbose("skipping (removable)\n");
 		    next;
 	    }
 
+	    # if it looks like a device mapper, we'll have to remember
+	    # this
+	    if ($device =~ /\/dev\/dm-/) {
+		if (my $alias = find_by_devid("/dev/mapper", (stat $device)[6])) {
+		    verbose("(alias $device)");
+		    $devs->{disk}{$alias}{dm} = $device;
+		    $device = $alias;
+		}
+	    }
+
 	    # save in our data structure
-	    verbose("scanning\n");
+	    verbose("\n");
 	    $current = $device;
 	    push @{$devs->{disk}{$current}{pt}}, $_;
 
@@ -40,17 +52,23 @@
 
 	    next;
         }
+
         next if not $current;
+
 	push @{$devs->{disk}{$current}{pt}}, $_;
 	print $of "$_\n";
 
-	if (/^(\/dev\/\S+)\s*:/) {
-	    $devs->{volume}{$1} = {};
+	# if it looks like a partition (volume), then
+	# save it
+	if (my ($dev, $id) = /^(\/dev\/\S+)\s*:.*\sId=\s*(\d+)/) {
+	    if (my $dm = $devs->{disk}{$current}{dm}) {
+		$dev =~ s/$dm/$current/;
+	    }
+	    $devs->{volume}{$dev}{fstype} = $id;
 	}
 
     }
 
-### $devs
     return;
 }
 1;
--- a/SI/tools.pm	Sun Jan 17 16:40:08 2010 +0100
+++ b/SI/tools.pm	Mon Jan 18 20:35:27 2010 +0100
@@ -4,8 +4,10 @@
 
 use strict;
 use warnings;
+use File::Find;
 use base "Exporter";
-our @EXPORT = qw(&run &verbose);
+
+our @EXPORT = qw(&run &verbose &find_by_devid);
 
 sub run(@) {
 	system(@_);
@@ -21,5 +23,21 @@
     $last = substr($_[-1], -1, 1);
 };
 
+sub find_by_devid($$) {
+    my ($dir, $id) = @_;
+    my @found;
+    find(
+        sub {
+            push @found, $File::Find::name if (stat)[6] == $id;
+            return;
+        },
+        $dir
+    );
+    die "ERR: found more than one alias (@found) for $id\n" if @found > 1;
+    die "ERR: found no alias for $id\n" if not @found;
+    return $found[0];
+}
+
+
 1;
 # vim:sts=4 sw=4 aw ai si:
--- a/si	Sun Jan 17 16:40:08 2010 +0100
+++ b/si	Mon Jan 18 20:35:27 2010 +0100
@@ -5,6 +5,8 @@
 
 use strict;
 use warnings;
+use Data::Dumper;
+use IO::File;
 
 use Sys::Hostname;
 
@@ -31,11 +33,14 @@
     SI::lvm::vgcfgbackup("$OUT/vg.%s", %devices);
     SI::mbr::save("$OUT/mbr.%s", %devices);
     SI::dumper::dump("$OUT/dump.%s", %devices);
-### %devices
+
+    my $o = new IO::File ">$OUT/devices"
+	or die "ERR: Can't open $OUT/devices: $!\n";
+    $o->print(Dumper \%devices);
+
+    
     exit;
 
-### %devices;
-
     }
 
 # vim:sts=4 sw=4 aw ai si: