[Linux-ha-dev] squid ocf script available?
Takenaka Kazuhiro
takenaka.kazuhiro at oss.ntt.co.jp
Thu Oct 30 20:33:57 MDT 2008
Hi, Dejan
> Has this been tested and in use?
I tested 'Squid' ocf agent several months ago
in the following situation.
2 nodes ACT/SBY cluster with
Redhat Enterprise Linux 4.5(X86_64)
Heartbeat 2.1.2
squid 2.5
I verified the following actions.
* The agent can start squid with start of Heartbeat.
* The agent can stop squid with stop of Heartbeat.
* The agent can detect an error when squid process was killed,
and can restart squid at the SBY node.
> Can we add it to the repository?
Yes, you can. I'll be grad if you do so.
Dejan Muhamedagic wrote:
> Hi,
>
> On Thu, Oct 30, 2008 at 04:54:26PM +0900, Takenaka Kazuhiro wrote:
>> Hi,
>>
>>> But is it under the GPL? For me it does not look like that. So I can't
>>> fix/change things and publish them again?
>> Sorry. I forgot to put the GPL notification into the script.
>>
>> Use the attached script instead of the previous one.
>
> Has this been tested and in use? Can we add it to the repository?
>
> Thanks,
>
> Dejan
>
>> Achim Stumpf wrote:
>>> Hi,
>>>
>>> Thanks for the script:
>>>
>>> #!/bin/sh
>>> #
>>> # Description: Manages a Squid Server provided by NTT OSSC as an #
>>> OCF High-Availability resource under Heartbeat/LinuxHA control
>>> #
>>> # Copyright (c) 2008 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
>>> #
>>> #######################################################################
>>>
>>> But is it under the GPL? For me it does not look like that. So I can't
>>> fix/change things and publish them again?
>>>
>>>
>>> regards,
>>>
>>> Achim
>>>
>>>
>>>
>>> Takenaka Kazuhiro wrote:
>>>> Hi, Achim Stumpf
>>>>
>>>> I made the squid resource agent several months before.
>>>> Attached script is it.
>>>>
>>>> If you are interested in this, give it a try.
>>>>
>>>> Achim Stumpf wrote:
>>>>> Hi,
>>>>>
>>>>> Is there already any squid resource agent?
>>>>>
>>>>> At least I haven't found anything in:
>>>>>
>>>>> http://hg.linux-ha.org/dev/file/4a47778b2ca9/resources/OCF/
>>>>>
>>>>>
>>>>> If not I will write one... ;o)
>>>>>
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Achim
>>>>> _______________________________________________________
>>>>> Linux-HA-Dev: Linux-HA-Dev at 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 at 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 at lists.linux-ha.org
>>> http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
>>> Home Page: http://linux-ha.org/
>>>
>> --
>> Takenaka Kazuhiro <takenaka.kazuhiro at oss.ntt.co.jp>
>
>> #!/bin/sh
>> #
>> # Description: Manages a Squid Server 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.
>> #
>> # Copyright (c) 2008 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
>> #
>> #######################################################################
>> # OCF parameters:
>> # OCF_RESKEY_squid_exe : Executable file
>> # OCF_RESKEY_squid_conf : Configuration file
>> # OCF_RESKEY_squid_pidfile: Process id file
>> # OCF_RESKEY_squid_port : Port number
>> # OCF_RESKEY_debug_mode : Debug mode
>> # OCF_RESKEY_debug_log : Debug log file
>> # OCF_RESKEY_squid_stop_timeout:
>> # Number of seconds to await to confirm a
>> # normal stop method
>> #
>> # OCF_RESKEY_squid_exe, OCF_RESKEY_squid_conf, OCF_RESKEY_squid_pidfile
>> # and OCF_RESKEY_squid_port must be specified. Each of the rests
>> # has its default value or refers OCF_RESKEY_squid_conf to make
>> # its value when no explicit value is given.
>> ###############################################################################
>>
>> . ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
>>
>> usage()
>> {
>> cat <<-!
>> usage: $0 action
>>
>> action:
>> start : start a new squid instance
>>
>> stop : stop the running squid instance
>>
>> status : return the status of squid, run or down
>>
>> monitor : return TRUE if the squid appears to be working.
>>
>> meta-data : show meta data message
>>
>> validate-all: validate the instance parameters
>> !
>> return $OCF_ERR_ARGS
>> }
>>
>> metadata_squid()
>> {
>> cat <<END
>> <?xml version="1.0"?>
>> <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
>> <resource-agent name="Squid">
>> <version>1.0</version>
>>
>> <longdesc lang="en">
>> The resource agent of Squid.
>> This manages a Squid instance as an HA resource.
>> </longdesc>
>> <shortdesc lang="en">The RA of Squid</shortdesc>
>>
>> <parameters>
>>
>> <parameter name="squid_exe" required="1" unique="0">
>> <longdesc lang="en">
>> This is a required parameter. This parameter specifies squid's
>> executable file.
>> </longdesc>
>> <shortdesc>Executable file</shortdesc>
>> <content type="string" default=""/>
>> </parameter>
>>
>> <parameter name="squid_conf" required="1" unique="1">
>> <longdesc lang="en">
>> This is a required parameter. This parameter specifies a configuration file
>> for a squid instance managed by this RA.
>> </longdesc>
>> <shortdesc>Configuration file</shortdesc>
>> <content type="string" default=""/>
>> </parameter>
>>
>> <parameter name="squid_pidfile" required="1" unique="1">
>> <longdesc lang="en">
>> This is a required parameter. This parameter specifies a process id file
>> for a squid instance managed by this RA.
>> </longdesc>
>> <shortdesc>Pidfile</shortdesc>
>> <content type="string" default=""/>
>> </parameter>
>>
>> <parameter name="squid_port" required="1" unique="1">
>> <longdesc lang="en">
>> This is a required parameter. This parameter specifies a port number
>> for a squid 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="squid_stop_timeout" unique="0">
>> <longdesc lang="en">
>> This is an omittable parameter.
>> On a stop action, a normal stop method is firstly used.
>> and then the confirmation of its completion is awaited 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="debug_mode" unique="0">
>> <longdesc lang="en">
>> This is an optional parameter.
>> This RA runs in debug mode when this parameter includes 'x' or 'v'.
>> If 'x' is included, both of STDOUT and STDERR redirect to the logfile
>> specified by "debug_log", and then the builtin shell option 'x' is turned on.
>> It is similar about 'v'.
>> </longdesc>
>> <shortdesc>Debug mode</shortdesc>
>> <content type="string" default=""/>
>> </parameter>
>>
>> <parameter name="debug_log" unique="0">
>> <longdesc lang="en">
>> This is an optional and omittable parameter.
>> This parameter specifies a destination file for debug logs
>> and works only if this RA run in debug mode. Refer to "debug_mode"
>> about debug mode. If no value is given but it's requied, it's made by the
>> following rules: "/var/log/" as a directory part, the basename of
>> the configuration file given by "syslog_ng_conf" as a basename part,
>> ".log" as a suffix.
>> </longdesc>
>> <shortdesc>A destination of the debug log</shortdesc>
>> <content type="string" default=""/>
>> </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="10s" />
>> <action name="meta-data" timeout="5s" />
>> <action name="validate-all" timeout="5"/>
>> </actions>
>> </resource-agent>
>> END
>>
>> return $OCF_SUCCESS
>> }
>>
>> get_pids()
>> {
>> SQUID_PIDS=( )
>>
>> # Seek by pattern
>> SQUID_PIDS[0]=$(pgrep -f "$PROCESS_PATTERN")
>>
>> # Seek by pidfile
>> SQUID_PIDS[1]=$(awk '1{print $1}' $SQUID_PIDFILE 2>/dev/null)
>>
>> if [[ -n "${SQUID_PIDS[1]}" ]]; then
>> typeset exe
>> exe=$(ls -l "/proc/${SQUID_PIDS[1]}/exe")
>> if [[ $? = 0 ]]; then
>> exe=${exe##*-> }
>> if ! [[ "$exe" = $SQUID_EXE ]]; then
>> SQUID_PIDS[1]=""
>> fi
>> else
>> SQUID_PIDS[1]=""
>> fi
>> fi
>>
>> # Seek by port
>> SQUID_PIDS[2]=$(
>> netstat -apn |
>> awk '/tcp.*[0-9]+\.[0-9]+\.+[0-9]+\.[0-9]+:'$SQUID_PORT'/{
>> sub("\\/.*", "", $7); print $7; exit}')
>> }
>>
>> are_all_pids_found()
>> {
>> if
>> [[ -n "${SQUID_PIDS[0]}" ]] &&
>> [[ -n "${SQUID_PIDS[1]}" ]] &&
>> [[ -n "${SQUID_PIDS[2]}" ]]
>> then
>> return 0
>> else
>> return 1
>> fi
>> }
>>
>> are_pids_sane()
>> {
>> if [[ "${SQUID_PIDS[1]}" = "${SQUID_PIDS[2]}" ]]; then
>> return $OCF_SUCCESS
>> else
>> ocf_log err "$SQUID_NAME:Pid unmatch"
>> return $OCF_ERR_GENERIC
>> fi
>> }
>>
>> is_squid_dead()
>> {
>> if
>> [[ -z "${SQUID_PIDS[0]}" ]] &&
>> [[ -z "${SQUID_PIDS[2]}" ]]
>> then
>> return 0
>> else
>> return 1
>> fi
>> }
>>
>> monitor_squid()
>> {
>> typeset trialcount=0
>>
>> while true; do
>> get_pids
>>
>> if are_all_pids_found; then
>> are_pids_sane
>> return $OCF_SUCCESS
>> fi
>>
>> if is_squid_dead; then
>> return $OCF_NOT_RUNNING
>> fi
>>
>> ocf_log info "$SQUID_NAME:Inconsistent processes:" \
>> "${SQUID_PIDS[0]},${SQUID_PIDS[1]},${SQUID_PIDS[2]}"
>> (( trialcount = trialcount + 1 ))
>> if (( trialcount > SQUID_CONFIRM_TRIALCOUNT )); then
>> ocf_log err "$SQUID_NAME:Inconsistency of processes remains unsolved"
>> return $OCF_ERR_GENERIC
>> fi
>> sleep 1
>> done
>> }
>>
>> start_squid()
>> {
>> typeset status
>>
>> monitor_squid
>> status=$?
>>
>> if [[ $status != $OCF_NOT_RUNNING ]]; then
>> return $status
>> fi
>>
>> set -- "$SQUID_OPTS"
>> ocf_run $SQUID_EXE -f "$SQUID_CONF" "$@"
>> status=$?
>> if [[ $status != $OCF_SUCCESS ]]; then
>> return $status
>> fi
>>
>> while true; do
>> get_pids
>> if are_all_pids_found && are_pids_sane; then
>> return $OCF_SUCCESS
>> fi
>> ocf_log info "$SQUID_NAME:Waiting for squid to be invoked"
>> sleep 1
>> done
>>
>> return $OCF_ERR_GENERIC
>> }
>>
>> stop_squid()
>> {
>> typeset lapse_sec
>>
>> if ocf_run $SQUID_EXE -f $SQUID_CONF -k shutdown; then
>> lapse_sec=0
>> while true; do
>> get_pids
>> if is_squid_dead; then
>> rm -f $SQUID_PIDFILE
>> return $OCF_SUCCESS
>> fi
>> (( lapse_sec = lapse_sec + 1 ))
>> if (( lapse_sec > SQUID_STOP_TIMEOUT )); then
>> break
>> fi
>> sleep 1
>> ocf_log info "$SQUID_NAME:$FUNCNAME:$LINENO: " \
>> "stop NORM $lapse_sec/$SQUID_STOP_TIMEOUT"
>> done
>> fi
>>
>> while true; do
>> get_pids
>> ocf_log info "$SQUID_NAME:$FUNCNAME:$LINENO: " \
>> "try to stop by SIGKILL:${SQUID_PIDS[0]} ${SQUID_PIDS[2]}"
>> kill -KILL ${SQUID_PIDS[0]} ${SQUID_PIDS[2]}
>> sleep 1
>> if is_squid_dead; then
>> rm -f $SQUID_PIDFILE
>> return $OCF_SUCCESS
>> fi
>> done
>>
>> return $OCF_ERR_GENERIC
>> }
>>
>> status_squid()
>> {
>> return $OCF_SUCCESS
>> }
>>
>>
>> validate_all_squid()
>> {
>> ocf_log info "validate_all_squid[$SQUID_NAME]"
>> return $OCF_SUCCESS
>> }
>>
>> : === Debug ${0##*/} $1 ===
>>
>> if [[ "$1" = "meta-data" ]]; then
>> metadata_squid
>> exit $?
>> fi
>>
>> SQUID_CONF="${OCF_RESKEY_squid_conf}"
>> if [[ -z "$SQUID_CONF" ]]; then
>> ocf_log err "SQUID_CONF is not defined"
>> exit $OCF_ERR_CONFIGURED
>> fi
>>
>> SQUID_NAME="${SQUID_CONF##*/}"
>> SQUID_NAME="${SQUID_NAME%.*}"
>>
>> DEBUG_LOG="${OCF_RESKEY_debug_log-/var/log/squid_${SQUID_NAME}_debug}.log"
>>
>> DEBUG_MODE=""
>> case $OCF_RESKEY_debug_mode in
>> *x*) DEBUG_MODE="${DEBUG_MODE}x";;
>> esac
>> case $OCF_RESKEY_debug_mode in
>> *v*) DEBUG_MODE="${DEBUG_MODE}v";;
>> esac
>>
>> if [ -n "$DEBUG_MODE" ]; then
>> PS4='\d \t \h '"${1-unknown} "
>> export PS4
>> exec 1>>$DEBUG_LOG 2>&1
>> set -$DEBUG_MODE
>> fi
>>
>> SQUID_EXE="${OCF_RESKEY_squid_exe}"
>> if [[ -z "$SQUID_EXE" ]]; then
>> ocf_log err "SQUID_EXE is not defined"
>> exit $OCF_ERR_CONFIGURED
>> fi
>> if [[ ! -x "$SQUID_EXE" ]]; then
>> ocf_log err "$SQUID_EXE is not found"
>> exit $OCF_ERR_CONFIGURED
>> fi
>>
>> SQUID_PIDFILE="${OCF_RESKEY_squid_pidfile}"
>> if [[ -z "$SQUID_PIDFILE" ]]; then
>> ocf_log err "SQUID_PIDFILE is not defined"
>> exit $OCF_ERR_CONFIGURED
>> fi
>>
>> SQUID_PORT="${OCF_RESKEY_squid_port}"
>> if [[ -z "$SQUID_PORT" ]]; then
>> ocf_log err "SQUID_PORT is not defined"
>> exit $OCF_ERR_CONFIGURED
>> fi
>>
>> SQUID_OPTS="${OCF_RESKEY_squid_opts}"
>>
>> SQUID_PIDS=( )
>>
>> SQUID_CONFIRM_TRIALCOUNT="${OCF_RESKEY_squid_confirm_trialcount-3}"
>>
>> SQUID_STOP_TIMEOUT="${OCF_RESKEY_squid_stop_timeout-5}"
>> SQUID_SUSPEND_TRIALCOUNT="${OCF_RESKEY_squid_suspend_trialcount-10}"
>>
>> PROCESS_PATTERN="$SQUID_EXE -f $SQUID_CONF"
>>
>> COMMAND=$1
>>
>> case "$COMMAND" in
>> start)
>> ocf_log debug "[$SQUID_NAME] Enter squid start"
>> start_squid
>> func_status=$?
>> ocf_log debug "[$SQUID_NAME] Leave squid start $func_status"
>> exit $func_status
>> ;;
>> stop)
>> ocf_log debug "[$SQUID_NAME] Enter squid stop"
>> stop_squid
>> func_status=$?
>> ocf_log debug "[$SQUID_NAME] Leave squid stop $func_status"
>> exit $func_status
>> ;;
>> status)
>> status_squid
>> exit $?
>> ;;
>> monitor)
>> #ocf_log debug "[$SQUID_NAME] Enter squid monitor"
>> monitor_squid
>> func_status=$?
>> #ocf_log debug "[$SQUID_NAME] Leave squid monitor $func_status"
>> exit $func_status
>> ;;
>> validate-all)
>> validate_all_squid
>> exit $?
>> ;;
>> *)
>> usage
>> ;;
>> esac
>>
>> # vim: set sw=4 ts=4 :
>>
>
>> _______________________________________________________
>> Linux-HA-Dev: Linux-HA-Dev at 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 at lists.linux-ha.org
> http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
> Home Page: http://linux-ha.org/
>
--
Takenaka Kazuhiro <takenaka.kazuhiro at oss.ntt.co.jp>
NTT Open Source Software Center
More information about the Linux-HA-Dev
mailing list