aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMaarten Vanraes <alien@mageia.org>2016-02-10 20:57:14 +0100
committerMaarten Vanraes <alien@mageia.org>2016-05-14 09:25:23 +0200
commitc0374aa907c667f2045189cfd42f662238086808 (patch)
treeebbedbe36f1b608612eaecc5bc37beef54581e2e /lib
parenta857ce634dcc22561ac7c8cb551b9b3ba5db3c08 (diff)
downloadmanatools-c0374aa907c667f2045189cfd42f662238086808.tar
manatools-c0374aa907c667f2045189cfd42f662238086808.tar.gz
manatools-c0374aa907c667f2045189cfd42f662238086808.tar.bz2
manatools-c0374aa907c667f2045189cfd42f662238086808.tar.xz
manatools-c0374aa907c667f2045189cfd42f662238086808.zip
add a Partition plugin
Diffstat (limited to 'lib')
-rw-r--r--lib/ManaTools/Shared/disk_backend/Plugin/Partition.pm221
1 files changed, 221 insertions, 0 deletions
diff --git a/lib/ManaTools/Shared/disk_backend/Plugin/Partition.pm b/lib/ManaTools/Shared/disk_backend/Plugin/Partition.pm
new file mode 100644
index 00000000..6c3466ac
--- /dev/null
+++ b/lib/ManaTools/Shared/disk_backend/Plugin/Partition.pm
@@ -0,0 +1,221 @@
+# vim: set et ts=4 sw=4:
+package ManaTools::Shared::disk_backend::Plugin::Partition;
+
+#============================================================= -*-perl-*-
+
+=head1 NAME
+
+ ManaTools::Shared::disk_backend::Plugin::Partition - Partition object
+
+=head1 SYNOPSIS
+
+ use ManaTools::Shared::disk_backend::Plugin::Partition;
+
+ my $db_man = ManaTools::Shared::disk_backend::Plugin::Partition->new($parent);
+ ...
+
+
+=head1 DESCRIPTION
+
+ This plugin is an Partition plugin for the backend to manadisk
+
+=head1 SUPPORT
+
+ You can find documentation for this plugin with the perldoc command:
+
+ perldoc ManaTools::Shared::disk_backend::Plugin::Partition
+
+
+=head1 AUTHOR
+
+ Maarten Vanraes <alien@rmail.be>
+
+=head1 COPYRIGHT and LICENSE
+
+Copyright (c) 2015 Maarten Vanraes <alien@rmail.be>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License version 2, as
+published by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+=head1 METHODS
+
+=cut
+
+use Moose;
+
+use File::Basename;
+use ManaTools::Shared::disk_backend::PartitionTable;
+
+extends 'ManaTools::Shared::disk_backend::Plugin';
+
+has '+dependencies' => (
+ default => sub {
+ return ['Disk'];
+ }
+);
+
+#=============================================================
+
+=head2 load
+
+=head3 OUTPUT
+
+ 0 if failed, 1 if success or unneeded
+
+=head3 DESCRIPTION
+
+ this method will load all disks partition tables
+
+=cut
+
+#=============================================================
+override ('loadio', sub {
+ my $self = shift;
+ my $io = shift;
+ # get the partition table
+ my $pt = ManaTools::Shared::disk_backend::PartitionTable->new(disk => $io->file());
+ # get partitions and mkio them all
+ for my $p (values %{$pt->partitions()}) {
+ my @stat = stat($p->{'file'});
+ my $dev = $stat[6];
+ my $minor = $dev % 256;
+ my $major = int (($dev - $minor) / 256);
+ my $io = $self->parent->mkio('Partition', {id => $p->{'file'} =~ s'^.+/''r});
+ $io->prop('dev', $major .':'. $minor);
+ $io->sync_majorminor();
+ $io->prop('start', $p->{'start'});
+ $io->prop('size', $p->{'size'});
+ $io->prop('num', $p->{'num'});
+ # TODO: also create the Part (if it doesn't already exists) and link it
+ }
+ return 1;
+});
+
+#=============================================================
+
+=head2 probeio
+
+=head3 OUTPUT
+
+ 0 if failed, 1 if success or unneeded
+
+=head3 DESCRIPTION
+
+ this method will try to probe the specific disk IO and get partitions
+
+=cut
+
+#=============================================================
+override ('probeio', sub {
+ my $self = shift;
+ my $io = shift;
+ my $part = undef;
+ # return if $io is not the correct type
+ if ($io->type() ne 'Disk') {
+ return 1;
+ }
+ if ($io->prop('present') == 0) {
+ return 1;
+ }
+ # find out if the IO already has a part, if not: make a part
+ my @parts = $self->parent->findin($io);
+ if (scalar(@parts) > 0) {
+ $part = $parts[0];
+ }
+ else {
+ $part = $self->parent->mkpart('PartitionTable', {});
+ if (!defined($part)) {
+ return 0;
+ }
+ # assign this IO to the ins
+ if (!$part->in_add($io)) {
+ return 0;
+ }
+ }
+ my $err = 0;
+ # find subdevices in /sys/
+ for my $pf (glob($io->path(). "/". $io->id() ."*")) {
+ my $io = $self->parent->mkio('Partition', {id => $pf =~ s'^.+/''r});
+ $io->prop_from_file('sectors', $pf . '/size');
+ # sectors are always 512 bytes here!
+ $io->prop('size', $io->prop('sectors') * 512);
+ $io->prop_from_file('start', $pf . '/start');
+ $io->prop_from_file('ro', $pf . '/ro');
+ $io->prop_from_file('dev', $pf . '/dev');
+ $io->sync_majorminor();
+ $io->prop('num', $pf =~ s/^.+([0-9]+)$/$1/r);
+ if (!$part->out_add($io)) {
+ $err = 1;
+ }
+ }
+ # find out how to differentiate between an empty partition table and no partition table
+ return $err == 0;
+});
+
+package ManaTools::Shared::disk_backend::IO::Partition;
+
+use Moose;
+
+extends 'ManaTools::Shared::disk_backend::IO';
+
+with 'ManaTools::Shared::disk_backend::BlockDevice';
+
+has '+type' => (
+ default => 'Partition'
+);
+
+package ManaTools::Shared::disk_backend::Part::PartitionTable;
+
+use Moose;
+
+extends 'ManaTools::Shared::disk_backend::Part';
+
+has '+type' => (
+ default => 'PartitionTable'
+);
+
+has '+in_restriction' => (
+ default => sub {
+ return sub {
+ my $self = shift;
+ my $io = shift;
+ my $del = shift;
+ if (!defined $del) {
+ $del = 0;
+ }
+ if ($del != 0) {
+ return ($self->in_length() > 0);
+ }
+ return ($self->in_length() == 0 && ref($io) eq 'ManaTools::Shared::disk_backend::IO::Disk');
+ };
+ }
+);
+
+has '+out_restriction' => (
+ default => sub {
+ return sub {
+ my $self = shift;
+ my $io = shift;
+ my $del = shift;
+ if (!defined $del) {
+ $del = 0;
+ }
+ if ($del != 0) {
+ return ($self->out_length() > 0);
+ }
+ return ($self->out_length() < 4 && ref($io) eq 'ManaTools::Shared::disk_backend::IO::Partition');
+ };
+ }
+);
+
+1;