Last active
January 6, 2021 12:46
-
-
Save mdklapwijk/6edf2d86814e85fa97ccf8c80960faac to your computer and use it in GitHub Desktop.
Customized start/stop script for isc-dhcp-server on Debian 10; this implements wildcard config loading form dhcpd.conf.d and dhcpd6.conf.d.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
### BEGIN INIT INFO | |
# Provides: isc-dhcp-server | |
# Required-Start: $remote_fs $network $syslog | |
# Required-Stop: $remote_fs $network $syslog | |
# Should-Start: $local_fs slapd $named | |
# Should-Stop: $local_fs slapd | |
# Default-Start: 2 3 4 5 | |
# Default-Stop: 0 1 6 | |
# Short-Description: DHCP server | |
# Description: Dynamic Host Configuration Protocol Server | |
### END INIT INFO | |
PATH=/sbin:/bin:/usr/sbin:/usr/bin | |
test -f /usr/sbin/dhcpd || exit 0 | |
DHCPD_DEFAULT="${DHCPD_DEFAULT:-/etc/default/isc-dhcp-server}" | |
# It is not safe to start if we don't have a default configuration... | |
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 | |
# Read init script configuration | |
[ -f "$DHCPD_DEFAULT" ] && . "$DHCPD_DEFAULT" | |
NAME4=dhcpd | |
NAME6=dhcpd6 | |
DESC4="ISC DHCPv4 server" | |
DESC6="ISC DHCPv6 server" | |
# use already specified config file or fallback to defaults | |
DHCPDv4_CONF=${DHCPDv4_CONF:-/etc/dhcp/dhcpd.conf} | |
DHCPDv6_CONF=${DHCPDv6_CONF:-/etc/dhcp/dhcpd6.conf} | |
# try to read pid file name from config file or fallback to defaults | |
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 [ -d "${DHCPDv4_CONF}.d" ]; then | |
find $DHCPDv4_CONF.d/ -name "*.conf" -print0 | sort -z | xargs -r0 cat > $DHCPDv4_CONF.include | |
find $DHCPDv4_CONF.d/ -name "*.hosts" -print0 | sort -z | xargs -r0 cat >> $DHCPDv4_CONF.include | |
find $DHCPDv4_CONF.d/ -name "*.host" -print0 | sort -z | xargs -r0 cat >> $DHCPDv4_CONF.include | |
fi | |
if [ -d "${DHCPDv6_CONF}.d" ]; then | |
find $DHCPDv6_CONF.d/ -name "*.conf" -print0 | sort -z | xargs -r0 cat > $DHCPDv6_CONF.include | |
find $DHCPDv6_CONF.d/ -name "*.hosts" -print0 | sort -z | xargs -r0 cat >> $DHCPDv6_CONF.include | |
find $DHCPDv6_CONF.d/ -name "*.host" -print0 | sort -z | xargs -r0 cat >> $DHCPDv6_CONF.include | |
fi | |
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"; then | |
echo "Launching IPv4 server only." | |
start_daemon "-4" "$DHCPDv4_CONF" "$NAME4" \ | |
"$DHCPDv4_PID" "$DESC4" "$INTERFACESv4" | |
fi | |
if test -n "$INTERFACESv6"; then | |
echo "Launching IPv6 server only." | |
start_daemon "-6" "$DHCPDv6_CONF" "$NAME6" \ | |
"$DHCPDv6_PID" "$DESC6" "$INTERFACESv6" | |
fi | |
if test -z "$INTERFACESv4" -a -z "$INTERFACESv6"; then | |
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"; then | |
echo -n "Status of $DESC4: " | |
check_status -v $DHCPDv4_PID $NAME4 || exit $? | |
fi | |
if test -n "$INTERFACESv6"; then | |
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Allows something like:
What would need only the following include: