[snapshot]
authorHeiko Schlittermann (JUMPER) <hs@schlittermann.de>
Wed, 20 Jul 2011 22:35:03 +0200
changeset 1 d2562d0417a9
parent 0 8220abbf27bb
child 2 ba9ad363d185
child 5 28392c81e909
[snapshot]
lib/BlockDev.pm
scratch/list
scratch/new
t/00-module.t
--- a/lib/BlockDev.pm	Tue Jul 19 16:05:43 2011 +0200
+++ b/lib/BlockDev.pm	Wed Jul 20 22:35:03 2011 +0200
@@ -1,5 +1,90 @@
 package BlockDev;
+
+use 5.010;
 use strict;
 use warnings;
+use Attribute::Params::Validate qw(:all);
 
 our $VERSION = "0.0";
+
+my %X;
+
+sub list {
+    open(my $fh => "/proc/partitions");
+    return map { (split)[3] } grep /^\s*\d+/ => <$fh>;
+}
+
+sub new : Validate(uuid => 0, dev => 0) : method {
+    my $class = shift;
+    my $self = bless \my $x => $class;
+    my %arg = @_;
+    $X{$self} = \%arg;
+
+    if ($arg{dev}) {
+	die "ERROR device `$arg{dev}': $!\n"
+	    if not -b $arg{dev};
+	$self->_rdev_by_dev;
+    }
+
+    return $self;
+}
+
+sub major { return $X{+shift}{major} }
+sub minor { return $X{+shift}{minor} }
+
+sub _rdev_by_dev {
+    my $self = shift;
+    $X{$self}{major} = (stat $X{$self}{dev})[6] >> 8;
+    $X{$self}{minor} = (stat _)[6] & 0xFF;
+}
+
+sub rdev {
+    my $self = shift;
+    return $self->major, $self->minor if wantarray;
+    return join " " => $self->major, $self->minor;
+}
+
+sub dev {
+    my $self = shift;
+    return $X{$self}{dev} if exists $X{$self}{dev};
+}
+
+sub DESTROY {
+    my $self = shift;
+    delete $X{$self};
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+    BlockDev - library for doing various things on block devices
+
+=head1 SYNOPSIS
+
+    use BlockDev;
+
+    @devices = BlockDev->list();
+
+    $device = BlockDev->new(uuid => "02323-232-22...");
+    $device = BlockDev->new(dev => "/dev/sda1");
+
+    ($major, $minor) = $device->rdev;
+
+=head1 Static methods
+
+=over
+
+=item list()
+
+Lists all known block devices (basically listing of F</proc/partitions>)
+
+=item new()
+
+Create a new blockdev object. I<$>
+
+=back
+
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scratch/list	Wed Jul 20 22:35:03 2011 +0200
@@ -0,0 +1,9 @@
+#! /usr/bin/perl
+use 5.010;
+use strict;
+use warnings;
+use blib;
+use BlockDev;
+
+
+say BlockDev->list;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scratch/new	Wed Jul 20 22:35:03 2011 +0200
@@ -0,0 +1,11 @@
+#! /usr/bin/perl
+use 5.010;
+use strict;
+use warnings;
+use blib;
+use BlockDev;
+
+
+my $dev = BlockDev->new(dev => "/dev/sda1");
+say scalar $dev->rdev();
+
--- a/t/00-module.t	Tue Jul 19 16:05:43 2011 +0200
+++ b/t/00-module.t	Wed Jul 20 22:35:03 2011 +0200
@@ -1,9 +1,23 @@
+use 5.010;
 use strict;
 use warnings;
 use Test::More;
+use autodie qw(:all);
 
 BEGIN {
     use_ok "BlockDev";
 }
 
+my @devices = BlockDev->list();
+{   # device list
+
+    my @proc = ();
+    open(my $fh, "/proc/partitions");
+    while (<$fh>) {
+	/^\s*(\d+\s+){3}(?<dev>\S+)/ or next;
+	push @proc => $+{dev};
+    }
+    is_deeply(\@devices => \@proc, "got all devices");
+}
+
 done_testing();