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).

Cheers,

Dejan

> Best Regards,
> NAKAHIRA Kazutomo
>
>
> Keisuke MORI wrote:
>> Hi Dejan,
>>
>> Thank you for your comments.
>> I will repost the RA after I revise it with your comments.
>>
>> Thanks,
>>
>> 2009/6/11 Dejan Muhamedagic <deja...@fastmail.fm>:
>>> Hi Keisuke-san,
>>>
>>> On Thu, Jun 11, 2009 at 06:16:26PM +0900, Keisuke MORI wrote:
>>>> Hi Dejan,
>>>>
>>>> Do you have any chance to take a look at the syslog-ng OCF RA which
>>>> was posted by Takenaka-san before?
>>>>
>>>> http://www.gossamer-threads.com/lists/linuxha/dev/54425
>>> Attaching the script with comments. Please use diff.
>>>
>>> Cheers,
>>>
>>> Dejan
>>>
>>>> If you are OK, I will commit this to the -dev repository.
>>>>
>>>> Thanks,
>>>> --
>>>> Keisuke MORI
>>>> _______________________________________________________
>>>> 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_exe    : Executable file
> #   OCF_RESKEY_configfile       : Configuration file
> #   OCF_RESKEY_start_opts       : Extra 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_exe" 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 extra options for a 
> syslog-ng instance managed by this RA. When no value is given, no extra 
> 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_exe-/sbin/syslog-ng}"
> # why not default to /sbin/syslog-ng?
> #if [[ -z "$SYSLOG_NG_EXE" ]]; then
> #     ocf_log err "Undefined parameter:syslog_ng_exe"
> #     exit $OCF_ERR_CONFIGURED
> #fi
> if [[ ! -x "$SYSLOG_NG_EXE" ]]; then
>       ocf_log err "Invalid value:syslog_ng_exe:$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_exe"  
> name="syslog_ng_exe"  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/

_______________________________________________________
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