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 )