#!/bin/bash # Network Interface Configuration System # Parts Copyright (c) 2002 Red Hat, Inc. all rights reserved. # # Based on: # dhclient-script for Linux. Dan Halbert, March, 1997. # Updated for Linux 2.[12] by Brian J. Murrell, January 1999. # 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. DEFAULTROUTE="171.64.73.171" function make_resolv_conf() { if [ -n "$new_domain_name" ] || [ -n "$new_domain_name_servers" ]; then echo '; generated by /sbin/dhclient-script' > /etc/resolv.conf if [ -n "$new_domain_name" ]; then echo search $new_domain_name >> /etc/resolv.conf fi for nameserver in $new_domain_name_servers; do echo nameserver $nameserver >>/etc/resolv.conf done fi } # Must be used on exit. Invokes the local dhcp client exit hooks, if any. function exit_with_hooks() { exit_status=$1 if [ -f /etc/dhclient-exit-hooks ]; then . /etc/dhclient-exit-hooks fi # probably should do something with exit status of the local script exit $exit_status } # Invoke the local dhcp client enter hooks, if they exist. if [ -f /etc/dhclient-enter-hooks ]; then exit_status=0 . /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 # Import Red Hat Linux configuration cd /etc/sysconfig/network-scripts; . /etc/sysconfig/network-scripts/network-functions . /etc/rc.d/init.d/functions [ -f ../network ] && . ../network [ -f ../networking/network ] && . ../networking/network CONFIG=$interface need_config ${CONFIG} [ -f "${CONFIG}" ] || { echo $"$0: configuration for $interface not found." >&2 exit_with_hooks 1 } source_config release=`uname -r` release=`expr $release : '\(.*\)\..*'` relminor=`echo $release |sed -e 's/[0-9]*\.\([0-9][0-9]*\)\(\..*\)*$/\1/'` relmajor=`echo $release |sed -e 's/\([0-9][0-9]*\)\..*$/\1/'` 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_with_hooks 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 if [ $relmajor -lt 2 ] || ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ) then 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 else ifconfig $interface 0 up fi # We need to give the kernel some time to get the interface up. sleep 1 exit_with_hooks 0 fi if [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then exit_with_hooks 0 fi if [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \ [ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then if [ -n "$new_nis_domain" ]; then domainname "$new_nis_domain" rm -f /etc/yp.conf if [ -n "$new_nis_servers" ]; then for I in $new_nis_servers; do echo "domain $new_nis_domain server $I" >> /etc/yp.conf done else echo "domain $new_nis_domain broadcast" >> /etc/yp.conf fi elif [ -n "$new_nis_servers" ]; then echo '# generated by /sbin/dhclient-script' > /etc/yp.conf for I in $new_nis_servers; do echo "ypserver $I" >> /etc/yp.conf done fi if [ -n "$new_ntp_servers" ] && [ -e /etc/ntp.conf ]; then cat < /etc/ntp.conf restrict default ignore restrict 127.0.0.1 driftfile /etc/ntp/drift broadcastdelay 0.008 authenticate yes keys /etc/ntp/keys EOF :> /etc/ntp/step-tickers for I in $new_ntp_servers; do echo "restrict $I nomodify notrap noquery" >> /etc/ntp.conf echo "server $I" >> /etc/ntp.conf echo "$I" >> /etc/ntp/step-tickers done fi if [ -n "$new_host_name" ] && need_hostname; then hostname $new_host_name fi 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 0 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 # Remove the network route ip route flush dev $interface # Add a network route to the computed network address. if [ $relmajor -lt 2 ] || \ ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then route add -net $new_network_number $new_subnet_arg dev $interface fi for router in $new_routers; do route add $router dev $interface route add $DEFAULTROUTE gw $router done /sbin/vtun-client 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 if [ "${PEERDNS}" != "no" ]; then make_resolv_conf fi exit_with_hooks 0 fi if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \ || [ x$reason = xSTOP ]; 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 0 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 /sbin/vtun-client exit_with_hooks 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 if ping -q -c 1 -w 10 $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 if [ $relmajor -lt 2 ] || \ ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then route add -net $new_network_number fi for router in $new_routers; do route add $router dev $interface:0 route add $DEFAULTROUTE gw $router done if [ "${PEERDNS}" != "no" ]; then make_resolv_conf fi exit_with_hooks 0 fi ifconfig $interface inet 0 down /sbin/vtun-client exit_with_hooks 1 fi exit_with_hooks 0