290 lines
6.4 KiB
Bash
Executable File
290 lines
6.4 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# $NetBSD: dhclient-script,v 1.5 2002/05/28 15:04:01 christos Exp $
|
|
|
|
ENTERHOOKS=/etc/dhclient-enter-hooks
|
|
EXITHOOKS=/etc/dhclient-exit-hooks
|
|
RESOLV=/etc/resolv.conf
|
|
SIGNATURE="# Created by dhclient at: "
|
|
|
|
make_resolv_conf() {
|
|
if [ ! -z "$new_domain_name_servers" ]; then
|
|
if [ -f $RESOLV ]
|
|
then
|
|
while read line; do
|
|
case $line in
|
|
"$SIGNATURE"*)
|
|
;;
|
|
*)
|
|
mv $RESOLV $RESOLV.save;;
|
|
esac
|
|
break
|
|
done < $RESOLV
|
|
fi
|
|
echo "$SIGNATURE$(date)" > $RESOLV
|
|
if [ ! -z "$new_domain_name" ]
|
|
then
|
|
echo search $new_domain_name >> $RESOLV
|
|
fi
|
|
for nameserver in $new_domain_name_servers; do
|
|
echo nameserver $nameserver
|
|
done >> $RESOLV
|
|
fi
|
|
}
|
|
|
|
restore_resolv_conf() {
|
|
if [ -f $RESOLV.save -a -f $RESOLV ]
|
|
then
|
|
while read line; do
|
|
case $line in
|
|
"$SIGNATURE"*)
|
|
mv $RESOLV.save $RESOLV;;
|
|
esac
|
|
break
|
|
done < $RESOLV
|
|
fi
|
|
}
|
|
|
|
# Must be used on exit. Invokes the local dhcp client exit hooks, if any.
|
|
exit_with_hooks() {
|
|
exit_status=$1
|
|
if [ -f "$EXITHOOKS" ]; then
|
|
. "$EXITHOOKS"
|
|
fi
|
|
# probably should do something with exit status of the local script
|
|
exit $exit_status
|
|
}
|
|
|
|
|
|
add_new_routes() {
|
|
for router in $new_routers; do
|
|
route add default $router
|
|
done >/dev/null 2>&1
|
|
|
|
set -- $new_static_routes
|
|
while [ $# -gt 1 ]; do
|
|
route add $0 $1
|
|
shift; shift
|
|
done
|
|
}
|
|
|
|
delete_old_routes() {
|
|
for router in $old_routers; do
|
|
route delete default $router
|
|
done >/dev/null 2>&1
|
|
|
|
set -- $old_static_routes
|
|
while [ $# -gt 1 ]; do
|
|
route delete $1 $2
|
|
shift; shift
|
|
done
|
|
|
|
arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -n -d \1/p' | sh
|
|
}
|
|
|
|
# Invoke the local dhcp client enter hooks, if they exist.
|
|
if [ -f $ENTERHOOKS ]; then
|
|
exit_status=0
|
|
. $ENTERHOOKS
|
|
# 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 [ ! -z "$new_host_name" ]; then
|
|
echo New Host Name: $new_host_name
|
|
fi
|
|
|
|
if [ ! -z "$new_nis_domain" ]; then
|
|
echo New NIS Domain: $new_nis_domain
|
|
fi
|
|
|
|
if [ ! -z "$new_network_number" ]; then
|
|
echo New Network Number: $new_network_number
|
|
fi
|
|
|
|
if [ ! -z "$new_broadcast_address" ]; then
|
|
echo New Broadcast Address: $new_broadcast_address
|
|
new_broadcast_arg="broadcast $new_broadcast_address"
|
|
fi
|
|
|
|
if [ ! -z "$old_broadcast_address" ]; then
|
|
old_broadcast_arg="broadcast $old_broadcast_address"
|
|
fi
|
|
|
|
if [ ! -z "$new_subnet_mask" ]; then
|
|
new_netmask_arg="netmask $new_subnet_mask"
|
|
fi
|
|
|
|
if [ ! -z "$old_subnet_mask" ]; then
|
|
old_netmask_arg="netmask $old_subnet_mask"
|
|
fi
|
|
|
|
if [ ! -z "$alias_subnet_mask" ]; then
|
|
alias_subnet_arg="netmask $alias_subnet_mask"
|
|
fi
|
|
|
|
case "$reason" in
|
|
MEDIUM)
|
|
eval "ifconfig $interface $medium"
|
|
eval "ifconfig $interface inet -alias 0.0.0.0 $medium" >/dev/null 2>&1
|
|
|
|
sleep 1
|
|
|
|
exit_with_hooks 0
|
|
;;
|
|
|
|
PREINIT)
|
|
if [ ! -z "$alias_ip_address" ]; 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
|
|
|
|
ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \
|
|
broadcast 255.255.255.255 up
|
|
|
|
exit_with_hooks 0
|
|
;;
|
|
|
|
ARPCHECK|ARPSEND)
|
|
exit_with_hooks 0
|
|
;;
|
|
|
|
BOUND|RENEW|REBIND|REBOOT)
|
|
if [ ! -z "$new_nis_domain" ]; then
|
|
if type domainname > /dev/null 2>&1; then
|
|
domainname $new_nis_domain
|
|
fi
|
|
fi
|
|
|
|
if type hostname > /dev/null 2>&1; then
|
|
if [ \( -z "$current_hostname" \) -o \
|
|
\( "x$new_host_name" = "x$old_hostname" \) ]; then
|
|
current_hostname=`hostname`
|
|
fi
|
|
if [ \( -z "$current_hostname" \) -o \
|
|
\( "x$new_host_name" != "x$old_hostname" \) ]; then
|
|
hostname $new_host_name
|
|
fi
|
|
fi
|
|
|
|
if [ \( ! -z "$old_ip_address" \) -a \( ! -z "$alias_ip_address" \) -a \
|
|
\( "x$alias_ip_address" != "x$old_ip_address" \) ]; 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
|
|
|
|
if [ \( ! -z "$old_ip_address" \) -a \
|
|
\( "x$old_ip_address" != "x$new_ip_address" \) ]; then
|
|
eval "ifconfig $interface inet -alias $old_ip_address $medium"
|
|
route delete $old_ip_address 127.0.0.1 >/dev/null 2>&1
|
|
|
|
delete_old_routes
|
|
fi
|
|
|
|
if [ \( -z "$old_ip_address" \) -o \
|
|
\( "x$old_ip_address" != "x$new_ip_address" \) -o \
|
|
\( "x$reason" = "xBOUND" \) -o \( "x$reason" = "xREBOOT" \) ]; then
|
|
eval "ifconfig $interface inet $new_ip_address \
|
|
$new_netmask_arg $new_broadcast_arg $medium"
|
|
route add $new_ip_address 127.0.0.1 >/dev/null 2>&1
|
|
|
|
add_new_routes
|
|
fi
|
|
|
|
if [ \( ! -z "$alias_ip_address" \) -a \
|
|
\( "x$new_ip_address" != "x$alias_ip_address" \) ]; then
|
|
ifconfig $interface inet alias $alias_ip_address \
|
|
$alias_subnet_arg
|
|
route add $alias_ip_address 127.0.0.1
|
|
fi
|
|
make_resolv_conf
|
|
exit_with_hooks 0
|
|
;;
|
|
|
|
EXPIRE|FAIL|RELEASE|STOP)
|
|
if [ ! -z "$old_nis_domain" ]; then
|
|
if type domainname > /dev/null 2>&1; then
|
|
# delete the old nis domain name
|
|
domainname ""
|
|
fi
|
|
fi
|
|
|
|
if [ ! -z "$alias_ip_address" ]; then
|
|
ifconfig $interface inet -alias $alias_ip_address
|
|
route delete $alias_ip_address 127.0.0.1
|
|
fi > /dev/null 2>&1
|
|
|
|
if [ ! -z "$old_ip_address" ]; then
|
|
eval "ifconfig $interface inet -alias $old_ip_address $medium"
|
|
route delete $old_ip_address 127.0.0.1 >/dev/null 2>&1
|
|
delete_old_routes
|
|
|
|
fi
|
|
|
|
if [ ! -z "$alias_ip_address" ]; then
|
|
ifconfig $interface inet alias $alias_ip_address \
|
|
$alias_subnet_arg
|
|
route add $alias_ip_address 127.0.0.1
|
|
fi
|
|
|
|
restore_resolv_conf
|
|
exit_with_hooks 0
|
|
;;
|
|
|
|
TIMEOUT)
|
|
if [ ! -z "$alias_ip_address" ]; then
|
|
ifconfig $interface inet -alias $alias_ip_address
|
|
route delete $alias_ip_address 127.0.0.1
|
|
fi > /dev/null 2>&1
|
|
|
|
if [ ! -z "$new_host_name" ]; then
|
|
if type hostname > /dev/null 2>&1; then
|
|
hostname $new_host_name
|
|
fi
|
|
fi
|
|
|
|
if [ ! -z "$new_nis_domain" ]; then
|
|
if type domainname > /dev/null 2>&1; then
|
|
domainname $new_nis_domain
|
|
fi
|
|
fi
|
|
|
|
eval "ifconfig $interface inet $new_ip_address $new_netmask_arg \
|
|
$new_broadcast_arg $medium"
|
|
sleep 1
|
|
|
|
if [ ! -z "$new_routers" ]; then
|
|
set -- $new_routers
|
|
if ping -n -q -c 1 -w 1 $1; then
|
|
if [ \( ! -z "$alias_ip_address" \) -a \
|
|
\( "x$new_ip_address" != "x$alias_ip_address" \) ]
|
|
then
|
|
ifconfig $interface inet alias \
|
|
$alias_ip_address $alias_subnet_arg
|
|
route add $alias_ip_address 127.0.0.1
|
|
fi
|
|
|
|
route add $new_ip_address 127.0.0.1 >/dev/null 2>&1
|
|
|
|
add_new_routes
|
|
make_resolv_conf
|
|
exit_with_hooks 0
|
|
fi
|
|
fi
|
|
|
|
eval "ifconfig $interface inet -alias $new_ip_address $medium"
|
|
|
|
delete_old_routes
|
|
|
|
exit_with_hooks 1
|
|
;;
|
|
*)
|
|
exit_with_hooks 0
|
|
;;
|
|
esac
|