equal
deleted
inserted
replaced
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; |