# HG changeset patch # User Heiko Schlittermann # Date 1263682430 -3600 # Node ID 03ca6d811a17b9f49584afff8b60bb4af4e4f00f # Parent df6ca24871d4ff405f9e3ef671d9263c9531b2e4 added hgignore, prepared dumping diff -r df6ca24871d4 -r 03ca6d811a17 .hgignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Sat Jan 16 23:53:50 2010 +0100 @@ -0,0 +1,2 @@ +syntax: glob +out/ diff -r df6ca24871d4 -r 03ca6d811a17 SI/blkid.pm --- a/SI/blkid.pm Fri Jan 15 23:17:23 2010 +0100 +++ b/SI/blkid.pm Sat Jan 16 23:53:50 2010 +0100 @@ -4,38 +4,12 @@ use warnings; use File::Find; -sub ff($$); -sub save($\%) { - my ($file, $part) = @_; - - foreach (`blkid -c /dev/null`) { - my ($dev) = (split /:/)[0]; - - my ($uuid) = /\sUUID=.(.*?).\s/; - my ($type) = /\sTYPE=.(.*?).\s/; - my ($label) = /\sLABEL=.(.*?).\s/; +use if $ENV{DEBUG} ~~ /blkid|all/ => "Smart::Comments"; - if ($dev ~~ $part->{physical}) { - $part->{physical}{$dev}{uuid} = $uuid; - $part->{physical}{$dev}{type} = $type; - $part->{physical}{$dev}{label} = $label; - next; - } +use SI::tools; - # dev mapper names should be replace by nicer ones - if ($dev ~~ /^\/dev\/dm-/) { - $dev = ff("/dev/mapper", (stat $dev)[6]) - or next; - $part->{logical}{$dev}{uuid} = $uuid; - $part->{logical}{$dev}{type} = $type; - $part->{logical}{$dev}{label} = $label; - } - - } -} - -sub ff($$) { +sub find_by_devid($$) { my ($dir, $id) = @_; my $found; find( @@ -49,5 +23,41 @@ return $found; } + +sub ids($\%) { + my ($file, $devs) = @_; + + verbose("reading blkids:"); + foreach (`blkid -c /dev/null`) { + my $dev = (split /:/)[0]; + ### $dev + verbose($dev); + + my ($uuid) = /\sUUID=.(.*?).\s/; + 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-/) { + $dev = find_by_devid("/dev/mapper", (stat $dev)[6]); + }; + + if (exists $devs->{volume}{$dev}) { + $devs->{volume}{$dev}{uuid} = $uuid; + $devs->{volume}{$dev}{type} = $type; + $devs->{volume}{$dev}{label} = $label; + } + + } + verbose("\n"); +} + 1; # vim:sts=4 sw=4 aw ai si: diff -r df6ca24871d4 -r 03ca6d811a17 SI/dumper.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SI/dumper.pm Sat Jan 16 23:53:50 2010 +0100 @@ -0,0 +1,22 @@ +package SI::dumper; + +use strict; +use warnings; +use SI::tools; +use if $ENV{DEBUG} ~~ /dumper|all/ => "Smart::Comments"; + +sub dump($\%) { + my ($file, $devs) = @_; + + ### $devs + + my %volume = %{$devs->{volume}}; + + foreach my $v ( grep { $volume{$_}{type} ~~ /^ext/ } keys %volume ) { + verbose("dumping $v\n"); + } +} + +1; + +# vim:sts=4 sw=4 aw ai sm: diff -r df6ca24871d4 -r 03ca6d811a17 SI/lvm.pm --- a/SI/lvm.pm Fri Jan 15 23:17:23 2010 +0100 +++ b/SI/lvm.pm Sat Jan 16 23:53:50 2010 +0100 @@ -2,16 +2,61 @@ use strict; use warnings; +use IO::File; + +use if $ENV{DEBUG} ~~ /lvm|all/ => qw(Smart::Comments); + use SI::tools; +my @volumegroups = (); + +sub _vgs(\%) { + return @volumegroups if @volumegroups; + + my $devs = shift; + + my @pvs = grep { $devs->{volume}{$_}{type} =~ /^lvm/ } + grep { defined $devs->{volume}{$_} } + keys %{$devs->{volume}}; + + return @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs`; +} + +sub volumes(\%) { + my ($devs) = @_; + + # we can't just use `pvs', since this would return *all* + # physical devices known to lvm, not just the non-removable + my @pvs = grep { $devs->{volume}{$_}{type} =~ /^lvm/ } + grep { defined $devs->{volume}{$_} } + keys %{$devs->{volume}}; + + my @vgs = _vgs(%$devs); + my @lvs = map { readlink } + map { s/^\s*//; (split /:/)[0] } + grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`; + + @{$devs->{volume}}{@lvs} = (); + + +} + sub vgcfgbackup($\%) { - my ($file, $part) = @_; - foreach (map { (split /:/)[0] } - map { /^\s*(.*)/; } `vgs --noheadings --separator :`) + my ($file, $devs) = @_; + + # we save it vg by vg to have the restore more easy + my @vgs = _vgs(%$devs); + foreach ( map { s/^\s*(.*)/$1/; $_ = (split /:/)[0] } `vgs --noheadings --separator : @vgs`) { + 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 + verbose("saving vg *\n"); + $file = sprintf $file, "*"; + run("vgcfgbackup -f '$file' >/dev/null"); } 1; diff -r df6ca24871d4 -r 03ca6d811a17 SI/mbr.pm --- a/SI/mbr.pm Fri Jan 15 23:17:23 2010 +0100 +++ b/SI/mbr.pm Sat Jan 16 23:53:50 2010 +0100 @@ -5,11 +5,14 @@ use File::Basename; use if $ENV{DEBUG} ~~ q(mbr) => "Smart::Comments"; +use SI::tools; + sub save($\%) { - my ($file, $devices) = @_; + my ($file, $devs) = @_; - foreach my $disk (keys %{$devices->{disks}}) { + foreach my $disk (keys %{$devs->{disks}}) { + verbose("saving mbr of $disk\n"); open((my $o), $_ = sprintf(">$file", basename($disk))) or die "Can't open $_: $!\n"; local $/ = \512; diff -r df6ca24871d4 -r 03ca6d811a17 SI/ptable.pm --- a/SI/ptable.pm Fri Jan 15 23:17:23 2010 +0100 +++ b/SI/ptable.pm Sat Jan 16 23:53:50 2010 +0100 @@ -2,60 +2,55 @@ use strict; use warnings; -use if $ENV{DEBUG} ~~ "ptable" => "Smart::Comments"; use File::Find; +use IO::File; -$ENV{LC_ALL} = "C"; +use if $ENV{DEBUG} ~~ /ptable|all/ => qw(Smart::Comments); use SI::tools; - -sub save($\%) { - my ($file, $part) = @_; +$ENV{LC_ALL} = "C"; - # find the major number of the devmapper - my $devmapper = 0; - { - local $/ = undef; - open(my ($i), "/proc/devices") - or die "ERR: Can't open /proc/devices: $!\n"; - ($devmapper) = <$i> =~ /^\s*(\d+)\s+device.mapper\b/m; - } +sub volumes($\%) { + my ($file, $devs) = @_; - # 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); + # 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); - $_ = (grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0]; - $current = /==.0./ ? $device : undef; - $part->{disks}{$current} = undef if $current; + verbose("device $device"); + if ((grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./) { + $current = undef; + verbose("skipping (removable)\n"); + next; + } + + # save in our data structure + verbose("scanning\n"); + $current = $device; + push @{$devs->{disk}{$current}{pt}}, $_; + + # 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"; + next; } next if not $current; - push @{ $dev{$current} }, $_; + push @{$devs->{disk}{$current}{pt}}, $_; + print $of "$_\n"; + + if (/^(\/dev\/\S+)\s*:/) { + $devs->{volume}{$1} = undef; + } + } - ### %dev -### exit - - # process the partition tables - # and output the tables for relevant devices - foreach my $dev (keys %dev) { - ($_ = $dev) =~ s/^.*\///; - my $file = sprintf $file, $_; - die "ERR: $file exists already\n" if -f $file; - open(my $o, ">$file") or die "ERR: Can't open $file: $!\n"; - print $o join "\n", @{ $dev{$dev} }, ""; - } - - # reserve entries in %part, one for each partition - @{ $part->{physical} }{ map { (split)[0] } - grep { /^\// } map { @$_ } values %dev } = (); +### $devs + return; } 1; # vim:sts=4 sw=4 aw ai si: diff -r df6ca24871d4 -r 03ca6d811a17 SI/tools.pm --- a/SI/tools.pm Fri Jan 15 23:17:23 2010 +0100 +++ b/SI/tools.pm Sat Jan 16 23:53:50 2010 +0100 @@ -3,7 +3,8 @@ use strict; use warnings; use base "Exporter"; -our @EXPORT = qw(&run); +our @EXPORT = qw(&run &verbose); +use if $ENV{DEBUG} ~~ /tools|all/ => "Smart::Comments"; sub run(@) { system(@_); @@ -11,5 +12,13 @@ if $?; } +my $last = "\n"; +sub verbose(@) { + print $last eq "\n" ? "" : " " + if not(@_ == 1 and length($_[0]) == 1); + print @_; + $last = substr($_[-1], -1, 1); +}; + 1; # vim:sts=4 sw=4 aw ai si: diff -r df6ca24871d4 -r 03ca6d811a17 si --- a/si Fri Jan 15 23:17:23 2010 +0100 +++ b/si Sat Jan 16 23:53:50 2010 +0100 @@ -3,7 +3,7 @@ use strict; use warnings; -use if $ENV{DEBUG} => "Smart::Comments"; +use if $ENV{DEBUG} ~~ /main|all/ => "Smart::Comments"; use Sys::Hostname; @@ -11,19 +11,27 @@ use SI::blkid; use SI::lvm; use SI::mbr; - -my $OUT = "../out-" . hostname; +use SI::dumper; -unlink(glob("$OUT/*")); --d $OUT or mkdir($OUT, 0700) or die "Can't mkdir $OUT: $!\n"; +MAIN: { + my $OUT = "../out-" . hostname; + + unlink(glob("$OUT/*")); + -d $OUT or mkdir($OUT, 0700) or die "Can't mkdir $OUT: $!\n"; -my %devices; + my %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); + SI::ptable::volumes("$OUT/partitions.%s", %devices); + SI::lvm::volumes(%devices); + SI::blkid::ids("$OUT/blkid", %devices); + SI::lvm::vgcfgbackup("$OUT/vg.%s", %devices); + SI::mbr::save("$OUT/mbr.%s", %devices); + SI::dumper::dump("$OUT/dump.%s", %devices); +### %devices + exit; ### %devices; + } + # vim:sts=4 sw=4 aw ai si: