scripts/xymon/plugins/client/ext/maco.sh

190 lines
5.0 KiB
Bash
Raw Normal View History

2020-06-15 15:48:09 +02:00
#!/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-)
SUBJECT=$(< "${PLUGIN_STATE}" sort | uniq | head -1 | cut -d" " -f2-)
2020-06-15 15:48:09 +02:00
# Send informations to Xymon server
$XYMON "${XYMSRV}" "status ${MACHINE}.${TEST} ${COLOR} ${SUBJECT}
==================== Detailed status ====================
&${COLOR} $(cat ${PLUGIN_RESULT})"
2021-01-13 11:05:11 +01:00
# For testing only
#echo "$XYMON ${XYMSRV} status ${MACHINE}.${TEST} ${COLOR} ${SUBJECT}
#==================== Detailed status ====================
#&${COLOR} $(cat ${PLUGIN_RESULT})" > /tmp/xymon.maco.tmp
2020-06-15 15:48:09 +02:00
}
# }}}
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