diff --git a/heartbeat/OMD b/heartbeat/OMD new file mode 100644 index 000000000..1d92d6084 --- /dev/null +++ b/heartbeat/OMD @@ -0,0 +1,184 @@ +#!/bin/sh +# +# OMD (Open Monitoring Distribution) OCF RA. +# Checks the status of a given OMD site. +# +# - Use in a Pacemaker/DRBD environment for OMD - +# for more information see http://blog.simon-meggle.de +# Copyright 2011 (C) by Simon Meggle +# +# +# 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_ROOT}/resource.d/heartbeat/.ocf-shellfuncs + +# OMD binary +OMD=`which omd` + +# If only your active Node runs OMD sites, change OMDDATA directly to the +# mount point /mnt/omddata. This ensures that DRBD is mounted before trying +# to start any clustered OMD site. +# Otherwise, if your cluster should also run a OMD site on the inactive node to +# monitor OMD sites on the active node, you need OMDDATA set to /opt/omd. Symlinks +# within this directory will point to another directory. +OMDDATA='/opt/omd' +#OMDDATA='/mnt/omddata' + +####################################################################### + +meta_data() { + cat <<END +<?xml version="1.0"?> +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> +<resource-agent name="OMD" version="0.1"> +<version>0.1</version> + +<longdesc lang="en"> +This is a Resource Agent for managing OMD (Open Monitoring Distribution, www.omdistro.org) sites. +</longdesc> +<shortdesc lang="en">OMD resource agent</shortdesc> + +<parameters> + +<parameter name="site" unique="1" required="1"> +<longdesc lang="en"> +Name of the OMD site to check. +</longdesc> +<shortdesc lang="en"> +OMD Site name +</shortdesc> +<content type="string" /> +</parameter> + +</parameters> + +<actions> +<action name="start" timeout="30" /> +<action name="stop" timeout="30" /> +<action name="monitor" timeout="10" interval="10" depth="0" start-delay="0" /> +<action name="reload" timeout="15" /> +<action name="meta-data" timeout="5" /> +<action name="validate-all" timeout="5" /> +</actions> +</resource-agent> +END +} + +####################################################################### + +# don't exit on TERM, to test that lrmd makes sure that we do exit +trap sigterm_handler TERM +sigterm_handler() { + ocf_log info "They use TERM to bring us down. No such luck." + return +} + +omd_usage() { + cat <<END +usage: $0 {start|stop|monitor|validate-all|meta-data} + +Expects to have a fully populated OCF RA-compliant environment set. +END +} + +omd_start() { + omd_monitor + if [ $? = $OCF_SUCCESS ]; then + return $OCF_SUCCESS + fi + ocf_log info "Starting OMD site ${OCF_RESKEY_site}..." + $OMD start $OCF_RESKEY_site +} + +omd_stop() { + omd_monitor + ocf_log info "Stopping OMD site ${OCF_RESKEY_site}..." + $OMD stop $OCF_RESKEY_site + return $OCF_SUCCESS +} + +omd_monitor() { +# Precondition: check if OMD directories are present (/opt/omd). +# Otherwise, OMD would never run. + +if [ ! -d "${OMDDATA}/apache" ] || [ ! -d "$OMDDATA/sites" ] || [ ! -d "${OMDDATA}/versions" ] ; then + ocf_log err "${OMDDATA} is not mounted on this node / OMD is not running." + return ${OCF_NOT_RUNNING} +else + if [ ! -f ${OMD} ] ; then + ocf_log err "Cannot find OMD binary ${OMD}!" + return ${OCF_ERR_GENERIC} + else + STATE=`${OMD} status ${OCF_RESKEY_site} | grep "Overall state"` + case ${STATE} in + "Overall state: running") ocf_log debug "OMD site ${OCF_RESKEY_site} is running properly." + return ${OCF_SUCCESS} + ;; + "Overall state: stopped") ocf_log debug "OMD site ${OCF_RESKEY_site} is stopped." + return ${OCF_NOT_RUNNING} + ;; + "Overall state: partially running") ocf_log err "ERROR: OMD site ${OCF_RESKEY_site} is running only partially!" + return ${OCF_ERR_GENERIC} + ;; + *) ocf_log err "ERROR: State of OMD site ${OCF_RESKEY_site} is unknown!" + return ${OCF_ERR_GENERIC} + esac + fi +fi +} + +omd_validate() { + if [ ! -f ${OMD} ] ; then + ocf_log err "Cannot find OMD binary ${OMD}!" + return ${OCF_ERR_GENERIC} + else + return $OCF_SUCCESS + fi +} + +: ${OCF_RESKEY_CRM_meta_interval=0} +: ${OCF_RESKEY_CRM_meta_globally_unique:="true"} + +case $__OCF_ACTION in +meta-data) meta_data + exit $OCF_SUCCESS + ;; +start) omd_start;; +stop) omd_stop;; +monitor) omd_monitor;; +reload) ocf_log err "Reloading..." + omd_start + ;; +validate-all) omd_validate;; +usage|help) omd_usage + exit $OCF_SUCCESS + ;; +*) omd_usage + exit $OCF_ERR_UNIMPLEMENTED + ;; +esac +rc=$? +ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc" +exit $rc +