diff -r 1c7e99693439 -r bdc967bf50d2 lib/SI/ptable.pm --- a/lib/SI/ptable.pm Fri Jan 29 00:35:46 2010 +0100 +++ b/lib/SI/ptable.pm Sun Jan 31 01:17:32 2010 +0100 @@ -7,6 +7,7 @@ use File::Find; use File::Basename; use IO::File; +use feature "switch"; use SI::tools; $ENV{LC_ALL} = "C"; @@ -65,6 +66,46 @@ return; } + +sub restore(\%) { + my $devs = shift; + + foreach my $disk (keys %{$devs->{disk}}) { + verbose("restoring partition table of $disk\n"); + die "I won't use the disk ($disk) I'm running on!" + if (stat $0)[0] ~~ [ map { (stat)[6] } map { "/dev/" . basename dirname $_ } glob ("/sys/block/" . basename($disk) . "/*/partition")]; + + my $sfdisk = new IO::File "|sfdisk $disk >/dev/null" + or die "Can't open |sfdisk $disk: $!\n"; + print {$sfdisk} @{$devs->{disk}{$disk}{pt}}; + $sfdisk->close or die $? >> 8; + run("partprobe $disk"); + } +} + +sub mkfs(\%) { + my $devs = shift; + foreach my $volume ( keys %{$devs->{volume}} ) { + my $v = $devs->{volume}{$volume}; + next if $v->{origin} ne "ptable"; + warn $volume, "\n"; + next if not defined $v->{type}; + given ($v->{type}) { + when(/ext\d/) { + my $label = defined $v->{label} ? $v->{label} : ""; + my $uuid = defined $v->{uuid} ? $v->{uuid} : ""; + run("mkfs -t $v->{type} -L '$label' -U '$uuid' $volume"); + }; + when("swap") { + my $label = defined $v->{label} ? $v->{label} : ""; + my $uuid = defined $v->{uuid} ? $v->{uuid} : ""; + run("mkswap -L '$label' -U '$uuid' $volume"); + }; + }; + + } + +} 1; # vim:sts=4 sw=4 aw ai si: