#! /bin/sh # Copyright (c) 1996, 1997, 1998 S.u.S.E. GmbH # Copyright (c) 1998, 1999, 2000, 2001 SuSE GmbH # Copyright (c) 2002, 2003 SuSE Linux AG # # Author: Rolf Haberrecker , 1997, 1998, 1999 # Peter Poeml , 2000, 2001, 2002, 2003 # # /etc/init.d/dhcpd # and its symbolic link # /usr/sbin/rcdhcpd # ### BEGIN INIT INFO # Provides: dhcpd # Required-Start: $local_fs $remote_fs $network # X-UnitedLinux-Should-Start: $named $syslog $time # Required-Stop: $local_fs $remote_fs $network # X-UnitedLinux-Should-Stop: $named $syslog # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Short-Description: DHCP Server # Description: Start DHCP (Dynamic Host Configuration Protocol) # server. (Note: if configured for failover it # needs to rely on time synchronisation.) ### END INIT INFO if [ -s /etc/sysconfig/dhcpd ]; then . /etc/sysconfig/dhcpd else # pre 8.0 # Source SuSE config . /etc/rc.config test -s /etc/rc.config.d/dhcpd.rc.config && \ . /etc/rc.config.d/dhcpd.rc.config # Determine the base and follow a runlevel link name. base=${0##*/} link=${base#*[SK][0-9][0-9]} # Force execution if not called by a runlevel directory. test $link = $base && START_DHCPD=yes test "$START_DHCPD" = yes || exit 0 fi test "$DHCPD_RUN_CHROOTED" = "yes" && CHROOT_PREFIX=/var/lib/dhcp/ DAEMON="DHCP server" [ "$DHCPD_BINARY" = /usr/sbin/dhcpd.lpf ] && DHCPD_BINARY=/usr/sbin/dhcpd DAEMON_BIN=${DHCPD_BINARY:=/usr/sbin/dhcpd} DAEMON_CONF=/etc/dhcpd.conf DAEMON_PIDFILE=/var/run/dhcpd.pid STARTPROC_LOGFILE=/var/log/rc.dhcpd.log SUPPORTS_HUP="no" # Shell functions sourced from /etc/rc.status: # rc_check check and set local and overall rc status # rc_status check and set local and overall rc status # rc_status -v ditto but be verbose in local rc status # rc_status -v -r ditto and clear the local rc status # rc_failed set local and overall rc status to failed # rc_failed set local and overall rc status to # rc_reset clear local rc status (overall remains) # rc_exit exit appropriate to overall rc status . /etc/rc.status # First reset status of this service rc_reset # Return values acc. to LSB for all commands but status: # 0 - success # 1 - generic or unspecified error # 2 - invalid or excess argument(s) # 3 - unimplemented feature (e.g. "reload") # 4 - insufficient privilege # 5 - program is not installed # 6 - program is not configured # 7 - program is not running # # Note that starting an already running service, stopping # or restarting a not-running service as well as the restart # with force-reload (in case signalling is not supported) are # considered a success. if ! [ -x $DAEMON_BIN ]; then echo >&2 "$0: \"$DAEMON_BIN\" is not an executable file. Exiting." rc_failed 1 rc_status -v1 rc_exit fi # remove empty pid files to avoid disturbing warnings by checkproc/killproc # (these can occur if dhcpd does not start correctly) test -e $DAEMON_PIDFILE && ! test -s $DAEMON_PIDFILE && rm $DAEMON_PIDFILE test -e $CHROOT_PREFIX/$DAEMON_PIDFILE && ! test -s $CHROOT_PREFIX/$DAEMON_PIDFILE && rm $CHROOT_PREFIX/$DAEMON_PIDFILE case "$1" in start) echo -n "Starting $DAEMON " ## If there is no conf file, skip starting of dhcpd ## and return with "program not configured" if ! [ -f $DAEMON_CONF ]; then echo -e -n "... no configuration file found"; # Tell the user this has skipped rc_status -s # service is not configured exit 6; fi ## If the interfaces are not set, skip starting of dhcpd ## and return with "program not configured" if [ -z "$DHCPD_INTERFACE" ]; then echo -n "... cannot... DHCPD_INTERFACE in /etc/sysconfig/dhcpd is empty!" # Tell the user this has skipped rc_status -s # service is not configured exit 6; fi if [ "$DHCPD_INTERFACE" = "ANY" ]; then DHCPD_INTERFACE="" fi # it might be necessary to convert "configuration names" (as in # /etc/sysconfig/network/ifcfg-* into "interface names" (like eth*) if [ -x /sbin/getcfg-interface ]; then unset interfaces for i in $DHCPD_INTERFACE; do interfaces="$interfaces$(/sbin/getcfg-interface $i) " done DHCPD_INTERFACE=$interfaces fi jail=/var/lib/dhcp; leases=dhcpd.leases if ! [ -e $jail/db/$leases ]; then # until 9.0, the lease file was in /var/lib/dhcp and part of the package if test -e $jail/$leases -a '!' -L $jail/$leases; then # this is the case where the %post script runs _before_ the old package is # removed (i.e., dhcpd.leases has not renamed to .rpmsave yet) mv $jail/$leases $jail/db/$leases && \ ln -s db/$leases $jail/ elif test -e $jail/$leases.rpmsave; then # this is what's left when the package is already gone. mv $jail/$leases.rpmsave $jail/db/$leases && \ ln -s db/$leases $jail/ else # fresh installation: # a lease file must be present. the server won't start without touch $jail/db/$leases fi fi if test "$DHCPD_RUN_CHROOTED" = "yes" ; then ## copy the conf file to the chroot jail (dhcpd has to be restarted anyway, ## when it has changed) and change path to leases file for i in $DAEMON_CONF $DHCPD_CONF_INCLUDE_FILES; do test -d $CHROOT_PREFIX/${i%/*} || mkdir -p $CHROOT_PREFIX/${i%/*} done for i in $DAEMON_CONF $DHCPD_CONF_INCLUDE_FILES /etc/{resolv.conf,host.conf,hosts,localtime}; do if ! test -e $i; then continue; fi # neither of them is absolutely necessary cp -aL $i $CHROOT_PREFIX/$i &>/dev/null \ || { echo "...$0:$LINENO: could not copy $i to chroot jail"; rc_failed; rc_status -v1; exit 6; } done libdir=/$(basename $(echo /var/lib/dhcp/lib*)) for i in /$libdir/{libresolv.so.2,libnss_dns{,6}.so.2}; do if [ -s $i ]; then cp -pL $i /var/lib/dhcp/$libdir/ \ || { echo "...$0:$LINENO: could not copy $i to chroot jail"; rc_failed; rc_status -v1; exit 6; } fi done DHCPD_ARGS="-chroot $CHROOT_PREFIX -lf /db/dhcpd.leases" ## If there is a pid file containing a pid, the machine might have crashed. pid files in ## /var/run are always cleaned up at boot time, but this is not the case for the pid file in ## the chroot jail. Therefore, and old pid file may exist. This is only a problem if it ## incidentally contains the pid of a running process. If this process is not a 'dhcpd', ## we remove the pid. (dhcpd itself only checks whether the pid is alive or not.) if test -e $CHROOT_PREFIX/$DAEMON_PIDFILE -a -s $CHROOT_PREFIX/$DAEMON_PIDFILE; then i=$(<$CHROOT_PREFIX/$DAEMON_PIDFILE) if pidof dhcpd &>/dev/null; then echo -n "(already running) " else rm $CHROOT_PREFIX/$DAEMON_PIDFILE fi fi fi if [ -n "$DHCPD_RUN_AS" ]; then DHCPD_RUN_AS_GROUP="$(getent group $(getent passwd $DHCPD_RUN_AS | cut -d: -f4) | cut -d: -f1)" DHCPD_ARGS="$DHCPD_ARGS -user $DHCPD_RUN_AS -group $DHCPD_RUN_AS_GROUP" fi ## check syntax with -t (output to log file) and start only when the syntax is okay rm -f $STARTPROC_LOGFILE # start log error=0 if ! $DAEMON_BIN -t -cf $CHROOT_PREFIX/$DAEMON_CONF > $STARTPROC_LOGFILE 2>&1 ; then error=1 else ## Start daemon. If this fails the return value is set appropriate. ## The init script should return 0, even if service is already running, ## to match the LSB spec. test "$2" = "-v" && echo -en \ "\nexecuting '$DAEMON_BIN $DHCPD_ARGS $DHCPD_OTHER_ARGS $DHCPD_INTERFACE'" $DAEMON_BIN $DHCPD_ARGS $DHCPD_OTHER_ARGS $DHCPD_INTERFACE &> $STARTPROC_LOGFILE ret=$? fi if [ $error -gt 0 -o ${ret:-0} -gt 0 ]; then cat $STARTPROC_LOGFILE ## set status to failed rc_failed else [ "$DHCPD_RUN_CHROOTED" = "yes" ] && echo -n "[chroot]" || : fi # Remember status and be verbose rc_status -v ;; stop) echo -n "Shutting down $DAEMON " ## Stop daemon with killproc(8) and if this fails ## set echo the echo return value. killproc -p $CHROOT_PREFIX/$DAEMON_PIDFILE -TERM $DAEMON_BIN ret=$? if test -s $CHROOT_PREFIX/$DAEMON_PIDFILE; then kill $(<$CHROOT_PREFIX/$DAEMON_PIDFILE) 2>/dev/null fi # remove libraries from the chroot jail, just so they are not left over # if the server is deinstalled if [ "$DHCPD_RUN_CHROOTED" = yes ]; then rm -f $CHROOT_PREFIX/lib*/* fi # Remember status and be verbose rc_failed $ret rc_status -v ;; try-restart) ## Do a restart only if the service was active before. ## Note: try-restart is now part of LSB (as of 1.9). ## RH has a similar command named condrestart. $0 status if test $? = 0; then $0 restart else rc_reset # Not running is not a failure. fi # Remember status and be quiet rc_status ;; restart) ## Stop the service and regardless of whether it was ## running or not, start it again. $0 stop sleep 3 $0 start # Remember status and be quiet rc_status ;; force-reload) ## Signal the daemon to reload its config. Most daemons ## do this on signal 1 (SIGHUP). ## If it does not support it, restart. echo -n "Reload service $DAEMON" if [ "$SUPPORTS_HUP" = "yes" ]; then killproc -p $DAEMON_PIDFILE -HUP $DAEMON_BIN #touch $DAEMON_PIDFILE rc_status -v else $0 stop && sleep 3 && $0 start rc_status fi ;; reload) ## Like force-reload, but if daemon does not support ## signalling, do nothing (!) if [ "$SUPPORTS_HUP" = "yes" ]; then # If it supports signalling: echo -n "Reload service $DAEMON" killproc -p $DAEMON_PIDFILE -HUP $DAEMON_BIN #touch $DAEMON_PIDFILE rc_status -v else ## Otherwise if it does not support reload: rc_failed 3 rc_status -v fi ;; status) echo -n "Checking for $DAEMON: " ## Check status with checkproc(8), if process is running ## checkproc will return with exit status 0. # Status has a slightly different for the status command: # 0 - service running # 1 - service dead, but /var/run/ pid file exists # 2 - service dead, but /var/lock/ lock file exists # 3 - service not running # NOTE: checkproc returns LSB compliant status values. checkproc -p $CHROOT_PREFIX/$DAEMON_PIDFILE $DAEMON_BIN rc_status -v ;; probe) ## Optional: Probe for the necessity of a reload, ## give out the argument which is required for a reload. rc=0 for i in /etc/sysconfig/dhcpd $DAEMON_CONF $DHCPD_CONF_INCLUDE_FILES; do test $i -nt $CHROOT_PREFIX/$DAEMON_PIDFILE && rc=1 done test $rc = 1 && echo restart ;; check-syntax|syntax-check) echo "Checking syntax of $DAEMON_CONF: " ## this nice bit is from Edwin Groothuis: ## check syntax (quiet) $DAEMON_BIN -q -t -cf $DAEMON_CONF if ! [ $? -eq 0 ]; then ## check syntax (verbose) $DAEMON_BIN -t -cf $DAEMON_CONF echo -e '\nConfig is NOT okay\n' else echo 'Config is okay. Hope you also specified existent network devices ;) ' ## in v3, lease file checking is also implemented if [ $DAEMON_BIN != "/usr/sbin/dhcpd-2" ]; then ## check leases file (quiet) $DAEMON_BIN -q -T -cf $DAEMON_CONF -lf /var/lib/dhcp/db/dhcpd.leases if ! [ $? -eq 0 ]; then ## check leases file (verbose) $DAEMON_BIN -T -cf $DAEMON_CONF -lf /var/lib/dhcp/db/dhcpd.leases echo -e '\nLease file is NOT okay' else echo 'Lease file is okay' fi fi fi ;; *) echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe|check-syntax} [-v]" exit 1 esac rc_exit