lib/BlockDev.pm
changeset 1 d2562d0417a9
parent 0 8220abbf27bb
child 2 ba9ad363d185
equal deleted inserted replaced
0:8220abbf27bb 1:d2562d0417a9
     1 package BlockDev;
     1 package BlockDev;
       
     2 
       
     3 use 5.010;
     2 use strict;
     4 use strict;
     3 use warnings;
     5 use warnings;
       
     6 use Attribute::Params::Validate qw(:all);
     4 
     7 
     5 our $VERSION = "0.0";
     8 our $VERSION = "0.0";
       
     9 
       
    10 my %X;
       
    11 
       
    12 sub list {
       
    13     open(my $fh => "/proc/partitions");
       
    14     return map { (split)[3] } grep /^\s*\d+/ => <$fh>;
       
    15 }
       
    16 
       
    17 sub new : Validate(uuid => 0, dev => 0) : method {
       
    18     my $class = shift;
       
    19     my $self = bless \my $x => $class;
       
    20     my %arg = @_;
       
    21     $X{$self} = \%arg;
       
    22 
       
    23     if ($arg{dev}) {
       
    24 	die "ERROR device `$arg{dev}': $!\n"
       
    25 	    if not -b $arg{dev};
       
    26 	$self->_rdev_by_dev;
       
    27     }
       
    28 
       
    29     return $self;
       
    30 }
       
    31 
       
    32 sub major { return $X{+shift}{major} }
       
    33 sub minor { return $X{+shift}{minor} }
       
    34 
       
    35 sub _rdev_by_dev {
       
    36     my $self = shift;
       
    37     $X{$self}{major} = (stat $X{$self}{dev})[6] >> 8;
       
    38     $X{$self}{minor} = (stat _)[6] & 0xFF;
       
    39 }
       
    40 
       
    41 sub rdev {
       
    42     my $self = shift;
       
    43     return $self->major, $self->minor if wantarray;
       
    44     return join " " => $self->major, $self->minor;
       
    45 }
       
    46 
       
    47 sub dev {
       
    48     my $self = shift;
       
    49     return $X{$self}{dev} if exists $X{$self}{dev};
       
    50 }
       
    51 
       
    52 sub DESTROY {
       
    53     my $self = shift;
       
    54     delete $X{$self};
       
    55 }
       
    56 
       
    57 1;
       
    58 
       
    59 __END__
       
    60 
       
    61 =head1 NAME
       
    62 
       
    63     BlockDev - library for doing various things on block devices
       
    64 
       
    65 =head1 SYNOPSIS
       
    66 
       
    67     use BlockDev;
       
    68 
       
    69     @devices = BlockDev->list();
       
    70 
       
    71     $device = BlockDev->new(uuid => "02323-232-22...");
       
    72     $device = BlockDev->new(dev => "/dev/sda1");
       
    73 
       
    74     ($major, $minor) = $device->rdev;
       
    75 
       
    76 =head1 Static methods
       
    77 
       
    78 =over
       
    79 
       
    80 =item list()
       
    81 
       
    82 Lists all known block devices (basically listing of F</proc/partitions>)
       
    83 
       
    84 =item new()
       
    85 
       
    86 Create a new blockdev object. I<$>
       
    87 
       
    88 =back
       
    89 
       
    90