Anons79 Mini Shell

Directory : /usr/local/nagios/plugins/
Upload File :
Current File : //usr/local/nagios/plugins/check_newbackup

#!/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]