Sys-FS

 view release on metacpan or  search on metacpan

lib/Sys/FS.pm  view on Meta::CPAN

    if ( File::Copy::copy( $sourcefile, $destfile . '.new' ) ) {
        $self->logger()->log( message => "source: $sourcefile - dest: $destfile - Successfully copied to .new file.", level => 'debug', );
    }
    else {
        $self->logger()->log( message => "source: $sourcefile - dest: $destfile - Failed to copy $sourcefile to $destfile.new", level => 'error', );
        return;
    }

    # create backup of old config
    if ( -e $destfile ) {
        if ( File::Copy::copy( $destfile, $destfile . '.bak' ) ) {
            $self->logger()->log( message => "source: $sourcefile - dest: $destfile - Successfully created backup.", level => 'debug', );
        }
        else {
            $self->logger()->log( message => "source: $sourcefile - dest: $destfile - Failed to copy $destfile to $destfile.bak", level => 'error' );
            return;
        }
    }

    # perform the final switch (atomic? should be ...)
    if ( rename( $destfile . '.new', $destfile ) ) {
        $self->logger()->log( message => "source: $sourcefile - dest: $destfile - Successfully switched files.", level => 'debug', );
        return 1;
    }
    else {
        $self->logger()->log( message => "source: $sourcefile - dest: $destfile - Failed to copy $destfile.new to $destfile", level => 'error', );
        return;
    }
}

############################################
# Usage      : Create a directory stucture and return the created directory
sub makedir {
    my $self     = shift;
    my $filename = shift;
    my $opts     = shift || {};

    if ( !$filename ) {
        my $msg = 'No filename given in Sys::FS::makedir! Caller: ' . ( caller(1) )[3];
        $self->logger()->log( message => $msg, level => 'error', );
        return;
    }

    my $mode = $opts->{'Mode'} || oct(777);

    my @dirs   = File::Spec::->splitdir($filename);
    my $dir    = q{};
    my $mkdirs = 0;
    foreach my $i ( 0 .. $#dirs ) {
        $dir = File::Spec::->catdir( @dirs[ 0 .. $i ] );
        if ( !-d $dir ) {
            my $msg = "Filename: $filename - mkdir $dir, $mode";
            if ( mkdir( $dir, $mode ) ) {
                $self->logger()->log( message => $msg, level => 'debug', );
                $mkdirs++;
            }
            else {
                $self->logger()->log( message => $msg . ' FAILED!', level => 'debug', );
            }
            if ( $opts->{'Uid'} && $opts->{'Gid'} ) {
                chown $opts->{'Uid'}, $opts->{'Gid'} => $dir;
            }
        }
    }
    my $msg = "Filename: $filename - created $mkdirs dirs for $dir";
    $self->logger()->log( message => $msg, level => 'debug', );
    return $dir;
}

sub spaceleft {
    my $self = shift;
    my $dir  = shift;
    my $host = shift || 'localhost';
    my $opts = shift || {};

    # check free space on destination
    local $opts->{CaptureOutput} = 1;
    local $opts->{Chomp}         = 1;
    my $cmd = 'LANG=C /bin/df -P ' . $dir . ' | /usr/bin/tail -1';
    my $out = $self->sys()->run( $host, $cmd, $opts );

    my ( $dev, $onekblocks, $used, $avail, $pcfree, $mount_point ) = split /\s+/, $out;
    $avail      = 0 unless $avail      =~ m/^\d+$/;
    $onekblocks = 0 unless $onekblocks =~ m/^\d+$/;
    my $gbfree  = int( $avail /      ( 1024 * 1024 ) );
    my $gbtotal = int( $onekblocks / ( 1024 * 1024 ) );
    $pcfree =~ s/%$//;

    return wantarray ? ( $gbfree, $pcfree, $gbtotal ) : $gbfree;
}

sub fsck {
    my $self    = shift;
    my $device  = shift;
    my $fs_type = shift;
    my $opts    = shift || {};
    if ( $fs_type && -x '/sbin/fsck.'.$fs_type ) {
        $self->sys()->run_cmd('/sbin/fsck.'.$fs_type.' -y -p '.$device);
        return 1;
    }
    else {
        my $msg = "fsck($device,$fs_type) - dunno how to check $fs_type!";
        $self->logger()->log( message => $msg, level => 'error', );
        return;
    }
}

# used by get_mounted_device
sub mounts {
    my $self = shift;
    my $opts = shift || {};

    my $mounts_file = '/proc/mounts';
    if ( open( my $FH, '<', $mounts_file ) ) {
        my @lines = <$FH>;
        # DGR: just reading
        ## no critic (RequireCheckedClose)
        close($FH);
        ## use critic
        my %mounts = ();
        foreach my $line (@lines) {



( run in 1.313 second using v1.01-cache-2.11-cpan-5511b514fd6 )