Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Dec 1999 17:15:52 -0500
From:      "Patrick Bihan-Faou" <patrick@mindstep.com>
To:        "\"Sean O'Connell\"" <sean@stat.Duke.EDU>
Cc:        <freebsd-stable@FreeBSD.ORG>
Subject:   Re: /sbin/dhclient-script and llinfo error
Message-ID:  <00bc01bf4100$a00ee780$040aa8c0@local.mindstep.com>
References:  <19991207093048.W1667@stat.Duke.EDU>

next in thread | previous in thread | raw e-mail | index | archive | help
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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?00bc01bf4100$a00ee780$040aa8c0>