]> git.pld-linux.org Git - projects/rc-scripts.git/blob - service
- use initctl for upstart-controlled jobs
[projects/rc-scripts.git] / service
1 #!/bin/sh
2
3 # Set up a default search path.
4 PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
5 export PATH
6
7 VERSION="$(basename $0) ver. 0.91"
8 USAGE="Usage: $(basename $0) < option > | --status-all | \
9 [ service_name [ command | --full-restart ] ]"
10
11 SERVICE=
12
13 . /etc/rc.d/init.d/functions
14
15 if [ -d /etc/rc.d/init.d ]; then
16         SERVICEDIR="/etc/rc.d/init.d"
17 else
18         SERVICEDIR="/etc/init.d"
19 fi
20
21 if [ $# -eq 0 ]; then
22         echo "${USAGE}" >&2
23         exit 1
24 fi
25
26 is_task() {
27         grep -q '^task' "/etc/init/$1.conf"
28 }
29 is_running() {
30         initctl status "$1" 2>/dev/null | grep -q running
31 }
32 upstart_start() {
33         local SERVICE=$1
34         is_running "${SERVICE}" && return 0
35         msg_starting "${SERVICE}"
36         if errors=$(/sbin/initctl start ${SERVICE} 2>&1) ; then
37                 ok
38                 return 0
39         else
40                 fail
41                 echo "$errors" >&2
42                 return 1
43         fi
44 }
45 upstart_stop() {
46         local SERVICE=$1
47         if ! is_running "${SERVICE}" && ! is_task "${SERVICE}" ; then
48                 return 0
49         fi
50         msg_stopping "${SERVICE}"
51         if errors=$(/sbin/initctl stop ${SERVICE}) ; then
52                 ok
53                 return 0
54         else
55                 fail
56                 echo "$errors" >&2
57                 return 1
58         fi
59 }
60 upstart_status() {
61         # get service status
62         # should be compliant with
63         # http://refspecs.freestandards.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
64         local SERVICE=$1
65         local status
66         if is_task "${SERVICE}" ; then
67                 # we probably should have a way to handle task status
68                 return 0
69         fi
70         if ! status=$(/sbin/initctl status "${SERVICE}") ; then
71                 # program or service status is not known
72                 return 4
73         fi
74         if strstr "$status" "running" ; then
75                 # program is running or service is OK
76                 return 0
77         else
78                 # program is not running
79                 return 3
80         fi
81         # TODO: other statuses
82 }
83
84 cd /
85 while [ $# -gt 0 ]; do
86         case "${1}" in
87           --help | -h | --h* )
88                 echo "${USAGE}" >&2
89                 exit 0
90                 ;;
91           --version | -V )
92                 echo "${VERSION}" >&2
93                 exit 0
94                 ;;
95           *)
96                 if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
97                         cd ${SERVICEDIR}
98                         for SERVICE in * ; do
99                                 if use_upstart && [ -f "/etc/init/${SERVICE}.conf" ] ; then
100                                         continue
101                                 fi
102                                 case "${SERVICE}" in
103                                   functions | halt | killall | single| linuxconf| kudzu | \
104                                   *rpmorig | *rpmnew | *rpmsave | *~ | *.orig)
105                                         ;;
106                                   *)
107                                         if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
108                                                 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" status
109                                         fi
110                                         ;;
111                                 esac
112                         done
113                         if [ -d /etc/init ] && use_upstart ; then
114                                 cd /etc/init
115                                 for f in *.conf ; do
116                                         SERVICE="${f%.conf}"
117                                         case "${SERVICE}" in
118                                           control-alt-delete | rc | rcS-sulogin | rcS | start-ttys | tty)
119                                                 ;;
120                                           *)
121                                                 /sbin/initctl status "${SERVICE}"
122                                                 ;;
123                                         esac
124                                 done
125                         fi
126                         exit 0
127                 elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then
128                         SERVICE="${1}"
129                         if [ -f "/etc/init/${SERVICE}.conf" ] && use_upstart ; then
130                                 upstart_stop
131                                 upstart_start
132                         elif [ -x "${SERVICEDIR}/${SERVICE}" ]; then
133                                 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" stop
134                                 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" start
135                                 exit $?
136                         fi
137                 elif [ -z "${SERVICE}" ]; then
138                         SERVICE="${1}"
139                 else
140                         COMMAND="${1}"
141                         OPTIONS="${OPTIONS} ${1}"
142                 fi
143                 shift
144                 ;;
145         esac
146 done
147
148 if [ -f "/etc/init/${SERVICE}.conf" ] && use_upstart ; then
149         case $COMMAND in
150                 start)
151                         upstart_start "${SERVICE}"
152                         exit $?
153                         ;;
154                 stop)
155                         upstart_stop "${SERVICE}"
156                         exit $?
157                         ;;
158                 status)
159                         upstart_status "${SERVICE}"
160                         exit $?
161                         ;;
162                 force-reload)
163                         if ! grep -Eq '#\s*pld-flags:.*no-sighup-reload' "/etc/init/${SERVICE}.conf" ; then
164                                 upstart_reload "${SERVICE}"
165                                 exit $?
166                         else
167                                 upstart_stop "${SERVICE}"
168                                 upstart_start "${SERVICE}"
169                                 exit $?
170                         fi
171                         ;;
172                 reload)
173                         if ! grep -Eq '#\s*pld-flags:.*no-sighup-reload' "/etc/init/${SERVICE}.conf" ; then
174                                 upstart_reload "${SERVICE}"
175                                 exit $?
176                         fi
177                         if [ ! -x "${SERVICEDIR}/${SERVICE}" ]; then
178                                 msg_usage "$0 {start|stop|restart|status|force-reload}"
179                                 exit 3
180                         fi
181                         # if not handled here, pass it the rc.d/init.d script
182                         ;;
183                 *)
184                         if [ ! -x "${SERVICEDIR}/${SERVICE}" ]; then
185                                 commands="start|stop|restart|status|force-reload"
186                                 if ! grep -Eq '#\s*pld-flags:.*no-sighup-reload' "/etc/init/${SERVICE}.conf" ; then
187                                         commands="$commands|reload"
188                                 fi
189                                 msg_usage "$0 {$commands}"
190                                 exit 3
191                         fi
192                         # pass the rest to the rc.d/init.d script
193                         ;;
194         esac
195 fi
196
197 if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
198         env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
199 else
200         echo "${SERVICE}: unrecognized service" >&2
201         exit 1
202 fi
203
This page took 0.089619 seconds and 4 git commands to generate.