# HG changeset patch # User Heiko Schlittermann # Date 1263593843 -3600 # Node ID df6ca24871d4ff405f9e3ef671d9263c9531b2e4 # Parent 1b975c58c5bf806baaa29b596f4279ed611ed1bf [savepoint] diff -r 1b975c58c5bf -r df6ca24871d4 SI/blkid.pm --- a/SI/blkid.pm Fri Jan 15 20:40:14 2010 +0100 +++ b/SI/blkid.pm Fri Jan 15 23:17:23 2010 +0100 @@ -4,21 +4,9 @@ use warnings; use File::Find; -sub ff($$) { - my ($dir, $id) = @_; - my $found; - find( - sub { - return if $found; - $found = (stat)[6] == $id ? $File::Find::name : undef; - return; - }, - $dir - ); - return $found; -} +sub ff($$); -sub info($\%) { +sub save($\%) { my ($file, $part) = @_; foreach (`blkid -c /dev/null`) { @@ -47,5 +35,19 @@ } } +sub ff($$) { + my ($dir, $id) = @_; + my $found; + find( + sub { + return if $found; + $found = (stat)[6] == $id ? $File::Find::name : undef; + return; + }, + $dir + ); + return $found; +} + 1; # vim:sts=4 sw=4 aw ai si: diff -r 1b975c58c5bf -r df6ca24871d4 SI/lvm.pm --- a/SI/lvm.pm Fri Jan 15 20:40:14 2010 +0100 +++ b/SI/lvm.pm Fri Jan 15 23:17:23 2010 +0100 @@ -4,7 +4,7 @@ use warnings; use SI::tools; -sub vg_info($\%) { +sub vgcfgbackup($\%) { my ($file, $part) = @_; foreach (map { (split /:/)[0] } map { /^\s*(.*)/; } `vgs --noheadings --separator :`) @@ -14,19 +14,5 @@ } } -sub lv_info($\%) { - my ($file, $part) = @_; - - foreach my $p (keys %$part) { - `pvs -o +uuid --nameprefix --noheadings $p` =~ /\bLVM2_PV_UUID='(.*?)'/ - or next; - - $part->{$p}{type} = "pv"; - $part->{$p}{uuid} = $1; - - } - -} - 1; # vim:sts=4 sw=4 aw ai si: diff -r 1b975c58c5bf -r df6ca24871d4 SI/mbr.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SI/mbr.pm Fri Jan 15 23:17:23 2010 +0100 @@ -0,0 +1,21 @@ +package SI::mbr; + +use strict; +use warnings; +use File::Basename; +use if $ENV{DEBUG} ~~ q(mbr) => "Smart::Comments"; + +sub save($\%) { + my ($file, $devices) = @_; + + + foreach my $disk (keys %{$devices->{disks}}) { + 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"; + print $o $_ = <$in>; + } +} + +1; diff -r 1b975c58c5bf -r df6ca24871d4 SI/ptable.pm --- a/SI/ptable.pm Fri Jan 15 20:40:14 2010 +0100 +++ b/SI/ptable.pm Fri Jan 15 23:17:23 2010 +0100 @@ -9,10 +9,10 @@ use SI::tools; -sub info($\%) { +sub save($\%) { my ($file, $part) = @_; - # find major of devmapper + # find the major number of the devmapper my $devmapper = 0; { local $/ = undef; @@ -21,20 +21,27 @@ ($devmapper) = <$i> =~ /^\s*(\d+)\s+device.mapper\b/m; } + # 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); foreach (`sfdisk -d 2>/dev/null`) { chomp; - ### $_ - if (/^# partition table .*?(\/\S+)/) { - $current = (stat $1)[6] >> 8 == $devmapper ? undef : $1 - and push(@{ $dev{$current} }, $_); - next; + 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; + next; } next if not $current; push @{ $dev{$current} }, $_; } - ### partiton tables of useful blockdevices: + ### %dev +### exit # process the partition tables # and output the tables for relevant devices diff -r 1b975c58c5bf -r df6ca24871d4 si --- a/si Fri Jan 15 20:40:14 2010 +0100 +++ b/si Fri Jan 15 23:17:23 2010 +0100 @@ -5,20 +5,24 @@ use warnings; use if $ENV{DEBUG} => "Smart::Comments"; +use Sys::Hostname; + use SI::ptable; use SI::blkid; use SI::lvm; +use SI::mbr; -my $OUT = "out"; +my $OUT = "../out-" . hostname; unlink(glob("$OUT/*")); -d $OUT or mkdir($OUT, 0700) or die "Can't mkdir $OUT: $!\n"; my %devices; -SI::ptable::info("$OUT/partitions.%s", %devices); -SI::blkid::info("$OUT/blkid", %devices); -SI::lvm::vg_info("$OUT/vg.%s", %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); ### %devices;