diff options
Diffstat (limited to 'lib')
| -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; | 
