summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndřej Surý <ondrej@sury.org>2013-07-02 13:08:27 +0200
committerOndřej Surý <ondrej@sury.org>2013-07-02 14:42:34 +0200
commitf2dbfc98861b53337c89d3784f4082a02ec30ce6 (patch)
tree902490f713b3d02b8805a37084b16bb3c709d3c5
parentcf112b7cfe514d52c8800fa3c8a776ba0b8a892c (diff)
downloadknot-f2dbfc98861b53337c89d3784f4082a02ec30ce6.tar.gz
Add proper support for upstart and systemd along with sysvinit
-rw-r--r--debian/control6
-rw-r--r--debian/knot.default10
-rw-r--r--debian/knot.init.d176
-rw-r--r--debian/knot.install1
-rw-r--r--debian/knot.postinst2
-rw-r--r--debian/knot.postrm2
-rw-r--r--debian/knot.preinst8
-rw-r--r--debian/knot.prerm8
-rw-r--r--debian/knot.service13
-rw-r--r--debian/knot.upstart13
-rwxr-xr-xdebian/prepare-environment38
-rwxr-xr-xdebian/rules9
12 files changed, 182 insertions, 104 deletions
diff --git a/debian/control b/debian/control
index cdac283..b6fc97e 100644
--- a/debian/control
+++ b/debian/control
@@ -3,10 +3,8 @@ Section: net
Priority: extra
Maintainer: Ondřej Surý <ondrej@debian.org>
Build-Depends: debhelper (>= 9),
- autotools-dev,
- autoconf,
- automake,
- libtool,
+ dh-autoreconf,
+ dh-systemd (>= 1.3),
liburcu-dev (>= 0.4),
libssl-dev,
flex,
diff --git a/debian/knot.default b/debian/knot.default
deleted file mode 100644
index f86da83..0000000
--- a/debian/knot.default
+++ /dev/null
@@ -1,10 +0,0 @@
-# Defaults for knot initscript
-# sourced by /etc/init.d/knot
-# installed at /etc/default/knot by the maintainer scripts
-
-#
-# This is a POSIX shell fragment
-#
-
-# Additional options that are passed to the Daemon.
-DAEMON_ARGS="-d"
diff --git a/debian/knot.init.d b/debian/knot.init.d
index c148445..4ef17df 100644
--- a/debian/knot.init.d
+++ b/debian/knot.init.d
@@ -16,16 +16,20 @@ PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Knot DNS server" # Introduce a short description here
NAME=knotd # Introduce the short server's name here
DAEMON=/usr/sbin/$NAME # Introduce the server's location here
-DAEMON_ARGS="-d" # Arguments to run the daemon with
-RUNDIR=/run/knot
-PIDFILE=${RUNDIR}/$NAME.pid
-SCRIPTNAME=/etc/init.d/$NAME
+DAEMON_CONFFILE=/etc/knot/knot.conf
+DAEMON_ARGS="-d -c $DAEMON_CONFFILE"
+SCRIPTNAME=/etc/init.d/knot
+
+KNOTC=/usr/sbin/knotc
# Exit if the package is not installed
[ -x $DAEMON ] || exit 0
-# Read configuration variable file if it is present
-[ -r /etc/default/knot ] && . /etc/default/knot
+# Read rundir from default configuration
+KNOT_RUNDIR=$(sed -ne "s/#.*$//;s/.*rundir \"*\([^\";]*\\).*/\\1/p;" $DAEMON_CONFFILE)
+[ -z "$KNOT_RUNDIR" ] && KNOT_RUNDIR=/run/knot
+
+PIDFILE=${KNOT_RUNDIR}/knot.pid
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
@@ -36,32 +40,41 @@ SCRIPTNAME=/etc/init.d/$NAME
# Don't run if we are running upstart
if init_is_upstart; then
- exit 1
+ case "$1" in
+ stop)
+ exit 0
+ ;;
+ *)
+ exit 1
+ ;;
+ esac
fi
-check_rundir()
-{
- [ -d "${RUNDIR}" ] && mkdir "${RUNDIR}"
- [ -n "${KNOT_USER}" -a -n "${KNOT_GROUP}" ] && chown ${KNOT_USER}:${KNOT_GROUP} "${RUNDIR}"
-}
+#
+# Prepare /run/knot (or other configured rundir)
+# and chown it to user.group as set it in conffile
+#
+
+/usr/lib/knot/prepare-environment $DAEMON_CONFFILE
#
# Function that starts the daemon/service
#
do_start()
{
- # Return
- # 0 if daemon has been started
- # 1 if daemon was already running
- # 2 if daemon could not be started
- start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
- || return 1
- start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
- $DAEMON_ARGS \
- || return 2
- # Add code here, if necessary, that waits for the process to be ready
- # to handle requests from services started subsequently which depend
- # on this one. As a last resort, sleep for some time.
+ # Return
+ # 0 if daemon has been started
+ # 1 if daemon was already running
+ # 2 if daemon could not be started
+
+ $KNOTC status >/dev/null 2>/dev/null \
+ && return 1
+
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
+ || return 1
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
+ $DAEMON_ARGS \
+ || return 2
}
#
@@ -69,94 +82,81 @@ do_start()
#
do_stop()
{
- # Return
- # 0 if daemon has been stopped
- # 1 if daemon was already stopped
- # 2 if daemon could not be stopped
- # other if a failure occurred
- start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
- RETVAL="$?"
- [ "$RETVAL" = 2 ] && return 2
- # Wait for children to finish too if this is a daemon that forks
- # and if the daemon is only ever run from this initscript.
- # If the above conditions are not satisfied then add some other code
- # that waits for the process to drop all resources that could be
- # needed by services started subsequently. A last resort is to
- # sleep for some time.
- start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
- [ "$?" = 2 ] && return 2
- # Many daemons don't delete their pidfiles when they exit.
- rm -f $PIDFILE
- return "$RETVAL"
+ # Return
+ # 0 if daemon has been stopped
+ # 1 if daemon was already stopped
+ # 2 if daemon could not be stopped
+ # other if a failure occurred
+
+ $KNOTC status >/dev/null 2>/dev/null \
+ || return 1
+
+ $KNOTC stop >/dev/null
+ RETVAL="$?"
+ [ $? = 1 ] && return 2
+
+ # Many daemons don't delete their pidfiles when they exit.
+ rm -f $PIDFILE
+ return 0
}
-#
-# Function that sends a SIGHUP to the daemon/service
-#
do_reload() {
- #
- # If the daemon can reload its configuration without
- # restarting (for example, when it is sent a SIGHUP),
- # then implement that here.
- #
- start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
- return 0
+ $KNOTC reload >/dev/null
+ return $?
}
case "$1" in
- start)
- [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
- do_start
- case "$?" in
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+ start)
+ [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
+ do_start
+ case "$?" in
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
- ;;
- stop)
+ ;;
+ stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
- status)
- status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
- ;;
- #reload|force-reload)
- #
- # If do_reload() is not implemented then leave this commented out
- # and leave 'force-reload' as an alias for 'restart'.
- #
- #log_daemon_msg "Reloading $DESC" "$NAME"
- #do_reload
- #log_end_msg $?
- #;;
- restart|force-reload)
- #
- # If the "reload" option is implemented then remove the
- # 'force-reload' alias
- #
+ status)
+ STATUS=$($KNOTC status 2>&1 >/dev/null)
+ RETVAL=$?
+ if [ $RETVAL = 0 ]; then
+ log_success_msg "$NAME is running"
+ else
+ log_failure_msg "$NAME is not running ($STATUS)"
+ fi
+ exit $RETVAL
+ ;;
+ reload|force-reload)
+ [ "$VERBOSE" != no ] && log_daemon_msg "Reloading $DESC" "$NAME"
+ do_reload
+ [ "$VERBOSE" != no ] && log_end_msg $?
+ ;;
+ restart)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
- 0|1)
+ 0|1)
do_start
case "$?" in
- 0) log_end_msg 0 ;;
- 1) log_end_msg 1 ;; # Old process is still running
- *) log_end_msg 1 ;; # Failed to start
+ 0) log_end_msg 0 ;;
+ 1) log_end_msg 1 ;; # Old process is still running
+ *) log_end_msg 1 ;; # Failed to start
esac
;;
- *)
+ *)
# Failed to stop
log_end_msg 1
;;
esac
;;
- *)
- #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
- echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
+ *)
+ echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
exit 3
;;
esac
diff --git a/debian/knot.install b/debian/knot.install
index c7fea76..826e5f1 100644
--- a/debian/knot.install
+++ b/debian/knot.install
@@ -5,3 +5,4 @@ usr/share/man/man8/knotc.8
usr/share/man/man8/knotd.8
usr/share/info
etc/knot/knot.conf
+usr/lib/knot/prepare-environment
diff --git a/debian/knot.postinst b/debian/knot.postinst
index a9de4cd..04aca3c 100644
--- a/debian/knot.postinst
+++ b/debian/knot.postinst
@@ -1,6 +1,8 @@
#!/bin/sh
set -e
+dpkg-maintscript-helper rm_conffile /etc/default/knot 1.3.0~rc3-2~ -- "$@"
+
if [ "$1" = "configure" ]; then
if ! getent passwd knot > /dev/null; then
adduser --quiet --system --group --no-create-home knot
diff --git a/debian/knot.postrm b/debian/knot.postrm
index 31b8993..43e5f14 100644
--- a/debian/knot.postrm
+++ b/debian/knot.postrm
@@ -1,6 +1,8 @@
#!/bin/sh
set -e
+dpkg-maintscript-helper rm_conffile /etc/default/knot 1.3.0~rc3-2~ -- "$@"
+
if test "$1" = "purge"; then
spool=/var/lib/knot
rm -f $spool/*.db $spool/*.db.crc
diff --git a/debian/knot.preinst b/debian/knot.preinst
new file mode 100644
index 0000000..5b78b95
--- /dev/null
+++ b/debian/knot.preinst
@@ -0,0 +1,8 @@
+#!/bin/sh
+set -e
+
+dpkg-maintscript-helper rm_conffile /etc/default/knot 1.3.0~rc3-2~ -- "$@"
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/knot.prerm b/debian/knot.prerm
new file mode 100644
index 0000000..5b78b95
--- /dev/null
+++ b/debian/knot.prerm
@@ -0,0 +1,8 @@
+#!/bin/sh
+set -e
+
+dpkg-maintscript-helper rm_conffile /etc/default/knot 1.3.0~rc3-2~ -- "$@"
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/knot.service b/debian/knot.service
new file mode 100644
index 0000000..a0b5b6e
--- /dev/null
+++ b/debian/knot.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Knot DNS server
+After=syslog.target network.target
+
+[Service]
+Environment=CONFFILE=/etc/knot/knot.conf
+ExecStartPre=/usr/lib/knot/prepare-environment $CONFFILE
+ExecReload=/usr/sbin/knotc reload
+ExecStart=/usr/sbin/knotd -c $CONFFILE
+Restart=on-abort
+
+[Install]
+WantedBy=multi-user.target
diff --git a/debian/knot.upstart b/debian/knot.upstart
new file mode 100644
index 0000000..1a61987
--- /dev/null
+++ b/debian/knot.upstart
@@ -0,0 +1,13 @@
+# knot - Knot DNS Server
+
+description "Knot DNS Server"
+author "Ondřej Surý <ondrej@debian.org>"
+
+start on runlevel [2345]
+stop on runlevel [016]
+
+env CONFFILE=/etc/knot/knot.conf
+
+respawn
+pre-start exec /usr/lib/knot/prepare-environment $CONFFILE
+exec /usr/sbin/knotd -c $CONFFILE
diff --git a/debian/prepare-environment b/debian/prepare-environment
new file mode 100755
index 0000000..8c8f8f5
--- /dev/null
+++ b/debian/prepare-environment
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+set -eu
+
+CONFFILE=${1:-/etc/knot/knot.conf}
+
+if [ ! -r $CONFFILE ]; then
+ echo "$CONFFILE doesn't exist or has wrong permissions."
+ exit 1;
+fi
+
+KNOT_RUNDIR=$(sed -ne "s/#.*$//;s/.*rundir \"*\([^\";]*\\).*/\\1/p;" $CONFFILE)
+[ -z "$KNOT_RUNDIR" ] && KNOT_RUNDIR=/run/knot
+
+mkdir --parents "$KNOT_RUNDIR";
+
+KNOT_USER=$(sed -ne "s/#.*$//;s/.*user \\([^\\.;]*\\).*/\\1/p;" $CONFFILE)
+
+if [ -n "$KNOT_USER" ]; then
+ if ! getent passwd $KNOT_USER >/dev/null; then
+ echo "Configured user '$KNOT_USER' doesn't exist."
+ exit 1
+ fi
+
+ KNOT_GROUP=$(sed -ne "s/#.*$//;s/.*user [^\\.;]*\\.\\([^;]*\\).*/\\1/p;" $CONFFILE)
+ if [ -z "$KNOT_GROUP" ]; then
+ KNOT_GROUP=$(getent group $(getent passwd "$KNOT_USER" | cut -f 4 -d :) | cut -f 1 -d :)
+ fi
+
+ if ! getent group $KNOT_GROUP >/dev/null; then
+ echo "Configured group '$KNOT_GROUP' doesn't exist."
+ exit 1
+ fi
+ chown --silent "$KNOT_USER:$KNOT_GROUP" "$KNOT_RUNDIR"
+ chmod 775 "$KNOT_RUNDIR"
+fi
+
+:
diff --git a/debian/rules b/debian/rules
index dddfcb9..3a418b2 100755
--- a/debian/rules
+++ b/debian/rules
@@ -10,10 +10,9 @@
#export DH_VERBOSE=1
%:
- dh $@
+ dh $@ --with autoreconf,systemd
override_dh_auto_configure:
- autoreconf -fi
dh_auto_configure -- \
--sysconfdir=/etc/knot \
--localstatedir=/var/lib \
@@ -32,8 +31,14 @@ override_dh_strip:
dh_strip --dbg-package=knot-dbg
override_dh_install:
+ # Install sample conf as /etc/knot/knot.conf
mv $(CURDIR)/debian/tmp/etc/knot/knot.sample.conf $(CURDIR)/debian/tmp/etc/knot/knot.conf
+ # Remove useless example zone from /etc/knot
rm $(CURDIR)/debian/tmp/etc/knot/example.com.zone
+ # Install custom script which creates RUNDIR and chowns it according to conffile settings
+ install -m 755 -d $(CURDIR)/debian/tmp/usr/lib/knot/
+ install -m 755 $(CURDIR)/debian/prepare-environment $(CURDIR)/debian/tmp/usr/lib/knot/
+
dh_install --fail-missing
override_dh_installchangelogs: