diff options
author | Ondřej Surý <ondrej@sury.org> | 2013-07-02 13:08:27 +0200 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2013-07-02 14:42:34 +0200 |
commit | f2dbfc98861b53337c89d3784f4082a02ec30ce6 (patch) | |
tree | 902490f713b3d02b8805a37084b16bb3c709d3c5 | |
parent | cf112b7cfe514d52c8800fa3c8a776ba0b8a892c (diff) | |
download | knot-f2dbfc98861b53337c89d3784f4082a02ec30ce6.tar.gz |
Add proper support for upstart and systemd along with sysvinit
-rw-r--r-- | debian/control | 6 | ||||
-rw-r--r-- | debian/knot.default | 10 | ||||
-rw-r--r-- | debian/knot.init.d | 176 | ||||
-rw-r--r-- | debian/knot.install | 1 | ||||
-rw-r--r-- | debian/knot.postinst | 2 | ||||
-rw-r--r-- | debian/knot.postrm | 2 | ||||
-rw-r--r-- | debian/knot.preinst | 8 | ||||
-rw-r--r-- | debian/knot.prerm | 8 | ||||
-rw-r--r-- | debian/knot.service | 13 | ||||
-rw-r--r-- | debian/knot.upstart | 13 | ||||
-rwxr-xr-x | debian/prepare-environment | 38 | ||||
-rwxr-xr-x | debian/rules | 9 |
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: |