diff options
Diffstat (limited to 'lib/ManaTools/Shared/disk_backend/Plugin/Extfs.pm')
-rw-r--r-- | lib/ManaTools/Shared/disk_backend/Plugin/Extfs.pm | 125 |
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; |