Hi all,

Here is a "first shot" script for postfix. Tell me if not it's correct
or if something is missing.
Regards,

Stephane Neveu
#!/bin/sh 
#
# Description:  Manages Postfix Service provided by NTT OSSC as an 
#               OCF High-Availability resource under Heartbeat/LinuxHA control
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
#
#mailto : [email protected]
#
#######################################################################
# OCF parameters:
#   OCF_RESKEY_postfix_bin    : Executable file
#   OCF_RESKEY_postfix_pidfile: Process id file
#   OCF_RESKEY_postfix_port   : Port number
#   OCF_RESKEY_postfix_user    : postfix user 
#
#   OCF_RESKEY_postfix_bin, OCF_RESKEY_postfix_conf, OCF_RESKEY_postfix_pidfile
#   OCF_RESKEY_postfix_port OCF_RESKEY_postfix_user must be specified. 
###############################################################################

. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs

#########INITIALIZATION HERE###################################################
POSTFIX_BIN="${OCF_RESKEY_postfix_bin-/usr/sbin/postfix}"
POSTFIX_PIDFILE="${OCF_RESKEY_postfix_pidfile-/var/spool/postfix/pid/master.pid}"
POSTFIX_CONFFILE="${OCF_RESKEY_postfix_conffile-/etc/postfix/main.cf}"
POSTFIX_PORT="${OCF_RESKEY_postfix_port-25}"
POSTFIX_USER="${OCF_RESKEY_postfix_user-root}"
POSTFIX_NAME="${OCF_RESKEY_postfix_opts-postfix}"
##############################################################################


usage() 
{
        cat <<-!
usage: $0 action

action:
        start       : start a new POSTFIX instance

        stop        : stop the running POSTFIX instance

        status      : return the status of POSTFIX, run or down

        monitor     : return TRUE if POSTFIX appears to be working.

        meta-data   : show meta data message

        validate-all : validate the instance parameters
!
        return $OCF_ERR_ARGS
}

metadata_postfix() {
    cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="postfix">
<version>1.0</version>
<longdesc lang="en">The OCF resource agent for  postfix</longdesc>
<shortdesc lang="en">The RA for postfix</shortdesc>

<parameters>

<parameter name="postfix_bin" required="1" unique="0">
<longdesc lang="en">
This is a required parameter. This parameter specifies postfix's
bin file
</longdesc>
<shortdesc>Binary</shortdesc>
<content type="string" default=""/>
</parameter>

<parameter name="postfix_pidfile" required="1" unique="1">
<longdesc lang="en">
This is a required parameter. This parameter specifies a process id file
for a postfix instance managed by this RA.
</longdesc>
<shortdesc>Pidfile</shortdesc>
<content type="string" default=""/>
</parameter>

<parameter name="postfix_port" required="1" unique="1">
<longdesc lang="en">
This is a required parameter. This parameter specifies a port number
for a postfix instance managed by this RA. If plural ports are used,
you must specifiy the only one of them.
</longdesc>
<shortdesc>Port number</shortdesc>
<content type="integer" default=""/>
</parameter>

<parameter name="postfix_user" required="1" unique="1">
<longdesc lang="en">
This is a required parameter. This parameter specifies a user
to start the postfix instance managed by this RA. 
</longdesc>
<shortdesc>User</shortdesc>
<content type="string" default=""/>
</parameter>

</parameters>

<actions>
<action name="start" timeout="20s" />
<action name="stop" timeout="20s" />
<action name="status" timeout="30" />
<action name="monitor" depth="0" timeout="30s" interval="20s" start-delay="10s" 
/>
<action name="meta-data" timeout="20s" />
<action name="validate-all" timeout="20" />
</actions>
</resource-agent>
END
        exit $OCF_SUCCESS
}

get_pid()
{
        POSTFIX_PID=$(netstat -laputen   | awk  
'/.*[0-9]+\.[0-9]+\.+[0-9]+\.[0-9]+:'$POSTFIX_PORT'[^0-9].*LISTEN/ {print $9}' 
| cut -d '/' -f 1)
}

is_pid_found()
{
        get_pid
        if [ -n "${POSTFIX_PID}" ] ; then
                return $OCF_SUCCESS
        else
                return 1
        fi
}

is_postfix_dead()
{
        get_pid
        if [[ -z "${POSTFIX_PID}" ]] && [[ -f "${POSTFIX_PIDFILE}" ]]; then     
                return $OCF_SUCCESS
        elif [[ -n "${POSTFIX_PID}" ]] && [[ ! -f "${POSTFIX_PIDFILE}" ]]; then
                return $OCF_NOT_RUNNING
        else
                return 1
        fi

}

monitor_postfix()
{
                get_pid
                if is_postfix_dead; then
                        return $OCF_ERR_GENERIC
                elif is_pid_found; then
                        return $OCF_SUCCESS
                else
                        return $OCF_NOT_RUNNING
                fi
}

start_postfix()
{
        typeset status

        monitor_postfix
        status=$?
        if [[ $status != $OCF_NOT_RUNNING ]]; then
            return $status
        fi
        /usr/bin/newaliases >/dev/null 2>&1     
        ocf_run $POSTFIX_BIN start
        status=$?
        sleep 1
        if [[ $status != $OCF_SUCCESS ]]; then
                return $status
        fi

        while true; do
                get_pid
                if is_pid_found; then
                        return $OCF_SUCCESS
                else
                        ocf_log info "$POSTFIX_BIN:No pid found after start"
                fi
        done

        return $OCF_ERR_GENERIC
}

stop_postfix()
{
                monitor_postfix
                ocf_run $POSTFIX_BIN stop       
                while true; do
                        sleep 1 
                        get_pid
                        if [ is_postfix_dead != "1" ]; then
                                rm -f ${POSTFIX_PIDFILE}
                                return $OCF_SUCCESS
                        fi
                        ocf_log info "POSTFIX stopped"
                done
        
}

status_postfix()
{
        monitor_postfix
        return $?
}


validate_all_postfix()
{
        return $OCF_SUCCESS
}


if [ -z "$POSTFIX_BIN" ]; then
        ocf_log err "POSTFIX_BIN is not defined"
        exit $OCF_ERR_CONFIGURED
fi
if [ ! -x "$POSTFIX_BIN" ]; then
        ocf_log err "$POSTFIX_BIN is not found"
        exit $OCF_ERR_CONFIGURED
fi

if [ -z "$POSTFIX_PIDFILE" ]; then
        ocf_log err "POSTFIX_PIDFILE is not defined"
        exit $OCF_ERR_CONFIGURED
fi

if [ -z "$POSTFIX_PORT" ]; then
        ocf_log err "POSTFIX_PORT is not defined"
        exit $OCF_ERR_CONFIGURED
fi

if [ -z "$POSTFIX_USER" ]; then
        ocf_log err "POSTFIX_USER is not defined"
        exit $OCF_ERR_CONFIGURED
fi


COMMAND=$1

case "$COMMAND" in
        start)
                start_postfix
                status=$?
                exit $status
                ;;
        stop)
                stop_postfix
                status=$?
                exit $status
                ;;
        status)
                status_postfix
                status=$?
                if status; then
                        ocf_log info "postfix is running"
                elif [status -eq 7]; then
                        ocf_log info "postfix is stopped"
                else
                        ocf_log info "postfix is dead"
                fi      
                ;;
        monitor)
                monitor_postfix
                status=$?
                exit $status
                ;;
        meta-data) 
                 metadata_postfix
                ;;
        validate-all)
                validate_all_postfix
                exit $?
                ;;
        *)
                usage
                ;;
esac


_______________________________________________
Linux-HA mailing list
[email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha
See also: http://linux-ha.org/ReportingProblems

Reply via email to