SI/ptable.pm
changeset 1 b9ddf49db5b8
parent 0 c0faaa882cf6
child 2 1f1d347eff00
equal deleted inserted replaced
0:c0faaa882cf6 1:b9ddf49db5b8
     1 package SI::ptable;
     1 package SI::ptable;
     2 
     2 
     3 use strict;
     3 use strict;
     4 use warnings;
     4 use warnings;
       
     5 use if $ENV{DEBUG} ~~ "ptable" => "Smart::Comments";
       
     6 use File::Find;
       
     7 
       
     8 $ENV{LC_ALL} = "C";
     5 
     9 
     6 use SI::tools;
    10 use SI::tools;
     7 
    11 
     8 sub save($) {
    12 sub info($\%) {
     9 	my $file = shift;
    13 	my ($file, $part) = @_;
    10 	run "sfdisk -d >$file 2>/dev/null";
    14 
       
    15 	# find major of devmapper
       
    16 	my $devmapper = 0;
       
    17 	{
       
    18 	local $/ = undef;
       
    19 	open(my($i), "/proc/devices") or die "ERR: Can't open /proc/devices: $!\n";
       
    20 	($devmapper) =  <$i> =~ /^\s*(\d+)\s+device.mapper\b/m;
       
    21 	}
       
    22 
       
    23 	my ($current, %dev);
       
    24 	foreach (`sfdisk -d 2>/dev/null`) {
       
    25 		chomp;
       
    26 		if (/^# partition table .*?(\/\S+)/) {
       
    27 			$current = (stat $1)[6] >> 8 == $devmapper ? undef : $1
       
    28 				and push(@{$dev{$current}}, $_);
       
    29 			next;
       
    30 		}
       
    31 		push @{$dev{$current}}, $_;
       
    32 	}
       
    33 	### partiton tables of useful blockdevices:
       
    34 	### %dev
       
    35 
       
    36 	# process the partition tables
       
    37 	# and output the tables for relevant devices
       
    38 	foreach my $dev (keys %dev) {
       
    39 		($_ = $dev) =~ s/^.*\///;
       
    40 		my $file = sprintf $file, $_;
       
    41 		die "ERR: $file exists already\n" if -f $file;
       
    42 		open(my $o, ">$file") or die "ERR: Can't open $file: $!\n";
       
    43 		print $o join "\n", @{$dev{$dev}}, "";
       
    44 	}
       
    45 
       
    46 	# reserve entries in %part, one for each partition
       
    47 	@{$part->{physical}}{map { (split)[0] } grep { /^\// } map { @$_ } values %dev} = ();
    11 }
    48 }
    12 
       
    13 1;
    49 1;