Current File : //proc/thread-self/root/lib64/nagios/plugins/nccustom/check_backup.sh |
#!/bin/bash
# shellcheck disable=SC2009
# DEFF VARS
cp_backup_fstab_check=1
cp_backup_mount_check=1
cp_backup_rofs_check=1
cp_backup_cpbackup_age_check=0
cp_backup_mkfs_check=1
cp_backup_spaceCrit=5
wMINUTES=$((7200 * 60))
cMINUTES=$((11520 * 60))
while getopts w:c:htfmrkaS: opts; do
case $opts in
h) echo -e "
Help:
Usage: check_backup.sh [arg]...[arg]
[list of args]
-t # equal echo test
-w 'min' # equal wMINUTES=\$['min' * 60 ]
-c 'min' # equal cMINUTES=\$['min' * 60 ]
-i # equal cp_backup_iscsid_check=0
-s # equal cp_backup_iscsi_session_check=0
-f # equal cp_backup_fstab_check=0
-m # equal cp_backup_mount_check=0
-r # equal cp_backup_rofs_check=0
-a # equal cp_backup_cpbackup_age_check=0
-k # equal cp_backup_mkfs_check=0
-S 'crit free space in %' # equal cp_backup_spaceCrit='crit free space in %'
-h # equal this message \n" && exit ;;
t) echo test ;;
w) wMINUTES=$((OPTARG * 60)) ;;
c) cMINUTES=$((OPTARG * 60)) ;;
f) cp_backup_fstab_check=0 ;;
m) cp_backup_mount_check=0 ;;
r) cp_backup_rofs_check=0 ;;
a) cp_backup_cpbackup_age_check=0 ;;
k) cp_backup_mkfs_check=0 ;;
S) cp_backup_spaceCrit=${OPTARG} ;;
*) ;;
esac
done
# Check FSTAB
if ((cp_backup_fstab_check == 1)); then
if ! grep -q -Po "(^\d.*/backup\s+nfs(:?\d)?\s+rw)" /etc/fstab; then
status="[CRITICAL:]"
statustxt="No active /backup partition in /etc/fstab"
echo "${status} ${statustxt}"
exit 2
fi
fi
# if some one performed MKFS
if ((cp_backup_mkfs_check == 1)); then
if ps auxf | grep "[m]kfs.xfs" | grep -v -i "screen"; then
status="[CRITICAL:]"
statustxt="mkfs.xfs in progress\n"
echo "${status} ${statustxt}"
exit 2
fi
fi
# check backup partition is mounted ?
if ((cp_backup_mount_check == 1)); then
if ! (grep -q "^/dev/sd[a-z]\{1,3\}1 /backup " /proc/mounts || grep -q -Po "(/backup\s+nfs(:?\d)?\s+rw)" /proc/mounts); then
statustxt="/backup partition is not mounted"
if ps auxf | grep "[f]sck" | grep -q -v -i "screen"; then
statustxt+=" Fsck running !"
fi
status="[CRITICAL:]"
echo "${status} ${statustxt}"
exit 2
fi
fi
#Check if backup running too long
if ps aux | grep "/usr/local/cpanel/scripts/[c]pbackup" -m 1; then
STARTDATE=$(date -d "$(ps -eo pid,lstart,cmd | grep "/usr/local/cpanel/scripts/[c]pbackup" -m 1 | awk '{print $2" "$3" "$4" "$5" "$6}')" +"%s")
RUNTIME=$(($(date +"%s") - STARTDATE))
if ((RUNTIME >= 432000)); then # "Cpbackup duration longer then 5 days"
statustxt="cpbackup duration longer than 5 days"
status="[CRITICAL:]"
echo "${status} ${statustxt}"
exit 2
elif ((RUNTIME >= 259200)); then
statustxt="cpbackup duration longer than 3 days"
status="[WARNING:]"
echo "${status} ${statustxt}"
exit 1
fi
fi
#check RO-FS /backup
#touch with sudo only! and check status
if ((cp_backup_rofs_check == 1)); then
if ! error=$(ls /backup/ro_backup_test.tmp 2>&1 >/dev/null); then
status="[CRITICAL:]"
statustxt="cannot access /backup: $error"
echo "${status} ${statustxt}"
exit 2
fi
if ! sudo /bin/touch /backup/ro_backup_test.tmp; then
status="[CRITICAL:]"
statustxt="/backup partition is in RO-FS state"
echo "${status} ${statustxt}"
exit 2
fi
fi
#check size /backup partition
if ((cp_backup_spaceCrit >= 1)); then
cp_backup_spaceWarn=$((cp_backup_spaceCrit * 2))
UsedSpace=$(df -h /backup | grep -E -o "[[:space:]].*[[:space:]].*[[:space:]].*[[:space:]]/backup" | awk '{print $4}' | awk -F "%" '{print $1}' | sort -u | head -n 1)
FreeSpace=$((100 - UsedSpace))
if ((FreeSpace <= cp_backup_spaceCrit)); then
statustxt="free space on /backup partition less than $cp_backup_spaceCrit%"
status="[CRITICAL:]"
echo "${status} ${statustxt}"
exit 2
elif ((FreeSpace > cp_backup_spaceCrit)) && ((FreeSpace <= cp_backup_spaceWarn)); then
statustxt="free space on /backup partition less than $cp_backup_spaceWarn%"
status="[WARNING:]"
echo "${status} ${statustxt}"
exit 1
fi
fi
# check cp-bakup age
# check if process stuck
# usage: checkstuck [command] [timeout]
checkstuck() {
${1} >/dev/null 2>&1 &
infinipid=$!
timeout=${2}
fuckup=$((SECONDS + timeout))
while [[ $(pgrep -P "${infinipid}") ]]; do
if ((SECONDS >= fuckup)); then
kill -9 ${infinipid}
echo "Stuck on '${1}' with Pid '${infinipid}' Please re-mount backup partition."
exit 2
fi
done
}
#checkstuck infinit 2
if ((cp_backup_cpbackup_age_check == 1)); then
DATENOW=$(date +%s)
#get last shared user
shared_user=$(/usr/sbin/whmapi1 listaccts want="user" | grep -v "has_backup:" | awk -F":" '{print $2 }' | grep -m 1 '[^[:blank:]]')
checkstuck "stat /backup/cpbackup/daily/$shared_user" 15 # check if backup partition stuck (timeout 15 sec)
LASTKNIGHT=$(tail -n 1 /backup/users_with_old_backups.tmp)
LASTKNIGHT="${LASTKNIGHT:=$shared_user}"
NOBACKUP=$(grep -E -v -c "^\s*$" /backup/users_without_backups.tmp)
OLDUSERS=$(grep -E -v -c "^\s*$" /backup/users_with_old_backups.tmp)
WHDATE=$(stat -c "%Y" /backup/cpbackup/daily/"${LASTKNIGHT}")
#if [[ $(ps ax | grep "[/s]cripts/cpbackup") ]];
if ps ax | grep -q "[/r]oot/bin/nc_cp_backup.sh"; then
runBKP="[cpbackup in progress]"
echo "$runBKP"
exit 0
fi
if ! [[ $WHDATE ]]; then
statustxt="Can't access /backup/cpbackup/daily/${LASTKNIGHT} folder"
status="[CRITICAL:]"
echo "${status} ${statustxt}"
exit 2
fi
DELTA=$((DATENOW - WHDATE))
if ((DELTA > wMINUTES)) && ((DELTA < cMINUTES)); then
statustxt="Backups older than $((DELTA / 60 / 60 / 24)) day(s) ${OLDUSERS} account(s) affected and ${NOBACKUP} account(s) without backups"
if ((NOBACKUP > 0)); then
status="[CRITICAL:]"
echo "${status} ${statustxt}"
exit 2
else
status="[WARNING:]"
echo "${status} ${statustxt}"
exit 1
fi
elif ((DELTA > cMINUTES)); then
statustxt="Backups older than $((DELTA / 60 / 60 / 24)) day(s) ${OLDUSERS} account(s) affected and ${NOBACKUP} account(s) without backups"
status="[CRITICAL:]"
echo "${status} ${statustxt}"
exit 2
elif ((NOBACKUP > 0)); then
statustxt="Backups up to date but - ${NOBACKUP} account(s) without backups"
status="[CRITICAL:]"
echo "${status} ${statustxt}"
exit 2
fi
fi
echo "[OK]"
exit 0