etc: Add environment option to run init.d/ashd silently.
[ashd.git] / etc / debian / init.d-ashd
1 #!/bin/sh
2 ### BEGIN INIT INFO
3 # Provides:          ashd
4 # Required-Start:    $local_fs $remote_fs $network $syslog
5 # Required-Stop:     $local_fs $remote_fs $network $syslog
6 # Default-Start:     2 3 4 5
7 # Default-Stop:      0 1 6
8 # Short-Description: The ashd HTTP server
9 ### END INIT INFO
10
11 set -e
12
13 . /lib/lsb/init-functions
14
15 PATH=/usr/local/bin:/usr/local/sbin:$PATH
16 HTPARSER="$(which htparser || true)"
17 PIDFILE=/var/run/ashd.pid
18 GRACE_PERIOD=10
19 USER=nobody
20 CHROOT=/var/tmp
21 PORTSPEC="plain"
22 ROOTSPEC="dirplex /srv/www"
23 [ -r /etc/default/locale ] && . /etc/default/locale
24 [ -r /etc/default/ashd ] && . /etc/default/ashd
25 [ -x "$HTPARSER" ] || exit 0
26
27 start() {
28     export LANG
29     [ -n "$SILENT_INIT" ] || log_daemon_msg "Starting HTTP server" "ashd"
30     if start-stop-daemon -S -p "$PIDFILE" -qa "$HTPARSER" -- -Sf -p "$PIDFILE" -u "$USER" -r "$CHROOT" $PORTSPEC -- $ROOTSPEC; then
31         [ -n "$SILENT_INIT" ] || log_success_msg
32     else
33         [ -n "$SILENT_INIT" ] || log_end_msg 1
34     fi
35 }
36
37 kill_wholly() {
38     start-stop-daemon -K -p "$PIDFILE" -qx "$HTPARSER"
39 }
40
41 kill_listen() {
42     pid=$(cat "$PIDFILE" 2>/dev/null || true)
43     if [ -z "$pid" ]; then
44         log_failure_msg "no pid file"
45         return 1
46     fi
47     if ! kill -0 "$pid"; then
48         log_failure_msg "invalid saved pid"
49         return 1
50     fi
51     [ -n "$SILENT_INIT" ] || log_progress_msg "listen"
52     kill -TERM "$pid"
53     for try in 0 1 2 3 4 5; do
54           sleep $try
55           case "$(wc -l <"$PIDFILE")" in
56               1) continue ;;
57               0|2) return 0 ;;
58               *)
59                   log_failure_msg "could not parse pid file"
60                   return 1
61                   ;;
62           esac
63     done
64     log_failure_msg "htparser did not stop listening, killing it completely"
65     kill_wholly
66     start-stop-daemon -K -p "$PIDFILE" -qx "$HTPARSER"
67     return 1
68 }
69
70 stop_listen() {
71     [ -n "$SILENT_INIT" ] || log_daemon_msg "Stopping HTTP server" "ashd"
72     if kill_listen; then
73         [ -n "$SILENT_INIT" ] || log_success_msg
74     else
75         [ -n "$SILENT_INIT" ] || log_end_msg $?
76     fi
77 }
78
79 stop_gracefully() {
80     [ -n "$SILENT_INIT" ] || log_daemon_msg "Stopping HTTP server" "ashd"
81     if ! kill_listen ; then
82         log_end_msg 1
83         return 1
84     fi
85     pid=$(cat "$PIDFILE" 2>/dev/null || true)
86     if kill -0 "$pid" 2>/dev/null; then
87         [ -n "$SILENT_INIT" ] || log_progress_msg "waiting for remaining connections..."
88         for try in $(seq "$GRACE_PERIOD"); do
89             sleep 1
90             if ! kill -0 "$pid" 2>/dev/null; then
91                 [ -n "$SILENT_INIT" ] || log_success_msg
92                 return 0
93             fi
94         done
95     else
96         [ -n "$SILENT_INIT" ] || log_success_msg
97         return 0
98     fi
99     [ -n "$SILENT_INIT" ] || log_progress_msg "terminating remaining connections"
100     if kill_wholly; then
101         [ -n "$SILENT_INIT" ] || log_success_msg
102     else
103         log_end_msg 1
104     fi
105 }
106
107 case "$1" in
108     start)
109         start
110         ;;
111     stop)
112         stop_gracefully
113         ;;
114     restart)
115         stop_listen
116         # Truncate PID file to allow start-stop-daemon to work despite remaining connections.
117         >"$PIDFILE"
118         start
119         ;;
120 esac
121
122 exit 0