[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: DHCP problem....



Yes, ok. Well the first thing is you want to use the newer client,
(dhcp-client-beta if you're running slink, dhcp-client if you're running
potato). Using the newer client is necessary because this client does not go
into the background until it gets an address (or times out, but let's
hope/assume that doesn't happen). The older client did go into the background
with the unfortunate result that samba and other network daemons that want to
know what your address is and want to look it up by host name would be started
right away before the dhcp client had time to get an address.

The next thing is to modify /etc/dhclient-script. This script is run at various
times by the dhcp client daemon in order to accomplish certain things like
setting up routes. We need to add code to it so that when dhcp acquires an IP
address it will update the /etc/hosts file to make the machine's host name
resolve to it's IP address properly. I've included my /etc/dhclient-script
which you can copy from.

"J.M. \"Jersey\" Miszczyk" wrote:

> Hello Phil,
>
> I am not that much worried about the other machines on the network, since
> they are Win systems and I am installing Samba on my machine but...... my
> machine does not even know itself :(. If I put some sort of static IP
> address into "hosts" file this IP address is used when I try to ping say,
> "elvis" and the error message that "network is unreachable" shows on my
> screen. If I ping the IP address which I pick up from running "ifconfig"
> for example, everything works fine.
> I can force network admin to give me a static address but.... this is
> besides the point <lol>... now the matter of pride is to solve the
> problem.... if you know what I mean :))).
> Jens Jorgensen mentiond about a script updating "hosts" file
> automatically... would you have any idea it should look like? :)
>
> Best regards and thank you for help :)
> "Jersey"
>
> ----------
> From:   Phil Brutsche[SMTP:pbrutsch@creighton.edu]
> Sent:   Wednesday, October 13, 1999 12:36 AM
> To:     jersey@isys.co.za
> Cc:     Debian-User
> Subject:        Re: DHCP problem....
>
> A long time ago, in a galaxy far, far way, someone said...
>
> > I just installed DHCP client on Debian slink machine. It works almost
> > fine.... it just does not pick up the host name :(. It is seen on the
> > network by its IP address only. If I ping it by the name from the local
> > console it responds that the host name is not known (I removed its static
> > IP entry from the "hosts" file).
> > Any suggestions will be appreciated :)
>
> This is how I read your message:
> 1) A computer running slink called elvis (for example) uses DHCP to get
>    it's IP# and related information.
> 2) Someone else on the network tries to ping elvis, and fails
> 3) Someone on elvis tries to ping elvis, and fails
>
> If this is the case, welcome to DHCP :)  The reason #2 and #3 fails is
> because there is no way for another system to find out elvis' IP#, either
> because the name 'elvis' wasn't found in /etc/hosts (or the equivalent),
> or in DNS, as you found out.  Your solutions are:
> 1) convince the local system administrator(s) to use Dynamic DNS.  This
>    allows the DHCP server to update the DNS server's IP# database
> 2) convince the local system administrator(s) to give you a static IP#
>    somehow, either through DHCP by MAC address or an outright static IP#
>    (no DHCP involved)
> 3) use one of the free dynamic hosting services available on the internet;
>    an example is www.dhs.org
>
> --
> ----------------------------------------------------------------------
> Phil Brutsche                                   pbrutsch@creighton.edu
>
> "There are two things that are infinite; Human stupidity and the
> universe. And I'm not sure about the universe." - Albert Einstein

--
Jens B. Jorgensen
jjorgens@bdsinc.com

#!/bin/sh
# dhclient-script for Linux. Dan Halbert, March, 1997.
# Updated for Linux 2.[12] by Brian J. Murrell, January 1999.
# 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.

update_hosts () {
    if sed -e '/^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}[[:space:]]\+.*'$(/bin/hostname)'.*/ s/^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/'$1'/' < /etc/hosts > /etc/hosts.new.$$
    then 
        /bin/cp /etc/hosts /etc/hosts.old
        mv /etc/hosts.new.$$ /etc/hosts
    else
        rm /etc/hosts.new.$$
    fi
}

# Must be used on exit.   Invokes the local dhcp client exit hooks, if any.
function exit_with_hooks() {
  exit_status=$1
  if [ -x /etc/dhclient-exit-hooks ]; then
    . /etc/dhclient-exit-hooks
  fi
# probably should do something with exit status of the local script
  exit $exit_status
}

# set this to 1 for debug messages
DEBUG=0

[ $DEBUG = 1 ] && printf "\tCalled for reason %s on interface %s\n" $reason $interface

# Invoke the local dhcp client enter hooks, if they exist.
if [ -x /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

release=`uname -r`
release=`expr $release : '\(.*\)\..*'`
relmajor=`echo $release |sed -e 's/^\([^\.]*\)\..*$/\1/'`
relminor=`echo $release |sed -e 's/^.*\.\([^\.]*\)$/\1/'`

[ $DEBUG = 1 ] && printf "\tKernel version %s.%s.x\n" $relmajor $relminor

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.
    [ $DEBUG = 1 ] && printf "\tifconfig %s:0- inet 0\n" $interface
    ifconfig $interface:0- inet 0
  fi
  if [ $relmajor -lt 2 ] || ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] )
   then
    [ $DEBUG = 1 ] && printf "\tifconfig %s inet 0.0.0.0 netmask 0.0.0.0 broadcast 255.255.255.255 up\n" $interface
    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.
    [ $DEBUG = 1 ] && printf "\troute add default dev %s netmask 0.0.0.0\n" $interface
    route add default dev $interface netmask 0.0.0.0
  else
    # added this code to fix this script for kernels greater than 2.0
    [ $DEBUG = 1 ] && printf "\tifconfig %s inet 0.0.0.0 up\n" $interface
    ifconfig $interface inet 0.0.0.0 up
    # took this line out to fix this for kernels greater than 2.0
    # ifconfig $interface 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 [ 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.
    [ $DEBUG = 1 ] && printf "\tifconfig %s:0- inet 0\n" $interface
    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.
    [ $DEBUG = 1 ] && printf "\tifconfig %s inet down HERE!\n" $interface 
    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

    [ $DEBUG = 1 ] && printf "\tifconfig %s inet %s %s %s\n" $interface $new_ip_address $new_subnet_arg $new_broadcast_arg
    ifconfig $interface inet $new_ip_address $new_subnet_arg $new_broadcast_arg

    update_hosts $new_ip_address
    printf "The hosts table was updated.\n"

    # Add a network route to the computed network address.
    if [ $relmajor -lt 2 ] || \
		( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then
      [ $DEBUG = 1 ] && printf "\troute add -net %s %s dev %s\n" $new_network_number $new_subnet_arg $interface
      route add -net $new_network_number $new_subnet_arg dev $interface
    fi
    for router in $new_routers; do
      [ $DEBUG = 1 ] && printf "\troute add default gw %s\n" $router
      route add default gw $router
    done
  fi
  if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ];
   then
    [ $DEBUG = 1 ] && printf "\tifconfig %s:0- inet 0\n" $interface
    ifconfig $interface:0- inet 0
    [ $DEBUG = 1 ] && printf "\tifconfig %s:0 inet %s %s\n" $interface $alias_ip_address $alias_subnet_arg
    ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
    [ $DEBUG = 1 ] && printf "\troute add -host %s %s:0\n" $alias_ip_address $interface
    route add -host $alias_ip_address $interface:0
  fi
  echo search $new_domain_name >/etc/resolv.conf
  for nameserver in $new_domain_name_servers; do
    echo nameserver $nameserver >>/etc/resolv.conf
  done
  exit_with_hooks 0
fi

if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ]; then
exit 0
  if [ x$alias_ip_address != x ]; then
    # Turn off alias interface.
    [ $DEBUG = 1 ] && printf "\tifconfig %s:0- inet 0\n" $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.
    [ $DEBUG = 1 ] && printf "\tifconfig %s inet down\n" $interface
    ifconfig $interface inet down
  fi
  if [ x$alias_ip_address != x ]; then
    [ $DEBUG = 1 ] && printf "\tifconfig %s:0 inet %s %s\n" $interface $alias_ip_address $alias_subnet_arg 
    ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
    [ $DEBUG = 1 ] && printf "\troute add -host %s %s:0\n" $alias_ip_address $interface
    route add -host $alias_ip_address $interface:0
  fi
  exit_with_hooks 0
fi

if [ x$reason = xTIMEOUT ]; then
  if [ x$alias_ip_address != x ]; then
    [ $DEBUG = 1 ] && printf "\tifconfig %s:0- inet 0\n" $interface
    ifconfig $interface:0- inet 0
  fi

  [ $DEBUG = 1 ] && printf "\tifconfig %s inet %s %s %s\n" $interface $new_ip_address $new_subnet_arg $new_broadcast_arg
  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 $1; then
    if [ x$new_ip_address != x$alias_ip_address ] && \
			[ x$alias_ip_address != x ]; then
      [ $DEBUG = 1 ] && printf "\tifconfig %s:0 inet %s %s\n" $interface $alias_ip_address $alias_subnet_arg
      ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
      [ $DEBUG = 1 ] && printf "\troute add -host %s dev %s:0\n" $alias_ip_address $interface
      route add -host $alias_ip_address dev $interface:0
    fi
    if [ $relmajor -lt 2 ] || \
		( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then
      [ $DEBUG = 1 ] && printf "\troute add -net %s\n" $new_network_number
      route add -net $new_network_number
    fi
    for router in $new_routers; do
      [ $DEBUG = 1 ] && printf "\troute add default gw %s\n" $router
      route add default gw $router
    done
    echo search $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_with_hooks 0
  fi
  [ $DEBUG = 1 ] && printf "\tifconfig %s inet down\n" $interface
  ifconfig $interface inet down
  exit_with_hooks 1
fi

exit_with_hooks 0









Reply to: