311 lines
10 KiB
Bash
Executable File
311 lines
10 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"
|
||
|
||
# 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 "<FONT SIZE=+2><b>$1</b></FONT> ($2)<BR>"
|
||
echo "<FONT SIZE=+2><b>$1</b></FONT> <BR>"
|
||
# If you do not want the header in a bigger font use line below instead
|
||
#echo "<b>$1</b> ($2)"
|
||
# If you want the "Paul Luzzi" look uncomment this section and comment
|
||
# out the above sections:
|
||
#echo "<P><DIV ALIGN=\"CENTER\"><HR>"
|
||
#echo "<B>============== $1 ==============</B>"
|
||
#echo "<B>--- ($2) ---</B>"
|
||
#echo "<HR></DIV>"
|
||
#echo "<BLOCKQUOTE>"
|
||
}
|
||
# }}}
|
||
# 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
|