X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=etc%2Fdebian%2Finit.d-ashd;h=d3738a19bde159368aac480cc336b14bf3cef26c;hb=HEAD;hp=64a6efba77f6b2eacc2aeedecb110a6e0b7b2108;hpb=9f61b28adfedcfd696b17485b2f873ae69b76196;p=ashd.git diff --git a/etc/debian/init.d-ashd b/etc/debian/init.d-ashd index 64a6efb..d3738a1 100755 --- a/etc/debian/init.d-ashd +++ b/etc/debian/init.d-ashd @@ -15,24 +15,93 @@ set -e PATH=/usr/local/bin:/usr/local/sbin:$PATH HTPARSER="$(which htparser || true)" PIDFILE=/var/run/ashd.pid +GRACE_PERIOD=10 +USER=nobody +CHROOT=/var/tmp PORTSPEC="plain" -ROOTSPEC="patplex /usr/local/etc/ashd/rootpat" +ROOTSPEC="dirplex /srv/www" [ -r /etc/default/locale ] && . /etc/default/locale [ -r /etc/default/ashd ] && . /etc/default/ashd [ -x "$HTPARSER" ] || exit 0 start() { export LANG - log_daemon_msg "Starting HTTP server" "ashd" - ulimit -c unlimited - start-stop-daemon -S -p "$PIDFILE" -qx "$HTPARSER" -- -Sf -p "$PIDFILE" -u nobody -r /var/tmp $PORTSPEC -- $ROOTSPEC - log_end_msg $? + [ -n "$SILENT_INIT" ] || log_daemon_msg "Starting HTTP server" "ashd" + if start-stop-daemon -S -p "$PIDFILE" -qa "$HTPARSER" -- -Sf -p "$PIDFILE" -u "$USER" -r "$CHROOT" $PORTSPEC -- $ROOTSPEC; then + [ -n "$SILENT_INIT" ] || log_success_msg + else + [ -n "$SILENT_INIT" ] || log_end_msg 1 + fi } -stop() { - log_daemon_msg "Stopping HTTP server" "ashd" +kill_wholly() { start-stop-daemon -K -p "$PIDFILE" -qx "$HTPARSER" - log_end_msg $? +} + +kill_listen() { + pid=$(cat "$PIDFILE" 2>/dev/null || true) + if [ -z "$pid" ]; then + log_failure_msg "no pid file" + return 1 + fi + if ! kill -0 "$pid"; then + log_failure_msg "invalid saved pid" + return 1 + fi + [ -n "$SILENT_INIT" ] || log_progress_msg "listen" + kill -TERM "$pid" + for try in 0 1 2 3 4 5; do + sleep $try + case "$(wc -l <"$PIDFILE")" in + 1) continue ;; + 0|2) return 0 ;; + *) + log_failure_msg "could not parse pid file" + return 1 + ;; + esac + done + log_failure_msg "htparser did not stop listening, killing it completely" + kill_wholly + start-stop-daemon -K -p "$PIDFILE" -qx "$HTPARSER" + return 1 +} + +stop_listen() { + [ -n "$SILENT_INIT" ] || log_daemon_msg "Stopping HTTP server" "ashd" + if kill_listen; then + [ -n "$SILENT_INIT" ] || log_success_msg + else + [ -n "$SILENT_INIT" ] || log_end_msg $? + fi +} + +stop_gracefully() { + [ -n "$SILENT_INIT" ] || log_daemon_msg "Stopping HTTP server" "ashd" + if ! kill_listen ; then + log_end_msg 1 + return 1 + fi + pid=$(cat "$PIDFILE" 2>/dev/null || true) + if kill -0 "$pid" 2>/dev/null; then + [ -n "$SILENT_INIT" ] || log_progress_msg "waiting for remaining connections..." + for try in $(seq "$GRACE_PERIOD"); do + sleep 1 + if ! kill -0 "$pid" 2>/dev/null; then + [ -n "$SILENT_INIT" ] || log_success_msg + return 0 + fi + done + else + [ -n "$SILENT_INIT" ] || log_success_msg + return 0 + fi + [ -n "$SILENT_INIT" ] || log_progress_msg "terminating remaining connections" + if kill_wholly; then + [ -n "$SILENT_INIT" ] || log_success_msg + else + log_end_msg 1 + fi } case "$1" in @@ -40,10 +109,12 @@ case "$1" in start ;; stop) - stop + stop_gracefully ;; restart) - stop + stop_listen + # Truncate PID file to allow start-stop-daemon to work despite remaining connections. + >"$PIDFILE" start ;; esac