package/base-files: /etc/rc.common: add service wrapper around start-stop-daemon
[openwrt/openwrt.git] / package / base-files / files / etc / rc.common
1 #!/bin/sh
2 # Copyright (C) 2006-2011 OpenWrt.org
3
4 . $IPKG_INSTROOT/etc/functions.sh
5
6 initscript=$1
7 action=${2:-help}
8 shift 2
9
10 #
11 # service: simple wrapper around start-stop-daemon
12 #
13 # Usage: service ACTION EXEC ARGS...
14 #
15 # Action:
16 # -S,--start start EXEC, passing it ARGS as its arguments
17 # -K,--stop stop EXEC (send it a $SERVICE_SIG_STOP signal)
18 # -R,--reload reload EXEC (send it a $SERVICE_SIG_RELOAD signal)
19 #
20 # Environment variables used:
21 # SERVICE_DAEMONIZE run EXEC in background
22 # SERVICE_WRITE_PID create a pid file and use it
23 # SERVICE_USE_PID assume EXEC creates its own pid file and use it
24 # SERVICE_PID_FILE pid file to use (default to /var/run/EXEC.pid)
25 # SERVICE_SIG_RELOAD signal used for reloading
26 # SERVICE_SIG_STOP signal used for stopping
27 # SERVICE_UID user EXEC should be run as
28 # SERVICE_GID group EXEC should be run as
29 #
30 # SERVICE_DEBUG don't do anything, but show what would be done
31 # SERVICE_QUIET don't print anything
32 #
33
34 SERVICE_QUIET=1
35 SERVICE_SIG_RELOAD="HUP"
36 SERVICE_SIG_STOP="TERM"
37
38 service() {
39 local ssd
40 local ssd_pid_file
41 local ssd_sig
42 local ssd_start
43 ssd="${SERVICE_DEBUG:+echo }start-stop-daemon${SERVICE_QUIET:+ -q}"
44 case "$1" in
45 -S|--start|start)
46 ssd="$ssd -S"
47 ssd_start=1
48 ;;
49 -K|--stop|stop)
50 ssd="$ssd -K"
51 ssd_sig="$SERVICE_SIG_STOP"
52 ;;
53 -R|--reload|reload)
54 ssd="$ssd -K"
55 ssd_sig="$SERVICE_SIG_RELOAD"
56 ;;
57 *)
58 echo "ssd: unknow action '$1'" 1>&2
59 return 1
60 esac
61 shift
62 if [ -z "$1" ]; then
63 echo "ssd: missing arguments" 1>&2
64 return 1
65 fi
66 ssd="$ssd -x $1"
67 if [ -n "$SERVICE_PID_FILE$SERVICE_USE_PID$SERVICE_WRITE_PID" ]; then
68 ssd="$ssd -p ${SERVICE_PID_FILE:-/var/run/${1##*/}.pid}"
69 fi
70 ssd="$ssd${SERVICE_UID:+ -c $SERVICE_UID${SERVICE_GID:+:$SERVICE_GID}}"
71 if [ -n "$ssd_start" ]; then
72 ssd="$ssd${SERVICE_DAEMONIZE:+ -b}${SERVICE_WRITE_PID:+ -m}"
73 else
74 ssd="$ssd${ssd_sig:+ -s $ssd_sig}"
75 fi
76 shift
77 $ssd${1:+ -- "$@"}
78 }
79
80 service_start() {
81 service -S "$@"
82 }
83
84 service_stop() {
85 service -K "$@"
86 }
87
88 service_reload() {
89 service -R "$@"
90 }
91
92 start() {
93 return 0
94 }
95
96 stop() {
97 return 0
98 }
99
100 reload() {
101 return 1
102 }
103
104 restart() {
105 trap '' TERM
106 stop "$@"
107 start "$@"
108 }
109
110 boot() {
111 start "$@"
112 }
113
114 shutdown() {
115 stop
116 }
117
118 disable() {
119 name="$(basename "${initscript}")"
120 rm -f "$IPKG_INSTROOT"/etc/rc.d/S??$name
121 rm -f "$IPKG_INSTROOT"/etc/rc.d/K??$name
122 }
123
124 enable() {
125 name="$(basename "${initscript}")"
126 disable
127 [ -n "$START" -o -n "$STOP" ] || {
128 echo "/etc/init.d/$name does not have a START or STOP value"
129 return 1
130 }
131 [ "$START" ] && ln -s "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}"
132 [ "$STOP" ] && ln -s "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/K${STOP}${name##K[0-9][0-9]}"
133 }
134
135 enabled() {
136 name="$(basename "${initscript}")"
137 [ -x "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" ]
138 }
139
140 depends() {
141 return 0
142 }
143
144 help() {
145 cat <<EOF
146 Syntax: $initscript [command]
147
148 Available commands:
149 start Start the service
150 stop Stop the service
151 restart Restart the service
152 reload Reload configuration files (or restart if that fails)
153 enable Enable service autostart
154 disable Disable service autostart
155 $EXTRA_HELP
156 EOF
157 }
158
159 . "$initscript"
160
161 ALL_COMMANDS="start stop reload restart boot shutdown enable disable enabled depends ${EXTRA_COMMANDS}"
162 list_contains ALL_COMMANDS "$action" || action=help
163 [ "$action" = "reload" ] && action='eval reload "$@" || restart "$@" && :'
164 $action "$@"