lib/SI/ptable.pm
changeset 36 bdc967bf50d2
parent 28 7d7ca3f05f25
child 37 a61b92c60367
--- 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: