#!/bin/sh # # SystemHealth OCF RA. # # Copyright (c) 2009 International Business Machines (IBM), Mark Hamzy # All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # This program is distributed in the hope that it would be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Further, this software is distributed without any warranty that it is # free of the rightful claim of any third person regarding infringement # or the like. Any license provided herein, whether implied or # otherwise, applies only to this software file. Patent licenses, if # any, provided herein do not apply to combinations of this program with # other software, or any other product whatsoever. # # You should have received a copy of the GNU General Public License # along with this program; if not, write the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. # ####################################################################### # Initialization: : ${OCF_FUNCTIONS=${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs} . ${OCF_FUNCTIONS} : ${__OCF_ACTION=$1} ####################################################################### meta_data() { cat < 0.1 This is a SystemHealth Resource Agent. It is used to monitor the health of a system via IPMI. SystemHealth resource agent END } ####################################################################### SystemHealth_usage() { cat < /dev/null 2>&1 RC=$? if [ $RC != 0 ]; then ocf_log err "servicelog_notify not found!" return $OCF_ERR_INSTALLED fi which ipmiservicelogd > /dev/null 2>&1 RC=$? if [ $RC != 0 ]; then ocf_log err "ipmiservicelogd not found!" return $OCF_ERR_INSTALLED fi test -x $OCF_RESKEY_program RC=$? if [ $RC != 0 ]; then ocf_log err "$OCF_RESKEY_program not found!" return $OCF_ERR_INSTALLED fi } SystemHealth_start() { SystemHealth_monitor RC=$? if [ $RC = $OCF_ERR_GENERIC ]; then return $OCF_ERR_GENERIC elif [ $RC = $OCF_SUCCESS ]; then ocf_log warn "starting an already started SystemHealth" return $OCF_SUCCESS fi service ipmi start > /dev/null 2>&1 RC=$? if [ $RC != 0 ]; then ocf_log err "Could not start service IPMI!" return $OCF_ERR_GENERIC fi ipmiservicelogd smi 0 > /dev/null 2>&1 & RC=$? if [ $RC != 0 ]; then ocf_log err "Could not start ipmiservicelogd!" return $OCF_ERR_GENERIC fi servicelog_notify --add --type=EVENT --command="$OCF_RESKEY_program" --method=num_arg --match='type=4' > /dev/null 2>&1 RC=$? if [ $RC != 0 ]; then ocf_log err "servicelog_notify register handler failed!" return $OCF_ERR_GENERIC fi return $OCF_SUCCESS } SystemHealth_stop() { SystemHealth_monitor RC=$? if [ $RC = $OCF_ERR_GENERIC ]; then return $OCF_ERR_GENERIC elif [ $RC = $OCF_SUCCESS ]; then killall ipmiservicelogd RC1=$? if [ $RC1 != 0 ]; then ocf_log err "Could not stop ipmiservicelogd!" fi servicelog_notify --remove --command="$OCF_RESKEY_program" > /dev/null 2>&1 RC2=$? if [ $RC2 != 0 ]; then ocf_log err "servicelog_notify remove handler failed!" fi if [ $RC1 = 0 -a $RC2 = 0 ]; then return $OCF_SUCCESS else return $OCF_ERR_GENERIC fi elif [ $RC = $OCF_NOT_RUNNING ]; then ocf_log warn "stopping an already stopped SystemHealth" return $OCF_SUCCESS else ocf_log err "SystemHealth_stop: should not be here!" return $OCF_ERR_GENERIC fi } SystemHealth_monitor() { # Monitor _MUST!_ differentiate correctly between running # (SUCCESS), failed (ERROR) or _cleanly_ stopped (NOT RUNNING). # That is THREE states, not just yes/no. if [ ! -f /var/run/ipmiservicelogd.pid0 ]; then ocf_log debug "ipmiservicelogd is not running!" return $OCF_NOT_RUNNING fi ps -p `cat /var/run/ipmiservicelogd.pid0` > /dev/null 2>&1 RC=$? if [ $RC != 0 ]; then ocf_log debug "ipmiservicelogd's pid `cat /var/run/ipmiservicelogd.pid0` is not running!" rm /var/run/ipmiservicelogd.pid0 return $OCF_ERR_GENERIC fi servicelog_notify --list --command="$OCF_RESKEY_program" > /dev/null 2>&1 RC=$? if [ $RC = 0 ]; then return $OCF_SUCCESS else return $OCF_NOT_RUNNING fi } SystemHealth_validate() { SystemHealth_check_tools RC=$? if [ $RC != 0 ]; then return $RC fi return $OCF_SUCCESS } : ${OCF_RESKEY_program=/usr/sbin/notifyServicelogEvent} case $__OCF_ACTION in meta-data) meta_data exit $OCF_SUCCESS ;; usage|help) SystemHealth_usage exit $OCF_SUCCESS ;; esac SystemHealth_check_tools RC=$? if [ $RC != 0 ]; then case $__OCF_ACTION in stop) exit $OCF_SUCCESS;; *) exit $RC;; esac fi case $__OCF_ACTION in start) SystemHealth_start;; stop) SystemHealth_stop;; monitor) SystemHealth_monitor;; reload) ocf_log info "Reloading..." SystemHealth_start ;; validate-all) ;; *) SystemHealth_usage exit $OCF_ERR_UNIMPLEMENTED ;; esac rc=$? ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc" exit $rc