Package: isc-dhcp-server
Version: 4.4.1-2
Severity: normal
Tags: ipv6 patch

Dear Maintainer,

> What led up to the situation?

The init script tries to launch two parallel instances of dhcpd, one
each for ipv4 and ipv6, unless INTERFACESv4 or INTERFACESv6 is
specified.  The man page says:

> This should be done on systems where dhcpd is unable to identify
> non-broadcast interfaces, but should not be required on other systems.

My system doesn't seem to require this.  We can avoid a specification
which could become wrong if the environment changes.

> What exactly did you do (or not do) that was effective (or ineffective)?

I tried specifying "OPTIONS=-4" in the defaults file, but that didn't prevent
the init script from trying to launch an instance for IPv6.  That instance just
failed immediately, causing the init script to return failure.

Ultimately I modified the init script to respect two new variables:
IPV4ONLY and IPV6ONLY.  I modified the "start" case to enter the
ipv4-only or ipv6-only behavior, respectively, if either is set.
INTERFACESv4 should still work, but specifying interfaces is no longer
mandatory.

isc-dhcp-server.patch - for /etc/init.d/isc-dhcp-server - is attached.

I changed some if/then keywords, slightly, to accommodate.  Oh, the
status action seemed parallel to the start action, but missing a few
lines, so I added them.  Let me know if that should be a separate patch,
or if it's a bad idea.

> What was the outcome of this action?

The outcome of specifying "OPTIONS=-4" was a failed instance of dhcpd, but that
makes sense given the structure of the init script.

The outcome of modifying the init script is a working server and
successful return codes from the init script.

> What outcome did you expect instead?

I expected it to work because I'm awesome.  Oh, I expected, originally, for the
init script to let me choose a protocol, since it seems to allow that, without
also forcing me to specify which interface(s) to use.

-- System Information:
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster
Architecture: armv6l

Kernel: Linux 4.19.75+
Kernel taint flags: TAINT_CRAP
Locale: LANG=en_US, LC_CTYPE=en_US (charmap=ISO-8859-1), LANGUAGE=en_US 
(charmap=ISO-8859-1)
Shell: /bin/sh linked to /bin/dash
Init: sysvinit (via /sbin/init)

Versions of packages isc-dhcp-server depends on:
ii  debconf [debconf-2.0]  1.5.71
ii  debianutils            4.8.6.1
ii  libc6                  2.28-10+rpi1
ii  libdns-export1104      1:9.11.5.P4+dfsg-5.1
ii  libirs-export161       1:9.11.5.P4+dfsg-5.1
ii  libisc-export1100      1:9.11.5.P4+dfsg-5.1
ii  lsb-base               10.2019051400+rpi1

Versions of packages isc-dhcp-server recommends:
ii  isc-dhcp-common  4.4.1-2
ii  policycoreutils  2.8-1

Versions of packages isc-dhcp-server suggests:
pn  isc-dhcp-server-ldap  <none>
pn  policykit-1           <none>

-- Configuration Files:
/etc/dhcp/dhcpd.conf changed:
ddns-update-style       none;
option                  domain-search           "neuronpointer.net";
option                  domain-name             "neuronpointer.net";
option                  domain-name-servers     neuron.neuronpointer.net;
default-lease-time      3600;
max-lease-time          200;
authoritative;
log-facility            local7;
option                  architecture-type       code 93 = unsigned integer 16;
subnet 192.168.11.0 netmask 255.255.255.0 {
  option                broadcast-address       192.168.11.255;
  option                routers                 gateway.neuronpointer.net;
  #option                domain-name-servers     192.168.11.54;
  range                 192.168.11.2            192.168.11.50;
}
group {
  # EFI netboot
  # This doesn't work yet.
  option                broadcast-address       192.168.11.255;
  option                routers                 gateway.neuronpointer.net;
  #option                domain-name-servers     192.168.11.54;
  filename              "syslinux.efi";
  # First instruct PXE firmware to download ipxe, then instruct ipxe to 
download syslinux.
  #if exists user-class and option user-class = "iPXE" {
  #  filename            "tftp://neuron/syslinux.efi";;
  #} else {
  #  filename            "ipxe.efi";
  #}
 
}
group {
  # legacy netboot
  option                broadcast-address       192.168.11.255;
  option                routers                 gateway.neuronpointer.net;
  #option                domain-name-servers     192.168.11.54;
  filename              "lpxelinux.0";
}
group {
  # no netboot
  option                broadcast-address       192.168.11.255;
  option                routers                 gateway.neuronpointer.net;
  #option                domain-name-servers     192.168.11.54;
  host files {
    hardware ethernet   02:55:08:42:95:49;
    fixed-address       files.neuronpointer.net;
  }
  host mawg {
    hardware ethernet   9c:4e:36:c0:d6:00;
    fixed-address       mawg.neuronpointer.net;
  }
  host meliora {
    hardware ethernet   F0:DE:F1:90:77:CB;
    fixed-address       meliora.neuronpointer.net;
  }
  host neuron {
    hardware ethernet   B8:27:EB:47:A1:FB;
    fixed-address       neuron.neuronpointer.net;
  }
  host nixon {
    hardware ethernet   00:0e:35:2d:9c:17;
    fixed-address       nixon.neuronpointer.net;
  }
  host no {
    hardware ethernet   94:94:26:01:38:76;
    fixed-address       no.neuronpointer.net;
  }
  host peekaboo {
    hardware ethernet   A0:99:9B:0A:02:F3;
    fixed-address       peekaboo.neuronpointer.net;
  }
  host rudolph {
    hardware ethernet   5C:C5:D4:64:E6:19;
    fixed-address       rudolph.neuronpointer.net;
  }
  host partybus {
    hardware ethernet   3A:4E:D2:48:B3:B7;
    fixed-address       partybus.neuronpointer.net;
  }
  host synapse {
    hardware ethernet   B8:27:EB:D1:2D:A2;
    fixed-address       synapse.neuronpointer.net;
  }
  host wii {
    hardware ethernet   9C:E6:35:83:64:4E;
    fixed-address       wii.neuronpointer.net;
  }
  host xbox {
    hardware ethernet   50:1A:C5:5B:B7:AA;
    fixed-address       xbox.neuronpointer.net;
  }
}

/etc/init.d/isc-dhcp-server changed:
PATH=/sbin:/bin:/usr/sbin:/usr/bin
test -f /usr/sbin/dhcpd || exit 0
DHCPD_DEFAULT="${DHCPD_DEFAULT:-/etc/default/isc-dhcp-server}"
if [ ! -f "$DHCPD_DEFAULT" ]; then
        echo "$DHCPD_DEFAULT does not exist! - Aborting..."
        if [ "$DHCPD_DEFAULT" = "/etc/default/isc-dhcp-server" ]; then
                echo "Run 'dpkg-reconfigure isc-dhcp-server' to fix the 
problem."
        fi
        exit 0
fi
. /lib/lsb/init-functions
[ -f "$DHCPD_DEFAULT" ] && . "$DHCPD_DEFAULT"
NAME4=dhcpd
NAME6=dhcpd6
DESC4="ISC DHCPv4 server"
DESC6="ISC DHCPv6 server"
DHCPDv4_CONF=${DHCPDv4_CONF:-/etc/dhcp/dhcpd.conf}
DHCPDv6_CONF=${DHCPDv6_CONF:-/etc/dhcp/dhcpd6.conf}
if [ -z "$DHCPDv4_PID" ]; then
        DHCPDv4_PID=$(sed -n -e 's/^[ \t]*pid-file-name[ \t]*"\(.*\)"[ 
\t]*;.*$/\1/p' < "$DHCPDv4_CONF" 2>/dev/null | head -n 1)
fi
if [ -z "$DHCPDv6_PID" ]; then
        DHCPDv6_PID=$(sed -n -e 's/^[ \t]*dhcpv6-pid-file-name[ \t]*"\(.*\)"[ 
\t]*;.*$/\1/p' < "$DHCPDv6_CONF" 2>/dev/null | head -n 1)
fi
DHCPDv4_PID="${DHCPDv4_PID:-/var/run/dhcpd.pid}"
DHCPDv6_PID="${DHCPDv6_PID:-/var/run/dhcpd6.pid}"
test_config()
{
        VERSION="$1"
        CONF="$2"
        if ! /usr/sbin/dhcpd -t $VERSION -q -cf "$CONF" > /dev/null 2>&1; then
                echo "dhcpd self-test failed. Please fix $CONF."
                echo "The error was: "
                /usr/sbin/dhcpd -t $VERSION -cf "$CONF"
                exit 1
        fi
}
check_status()
{
        OPTION="$1"
        PIDFILE="$2"
        NAME="$3"
        if [ ! -r "$PIDFILE" ]; then
                test "$OPTION" != -v || echo "$NAME is not running."
                return 3
        fi
        if read pid < "$PIDFILE" && ps -p "$pid" > /dev/null 2>&1; then
                test "$OPTION" != -v || echo "$NAME is running."
                return 0
        else
                test "$OPTION" != -v || echo "$NAME is not running but $PIDFILE 
exists."
                return 1
        fi
}
start_daemon()
{
        VERSION="$1"
        CONF="$2"
        NAME="$3"
        PIDFILE="$4"
        DESC="$5"
        shift 5
        INTERFACES="$*"
        test_config "$VERSION" "$CONF"
        log_daemon_msg "Starting $DESC" "$NAME"
        if [ -e "$PIDFILE" ]; then
                log_failure_msg "dhcpd service already running (pid file 
$PIDFILE currenty exists)"
                exit 1
        fi
        touch /var/lib/dhcp/$NAME.leases
        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --exec /usr/sbin/dhcpd -- $VERSION -q -cf $CONF $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()
{
        if check_status -q $DHCPDv4_PID $NAME4; then
                log_daemon_msg "Stopping $DESC4" "$NAME4"
                start-stop-daemon --stop --quiet --pidfile $DHCPDv4_PID
                log_end_msg $?
                rm -f "$DHCPDv4_PID"
        fi
        if check_status -q $DHCPDv6_PID $NAME6; then
                log_daemon_msg "Stopping $DESC6" "$NAME6"
                start-stop-daemon --stop --quiet --pidfile $DHCPDv6_PID
                log_end_msg $?
                rm -f "$DHCPDv6_PID"
        fi
}
case "$1" in
        start)
                if test -n "$INTERFACES" -a -z "$INTERFACESv4"; then
                        echo "DHCPv4 interfaces are no longer set by the 
INTERFACES variable in" >&2
                        echo "/etc/default/isc-dhcp-server.  Please use 
INTERFACESv4 instead." >&2
                        echo "Migrating automatically for now, but this will go 
away in the future." >&2
                        INTERFACESv4="$INTERFACES"
                fi
                if test -n "$INTERFACESv4" -o -n "$IPV4"; then
                        echo "Launching IPv4 server only."
                        start_daemon "-4" "$DHCPDv4_CONF" "$NAME4" \
                                "$DHCPDv4_PID" "$DESC4" "$INTERFACESv4"
                elif test -n "$INTERFACESv6" -o -n "$IPV6"; then
                        echo "Launching IPv6 server only."
                        start_daemon "-6" "$DHCPDv6_CONF" "$NAME6" \
                                "$DHCPDv6_PID" "$DESC6" "$INTERFACESv6"
                else
                        echo "Launching both IPv4 and IPv6 servers (please 
configure INTERFACES in /etc/default/isc-dhcp-server if you only want one or 
the other)."
                        start_daemon "-4" "$DHCPDv4_CONF" "$NAME4" \
                                "$DHCPDv4_PID" "$DESC4" ""
                        start_daemon "-6" "$DHCPDv6_CONF" "$NAME6" \
                                "$DHCPDv6_PID" "$DESC6" ""
                fi
                ;;
        stop)
                stop_daemon
                ;;
        restart | force-reload)
                $0 stop
                sleep 2
                $0 start
                if [ "$?" != "0" ]; then
                        exit 1
                fi
                ;;
        status)
                if test -n "$INTERFACES" -a -z "$INTERFACESv4"; then
                        INTERFACESv4="$INTERFACES"
                fi
                if test -n "$INTERFACESv4" -o -n "$IPV4"; then
                        echo -n "Status of $DESC4: "
                        check_status -v $DHCPDv4_PID $NAME4 || exit $?
                elif test -n "$INTERFACESv6" -o -n "$IPV6"; then
                        echo -n "Status of $DESC6: "
                        check_status -v $DHCPDv6_PID $NAME6 || exit $?
                else
                        echo -n "Status of $DESC4: "
                        check_status -v $DHCPDv4_PID $NAME4 || exit $?
                        echo -n "Status of $DESC6: "
                        check_status -v $DHCPDv6_PID $NAME6 || exit $?
                fi
                ;;
        *)
                echo "Usage: $0 {start|stop|restart|force-reload|status}"
                exit 1
esac
exit 0


-- debconf information:
  isc-dhcp-server/interfaces:

-- 
Aaron Bugher
147c147
< 		if test -n "$INTERFACESv4"; then
---
> 		if test -n "$INTERFACESv4" -o -n "$IPV4ONLY"; then
151,152c151
< 		fi
< 		if test -n "$INTERFACESv6"; then
---
> 		elif test -n "$INTERFACESv6" -o -n "$IPV6ONLY"; then
156,157c155
< 		fi
< 		if test -z "$INTERFACESv4" -a -z "$INTERFACESv6"; then
---
> 		else
180c178,184
< 		if test -n "$INTERFACESv4"; then
---
> 		if test -n "$INTERFACESv4" -o -n "$IPV4ONLY"; then
> 			echo -n "Status of $DESC4: "
> 			check_status -v $DHCPDv4_PID $NAME4 || exit $?
> 		elif test -n "$INTERFACESv6" -o -n "$IPV6ONLY"; then
> 			echo -n "Status of $DESC6: "
> 			check_status -v $DHCPDv6_PID $NAME6 || exit $?
>                 else
183,184d186
< 		fi
< 		if test -n "$INTERFACESv6"; then

Reply via email to