Hi, Dejan and Raoul

I hope you will forgive me for being so slow to answer.
# I have some other works and it takes time.

1. taking a quick look, this ocf ra seems generic enough to serve for
other syslog daemons (e.g. rsyslog) as well.
I think so. But I have no time to test other syslog daemons now.
Currently I suggest this RA for the syslog-ng, but I hope that
this RA supports other syslog daemon in the future.

2. i suggest you rename OCF_RESKEY_syslog_ng_exe to
OCF_RESKEY_syslog_ng_binary or OCF_RESKEY_syslog_binary (see 1.)
(and possibly other ocf parameters) to be more consistent with other
ocf ra's.
I agree and fix OCF_RESKEY_syslog_ng_exe to OCF_RESKEY_syslog_ng_binary.

When sourcing ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
you should use '.' not '..'.
I wrote '.' as a source command in the original file.
But it translated to '..' automatically by the my mailer
or our company's mail server.(It is so strange)
Please revise '..' to '.' if it translated again.

In the stop procedure, you use the QUIT signal. That's going to
produce a coredump of the process. Is that actually intended? Why
not use KILL after TERM?
Using "kill -QUIT" is actually intended in this RA.
QUIT signal for JVM process dose not stop target process, but
QUIT signal for common linux process stop target process.

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" KILL_QUIT_TIMEOUT times at intervals of
   1 second until syslog-ng porcess stopped.
3. If syslog-ng process still alive, then Execete
   "kill -KILL" at intervals of 1 second
   until syslog-ng porcess stopped.

On formatting: sometimes spaces are used and sometimes tabs for
indentation. Can you please use either one or the other
(preferably the latter).
I agree. I substituted all indentation spaces to tabs.

A re-revised syslog-ng RA is attached.

Best Regards,
NAKAHIRA Kazutomo

Dejan Muhamedagic wrote:
Hi,

On Tue, Nov 10, 2009 at 01:02:06PM +0100, Raoul Bhatia [IPAX] wrote:
On 09/21/2009 01:59 PM, Dejan Muhamedagic wrote:
Hi Kazutomo-san,

On Fri, Sep 18, 2009 at 05:19:28PM +0900, NAKAHIRA Kazutomo wrote:
Hi, Dejan

I'm sorry I didn't get back to you sooner as a JBoss RA.
I took over mori-san and takenaka-san's work.

I revised a syslog-ng RA referring to your comments.
The modification and my comments is written in the attached RA.
When sourcing ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
you should use '.' not '..'.

In the stop procedure, you use the QUIT signal. That's going to
produce a coredump of the process. Is that actually intended? Why
not use KILL after TERM?

On formatting: sometimes spaces are used and sometimes tabs for
indentation. Can you please use either one or the other
(preferably the latter).
hi,

what is the current status on this one?

Apparently waiting for some response from Kazutomo-san.

Thanks,

Dejan

cheers,
raoul
--
____________________________________________________________________
DI (FH) Raoul Bhatia M.Sc.          email.          r.bha...@ipax.at
Technischer Leiter

IPAX - Aloy Bhatia Hava OEG         web.          http://www.ipax.at
Barawitzkagasse 10/2/2/11           email.            off...@ipax.at
1190 Wien                           tel.               +43 1 3670030
FN 277995t HG Wien                  fax.            +43 1 3670030 15
____________________________________________________________________
_______________________________________________________
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/
_______________________________________________________
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
#   OCF_RESKEY_kill_quit_timeout: Number of times to try forcible 
#                                 stop methods
#
#   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>

<parameter name="kill_quit_timeout" unique="0">
<longdesc lang="en">
On a stop action, if a normal stop method ends up with a failure,
more forcible methods are taken. These methods are repeated the 
specified numbers by this parameter.
The default value is 10.
If every normal or forcible stop methods run into a failure,
the KILL signal is used as a final method to stop.
</longdesc>
<shortdesc>Number of times to try forcible stop methods</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 err "mutiple syslog-ng process for $CONFIGFILE"
        return $OCF_ERR_GENERIC
}

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

        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]: suspend 
syslog_ng by SIGQUIT ($lapse_sec/$KILL_QUIT_TIMEOUT)"
                pkill -QUIT -f "$PROCESS_PATTERN"
                # 2009/09/18 Nakahira
                # Add timeout procedure 
                if [ $lapse_sec -ge $KILL_QUIT_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 and tries kill QUIT for $KILL_QUIT_TIMEOUT seconds.
        # The stop timeout of RA should be
        # longer than $KILL_TERM_TIMEOUT + $KILL_QUIT_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

KILL_QUIT_TIMEOUT="${OCF_RESKEY_kill_quit_timeout-10}"
if ! ocf_is_decimal "$KILL_QUIT_TIMEOUT"; then
        ocf_log err "Invalid value:kill_quit_timeout:$KILL_QUIT_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