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

Reply via email to