# HG changeset patch # User Heiko Schlittermann # Date 1263843327 -3600 # Node ID a1aee1136609e6402d0ce99b9a770486e9c6f954 # Parent 42c603eb63015ffed606dab167288136ce64d2db [savepoint] diff -r 42c603eb6301 -r a1aee1136609 SI/blkid.pm --- 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]); }; diff -r 42c603eb6301 -r a1aee1136609 SI/dumper.pm --- 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} } } diff -r 42c603eb6301 -r a1aee1136609 SI/lvm.pm --- 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; } diff -r 42c603eb6301 -r a1aee1136609 SI/ptable.pm --- 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; diff -r 42c603eb6301 -r a1aee1136609 SI/tools.pm --- 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: diff -r 42c603eb6301 -r a1aee1136609 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: