Inconsistence between /etc/init and /etc/init.d files

Bug #1368688 reported by Artyom on 2014-09-12
32
This bug affects 6 people
Affects Status Importance Assigned to Milestone
isc-dhcp (Ubuntu)
Undecided
Unassigned

Bug Description

After upgrade Ubuntu server from 12.04 LTS to 14.04 LTS (with do-release-upgrade) I found a strange behavior in /var/log/messages from isc-dhcp-server. It had doubled DHCPREQUESTS/OFFERS/ACKs... It was like:
~~
dhcpd: DHCPDISCOVER from 00:0b:82:27:be:d1 via eth0
dhcpd: DHCPDISCOVER from 00:0b:82:27:be:d1 via eth0
DHCPREQUEST for 192.168.1.102 (10.112.1.252) from 00:0b:82:27:be:d1 via eth0
DHCPREQUEST for 192.168.1.102 (10.112.1.252) from 00:0b:82:27:be:d1 via eth0
DHCPACK on 192.168.1.102 to 00:0b:82:27:be:d1 via eth0
DHCPACK on 192.168.1.102 to 00:0b:82:27:be:d1 via eth0
~~

Futher investigation show that there was actually two dhcpd processes:
~~
dhcpd -q -cf /etc/dhcp/dhcpd.conf -pf /var/run/dhcp-server/dhcpd.pid
/usr/sbin/dhcpd -q -cf /etc/dhcp/dhcpd.conf -pf /var/run/dhcpd.pid
~~

The first one was executed from "/etc/init/isc-dhcp-server.conf" and second from "/etc/init.d/isc-dhcp-server".
Looking inside "init/isc-dhcp-server.conf" I found:
~~
respawn
script
   . /etc/default/isc-dhcp-server
  ......
 exec dhcpd -user dhcpd -group dhcpd -f -q -4 -pf /run/dhcp-server/dhcpd.pid -cf $CONFIG_FILE $INTERFACES
~~

As you can see path to PID file is hardcoded.

But in "init.d/isc-dhcp-server" startup script:
~~
# try to read pid file name from config file, with fallback to /var/run/dhcpd.pid
if [ -z "$DHCPD_PID" ]; then
        DHCPD_PID=$(sed -n -e 's/^[ \t]*pid-file-name[ \t]*"(.*)"[ \t]*;.*$/\1/p' < "$DHCPD_CONF" 2>/dev/null | head -n 1)
fi
DHCPD_PID="${DHCPD_PID:-/var/run/dhcpd.pid}"
  ......
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
~~

So obivous is to either change init script to NOT use hardcoded path to PID file and use $DHCP_PID (from /etc/default/isc-dhcp-server, which is sourced inside this script), or at least change it to "default" one: /var/run/dhcpd.pid

OR

change init.d script to fallback to "/run/dhcp-server/dhcpd.pid" instead of "/var/run/dhcpd.pid"

P.S. /var/run is a link to /run

Artyom (halt-avmc) on 2014-09-12
description: updated
Peter Silva (peter-bsqt) wrote :

Another inconsistency... /etc/default/isc-dhcp-server refers to the variable DHCPD_CONF which is used by /etc/init.d scripts.
the upstart procedure uses only CONFIG_FILE. So following the instructions in /etc/default/isc-dhcp-server results in a dhcp server that starts well from init.d, but fails with a syntax error from upstart.

Peter Silva (peter-bsqt) wrote :

also, both the ipv4 and ipv6 upstart conf files reference /etc/default/isc-dhcp-server, which will never be a good thing, as the normal case is to be running both, and they can never use the same config file, which is set there.

Launchpad Janitor (janitor) wrote :

Status changed to 'Confirmed' because the bug affects multiple users.

Changed in isc-dhcp (Ubuntu):
status: New → Confirmed
Joi Owen (jlellis) wrote :

I just upgraded a 12.04 to 14.04.1 and discovered my server now boots three instances of dhcpd, one with -6, which dies because there is no config file for it, and two instances of -4, one reading from /etc/dhcp/dhcpd.conf, and the other from /etc/dhcp3/dhcpd.conf.

From my reading, it appears the Sys V script should now be following the format described in the page https://wiki.ubuntu.com/UpstartCompatibleInitScripts (Upstart Compatible Init Scripts) IE it should be testing for is_upstart_job in the case actions, but it is not doing so.

Also note that the Upstart script is ignoring the information in /etc/default/isc-dhcp-server, and providing its own locations for things like the conf file and the pid file. It should be honoring the defaults file!

Serge van Ginderachter (svg) wrote :

# Workaround:

dpkg-divert --divert /etc/init.d/isc-dhcp-server.disabled --rename /etc/init.d/isc-dhcp-server
ln -s /lib/init/upstart-job /etc/init.d/isc-dhcp-server

John Center (john-center) wrote :

This just bit us, also. We migrated from Solaris to Ubuntu 14.04 for our dhcp server. Please fix!

Evren Yurtesen (eyurtese-g) wrote :

I have been hit by this bug also. Also dhcpd starts normally with dhcp user but if restarted using the script in init.d, it starts another instance with root user. Will you ever fix this simple issue?

Carlos Vicente (cvicente75) wrote :

Also was hit by this bug. Please fix it.

To post a comment you must log in.
This report contains Public information  Edit
Everyone can see this information.

Other bug subscribers