Hi Dejan,

> I still don't understand why would you want a coredump of the
> syslog-ng process? Do you think that is really necessary? No
> other resource agent does that.
I believed that if RA can not stop process normally, then
RA should leave information as much as possible to analyze failuer.

But, as you say, syslog-ng's corefile is not too significant
for system manager certainly.
And it seems that syslog-ng process doesn't leave
beneficial information when QUIT signal is received.

I remove "pkill -QUIT" code and revised RA is attached.

Best Regards,
NAKAHIRA Kazutomo

Dejan Muhamedagic wrote:
Hi Kazutomo-san,

On Mon, Nov 16, 2009 at 06:15:56PM +0900, NAKAHIRA Kazutomo wrote:
Hi Dejan,

[...]
QUIT signal for common linux process stop target process.
>From signal(7):
      SIGQUIT       3       Core    Quit from keyboard

i.e. there could be core dumps and I'm not sure if that's
what you intend.

What I intend is that if syslog-ng process never stops
by the "kill -TERM", then trying core dump and stop process
by the "kill -QUIT".

[...]
I revised these parts and the syslog-ng RA's stop sequence is below.

1. Execute "kill -TERM" and wait KILL_TERM_TIMEOUT seconds
    until syslog-ng porcess stopped.
2. If sylog-ng process dose not stopped, then Execute
   "kill -QUIT" to dump core and stop process.

I still don't understand why would you want a coredump of the
syslog-ng process? Do you think that is really necessary? No
other resource agent does that.

Thanks,

Dejan
_______________________________________________________
Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/


--
----------------------------------------
NAKAHIRA Kazutomo
NTT DATA INTELLILINK CORPORATION
Open Source Business Unit
Software Services Integration Business Division
#!/bin/bash
#
# Description:  Manages a syslog-ng instance, provided by NTT OSSC as an 
#               OCF High-Availability resource under Heartbeat/LinuxHA control
#
# Copyright (c) 2009 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
#
##############################################################################
# OCF parameters:
#   OCF_RESKEY_syslog_ng_binary : Path to syslog-ng binary.
#                                 Default is "/sbin/syslog-ng"
#   OCF_RESKEY_configfile       : Configuration file
#   OCF_RESKEY_start_opts       : Startup options
#   OCF_RESKEY_kill_term_timeout: Number of seconds to await to confirm a 
#                                 normal stop method
#
#   Only OCF_RESKEY_configfile must be specified. Each of the rests 
#   has its default value or refers OCF_RESKEY_configfile to make
#   its value when no explicit value is given.
#
# Further infomation for setup:
#   There are sample configurations at the end of this file.
#
###############################################################################

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

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

action:
        start       : start a new syslog-ng instance

        stop        : stop the running syslog-ng instance

        status      : return the status of syslog-ng, run or down

        monitor     : return TRUE if the syslog-ng appears to be working.

        meta-data   : show meta data message

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

metadata_syslog_ng()
{
        cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="syslog_ng">
<version>1.0</version>

<longdesc lang="en">
This script manages a syslog-ng instance as an HA resource.
</longdesc>
<shortdesc lang="en">Syslog-ng resource agent</shortdesc>

<parameters>

<parameter name="syslog_ng_binary" unique="0">
<longdesc lang="en">
This parameter specifies syslog-ng's executable file.
</longdesc>
<shortdesc>Executable file</shortdesc>
<content type="string" default=""/>
</parameter>

<parameter name="configfile" unique="0" required="1">
<longdesc lang="en">
This parameter specifies a configuration file 
for a syslog-ng instance managed by this RA.
</longdesc>
<shortdesc>Configuration file</shortdesc>
<content type="string" default=""/>
</parameter>

<parameter name="start_opts" unique="0">
<longdesc lang="en">
This parameter specifies startup options for a 
syslog-ng instance managed by this RA. When no value is given, no startup 
options is used. Don't use option '-F'. It causes a stuck of a start action.
</longdesc>
<shortdesc>Start options</shortdesc>
<content type="string" default=""/>
</parameter>

<parameter name="kill_term_timeout" unique="0">
<longdesc lang="en">
On a stop action, a normal stop method(pkill -TERM) is firstly used.
And then the confirmation of its completion is waited for
the specified seconds by this parameter.
The default value is 10.
</longdesc>
<shortdesc>Number of seconds to await to confirm a normal stop 
method</shortdesc>
<content type="integer" default="10"/>
</parameter>

</parameters>

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

monitor_syslog_ng()
{
        set -- $(pgrep -f "$PROCESS_PATTERN" 2>/dev/null)
        case $# in
                0) ocf_log debug "No syslog-ng process for $CONFIGFILE"
                   return $OCF_NOT_RUNNING;;
                1) return $OCF_SUCCESS;;
        esac
        ocf_log warn "Multiple syslog-ng process for $CONFIGFILE"
        return $OCF_SUCCESS
}

start_syslog_ng()
{
        monitor_syslog_ng
        if [[ $? = "$OCF_SUCCESS" ]]; then
                return $OCF_SUCCESS
        fi

        # set -- $SYSLOG_NG_OPTS
        # ocf_run "$SYSLOG_NG_EXE" -f "$SYSLOG_NG_CONF" "$@"
        # reduce to this?
        ocf_run "$SYSLOG_NG_EXE" -f "$CONFIGFILE" $START_OPTS
        ocf_status=$?
        if [[ "$ocf_status" != "$OCF_SUCCESS" ]]; then
                return $ocf_status
        fi

        while true; do
                monitor_syslog_ng
                if [[ $? = "$OCF_SUCCESS" ]]; then
                        return $OCF_SUCCESS
                fi
                sleep 1
        done
}

stop_syslog_ng()
{
        pkill -TERM -f "$PROCESS_PATTERN"

        typeset lapse_sec=0
        while pgrep -f "$PROCESS_PATTERN" > /dev/null; do
                sleep 1
                lapse_sec=$(( lapse_sec + 1 ))
                ocf_log debug "stop_syslog_ng[$SYSLOG_NG_NAME]: stop NORM 
$lapse_sec/$KILL_TERM_TIMEOUT"
                if [ $lapse_sec -ge $KILL_TERM_TIMEOUT ]; then
                        break
                fi
        done

        # if the process can't be removed, then the following part is
        # not going to be executed (the RA will be killed by lrmd on
        # timeout) and the pidfile will remain; don't know if that
        # has any consequences
        # 2009/09/18 Nakahira
        # If the syslog-ng process hangs, syslog-ng RA waits
        # $KILL_TERM_TIMEOUT seconds.
        # The stop timeout of RA should be longer than $KILL_TERM_TIMEOUT.
        lapse_sec=0
        while pgrep -f "$PROCESS_PATTERN" > /dev/null; do
                pkill -KILL -f "$PROCESS_PATTERN"
                sleep 1
                lapse_sec=$(( lapse_sec + 1 ))
                ocf_log debug "stop_syslog_ng[$SYSLOG_NG_NAME]: suspend 
syslog_ng by SIGKILL ($lapse_sec/@@@)"
        done

        return $OCF_SUCCESS
}

status_syslog_ng()
{
        # ???? why not monitor and then print running or stopped
        monitor_syslog_ng
        rc=$?
        if [ $rc = $OCF_SUCCESS ]; then
                echo "Syslog-ng service is running."
        elif [ $rc = $OCF_NOT_RUNNING ]; then
                echo "Syslog-ng service is stopped."
        else
                echo "Mutiple syslog-ng process for $CONFIGFILE."
        fi
        return $rc
}

validate_all_syslog_ng()
{
        ocf_log info "validate_all_syslog_ng[$SYSLOG_NG_NAME]"
        return $OCF_SUCCESS
}

if [[ "$1" = "meta-data" ]]; then
        metadata_syslog_ng
        exit $?
fi

CONFIGFILE="${OCF_RESKEY_configfile}"
if [[ -z "$CONFIGFILE" ]]; then
        ocf_log err "undefined parameter:configfile"
        exit $OCF_ERR_CONFIGURED
fi

SYSLOG_NG_NAME=${CONFIGFILE##*/}
SYSLOG_NG_NAME=${SYSLOG_NG_NAME%.*}

SYSLOG_NG_EXE="${OCF_RESKEY_syslog_ng_binary-/sbin/syslog-ng}"
# why not default to /sbin/syslog-ng?
#if [[ -z "$SYSLOG_NG_EXE" ]]; then
#       ocf_log err "Undefined parameter:syslog_ng_binary"
#       exit $OCF_ERR_CONFIGURED
#fi
if [[ ! -x "$SYSLOG_NG_EXE" ]]; then
        ocf_log err "Invalid value:syslog_ng_binary:$SYSLOG_NG_EXE"
        exit $OCF_ERR_CONFIGURED
fi

# actually, the pidfile has no function; the status is checked by
# testing for a running process only

KILL_TERM_TIMEOUT="${OCF_RESKEY_kill_term_timeout-10}"
if ! ocf_is_decimal "$KILL_TERM_TIMEOUT"; then
        ocf_log err "Invalid value:kill_term_timeout:$KILL_TERM_TIMEOUT"
        exit $OCF_ERR_CONFIGURED
fi

START_OPTS=${OCF_RESKEY_start_opts}
PROCESS_PATTERN="$SYSLOG_NG_EXE -f $CONFIGFILE"

COMMAND=$1

case "$COMMAND" in
        start)
                ocf_log debug  "[$SYSLOG_NG_NAME] Enter syslog_ng start"
                start_syslog_ng
                func_status=$?
                ocf_log debug  "[$SYSLOG_NG_NAME] Leave syslog_ng start 
$func_status"
                exit $func_status
                ;;
        stop)
                ocf_log debug  "[$SYSLOG_NG_NAME] Enter syslog_ng stop"
                stop_syslog_ng
                func_status=$?
                ocf_log debug  "[$SYSLOG_NG_NAME] Leave syslog_ng stop 
$func_status"
                exit $func_status
                ;;
        status)
                status_syslog_ng
                exit $?
                ;;
        monitor)
                #ocf_log debug  "[$SYSLOG_NG_NAME] Enter syslog_ng monitor"
                monitor_syslog_ng
                func_status=$?
                #ocf_log debug  "[$SYSLOG_NG_NAME] Leave syslog_ng monitor 
$func_status"
                exit $func_status
                ;;
        validate-all)
                validate_all_syslog_ng
                exit $?
                ;;
        *)
                usage
                ;;
esac

# vim: set sw=4 ts=4 :

### A sample snippet of cib.xml for a syslog-ng resource
##
#         <primitive id="prmApSyslog-ng" class="ocf" type="syslog-ng" 
provider="heartbeat">
#           <instance_attributes id="prmDummyB_instance_attrs">
#             <attributes>
#              <nvpair id="atr:Syslog-ng:syslog-ng:syslog_ng_binary"  
name="syslog_ng_binary"  value="/sbin/syslog-ng"/>
#              <nvpair id="atr:Syslog-ng:syslog-ng:configfile" 
name="configfile" value="/etc/syslog-ng/syslog-ng-ext.conf"/>
#             </attributes>
#           </instance_attributes>
#           <operations>
#             <op id="op:prmSyslog-ng:start"   name="start" timeout="60s" 
on_fail="restart"/>
#             <op id="op:prmSyslog-ng:monitor" name="monitor" interval="10s" 
timeout="60s" on_fail="restart"/>
#             <op id="op:prmSyslog-ng:stop"    name="stop" timeout="60s" 
on_fail="block"/>
#           </operations>
#         </primitive>

### A sample syslog-ng configuration file for a log collecting host
### 
### This sample is for a log collecting host by syslog-ng.
### A syslog-ng process configurated by this sample accepts all messages
### from a certain network. Any message from the network is preserved into
### a file for security infomation. Restricting messages to "authpriv" from
### the network is done on log sending hosts. (See the sample below)
### Any internal message of the syslog-ng process is preserved into its 
### dedicated file. And any "authpriv" internal message of the syslog-ng 
### process is also preserved into the security infomation file.
###
### Change "f_incoming" to suit your enviroment.
### If you use it as a configuration file for the sample cib.xml above,
### save it into "/etc/syslog-ng/syslog-ng-ext.conf".
##
#options {
#    sync (0);
#    time_reopen (10);
#    log_fifo_size (1000);
#    long_hostnames (off);
#    use_dns (yes);
#    use_fqdn (no);
#    create_dirs (no);
#    keep_hostname (yes); };
#
#source s_internal { internal(); };
#source s_incoming { udp(port(514)); };
#filter f_internal { facility(authpriv); };
#filter f_incoming { netmask("172.20.0.0/255.255.192.0"); };
#
#destination d_internal { file("/var/log/syslog-ng-ext.log" perm(0640));};
#destination d_incoming {
#    file("/var/log/secure-ext.log" create_dirs(yes) perm(0640)); };
#
#log { source(s_internal); destination(d_internal); };
#log { source(s_internal); filter(f_internal); destination(d_incoming); };
#log { source(s_incoming); filter(f_incoming); destination(d_incoming); };

### A sample snippet of syslog-ng configuration file for a log sending host
###
### This sample is for a log sending host that uses syslog-ng.
###
### Replace "syslog-ng-ext" to the IP address or the hostname of your
### log collecting host and append it to "syslog-ng.conf" of each log sending
### host. See the install default syslog-ng.conf to know what "s_sys" and 
### "f_auth" are.
##
#destination d_outgoing  { udp("syslog-ng-ext" port(514)); };
#log { source(s_sys); filter(f_auth); destination(d_outgoing); };

### A sample snippet of syslog configuration file for a log sending host
###
### This sample is for a log sending host that uses syslog.
###
### Replace "syslog-ng-ext" to the IP address or the hostname of your
### log collecting host and append it to "syslog.conf" of each log sending
### host.
##
# authpriv.*                                              @syslog-ng-ext
_______________________________________________________
Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/

Reply via email to