lsb-functions: avoid usage of SYSTEMD variable
[grml-etc-core.git] / etc / grml / lsb-functions
1 # lsb init-functions
2 #
3 # based on:
4 # /lib/lsb/init-functions for Debian -*- shell-script -*-
5 #
6 # Copyright (c) 2002-03 Chris Lawrence
7 # All rights reserved.
8 #
9 # Redistribution and use in source and binary forms, with or without
10 # modification, are permitted provided that the following conditions
11 # are met:
12 # 1. Redistributions of source code must retain the above copyright
13 #    notice, this list of conditions and the following disclaimer.
14 # 2. Redistributions in binary form must reproduce the above copyright
15 #    notice, this list of conditions and the following disclaimer in the
16 #    documentation and/or other materials provided with the distribution.
17 # 3. Neither the name of the author nor the names of other contributors
18 #    may be used to endorse or promote products derived from this software
19 #    without specific prior written permission.
20 #
21 # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 # SUCH DAMAGE.
32
33 # log_*() functions {{{
34 TPUT="${TPUT:-"/usr/bin/tput"}"
35
36 _have_tput() {
37     [ -x "$TPUT" ] && "$TPUT" hpa 60 >/dev/null 2>&1 \
38         && return 0 \
39         || return 1
40 }
41
42 log_success_msg() {
43     printf " * $@\n"
44 }
45
46 log_failure_msg() {
47     if _have_tput ; then
48         RED="$("$TPUT" setaf 1)"
49         #NORMAL="$("$TPUT" op)"
50         printf " ${RED}*${NORMAL} $@\n"
51     else
52         printf " * $@\n"
53     fi
54 }
55
56 log_warning_msg() {
57     if _have_tput ; then
58         YELLOW="$("$TPUT" setaf 3)"
59         #NORMAL="$("$TPUT" op")"
60         # printf " *${NORMAL} $@\n"
61         printf " ${BLUE}*${NORMAL} $@\n"
62     else
63         printf " * $@\n"
64     fi
65 }
66
67 log_warning_msg_nn() {
68     if _have_tput ; then
69         YELLOW="$("$TPUT" setaf 3)"
70         printf " ${BLUE}*${NORMAL} $@"
71     else
72         printf " * $@"
73     fi
74 }
75
76 # int log_begin_message (char *message)
77 log_begin_msg() {
78         if [ "$#" -eq 0 ]; then
79                 return 1
80         fi
81         printf " ${GREEN}*${NORMAL} $@\n"
82 }
83
84 log_begin_msg_nn() {
85         if [ "$#" -eq 0 ]; then
86                 return 1
87         fi
88         printf " ${GREEN}*${NORMAL} $@"
89 }
90
91
92 SUBMSG="   ${GREEN}-${NORMAL} "
93
94 # int log_end_message (int exitstatus)
95 log_end_msg() {
96
97     # If no arguments were passed, return
98     [ "$#" -eq 0 ] && return 1
99
100     # Only do the fancy stuff if we have an appropriate terminal
101     # and if /usr is already mounted
102     if _have_tput ; then
103         COLS="$("$TPUT" cols)"
104         if [ -n "$COLS" ]; then
105             COL=$(( $COLS - 7 ))
106         else
107             COL=73
108         fi
109         UP="$("$TPUT" cuu1)"
110         END="$("$TPUT" hpa "$COL")"
111         START="$("$TPUT" hpa 0)"
112         #RED="$("$TPUT" setaf 1)"
113         #NORMAL="$("$TPUT" op)"
114         if [ "$1" -eq 0 ]; then
115             printf "${UP}${END}${BLUE}[ ${GREEN}ok ${BLUE}]${NORMAL}\n"
116         else
117             printf "${UP}${START} ${RED}*${NORMAL}${END}[${RED}fail${NORMAL}]\n"
118         fi
119     else
120         if [ "$1" -eq 0 ]; then
121             printf "   ...done.\n"
122         else
123             printf "   ...fail!\n"
124         fi
125     fi
126     return "$1"
127 }
128 # }}}
129
130 # e*() output functions {{{
131 # heavily based on gentoo's functions.sh; stripped down and modified
132 # to match our needs.
133 #
134 # defined functions:
135 #   ebegin()
136 #   eend()
137 #   eerror()
138 #   eindent()
139 #   einfo()
140 #   einfon()
141 #   eoutdent()
142 #   esetdent()
143 #   esyslog()
144 #   ewarn()
145 #   ewend()
146 #
147 # copyright 1999-2005 gentoo foundation
148 # distributed under the terms of the gnu general public license v2
149 # $header: /var/cvsroot/gentoo-src/rc-scripts/sbin/functions.sh,v 1.81.2.6 2005/05/15 20:00:31 vapier exp $
150
151 # initialisation {{{
152 # internal variables
153
154 # Dont output to stdout?
155 RC_QUIET_STDOUT="no"
156
157 # Default values for e-message indentation and dots
158 RC_INDENTATION=''
159 RC_DEFAULT_INDENT=2
160 #RC_DOT_PATTERN=' .'
161 RC_DOT_PATTERN=''
162 # dont output to stdout?
163 rc_quiet_stdout="no"
164
165 # default values for e-message indentation and dots
166 rc_indentation=''
167 rc_default_indent=2
168 #rc_dot_pattern=' .'
169 rc_dot_pattern=''
170
171 # should we use color?
172 if [ -r /proc/cmdline ] ; then
173   grep -q ' nocolor' /proc/cmdline && RC_NOCOLOR='yes'
174 fi
175 [ -n "$NOCOLORS" ] && RC_NOCOLOR='yes'
176 RC_NOCOLOR="${RC_NOCOLOR:-no}"
177 if [ "$RC_NOCOLOR" = "no" ] ; then
178   if [ -r /etc/grml_colors ] ; then
179     . /etc/grml_colors
180   fi
181 fi
182
183 # Can the terminal handle endcols?
184 if [ "${RC_NOCOLOR}" = "yes" ]; then
185   RC_ENDCOL="no"
186 else
187   RC_ENDCOL="yes"
188 fi
189
190 # Setup COLS and ENDCOL so eend can line up the [ ok ]
191 # width of [ ok ] == 7
192 COLS="$(stty size 2>/dev/null | cut -d' ' -f2)"
193 if [ -z "${COLS}" ] || [ "${COLS}" -le 0 ] ; then
194   COLS=80
195 fi
196
197 if [ "${RC_ENDCOL}" = "yes" ]; then
198   ENDCOL="\e[A\e[$(( ${COLS} - 8 ))G"
199 else
200   ENDCOL=''
201 fi
202
203 # Setup the colors so our messages all look pretty
204 if [ "${RC_NOCOLOR}" = "yes" ]; then
205   unset GOOD WARN BAD NORMAL HILITE BRACKET
206 else
207   GOOD='\e[32;01m'
208   WARN='\e[33;01m'
209   BAD='\e[31;01m'
210   NORMAL='\e[0m'
211   HILITE='\e[36;01m'
212   BRACKET='\e[34;01m'
213 fi
214 #}}}
215
216 # void esyslog(char* priority, char* tag, char* message)
217 #
218 #    use the system logger to log a message
219 #
220 esyslog() {
221   local pri
222   local tag
223
224   [ "$#" -le 2 ] && return 0
225   if [ -x /usr/bin/logger ] ; then
226     pri="$1"
227     tag="$2"
228     shift 2
229
230     /usr/bin/logger -p "${pri}" -t "${tag}" -- "$@"
231   fi
232
233   return 0
234 }
235
236 # void eindent(int num)
237 #
238 #    increase the indent used for e-commands.
239 #
240 eindent() {
241   local i="${1:-0}"
242   [ "$i" -gt 0 ] || i="${RC_DEFAULT_INDENT}"
243   esetdent $(( ${#RC_INDENTATION} + $i ))
244 }
245
246 # void eoutdent(int num)
247 #
248 #    decrease the indent used for e-commands.
249 #
250 eoutdent() {
251   local i="${1:-0}"
252   [ "$i" -gt 0 ] || i="${RC_DEFAULT_INDENT}"
253   esetdent $(( ${#RC_INDENTATION} - $i ))
254 }
255
256 # void esetdent(int num)
257 #
258 #    hard set the indent used for e-commands.
259 #    num defaults to 0
260 #
261 esetdent() {
262   local i="${1:-0}"
263   [ "$i" -lt 0 ] && i=0
264   RC_INDENTATION="$(printf "%${i}s" '')"
265 }
266
267 # void einfo(char* message)
268 #
269 #    show an informative message (with a newline)
270 #
271 einfo() {
272   einfon "$*\n"
273   LAST_E_CMD=einfo
274   return 0
275 }
276
277 # void einfon(char* message)
278 #
279 #    show an informative message (without a newline)
280 #
281 einfon() {
282   [ "${RC_QUIET_STDOUT}" = "yes" ] && return 0
283   [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo
284   printf " ${GOOD}*${NORMAL} ${RC_INDENTATION}$*"
285   LAST_E_CMD=einfon
286   return 0
287 }
288
289 # void ewarn(char* message)
290 #
291 #    show a warning message + log it
292 #
293 ewarn() {
294   if [ "${RC_QUIET_STDOUT}" = "yes" ]; then
295       printf " $*\n"
296   else
297     [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo
298     printf " ${WARN}*${NORMAL} ${RC_INDENTATION}$*\n"
299   fi
300
301   # Log warnings to system log
302   esyslog "daemon.warning" "rc-scripts" "$@"
303
304   LAST_E_CMD=ewarn
305   return 0
306 }
307
308 # void eerror(char* message)
309 #
310 #    show an error message + log it
311 #
312 eerror() {
313   if [ "${RC_QUIET_STDOUT}" = "yes" ]; then
314     printf " $*\n" >&2
315   else
316     [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo
317     printf " ${BAD}*${NORMAL} ${RC_INDENTATION}$*\n"
318   fi
319
320   # Log errors to system log
321   esyslog "daemon.err" "rc-scripts" "$@"
322
323   LAST_E_CMD=eerror
324   return 0
325 }
326
327 # void ebegin(char* message)
328 #
329 #    show a message indicating the start of a process
330 #
331 ebegin() {
332   local msg="$@" dots spaces
333   spaces="$(printf '%'"${#RC_DOT_PATTERN}"'s' '')"
334   [ "${RC_QUIET_STDOUT}" = "yes" ] && return 0
335
336   if [ -n "${RC_DOT_PATTERN}" ]; then
337     dots="$(printf "%$(( $COLS - 3 - ${#RC_INDENTATION} - ${#msg} - 7 ))s" '')"
338     while [ "${dots#${spaces}}" != "${dots}" ] ; do
339         dots="${dots#${spaces}}${RC_DOT_PATTERN}"
340     done
341     msg="${msg}${dots}"
342   else
343     msg="${msg} ..."
344   fi
345   einfon "${msg}"
346   [ "${RC_ENDCOL}" = "yes" ] && echo
347
348   LAST_E_LEN=$(( 3 + ${#RC_INDENTATION} + ${#msg} ))
349   LAST_E_CMD=ebegin
350   return 0
351 }
352
353 # void _eend(int error, char *efunc, char* errstr)
354 #
355 #    indicate the completion of process, called from eend/ewend
356 #    if error, show errstr via efunc
357 #
358 #    This function is private to functions.sh.  Do not call it from a
359 #    script.
360 #
361 _eend() {
362   local retval="${1:-0}" efunc="${2:-eerror}" msg
363   shift 2
364
365   if [ "${retval}" -eq 0 ]; then
366     [ "${RC_QUIET_STDOUT}" = "yes" ] && return 0
367     msg="${BRACKET}[ ${GOOD}ok${BRACKET} ]${NORMAL}"
368   else
369     if [ "$#" -gt 0 ] ; then
370         "${efunc}" "$@"
371     fi
372     msg="${BRACKET}[ ${BAD}!!${BRACKET} ]${NORMAL}"
373   fi
374
375   if [ "${RC_ENDCOL}" = "yes" ]; then
376     printf "${ENDCOL}  ${msg}\n"
377   else
378     [ "${LAST_E_CMD}" = "ebegin" ] || LAST_E_LEN=0
379     printf "%$(( ${COLS} - ${LAST_E_LEN} - 6 ))s%b\n" '' "${msg}"
380   fi
381
382   return "${retval}"
383 }
384
385 # void eend(int error, char* errstr)
386 #
387 #    indicate the completion of process
388 #    if error, show errstr via eerror
389 #
390 eend() {
391   local retval="${1:-0}"
392   shift
393
394   _eend "${retval}" eerror "$@"
395
396   LAST_E_CMD=eend
397   return "$retval"
398 }
399
400 # void ewend(int error, char* errstr)
401 #
402 #    indicate the completion of process
403 #    if error, show errstr via ewarn
404 #
405 ewend() {
406   local retval="${1:-0}"
407   shift
408
409   _eend "${retval}" ewarn "$@"
410
411   LAST_E_CMD=ewend
412   return "$retval"
413 }
414 #}}}
415
416 # if we're using systemd then redefine functions
417 # for output in systemd style
418 if [ "$(cat /proc/1/comm 2>/dev/null)" = "systemd" ] ; then
419   einfo() {
420     printf "[  ${GREEN}OK${NORMAL}  ] %s\n" "$*"
421   }
422
423   ewarn() {
424     printf "[ ${YELLOW}WARN${NORMAL} ] %s\n" "$*"
425   }
426
427   eerror() {
428     printf "[ ${RED}FAIL${NORMAL} ] %s\n" "$*"
429   }
430
431   eend() {
432     :
433   }
434 fi
435
436 # vim: ft=sh tw=80 ts=4 foldmethod=marker