Unixシェル
 構成・方式
 シェルスクリプト
 シェルサンプル
    mailmanRA

 mailmanリソースエージェント
#!/bin/sh # (名称) # Resource script for Mailman # (解説) # Description: Manages Mailman as an OCF resource in # an high-availability setup.(解説) # # Author: <[email protected]> : Original Author # License: GNU General Public License (GPL) # # (戻り値など) # status is 0 if running, # status is 1 if dead but pid file exists # status is 2 if dead but subsys locked # status is 3 if stopped (pid returned will be 0) # OCF parameters: # OCF_RESKEY_binary # OCF_RESKEY_config_file # OCF_RESKEY_parameters ######################################################################### # Initialization: : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs # Defaults OCF_RESKEY_binary_default="/usr/lib/mailman/bin/mailmanctl" OCF_RESKEY_config_file_default="" OCF_RESKEY_pid_file_default="/var/run/mailman/master-qrunner.pid" OCF_RESKEY_parameters_default="" : ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} : ${OCF_RESKEY_config_file=${OCF_RESKEY_config_file_default}} : ${OCF_RESKEY_pid_file=${OCF_RESKEY_pid_file_default}} : ${OCF_RESKEY_parameters=${OCF_RESKEY_parameters_default}} USAGE="Usage: $0 {start|stop|reload|monitor|validate-all|meta-data}"; ########################################################################## usage() { echo $USAGE >&2 } meta_data() { cat <<END <?xml version="1.0"?> <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> <resource-agent name="mailman"> <version>0.1</version> <longdesc lang="en"> This script manages Mailman as an OCF resource in a high-availability setup. </longdesc> <shortdesc lang="en">Manages a highly available Mailman instance</shortdesc> <parameters> <parameter name="binary" unique="0" required="0"> <longdesc lang="en"> Full path to the Mailman binary. For example, "/usr/lib/mailman/bin/mailmanctl". </longdesc> <shortdesc lang="en">Full path to Mailman binary</shortdesc> <content type="string" default="${OCF_RESKEY_binary_default}" /> </parameter> <parameter name="config_file" unique="1" required="0"> <longdesc lang="en"> Full path to a Mailman configuration file. For example, "/etc/mailman/mm_cfg.py". </longdesc> <shortdesc lang="en">Full path to configuration file</shortdesc> <content type="string" default="${OCF_RESKEY_config_file_default}" /> </parameter> <parameter name="pid_file" unique="1" required="0"> <longdesc lang="en"> Full path to a Mailman PID file. For example, "/var/run/mailman/master-qrunner.pid". </longdesc> <shortdesc lang="en">Full path to PID file</shortdesc> <content type="string" default="${OCF_RESKEY_pid_file_default}" /> </parameter> <parameter name="parameters" unique="0" required="0"> <longdesc lang="en"> The Mailman daemon may be called with additional parameters. Specify any of them here. </longdesc> <shortdesc lang="en"></shortdesc> <content type="string" default="${OCF_RESKEY_parameters_default}" /> </parameter> </parameters> <actions> <action name="start" timeout="20s" /> <action name="stop" timeout="20s" /> <action name="reload" timeout="20s" /> <action name="monitor" depth="0" timeout="20s" interval="60s" /> <action name="validate-all" timeout="20s" /> <action name="meta-data" timeout="5s" /> </actions> </resource-agent> END } mailman_running() { # local loglevel # loglevel=${1:-err} # run `mailman process status` if available if ocf_is_true $status_support; then $binary $OPTION_CONFIG_DIR status 2>&1 ret=$? if [ $ret -ne 0 ]; then ocf_log $loglevel "Mailman status: " $ret fi return $ret fi # manually check Mailman's pid # PIDFILE=$OCF_RESKEY_pid_file # if [ -f $PIDFILE ]; then # PID=`head -n 1 $PIDFILE` # kill -s 0 $PID >/dev/null 2>&1 && [ `ps -p $PID | grep mailman | wc -l` -eq 1 ] # return $? # fi # Mailman is not running false } mailman_start() { # if Mailman is running return success if mailman_running info; then ocf_log info "Mailman already running." return $OCF_SUCCESS fi # start Mailman $binary $OPTIONS start >/dev/null 2>&1 ret=$? if [ $ret -ne 0 ]; then ocf_exit_reason "Mailman returned error: " $ret return $OCF_ERR_GENERIC fi # grant some time for startup/forking the sub processes # and loop initial monitoring until success or timeout # while true; do # sleep 130 # # break if mailman is up and running; log failure otherwise # maiman_running info && break # ocf_log info "Mailman failed initial monitor action: " $ret # done ocf_log info "Mailman started." return $OCF_SUCCESS } mailman_stop() { # if Mailman is not running return success if ! mailman_running info; then ocf_log info "Mailman already stopped." return $OCF_SUCCESS fi # stop Mailman $binary $OPTIONS stop >/dev/null 2>&1 ret=$? if [ $ret -ne 0 ]; then ocf_exit_reason "Mailman returned an error while stopping: " $ret return $OCF_ERR_GENERIC fi # grant some time for shutdown and recheck 5 times for i in 1 2 3 4 5; do if mailman_running info; then sleep 1 else break fi done # mailman stop did not succeed if mailman_running; then ocf_exit_reason "Mailman failed to stop." return $OCF_ERR_GENERIC fi ocf_log info "Mailman stopped." return $OCF_SUCCESS } mailman_reload() { if mailman_running; then ocf_log info "Reloading Mailman." $binary $OPTIONS restart fi } mailman_monitor() { local status_loglevel="err" # Set loglevel to info during probe if ocf_is_probe; then status_loglevel="info" fi if mailman_running $status_loglevel; then return $OCF_SUCCESS fi return $OCF_NOT_RUNNING } mailman_validate_all() { # check that the Mailman binaries exist and can be executed check_binary "$binary" # check config_file parameter if [ "x$config_file" != "x" ]; then if [ ! -f "$config_file" ]; then if ocf_is_probe; then ocf_log info "Mailman configuration file '$config_file' not readable during probe." else ocf_exit_reason "Mailman configuration file '$config_file' does not exist or is not readable." return $OCF_ERR_INSTALLED fi fi fi return $OCF_SUCCESS } # # Main # if [ $# -ne 1 ]; then usage exit $OCF_ERR_ARGS fi binary=$OCF_RESKEY_binary config_file=$OCF_RESKEY_config_file parameters=$OCF_RESKEY_parameters # handle parameters case $1 in meta-data) meta_data exit $OCF_SUCCESS ;; usage|help) usage exit $OCF_SUCCESS ;; esac # build Mailman options string *outside* to access from each method OPTIONS='' OPTION_CONFIG_FILE='' # check if the Mailman config_file exist if [ "x$config_dir" != "x" ]; then # remove all trailing slashes config_file=`echo $config_file | sed 's/\/*$//'` # set OPTIONS if config_file is still set # save OPTION_CONFIG_FILE seperatly if [ "x$config_file" != "x" ]; then OPTION_CONFIG_FILE="-c $config_file" OPTIONS=$OPTION_CONFIG_FILE fi fi # add all additional parameters to options string if [ "x$parameters" != "x" ]; then OPTIONS="$OPTIONS $parameters" fi # check Mailman status support(mailmanctl有り) status_support=true mailman_validate_all ret=$? if [ $ret -ne $OCF_SUCCESS ]; then case $1 in stop) exit $OCF_SUCCESS ;; *) exit $ret;; esac fi case $1 in monitor) mailman_monitor exit $? ;; start) mailman_start exit $? ;; stop) mailman_stop exit $? ;; reload) mailman_reload exit $? ;; validate-all) exit $OCF_SUCCESS ;; *) usage exit $OCF_ERR_UNIMPLEMENTED ;; esac