use systemctl instead of loop for --status-all (bnc#769902)
[opensuse:fcrozats-aaa_base.git] / files / sbin / service
1 #!/bin/sh
2 #
3 # /sbin/service         Handle boot and runlevel services
4 #
5
6 sd_booted()
7 {
8         test -d /sys/fs/cgroup/systemd/
9 }
10
11 #
12 # Only root should do
13 #
14 if ! sd_booted && test "$(id -u)" -ne 0; then
15    echo "${0##*/}: only root can use ${0##*/}" 1>&2
16    exit 1
17 fi
18
19 #
20 # Location of our service scripts
21 #
22 RCDIR="/etc/init.d"
23
24 #
25 # Clean environment
26 #
27 PATH=/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
28 test -n "$TERM" || TERM=raw
29 test -n "$SYSTEMD_NO_WRAP" && export SYSTEMD_NO_WRAP
30 LANG=POSIX
31 export PATH TERM LANG
32
33 exec_rc ()
34 {
35     env -i LANG=$LANG PATH=$PATH TERM=$TERM SYSTEMD_NO_WRAP=$SYSTEMD_NO_WRAP ${1+"$@"}
36 }
37
38 usage ()
39 {
40     echo "Usage: ${0##*/} [--help | --status-all | <service> [<args>| --full-restart]]" 1>&2
41     exit 1
42 }
43
44 help ()
45 {
46     echo "Usage: ${0##*/} [<options> | <service> [<args> | --full-restart]]"
47     echo "Available <options>:"
48     echo "  -h,--help        This help."
49     echo "  -s,--status-all  List out status of all services."
50     echo "Usage for specific <service>:"
51     echo "  ${0##*/} service_name argument [option]"
52     echo "  ${0##*/} service_name --full-restart"
53     echo "  ${0##*/} --full-restart service_name"
54     exit 0
55 }
56
57   status_all=0
58 full_restart=0
59         args=""
60 while test $# -gt 0; do
61     opt=
62     if test "${1::1}" = "-"; then
63         if test ${#1} -gt 2 -a "${1::2}" = "--" ; then
64             opt="${1:2}"
65         else
66             opt="${1:1}"
67         fi
68         shift
69     else
70         args="${args:+$args }$1"
71         shift
72         continue
73     fi
74
75     case "$opt" in
76     status-all|s)   status_all=1 ;;
77     full-restart) full_restart=1 ;;
78     h*)                     help ;;
79     *)                     usage ;;
80     esac
81 done
82
83 #
84 # Determine the status of all services
85 #
86 if test $status_all -gt 0 ; then
87     if test -n "$args" ; then
88         usage 1>&2
89         exit 1
90     fi
91     if sd_booted; then
92             systemctl --full --no-legend --no-pager --type=service list-units
93     else
94             for rc in ${RCDIR}/*; do
95                 test ! -x "$rc" -o -d "$rc"    && continue
96                 case "${rc##*/}" in
97                 *.local|*.rpm*|*.ba*|*.old|*.new) continue ;;
98                 *.dpkg|*.save|*.swp|*.core)       continue ;;
99                 *.disabled)                       continue ;;
100                 boot|rc|single|halt|reboot)       continue ;;
101                 powerfail|rx|Makefile|README)     continue ;;
102                 skeleton|*.d)                     continue ;;
103                 esac
104                 exec_rc $rc status
105             done
106     fi
107     exit 0
108 fi
109
110 #
111 # Do a full restart of a few services
112 #
113 if test $full_restart -gt 0 ; then
114     if test -z "$args" ; then
115         usage 1>&2
116         exit 1
117     fi
118     for rc in $args; do
119         if test ! -x ${RCDIR}/$rc ; then
120             echo "${0##*/}: no such service $rc" 1>&2
121             exit 1
122         fi
123     done
124     status=0
125     for rc in $args; do
126         rc=${RCDIR}/$rc
127         exec_rc $rc stop
128         exec_rc $rc start
129         test $? -gt 0 && status=1
130     done
131     exit $status
132 fi
133
134
135 #
136 # Execute single service with options
137 #
138 if test -z "${args}" ; then
139     usage 1>&2
140     exit 1
141 fi
142
143 set -- $args
144 if test ! -x ${RCDIR}/$1 ; then
145     echo "${0##*/}: no such service $1" 1>&2
146     exit 1
147 fi
148 rc=${RCDIR}/$1
149 shift
150
151 exec_rc $rc ${1+"$@"}
152 exit $?