From ad6de93b1375356ec04612a0a4db17c730e57778 Mon Sep 17 00:00:00 2001 From: Christoph Kuchenbuch Date: Wed, 21 Nov 2018 14:22:50 +0100 Subject: [PATCH] Add check script for sympas webservice via socket 'wwsympa..fcgi'. --- check_wwsympa_service.sh | 299 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100755 check_wwsympa_service.sh diff --git a/check_wwsympa_service.sh b/check_wwsympa_service.sh new file mode 100755 index 0000000..a41cc56 --- /dev/null +++ b/check_wwsympa_service.sh @@ -0,0 +1,299 @@ +#!/usr/bin/env bash + +working_dir="$(dirname $(realpath $0))" + + +# ------------- +# - Some Variables +# ------------- + +LOCK_DIR="/tmp/$(basename $0).LOCK" + +service_name="wwsympa" +alert_email_arr="ckubu@oopen.de" +sender_address="check_${service_name}@$(hostname -f)" + +wwsympa_commands="/usr/local/sympa/bin/wwsympa.fcgi" + +check_string_ps="$wwsympa_commands" + +restart_needed=false + +# ------------- +# - Job is already running? +# ------------- + +# - If job already runs, stop execution.. +# - +if mkdir "$LOCK_DIR" 2> /dev/null ; then + + ## - Remove lockdir when the script finishes, or when it receives a signal + trap clean_up SIGHUP SIGINT SIGTERM + +else + + datum="$(date +"%d.%m.%Y %H:%M")" + + msg="[ Error ]: A previos instance of \"`basename $0`\" seems already be running.\n\n Exiting now.." + + echo "" + echo "[ Error ]: A previos instance of that script \"`basename $0`\" seems already be running." + echo "" + echo -e " Exiting now.." + echo "" + + for _email in ${alert_email_arr[@]} ; do + echo -e "To:${_email}\n${content_type}\nSubject:Error cronjob `basename $0` -- $datum\n${msg}\n" \ + | sendmail -F "Error `hostname -f`" -f $sender_address $_email + done + + exit 1 + +fi + + +# ------------- +# - Some functions +# ------------- + +clean_up() { + + # Perform program exit housekeeping + rm -rf "$LOCK_DIR" + exit $1 +} + +echononl(){ + if $terminal ; then + echo X\\c > /tmp/shprompt$$ + if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then + echo -e -n "$*\\c" 1>&2 + else + echo -e -n "$*" 1>&2 + fi + rm /tmp/shprompt$$ + fi +} + +fatal(){ + echo "" + if $terminal ; then + echo -e " [ \033[31m\033[1mFatal\033[m ]: $*" + echo "" + echo -e " \033[31m\033[1mScript was interupted\033[m!" + else + echo " [ Fatal ]: $*" + echo "" + echo " Script was terminated...." + fi + echo "" + clean_up 1 +} + +error (){ + echo "" + if $terminal ; then + echo -e " [ \033[31m\033[1mError\033[m ]: $*" + else + echo "[ Error ]: $*" + fi + echo "" +} + +warn (){ + echo "" + if $terminal ; then + echo -e " [ \033[33m\033[1mWarning\033[m ]: $*" + else + echo "[ Warning ]: $*" + fi + echo "" +} + +info (){ + if $terminal ; then + echo "" + echo -e " [ \033[32m\033[1mInfo\033[m ]: $*" + echo "" + fi +} + +echo_done() { + if $terminal ; then + echo -e "\033[75G[ \033[32mdone\033[m ]" + fi +} +echo_failed(){ + if $terminal && $LOGGING ; then + echo -e "\033[75G[ \033[1;31mfailed\033[m ]" + fi +} +echo_skipped() { + if $terminal && $LOGGING ; then + echo -e "\033[75G[ \033[33m\033[1mskipped\033[m ]" + fi +} + + +# ------------- +# - Check some prerequisites +# ------------- + +# - Running in a terminal? +# - +if [[ -t 1 ]] ; then + terminal=true +else + terminal=false +fi + +# - Systemd supported ? +# - +systemd=$(which systemd) +systemctl=$(which systemctl) + +systemd_supported=false +if [[ -n "$systemd" ]] && [[ -n "$systemctl" ]] ; then + systemd_supported=true +fi + +# - Check How to start/stop service +# - +SYSTEMD_UNIT_FILE="" +SYSY_INIT_SCRIPT="" +if $systemd_supported ; then + SYSTEMD_UNIT_FILE="$(systemctl list-unit-files | grep -E "${service_name}[^@]*\.service" | grep "enabled" | cut -d' ' -f1)" +fi + +if [[ -z "$SYSTEMD_UNIT_FILE" ]]; then + SYSY_INIT_SCRIPT="$(service --status-all | awk '{print$4}' | grep ${service_name} | head -1)" +fi + +if [[ -z "$SYSTEMD_UNIT_FILE" ]] && [[ -z "$SYSY_INIT_SCRIPT" ]] ; then + fatal "Neither an init-script nor a service file for ${service_name} service found!" +fi + + +# ------------- +# - Main Part of Script +# ------------- + +if $terminal ; then + echo -e "\n Check if ${service_name} service is running.." + echo -e " ===================================" +fi + + +# - Note: +# - +# - first we will check '/usr/local/symba/bin/wwsympa.fcgi' +# - second we will check '$(realpath "/usr/local/symba/bin/wwsympa.fcgi"' +# - i.e /usr/local/sympa-6.2.36/bin/wwsympa.fcgi +# - +for _command in $wwsympa_commands ; do + PIDS="$(ps ax | grep -E "${_command}" | grep -v grep | awk '{print$1}')" + if [[ -z "$PIDS" ]]; then + _command="$(realpath "${_command}")" + PIDS="$(ps ax | grep -E "${_command}" | grep -v grep | awk '{print$1}')" + if [[ -z "$PIDS" ]]; then + restart_needed=true + break + fi + fi +done + +if $restart_needed ;then + + error "${service_name} service seems to be down. Try to (re)start .." + + echononl " Stop service '${service_name}' first .." + if [[ -n "$SYSTEMD_UNIT_FILE" ]] ; then + systemctl stop $SYSTEMD_UNIT_FILE > /dev/null 2>&1 + if [[ $? -eq 0 ]] ; then + echo_done + else + echo_failed + fi + else + /etc/init.d/$SYSY_INIT_SCRIPT stop > /dev/null 2>&1 + if [[ $? -eq 0 ]] ; then + echo_done + else + echo_failed + fi + fi + + sleep 2 + + echononl " Start Service '${service_name}' .." + if [[ -n "$SYSTEMD_UNIT_FILE" ]] ; then + systemctl start $SYSTEMD_UNIT_FILE > /dev/null 2>&1 + if [[ $? -eq 0 ]] ; then + echo_done + else + echo_failed + fi + else + /etc/init.d/$SYSY_INIT_SCRIPT start > /dev/null 2>&1 + if [[ $? -eq 0 ]] ; then + echo_done + else + echo_failed + fi + fi + + + declare -i count=0 + + restart_sucessfully=false + while [[ $count -lt 10 ]] && ! $restart_sucessfully ; do + + ((count++)) + + sleep 1 + + PIDS="" + NEW_PIDS="" + declare -i count_2=0 + for _command in $sympa_commands ; do + + ((count_2++)) + + PIDS="$(ps ax | grep -E "${_command}" | grep -v grep | awk '{print$1}')" + if [[ -z "$PIDS" ]]; then + continue + else + if [[ $count_2 -eq 1 ]] ; then + NEW_PIDS="$PIDS" + else + NEW_PIDS="$NEW_PIDS $PIDS" + fi + fi + done + restart_sucessfully=true + break + + done + + if ! $restart_sucessfully ; then + error "Restarting service '${service_name}' failed." + else + + info "Service '${service_name}' was restarted and is now up and running. + The new PIDs are $NEW_PIDS" + + if ! $terminal ; then + echo "" + echo "[ Success ]: Service '${service_name}' was restarted and is now up and running." + echo " The new PIDs are $NEW_PIDS" + echo "" + fi + + fi + +else + info "Service ${service_name} is up and running." +fi + +clean_up 0 +