SI/ptable.pm
changeset 17 d4942418a9ea
parent 16 fd87c1e3b451
child 19 d12753b246fd
equal deleted inserted replaced
16:fd87c1e3b451 17:d4942418a9ea
    16 
    16 
    17     # find the partition tables of all
    17     # find the partition tables of all
    18     # non-removable block devices (this may include
    18     # non-removable block devices (this may include
    19     # LVs (used as disk itself) too)
    19     # LVs (used as disk itself) too)
    20     foreach (glob("/sys/block/*")) {
    20     foreach (glob("/sys/block/*")) {
    21 	    my $name = basename($_);
    21         my $name = basename($_);
    22 	    my $dev = "/dev/$name";
    22         my $dev  = "/dev/$name";
    23 
    23 
    24 	    next if !-e "$_/device";
    24         next if !-e "$_/device";
    25 	    next if (grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./;
    25         next
    26 	    next if (stat $dev)[0] == (stat $0)[0];
    26           if (grep { /ATTR{removable}/ }
       
    27             `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./;
       
    28         next if (stat $dev)[0] == (stat $0)[0];
    27 
    29 
    28 	    # exclude the device (stick) we're part of - this HACK is
    30         # exclude the device (stick) we're part of - this HACK is
    29 	    # only useful on KVM - the usb stick doesn't appear as a removeable
    31         # only useful on KVM - the usb stick doesn't appear as a removeable
    30 	    # device
    32         # device
    31 	    next if (stat $0)[0] ~~ [map { (stat)[6] } map { "/dev/" . basename(dirname $_) } glob("$_/*/partition")];
    33         next
       
    34           if (stat $0)[0] ~~ [map { (stat)[6] }
       
    35               map { "/dev/" . basename(dirname $_) } glob("$_/*/partition")];
    32 
    36 
       
    37         verbose("\n");
       
    38         verbose("device $dev\n");
    33 
    39 
    34 	    verbose("\n");
    40         die "ERR: $dev does not exist. (should not happen): $!"
    35 	    verbose("device $dev\n");
    41           if !-b $dev;
    36 
    42 
    37 	    die "ERR: $dev does not exist. (should not happen): $!"
    43         # now the physical disk -- let's ask for the partition table
    38 		if !-b $dev;
       
    39 
    44 
    40 	    # now the physical disk -- let's ask for the partition table
    45         my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`;
    41 
    46 
    42 	    my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`;
    47         my $of = sprintf $file, $name;
       
    48         my $oh = new IO::File ">$of" or die "Can't open >$of: $!\n";
       
    49         print $oh @sfdisk;
    43 
    50 
    44 	    my $of = sprintf $file, $name;
    51         $devs->{disk}{"/dev/$name"} = { pt => \@sfdisk };
    45 	    my $oh = new IO::File ">$of" or die "Can't open >$of: $!\n";
       
    46 	    print $oh @sfdisk;
       
    47 
    52 
    48 	    $devs->{disk}{"/dev/$name"} = { 
    53         # and let's prepare the volume entries
    49 		pt => \@sfdisk
    54         foreach (@sfdisk) {
    50 	    };
    55             /^(\S+)\s*:.*Id=\s*([[:xdigit:]]+)/ or next;
    51 
    56             $devs->{volume}{$1} = {
    52 	    # and let's prepare the volume entries
    57                 origin      => "ptable",
    53 	    foreach (@sfdisk) {
    58                 ptable_type => $2,
    54 		/^(\S+)\s*:.*Id=\s*([[:xdigit:]]+)/ or next;
    59             };
    55 		$devs->{volume}{$1} = {
    60         }
    56 			origin => "ptable",
       
    57 			ptable_type => $2,
       
    58 		    };
       
    59 	    }
       
    60     }
    61     }
    61 
    62 
    62     return;
    63     return;
    63 }
    64 }
    64 1;
    65 1;
       
    66 
    65 # vim:sts=4 sw=4 aw ai si:
    67 # vim:sts=4 sw=4 aw ai si: