Csistck

 view release on metacpan or  search on metacpan

lib/Csistck/Test/FileBase.pm  view on Meta::CPAN

package Csistck::Test::FileBase;

use 5.010;
use strict;
use warnings;

use base 'Csistck::Test';
use Csistck::Oper qw/debug/;
use Csistck::Util qw/backup_file hash_file hash_string/;

use Digest::MD5;
use File::Basename;
use File::Copy;
use FindBin;
use File::stat;
use Sys::Hostname::Long qw//;

sub desc { sprintf("File check on %s", shift->{target}); }
sub dest { shift->{target}; }
sub src { shift->{src}; }
sub mode { shift->{mode}; }
sub uid { shift->{uid}; }
sub gid { shift->{gid}; }

sub check {
    my $self = shift;
    my $ret = 1;

    die("Destination path not found")
      if (! -e $self->dest);
    
    # If we defined a source file
    if (defined($self->src) and $self->can('file_check')) {
        $ret &= $self->file_check;
    }
    $ret &= $self->mode_process(\&mode_check);
    $ret &= $self->uid_process(\&uid_check);
    $ret &= $self->gid_process(\&gid_check);

    return (($ret == 1) ? $self->pass('File matches') :
      $self->fail("File doesn't match"));
}

sub repair {
    my $self = shift;
    my $ret = 1;

    # If we defined a source file
    if (defined($self->src) and $self->can('file_repair')) {
        if (-e $self->dest) {
            die("Destination ${\$self->dest} is not a file")
              if (-d $self->dest);
            die("Destination ${\$self->dest} exists is is not writable")
              if (-f $self->dest and ! -w $self->dest);
            backup_file($self->dest);
        }
        
        $ret &= $self->file_repair;
    }
    $ret &= $self->mode_process(\&mode_repair);
    $ret &= $self->uid_process(\&uid_repair);
    $ret &= $self->gid_process(\&gid_repair);
    
    return (($ret == 1) ? $self->pass('File repaired') :
      $self->fail('File not repaired'));
}

# Diff for files
sub diff {
    my $self = shift;
    
    die("Destination file does not exist: dest=<${\$self->dest}>")
      unless (-f -e -r $self->dest);
    
    # If we defined a source file
    if (defined($self->src) and $self->can('file_diff')) {
        $self->file_diff();
    }

    # TODO mode, uid, gid diff functions
}

# Wrapper functions to perform sanity tests on arguments
# Return pass if arguments are missing, die if invalid
sub mode_process {
    my ($self, $func) = @_;

    return 1 unless($self->mode);
    my $mode = $self->mode;
    die("Invalid file mode")
      if ($mode !~ m/^[0-7]{3,4}$/);
    $mode =~ s/^([0-7]{3})$/0$1/;
    $self->{mode} = $mode;
    
    &{$func}($self->dest, $self->mode);
}

sub uid_process {
    my ($self, $func) = @_;

    return 1 unless ($self->uid);
    die("Invalid user id")
      if ($self->uid !~ m/^[0-9]+$/);
    
    &{$func}($self->dest, $self->uid);
}

sub gid_process {
    my ($self, $func) = @_;

    return 1 unless ($self->gid);
    die("Invalid group id")
      if ($self->gid !~ m/^[0-9]+$/);

    &{$func}($self->dest, $self->gid);



( run in 0.603 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )