Index ソフト・ハード Unixシェル | シェルサンプル |
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
|
All Rights Reserved. Copyright (C) ITCL |