From 5cdfcd7751401ee92be1fbd73b4ec0831263f602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gardais=20J=C3=A9r=C3=A9my?= Date: Mon, 15 Jun 2020 15:48:09 +0200 Subject: [PATCH] New Xymon probe for Maco --- xymon/plugins/client/ext/maco.sh | 179 +++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100755 xymon/plugins/client/ext/maco.sh diff --git a/xymon/plugins/client/ext/maco.sh b/xymon/plugins/client/ext/maco.sh new file mode 100755 index 0000000..c75fb5d --- /dev/null +++ b/xymon/plugins/client/ext/maco.sh @@ -0,0 +1,179 @@ +#!/bin/sh + +# This script will check if upgrade is available for local Maco script + +# Vars {{{ +readonly PROGNAME=$(basename "${0}") + +[ -z "${DEBUG}" ] && DEBUG=1 + +## Xymon +readonly TEST="maco" +readonly PLUGIN_RESULT="${XYMONTMP}/${MACHINEDOTS}.${TEST}.plugin_result" +readonly PLUGIN_STATE="${XYMONTMP}/${MACHINEDOTS}.${TEST}.plugin_state" +readonly XYMON_USERNAME="xymon" +readonly XYMON_GROUPNAME="xymon" + +# By default, don't empty files newer than 10hours (600 minutes) +readonly DEFAULT_MTIME_MINUTES="600" + +## Colors {{{ +readonly PURPLE='\033[1;35m' +## }}} + +# }}} + +# Print message with DEBUG prefix and color {{{ +debug_message() { + + local_debug_message="${1}" + + ## Print message if DEBUG is enable (=0) + [ "${DEBUG}" -eq "0" ] && printf '\e[1;35m%-6b\e[m\n' "DEBUG − ${PROGNAME} : ${local_debug_message}" + +} +# }}} +# Create or empty a file if it's too old {{{ +## First argument (required): Absolut path to the file +## Second argument (optionnal): Maximum number of minutes since last modification +regenerate_if_too_old() { + ## Set variables according to the number of passed arguments {{{ + case $# in + 0 ) + debug_message "regenerate_if_too_old − \ +Need at least 1 argument." + exit 1 + ;; + 1 ) + _file="${1}" + debug_message "regenerate_if_too_old − \ +Use DEFAULT_MTIME_MINUTES value: ${DEFAULT_MTIME_MINUTES}." + _max_mtime_minutes="${DEFAULT_MTIME_MINUTES}" + ;; + 2 ) + _file="${1}" + _max_mtime_minutes="${2}" + ;; + esac + + ## }}} + + ## If the file exists + if [ -f "${_file}" ]; then + _current_timestamp=$(date "+%s") + _file_mtime_timestamp=$(stat --format="%Y" -- "${_file}") + + ## Substract last modification timestamp of the file to current timestamp + : $(( _file_mtime_seconds=_current_timestamp-_file_mtime_timestamp )) + ## Get maximum allowed mtime in seconds + : $(( _max_mtime_seconds=_max_mtime_minutes*60 )) + + ## Compare last modification mtime with the maximum allowed + if [ "${_file_mtime_seconds}" -gt "${_max_mtime_seconds}" ]; then + debug_message "regenerate_if_too_old − \ +Need to empty ${_file} last modification happened ${_file_mtime_seconds} seconds ago (maximum is ${_max_mtime_seconds})." + true > "${_file}" + chown -- "${XYMON_USERNAME}":"${XYMON_GROUPNAME}" "${_file}" + else + debug_message "regenerate_if_too_old − \ +Don't need to empty ${_file} last modification happened ${_file_mtime_seconds} seconds ago (maximum is ${_max_mtime_seconds})." + fi + else ## Else if the file don't exists, just create it + debug_message "regenerate_if_too_old − \ +Need to create ${_file}." + true > "${_file}" + fi + +} +# }}} +# Test if a file is empty {{{ +is_file_empty() { + _file_empty=$1 + + if [ ! -s "${_file_empty}" ]; then + debug_message "is_file_empty − \ +${_file_empty} file is empty." + return 0 + else + debug_message "is_file_empty − \ +${_file_empty} file is not empty." + return 1 + fi + +} +# }}} +# Get Maco status {{{ +get_maco_status() { + + maco_status_script_path="/opt/repos/ipr.scripts/cluster/maco.check.update.sh" + maco_status_script_options="--simulate" + + ## Run status_script and store result in PLUGIN_RESULT file + debug_message "get_maco_status − \ +Run \"${maco_status_script_path}\" script with \"${maco_status_script_options}\" options." + sh "${maco_status_script_path}" "${maco_status_script_options}" >> "${PLUGIN_RESULT}" + +} +# }}} +# Analyze maco result to define colors to send to Xymon {{{ +analyze_maco_status() { + + debug_message "analyze_maco_status − \ +Try to detect Maco status with ${PLUGIN_RESULT} content." + + if grep -qE '^Local.* up to date.*' "${PLUGIN_RESULT}" + then + echo "3&green Maco is uptodate" >> "${PLUGIN_STATE}" + elif grep -qE '^Latest.* available.*' "${PLUGIN_RESULT}" + then + echo "2&yellow Maco needs upgrade" >> "${PLUGIN_STATE}" + elif grep -qE '^Urgent.* available.*' "${PLUGIN_RESULT}" + then + echo "1&red Maco needs urgent upgrade" >> "${PLUGIN_STATE}" + else + echo "4&clear Maco status is unknown" >> "${PLUGIN_STATE}" + fi + +} +# }}} +# Send plugin results to Xymon server {{{ +send_result_to_xymon_server() { + + # Set the main color according to the highest alert + COLOR=$(< "${PLUGIN_STATE}" awk '{print $1}' | sort | uniq | head -1 | cut -c3-) + + # Send informations to Xymon server + $XYMON "${XYMSRV}" "status ${MACHINE}.${TEST} ${COLOR} $(cat ${PLUGIN_RESULT})" + #For testing only + #echo $XYMON "${XYMSRV}" "status ${MACHINE}.${TEST} ${COLOR} $(cat ${PLUGIN_RESULT})" > /tmp/xymon.maco.tmp + +} +# }}} + +main() { # {{{ + + # Create or empty previous file only if too old + regenerate_if_too_old "${PLUGIN_RESULT}" + regenerate_if_too_old "${PLUGIN_STATE}" + + # If previous result is empty + ## Re-check Maco status + is_file_empty "${PLUGIN_RESULT}" \ + && get_maco_status + + # If previous state is empty + ## analyze Maco's result + is_file_empty "${PLUGIN_STATE}" \ + && analyze_maco_status + + # Send data to Xymon server + ## and exit + send_result_to_xymon_server \ + && exit 0 + +} +# }}} + +main + +exit 255