185 lines
5.0 KiB
Bash
Executable File
185 lines
5.0 KiB
Bash
Executable File
#!/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-)
|
||
|
||
# Send informations to Xymon server
|
||
$XYMON "${XYMSRV}" "status ${MACHINE}.${TEST} ${COLOR} ${SUBJECT}
|
||
|
||
==================== Detailed status ====================
|
||
|
||
&${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
|