did some cleanup, works for physical devices only
authorHeiko Schlittermann <hs@schlittermann.de>
Sun, 17 Jan 2010 13:54:10 +0100
changeset 13 2e3ad71484ea
parent 12 a1aee1136609
child 14 aecda2763079
did some cleanup, works for physical devices only
SI/blkid.pm
SI/lvm.pm
SI/mbr.pm
SI/ptable.pm
SI/tools.pm
--- a/SI/blkid.pm	Mon Jan 18 20:35:27 2010 +0100
+++ b/SI/blkid.pm	Sun Jan 17 13:54:10 2010 +0100
@@ -11,21 +11,15 @@
 sub ids($\%) {
     my ($file, $devs) = @_;
 
-    verbose("reading blkids:");
-    foreach (`blkid -c /dev/null`) {
+    my @volumes = sort keys %{$devs->{volume}};
+    verbose("reading blkids: @volumes");
+    foreach (`blkid -c /dev/null @volumes`) {
         my $dev = (split /:/)[0];
-	### $dev
-	verbose($dev);
 
         my ($uuid)  = /\sUUID=.(.*?).\s/;
         my ($type)  = /\sTYPE=.(.*?).\s/;
         my ($label) = /\sLABEL=.(.*?).\s/;
 
-        # 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;
--- a/SI/lvm.pm	Mon Jan 18 20:35:27 2010 +0100
+++ b/SI/lvm.pm	Sun Jan 17 13:54:10 2010 +0100
@@ -16,8 +16,8 @@
 
     my $devs = shift;
 
-    # find the physical volumes we already recognised as „non-removable“
-    my @pvs = grep { $_ ~~ $devs->{disk} } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`;
+    # find the physical volumes we've already recognised as „non-removable“
+    my @pvs = grep { $_ ~~ $devs->{known} } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`;
     return @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs 2>/dev/null`;
 }
 
@@ -32,15 +32,9 @@
 	      map { s/^\s*//; (split /:/)[0] } 
 	      grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;
 
-    foreach (keys %{$devs->{volume}}) {
-	warn "---> $_\n";
-	$devs->{volume}{$_} = {
-	    vol_type => ($_ ~~ @lvs) ? "lv" : "",
-	}
+    foreach (@lvs) {
+	$devs->{volume}{$_} = { origin => "lvm" };
     }
-### $devs
-    #@{$devs->{volume}}{@lvs} = map { { vol_type => "lv"  } } @lvs;
-
 }
 
 sub vgcfgbackup($\%) {
@@ -52,7 +46,7 @@
     {
 	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
--- a/SI/mbr.pm	Mon Jan 18 20:35:27 2010 +0100
+++ b/SI/mbr.pm	Sun Jan 17 13:54:10 2010 +0100
@@ -3,6 +3,7 @@
 use strict;
 use warnings;
 use File::Basename;
+use IO::File;
 use if $ENV{DEBUG} ~~ q(mbr) => "Smart::Comments";
 
 use SI::tools;
@@ -14,9 +15,9 @@
 	foreach my $disk (keys %{$devs->{disk}}) {
 		verbose("saving mbr of $disk\n");
 		open((my $o), $_ = sprintf(">$file", basename($disk))) or die "Can't open $_: $!\n";
+
 		local $/ = \512;
-
-		open(my $in, $disk) or die "Can't open $disk: $!\n";
+		my $in = new IO::File $disk or die "Can't open $disk: $!\n";
 		print $o $_ = <$in>;
 	}
 }
--- a/SI/ptable.pm	Mon Jan 18 20:35:27 2010 +0100
+++ b/SI/ptable.pm	Sun Jan 17 13:54:10 2010 +0100
@@ -5,68 +5,58 @@
 use strict;
 use warnings;
 use File::Find;
+use File::Basename;
 use IO::File;
 
-
 use SI::tools;
 $ENV{LC_ALL} = "C";
 
 sub volumes($\%) {
     my ($file, $devs) = @_;
 
-    # find the non-removable devices
-
-    my ($current, $of);
-    foreach (`sfdisk -d 2>/dev/null`) {
-        chomp;
+    # find the partition tables of all
+    # non-removable block devices (this may include
+    # LVs (used as disk itself) too)
+    foreach (glob("/sys/block/*")) {
+	    my $name = basename($_);
+	    verbose("device $name");
 
-	# new entry, new disk
-        if (my ($device, $name) = /^# partition table .*?(\/\S+\/(\S+))/) {
-	    verbose("scanning device $device");
-
+	    if (!-e "$_/device") {
+		    verbose("skipping (non-dev)\n");
+		    next;
+	    }
 	    if ((grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./) {
-		    $current = undef;
 		    verbose("skipping (removable)\n");
 		    next;
 	    }
+	    verbose("\n");
 
-	    # 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;
-		}
-	    }
+	    die "ERR: /dev/$name does not exist. (should not happen)"
+		if !-e "/dev/$name";
+
+	    # now the physical disk -- let's ask for the partition table
 
-	    # save in our data structure
-	    verbose("\n");
-	    $current = $device;
-	    push @{$devs->{disk}{$current}{pt}}, $_;
+	    my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`;
+
+	    my $of = sprintf $file, $name;
+	    my $oh = new IO::File ">$of" or die "Can't open >$of: $!\n";
+	    print $oh @sfdisk;
 
-	    # 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";
+	    $devs->{disk}{"/dev/$name"} = { 
+		pt => \@sfdisk
+	    };
 
-	    next;
-        }
-
-        next if not $current;
+	    push @{$devs->{known}}, "/dev/$name";
 
-	push @{$devs->{disk}{$current}{pt}}, $_;
-	print $of "$_\n";
-
-	# 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/;
+	    # and let's prepare the volume entries
+	    foreach (@sfdisk) {
+		/^(\S+)\s*:.*Id=\s*(\d+)/ or next;
+		$devs->{volume}{$1} = {
+			origin => "ptable",
+			ptable_type => $2,
+		    };
+		push @{$devs->{known}}, $1;
 	    }
-	    $devs->{volume}{$dev}{fstype} = $id;
-	}
-
     }
 
     return;
--- a/SI/tools.pm	Mon Jan 18 20:35:27 2010 +0100
+++ b/SI/tools.pm	Sun Jan 17 13:54:10 2010 +0100
@@ -7,7 +7,7 @@
 use File::Find;
 use base "Exporter";
 
-our @EXPORT = qw(&run &verbose &find_by_devid);
+our @EXPORT = qw(&run &verbose &find_by_devid &cat);
 
 sub run(@) {
 	system(@_);
@@ -15,6 +15,13 @@
 	if $?;
 }
 
+sub cat($) {
+    my $fh = new IO::File $_[0] 
+	or die "Can't open $_[0]: $!\n";
+    return(<$fh>) if wantarray;
+    return join "", <$fh>;
+}
+
 my $last = "\n";
 sub verbose(@) { 
     print $last eq "\n" ? "" : " "