#!/bin/bash
#==============================================================================
#
# FILE: check_newbackup.sh
# (Nagios Check for backups)
#
# USAGE: check_newbackup.sh [-h] [-V] [-v]
#
# DESCRIPTION: Checking cPanel backups.
#
# REQUIREMENTS: cPanel
# BUGS: ---
# NOTES: https://track.namecheap.net/browse/TO-2821
# AUTHOR: Ivan Zharikov, Ivan Z, ivan.zharikov@namecheap.com
# COMPANY: Namecheap, Inc.
# VERSION: 0.2.2
# CREATED: 04.03.2018
# UPDATED: 06.09.2023
# CHANGES: Removed unused array element array_schedule=("modified"]="0"),
# added right interval for weekly and monthly backups
#==============================================================================
VERSION='0.2.2'
APPNAME=$(basename "$0")
CPANEL_MAINDIR='/usr/local/cpanel'
CONFF_LEGACY='/etc/cpbackup.conf'
CONFF_NEW='/var/cpanel/backups/config'
BACKUP_LOGDIR="${CPANEL_MAINDIR}/logs/cpbackup"
CPANEL_BACKUPLOGDIR="${CPANEL_MAINDIR}/logs/cpbackup"
TMPL_SUCCESS='Final state is Backup::Success'
TMPL_COMPLETED='Completed at'
E_COMMAND_NOTFOUND=127
E_INVALID_OPTION=128
E_INVALID_ARGUMENT=128
NAGIOS_EC_OK=0
NAGIOS_EC_WARNING=1
NAGIOS_EC_CRITICAL=2
NAGIOS_EC_UNKNOWN=3
DEBUG=''
function help() {
cat <<EOT
This is a Nagios check for cPanel backups.
Usage: $APPNAME [-h] [-V] [-v]
-h this help
-v More verbose output.
-V version
EOT
}
function version() {
echo "'$APPNAME', version: $VERSION"
}
# Check: Is it only parameter?
function onlyprm() {
AMOUNT=$1
if [[ $AMOUNT > 1 ]]; then
echo "The number of parameters can not be more than one! Use: $APPNAME -h"
exit $E_INVALID_OPTION
fi
}
# Cutting whitespases
function trim (){
local TRIMMED="$1"
TRIMMED="${TRIMMED## }"
TRIMMED="${TRIMMED%% }"
echo "$TRIMMED"
}
function numfilesdir () {
local CATALOG="$1"
FILESTOTAL=$(find "${CATALOG}"/ -maxdepth 1 -type f | wc -l)
echo "$FILESTOTAL"
}
function intervall (){
local SEQUENCE="$1"
declare ary=( $(echo $SEQUENCE | sed 's/,/ /g') )
if [ ${#ary[*]} == 1 ];then
echo "1"
else
echo $[ (${ary[1]} - ${ary[0]}) ]
fi
}
while getopts "hVv" opt; do
case $opt in
h)
onlyprm $#
help
exit "0"
;;
V)
onlyprm $#
version
exit "0"
;;
v)
DEBUG=1
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit "$E_INVALID_OPTION"
;;
:)
echo "Option -OPTARG requires an argument." >&2
exit "$E_INVALID_ARGUMENT"
;;
esac
done
# Check if cPanel installed on the server
x=$(${CPANEL_MAINDIR}/cpanel -V 2>/dev/null)
if [[ -z "$x" ]]; then
[[ "$DEBUG" ]] && echo 'Cpanel not installed on this server'
exit "$NAGIOS_EC_UNKNOWN"
fi
# Check for both config files
if [ ! -r "$CONFF_LEGACY" ] && [ ! -r "$CONFF_NEW" ]; then
[[ "$DEBUG" ]] && echo 'There are not any configuration files!'
exit "$NAGIOS_EC_CRITICAL"
fi
# Check if backup partition is mounted
if [[ ! $(df -h|grep backup) ]]; then
echo 'Backup partition is not mounted'
exit "$NAGIOS_EC_CRITICAL"
fi
# There are array of triggers
# by default enabled both - enabled legacy
declare -A array_states=(["LEGACY"]="1" ["NEW"]="1")
if [ ! -e "$CONFF_LEGACY" ]
then
array_states["LEGACY"]="0"
else
[[ $(cat ${CONFF_LEGACY} | tr '[:upper:]' '[:lower:]'|awk '/backupenable/ {print $2}') == "no" ]] && array_states["LEGACY"]="0"
fi
[[ $(whmapi1 backup_config_get|tr '[:upper:]' '[:lower:]'|awk '/backupenable/ {print $2}') == "0" ]] && array_states["NEW"]="0"
# Analysis
# What's going on with backups
if [ ${array_states["LEGACY"]} == 0 ] && [ ${array_states["NEW"]} == 0 ]
then
[[ "$DEBUG" ]] && echo "cPanel backup disabled"
exit $NAGIOS_EC_CRITICAL
elif [ ${array_states["LEGACY"]} == 1 ] && [ ${array_states["NEW"]} == 1 ]
then
[[ "$DEBUG" ]] && echo "legacy backup still enabled"
exit $NAGIOS_EC_WARNING
elif [ ${array_states["LEGACY"]} == 1 ] && [ ${array_states["NEW"]} == 0 ]
then
[[ "$DEBUG" ]] && echo "legacy backup enabled"
exit $NAGIOS_EC_WARNING
fi
# A test output of 'backup type'
#echo -e "${!array_states[*]} \n ${array_states[*]}"
# Specify when and how often
# type = d | w | m (daily or weekly or monthly)
declare -A array_schedule=(["type"]="d" ["backupdays"]="0")
RET=''
DAYE=$(whmapi1 backup_config_get | grep daily_enable); DAYE=$(trim ${DAYE#*:})
WEKE=$(whmapi1 backup_config_get | grep weekly_enable); WEKE=$(trim ${WEKE#*:})
MONE=$(whmapi1 backup_config_get | grep monthly_enable); MONE=$(trim ${MONE#*:})
if [ "$DAYE" -eq 1 ]
then
RET=$(whmapi1 backup_config_get | grep backupdays); RET=${RET#*:}
array_schedule["backupdays"]=$(trim ${RET})
array_schedule["type"]="d"
elif [ "$WEKE" -eq 1 ]
then
RET=$(whmapi1 backup_config_get | grep weekly_day); RET=${RET#*:}
array_schedule["backupdays"]=$(trim ${RET})
array_schedule["type"]="w"
elif [ "$MONE" -eq 1 ]
then
RET=$(whmapi1 backup_config_get | grep monthly_dates); RET=${RET#*:}
array_schedule["backupdays"]=$(trim ${RET})
array_schedule["type"]="m"
fi
# A test output of 'Schedule'
#echo -e "${!array_schedule[*]} \n ${array_schedule[*]}"
# Are there any logfiles?
if [[ $(numfilesdir ${CPANEL_BACKUPLOGDIR}) == 0 ]]; then
[[ "${DEBUG}" ]] && echo "There are no backups logfiles."
exit 2
fi
# Were backups performed successfull?
files_array=( $(grep -l "${TMPL_SUCCESS}" ${CPANEL_BACKUPLOGDIR}/*) )
# How many?
if [[ "${#files_array[@]}" == 0 ]];then
[[ "${DEBUG}" ]] && echo "Non of successfull backup has been done"
exit 2
fi
# Backuping interval calculation
#
# Get sorted list of the logs files
sorted_filenames=($(printf '%s\n' "${files_array[@]}"|sort ))
# get backup end date (unixtime) from the last logfile
BACKUP_DATE_UTIME=$(grep "${TMPL_COMPLETED}" ${sorted_filenames[@]:(-1)})
# Successfully complete (unixtime)
BACKUP_END_DATE_UTIME=$(date +%s -d "${BACKUP_DATE_UTIME#*at }")
NOW_UTIME=$(date +%s)
INTERVAL_DAYS=$(intervall ${array_schedule["backupdays"]})
REAL_INTERVAL_DAYS=$[ (${NOW_UTIME} - ${BACKUP_END_DATE_UTIME}) / 60 / 60 / 24 ]
case ${array_schedule["type"]} in
d)
if [ "${REAL_INTERVAL_DAYS}" -le "$(( ${INTERVAL_DAYS} + 1 ))" ]; then
[[ "${DEBUG}" ]] && echo "Daily backup is Ok"
exit 0
else
[[ "${DEBUG}" ]] && echo "Successfull daily backup has been performed too long ago"
exit 2
fi
;;
w)
if [ "${REAL_INTERVAL_DAYS}" -le "$(( ${INTERVAL_DAYS} + 7 ))" ]; then
[[ "${DEBUG}" ]] && echo "Weekly backup is Ok"
exit 0
else
[[ "${DEBUG}" ]] && echo "Successfull weekly backup has been performed too long ago"
exit 2
fi
;;
m)
# Get length of month;
MONTH_LEN_DAYS=$(cal $(date +"%m %Y") | awk 'NF {DAYS = $NF}; END {print DAYS}')
if [ "${REAL_INTERVAL_DAYS}" -le "$(( ${INTERVAL_DAYS} + ${MONTH_LEN_DAYS} ))" ]; then
[[ "${DEBUG}" ]] && echo "Monthly backup is Ok"
exit 0
else
[[ "${DEBUG}" ]] && echo "Successfull monthly backup has been performed too long ago"
exit 2
fi
;;
esac
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]