| #!/bin/sh | |
| # | |
| # | |
| # Example of a stateful OCF Resource Agent. | |
| # | |
| # Copyright (c) 2006 Andrew Beekhof | |
| # | |
| # 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} | |
| CRM_MASTER="${HA_SBIN_DIR}/crm_master -l reboot" | |
| ####################################################################### | |
| meta_data() { | |
| cat <<END | |
| <?xml version="1.0"?> | |
| <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> | |
| <resource-agent name="Stateful" version="1.0"> | |
| <version>1.0</version> | |
| <longdesc lang="en"> | |
| This is an example resource agent that implements two states | |
| </longdesc> | |
| <shortdesc lang="en">Example stateful resource agent</shortdesc> | |
| <parameters> | |
| <parameter name="state" unique="1"> | |
| <longdesc lang="en"> | |
| Location to store the resource state in | |
| </longdesc> | |
| <shortdesc lang="en">State file</shortdesc> | |
| <content type="string" default="${HA_VARRUN%%/}/Stateful-${OCF_RESOURCE_INSTANCE}.state" /> | |
| </parameter> | |
| <parameter name="envfile" unique="1"> | |
| <longdesc lang="en"> | |
| If this is set, the environment will be dumped to this file for every call. | |
| </longdesc> | |
| <shortdesc lang="en">Environment dump file</shortdesc> | |
| <content type="string" default="" /> | |
| </parameter> | |
| </parameters> | |
| <actions> | |
| <action name="start" timeout="20" /> | |
| <action name="stop" timeout="20" /> | |
| <action name="monitor" depth="0" timeout="20" interval="10" role="Master"/> | |
| <action name="monitor" depth="0" timeout="20" interval="10" role="Slave"/> | |
| <action name="notify" timeout="5" /> | |
| <action name="meta-data" timeout="5" /> | |
| <action name="validate-all" timeout="30" /> | |
| </actions> | |
| </resource-agent> | |
| END | |
| exit $OCF_SUCCESS | |
| } | |
| ####################################################################### | |
| stateful_usage() { | |
| cat <<END | |
| usage: $0 {start|stop|promote|demote|monitor|validate-all|meta-data} | |
| Expects to have a fully populated OCF RA-compliant environment set. | |
| END | |
| exit $1 | |
| } | |
| stateful_update() { | |
| echo $1 > ${OCF_RESKEY_state} | |
| } | |
| stateful_check_state() { | |
| target=$1 | |
| if [ -f ${OCF_RESKEY_state} ]; then | |
| state=`cat ${OCF_RESKEY_state}` | |
| if [ "x$target" = "x$state" ]; then | |
| return 0 | |
| fi | |
| else | |
| if [ "x$target" = "x" ]; then | |
| return 0 | |
| fi | |
| fi | |
| return 1 | |
| } | |
| dump_env() { | |
| if [ "${OCF_RESKEY_envfile}" != "" ]; then | |
| echo "### ${__OCF_ACTION} @ $(date) ### | |
| $(env | sort) | |
| ###" >> "${OCF_RESKEY_envfile}" | |
| fi | |
| } | |
| stateful_start() { | |
| stateful_check_state master | |
| if [ $? = 0 ]; then | |
| # CRM Error - Should never happen | |
| return $OCF_RUNNING_MASTER | |
| fi | |
| stateful_update slave | |
| $CRM_MASTER -v ${slave_score} | |
| return 0 | |
| } | |
| stateful_demote() { | |
| stateful_check_state | |
| if [ $? = 0 ]; then | |
| # CRM Error - Should never happen | |
| return $OCF_NOT_RUNNING | |
| fi | |
| stateful_update slave | |
| $CRM_MASTER -v ${slave_score} | |
| return 0 | |
| } | |
| stateful_promote() { | |
| stateful_check_state | |
| if [ $? = 0 ]; then | |
| return $OCF_NOT_RUNNING | |
| fi | |
| stateful_update master | |
| $CRM_MASTER -v ${master_score} | |
| return 0 | |
| } | |
| stateful_stop() { | |
| $CRM_MASTER -D | |
| stateful_check_state master | |
| if [ $? = 0 ]; then | |
| # CRM Error - Should never happen | |
| return $OCF_RUNNING_MASTER | |
| fi | |
| if [ -f ${OCF_RESKEY_state} ]; then | |
| rm ${OCF_RESKEY_state} | |
| fi | |
| return 0 | |
| } | |
| stateful_monitor() { | |
| stateful_check_state "master" | |
| if [ $? = 0 ]; then | |
| if [ $OCF_RESKEY_CRM_meta_interval = 0 ]; then | |
| # Restore the master setting during probes | |
| $CRM_MASTER -v ${master_score} | |
| fi | |
| return $OCF_RUNNING_MASTER | |
| fi | |
| stateful_check_state "slave" | |
| if [ $? = 0 ]; then | |
| if [ $OCF_RESKEY_CRM_meta_interval = 0 ]; then | |
| # Restore the master setting during probes | |
| $CRM_MASTER -v ${slave_score} | |
| fi | |
| return $OCF_SUCCESS | |
| fi | |
| if [ -f ${OCF_RESKEY_state} ]; then | |
| echo "File '${OCF_RESKEY_state}' exists but contains unexpected contents" | |
| cat ${OCF_RESKEY_state} | |
| return $OCF_ERR_GENERIC | |
| fi | |
| return 7 | |
| } | |
| stateful_validate() { | |
| exit $OCF_SUCCESS | |
| } | |
| : ${slave_score=5} | |
| : ${master_score=10} | |
| : ${OCF_RESKEY_CRM_meta_interval=0} | |
| : ${OCF_RESKEY_CRM_meta_globally_unique:="false"} | |
| if [ "x$OCF_RESKEY_state" = "x" ]; then | |
| if [ ${OCF_RESKEY_CRM_meta_globally_unique} = "false" ]; then | |
| state="${HA_VARRUN%%/}/Stateful-${OCF_RESOURCE_INSTANCE}.state" | |
| # Strip off the trailing clone marker | |
| OCF_RESKEY_state=`echo $state | sed s/:[0-9][0-9]*\.state/.state/` | |
| else | |
| OCF_RESKEY_state="${HA_VARRUN%%/}/Stateful-${OCF_RESOURCE_INSTANCE}.state" | |
| fi | |
| fi | |
| dump_env | |
| case $__OCF_ACTION in | |
| meta-data) meta_data;; | |
| start) stateful_start;; | |
| promote) stateful_promote;; | |
| demote) stateful_demote;; | |
| notify) ;; # dumping the environment is all we do | |
| stop) stateful_stop;; | |
| monitor) stateful_monitor;; | |
| validate-all) stateful_validate;; | |
| usage|help) stateful_usage $OCF_SUCCESS;; | |
| *) stateful_usage $OCF_ERR_UNIMPLEMENTED;; | |
| esac | |
| exit $? | |