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