diff --git a/extra/clustermon.sh b/extra/clustermon.sh index 9accd72e38..91ff964fb4 100644 --- a/extra/clustermon.sh +++ b/extra/clustermon.sh @@ -1,172 +1,169 @@ #!/bin/bash # # Cluster Monitoring Script, for use with crm_mon and Pacemaker, # to emulate the oft-missing --snmp-traps and --mail options. # # Copyright 2013 Rob Thomas # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # Uncomment these lines to run a test of the script. #CRM_notify_desc=OK #CRM_notify_node=freepbx-a #CRM_notify_rc=0 #CRM_notify_recipient=emailalert@hipbx.org #CRM_notify_rsc=spare_fs #CRM_notify_status=0 #CRM_notify_target_rc=0 #CRM_notify_task=start # Set some defaults FROMADDR=cluster@`hostname` # Check to see if we should do anything with this alert. # You could put some smarts in this, a database lookup, etc # This is just a simple setup that tries to guess what you # want to do based on the notify_recipient option to crm_mon # Basic examples: # pcs resource create ClusterMon-Email --clone ClusterMon user=root extra_options="-E /usr/local/bin/clustermon-new.sh -e emailalert@hipbx.org" # pcs resource create ClusterMon-SNMP --clone ClusterMon user=root extra_options="-E /usr/local/bin/clustermon-new.sh -e 192.168.254.254" function getDest { # This looks for an '@' in the notify_recipient. If it finds it, it'll send an email. # Otherwise, it'll send a SNMP trap. if [ ! -z "${CRM_notify_recipient}" ] then if [[ "${CRM_notify_recipient}" == *@* ]] then SMTPDEST=${CRM_notify_recipient} DEST='smtp' else SNMPDEST=${CRM_notify_recipient} DEST='snmp' fi else # Hard coded defaults. Please change these. SMTPDEST='ididntchangethedefaults@hipbx.org' SNMPDEST='192.168.254.254' SNMPCOMMUNITY='public' # If 'DEST' is blank, nothing happens. DEST='both' fi } # Other Predefined functions function sendsmtp { # Re-implemtation of code in crm_mon.c [ -z "${SMTPDEST}" ] && return [ -z "${CRM_notify_node}" ] && CRM_notify_node="-" node=${CRM_notify_node} [ -z "${CRM_notify_rsc}" ] && CRM_notify_rsc="-" rsc=${CRM_notify_rsc} [ -z "${CRM_notify_desc}" ] && CRM_notify_desc="-" desc=${CRM_notify_desc} - # Task will always be something. - task=${CRM_notify_task} - crm_mail_prefix="Cluster notification" - subject="${crm_mail_prefix} - ${task} event for ${rsc} on ${node}" + subject="${crm_mail_prefix} - ${CRM_notify_task} event for ${rsc} on ${node}" body="\n${crm_mail_pref}\n====\n\n" if [ ${CRM_notify_target_rc} -eq ${CRM_notify_rc} ] then - body="${body}Completed operation ${CRM_notify_task} for resource ${CRM_notify_rsc} on ${CRM_notify_node}\n" + body="${body}Completed operation ${CRM_notify_task} for resource ${rsc} on ${node}\n" else - body="${body}Operation ${CRM_notify_task} for resource ${CRM_notify_rsc} on ${CRM_notify_node} failed: ${CRM_notify_desc}\n" + body="${body}Operation ${CRM_notify_task} for resource ${rsc} on ${node} failed: ${desc}\n" fi statusstr=$(ocf_status ${CRM_notify_status}) body="${body}\nDetails:\n\toperation status: (${CRM_notify_status}) ${statusstr}\n" if [ "${CRM_notify_status}" -eq 0 ] then result=$(ocf_exitcode ${CRM_notify_rc}) target=$(ocf_exitcode ${CRM_notify_target_rc}) body="${body}\tscript returned: (${CRM_notify_rc}) ${result}\n" body="${body}\texpected return value: (${CRM_notify_target_rc}) ${target}\n" fi echo -e $body | mail -r "$FROMADDR" -s "$subject" "$SMTPDEST" } function ocf_status { case $1 in -1) echo "pending" ;; 0) echo "complete" ;; 1) echo "Cancelled" ;; 2) echo "Timed Out" ;; 3) echo "NOT SUPPORTED" ;; 4) echo "Error" ;; 5) echo "Not installed" ;; *) echo "Exceptionally unusual" ;; esac } function ocf_exitcode { case $1 in 0) echo "OK" ;; 1) echo "Unknown Error" ;; 2) echo "Invalid Parameter" ;; 3) echo "Unimplemented Feature" ;; 4) echo "Insufficient Privileges" ;; 5) echo "not installed" ;; 6) echo "not configured" ;; 7) echo "not running" ;; 8) echo "master" ;; 9) echo "master (failed)" ;; 192) echo "OCF_EXEC_ERROR" ;; 193) echo "OCF_UNKNOWN" ;; 194) echo "OCF_SIGNAL" ;; 195) echo "OCF_NOT_SUPPORTED" ;; 196) echo "OCF_PENDING" ;; 197) echo "OCF_CANCELLED" ;; 198) echo "OCF_TIMEOUT" ;; 199) echo "OCF_OTHER_ERROR" ;; *) echo "Exceptionally unknown error" ;; esac } function sendsnmp() { [ -f /usr/bin/snmptrap ] && /usr/bin/snmptrap -v 2c -c "$SNMPCOMMUNITY" "$SNMPDEST" "" PACEMAKER-MIB::pacemakerNotification \ - PACEMAKER-MIB::pacemakerNotificationNode s "${CRM_notify_node}" \ - PACEMAKER-MIB::pacemakerNotificationResource s "${CRM_notify_rsc}" \ + PACEMAKER-MIB::pacemakerNotificationNode s "${node}" \ + PACEMAKER-MIB::pacemakerNotificationResource s "${rsc}" \ PACEMAKER-MIB::pacemakerNotificationOperation s "${CRM_notify_task}" \ - PACEMAKER-MIB::pacemakerNotificationDescription s "${CRM_notify_desc}" \ + PACEMAKER-MIB::pacemakerNotificationDescription s "${desc}" \ PACEMAKER-MIB::pacemakerNotificationStatus i "${CRM_notify_status}" \ PACEMAKER-MIB::pacemakerNotificationReturnCode i ${CRM_notify_rc} \ PACEMAKER-MIB::pacemakerNotificationTargetReturnCode i ${CRM_notify_target_rc} } # Lets see who wants to do what with this. getDest # Do we want to do anything with this alert? if [ -z "$DEST" ] then exit 0; fi if [ "$DEST" == "both" -o "$DEST" == "smtp" ] then sendsmtp; fi if [ "$DEST" == "both" -o "$DEST" == "snmp" ] then sendsnmp; fi