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-)
|
2020-06-15 17:48:26 +02:00
|
|
|
|
SUBJECT=$(< "${PLUGIN_STATE}" sort | uniq | head -1 | cut -d" " -f2-)
|
2020-06-15 15:48:09 +02:00
|
|
|
|
|
|
|
|
|
# Send informations to Xymon server
|
2020-06-15 17:48:26 +02:00
|
|
|
|
$XYMON "${XYMSRV}" "status ${MACHINE}.${TEST} ${COLOR} ${SUBJECT}
|
|
|
|
|
|
|
|
|
|
==================== Detailed status ====================
|
|
|
|
|
|
|
|
|
|
&${COLOR} $(cat ${PLUGIN_RESULT})"
|
2020-06-15 15:48:09 +02:00
|
|
|
|
#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
|