--- 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: