Attached an updated patch for IPv6 server support. This cleans up the
unnecessary translations that were in my previous patch, fixes some
bugs (thanks to C.J. Adams-Collier for one bug fix), and I've rebased
against the latest head.
Feedback still sought on the folowing points:
* the convention around "true" vs "yes" for values in /etc/default is
not clear to me; it seems debconf always goes with true/false for a
boolean, but many other scripts in /etc/default seem to use "yes".
I just used "true".
* Three new debconf values are added, with accompanying documentation;
this impacts the translations but I don't see any way around it
given the nature of the changes.
Any feedback or suggestions welcome.
Thanks,
Steve
diff --git a/debian/dhcpd6.conf b/debian/dhcpd6.conf
new file mode 100644
index 0000000..551a80c
--- /dev/null
+++ b/debian/dhcpd6.conf
@@ -0,0 +1,106 @@
+#
+# Sample configuration file for ISC dhcpdv6 for Debian
+#
+#
+
+# IPv6 address valid lifetime
+# (at the end the address is no longer usable by the client)
+# (set to 30 days, the usual IPv6 default)
+default-lease-time 2592000;
+
+# IPv6 address preferred lifetime
+# (at the end the address is deprecated, i.e., the client should use
+# other addresses for new connections)
+# (set to 7 days, the usual IPv6 default)
+preferred-lifetime 604800;
+
+# T1, the delay before Renew
+# (default is 1/2 preferred lifetime)
+# (set to 1 hour)
+option dhcp-renewal-time 3600;
+
+# T2, the delay before Rebind (if Renews failed)
+# (default is 3/4 preferred lifetime)
+# (set to 2 hours)
+option dhcp-rebinding-time 7200;
+
+# Enable RFC 5007 support (same than for DHCPv4)
+allow leasequery;
+
+# Global definitions for name server address(es) and domain search list
+#option dhcp6.name-servers 3ffe:501:ffff:100:200:ff:fe00:3f3e;
+#option dhcp6.domain-search "test.example.com","example.com";
+
+# Set preference to 255 (maximum) in order to avoid waiting for
+# additional servers when there is only one
+##option dhcp6.preference 255;
+
+# Server side command to enable rapid-commit (2 packet exchange)
+##option dhcp6.rapid-commit;
+
+# The delay before information-request refresh
+# (minimum is 10 minutes, maximum one day, default is to not refresh)
+# (set to 6 hours)
+option dhcp6.info-refresh-time 21600;
+
+# The path of the lease file
+#dhcpv6-lease-file-name "/var/lib/dhcp/dhcpd6.leases";
+
+# Static definition (must be global)
+#host myclient {
+# # The entry is looked up by this
+# host-identifier option
+# dhcp6.client-id 00:01:00:01:00:04:93:e0:00:00:00:00:a2:a2;
+
+# # A fixed address
+# fixed-address6 3ffe:501:ffff:100::1234;
+
+# # A fixed prefix
+# fixed-prefix6 3ffe:501:ffff:101::/64;
+
+# # Override of the global definitions,
+# # works only when a resource (address or prefix) is assigned
+# option dhcp6.name-servers 3ffe:501:ffff:100:200:ff:fe00:4f4e;
+
+# # For debug (to see when the entry statements are executed)
+# # (log "sol" when a matching Solicitation is received)
+# ##if packet(0,1) = 1 { log(debug,"sol"); }
+#}
+
+#host otherclient {
+# # This host entry is hopefully matched if the client supplies a DUID-LL
+# # or DUID-LLT containing this MAC address.
+# hardware ethernet 01:00:80:a2:55:67;
+#
+# fixed-address6 3ffe:501:ffff:100::4321;
+#}
+
+# The subnet where the server is attached
+# (i.e., the server has an address in this subnet)
+#subnet6 3ffe:501:ffff:100::/64 {
+# # Two addresses available to clients
+# # (the third client should get NoAddrsAvail)
+# range6 3ffe:501:ffff:100::10 3ffe:501:ffff:100::11;
+#
+# # Use the whole /64 prefix for temporary addresses
+# # (i.e., direct application of RFC 4941)
+# range6 3ffe:501:ffff:100:: temporary;
+#
+# # Some /64 prefixes available for Prefix Delegation (RFC 3633)
+# prefix6 3ffe:501:ffff:100:: 3ffe:501:ffff:111:: /64;
+#}
+
+# A second subnet behind a relay agent
+#subnet6 3ffe:501:ffff:101::/64 {
+# range6 3ffe:501:ffff:101::10 3ffe:501:ffff:101::11;
+#
+# # Override of the global definitions,
+# # works only when a resource (address or prefix) is assigned
+# option dhcp6.name-servers 3ffe:501:ffff:101:200:ff:fe00:3f3e;
+#
+#}
+
+# A third subnet behind a relay agent chain
+#subnet6 3ffe:501:ffff:102::/64 {
+# range6 3ffe:501:ffff:102::10 3ffe:501:ffff:102::11;
+#}
diff --git a/debian/isc-dhcp-server.config b/debian/isc-dhcp-server.config
index 412c4b3..9bb7894 100644
--- a/debian/isc-dhcp-server.config
+++ b/debian/isc-dhcp-server.config
@@ -13,12 +13,18 @@ INITCONFFILE=/etc/default/isc-dhcp-server
# preserve the configuration.
if [ -r ${INITCONFFILE} ]; then
. ${INITCONFFILE}
+ db_set isc-dhcp-server/v4_enabled "${V4_ENABLED:-true}"
+ db_set isc-dhcp-server/v6_enabled "${V6_ENABLED:-false}"
db_set isc-dhcp-server/interfaces "${INTERFACES}"
+ db_set isc-dhcp-server/interfaces_v6 "${INTERFACES_V6}"
fi
db_title "DHCP Server"
+db_input low isc-dhcp-server/v4_enabled || true
+db_input low isc-dhcp-server/v6_enabled || true
db_input low isc-dhcp-server/interfaces || true
+db_input low isc-dhcp-server/interfaces_v6 || true
db_go
db_input high isc-dhcp-server/new_auth_behavior || true
diff --git a/debian/isc-dhcp-server.init.d b/debian/isc-dhcp-server.init.d
index 10e4679..48665fc 100644
--- a/debian/isc-dhcp-server.init.d
+++ b/debian/isc-dhcp-server.init.d
@@ -35,7 +35,7 @@ fi
[ -f "$DHCPD_DEFAULT" ] && . "$DHCPD_DEFAULT"
NAME=dhcpd
-DESC="ISC DHCP server"
+DESC="ISC DHCPv4 server"
# fallback to default config file
DHCPD_CONF=${DHCPD_CONF:-/etc/dhcp/dhcpd.conf}
# try to read pid file name from config file, with fallback to /var/run/dhcpd.pid
@@ -44,58 +44,118 @@ if [ -z "$DHCPD_PID" ]; then
fi
DHCPD_PID="${DHCPD_PID:-/var/run/dhcpd.pid}"
+NAME6=dhcpd6
+DESC6="ISC DHCPv6 server"
+# fallback to default config file
+DHCPD6_CONF=${DHCPD6_CONF:-/etc/dhcp/dhcpd6.conf}
+# try to read pid file name from config file, with fallback to /var/run/dhcpd6.pid
+if [ -z "$DHCPD6_PID" ]; then
+ DHCPD6_PID=$(sed -n -e 's/^[ \t]*pid-file-name[ \t]*"(.*)"[ \t]*;.*$/\1/p' < "$DHCPD6_CONF" 2>/dev/null | head -n 1)
+fi
+DHCPD6_PID="${DHCPD6_PID:-/var/run/dhcpd6.pid}"
+
+# $1 version -4 or -6
+# $2 config file
test_config()
{
- if ! /usr/sbin/dhcpd -t $OPTIONS -q -cf "$DHCPD_CONF" > /dev/null 2>&1; then
- echo "dhcpd self-test failed. Please fix $DHCPD_CONF."
+ if ! /usr/sbin/dhcpd $1 -t $OPTIONS -q -cf "$2" > /dev/null 2>&1; then
+ echo "dhcpd self-test failed. Please fix $2."
echo "The error was: "
- /usr/sbin/dhcpd -t $OPTIONS -cf "$DHCPD_CONF"
+ /usr/sbin/dhcpd $1 -t $OPTIONS -cf "$2"
exit 1
fi
touch /var/lib/dhcp/dhcpd.leases
}
-# single arg is -v for messages, -q for none
+test_configs()
+{
+ if [ "$V4_ENABLED" = "true" ]; then
+ test_config -4 "$DHCPD_CONF"
+ fi
+ if [ "$V6_ENABLED" = "true" ]; then
+ test_config -6 "$DHCPD6_CONF"
+ fi
+}
+
+# $1 is -v for messages, -q for none
+# $2 PID file path
+# $3 NAME
check_status()
{
- if [ ! -r "$DHCPD_PID" ]; then
- test "$1" != -v || echo "$NAME is not running."
+ if [ ! -r "$2" ]; then
+ test "$1" != -v || echo "$3 is not running."
return 3
fi
- if read pid < "$DHCPD_PID" && ps -p "$pid" > /dev/null 2>&1; then
- test "$1" != -v || echo "$NAME is running."
+ if read pid < "$2" && ps -p "$pid" > /dev/null 2>&1; then
+ test "$1" != -v || echo "$3 is running."
return 0
else
- test "$1" != -v || echo "$NAME is not running but $DHCPD_PID exists."
+ test "$1" != -v || echo "$3 is not running but $2 exists."
return 1
fi
}
+start_daemon()
+{
+ local VERSION CONF_FILE PROCESS PIDFILE INTERFACES DESCRIPTION
+ VERSION=$1
+ CONF_FILE=$2
+ PROCESS=$3
+ PIDFILE=$4
+ INTERFACES=$5
+ DESCRIPTION=$6
+
+ log_daemon_msg "Starting $DESCRIPTION" "$PROCESS"
+ start-stop-daemon --start --quiet --pidfile "$PIDFILE" \
+ --exec /usr/sbin/dhcpd -- \
+ $VERSION -q $OPTIONS -cf "$CONF_FILE" -pf "$PIDFILE" $INTERFACES
+ sleep 2
+
+ if check_status -q $PIDFILE $NAME; then
+ log_end_msg 0
+ else
+ log_failure_msg "check syslog for diagnostics."
+ log_end_msg 1
+ exit 1
+ fi
+}
+
+stop_daemon()
+{
+ local PROCESS PIDFILE DESCRIPTION
+ PROCESS=$1
+ PIDFILE=$2
+ DESCRIPTION=$3
+
+ log_daemon_msg "Stopping $DESCRIPTION" "$PROCESS"
+ start-stop-daemon --stop --quiet --pidfile "$PIDFILE"
+ log_end_msg $?
+ rm -f "$PIDFILE"
+}
+
case "$1" in
start)
- test_config
- log_daemon_msg "Starting $DESC" "$NAME"
- start-stop-daemon --start --quiet --pidfile "$DHCPD_PID" \
- --exec /usr/sbin/dhcpd -- \
- -q $OPTIONS -cf "$DHCPD_CONF" -pf "$DHCPD_PID" $INTERFACES
- sleep 2
+ test_configs
+ if [ "$V4_ENABLED" = "true" ]; then
+ start_daemon "-4" "$DHCPD_CONF" \
+ "$NAME" "$DHCPD_PID" "$INTERFACES" "$DESC"
+ fi
- if check_status -q; then
- log_end_msg 0
- else
- log_failure_msg "check syslog for diagnostics."
- log_end_msg 1
- exit 1
+ if [ "$V6_ENABLED" = "true" ]; then
+ start_daemon "-6" "$DHCPD6_CONF" \
+ "$NAME6" "$DHCPD6_PID" "$INTERFACES_V6" "$DESC6"
fi
;;
stop)
- log_daemon_msg "Stopping $DESC" "$NAME"
- start-stop-daemon --stop --quiet --pidfile "$DHCPD_PID"
- log_end_msg $?
- rm -f "$DHCPD_PID"
+ if [ -f "$DHCPD_PID" ]; then
+ stop_daemon "$NAME" "$DHCPD_PID" "$DESC"
+ fi
+ if [ -f "$DHCPD6_PID" ]; then
+ stop_daemon "$NAME6" "$DHCPD6_PID" "$DESC6"
+ fi
;;
restart | force-reload)
- test_config
+ test_configs
$0 stop
sleep 2
$0 start
@@ -105,7 +165,9 @@ case "$1" in
;;
status)
echo -n "Status of $DESC: "
- check_status -v
+ check_status -v "$DHCPD_PID" "$NAME"
+ echo -n "Status of $DESC6: "
+ check_status -v "$DHCPD6_PID" "$NAME6"
exit "$?"
;;
*)
diff --git a/debian/isc-dhcp-server.install b/debian/isc-dhcp-server.install
index b5b95f0..96ebc7b 100644
--- a/debian/isc-dhcp-server.install
+++ b/debian/isc-dhcp-server.install
@@ -1,3 +1,4 @@
usr/sbin/dhcpd
debian/dhcpd.conf etc/dhcp
+debian/dhcpd6.conf etc/dhcp
diff --git a/debian/isc-dhcp-server.postinst b/debian/isc-dhcp-server.postinst
index ab0b984..ba550f6 100644
--- a/debian/isc-dhcp-server.postinst
+++ b/debian/isc-dhcp-server.postinst
@@ -42,34 +42,69 @@ umask 022
# This is a POSIX shell fragment
#
+# you can enable v4 and/or v6 protocols
+V4_ENABLED="true"
+V6_ENABLED="false"
+
# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPD_CONF=/etc/dhcp/dhcpd.conf
+# Path to dhcpdv6's config file (default: /etc/dhcp/dhcpd6.conf).
+#DHCPD6_CONF=/etc/dhcp/dhcpd6.conf
+
# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPD_PID=/var/run/dhcpd.pid
+# Path to dhcpdv6's PID file (default: /var/run/dhcpd6.pid).
+#DHCPD6_PID=/var/run/dhcpd6.pid
+
# Additional options to start dhcpd with.
-# Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
+# Don't use options -cf or -pf here;
+# use DHCPD_CONF/ DHCPD_PID, DHCPD6_CONF/ DHCPD6_PID instead
#OPTIONS=""
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES=""
+INTERFACES_V6=""
EOFMAGICNUMBER1234
}
+set_default() {
+ local VARIABLE VALUE TMPFILE
+ VARIABLE=$1
+ VALUE=$2
+
+ if grep -q "^[[:space:]]*${VARIABLE}=" ${INITCONFFILE}; then
+ TMPFILE="$(mktemp -q ${INITCONFFILE}.new.XXXXXX)"
+ sed -e "s,^[[:space:]]*${VARIABLE}=.*,${VARIABLE}=\"${VALUE}\"," \
+ <${INITCONFFILE} >${TMPFILE}
+
+ cp ${TMPFILE} ${INITCONFFILE}
+ rm ${TMPFILE}
+ else
+ echo >> ${INITCONFFILE}
+ echo "${VARIABLE}=\"${VALUE}\"" >> ${INITCONFFILE}
+ fi
+}
+
# ------------------------- Debconf questions start ---------------------
+db_get isc-dhcp-server/v4_enabled || true
+V4_ENABLED="${RET}"
+set_default V4_ENABLED "${V4_ENABLED}"
+
+db_get isc-dhcp-server/v6_enabled || true
+V6_ENABLED="${RET}"
+set_default V6_ENABLED "${V6_ENABLED}"
+
db_get isc-dhcp-server/interfaces || true
INTERFACES="${RET}"
+set_default INTERFACES "${INTERFACES}"
-if [ -n "$INTERFACES" ]; then
- TMPFILE="$(mktemp -q ${INITCONFFILE}.new.XXXXXX)"
- sed -e "s,^[[:space:]]*INTERFACES[[:space:]]*=.*,INTERFACES=\"${INTERFACES}\"," \
- <${INITCONFFILE} >${TMPFILE}
- cp ${TMPFILE} ${INITCONFFILE}
- rm ${TMPFILE}
-fi
+db_get isc-dhcp-server/interfaces_v6 || true
+INTERFACES_V6="${RET}"
+set_default INTERFACES_V6 "${INTERFACES_V6}"
# ------------------------- Debconf questions end ---------------------
db_stop
diff --git a/debian/isc-dhcp-server.templates b/debian/isc-dhcp-server.templates
index 5d24b58..b7273ab 100644
--- a/debian/isc-dhcp-server.templates
+++ b/debian/isc-dhcp-server.templates
@@ -7,12 +7,32 @@
# Even minor modifications require translation updates and such
# changes should be coordinated with translators and reviewers.
+Template: isc-dhcp-server/v4_enabled
+Type: boolean
+_Description: Should DHCP server listen on IPv4?:
+ Please enable or disable serving requests for IPv4 addresses.
+
+Template: isc-dhcp-server/v6_enabled
+Type: boolean
+_Description: Should DHCP server listen on IPv6?:
+ Please enable or disable serving requests for IPv6 addresses.
+
Template: isc-dhcp-server/interfaces
Type: string
-_Description: Network interfaces on which the DHCP server should listen:
- Please specify on which network interface(s) the DHCP server should
- listen for DHCP requests. Multiple interface names should be entered
- as a space-separated list.
+_Description: Network interfaces on which the DHCPv4 server should listen:
+ Please specify on which network interface(s) the DHCP server
+ should listen for DHCPv4 requests. Multiple interface names should be
+ entered as a space-separated list.
+ .
+ The interfaces will be automatically detected if this field is left
+ blank.
+
+Template: isc-dhcp-server/interfaces_v6
+Type: string
+_Description: Network interfaces on which the DHCPv6 server should listen:
+ Please specify on which network interface(s) the DHCP server
+ should listen for DHCPv6 requests. Multiple interface names should be
+ entered as a space-separated list.
.
The interfaces will be automatically detected if this field is left
blank.