From d633fdc223f815d3e9ea3078fb11b6ca87cdfb53 Mon Sep 17 00:00:00 2001 From: Christoph Date: Sun, 13 Aug 2023 16:06:42 +0200 Subject: [PATCH] check_webservice_load.sh: add support of 'MariaDB'. --- check_webservice_load.sh | 299 ++++++++++++++++++++++++- conf/check_webservice_load.conf.sample | 42 +++- 2 files changed, 334 insertions(+), 7 deletions(-) diff --git a/check_webservice_load.sh b/check_webservice_load.sh index be9e577..c7467ee 100755 --- a/check_webservice_load.sh +++ b/check_webservice_load.sh @@ -20,6 +20,7 @@ LOCK_DIR="/tmp/${script_name%%.*}.LOCK" # - check_load=false check_mysql=false +check_mariadb=false check_postgresql=false check_apache=false check_nginx=false @@ -179,6 +180,9 @@ DEFAULT_CONFLICTING_SCRIPTS="/root/bin/monitoring/check_local_webservice.sh" DEFAULT_TIMEOUT_CHECK_WEBSITE=10 DEFAULT_TIMEOUT_CHECK_PHP=10 +DEFAULT_mysql_credential_args="--login-path=local" +DEFAULT_mariadb_credential_args="" + if [[ ! -f "$conf_file" ]]; then echo "" echo -e " [ Fatal ] Configuration file '$(basename ${conf_file})' not found!" @@ -195,6 +199,9 @@ fi [[ -n "$CONFLICTING_SCRIPTS" ]] || CONFLICTING_SCRIPTS="$DEFAULT_CONFLICTING_SCRIPTS" +[[ -n "$mysql_credential_args" ]] || mysql_credential_args="$DEFAULT_mysql_credential_args" +[[ -n "$mariadb_credential_args" ]] || mariadb_credential_args="$DEFAULT_mariadb_credential_args" + # - Stop here, if these give scripts are running # - @@ -340,6 +347,77 @@ if ! $vserver_guest ; then fi +if $check_mariadb ; then + + MARIADBD="$(realpath $(which mariadbd) 2>/dev/null)" + if [ -z "$MARIADBD" ]; then + if [ -x "/usr/local/mysql/bin/mariadbd" ]; then + MARIADBD="$(realpath "/usr/local/mysql/bin/mariadbd")" + else + fatal 'Command \"mariadbd\" not found!' + fi + fi + + MARIADB_INIT_SCRIPT="" + MARIADBD_SERVICE_FILE="" + if $systemd_supported ; then + # - Is Service exclusive controlled by systemd + # - + if systemctl -t service list-unit-files \ + | grep -e "^mariadb" \ + | grep -q -E "(enabled|disabled)" 2> /dev/null ; then + MARIADBD_SERVICE_FILE=$(systemctl -t service list-unit-files \ + | grep -e "^mariadb.*.service" \ + | grep -E " enabled" \ + | awk '{print$1}'\ + | head -1) + fi + + fi + + if [[ -z "$MARIADBD_SERVICE_FILE" ]] ; then + if [ -x "$(realpath /etc/init.d/mariadb.server)" ]; then + MARIADB_INIT_SCRIPT="/etc/init.d/mariadb.server" + elif [ -x "$(realpath /etc/init.d/mariadb)" ]; then + MARIADB_INIT_SCRIPT="/etc/init.d/mariadb" + fi + fi + + if [[ -z "$MARIADB_INIT_SCRIPT" ]] && [[ -z "$MARIADBD_SERVICE_FILE" ]]; then + fatal 'Neither an init-script nor a service file for MariaDB found!' + else + MARIADB_PS_CHECK_STRING="$MARIADBD" + fi + + echo "MARIADB_PS_CHECK_STRING: $MARIADB_PS_CHECK_STRING" + + if [[ -z "$MARIADB_PS_CHECK_STRING" ]]; then + fatal "Cannot determin a check string for output of command 'ps ax'" + fi + + if [[ -n "$MARIADB_INIT_SCRIPT" ]] ; then + MARIADBD_SAFE="$(realpath $(which mariadbd-safe) 2>/dev/null)" + if [ -z "$MARIADBD_SAFE" ]; then + if [ -x "/usr/local/mysql/bin/mariadbd-safe" ]; then + MARIADBD_SAFE="$(realpath "/usr/local/mysql/bin/mariadbd-safe")" + else + fatal 'Command \"\mariadbd-safe" not found!' + fi + fi + fi + + MYADMIN="$(realpath $(which mariadb-admin) 2>/dev/null)" + if [ -z "$MYADMIN" ]; then + if [ -x "/usr/local/mysql/bin/mariadb-admin" ]; then + MYADMIN="$(realpath "/usr/local/mysql/bin/mariadb-admin")" + else + fatal 'Command \"mariadb-admin\" not found!' + fi + fi + +fi + + if $check_mysql ; then MYSQLD=`realpath $(which mysqld) 2>/dev/null` @@ -851,6 +929,81 @@ stop_nginx() { } +stop_mariadb() { + + + send_msg=$1 + send_msg=${send_msg:=true} + + # - Don't Start/Stop Services if package management is running (apt,aptitude,dpkg) + # - + if ( [[ "${os_dist,,}" = "debian" ]] || [[ "${os_dist,,}" = "ubuntu" ]] ) \ + && $(lsof /var/lib/dpkg/lock >/dev/null 2>&1) ; then + warn "It seems that package management (apt,dpkg) is running. Exiting '${FUNCNAME[0]}' now.." + return 1 + fi + + ## - Stop MariaDB Service + ## - + if [[ -n "$MARIADB_INIT_SCRIPT" ]]; then + $MARIADB_INIT_SCRIPT stop > /dev/null 2>&1 + else + systemctl stop "$MARIADBD_SERVICE_FILE" > /dev/null 2>&1 + fi + + _msg=false + + sleep 5 + + declare -i i=0 + PIDS="$(ps aux | grep -E "${MARIADB_PS_CHECK_STRING}" | grep -v grep | awk '{print$2}')" + while [ "X$PIDS" != "X" ]; do + + if [ $i -eq 0 ]; then + echo "" >> $LOCK_DIR/extra_msg.txt + echo -e "\t[ Error ]: Stopping MARIADB Service failed !!!" >> $LOCK_DIR/extra_msg.txt + echo "" >> $LOCK_DIR/extra_msg.txt + echo -e "\t[ Info ]; Going to kill MARIADB Processes .." >> $LOCK_DIR/extra_msg.txt + echo "" >> $LOCK_DIR/extra_msg.txt + + error "Stopping MARIADB Service failed !!!" + info "Going to kill MARIADB Processes .." + fi + + if [ $i -gt 10 ]; then + + echo "" >> $LOCK_DIR/extra_msg.txt + echo -e "\t[ Error ]: Killing MARIADB Processes failed !!!" >> $LOCK_DIR/extra_msg.txt + echo "" >> $LOCK_DIR/extra_msg.txt + + error "Killing MARIADB Processes failed !!!" + + _msg=true + + break + fi + + for _PID in $PIDS ; do + kill -15 $_PID > /dev/null 2>&1 + done + + sleep 5 + + PIDS="$(ps aux | grep -E "${MARIADB_PS_CHECK_STRING}" | grep -v grep | awk '{print$2}')" + i=i+1 + done + + if $send_msg && $_msg ; then + subject="[ Error ]: Stopping MARIADB Engine on `hostname -f` failed -- $datum" + msg="\n\n`cat $LOCK_DIR/extra_msg.txt`\n" + + for _to_address in $to_addresses ; do + echo -e "To:${_to_address}\n${content_type}\nSubject:$subject\n\n${msg}\n" \ + | /usr/sbin/sendmail -F "Webservice Monitor" -f $from_address $_to_address + done + fi +} + stop_mysql() { @@ -885,11 +1038,11 @@ stop_mysql() { echo "" >> $LOCK_DIR/extra_msg.txt echo -e "\t[ Error ]: Stopping MySQL Service failed !!!" >> $LOCK_DIR/extra_msg.txt echo "" >> $LOCK_DIR/extra_msg.txt - echo -e "\t[ Info ]; Going to kill MySQL Processes (mysqld_safe).." >> $LOCK_DIR/extra_msg.txt + echo -e "\t[ Info ]; Going to kill MySQL Processes .." >> $LOCK_DIR/extra_msg.txt echo "" >> $LOCK_DIR/extra_msg.txt error "Stopping MySQL Service failed !!!" - info "Going to kill MySQL Processes (mysqld_safe).." + info "Going to kill MySQL Processes .." fi if [ $i -gt 10 ]; then @@ -1255,6 +1408,68 @@ stop_redis() { } +start_mariadb() { + + send_msg=$1 + send_msg=${send_msg:=true} + + # - Don't Start/Stop Services if package management is running (apt,aptitude,dpkg) + # - + if ( [[ "${os_dist,,}" = "debian" ]] || [[ "${os_dist,,}" = "ubuntu" ]] ) \ + && $(lsof /var/lib/dpkg/lock >/dev/null 2>&1) ; then + warn "It seems that package management (apt,dpkg) is running. Exiting '${FUNCNAME[0]}' now.." + return 1 + fi + + if [[ -n "$MARIADB_INIT_SCRIPT" ]]; then + $MARIADB_INIT_SCRIPT start > /dev/null 2>&1 + else + systemctl start "$MARIADBD_SERVICE_FILE" > /dev/null 2>&1 + fi + + sleep 5 + + NEWPID="$(ps aux | grep -E "${MARIADB_PS_CHECK_STRING}" | grep -v grep | awk '{print$2}' | head -1) " + + if [ "X${NEWPID}X" = "XX" ]; then + + echo "" >> $LOCK_DIR/extra_msg.txt + echo -e "\t[ Error ]: I have started the MARIADB server, but the services is not running !!!" >> $LOCK_DIR/extra_msg.txt + echo "" >> $LOCK_DIR/extra_msg.txt + + error "I have started the MARIADB server, but the service is not running !!!" + + datum=`date +"%d.%m.%Y %H:%Mh"` + + subject="[ Error ]: MARIADB Service on `hostname -f` NOT RUNNING -- $datum" + msg="\n\n`cat $LOCK_DIR/extra_msg.txt`\n" + + for _to_address in $to_addresses ; do + echo -e "To:${_to_address}\n${content_type}\nSubject:$subject\n\n${msg}\n" \ + | /usr/sbin/sendmail -F "Webservice Monitor" -f $from_address $_to_address + done + + else + + echo "" >> $LOCK_DIR/extra_msg.txt + echo -e "\tI have started MARIADB service. The new PID is $NEWPID" >> $LOCK_DIR/extra_msg.txt + echo "" >> $LOCK_DIR/extra_msg.txt + + ok "I have started MARIADB service. The new PID is $NEWPID" + fi + + if $send_msg ; then + datum=`date +"%d.%m.%Y %H:%Mh"` + subject="Restarting MARIADB on `hostname -f` invoked -- $datum" + msg=`cat $LOCK_DIR/extra_msg.txt` + + for _to_address in $to_addresses ; do + echo -e "To:${_to_address}\n${content_type}\nSubject:$subject\n\n${msg}\n" \ + | /usr/sbin/sendmail -F "Webservice Monitor" -f $from_address $_to_address + done + fi +} + start_mysql() { send_msg=$1 @@ -1682,6 +1897,20 @@ restart_nginx() { fi } +restart_mariadb(){ + + ## - Stop MySQL Service + ## - + if stop_mariadb ; then + + sleep 2 + + ## - Start MySQL Service + ## - + start_mariadb + fi +} + restart_mysql(){ ## - Stop MySQL Service @@ -1929,11 +2158,19 @@ EOF EOF stop_apache - stop_mysql + if $check_mysql ; then + stop_mysql + elif $check_mariadb ; then + stop_mariadb + fi sleep 60 - start_mysql + if $check_mysql ; then + start_mysql + elif $check_mariadb ; then + start_mariadb + fi start_apache else @@ -1955,6 +2192,60 @@ EOF fi # End: check_load +#--------------------------------------- +#----------------------------- +# Checking MariaDB Database server.. +#----------------------------- +#--------------------------------------- + +if $check_mariadb ; then + + echo "" > $LOCK_DIR/extra_msg.txt + + if $terminal ; then + echo -e "\nChecking MariaDB databse service on \"`hostname -f`\".." + fi + + + PID="$(ps aux | grep -E "${MARIADB_PS_CHECK_STRING}" | grep -v grep | awk '{print$2}')" + + echo "" + echo "MARIADB_PS_CHECK_STRING: $MARIADB_PS_CHECK_STRING" + echo "PID: $PID" + echo "MYADMIN: $MYADMIN" + echo "" + echo "$MYADMIN $mariadb_credential_args ping 2>/dev/null" + echo "" + + if [ "X${PID}X" = "XX" ];then + + echo -e "\nMariaDB is not running! - Try to restart service.." >> $LOCK_DIR/extra_msg.txt + echo -e "=================================================" >> $LOCK_DIR/extra_msg.txt + + error "MariaDB is not running! - Try to restart it.." + + restart_mariadb + + else + if [ -z "`$MYADMIN $mariadb_credential_args ping 2>/dev/null`" ]; then + + echo -e "\nMariaDB seems to be running, but NOT responding! - Try to restart service.." >> $LOCK_DIR/extra_msg.txt + echo -e "=======================================================================" >> $LOCK_DIR/extra_msg.txt + + error "MariaDB seems to be running, but NOT responding! - Try to restart service.." + + restart_mariadb + + else + + if $terminal ; then + ok "MariaDB database service on \"`hostname -f`\" seems to be running.." + fi + fi + fi +fi + + #--------------------------------------- #----------------------------- # Checking MySQL Database server.. diff --git a/conf/check_webservice_load.conf.sample b/conf/check_webservice_load.conf.sample index 9c9b610..1df043c 100644 --- a/conf/check_webservice_load.conf.sample +++ b/conf/check_webservice_load.conf.sample @@ -44,7 +44,8 @@ # - What to check # - check_load=true -check_mysql=true +check_mysql=false +check_mariadb=false # - PostgreSQL # - @@ -108,7 +109,7 @@ check_website=false # - encrypted file. # - # - Create (encrypted) option file: -# - $ mysql_config_editor set --login-path=local --socket=/run/mysqld/mysqld.sock --user=root --password +# - $ mysql_config_editor set --login-path=local --socket=/tmp/mysql.sock --user=root --password # - $ Password: # - # - Use of option file: @@ -120,7 +121,42 @@ check_website=false # - mysql_credential_args="--defaults-file=/etc/mysql/debian.cnf" (Debian default) # - mysql_credential_args="--defaults-file=/usr/local/mysql/sys-maint.cnf" # - -mysql_credential_args="" +# - defaults to: +# - mysql_credential_args="--login-path=local" +# - +#mysql_credential_args="--login-path=local" + + +# - Additional Settings for check_mariadb +# - +# - MariaDB credentials +# - +# - Giving password on command line is insecure an sind mysql 5.5 +# - you will get a warning doing so. +# - +# - Reading username/password fro file ist also possible, using MySQL/MariaDB +# - commandline parameter '--defaults-file'. +# - +# - Since Mysql Version 5.6, you can read username/password from +# - encrypted file. +# - +# - Create (encrypted) option file: +# - $ mysql_config_editor set --login-path=local --socket=/tmp/mysql.sock --user=root --password +# - $ Password: +# - +# - Use of option file: +# - $ mysql --login-path=local ... +# - +# - Example +# - mariadb_credential_args="-u root -S /run/mysqld/mysqld.sock" +# - mariadb_credential_args="--login-path=local" +# - mariadb_credential_args="--defaults-file=/etc/mysql/debian.cnf" (Debian default) +# - mariadb_credential_args="--defaults-file=/usr/local/mysql/sys-maint.cnf" +# - +# - defaults to empty string +# - mariadb_credential_args="" +# - +#mariadb_credential_args="" # - Additional Settings for check_php_fpm