App-Yabsm
view release on metacpan or search on metacpan
lib/App/Yabsm/Tools.pm view on Meta::CPAN
i_am_root_or_die
);
our %EXPORT_TAGS = ( ALL => [ @EXPORT_OK ] );
####################################
# SUBROUTINES #
####################################
sub have_prerequisites {
# Return 1 if we are running on a Linux OS and have sudo, OpenSSH, and
# btrfs-progs installed.
return 0 unless $^O =~ /linux/i;
return 0 unless 0 == system('which btrfs >/dev/null 2>&1');
return 0 unless `ssh -V 2>&1` =~ /^OpenSSH/;
return 0 unless 0 == system('which sudo >/dev/null 2>&1');
return 1;
}
sub have_prerequisites_or_die {
# Like &have_prerequisites except die if the prerequisites are not met.
unless ($^O =~ /linux/i) {
die "yabsm: internal error: not a Linux OS, this is a '$^O' OS\n";
}
unless (0 == system('which btrfs >/dev/null 2>&1')) {
die 'yabsm: internal error: btrfs-progs not installed'."\n";
}
unless (`ssh -V 2>&1` =~ /^OpenSSH/) {
die 'yabsm: internal error: OpenSSH not installed'."\n";
}
unless (0 == system('which sudo >/dev/null 2>&1')) {
die 'yabsm: internal error: sudo not installed'."\n";
}
return 1;
}
sub arg_count_or_die {
# Carp::Confess unless $num_args is in range $lower-$upper. If $lower equals
# '_' then it is assumed to be 0 and if $upper equals '_' it is assumed to
# be infinity.
my $lower = shift;
my $upper = shift;
my $num_args = scalar @_;
$lower = 0 if $lower eq '_';
my $lower_ok = $lower <= $num_args;
my $upper_ok = $upper eq '_' ? 1 : $upper >= $num_args;
unless ($lower_ok && $upper_ok) {
my $caller = ( caller(1) )[3];
my $error_msg = "yabsm: internal error: called '$caller' with $num_args args but it expects";
my $range_msg;
if ($upper eq '_') { $range_msg = "at least $lower args" }
elsif ($lower == $upper) { $range_msg = "$lower args" }
else { $range_msg = "$lower-$upper args" }
confess("$error_msg $range_msg");
}
return 1;
}
sub with_error_catch_log {
# Call $sub with @args within a Feature::Compat::Try try/catch block to catch
# any exception and log it to /var/log/yabsm instead of killing the program.
my $sub = shift;
my @args = @_;
try {
$sub->(@args);
}
catch ($e) {
if (-f '/var/log/yabsm' && open(my $fh, '>>', '/var/log/yabsm')) {
$e =~ s/^\s+|\s+$//g;
my $t = localtime();
my ($yr, $mon, $day, $hr, $min) = map { sprintf '%02d', $_ } $t->year, $t->mon, $t->mday, $t->hour, $t->min;
say $fh "[${yr}_${mon}_${day}_$hr:$min]: $e";
close $fh;
}
}
}
sub have_sudo_access_to_btrfs {
# Return 1 if we can run 'btrfs' with 'sudo -n' and return 0 otherwise.
arg_count_or_die(0, 0, @_);
return 0+(0 == system('sudo -n btrfs --help >/dev/null 2>&1'));
}
sub have_sudo_access_to_btrfs_or_die {
# Wrapper around have_sudo_access_to_btrfs() that Carp::Confess's if it
# returns false.
arg_count_or_die(0, 0, @_);
my $username = getpwuid $<;
have_sudo_access_to_btrfs() ? return 1 : die("yabsm: internal error: no sudo access rights to 'btrfs' while running as user '$username'");
}
sub is_btrfs_dir {
# Return 1 if $dir is a directory residing on a btrfs subvolume
# and return 0 otherwise.
arg_count_or_die(1, 1, @_);
( run in 1.487 second using v1.01-cache-2.11-cpan-ceb78f64989 )