SI/ptable.pm
changeset 16 fd87c1e3b451
parent 15 4e3753b998a9
child 17 d4942418a9ea
equal deleted inserted replaced
15:4e3753b998a9 16:fd87c1e3b451
    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 	    # verbose("device $name");
    22 	    my $dev = "/dev/$name";
    23 
    23 
    24 	    if (!-e "$_/device") {
    24 	    next if !-e "$_/device";
    25 		# verbose("skipping (non-dev)\n");
    25 	    next if (grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./;
    26 		    next;
    26 	    next if (stat $dev)[0] == (stat $0)[0];
    27 	    }
    27 
    28 	    if ((grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./) {
    28 	    # exclude the device (stick) we're part of - this HACK is
    29 		#   verbose("skipping (removable)\n");
    29 	    # only useful on KVM - the usb stick doesn't appear as a removeable
    30 		    next;
    30 	    # device
    31 	    }
    31 	    next if (stat $0)[0] ~~ [map { (stat)[6] } map { "/dev/" . basename(dirname $_) } glob("$_/*/partition")];
       
    32 
       
    33 
    32 	    verbose("\n");
    34 	    verbose("\n");
    33 	    verbose("device $name\n");
    35 	    verbose("device $dev\n");
    34 
    36 
    35 	    die "ERR: /dev/$name does not exist. (should not happen)"
    37 	    die "ERR: $dev does not exist. (should not happen): $!"
    36 		if !-e "/dev/$name";
    38 		if !-b $dev;
    37 
    39 
    38 	    # now the physical disk -- let's ask for the partition table
    40 	    # now the physical disk -- let's ask for the partition table
    39 
    41 
    40 	    my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`;
    42 	    my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`;
    41 
    43 
    45 
    47 
    46 	    $devs->{disk}{"/dev/$name"} = { 
    48 	    $devs->{disk}{"/dev/$name"} = { 
    47 		pt => \@sfdisk
    49 		pt => \@sfdisk
    48 	    };
    50 	    };
    49 
    51 
    50 	    push @{$devs->{known}}, "/dev/$name";
       
    51 
       
    52 	    # and let's prepare the volume entries
    52 	    # and let's prepare the volume entries
    53 	    foreach (@sfdisk) {
    53 	    foreach (@sfdisk) {
    54 		/^(\S+)\s*:.*Id=\s*([[:xdigit:]]+)/ or next;
    54 		/^(\S+)\s*:.*Id=\s*([[:xdigit:]]+)/ or next;
    55 		$devs->{volume}{$1} = {
    55 		$devs->{volume}{$1} = {
    56 			origin => "ptable",
    56 			origin => "ptable",
    57 			ptable_type => $2,
    57 			ptable_type => $2,
    58 		    };
    58 		    };
    59 		push @{$devs->{known}}, $1;
       
    60 	    }
    59 	    }
    61     }
    60     }
    62 
    61 
    63     return;
    62     return;
    64 }
    63 }