#!/bin/sh EGO_USER="Admin" EGO_PASS="Admin" if [ `egosh user logon -u "${EGO_USER}" -x "${EGO_PASS}" 2>> /dev/null | grep -ic success` -eq 0 ] then echo $"EGO logon failed, may need to update EGO_USER or EGO_PASS." >&2 exit 4 fi # MAX number of secs to wait when checking EGO service status MAX_SLEEP=120 # Number of secs between each check SLEEP_INTERVAL=10 # Number of consecutive checks before declaring status is OK STATUS_INTERVALS=3 # NOTE: start and stop cmds will take a minimum of SLEEP_INTERVAL * STATUS_INTERVALS secs is_valid_service() { sname="$1" rc=`egosh service view "${sname}" 2>&1 | grep -ci "does not exist"` if [ ${rc} -ne 0 ] then echo "${sname} is not a valid EGO service name." >&2 fi return ${rc} } get_service_detail() { sname="$1" host= pgid= sview=`egosh service view "${sname}"` if [ `echo "${sview}" | grep -1 -m 1 "^state" | tail -1 | grep -c "^ERROR"` -eq 1 ] then echo "ERROR" return 1 fi if [ `echo "${sview}" | tail -1 | grep -c "^RUN"` -eq 1 ] then # Server running, get host and pgid host=`echo "${sview}" | tail -1 | awk '{print $3}'` aid=`echo "${sview}" | tail -1 | awk '{print $2}'` aview=`egosh activity view ${aid}` pgid=`echo "${aview}" | grep -1 "^UID" | tail -1 | awk '{print $4}'` fi if [ ! -z "${host}" -a ! -z "${pgid}" ] then echo "${host} ${pgid}" else echo fi return 0 } show_status() { sname="$1" detail="$2" if [ "${detail}" = "ERROR" ] then echo "EGO service '${sname}' is in ERROR state." else if [ ! -z "${detail}" ] then host=`echo "${detail}" | awk '{print $1}'` pgid=`echo "${detail}" | awk '{print $2}'` echo "EGO service '${sname}' is running on host ${host} (pgid ${pgid})..." else echo "EGO service '${sname}' is stopped." fi fi return 0 } start_server() { sname="$1" is_valid_service "${sname}" || return 2 check=`get_service_detail "${sname}"` if [ ! -z "${check}" ] then # Service already running or ERROR show_status "${sname}" "${check}" return 0 fi egosh service start "${sname}" >> /dev/null status_server "${sname}" } stop_server() { sname="$1" is_valid_service "${sname}" || return 2 # Execute the EGO stop, even if service not running # as it could be in an ERROR state and need to stop. egosh service stop "${sname}" >> /dev/null sleep ${SLEEP_INTERVAL} # Wait a few secs for service to shutdown ! status_server "${sname}" 1 } status_server() { sname="$1" num_checks=$2 [ -z "${num_checks}" ] && num_checks=${STATUS_INTERVALS} rc=1 is_valid_service "${sname}" || return 2 i=0 prev_pgid=0 scount=1 while [ $i -lt ${MAX_SLEEP} ] do pgid= detail=`get_service_detail "${sname}"` [ $? -ne 0 ] && break # Service in ERROR state [ ! -z "${detail}" ] && pgid=`echo "${detail}" | awk '{print $2}'` if [ -z "${pgid}" ] then prev_pgid=0 scount=1 rc=1 else rc=0 # Service is running but to make certain it continues check to see # the same pgid for consecutive intervals. if [ ${prev_pgid} -eq ${pgid} ] then let scount=scount+=1 else prev_pgid=${pgid} scount=1 fi fi [ ${scount} -ge ${num_checks} ] && break sleep ${SLEEP_INTERVAL} let i=i+=${SLEEP_INTERVAL} done show_status "${sname}" "${detail}" return $rc } restart_server() { sname="$1" rc=0 stop_server "${sname}" if [ $? -ne 0 ] then rc=1 else start_server "${sname}" if [ $? -ne 0 ] then rc=1 fi fi return $rc } ######## # MAIN # ######## SYSRC=0 CMD="$1" shift if [ $# -eq 0 ] then # Must specify at least one service name; fall thru to usage message CMD= fi case "${CMD}" in start) for s in "$@" do start_server "${s}" if [ $? -ne 0 ] then echo "Failed to start ${s}..." >&2 SYSRC=1 fi done ;; stop) for s in "$@" do stop_server "${s}" if [ $? -ne 0 ] then echo "Failed to stop ${s}..." >&2 SYSRC=1 fi done ;; restart) for s in "$@" do restart_server "${s}" if [ $? -ne 0 ] then echo "Failed to restart ${s}..." >&2 SYSRC=1 fi done ;; status) for s in "$@" do status_server "${s}" 0 || SYSRC=3 done ;; *) echo $"Usage: $0 {start|stop|restart|status} [ ...]" SYSRC=3 ;; esac egosh user logoff >> /dev/null 2>&1 exit $SYSRC