Index: booth/script/lsb/booth-arbitrator =================================================================== --- booth.orig/script/lsb/booth-arbitrator +++ booth/script/lsb/booth-arbitrator @@ -24,6 +24,12 @@ exec="/usr/sbin/$prog" type="arbitrator" lockfile="/var/run/booth.pid" +BOOTH_DAEMON_STARTED=0 +BOOTH_DAEMON_STARTING=1 +BOOTH_DAEMON_EXIST=2 +BOOTH_DAEMON_NOT_RUNNING=3 +BOOTH_ERROR_GENERIC=4 + . /etc/rc.status internal_status() { @@ -32,16 +38,22 @@ internal_status() { } check_status() { - internal_status - if [ "$?" -eq 0 ];then - pidnum=$(cat $lockfile) + internal_status ; rc=$? + + if [ $rc == 0 ];then + pidnum=$(cat $lockfile|awk '{print $1}') + daemonstate=$(cat $lockfile |awk '{print $2}') if cat /proc/$pidnum/cmdline |grep $type > /dev/null 2>&1 ; then - return 0 #arbitrator daemon is Running + case $daemonstate in + $BOOTH_DAEMON_STARTED) return $BOOTH_DAEMON_STARTED;; + $BOOTH_DAEMON_STARTING) return $BOOTH_DAEMON_STARTING;; #arbitrator daemon is Running + *) return $BOOTH_ERROR_GENERIC;; + esac else - return 1 #site daemon is Running + return $BOOTH_DAEMON_EXIST #site daemon is Running fi else - return 2 #BOOTH daemon is not running + return $BOOTH_DAEMON_NOT_RUNNING #BOOTH daemon is not running fi } @@ -58,18 +70,21 @@ status() { start() { [ -x $exec ] || exit 5 - check_status - rc=$? + check_status; rc=$? case "$rc" in - 0) + $BOOTH_DAEMON_STARTED) echo "BOOTH arbitrator daemon is Running" - return 1 + return 0 + ;; + $BOOTH_DAEMON_STARTING) + echo "BOOTH arbitrator daemon is Running" + return 0 ;; - 1) + $BOOTH_DAEMON_EXIST) echo "BOOTH site daemon is Running" return 1 ;; - 2) + $BOOTH_DAEMON_NOT_RUNNING) echo -n $"Starting BOOTH arbitrator daemon: " startproc $exec $type rc_status -v @@ -78,14 +93,23 @@ start() { } stop() { - if check_status; then - echo -n $"Stopping BOOTH arbitrator daemon: " - killproc -p $lockfile $prog -TERM - rc_status -v - else + check_status; rc=$? + case $rc in + $BOOTH_DAEMON_STARTED);; + $BOOTH_DAEMON_STARTING);; + $BOOTH_DAEMON_EXIST) + echo "BOOTH site daemon is running." + return $OCF_ERR_GENERIC;; + $BOOTH_DAEMON_NOT_RUNNING) echo "BOOTH arbitrator daemon is not running." - return 1 - fi + return $OCF_SUCCESS + ;; + *) return $OCF_ERR_GENERIC;; + esac + + echo -n $"Stopping BOOTH arbitrator daemon: " + killproc -p $lockfile $prog -TERM + rc_status -v } wait_for_stop() { Index: booth/script/ocf/booth-site =================================================================== --- booth.orig/script/ocf/booth-site +++ booth/script/ocf/booth-site @@ -25,6 +25,14 @@ ####################################################################### # Initialization: +lockfile="/var/run/booth.pid" + +BOOTH_DAEMON_STARTED=0 +BOOTH_DAEMON_STARTING=1 +BOOTH_DAEMON_EXIST=2 +BOOTH_DAEMON_NOT_RUNNING=3 +BOOTH_ERROR_GENERIC=4 + . ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs ####################################################################### @@ -36,6 +44,7 @@ meta_data() { 1.0 + This Resource Agent can control the BOOTH site daemon. It assumes that the binary boothd is in your default PATH. @@ -92,55 +101,109 @@ Expects to have a fully populated OCF RA END } -booth_start() { - booth_monitor; rc=$? - - case $rc in - $OCF_SUCCESS) return $OCF_SUCCESS;; - $OCF_NOT_RUNNING) ;; - *) return $OCF_ERR_GENERIC;; - esac - - ${OCF_RESKEY_daemon} $OCF_RESKEY_type $OCF_RESKEY_args - - sleep 1 - booth_monitor +booth_check_daemon_exist(){ + killall -0 ${OCF_RESKEY_daemon} >/dev/null 2>&1; rc=$? + + case $rc in + 0) return $OCF_SUCCESS;; + 1) return $OCF_NOT_RUNNING;; + *) return $OCF_ERR_GENERIC;; + esac } -booth_stop() { - booth_monitor; rc=$? +booth_check_daemon_state(){ + booth_check_daemon_exist ; rc=$? + + case $rc in + $OCF_SUCCESS) + pidnum=$(cat $lockfile |awk '{print $1}') + daemonstate=$(cat $lockfile |awk '{print $2}') + if cat /proc/$pidnum/cmdline |grep $OCF_RESKEY_type >/dev/null 2>&1; then + case $daemonstate in + $BOOTH_DAEMON_STARTED) return $BOOTH_DAEMON_STARTED;; + $BOOTH_DAEMON_STARTING) return $BOOTH_DAEMON_STARTING;; + *) return $BOOTH_ERROR_GENERIC;; + esac + else + return $BOOTH_DAEMON_EXIST; + fi + ;; + $OCF_NOT_RUNNING) return $BOOTH_DAEMON_NOT_RUNNING;; + $OCF_ERR_GENERIC) return $BOOTH_ERROR_GENERIC;; + *) return $BOOTH_ERROR_GENERIC;; + esac +} - if [ $rc = $OCF_NOT_RUNNING ]; then - return $OCF_SUCCESS - fi +booth_start() { + booth_check_daemon_state; rc=$? - killall -TERM ${OCF_RESKEY_daemon}; rc=$? + case $rc in + $BOOTH_DAEMON_STARTED) return $OCF_SUCCESS;; + $BOOTH_DAEMON_STARTING) + while [ $rc != $BOOTH_DAEMON_STARTED ]; do + sleep 1 + booth_check_daemon_state ; rc=$? + done + return $OCF_SUCCESS;; + $BOOTH_DAEMON_EXIST) return $OCF_ERR_GENERIC;; + $BOOTH_DAEMON_NOT_RUNNING) ;; + *) return $OCF_ERR_GENERIC;; + esac - if [ $rc != 0 ]; then - return $OCF_ERR_GENERIC - fi + ${OCF_RESKEY_daemon} $OCF_RESKEY_type $OCF_RESKEY_args - rc=$OCF_SUCCESS - while [ $rc = $OCF_SUCCESS ]; do - booth_monitor; rc=$? sleep 1 - done + rc=$BOOTH_DAEMON_STARTING + while [ $rc != $BOOTH_DAEMON_STARTED ]; do + booth_check_daemon_state; rc=$? + sleep 1 + done + + return $OCF_SUCCESS +} + +booth_stop() { + booth_check_daemon_state; rc=$? - if [ $rc = $OCF_NOT_RUNNING ]; then - rc=$OCF_SUCCESS - fi + case $rc in + $BOOTH_DAEMON_STARTED) ;; + $BOOTH_DAEMON_STARTING) ;; + $BOOTH_DAEMON_EXIST) return $OCF_ERR_GENERIC;; + $BOOTH_DAEMON_NOT_RUNNING) return $OCF_SUCCESS;; + *) return $OCF_ERR_GENERIC;; + esac + + killall -TERM ${OCF_RESKEY_daemon}; rc=$? + + if [ $rc != 0 ]; then + return $OCF_ERR_GENERIC + fi + + rc=$BOOTH_DAEMON_STARTED + while [ $rc != $BOOTH_DAEMON_NOT_RUNNING ]; do + booth_check_daemon_state; rc=$? + sleep 1 + done + + if [ $rc = $BOOTH_DAEMON_NOT_RUNNING ]; then + rc=$OCF_SUCCESS + else + rc=$OCF_ERR_GENERIC + fi - return $rc + return $rc } booth_monitor() { - killall -0 ${OCF_RESKEY_daemon}; rc=$? + booth_check_daemon_state; rc=$? - case $rc in - 0) return $OCF_SUCCESS;; - 1) return $OCF_NOT_RUNNING;; - *) return $OCF_ERR_GENERIC;; - esac + case $rc in + $BOOTH_DAEMON_STARTED) return $OCF_SUCCESS;; + $BOOTH_DAEMON_STARTING) return $OCF_NOT_RUNNING;; + $BOOTH_DAEMON_EXIST) return $OCF_NOT_RUNNING;; + $BOOTH_DAEMON_NOT_RUNNING) return $OCF_NOT_RUNNING;; + *) return $OCF_ERR_GENERIC;; + esac } booth_validate() {