X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=etc%2Fdebian%2Finit.d-ashd;h=d3738a19bde159368aac480cc336b14bf3cef26c;hb=HEAD;hp=9fd1e4287c89d03a469eac07f9d80402f19ebf60;hpb=4d2dc22a9a68395a5788ae66c84ae0ced2d0e733;p=ashd.git diff --git a/etc/debian/init.d-ashd b/etc/debian/init.d-ashd index 9fd1e42..d3738a1 100755 --- a/etc/debian/init.d-ashd +++ b/etc/debian/init.d-ashd @@ -15,6 +15,9 @@ 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="dirplex /srv/www" [ -r /etc/default/locale ] && . /etc/default/locale @@ -23,15 +26,82 @@ ROOTSPEC="dirplex /srv/www" start() { export LANG - log_daemon_msg "Starting HTTP server" "ashd" - 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 @@ -39,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