#!/bin/bash
##########################################################################################
##
## Event Handler-Skript um einen RemoteServie neu zu starten.
## Verwendung findet hierbei der NRPE - Agent oder ssh
##
## Achtung: Dieses Skript startet einen beliebigen Service neu,
## sobald erstmalig ein Problem mit einem Service festgestellt wird
## Besteht das Problem beim zweiten Check immer noch, wird erneut
## ein Restart dieses Services veranlasst.
## Besteht das Problem weiterhin, wird keine Aktioen mehr ausgefuehr, da
## davon auszugehen ist, dass sich das Problem durch einen restart
## nicht loesen laesst.
##
## VERSION: 0.0.1
## DATE: 01.10.2014
## MODIFIED: 07.06.2017
## MAINTAINER: Mad Murdock
## LICENSE: GPLv3
##
##
##########################################################################################
## set -x
MY_DIR="/opt/scripts/nagios/eventhandler"
CONTACTEMAIL="<your_mail_address_here>"
#############################################################
## DIABLE EVENTHANDLER BETWEEN TIME_DISABLE AND TIME_ENABLE
## BETWEEN THIS TIMEPERIOD SEND OK PASSIVE CHECKS INTO
## NAGIOS CMD
#############################################################
TIME_DISABLE="00:00"
TIME_ENABLE="00:01"
## ------------------------------
SSH_BINARY="/usr/bin/ssh"
SCP_BINARY="/usr/bin/scp"
SSH_KEY="/var/lib/nagios/.ssh/id_rsa"
#############################################################
## REMOTE EVENT WRAPPER // TRIGGERED BY SUDOERS
#############################################################
LOCAL_EVT_CMD="${MY_DIR}/template/evt_restart.sh"
REMOTE_EVT_CMD="/var/tmp/evt_restart.sh"
NRPE_BINARY="/usr/lib/nagios/plugins/check_nrpe"
NRPE_PORT="${PORT}"
## CENTREON
NAGIOS_CMD_SOCKET='/var/spool/nagios/nagios.cmd'
## ICINGA
NAGIOS_CMD_SOCKET='/var/run/icinga2/cmd/icinga2.cmd'
ALL_ARGS="$@"
#### ------- 03.01.2017 ---------
DATE_TODAY="$( date +"%D" )"
TIME_NOW="$( date +%s )"
TIME_DISABLE="${DATE_TODAY} ${TIME_DISABLE}"
TIME_ENABLE="${DATE_TODAY} ${TIME_ENABLE}"
#### ------- 07.06.2019 ---------
###############################################
## CONVERTED FROM ARGS INTO GETOPTS
###############################################
function show_help () {
cat <<-EOF
-h [ USAGE :: ${0##*/} ]
-i SERVICE STATE \$service.state\$ ( critical | warning )
-a SERVICE ATTEMPT \$service.check_attempt\$ ( 1 | 2 | 3 )
-t SERVICE TYPE \$service.state_type\$ ( hard | soft )
-n HOST NAME \$host.name\$ ( web.kube.prod )
-s SERVICE NAME \$service.name\$ ( httpd | postfix | ... )
-b REMOTE PROTOCOL \$connet.protocol\$ ( ssh | nrpe )
-p REMOTE PORT \$connect.port\$ ( 22 | 5666 )
-u REMOTE SSH USER \$remote.user\$ ( root | monitoring | nagios | ... )
-d DOWNTIME \$evt.downtime\$ ( false <diabled> | true <enabled> )
EOF
}
while getopts "hi:a:t:n:s:b:u:p:d:" OPT; do
case "${OPT}" in
h)
show_help
exit 0
;;
i)
SERVICE_STATE=${OPTARG}
;;
a)
SERVICE_ATTEMPT=${OPTARG}
;;
t)
SERVICE_TYPE=${OPTARG}
;;
n)
HOST=${OPTARG}
;;
s)
SERVICE=${OPTARG}
;;
b)
USE_BINARY=${OPTARG:-ssh}
;;
u)
REMOTE_USER=${OPTARG:-monitoring}
;;
p)
PORT=${OPTARG:-22}
;;
d)
DOWNTIME=${OPTARG:-0}
;;
'?')
show_help
exit 0
;;
esac
done
###############################################
## BREAK IF SOME PARAMETER ARE NOT SET
###############################################
if [ ! "${SERVICE_STATE}" ]; then
show_help
printf "\n ERROR: -i REQUIRED.\n"
exit 1
fi
if [ ! "${SERVICE_ATTEMPT}" ]; then
show_help
printf "\n ERROR: -a REQUIRED.\n"
exit 1
fi
if [ ! "${SERVICE_TYPE}" ]; then
show_help
printf "\n ERROR: -t REQUIRED.\n"
exit 1
fi
if [ ! "${HOST}" ]; then
show_help
printf "\n ERROR: -n REQUIRED.\n"
exit 1
fi
if [ ! "${SERVICE}" ]; then
show_help
printf "\n ERROR: -s REQUIRED.\n"
exit 1
fi
if [ ! "${REMOTE_USER}" ]; then
show_help
printf "\n ERROR: -u REQUIRED.\n"
exit 1
fi
if [ ! "${PORT}" ]; then
show_help
printf "\n ERROR: -p REQUIRED.\n"
exit 1
fi
if [ ! "${USE_BINARY}" ]; then
show_help
printf "\n ERROR: -b REQUIRED.\n"
exit 1
fi
NRPE_PORT="${PORT}"
#### ------- 01.10.2014 ---------
#############################################################
## CONVERT TIME TO UTC TIME
#############################################################
function date2utc () {
date --date "$1" +%s
}
#############################################################
## SENDING PASSIVE CHECKS
#############################################################
function send_passive_check () {
HOST="$1"
SERVICE_DESC="$2"
RETURN_CODE="$3"
if [ ! "${SERVICE_DESC}" ]; then
echo "USAGE :: $0 <HOST> <SERVICE_DESC> <RETURN_CODE>"
echo "eg. $0 lvom01 check_cpu_usage 0"
exit 3
fi
printf "[%lu] PROCESS_SERVICE_CHECK_RESULT;${HOST};${SERVICE_DESC};${RETURN_CODE};RESETTED BY EVENTHANDLER\n" $( date +%s ) | tee -a $NAGIOS_CMD_SOCKET
}
#############################################################
## RESTARTING REMOTE SERVICE
#############################################################
## USING SSH
#############################################################
function restart_ssh_remote_service () {
## SERVICE :: [ ${SERVICE} // RESTART ]
/usr/bin/timeout 10 ${SCP_BINARY} -P ${PORT} -i ${SSH_KEY} ${LOCAL_EVT_CMD} "${REMOTE_USER}@${HOST}:${REMOTE_EVT_CMD}" | logger -t EVENTHANDLER
/usr/bin/timeout 58 ${SSH_BINARY} -t -p ${PORT} -n -i ${SSH_KEY} "${REMOTE_USER}@${HOST}" "/usr/bin/timeout 57 /usr/bin/sudo ${REMOTE_EVT_CMD} ${SERVICE} " 2>&1 | logger -t EVENTHANDLER
## WRITE SYSLOGENTRY
echo ${SSH_BINARY} -i ${SSH_KEY} -n "${REMOTE_USER}@${HOST}" "${SSH_COMMAND} ${SERVICE} restart" | logger -t EVENTHANDLER
if [ -f /var/tmp/._${SERVICE}.mail ]; then
/usr/bin/mail -s "EVENTHANDLER :: ${SERVICE} @ ${HOST}" ${CONTACTEMAIL} < /var/tmp/._${SERVICE}.mail
## CLEANUP
[[ -f /var/tmp/._${SERVICE}.mail ]] && rm /var/tmp/._${SERVICE}.mail
fi
}
#############################################################
## USING NRPE
#############################################################
function restart_nrpe_remote_service () {
## SERVICE :: [ ${SERVICE} // RESTART ]
${NRPE_BINARY} -t 60 -H ${HOST} -p ${NRPE_PORT} -c restart_by_nrpe -a "${SERVICE}" "${SERVICE}" 2>&1 > /var/tmp/._${SERVICE}.mail
## WRITE SYSLOGENTRY
echo ${NRPE_BINARY} -t 60 -H ${HOST} -p ${NRPE_PORT} -c restart_by_nrpe -a "${SERVICE}" "${SERVICE}" | logger -t EVENTHANDLER
if [ -f /var/tmp/._${SERVICE}.mail ]; then
/usr/bin/mail -s "EVENTHANDLER :: ${SERVICE} @ ${HOST}" ${CONTACTEMAIL} < /var/tmp/._${SERVICE}.mail
## CLEANUP
[[ -f /var/tmp/._${SERVICE}.mail ]] && rm /var/tmp/._${SERVICE}.mail
fi
}
#############################################################
## MAIN
#############################################################
TIME_DISABLE=$( date2utc "${TIME_DISABLE}" )
TIME_ENABLE=$( date2utc "${TIME_ENABLE}" )
## IGNORE IF DOWNTIME PARAM -d = false
if [ "${DOWNTIME}" = "true" ];
then
if [ "${TIME_NOW}" -ge "${TIME_DISABLE}" ] && [ "${TIME_NOW}" -le "${TIME_ENABLE}" ]; then
echo "NO EVENT DURING MAINTENANCE :: ${SERVICE} ( ${SERVICE_DESC} ) <==> ${HOST}" | logger -t EVENTHANDLER
send_passive_check "${HOST}" "${SERVICE_DESC}" "0"
exit 0
fi
fi
#### ------- 03.01.2017 ---------
echo ${ALL_ARGS} | grep "DOWNTIMESTART" &>/dev/null
if [ $? -eq 0 ]; then
echo "EVENTHANDLER FOR ${HOST}, COMMAND ${COMMAND} AND SERVICE ${SERVICE} DISABLED BECAUSE OF NOTIFICATIONDOWNTIME" | logger -t EVENTHANDLER
fi
case "${SERVICE_STATE}" in
CRITICAL|WARNING|critical|warning)
case "${SERVICE_TYPE}" in
SOFT|soft)
case "${SERVICE_ATTEMPT}" in
2)
echo "RESTARTING SERVICE SOFT CRITICAL..."
if [ "${USE_BINARY}" = "ssh" ]; then
restart_ssh_remote_service
elif [ "${USE_BINARY}" = "nrpe" ]; then
restart_nrpe_remote_service
else
echo "--------------------------------------------------------------------------"
echo " NEITHER [SSH] NOR [NRPE] SELECTED. CHECK NOT POSSIBLE. ABORTING ..."
echo " SET USE_BINARY=\"ssh|nrpe\" AT TOP OF SCRIPT"
echo " OR MODIFY IT TO SET IT BY ARGUMENT. MODIY COMMANDS.CFG AS WELL!"
echo "--------------------------------------------------------------------------"
exit 1
fi
;;
esac
;;
HARD|hard)
echo "RESTARTING SERVICE HARD CRITICAL..."
if [ "${USE_BINARY}" = "ssh" ]; then
restart_ssh_remote_service
elif [ "${USE_BINARY}" = "nrpe" ]; then
restart_nrpe_remote_service
else
echo "--------------------------------------------------------------------------"
echo " NEITHER [SSH] NOR [NRPE] SELECTED. CHECK NOT POSSIBLE. ABORTING ..."
echo " SET USE_BINARY=\"ssh|nrpe\" AT TOP OF SCRIPT"
echo " OR MODIFY IT TO SET IT BY ARGUMENT. MODIY COMMANDS.CFG AS WELL!"
echo "--------------------------------------------------------------------------"
exit 1
fi
;;
esac
;;
*)
echo "USAGE :: $0 CRITICAL SOFT 1 mysql.4lords.server mysql"
;;
esac
Remote Script
Wird vom Eventhandler auf das Zeilsystem kopiert
evt_restart.sh
#!/bin/bash
##########################################################################################
##
## Event Handler-Skript um einen RemoteServie neu zu starten.
## Verwendung findet hierbei der NRPE - Agent oder ssh
##
## Achtung: Dieses Skript startet einen beliebigen Service neu,
## sobald erstmalig ein Problem mit einem Service festgestellt wird
## Besteht das Problem beim zweiten Check immer noch, wird erneut
## ein Restart dieses Services veranlasst.
## Besteht das Problem weiterhin, wird keine Aktioen mehr ausgefuehr, da
## davon auszugehen ist, dass sich das Problem durch einen restart
## nicht loesen laesst.
##
## VERSION: 0.0.1
## DATE: 01.10.2014
## MAINTAINER: Mad Murdock
## LICENSE: GPLv3
##
##
##########################################################################################
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SERVICE="$1"
TIMEOUT="5"
if [ ! ${SERVICE} ]; then
echo "NOTHING TO DO. NO SERVICE GIVEN"
exit 1
elif [ "${SERVICE}" = "reboot" ]; then
systemctl stop mysql
sudo /sbin/reboot &
else
#service ${SERVICE} stop
systemctl stop ${SERVICE}
while [ ! "${COUNT}" = "${TIMEOUT}" ]; do
(( COUNT ++ ))
echo -n "."
sleep 1
done
systemctl start ${SERVICE}
fi
##########################################
## SPECIAL VALUES
##########################################
## CHECK IF MOTION THEN REMOVE TRIGGER
NAGIOS_TRIGGER="/var/tmp/._event.result"
[[ -f ${NAGIOS_TRIGGER} ]] && rm -f ${NAGIOS_TRIGGER}

