aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaarten Vanraes <alien@mageia.org>2016-05-20 00:08:37 +0200
committerMaarten Vanraes <alien@mageia.org>2016-05-20 00:08:37 +0200
commita31e88c4267a59dee5ec0309c9b2f8740e970d8e (patch)
treef22e87f9b497e1987b0b1ce4842b53f436960580
parent49d992fca9963ddaf9c26b0946bbbe4985f83242 (diff)
downloadmanatools-a31e88c4267a59dee5ec0309c9b2f8740e970d8e.tar
manatools-a31e88c4267a59dee5ec0309c9b2f8740e970d8e.tar.gz
manatools-a31e88c4267a59dee5ec0309c9b2f8740e970d8e.tar.bz2
manatools-a31e88c4267a59dee5ec0309c9b2f8740e970d8e.tar.xz
manatools-a31e88c4267a59dee5ec0309c9b2f8740e970d8e.zip
Extfs: adjust to new PartLink system
-rw-r--r--lib/ManaTools/Shared/disk_backend/Plugin/Extfs.pm125
1 files changed, 125 insertions, 0 deletions
diff --git a/lib/ManaTools/Shared/disk_backend/Plugin/Extfs.pm b/lib/ManaTools/Shared/disk_backend/Plugin/Extfs.pm
index c1bc3293..690cb1bd 100644
--- a/lib/ManaTools/Shared/disk_backend/Plugin/Extfs.pm
+++ b/lib/ManaTools/Shared/disk_backend/Plugin/Extfs.pm
@@ -77,6 +77,99 @@ has '+tools' => (
#=============================================================
+=head2 changedpart
+
+=head3 INPUT
+
+ $part: ManaTools::Shared::disk_backend::Part
+ $partstate: PartState
+
+=head3 OUTPUT
+
+ 0 if failed, 1 if success or unneeded
+
+=head3 DESCRIPTION
+
+ this overridden method will load/probe/save a partition table when it's called
+
+=cut
+
+#=============================================================
+override ('changedpart', sub {
+ my $self = shift;
+ my $part = shift;
+ my $partstate = shift;
+ $self->D("$self: called changepart for extfs: $part, $partstate");
+
+ ## LOAD
+ # read the partition table
+ if ($partstate == ManaTools::Shared::disk_backend::Part->LoadedState) {
+ # only BlockDevices for loading
+ return 1 if (!$part->does('ManaTools::Shared::disk_backend::BlockDevice'));
+ # TODO: fstab handles loading
+ }
+
+ ## PROBE
+ # check in the kernel partition table by reading /sys
+ if ($partstate == ManaTools::Shared::disk_backend::Part->CurrentState) {
+ print STDERR "$self: called changepart for probing extfs on $part\n";
+ $self->D("$self: called changepart for probing extfs on $part");
+ # only BlockDevices for loading
+ return 1 if (!$part->does('ManaTools::Shared::disk_backend::BlockDevice'));
+
+ # only devices that are present
+ return 1 if ($part->has_prop('present') && !$part->prop('present'));
+
+ print STDERR "$self: called changepart for probing extfs on $part: size ". $part->prop('size') ."\n";
+ $self->D("$self: called changepart for probing extfs on $part: size ". $part->prop('size'));
+ # only devices with positive size
+ return 1 if ($part->prop('size') <= 0);
+
+ print STDERR "$self: called changepart for probing extfs on $part: devicepath /dev/". $part->devicepath() =~ s'^.+/''r ."\n";
+ # try with dump2fs if this is actually an extfs filesystem
+ my %fields = $self->tool_fields('dumpe2fs', ':', '-h', '/dev/'. $part->devicepath() =~ s'^.+/''r);
+
+ # get uuid
+ my $uuid = $fields{'Filesystem UUID'};
+ print STDERR "$self: called changepart for probing extfs on $part: uuid ". $uuid ."\n";
+
+ # this is probably not an extfs filesystem
+ return undef if (!defined $uuid || !$uuid);
+
+ # look or create part for extfs
+ my $p = $part->trychild($partstate, sub {
+ my $self = shift;
+ my $parameters = shift;
+ return ($self->uuid() eq $parameters->{uuid});
+ },'Extfs', {plugin => $self, uuid => $uuid, loaded => undef, saved => undef});
+
+ # extra properties
+ $p->prop('label', $fields{'Filesystem volume name'} =~ s'<none>''r);
+ $p->prop('features', split(' ', $fields{'Filesystem features'}));
+ $p->prop('options', split(' ', $fields{'Default mount options'}));
+ $p->prop('state', $fields{'Filesystem state'});
+ $p->prop('block_size', $fields{'Block size'});
+ $p->prop('block_count', $fields{'Block count'});
+ $p->prop('size', $fields{'Block size'} * $fields{'Block count'});
+
+ $p->changedpart($partstate);
+ }
+
+ ## SAVE
+ # save the partition table
+ if ($partstate == ManaTools::Shared::disk_backend::Part->FutureState) {
+ # in all child parts, find PartitionTable entries and trigger ->save();
+ for my $p ($part->find_parts(undef, 'child')) {
+ # TODO: need to be able to abort during save!!!
+ $p->save();
+ }
+ }
+
+ return 1;
+});
+
+#=============================================================
+
=head2 fsprobe
=head3 INPUT
@@ -112,7 +205,15 @@ sub fsprobe {
return undef if (!defined $uuid || !$uuid);
# create part
+ # TODO: look or create part
my $part = $self->parent->mkpart('Extfs', { uuid => $uuid, plugin => $self});
+ $part->prop('label', $fields{'Filesystem volume name'} =~ s'<none>''r);
+ $part->prop('features', split(' ', $fields{'Filesystem features'}));
+ $part->prop('options', split(' ', $fields{'Default mount options'}));
+ $part->prop('state', $fields{'Filesystem state'});
+ $part->prop('block_size', $fields{'Block size'});
+ $part->prop('block_count', $fields{'Block count'});
+ $part->prop('size', $fields{'Block size'} * $fields{'Block count'});
# link in the in IO
$part->in_add($io);
@@ -152,6 +253,8 @@ extends 'ManaTools::Shared::disk_backend::Part';
use MooseX::ClassAttribute;
+with 'ManaTools::Shared::disk_backend::Mountable';
+
class_has '+type' => (
default => 'Extfs'
);
@@ -199,4 +302,26 @@ class_has '+out_restriction' => (
}
);
+class_has '+restrictions' => (
+ default => sub {
+ return {
+ parent => sub {
+ my $self = shift;
+ my $part = shift;
+ return $part->does('ManaTools::Shared::disk_backend::BlockDevice');
+ },
+ child => sub {
+ my $self = shift;
+ my $part = shift;
+ return $part->isa('ManaTools::Shared::disk_backend::Part::Mount');
+ },
+ sibling => sub {
+ my $self = shift;
+ my $part = shift;
+ return 0;
+ },
+ }
+ }
+);
+
1;