#!/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 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 PLUGIN_RESULT 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}" >> "${PLUGIN_RESULT}" } # }}} # Analyze maco result to define colors to send to Xymon {{{ analyze_maco_status() { debug_message "analyze_maco_status − \ Try to detect Maco update 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 update state 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} ${SUBJECT} #==================== Detailed status ==================== #&${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 update is_file_empty "${PLUGIN_RESULT}" \ && get_maco_update # 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