Hi Frank,

Great contribution, thanks! RA looks pretty good overall; a few comments
inline:

On 2010-11-24 13:38, Frank Lazzarini wrote:
> #!/bin/sh
> #
> #
> #       Firebird 2.5 OCF RA. Start Firebird 2.5 Superclassic server
> #
> #
> # Author:       Frank Lazzarini
> #
> # Support:      [email protected]
> # License:      GNU General Public License (GPL)
> # Copyright:    (C) 2010 SitaSoftware S.A.
> #
> # See usage() function below for more details...
> #
> # OCF instance parameters:
> #   OCF_RESKEY_binary
> #   OCF_RESKEY_pid
> #   OCF_RESKEY_user
> #
> #######################################################################
> # Initialization:
> 
> : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
> . ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
> 
> #######################################################################
> 
> OCF_RESKEY_binary_default="/opt/firebird/bin/fbguard"
> OCF_RESKEY_pid_default="/var/run/firebird/firebird.pid"
> OCF_RESKEY_user_default="firebird"
> 
> : ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}
> : ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}
> : ${OCF_RESKEY_user=${OCF_RESKEY_user_default}}
> 
> 
> meta_data() {
>       cat <<END
> <?xml version="1.0"?>
> <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
> <resource-agent name="firebird25" version="0.1">
> <version>1.0</version>

I realize the fact that we can specify the RA version twice is
redundant, but the version numbers should match. :)

> <longdesc lang="en">
> This is a Resource Agent for Firebird 2.5 Superclassic server. The resource 
> agent
> simply starts fbguard with a few options. Fbguard is a process which starts 
> the
> Firebird 2.5 Superclassic server namely fb_snmp_server process and guards this
> process.
> </longdesc>
> <shortdesc lang="en">Firebird 2.5 Superclassic Server Resource 
> Agent.</shortdesc>
> <parameters>
> <parameter name="binary" unique="0" required="0">
>       <shortdesc lang="en">Firebird 2.5 Guardian binary</shortdesc>
>       <longdesc lang="en">Destination of the Firebird 2.5 Superclassic 
> Guardian binary. (default: /opt/firebird/bin/fb_snmp_server)</longdesc>

You can just use:

<longdesc lang="en">Destination of the Firebird 2.5 Superclassic
Guardian binary. (default: $OCF_RESKEY_binary_default)</longdesc>

>       <content type="string" default="$OCF_RESKEY_binary_default" />
> </parameter>
> 
> <parameter name="pid" unique="0" required="0">
>       <shortdesc lang="en">Firebird pid file</shortdesc>
>       <longdesc lang="en">The pidfile to be used for fbguard (default: 
> /var/run/firebird/firebird.pid)</longdesc>

As above.

>       <content type="string" default="$OCF_RESKEY_pid_default" />
> </parameter>
> 
> <parameter name="user" unique="0" required="0">
>       <shortdesc lang="en">Firebird User</shortdesc>
>       <longdesc lang="en">User running Firebird daemon (default: 
> firebird)</longdesc>

As above.

>       <content type="string" default="$OCF_RESKEY_user_default" />
> </parameter>
> </parameters>
> 
> <actions>
> <action name="start"          timeout="20" />
> <action name="stop"           timeout="20" />

I assume you've tested that the agent really has the capability of
starting and stopping its daemon within 20 seconds?

> <action name="monitor"        timeout="20" interval="10" depth="0" />
> <action name="reload"         timeout="20" />
> <action name="migrate_to"     timeout="20" />
> <action name="migrate_from"   timeout="20" />

The RA does not support migrate_to and migrate_from, so you shouldn't be
advertising these.

> <action name="meta-data"      timeout="5"  />
> <action name="validate-all"   timeout="20" />
> </actions>
> </resource-agent>
> END
>       exit $OCF_SUCCESS
> }
> 
> #######################################################################
> 
> firebird25_usage() {
>       cat <<END
> usage: $0 {start|stop|monitor|meta-data}
> 
> END
> }
> 
> firebird25_start() {
>       # exit immediately if configuration is not valid
>       firebird25_validate_all || exit $?
> 
>       # if resource is already running, bail out early
>       if firebird25_monitor; then
>               ocf_log info "Resource is already running"
>       fi
> 
>       start-stop-daemon --start --quiet --oknodo --chuid $OCF_RESKEY_user 
> --exec $OCF_RESKEY_binary -- -pidfile $OCF_RESKEY_pid -daemon -forever

Unfortunately start-stop-daemon is a Debian/Ubuntu-ism (it comes with
dpkg), so you'll have to change this to a distro independent invocation.

> 
>       return $OCF_SUCCESS
> }
> 
> firebird25_stop() {
>       local rc
> 
>       # exit immediately if configuration is not valid
>       firebird25_validate_all || exit $?
> 
>       # check if firebird is running
>       firebird25_monitor
>       rc=$?
> 
>       case "$rc" in
>               "$OCF_SUCCESS")
>                       ocf_log debug "Resource is currently running"
>                       ;;
>               "$OCF_NOT_RUNNING")
>                       ocf_log info "Resource is already stopped"
>                       ;;
>       esac
> 
>       if [ -f $OCF_RESKEY_pid ]
>       then
>               kill `cat $OCF_RESKEY_pid`
>               if [ $? = 0 ]; then
>                       return $OCF_SUCCESS
>               fi
>       fi
> 
>       while firebird25_monitor; do
>               ocf_log debug "Resource has not stopped yet, waiting"
>               sleep 1
>       done
> 
>       return $OCF_SUCCESS
> }
> 
> firebird25_monitor() {
>       local rc
>       firebird25_validate_all

Sure you don't want to exit here if validation fails?

> 
>       # Return OCF_NOT_RUNNING if no pid was found
>       if [ ! -e $OCF_RESKEY_pid ]; then
>               ocf_log debug "Firebird is not running"
>               return $OCF_NOT_RUNNING
>       fi
> 
>       # Check if firebird is running
>       # first get the pid from the pidfile and check with
>       # kill -0 pid if the process is running with the right pid
>       pid=`cat $OCF_RESKEY_pid`
>       kill -0 $pid >/dev/null 2>&1

Minor bashism here, the generic way to do this is to use kill -s 0 $pid.

>       rc=$?
> 
>       # Return OCF_SUCCESS if process is running
>       # Return OCF_NOT_RUNNING if process is not running but pid exists
>       if [ $rc -eq 0 ]; then
>               return $OCF_SUCCESS
>       else
>               ocf_log debug "Firebird is not running: removing old PID file"
>               rm -f $OCF_RESKEY_pid
>               return $OCF_NOT_RUNNING
>       fi
> }
> 
> firebird25_validate_all() {
>       # Checking the parameters
>       # check if binary exists and is executable
>       if [ ! -x $OCF_RESKEY_binary ]; then
>               ocf_log err "fbguard binary $OCF_RESKEY_binary does not exist 
> or is not executable"
>               return $OCF_ERR_INSTALLED

No need to return the $OCF_ERR status; you can just exit and leave it to
Pacemaker to recover.

>       fi
> 
>       # check if user exits
>       getent passwd $OCF_RESKEY_user >/dev/null 2>&1
>       if [ ! $? -eq 0 ]; then
>               ocf_log err "User $OCF_RESKEY_user doesn't exist"
>               return $OCF_ERR_INSTALLED

Same here.

>       fi
>       true
> }
> 
> case $__OCF_ACTION in
> meta-data)    meta_data
>               exit $OCF_SUCCESS
>               ;;
> start)                firebird25_start;;
> stop)         firebird25_stop;;
> monitor)      firebird25_monitor;;
> reload)               ocf_log err "Reloading..."
>               firebird25_start
>               ;;
> validate-all) firebird25_validate_all;;
> usage|help)   firebird25_usage
>               exit $OCF_SUCCESS
>               ;;
> *)            firebird25_usage
>               exit $OCF_ERR_UNIMPLEMENTED
>               ;;
> esac
> rc=$?
> ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc"
> exit $rc

Thanks again -- keep up the good work!

Cheers,
Florian

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/

Reply via email to