#!/bin/sh ### BEGIN INIT INFO # Provides: ashd # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: The ashd HTTP server ### END INIT INFO set -e . /lib/lsb/init-functions 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 [ -r /etc/default/ashd ] && . /etc/default/ashd [ -x "$HTPARSER" ] || exit 0 start() { export LANG [ -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 } kill_wholly() { start-stop-daemon -K -p "$PIDFILE" -qx "$HTPARSER" } 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 start) start ;; stop) stop_gracefully ;; restart) stop_listen # Truncate PID file to allow start-stop-daemon to work despite remaining connections. >"$PIDFILE" start ;; esac exit 0