]> git.pld-linux.org Git - projects/rc-scripts.git/blob - service
337465709b829e450180dd84e83d44222c857f22
[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 is_ignored_file() {
8         case "$1" in
9         skeleton | README | *.dpkg-dist | *.dpkg-old | rc | rcS | single | reboot | bootclean.sh)
10                 return 0
11                 ;;
12         *rpmorig | *rpmnew | *rpmsave | *~ | *.orig)
13                 return 0
14                 ;;
15         esac
16         return 1
17 }
18
19 # check if SERVICE is present in systemd and ACTION is valid systemctl command
20 # returns false if systemd is disabled or not active
21 is_systemd_service() {
22         local SERVICE=$1 ACTION=$2
23
24         [ "$USE_SYSTEMD" = "no" ] && return 1
25
26         # if we are called from systemd itself, because some .service specified
27         # invocation via /sbin/service. this avoids loops
28         # detect this via CMDLINE var, which has leaked from geninitrd
29         if [ -n "$CMDLINE" ]; then
30                 echo >&2  "Warning: CMDLINE env set, likely you are defining .service to use /sbin/service, please use /etc/rc.d/init.d/<SERVICE> instead"
31                 return 1
32         fi
33
34         case "$ACTION" in
35         # list obtained as: man systemctl | grep N.*A.*M.*E
36         start | \
37         stop | \
38         reload | \
39         restart | \
40         try-restart | \
41         reload-or-restart | \
42         reload-or-try-restart | \
43         isolate | \
44         kill | \
45         is-active | \
46         status | \
47         show | \
48         reset-failed | \
49         enable | \
50         disable | \
51         is-enabled | \
52         reenable | \
53         preset | \
54         mask | \
55         unmask | \
56         link | \
57         load | \
58         snapshot | \
59         delete | \
60         set-environment | \
61         unset-environment )
62                 ;;
63         *)
64                 #echo "Not valid systemd command"
65                 return 1
66         esac
67
68         [ -x /bin/systemd_booted ] || return 1
69         /bin/systemd_booted || return 1
70
71         /bin/systemctl show "$SERVICE".service | grep -q LoadError= && return 1 || return 0
72 }
73
74 status_all() {
75         local SERVICE TYPE
76         cd ${SERVICEDIR}
77         for SERVICE in *; do
78                 case "${SERVICE}" in
79                 functions | halt | killall | single| linuxconf| kudzu)
80                         ;;
81                 *)
82                 if ! is_ignored_file "${SERVICE}" \
83                                 && [ -x "${SERVICEDIR}/${SERVICE}" ]; then
84                         if [ -f /etc/init/${SERVICE}.conf ]; then
85                                 # U for upstart
86                                 TYPE='U'
87                         else
88                                 # S for SysVinit
89                                 TYPE='S'
90                         fi
91                         if ! grep -qs "\Wstatus)" "$SERVICE"; then
92                                 #printf " %s %-60s %s\n" "[?]" "$SERVICE:" "unknown" 1>&2
93                                 echo " [ ? ]{$TYPE} $SERVICE"
94                                 continue
95                         else
96                                 out=$(env -i USE_UPSTART=$USE_UPSTART LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1)
97                                 if [ "$?" = "0" -a -n "$out" ]; then
98                                         #printf " %s %-60s %s\n" "[+]" "$SERVICE:" "running"
99                                         echo " [ + ]{$TYPE} $SERVICE"
100                                         continue
101                                 else
102                                         #printf " %s %-60s %s\n" "[-]" "$SERVICE:" "NOT running"
103                                         echo " [ - ]{$TYPE} $SERVICE"
104                                         continue
105                                 fi
106                         fi
107                         #env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status
108                 fi
109                 ;;
110                 esac
111         done
112 }
113
114 VERSION="$(basename $0) ver. 0.91-pld"
115 USAGE="Usage: $(basename $0) < option > | --status-all | \
116 [ service_name [ command | --full-restart ] ]"
117
118 SERVICE=
119 USE_UPSTART=
120 USE_SYSTEMD=
121
122 if [ -d /etc/rc.d/init.d ]; then
123         SERVICEDIR="/etc/rc.d/init.d"
124 else
125         SERVICEDIR="/etc/init.d"
126 fi
127
128 if [ $# -eq 0 ]; then
129         echo "${USAGE}" >&2
130         exit 1
131 fi
132
133 cd /
134 while [ $# -gt 0 ]; do
135         case "${1}" in
136         --help | -h | --h* )
137                 echo "${USAGE}" >&2
138                 exit 0
139                 ;;
140         --version | -V )
141                 echo "${VERSION}" >&2
142                 exit 0
143                 ;;
144         --ignore-dependencies)
145                 export SYSTEMCTL_IGNORE_DEPENDENCIES=1
146                 shift
147                 ;;
148         --skip-redirect)
149                 export SYSTEMCTL_SKIP_REDIRECT=1
150                 shift
151                 ;;
152         --upstart)
153                 USE_UPSTART=yes
154                 shift
155                 ;;
156         --no-upstart)
157                 USE_UPSTART=no
158                 shift
159                 ;;
160         --no-systemd)
161                 USE_SYSTEMD=no
162                 shift
163                 ;;
164           *)
165                 if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
166                         status_all
167                         exit 0
168                 elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then
169                         SERVICE="${1}"
170                         if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
171                                 env -i USE_UPSTART=$USE_UPSTART LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" stop
172                                 env -i USE_UPSTART=$USE_UPSTART LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" start
173                                 exit $?
174                         fi
175                 elif [ -z "${SERVICE}" ]; then
176                         SERVICE="${1}"
177                 elif [ -z "${ACTION}" ]; then
178                         ACTION="${1}"
179                 else
180                         OPTIONS="${OPTIONS} ${1}"
181                 fi
182                 shift
183                 ;;
184         esac
185 done
186
187 if is_systemd_service "${SERVICE}" "${ACTION}"; then
188         echo >&2 "Redirecting to /bin/systemctl --output=cat ${ACTION} ${SERVICE}.service ${OPTIONS}"
189         exec /bin/systemctl --output=cat ${ACTION} ${SERVICE}.service ${OPTIONS}
190 elif [ -x "${SERVICEDIR}/${SERVICE}" ]; then
191         exec env -i USE_UPSTART=$USE_UPSTART LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" ${ACTION} ${OPTIONS}
192 else
193         echo "${SERVICE}: unrecognized service" >&2
194         exit 1
195 fi
This page took 0.161108 seconds and 2 git commands to generate.