diff options
author | Maarten Vanraes <alien@mageia.org> | 2016-02-10 20:57:14 +0100 |
---|---|---|
committer | Maarten Vanraes <alien@mageia.org> | 2016-05-14 09:25:23 +0200 |
commit | c0374aa907c667f2045189cfd42f662238086808 (patch) | |
tree | ebbedbe36f1b608612eaecc5bc37beef54581e2e /lib | |
parent | a857ce634dcc22561ac7c8cb551b9b3ba5db3c08 (diff) | |
download | manatools-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.pm | 221 |
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; |