#!/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"
# Maco
readonly MACO_LOCAL_DIR="/opt/maco"
readonly MACO_PENDING_UPDATE_FILE="${MACO_LOCAL_DIR}/.maco.upgrade"
readonly MACO_PENDING_URGENT_UPDATE_FILE="${MACO_LOCAL_DIR}/.maco.urgent.upgrade"
readonly MACO_STATUS_FILE="/var/fr.univ-rennes1.ipr.maco.machinestate.txt"
# Temp files
readonly TEMP_MACO_UPDATE="${XYMONTMP}/${MACHINEDOTS}.${TEST}.maco_update"
# define colours for graphics {{{
# Comment these out if using older BB versions
CLEAR_PIC="&clear"
RED_PIC="&red"
YELLOW_PIC="&yellow"
GREEN_PIC="&green"
UNKNOWN_PIC="&purple"
# }}}
# }}}
# 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
}
# }}}
# Add HTML header {{{
add_header()
{
echo ""
#echo "$1 ($2)
"
echo "$1
"
# If you do not want the header in a bigger font use line below instead
#echo "$1 ($2)"
# If you want the "Paul Luzzi" look uncomment this section and comment
# out the above sections:
#echo "
" } # }}} # Get Maco update state {{{ get_maco_update() { maco_update_script_path="/opt/repos/ipr.scripts/cluster/maco.check.update.sh" maco_update_script_options="--simulate" ## Run update_script and store result in TEMP_MACO_UPDATE file debug_message "get_maco_update − \ Run \"${maco_update_script_path}\" script with \"${maco_update_script_options}\" options." sh "${maco_update_script_path}" "${maco_update_script_options}" >> "${TEMP_MACO_UPDATE}" } # }}} # Analyze maco result to define colors to send to Xymon {{{ analyze_maco_update() { debug_message "analyze_maco_update − \ Try to detect Maco update with ${TEMP_MACO_UPDATE} content." if grep -qE '^Local.* up to date.*' "${TEMP_MACO_UPDATE}" then ## Add color and message to PLUGIN_RESULT for detailed informations sed "s/^/\&${GREEN_PIC} /" "${TEMP_MACO_UPDATE}" >> "${PLUGIN_RESULT}" ## Add information to PLUGIN_STATE echo "36${GREEN_PIC} Maco is uptodate" >> "${PLUGIN_STATE}" elif grep -qE '^Latest.* available.*' "${TEMP_MACO_UPDATE}" then sed "s/^/\&${YELLOW_PIC} /" "${TEMP_MACO_UPDATE}" >> "${PLUGIN_RESULT}" echo "26${YELLOW_PIC} Maco needs upgrade" >> "${PLUGIN_STATE}" elif grep -qE '^Urgent.* available.*' "${TEMP_MACO_UPDATE}" then sed "s/^/\&${RED_PIC} /" "${TEMP_MACO_UPDATE}" >> "${PLUGIN_RESULT}" echo "16${RED_PIC} Maco needs urgent upgrade" >> "${PLUGIN_STATE}" else sed "s/^/\&${CLEAR_PIC} /" "${TEMP_MACO_UPDATE}" >> "${PLUGIN_RESULT}" echo "46${CLEAR_PIC} Maco update state is unknown" >> "${PLUGIN_STATE}" fi } # }}} # Verify if a normal Maco update is planned {{{ check_pending_update() { if [ -f "${MACO_PENDING_UPDATE_FILE}" ]; then debug_message "check_pending_update − \ A normal Maco update is planned." ## Add color and message to PLUGIN_RESULT for detailed informations echo "${YELLOW_PIC} A normal update is planned (${MACO_PENDING_UPDATE_FILE} file exists)." >> "${PLUGIN_RESULT}" ## Add information to PLUGIN_STATE echo "24${YELLOW_PIC} A normal update is planned" >> "${PLUGIN_STATE}" else debug_message "check_pending_update − \ No Maco normal update is planned." ## Add color and message to PLUGIN_RESULT for detailed informations echo "${GREEN_PIC} No Maco normal update is planned (${MACO_PENDING_UPDATE_FILE} file doesn't exists)." >> "${PLUGIN_RESULT}" ## No need to add information to PLUGIN_STATE fi } # }}} # Verify if a urgent Maco update is planned {{{ check_pending_urgent_update() { if [ -f "${MACO_PENDING_URGENT_UPDATE_FILE}" ]; then debug_message "check_pending_urgent_update − \ An urgent Maco update is planned." ## Add color and message to PLUGIN_RESULT for detailed informations echo "${RED_PIC} An urgent update is planned (${MACO_PENDING_URGENT_UPDATE_FILE} file exists)." >> "${PLUGIN_RESULT}" ## Add information to PLUGIN_STATE echo "14${RED_PIC} An urgent update is planned" >> "${PLUGIN_STATE}" else debug_message "check_pending_urgent_update − \ No Maco urgent update is planned." ## Add color and message to PLUGIN_RESULT for detailed informations echo "${GREEN_PIC} No Maco urgent update is planned (${MACO_PENDING_URGENT_UPDATE_FILE} file doesn't exists)." >> "${PLUGIN_RESULT}" ## No need to add information to PLUGIN_STATE fi } # }}} # Verify the status of last Maco update check_last_update_status() { ## Check if Maco status file is present if [ -f "${MACO_STATUS_FILE}" ]; then debug_message "check_last_update_status − \ Maco status file (${MACO_STATUS_FILE}) exists." local_maco_status=$(grep --max-count=1 -- MacoStatus "${MACO_STATUS_FILE}" | cut --delimiter="=" --fields=2) if [ "${local_maco_status}" = "last-update-succeeded" ]; then ## Add color and message to PLUGIN_RESULT for detailed informations echo "${GREEN_PIC} Last Maco update succeed (MacoStatus=${local_maco_status})." >> "${PLUGIN_RESULT}" ## Add information to PLUGIN_STATE echo "32${GREEN_PIC} Maco is uptodate and last update succeed" >> "${PLUGIN_STATE}" elif [ "${local_maco_status}" = "update-process-running" ]; then echo "${YELLOW_PIC} Last Maco update is in progress (MacoStatus=${local_maco_status})." >> "${PLUGIN_RESULT}" echo "22${YELLOW_PIC} Maco update is running" >> "${PLUGIN_STATE}" elif [ "${local_maco_status}" = "waiting-for-additional-maco-run" ]; then echo "${YELLOW_PIC} Last Maco update wait for an extra run (MacoStatus=${local_maco_status})." >> "${PLUGIN_RESULT}" echo "22${YELLOW_PIC} Maco update needs an extra run" >> "${PLUGIN_STATE}" elif [ "${local_maco_status}" = "last-update-failed" ]; then echo "${RED_PIC} Last Maco update failed (MacoStatus=${local_maco_status})." >> "${PLUGIN_RESULT}" echo "12${RED_PIC} Maco update failed" >> "${PLUGIN_STATE}" fi else debug_message "check_last_update_status − \ Maco status file (${MACO_STATUS_FILE}) doesn't exists." … echo "42${CLEAR_PIC} Maco last update status is unknow (${MACO_STATUS_FILE} doesn't exists or isn't available)." >> "${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 -c4-) SUBJECT=$(< "${PLUGIN_STATE}" sort | uniq | head -1 | cut -d" " -f2-) # Send informations to Xymon server $XYMON "${XYMSRV}" "status ${MACHINE}.${TEST} ${COLOR} ${SUBJECT} $(cat ${PLUGIN_RESULT})" # For testing only #echo "$XYMON ${XYMSRV} status ${MACHINE}.${TEST} ${COLOR} ${SUBJECT} #$(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 any previous file is empty if is_file_empty "${PLUGIN_RESULT}" || is_file_empty "${PLUGIN_STATE}"; then ## Add HTML header for this part add_header "Compare version" >> "${PLUGIN_RESULT}" ## (re)check Maco update get_maco_update ## Analyze Maco update result (add color,…) analyze_maco_update ## Add HTML header for this part add_header "Pending update" >> "${PLUGIN_RESULT}" ## Check for pending update for Maco check_pending_update ## Check for urgent pending update for Maco check_pending_urgent_update ## Add HTML header for this part add_header "Last update" >> "${PLUGIN_RESULT}" ## Check status of last update check_last_update_status fi # Send data to Xymon server ## and exit send_result_to_xymon_server \ && exit 0 } # }}} main exit 255