I made some modifications to dhclient-script to support more options on some of my linux systems. Please incorporate these into the upstream version if you think they are reasonable. The mods were based on the debian package for 2.0b1pl6. I've attached the entire file, but here are the main points. 1. add support for setting and changing static routes through dhcp 2. set nisdomainname through dhcp 3. set hostname through dhcp Jim, I copied you because this isn't a direct reply to your email, but you may need the static route code. It sounded like "netstat -r" wasn't returning routes you set on your dhcp server, but the original dhclient-script I had ignored static route info. code excerpts: ============== function update_static_routes () { local action static_routes destination gateway action=$1 static_routes="$2 " # add space for easy looping while [ "$static_routes" ]; do destination=${static_routes%% *} static_routes=${static_routes#* } gateway=${static_routes%% *} static_routes=${static_routes#* } route $action $destination gw $gateway done } ... # don't need to test old values for domain/host # no problems if resetting them to identical value?? if [ x$new_nis_domain != x ]; then echo $new_nis_domain >/etc/defaultdomain nisdomainname `cat /etc/defaultdomain` fi if [ x$new_host_name != x ]; then echo $new_host_name >/etc/hostname hostname --file /etc/hostname fi # old and new static routes different? if [ "x$old_static_routes" != "x$new_static_routes" ]; then # delete old static routes if they existed if [ "x$old_static_routes" != "x" ]; then update_static_routes "del -net" "$old_static_routes" fi # add new static routes if they exist if [ "x$new_static_routes" != "x" ]; then update_static_routes "add -net" "$new_static_routes" fi fi -- Lee Bradshaw [EMAIL PROTECTED] (preferred) Alantro Communications leealantro.com
#!/bin/sh # dhclient-script for Linux. Dan Halbert, March, 1997. # No guarantees about this. I'm a novice at the details of Linux # networking. # Notes: # 0. This script is based on the netbsd script supplied with dhcp-970306. # 1. ifconfig down apparently deletes all relevant routes and flushes # the arp cache, so this doesn't need to be done explicitly. # 2. The alias address handling here has not been tested AT ALL. # I'm just going by the doc of modern Linux ip aliasing, which uses # notations like eth0:0, eth0:1, for each alias. # 3. I have to calculate the network address, and calculate the broadcast # address if it is not supplied. This might be much more easily done # by the dhclient C code, and passed on. # 4. TIMEOUT not tested. ping has a flag I don't know, and I'm suspicious # of the $1 in its args. function update_static_routes () { local action static_routes destination gateway action=$1 static_routes="$2 " # add space for easy looping while [ "$static_routes" ]; do destination=${static_routes%% *} static_routes=${static_routes#* } gateway=${static_routes%% *} static_routes=${static_routes#* } route $action $destination gw $gateway done } if [ x$new_broadcast_address != x ]; then new_broadcast_arg="broadcast $new_broadcast_address" fi if [ x$old_broadcast_address != x ]; then old_broadcast_arg="broadcast $old_broadcast_address" fi if [ x$new_subnet_mask != x ]; then new_subnet_arg="netmask $new_subnet_mask" fi if [ x$old_subnet_mask != x ]; then old_subnet_arg="netmask $old_subnet_mask" fi if [ x$alias_subnet_mask != x ]; then alias_subnet_arg="netmask $alias_subnet_mask" fi if [ x$reason = xMEDIUM ]; then # Linux doesn't do mediums (ok, ok, media). exit 0 fi if [ x$reason = xPREINIT ]; then if [ x$alias_ip_address != x ]; then # Bring down alias interface. Its routes will disappear too. ifconfig $interface:0- inet 0 fi ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \ broadcast 255.255.255.255 up # Add route to make broadcast work. Do not omit netmask. route add default dev $interface netmask 0.0.0.0 exit 0 fi if [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then exit 0; fi if [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \ [ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \ [ x$alias_ip_address != x$old_ip_address ]; then # Possible new alias. Remove old alias. ifconfig $interface:0- inet 0 fi if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ]; then # IP address changed. Bringing down the interface will delete all routes, # and clear the ARP cache. ifconfig $interface inet down fi if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \ [ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then ifconfig $interface inet $new_ip_address $new_subnet_arg \ $new_broadcast_arg # Add a network route to the computed network address. route add -net $new_network_number $new_subnet_arg dev $interface for router in $new_routers; do route add default gw $router done # don't need to test old values for domain/host # no problems if resetting them to identical value?? if [ x$new_nis_domain != x ]; then echo $new_nis_domain >/etc/defaultdomain nisdomainname `cat /etc/defaultdomain` fi if [ x$new_host_name != x ]; then echo $new_host_name >/etc/hostname hostname --file /etc/hostname fi # old and new static routes different? if [ "x$old_static_routes" != "x$new_static_routes" ]; then # delete old static routes if they existed if [ "x$old_static_routes" != "x" ]; then update_static_routes "del -net" "$old_static_routes" fi # add new static routes if they exist if [ "x$new_static_routes" != "x" ]; then update_static_routes "add -net" "$new_static_routes" fi fi fi if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ]; then ifconfig $interface:0- inet 0 ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg route add -host $alias_ip_address $interface:0 fi echo domain $new_domain_name >/etc/resolv.conf for nameserver in $new_domain_name_servers; do echo nameserver $nameserver >>/etc/resolv.conf done exit 0 fi if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ]; then if [ x$alias_ip_address != x ]; then # Turn off alias interface. ifconfig $interface:0- inet 0 fi if [ x$old_ip_address != x ]; then # Shut down interface, which will delete routes and clear arp cache. ifconfig $interface inet down fi if [ x$alias_ip_address != x ]; then ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg route add -host $alias_ip_address $interface:0 fi exit 0 fi if [ x$reason = xTIMEOUT ]; then if [ x$alias_ip_address != x ]; then ifconfig $interface:0- inet 0 fi ifconfig $interface inet $new_ip_address $new_subnet_arg \ $new_broadcast_arg set $new_routers ############## what is -w in ping? if ping -q -c 1 -w 1 $1; then if [ x$new_ip_address != x$alias_ip_address ] && \ [ x$alias_ip_address != x ]; then ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg route add -host $alias_ip_address dev $interface:0 fi route add -net $new_network_number for router in $new_routers; do route add default gw $router done # don't need to test old values for domain/host # no problems if resetting them to identical value?? if [ x$new_nis_domain != x ]; then echo $new_nis_domain >/etc/defaultdomain nisdomainname `cat /etc/defaultdomain` fi if [ x$new_host_name != x ]; then echo $new_host_name >/etc/hostname hostname --file /etc/hostname fi # old and new static routes different? if [ "x$old_static_routes" != "x$new_static_routes" ]; then # delete old static routes if they existed if [ "x$old_static_routes" != "x" ]; then update_static_routes "del -net" "$old_static_routes" fi # add new static routes if they exist if [ "x$new_static_routes" != "x" ]; then update_static_routes "add -net" "$new_static_routes" fi fi echo domain $new_domain_name >/etc/resolv.conf.std for nameserver in $new_domain_name_servers; do echo nameserver $nameserver >>/etc/resolv.conf.std done if [ -f /etc/resolv.conf ]; then rm -f /etc/resolv.conf ln /etc/resolv.conf.std /etc/resolv.conf fi exit 0 fi ifconfig $interface inet down exit 1 fi exit 0