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

Bug#779890: udhcpd: Support for multiple interfaces/udhcpd processes



On Fri, Mar 06, 2015 at 09:02:39AM +0300, Michael Tokarev wrote:
> 06.03.2015 02:57, Elliott Mitchell wrote:
> > The documentation seems to suggest udhcpd can only handle binding to one
> > interface and using one IP address range per udhcpd process.  Due to
> > this, it would be handy if Debian's init scripts had support for
> > starting/stopping multiple udhcpd processes (this would mean require
> > multiple .conf and .pid files).
> 
> I suggest using some more advanced dhcp servers for this, for
> example there's an excellent piece of software named dnsmasq
> which is small and has other useful functionality.  Udhcpd
> scripts can be extended to support multiple interfaces, but
> I think at this time, it is better to use, say, systemd
> service files for that, which should be trivial to write
> and drop to the right location (and no, I don't know off
> my head how to do that ;).

I'm undecided on systemd right now, but the controversy has me rather
concerned right now.  dnsmasq may well be used in the future, but right
now I still suspect udhcpd can readily take care of my current needs.

> > When reading the man page I was wondering, could multiple configuration
> > files be specified on udhcpd's command-line and would this have the
> > effect of starting multiple udhcpd processes?  (I rather doubt it, but
> > the man page could be read that way)
> 
> One invocation handles one interface, I think.  But you can try :)

I doubt it would work, just the man page could be interpreted to suggest
this.

I'm unsure whether it is good or bad news, but with some adjustments the
/etc/init.d/udhcpd script can be rewritten as an ifupdown hook script.
I'm attaching the script, place it in /etc/network/if-up.d/udhcpd, stick
a symbolic link in /etc/network/if-down.d/ and the attached script will
start/stop udhcpd when a given interface is brought up or down.

This adds 3 settings to /etc/network/interfaces.  "dhcpd-enable",
"dhcpd-config" and "dhcpd-pidfile".  Setting "dhcpd-enable" to "true",
"yes", "1", or "udhcpd" will make udhcpd to be started when a given
interface is brought up.  If set, "dhcpd-config" will specify the
configuration filename, DHCPD_CONFIG_DIR (set in /etc/default/udhcpd)
will be added as a prefix if this is not an absolute path; otherwise it
will look for /etc/udhcpd.<logical interface name>.conf then
/etc/udhcpd.<physical interface name>.conf and finally fall back to
/etc/udhcpd.conf.  The "dhcpd-pidfile" can tell it where the .pid file
is, though it will try to find it in the configuration file.  Hopefully
this works for others as a way to start udhcpd.


-- 
(\___(\___(\______          --=> 8-) EHM <=--          ______/)___/)___/)
 \BS (    |         EHeM+sigmsg@m5p.com  PGP 87145445         |    )   /
  \_CS\   |  _____  -O #include <stddisclaimer.h> O-   _____  |   /  _/
8A19\___\_|_/58D2 7E3D DDF4 7BA6 <-PGP-> 41D1 B375 37D0 8714\_|_/___/5445


#! /bin/sh
#
# Written by Miquel van Smoorenburg <miquels@cistron.nl>.
# Modified for Debian GNU/Linux by Ian Murdock <imurdock@gnu.ai.mit.edu>
# and Axel Beckert <abe@deuxchevaux.org>.
# Adjusted for use as an ifupdown hook script by Elliott Mitchell
# <ehem+debian@m5p.com>.
#
### BEGIN INIT INFO
# Provides:          udhcpd
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start busybox udhcpd at boot time
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/udhcpd
NAME=udhcpd
DESC="very small Busybox based DHCP server"
DHCPD_OPTS="-S" # Additional options given to the server

test -x $DAEMON || exit 0

case "${IF_DHCPD_ENABLE}" in
	udhcpd)
		# *we* and not some other DHCP server are enabled
	;;
	true|yes|1)
		# the DHCP server is enabled
	;;
	*)
		exit 0
	;;
esac

# Include defaults if available
[ -e /etc/default/udhcpd ] && . /etc/default/udhcpd

set -e

# Base location of configuration if relative path is given
[ -z "${DHCPD_CONFIG_DIR}" ] && DHCPD_CONFIG_DIR=/etc

# Has a configuration file been explicitly specified?  Optionally add directory
if [ -n "${IF_DHCPD_CONFIG}" ]
then	if [ "${IF_DHCPD_CONFIG}" = "${IF_DHCPD_CONFIG#/}" ]
	then	IF_DHCPD_CONFIG=${DHCPD_CONFIG_DIR}/${IF_DHCPD_CONFIG}
	fi
# Probe the location, first try ifupdown's logical name, then physical name
elif [ -e "${DHCPD_CONFIG_DIR}/udhcpd.${LOGICAL}.conf" ]
then	IF_DHCPD_CONFIG="${DHCPD_CONFIG_DIR}/udhcpd.${LOGICAL}.conf"
elif [ -e "${DHCPD_CONFIG_DIR}/udhcpd.${IFACE}.conf" ]
then	IF_DHCPD_CONFIG="${DHCPD_CONFIG_DIR}/udhcpd.${IFACE}.conf"
else	IF_DHCPD_CONFIG="${DHCPD_CONFIG_DIR}/udhcpd.conf"
fi

# Has the .pid file been specified?  Is it relative?
if [ -n "${IF_DHCPD_PIDFILE}" ]
then	if [ "${IF_DHCPD_PIDFILE}" = "${IF_DHCPD_PIDFILE#/}" ]
	then	IF_DHCPD_PIDFILE=/run/${IF_DHCPD_PIDFILE}
	fi
# Look for the .pid file in the configuration file
else	if grep -q -E -e^\[\[:space:]]\*pidfile\[\[:space:]] ${IF_DHCPD_CONFIG}
	then	IF_DHCPD_PIDFILE=`grep -E -e^\[\[:space:]]\*pidfile\[\[:space:]] ${IF_DHCPD_CONFIG} | sed -es/^\[\[:space:]]\*pidfile\[\[:space:]]+`
	else	IF_DHCPD_PIDFILE=/run/udhcpd.pid
	fi
fi

# This works better for us
[ "${VERBOSITY}" = 0 ] && VERBOSITY=""

case "$MODE" in
	start)
		[ -n "${VERBOSITY}" ] && echo -n "Starting $DESC: "
		start-stop-daemon --start ${VERBOSITY:+--verbose} \
			--pidfile ${IF_DHCPD_PIDFILE} --oknodo --exec $DAEMON \
			-- ${IF_DHCPD_OPTS:-${DHCPD_OPTS}} ${IF_DHCPD_CONFIG}
		[ -n "${VERBOSITY}" ] && echo "$NAME."
	;;
	stop)
		[ -n "${VERBOSITY}" ] && echo -n "Stopping $DESC: "
		start-stop-daemon --stop ${VERBOSITY:+--verbose} \
			--pidfile ${IF_DHCPD_PIDFILE} --oknodo --exec $DAEMON
		[ -n "${VERBOSITY}" ] && echo "$NAME."
	;;
	*)
		echo "Usage: $0 {start|stop}" >&2
		exit 1
	;;
esac

exit 0

Reply to: