Date: Sun, 13 Jun 2010 08:57:02 GMT From: Olivier Cochard-Labbé <olivier@cochard.me> To: freebsd-gnats-submit@FreeBSD.org Subject: ports/147829: Improved ucarp startup script: multiple VHID and FIB support Message-ID: <201006130857.o5D8v2MA032083@www.freebsd.org> Resent-Message-ID: <201006130900.o5D909M6086523@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 147829 >Category: ports >Synopsis: Improved ucarp startup script: multiple VHID and FIB support >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: update >Submitter-Id: current-users >Arrival-Date: Sun Jun 13 09:00:08 UTC 2010 >Closed-Date: >Last-Modified: >Originator: Olivier Cochard-Labbé >Release: 8.0-STABLE >Organization: BSD Router Project >Environment: FreeBSD d630.bsdrp.net 8.0-STABLE FreeBSD 8.0-STABLE #70: Wed May 12 13:00:32 CEST 2010 root@d630.bsdrp.net:/usr/obj/usr/src/sys/DellD630 amd64 >Description: This proposal for a new ucarp rc script permit to start multiple ucarp for supporting multiple VHID and add FIB support. The rc.conf file should be configured like that: # uCarp # Virtual IP identifier range is 1-255 (ucarp_1 to ucarp_255) ucarp_enable="NO" # Enable ucarp # Here are an exemple for VHID number 1: ucarp_1_if="em0" # Set interface to use for ucarp checks ucarp_1_src="192.168.1.2" # Set source (real) IP address of that host ucarp_1_pass="passcarp" # Set password ucarp_1_preempt="NO" # Set it to "YES" to become a master as soon as possible ucarp_1_addr="192.168.1.1" # Set virtual shared IP address # ucarp_1_advbase: # Set advertisement frequency (seconds) # ucarp_1_advskew: # Set advertisement skew (0-255) # ucarp_1_upscript: # Run <file> to become a master # ucarp_1_downscript: # Run <file> to become a backup # ucarp_1_deadratio: # Set ratio to consider a host as dead ucarp_1_shutdown="NO" # Set it to "YES" to call shutdown script at exit ucarp_1_facility="daemon" # Set syslog facility ucarp_1_broadcast="NO" # Set it to "YES" to use broadcast in place of multicast ucarp_1_fib="NONE" # set the alternative routing table id that ucarp should use >How-To-Repeat: >Fix: Patch attached with submission follows: #!/bin/sh # # BSD Router Project: ucarp Init script with multiple VHID and FIB support # http://bsdrp.net # # Based on the FreeBSD ucarp script from Nico <nico@rottenbytes.info> # # Copyright (c) 2010, The BSDRP Development Team # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE PROJECT ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # PROVIDE: ucarp # REQUIRE: DAEMON # KEYWORD: shutdown # # Add the following lines to /etc/rc.conf to enable & configure ucarp: # # ucarp_enable (bool): Set it to "YES" to enable ucarp # Default is "NO". # For all others variable, VHID is the Virtual IP identifier number (1-255) # ucarp_VHID_if: Set interface to use for ucarp checks # Default is "eth0" # ucarp_VHID_src: Set source (real) IP address of that host # ucarp_VHID_pass: Set password # Default is "dumbp4ss" # ucarp_VHID_preempt (bool): Set it to "YES" to become a master as soon as possible # Default is "NO" # ucarp_VHID_addr: Set virtual shared IP address # ucarp_VHID_advbase: Set advertisement frequency (seconds) # ucarp_VHID_advskew: Set advertisement skew (0-255) # ucarp_VHID_upscript: Run <file> to become a master # ucarp_VHID_downscript: Run <file> to become a backup # ucarp_VHID_deadratio: Set ratio to consider a host as dead # ucarp_VHID_shutdown (bool): Set it to "YES" to call shutdown script at exit # Default is "YES" # ucarp_VHID_facility: Set syslog facility # Default is "daemon" # ucarp_VHID_broadcast (bool): Set it to "YES" to use Broadcast in place of multicast # Default is "NO" # ucarp_VHID_fib: The alternative routing table id that ucarp should use # Default is "NONE" . /etc/rc.subr name="ucarp" rcvar=`set_rcvar` command="/usr/local/sbin/$name" load_rc_config $name start_cmd="${name}_start" ucarp_start () { for i in `jot - 1 255`; do # Now we need to use a variable-variable name :-( # eval will help us, but all: # - non-variable-variable name # - " # must be escaped with \ eval " if ! [ -z \$ucarp_${i}_if ]; then # override these variables in /etc/rc.conf ucarp_${i}_pass=\${ucarp_${i}_pass:-\"dumbp4ss\"} ucarp_${i}_preempt=\${ucarp_${i}_preempt:-\"NO\"} ucarp_${i}_shutdown=\${ucarp_${i}_shutdown:-\"NO\"} ucarp_${i}_facility=\${ucarp_${i}_facility:-\"daemon\"} ucarp_${i}_broadcast=\${ucarp_${i}_broadcast:-\"NO\"} ucarp_${i}_fib=\${ucarp_${i}_fib:-\"NONE\"} if [ \"\${ucarp_${i}_fib}\" != \"NONE\" ]; then if ! [ `sysctl net.fibs >/dev/null 2>&1` ]; then command=\"setfib -F \${ucarp_${i}_fib} /usr/local/sbin/$name\" else echo \"FIB configured for VHID $i but FIB not enabled ! please enable it\" exit 1 fi fi command_args=\"-i \$ucarp_${i}_if -v $i -p \$ucarp_${i}_pass -f \$ucarp_${i}_facility -B \" if [ \$ucarp_${i}_preempt = \"YES\" ]; then command_args=\${command_args}\"-P \" fi if [ \$ucarp_${i}_shutdown = \"YES\" ]; then command_args=\${command_args}\"-z \" fi if [ \$ucarp_${i}_broadcast = \"YES\" ]; then command_args=\${command_args}\"-M \" fi # Mandatory arguments if [ -z \$ucarp_${i}_src ]; then echo \"source address is not set for VHID $i ! please set it\" exit 1 fi if [ -z \$ucarp_${i}_addr ]; then echo \"virtual address is not set for VHID $i ! please set it\" exit 1 fi command_args=\${command_args}\"-s \$ucarp_${i}_src -a \$ucarp_${i}_addr \" # Optional args if ! [ -z \$ucarp_${i}_upscript ]; then command_args=\${command_args}\"-u \$ucarp_${i}_upscript \" fi if ! [ -z \$ucarp_${i}_downscript ]; then command_args=\${command_args}\"-d \$ucarp_${i}_downscript \" fi if ! [ -z \$ucarp_${i}_deadratio ]; then command_args=\${command_args}\"-r \$ucarp_${i}_deadratio \" fi if ! [ -z \$ucarp_${i}_advbase ]; then command_args=\${command_args}\"-b \$ucarp_${i}_advbase \" fi if ! [ -z \$ucarp_${i}_advskew ]; then command_args=\${command_args}\"-k \$ucarp_${i}_advskew \" fi \$command \$command_args fi " done } run_rc_command "$1" >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201006130857.o5D8v2MA032083>