summaryrefslogtreecommitdiff
path: root/test/init-skeleton
blob: 27714a8bc62f60beabeb31863588a41e7ea35695 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
#!/bin/sh
#
# /etc/init.d/FOO
#
# Template and example of a LSB conform init script for the service FOO
# See http://www.linuxbase.org/spec/ for details
#
### BEGIN INIT INFO
# Provides:          FOO
# Required-Start:    $syslog $remote_fs
# Should-Start:      $time $portmap
# Required-Stop:     $syslog $remote_fs
# Should-Stop:       $time $portmap
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: FOO daemon used for ABC
# Description:       The FOO service is used for ZZZ
#	The (long) description can spread multiple lines
#	which start with '#<TAB>' or # followed by at least
#       two spaces.
# X-UnitedLinux-Default-Enabled: yes
### END INIT INFO
# 
# Remarks:
# - The LSB actually might be interpreted that there is only a single space
#   between the the colon after the keyword and the first argument, but
#   most or all LSB install_initd's support more than one space
# - Local extensions start with a X-[LANA registered provider or domain]-
#   The X-UnitedLinux-Default-Enabled is one of the few actually used
#   extension (enable service by when installing package, but keep current
#   status when updating).
#
# The other keywords are described by the LSB. Notes on the differences
# between Required-Start and Should-Start (which was introduced by LSB 1.9):
#
# a) Required-Start/Required-Stop is used as hard dependencies, i.e. for
#    services which have to be started before this service. For instance
#    needs the 'nfs-kernel-server' the portmap service. Requiring
#      Required-Start: $portmap
#    ensures that the portmapper is started before the nfs server.
#    If a required service is missing, an init script cannot be installed
#    and an init script which is required by another cannot be removed.
#
# b) Should-Start/Should-Stop is used for weak dependencies. This ensures
#    that the order of the init scripts is useful. A possible use for
#    'autofs' is to ask for
#      Should-Start: nis
#    which enables to read maps via NIS. Note that not all LSB install_initd
#    programs support Should-Start (Debian's does) and therefore one should
#    try hard not to rely on its support.
#
#    The Required-Stop/Should-Stop usually contain the same services as
#    Required-Start/Should-Start do.
#
#    Besides using the services provided by the Provides section of
#    init script, those predefined facilities are available
#    (while they start with a $ they are no shell variables):
#
#    a) LSB 1.1 facility names
#    - $local_fs    all local filesystems are mounted
#    - $remote_fs   all remote filesystems are mounted
#                   (note that /usr might be remote)
#    - $syslog      system logging is operational
#    - $network     low level networking (ethernet card etc.)
#    - $named       hostname resolution available
#    - $netdaemons  all network daemons are running
#                   (Removed in LSB 1.2)
#    b) LSB 1.2 facility names
#    - $time        the system time has been set (e.g. NTP)
#    - $portmap     daemons providing SunRPC/ONCRPC portmapping service
#                   are running
#
# The LSB specifies those runlevels, most services use 3 and 5 for
# Default-Start and 0 1 2 6 for Default-Stop.
# 
# 0 - halt
# 1 - single user mode
# 2 - multiuser with no network services exported
# 3 - normal/full multiuser
# 4 - reserved for local use (usually normal/full multiuser)
# 5 - multiuser with xdm or equivalent
# 6 - reboot
# 
# Note on that script names should follow the LSB:
# http://www.linuxbase.org/spec/gLSB/gLSB/scrptnames.html
# There is a registry for script names that are reserved for use by
# distributions and registered script and provider names at
# http://www.lanana.org/

# Source LSB init functions
# This provides start_daemon, killproc, pidofproc,
# log_success_msg, log_failure_msg and log_warning_msg.
. /lib/lsb/init-functions

# Since init scripts are config files, they might be left after an uninstall
# Check whether the binary is still present:
FOO_BIN=/usr/sbin/FOO
test -x "$FOO_BIN" || {log_failure_msg "$FOO_BIN not installed"; exit 5}

# Check whether a required configuration file is available
FOO_CONFIG=/etc/FOO.conf
test -r "$FOO_CONFIG" || {log_failure_msg "$FOO_CONFIG not existing"; exit 6}

# Those LSB defined exit status codes shall be used (except for status)
# 0     sucess
# 1	generic or unspecified error (current practice)
# 2	invalid or excess argument(s)
# 3	unimplemented feature (for example, "reload")
# 4	user had insufficient privilege
# 5	program is not installed
# 6	program is not configured
# 7    	program is not running
# 8-199 reserved (8-99 LSB, 100-149 distribution, 150-199 application)
# 
# Note that those situation shall also be regarded as success:
# * restarting a service (instead of reloading it)
#   with the "force-reload" argument
# * running "start" on a service already running
# * running "stop" on a service already stopped or not running
# * running "restart" on a service already stopped or not running
# * running "try-restart" on a service already stopped or not running
#

case "$1" in
    start)
	# Start service with startproc which shall return the
        # LSB exit status
	start_daemon "$FOO_BIN" -c "$FOO_CONFIG"
	STATUS=$?
	if [ "$STATUS" = 0 ]
	then
            log_success_msg "Starting FOO"
        else
  	    log_failure_msg "Starting FOO"
        fi
	exit $STATUS
	;;
    stop)
	echo -n "Shutting down FOO "
	# Stop the service with killproc which shall return the
        # LSB exit status
	killproc "$FOO_BIN"
	STATUS=$?
	if [ "$STATUS" = 0 ]
	    log_success_msg "Shutting down FOO"
	    exit 0
        else
	    log_failure_msg "Shutting down FOO"
        fi
	exit $STATUS
	;;
    try-restart)
	# Do a restart only if the service is running
	# try-restart has been added to the LSB in 1.9
	# RedHat's similar command is called condrestart.
	$0 status > /dev/null
	STATUS=$?
	if [ "$STATUS" = 0 ]
	then
	    $0 restart
	else
	    log_success_msg "Try-Restarting FOO: not running"
	fi
	exit 0 # not running is also regarded as success
	;;
    restart)
	# Restart service (if running) or start service
	$0 stop
	$0 start
	;;
    force-reload)
	# Reload the configuartion. Usually a SIGHUP is used for this
	# If it doesn't support his signal, restart it (only if running)

        # Supports signalling
	killproc -HUP "$FOO_BIN"
	SIGNAL=$?
	if [ "$SIGNAL" = 0 ]
	then
	    log_success_msg "Reloading FOO"
	else
	    log_failure_msg "Reloading FOO"
	fi
	exit $STATUS

	# Otherwise
	#$0 try-restart
	;;
    reload)
	# Reload configuration file, but don't restart if it is not supported

	# If it supports signaling:
	killproc -HUP "$FOO_BIN"
	SIGNAL=$?
	if [ "$SIGNAL" = 0 ]
	then
	    log_success_msg "Reloading FOO"
	else
	    log_failure_msg "Reloading FOO"
	fi
	exit $STATUS
	
	# Otherwise
	# exit 3
	;;
    status)
	# Use pidofproc to check the status of the service,
	# pidofproc returns the exit status code of 0 when it the process is
	# running.

	# LSB defined exit status codes for status:
	# 0	program is running or service is OK
	# 1	program is dead and /var/run pid file exists
	# 2	program is dead and /var/lock lock file exists
	# 3	program is not running
	# 4	program or service status is unknown
	# 5-199	reserved (5-99 LSB, 100-149 distribution, 150-199 applications)
	
	checkproc "$FOO_BIN" > /dev/null
	STATUS=$?
	if [ "$SIGNAL" = 0 ]
	then
	    log_success_msg "Checking FOO"
	else
	    log_warning_msg "Checking FOO: Not running"
	fi
	exit $STATUS
	;;
    *)
	echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
	exit 1
	;;
esac