From owner-freebsd-stable Tue Dec 7 14:16:20 1999 Delivered-To: freebsd-stable@freebsd.org Received: from modemcable156.106-200-24.mtl.mc.videotron.net (modemcable126.102-200-24.mtl.mc.videotron.net [24.200.102.126]) by hub.freebsd.org (Postfix) with SMTP id CD6FC14A09 for ; Tue, 7 Dec 1999 14:15:54 -0800 (PST) (envelope-from patrick@mindstep.com) Received: (qmail 91459 invoked from network); 7 Dec 1999 22:15:53 -0000 Received: from patrak.local.mindstep.com (HELO patrak) (192.168.10.4) by jacuzzi.local.mindstep.com with SMTP; 7 Dec 1999 22:15:53 -0000 Message-ID: <00bc01bf4100$a00ee780$040aa8c0@local.mindstep.com> From: "Patrick Bihan-Faou" To: "\"Sean O'Connell\"" Cc: References: <19991207093048.W1667@stat.Duke.EDU> Subject: Re: /sbin/dhclient-script and llinfo error Date: Tue, 7 Dec 1999 17:15:52 -0500 Organization: MindStep Corporation MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_00B9_01BF40D6.B6FD5D20" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.00.2919.6600 X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2919.6600 Sender: owner-freebsd-stable@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG This is a multi-part message in MIME format. ------=_NextPart_000_00B9_01BF40D6.B6FD5D20 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Hi, I wrote a replacement for "/sbin/dhclient-script". I had a couple of issues with the existing one and I needed to be able to call some scripts whenever the state of the interfaced changed because of DHCP. Anyway, the old script was buggy and obscure (to say the least) so here is a new version. Following your suggestion, I disabled all call to "route add xxx 127.0.0.1". I will submit this script in a PR later today, in the mean time, try it and let me know how it goes... Patrick. -- www.mindstep.com ------=_NextPart_000_00B9_01BF40D6.B6FD5D20 Content-Type: application/octet-stream; name="dhclient-script" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="dhclient-script" #!/bin/sh #########################################################################= #### # # (c) 1999, MindStep Corporation. 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. # 3. All advertising materials mentioning features or use of this = software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its = contributors # may be used to endorse or promote products derived from this = software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. # #########################################################################= #### # # This script was written by Patrick Bihan-Faou, patrick@mindstep.com, # Please contact us for bug reports, etc. # #########################################################################= #### # Rev: $Id: dhclient-script.sh,v 1.8 1999/12/07 22:11:08 patrick Exp $ # $MindStep_Tag: CONTRIB_19991207 $ #########################################################################= #### #########################################################################= #### # hook functions prototypes # # The "pre_state_XXX_hook" functions are called before the main # work is done for the state XXX # # The "post_state_XXX_hook" functions are called after the main # work is done for the state XXX # # These functions are meant to be overridden by the user's # dhclient-enter-hooks file #########################################################################= #### pre_state_MEDIUM_hook () { } pre_state_PREINIT_hook () { } pre_state_ARPCHECK_hook () { } pre_state_ARPSEND_hook () { } pre_state_RENEW_hook () { } pre_state_REBIND_hook () { } pre_state_BOUND_hook () { } pre_state_REBOOT_hook () { } pre_state_EXPIRE_hook () { } pre_state_FAIL_hook () { } pre_state_TIMEOUT_hook () { } post_state_MEDIUM_hook () { } post_state_PREINIT_hook () { } post_state_ARPCHECK_hook () { } post_state_ARPSEND_hook () { } post_state_RENEW_hook () { } post_state_REBIND_hook () { } post_state_BOUND_hook () { } post_state_REBOOT_hook () { } post_state_EXPIRE_hook () { } post_state_FAIL_hook () { } post_state_TIMEOUT_hook () { } #########################################################################= #### # make_resolv_conf # # This function is called to update the information related to the # DNS configuration (the resolver part) #########################################################################= #### make_resolv_conf ()=20 { echo search $new_domain_name >/etc/resolv.conf for nameserver in $new_domain_name_servers; do echo nameserver $nameserver >>/etc/resolv.conf done } # Must be used on exit. Invokes the local dhcp client exit hooks, if = any. exit_with_hooks () { exit_status=3D$1 if [ -x /etc/dhclient-exit-hooks ]; then . /etc/dhclient-exit-hooks fi # probably should do something with exit status of the local script return $exit_status } #########################################################################= #### # set_XXX # unset_XXX # # These function each deal with one particular setting. # They are OS dependent and may be overridden in the=20 # dhclient-enter-hooks file if needed. # # These functions are called with either "new" or "old" to indicate = which # set of variables to use (new_ip_address or old_ip_address...) # #########################################################################= #### update_hostname () { local current_hostname=3D`/bin/hostname` if [ "$current_hostname" =3D "" ] || \ [ "$current_hostname" =3D "$old_host_name" ] then if [ "$new_host_name" !=3D "$old_host_name" ] then $LOGGER "New Hostname: $new_host_name" hostname $new_host_name fi fi } set_ip_address ()=20 { local ip local mask local bcast if [ $# -lt 1 ] then return 1 fi eval ip=3D"\$${1}_ip_address" eval mask=3D"\$${1}_subnet_mask" eval bcast=3D"\$${1}_broadcast_address" if [ "$ip" !=3D "" ] then ifconfig $interface inet $ip netmask $mask broadcast $bcast $medium # route add $ip 127.0.0.1 > /dev/null 2>&1 fi } unset_ip_address ()=20 { local ip if [ $# -lt 1 ] then return 1 fi eval ip=3D"\$${1}_ip_address" if [ "$ip" !=3D "" ] then ifconfig $interface inet -alias $ip $medium # route delete $ip 127.0.0.1 > /dev/null 2>&1 fi } set_ip_alias ()=20 { if [ "$alias_ip_address" !=3D "" ] then ifconfig $interface inet alias $alias_ip_address netmask = $alias_subnet_mask # route add $alias_ip_address 127.0.0.1 fi } unset_ip_alias ()=20 { if [ "$alias_ip_address" !=3D "" ] then ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1 # route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 fi } set_routers ()=20 { local router_list if [ $# -lt 1 ] then return 1 fi eval router_list=3D"\$${1}_routers" for router in $router_list do route add default $router >/dev/null 2>&1 done } unset_routers ()=20 { local router_list if [ $# -lt 1 ] then return 1 fi eval router_list=3D"\$${1}_routers" for router in $router_list do route delete default $router >/dev/null 2>&1 done } set_static_routes ()=20 { local static_routes if [ $# -lt 1 ] then return 1 fi eval static_routes=3D"\$${1}_static_routes" set static_routes while [ $# -ge 2 ] do $LOGGER "New Static Route: $1 -> $2" route add $1 $2 shift; shift done } unset_static_routes ()=20 { local static_routes if [ $# -lt 1 ] then return 1 fi eval static_routes=3D"\$${1}_static_routes" set static_routes while [ $# -ge 2 ] do route delete $1 $2 shift; shift done } #########################################################################= #### # # utility functions grouping what needs to be done in logical units. # #########################################################################= #### set_all () { set_ip_address new set_routers new set_static_routes new if [ "$new_ip_address" !=3D "$alias_ip_address" ] then set_ip_alias fi } set_others () { update_hostname make_resolv_conf } clear_arp_table ()=20 { arp -d -a } unset_all () { if [ "$alias_ip_address" !=3D "$old_ip_address" ] then unset_ip_alias fi if [ "$old_ip_address" !=3D "" ]=20 then unset_ip_address old unset_routers old unset_static_routes old clear_arp_table fi } test_new_lease ()=20 { local rc set $new_routers if [ $# -ge 1 ] then set_ip_address new if ping -q -c 1 $1 then rc=3D0 else rc=3D1 fi unset_ip_address new else rc=3D1 fi return $rc } #########################################################################= #### # Main State functions. # # There is a state function for each state of the DHCP client # These functions are OS specific and should be be tampered with. #########################################################################= #### in_state_MEDIUM ()=20 { ifconfig $interface $medium ifconfig $interface inet -alias 0.0.0.0 $medium >/dev/null 2>&1 sleep 1 exit_status=3D0 } in_state_PREINIT ()=20 { unset_ip_alias ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \ broadcast 255.255.255.255 up exit_status=3D0 } in_state_ARPCHECK ()=20 { exit_status=3D0 } in_state_ARPSEND ()=20 { exit_status=3D0 } in_state_RENEW ()=20 { if [ "$old_ip_address" !=3D "$new_ip_address" ] then unset_all set_all fi set_others } in_state_REBIND () { in_state_RENEW } in_state_BOUND () { unset_all set_all set_others } in_state_REBOOT () { in_state_BOUND } in_state_EXPIRE ()=20 { unset_all set_ip_alias exit_status=3D0 } in_state_FAIL () { in_state_EXPIRE } in_state_TIMEOUT ()=20 { unset_all if test_new_lease then set_all set_others else $LOGGER "No good lease information in TIMEOUT state"=09 set_ip_alias exit_status=3D1 fi } #########################################################################= #### # Main functions: # # dhclient_script_init() parses the optional "enter_hooks" script which = can # override any of the state functions # # This function also parses the variables and notifies the detected = changes. #########################################################################= #### dhclient_script_init () { if [ -x /usr/bin/logger ]; then LOGGER=3D"/usr/bin/logger -s -p user.notice -t dhclient" else LOGGER=3Decho fi # Invoke the local dhcp client enter hooks, if they exist. if [ -x /etc/dhclient-enter-hooks ] then exit_status=3D0 . /etc/dhclient-enter-hooks # allow the local script to abort processing of this state # local script must set exit_status variable to nonzero. if [ $exit_status -ne 0 ] then exit $exit_status fi fi if [ "$new_network_number" !=3D "" ] then $LOGGER "New Network Number: $new_network_number" fi if [ "$new_ip_address" !=3D "" ] then $LOGGER "New IP Address: $new_ip_address" fi if [ "$new_broadcast_address" !=3D "" ] then $LOGGER "New Broadcast Address: $new_broadcast_address" fi if [ "$new_subnet_mask" !=3D "" ] then $LOGGER "New Subnet Mask for $interface: $new_subnet_mask" fi if [ "$alias_subnet_mask" !=3D "" ] then fi } #########################################################################= #### # dhclient_main() does the appropriate work depending on the state of # the dhcp client #########################################################################= #### dhclient_script_main () { # set -x exit_status=3D0 case $reason in MEDIUM|\ PREINIT|\ ARPCHECK|\ ARPSEND|\ RENEW|\ REBIND|\ BOUND|\ REBOOT|\ EXPIRE|\ FAIL|\ TIMEOUT) pre_state_${reason}_hook in_state_${reason} post_state_${reason}_hook ;; *) $LOGGER "dhclient-script called with invalid reason $reason" exit_status=3D1 ;; esac exit_with_hooks $exit_status } #########################################################################= #### # Let's do the work... #########################################################################= #### dhclient_script_init dhclient_script_main exit $exit_status #########################################################################= #### # That's all folks #########################################################################= #### ------=_NextPart_000_00B9_01BF40D6.B6FD5D20-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-stable" in the body of the message