]> git.pld-linux.org Git - projects/rc-scripts.git/blame - rc.d/init.d/functions
- i don't think cat output is localized
[projects/rc-scripts.git] / rc.d / init.d / functions
CommitLineData
356d834b 1#!/bin/sh - keep it for file(1) to get bourne shell script result
7742e157
AF
2# functions This file contains functions to be used by most or all
3# shell scripts in the /etc/init.d directory.
4#
ec8b15cb 5# $Id$
7742e157
AF
6#
7# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
8a835e11 8# Hacked by: Greg Galloway and Marc Ewing
ffe19b59 9# Modified for PLD Linux by:
ec8b15cb 10# Marek Obuchowicz <elephant@pld-linux.org>
fdc764ae
ER
11# Arkadiusz Miśkiewicz <misiek@pld-linux.org>
12# Michał Kochanowicz <mkochano@pld-linux.org>
13# Łukasz Pawelczyk <havner@pld-linux.org>
7742e157
AF
14
15# First set up a default search path.
f2dd2d31 16export PATH="/sbin:/usr/sbin:/bin:/usr/bin"
7742e157 17
d7e5835b 18# Set defaults
66f7cfac
ER
19if [ -z "$COLUMNS" -o -z "$LINES" ]; then
20 _setterm() {
21 set -- $(stty size 2>/dev/null)
22 LINES=${LINES:-$1}
23 COLUMNS=${COLUMNS:-$2}
24 }
25 _setterm
26 unset _setterm
27fi
28[ -z "$COLUMNS" ] && COLUMNS=80
29export LINES COLUMNS
30INIT_COL=$((COLUMNS - 13))
9e9fac7d 31
503bfc80
AM
32# Set colors
33RED=1
34GREEN=2
35YELLOW=3
36BLUE=4
37MAGENTA=5
38CYAN=6
39WHITE=7
94b691da 40NORMAL=15
503bfc80
AM
41# Bold definition (second parameter to termput setaf)
42BOLD=1
43NOBOLD=0
44# Default colors
45CBRACKETS="$CYAN" # brackets [ ] color
46CDONE="$GREEN" # DONE and WORK color
47CBUSY="$MAGENTA" # BUSY color
48CFAIL="$RED" # FAIL and DIED color
49CPOWEREDBY="$CYAN" # "Powered by" color
50CPLD="$GREEN" # "PLD Linux Distribution" color
51CI="$RED" # Capital I color (press I to enter interactive startup)
52CRESMAN="$GREEN" # "Resource Manager" color
bca43764 53CHARS="" # Characters displayed on the beginning of show line
503bfc80
AM
54CCHARS="$NORMAL" # Color of these characters (look at /etc/sysconfig/init-colors.gentoo example)
55
d7e5835b 56# Source configuration if available - may override default values
503bfc80 57[ -r /etc/sysconfig/init-colors ] && . /etc/sysconfig/init-colors
de1fc6ce 58[ -r /etc/sysconfig/system ] && . /etc/sysconfig/system
7f229d88 59[ -r /etc/sysconfig/bootsplash ] && . /etc/sysconfig/bootsplash
7e04fe0e 60
9e22837c 61if [ -z "$VSERVER" -o "$VSERVER" = "detect" ]; then
ce397bd8
JR
62 {
63 while read _f _ctx; do
64 [ "$_f" = "VxID:" -o "$_f" = "s_context:" ] && break
65 done </proc/self/status
66 } 2>/dev/null
9e22837c
JR
67 if [ -z "$_ctx" -o "$_ctx" = "0" ]; then
68 VSERVER=no
69 else
70 VSERVER=yes
71 fi
55a4bc1b 72 unset _f _ctx
9e22837c
JR
73fi
74
4132441e
ER
75# we need to know in functions if we were called from a terminal
76if [ -z "$ISATTY" ]; then
77 [ -t ] && ISATTY=yes || ISATTY=no
9cdf2de7 78 export ISATTY
4132441e
ER
79fi
80
18bd13ac 81is_yes() {
13a745bb 82 # Test syntax
ac1f65e1 83 if [ $# = 0 ]; then
13a745bb
AM
84 msg_usage " is_yes {value}"
85 return 2
86 fi
87
88 # Check value
89 case "$1" in
739070c4 90 yes|Yes|YES|true|True|TRUE|on|On|ON|Y|y|1)
13a745bb
AM
91 # true returns zero
92 return 0
93 ;;
739070c4 94 *)
13a745bb
AM
95 # false returns one
96 return 1
97 ;;
98 esac
99}
100
18bd13ac 101is_no() {
13a745bb 102 # Test syntax
ac1f65e1 103 if [ $# = 0 ]; then
13a745bb
AM
104 msg_usage " is_no {value}"
105 return 2
106 fi
107
108 case "$1" in
739070c4 109 no|No|NO|false|False|FALSE|off|Off|OFF|N|n|0)
13a745bb
AM
110 # true returns zero
111 return 0
112 ;;
739070c4 113 *)
13a745bb
AM
114 # false returns one
115 return 1
116 ;;
117 esac
118}
119
45e0ac73
ER
120# checks if file is empty
121# empty lines and lines beginning with hash are ignored
122is_empty_file() {
123 [ -s "$1" ] || return 0
a51d5138 124 grep -vqE "^(#|[[:blank:]]*$)" "$1" && return 1 || return 0
45e0ac73
ER
125}
126
1626fc86
ER
127# returns OK if $1 contains $2
128strstr() {
4ec13019
ER
129 local a=$2
130 [ "${1#*$a*}" = "$1" ] && return 1
1626fc86
ER
131 return 0
132}
133
bc94aa53 134if is_yes "$FASTRC" || is_yes "$IN_SHUTDOWN"; then
d84e0c78
JR
135 RC_LOGGING=no
136fi
137
bc94aa53 138if is_no "$RC_LOGGING"; then
18bd13ac 139 initlog() {
6d0838f4 140 RESULT=0
bb49a1c7 141 while [ "$1" != "${1##-}" ]; do
0a35929a 142 case $1 in
739070c4 143 -c)
5e6dfc29
JR
144 shift
145 $1
146 RESULT=$?
147 break
148 ;;
739070c4 149 *)
5e6dfc29
JR
150 shift
151 ;;
0a35929a
AM
152 esac
153 done
6d0838f4 154 return $RESULT
0a35929a
AM
155 }
156fi
157
18bd13ac 158kernelver() {
944d6d80 159 local _x _y _z v old_IFS ver
55a4bc1b
JR
160 {
161 read _x _y v _z
162 old_IFS=$IFS
163 IFS='.'
164 set -- $v
165 IFS=$old_IFS
28d62f54
ER
166
167 # strip _* or -* from versions like: "2.6.25_vanilla-1", "2.6.25-1"
89ec4154 168 ver=${3%%[-_]*}
28d62f54
ER
169
170 while [ ${#ver} -lt 3 ]; do ver="0$ver"; done
55a4bc1b 171 ver="$2$ver"
28d62f54 172 while [ ${#ver} -lt 6 ]; do ver="0$ver"; done
55a4bc1b 173 ver="$1$ver"
28d62f54 174 while [ ${#ver} -lt 9 ]; do ver="0$ver"; done
55a4bc1b 175 echo $ver
28d62f54 176 } < /proc/version
6f2d09b1
AM
177}
178
18bd13ac 179kernelverser() {
944d6d80 180 local _x _y _z v old_IFS ver
55a4bc1b
JR
181 {
182 read _x _y v _z
183 old_IFS=$IFS
184 IFS='.'
185 set -- $v
186 IFS=$old_IFS
187 ver=$2
ac1f65e1 188 while [ ${#ver} -lt 3 ]; do ver="0$ver"; done
55a4bc1b 189 ver="$1$ver"
ac1f65e1 190 while [ ${#ver} -lt 6 ]; do ver="0$ver"; done
55a4bc1b
JR
191 echo $ver
192 } </proc/version
6f2d09b1
AM
193}
194
18bd13ac 195kernelvermser() {
944d6d80 196 local _x _y _z v old_IFS ver
55a4bc1b
JR
197 {
198 read _x _y v _z
199 old_IFS=$IFS
200 IFS='.'
201 set -- $v
202 IFS=$old_IFS
203 ver="$1$ver"
ac1f65e1 204 while [ ${#ver} -lt 3 ]; do ver="0$ver"; done
55a4bc1b
JR
205 echo $ver
206 } </proc/version
6f2d09b1
AM
207}
208
cee18a41 209# Colors workaround
18bd13ac 210termput() {
4132441e 211 is_yes "$ISATTY" || return
e3aafb2f 212
294b03eb 213 if is_yes "$FASTRC" || is_no "$TPUT"; then
972964bb 214 case "$1" in
739070c4 215 hpa)
8a835e11 216 echo -ne "\033[$(($2+1))G"
972964bb 217 ;;
739070c4 218 cuu*)
8a835e11 219 echo -ne "\033[${2}A"
972964bb 220 ;;
739070c4 221 el)
8a835e11 222 echo -ne "\033[0K"
972964bb 223 ;;
739070c4 224 setaf)
944d6d80 225 local ISBOLD
503bfc80
AM
226 if [ -n "$3" ]; then
227 ISBOLD="$3"
228 else
229 ISBOLD="$NOBOLD";
230 fi
231 is_yes "$COLOR_INIT" && echo -ne "\033[${ISBOLD};3${2}m"
8a835e11 232 ;;
739070c4 233 op)
503bfc80 234 termput setaf $NORMAL
dcb00bd9 235 ;;
8a835e11 236 esac
c6c1bd0c 237 else
8a835e11 238 case "$1" in
739070c4 239 hpa | cuu* | el)
8a835e11 240 tput "$@"
945790a2 241 ;;
739070c4 242 setaf)
ac1f65e1 243 if [ "$3" = "1" ]; then tput bold; else tput sgr0; fi
503bfc80 244 is_yes "$COLOR_INIT" && tput setaf "$2"
945790a2 245 ;;
739070c4 246 op)
503bfc80 247 termput setaf $NORMAL
945790a2 248 ;;
8a835e11 249 esac
c6c1bd0c
AF
250 fi
251}
cee18a41 252
0c4f3cf5
ER
253if [ ! -x /bin/printf ]; then
254 # printf equivalent
255 # FIXME: buggy when single or double quotes in message!
18bd13ac 256 printf() {
944d6d80 257 local text m
0c4f3cf5
ER
258 text="$1"
259 shift
260 if [ $# -gt 0 ]; then
261 m="$1"
262 shift
263 while [ $# -gt 0 ]; do
264 m="$m\",\"$1"
265 shift
266 done
267 fi
268 awk "BEGIN {printf \"$text\", \"$m\"; }"
269 }
270fi
8a835e11 271
38198f50 272# National language support function
18bd13ac 273nls() {
944d6d80 274 local msg_echo nls_domain text message
d553f606 275 msg_echo='\n'
50ed8c3f 276 nls_domain="$NLS_DOMAIN"
e2c2c3a6 277 while [ "$1" != "${1##-}" ]; do
d553f606 278 case "$1" in
739070c4 279 --nls-domain)
8a835e11 280 shift
50ed8c3f 281 nls_domain="$1"
8a835e11 282 shift
283 ;;
739070c4 284 -n)
8a835e11 285 msg_echo=''
286 shift
287 ;;
d553f606
JR
288 esac
289 done
290 message="$1"
291 shift
50ed8c3f 292
d553f606
JR
293 # empty message, so we return --misiek
294 if [ -z "$message" ]; then
d553f606
JR
295 echo -en "$msg_echo"
296 return
38198f50 297 fi
8a835e11 298
e2c2c3a6
ER
299 if is_yes "$GETTEXT"; then
300 message=$(TEXTDOMAINDIR="/etc/sysconfig/locale" gettext -e --domain="${nls_domain:-rc-scripts}" "$message")
972964bb 301 fi
8a835e11 302
e2c2c3a6 303 printf "$message" "$@"
d553f606 304 echo -en "$msg_echo"
38198f50
AM
305}
306
18bd13ac 307rc_splash() {
944d6d80 308 local action="$1"
862c980c 309
9e22837c 310 if ! is_no "$BOOT_SPLASH" && ! is_yes "$VSERVER"; then
fae22957
AM
311 [ -x /bin/splash ] && /bin/splash "$action"
312 fi
b6509675
AM
313
314 : $((progress++))
fae22957
AM
315}
316
18bd13ac 317msg_network_down() {
228edf1d 318 nls "ERROR: Networking is down. %s can't be run." "$1" >&2
a916d1c6 319}
320
18bd13ac 321msg_starting() {
a916d1c6 322 show "Starting %s service" "$1"
323}
324
18bd13ac 325msg_already_running() {
599d198a 326 nls "%s service is already running." "$1"
a916d1c6 327}
328
18bd13ac 329msg_stopping() {
a916d1c6 330 show "Stopping %s service" "$1"
331}
332
18bd13ac 333msg_not_running() {
599d198a 334 nls "%s service is not running." "$1"
a916d1c6 335}
336
18bd13ac 337msg_reloading() {
a916d1c6 338 show "Reloading %s service" "$1"
339}
340
18bd13ac 341msg_usage() {
599d198a 342 nls "Usage: %s" "$*"
a916d1c6 343}
344
ffe19b59 345# Some functions to handle PLD Linux-style messages
18bd13ac 346show() {
944d6d80 347 local text len
0a35929a 348
ce410bbc
JR
349 if is_no "$FASTRC" && is_yes "$GETTEXT"; then
350 text=$(nls -n "$@")
351 else
352 text=$(printf "$@")
353 fi
354 len=${#text}
355 while [ $((len++)) -lt $INIT_COL ]; do
356 text="$text."
357 done
358 if [ -n "$CHARS" ]; then
359 termput setaf $CCHARS
360 echo -n "$CHARS"
361 termput op
362 fi
363 echo -n "$text"
7742e157
AF
364}
365
18bd13ac 366deltext() {
a292b175
ER
367 termput hpa $INIT_COL
368}
369
b9cad282 370# Displays message in square brackests ("[ DONE ]"). Takes two arguments.
371# First is the text to display, second is color number to use (argument to
372# tput setaf). If second argument is not given, default (2, green) will be
373# used).
18bd13ac 374progress() {
944d6d80
ER
375 local COLOR
376 if [ -n "$2" ]; then
377 COLOR="$2"
378 else
379 COLOR="$CDONE"
380 fi
cd8dfdf0 381 deltext
503bfc80 382 echo -n "$(termput setaf $CBRACKETS)[$(termput setaf $COLOR) $(nls --nls-domain rc-scripts "$1") $(termput setaf $CBRACKETS)]$(termput op)"
b9cad282 383}
384
18bd13ac 385busy() {
a292b175 386 echo -n "$_busy"
7742e157
AF
387}
388
18bd13ac 389ok() {
a292b175 390 echo "$_ok"
7742e157
AF
391}
392
18bd13ac 393started() {
a292b175 394 echo "$_started"
7e04fe0e 395}
396
18bd13ac 397fail() {
a292b175 398 echo "$_fail"
d553f606 399 return 1
7742e157
AF
400}
401
18bd13ac 402died() {
a292b175 403 echo "$_died"
d553f606 404 return 1
6cac3cb2 405}
406
bbb612de 407# Check if $pid (could be plural) are running
18bd13ac 408checkpid() {
8a835e11 409 while [ "$1" ]; do
410 [ -d "/proc/$1" ] && return 0
411 shift
412 done
413 return 1
bbb612de
AM
414}
415
290eb891
AM
416# - outside chroot get only those processes, which are outside chroot.
417# - inside chroot get only those processes, which are inside chroot.
418# - don't filter out pids which do not have corresponding running processes (process died etc)
1e5e8177 419# (note: some processes like named are chrooted but run outside chroot)
c3403882 420# - do nothing inside vserver
18bd13ac 421filter_chroot() {
c3403882
JR
422 if is_yes "$VSERVER"; then
423 echo $@
424 return
425 fi
ac1f65e1 426 if [ $# -lt 1 -o ! -d /proc/1 ]; then
8e3b6875
AM
427 echo $@
428 return
429 fi
33ca787f 430 local root_dir good_pids="" good_add_pid
1e5e8177
AM
431 for root_pid in $@; do
432 root_dir=$(resolvesymlink /proc/${root_pid}/root)
433 if [ -n "$root_dir" ]; then
5a8ff397
AM
434 good_add_pid=1
435 if [ -n "${SYSTEM_CHROOTS}" ]; then
436 for r_dir in ${SYSTEM_CHROOTS}; do
437 echo "$root_dir" | grep -q "^${r_dir}" && good_add_pid=0
438 done
439 fi
440 [ "$good_add_pid" -eq 1 ] && good_pids="$good_pids $root_pid"
290eb891
AM
441 elif [ ! -d "/proc/$root_pid" ]; then
442 good_pids="$good_pids $root_pid"
1e5e8177 443 fi
5a8ff397
AM
444 done
445 echo $good_pids
1e5e8177
AM
446}
447
cee18a41 448# Usage run_cmd Message command_to_run
18bd13ac 449run_cmd() {
944d6d80
ER
450 local exit_code errors message force_err
451 local force_err=0 exit_code=0
d553f606 452 case "$1" in
739070c4 453 -a)
8a835e11 454 force_err=1
455 shift
456 ;;
d553f606
JR
457 esac
458 message=$1
459 show "$message"; busy
1b228409 460 shift
90c59319 461 cd /
f10f2102
ER
462 if errors=$(
463 export HOME=/tmp TMPDIR=/tmp
464 if is_no "$RC_LOGGING"; then
465 "$@" 2>&1
466 else
467 initlog -c "$*" 2>&1
468 fi
469 ); then
cd8dfdf0 470 ok
d553f606 471 log_success "$1 $message"
1b228409 472 else
d553f606
JR
473 fail
474 log_failed "$1 $message"
b7299ffc 475 exit_code=1
1b228409 476 fi
d553f606 477 [ -n "$errors" ] && [ $exit_code -eq 1 -o $force_err -eq 1 ] && echo "$errors"
1b228409 478 return $exit_code
cee18a41
AM
479}
480
e81194ca 481_daemon_set_ulimits() {
0fba6fe4
ER
482 local opt val ksh=${KSH_VERSION:+1}
483 set -- ${SERVICE_LIMITS:-$DEFAULT_SERVICE_LIMITS}
484 while [ $# -gt 0 ]; do
485 opt=$1
486 val=$2
487 if [ "$ksh" ]; then
488 case "$opt" in
489 -Hu)
490 opt=-Hp
491 ;;
492 -Su)
493 opt=-Sp
494 ;;
495 -u)
496 opt=-p
497 ;;
498 esac
499 fi
500 ulimit $opt $val
501 shift 2
502 done
e81194ca
ER
503}
504
e2e24f5a 505# A function to start a program (now it's useful on read-only filesystem too)
18bd13ac 506daemon() {
944d6d80
ER
507 local errors="" prog="" end="" waitname="" waittime=""
508 local exit_code=0
42595a81 509 local nice=$SERVICE_RUN_NICE_LEVEL
a160c01b 510 local fork user closefds pidfile makepid chdir=/
42595a81
ER
511
512 while [ $# -gt 0 ]; do
d553f606 513 case $1 in
739070c4 514 '')
a160c01b 515 msg_usage " daemon [--check] [--user user] [--fork] [--chdir directory] [--closefds] [--waitforname procname] [--waitfortime seconds] [--pidfile file] [--makepid] [+/-nicelevel] {program} <program args>"
8a835e11 516 return 2
d553f606 517 ;;
739070c4 518 --check)
d553f606
JR
519 # for compatibility with redhat/mandrake
520 nls "warning: --check option is ignored!"
521 shift
d553f606 522 ;;
739070c4 523 --user)
d553f606 524 shift
7b1a2a70 525 [ "$1" != "root" ] && prog="/bin/su $1 -s /bin/sh -c \""
f10f2102 526 user=$1
d553f606 527 ;;
739070c4
ER
528 --fork)
529 fork=1
b486c392
ER
530 prog="/usr/bin/setsid sh -c \""
531 end='&'
b486c392 532 ;;
6b1fd029
ER
533 --chdir)
534 shift
535 chdir=$1
536 ;;
739070c4
ER
537 --closefds)
538 closefds=1
f10f2102 539 ;;
739070c4 540 --waitforname)
b486c392 541 shift
683d384e 542 waitname="$1"
683d384e 543 ;;
739070c4 544 --waitfortime)
b486c392 545 shift
683d384e 546 waittime="$1"
683d384e 547 ;;
739070c4 548 --pidfile)
0a177614
ER
549 shift
550 pidfile="$1"
f2dd2d31 551 [[ "$pidfile" != /* ]] && pidfile="/var/run/$pidfile"
0a177614 552 ;;
a160c01b
PG
553 --makepid)
554 makepid=1
555 ;;
739070c4 556 -*|+*)
42595a81 557 nice=$1
a6e727aa 558 shift
42595a81
ER
559 break
560 ;;
739070c4 561 *)
42595a81 562 break
683d384e 563 ;;
d553f606 564 esac
42595a81 565 shift
d553f606 566 done
2eea8492 567 # If command to execute ends with quotation mark, add remaining
568 # arguments and close quotation.
569 if [ "$prog" != "${prog%\"}" ]; then
565736ed 570 prog="$prog $*$end\""
2eea8492 571 else
565736ed 572 prog="$prog $*$end"
2eea8492 573 fi
7742e157 574
e81194ca 575 _daemon_set_ulimits
f054a85e 576
3edf5e48 577 [ -z "$DEFAULT_SERVICE_UMASK" ] && DEFAULT_SERVICE_UMASK=022
42595a81 578 [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
3edf5e48 579
7742e157
AF
580 # And start it up.
581 busy
6b1fd029 582 cd $chdir
42595a81 583 [ -n "$SERVICE_CPUSET" ] && is_yes "$CPUSETS" && echo $$ > "/dev/cpuset/${SERVICE_CPUSET}/tasks"
18bd13ac 584 if errors=$(
f10f2102 585 umask ${SERVICE_UMASK:-$DEFAULT_SERVICE_UMASK};
739070c4 586 export USER=root HOME=/tmp TMPDIR=/tmp
f10f2102
ER
587 nice=${nice:-$DEFAULT_SERVICE_RUN_NICE_LEVEL}
588 nice=${nice:-0}
589
590 if [ "$closefds" = 1 ]; then
591 exec 1>&-
592 exec 2>&-
593 exec 0>&-
594 else
595 exec 2>&1
596 fi
597
ac1f65e1 598 if is_no "$RC_LOGGING"; then
f10f2102
ER
599 prog=$1; shift
600 if [ ! -x $prog ]; then
601 logger -t rc-scripts -p daemon.debug "daemon: Searching PATH for $prog, consider using full path in initscript"
602 local a o=$IFS
603 IFS=:
604 for a in $PATH; do
605 if [ -x $a/$prog ]; then
606 prog=$a/$prog
607 break
608 fi
609 done
610 IFS=$o
611 fi
612 /sbin/start-stop-daemon -q --start \
613 --nicelevel $nice \
614 ${pidfile:+--pidfile $pidfile} \
86ed0b8f 615 ${makepid:+--make-pidfile} \
8a5b611f 616 ${user:+--chuid $user} \
6b1fd029 617 ${chdir:+--chdir "$chdir"} \
86ed0b8f
TP
618 ${fork:+--background} \
619 ${waitname:+--name $waitname} \
f10f2102
ER
620 --exec "$prog" \
621 -- ${1:+"$@"}
622 else
623 nice -n $nice initlog -c "$prog" 2>&1
624 fi
18bd13ac 625 ); then
f10f2102 626
683d384e
AM
627 if [ -n "$waitname" -a -n "$waittime" ]; then
628 # Save basename.
03e01a49 629 base=${waitname##*/}
683d384e
AM
630 # Find pid.
631 pid=$(pidofproc "$waitname" "$pidfile")
632 [ -z "$pid" ] && pid=$(pidofproc "$base" "$pidfile")
633 i=0
634 while [ "$i" -lt "$waittime" ]; do
42595a81 635 i=$((i + 1))
683d384e
AM
636 checkpid $pid && sleep 1 || break
637 done
638 fi
d553f606 639 log_success "$1 startup"
1b228409 640 ok
7742e157 641 else
b7299ffc 642 exit_code=1
1b228409 643 fail
d553f606 644 log_failed "$1 startup"
4fbe82fd 645 [ -n "$errors" ] && echo >&2 "$errors"
7742e157 646 fi
b7299ffc 647 return $exit_code
7742e157
AF
648}
649
650# A function to stop a program.
18bd13ac 651killproc() {
944d6d80 652 local notset killlevel base pid pidfile result
7742e157
AF
653 # Test syntax.
654 if [ $# = 0 ]; then
3fa0b8fe 655 msg_usage " killproc [--pidfile PIDFILE] {program} [-SIGNAME]"
228edf1d 656 return 2
7742e157
AF
657 fi
658
bb49a1c7 659 while [ "$1" != "${1##-}" ]; do
8de7f381 660 case $1 in
739070c4 661 --pidfile)
53ae90e8 662 pidfile="$2"
f2dd2d31 663 [[ "$pidfile" != /* ]] && pidfile="/var/run/$pidfile"
53ae90e8 664 shift 2
8de7f381 665 ;;
739070c4 666 --waitforname)
53ae90e8
ER
667 waitname="$2"
668 shift 2
683d384e 669 ;;
739070c4 670 --waitfortime)
53ae90e8
ER
671 waittime="$2"
672 shift 2
683d384e 673 ;;
8de7f381
AM
674 esac
675 done
676
7742e157 677 busy
8a835e11 678
944d6d80 679 local notset=0
7742e157 680 # check for second arg to be kill level
ac1f65e1 681 if [ -n "$2" ]; then
7742e157
AF
682 killlevel=$2
683 else
684 notset=1
7742e157
AF
685 fi
686
2f269bdf
ER
687 # experimental start-stop-daemon based killing.
688 # works only with pidfile
689 if is_no "$RC_LOGGING" && [ "$pidfile" ]; then
5ec58ec2 690 local sig=${killlevel:--TERM}
2f269bdf
ER
691 /sbin/start-stop-daemon --stop \
692 --retry ${sig#-}/10/${sig#-}/60/KILL/10 \
693 -s ${sig#-} \
694 ${pidfile:+--pidfile $pidfile}
695 result=$?
696 if [ "$result" -eq 0 ]; then
697 ok
698 else
699 fail
700 fi
701 return $result
702 fi
703
704
228edf1d 705 # Save basename.
03e01a49 706 base=${1##*/}
7742e157 707
228edf1d 708 # Find pid.
8de7f381
AM
709 pid=$(pidofproc "$1" "$pidfile")
710 [ -z "$pid" ] && pid=$(pidofproc "$base" "$pidfile")
7742e157 711
228edf1d 712 # Kill it.
ac1f65e1
TP
713 if [ -n "$pid" -a "$pid" != "$$" ] && checkpid $pid 2>&1; then
714 if [ "$notset" = "1" ]; then
228edf1d 715 if checkpid $pid 2>&1; then
716 # TERM first, then KILL if not dead
717 kill -TERM $pid
718 usleep 100000
719 if checkpid $pid && sleep 1 &&
720 checkpid $pid && sleep 3 &&
721 checkpid $pid; then
53ae90e8
ER
722 # XXX: SIGKILL is sent already on 4th second!
723 # HARMFUL for example to mysqld (which is already workarounded)
228edf1d 724 kill -KILL $pid
725 usleep 100000
726 fi
7742e157 727 fi
228edf1d 728 checkpid $pid
bbb612de
AM
729 result=$?
730 if [ "$result" -eq 0 ]; then
228edf1d 731 fail
732 log_failed "$1 shutdown"
733 else
734 ok
735 log_success "$1 shutdown"
736 fi
737 result=$(( ! $result ))
738 else
739 # use specified level only
740 if checkpid $pid > /dev/null 2>&1; then
741 kill $killlevel $pid
742 result=$?
743 if [ "$result" -eq 0 ]; then
744 ok
745 log_success "$1 got $killlevel"
746 else
747 result=7
748 fail
749 log_failed "$1 didn't get $killlevel"
750 fi
e016cdae 751 else
228edf1d 752 result=7
753 died
754 log_failed "$1 shutdown"
e016cdae 755 fi
7742e157
AF
756 fi
757 else
228edf1d 758 died
759 log_failed "$1 shutdown"
760 result=7
7742e157 761 fi
5e6dfc29 762
683d384e 763 if [ -n "$waitname" -a -n "$waittime" ]; then
e6f93a80 764 # Save basename.
03e01a49 765 base=${waitname##*/}
e6f93a80
AM
766 # Find pid.
767 pid=$(pidofproc "$waitname" "$pidfile")
768 [ -z "$pid" ] && pid=$(pidofproc "$base" "$pidfile")
683d384e
AM
769 i=0
770 while [ "$i" -lt "$waittime" ]; do
1101d321 771 i=$(( i + 1 ))
683d384e
AM
772 checkpid $pid && sleep 1 || break
773 done
774 fi
7742e157 775
228edf1d 776 # Remove pid file if any.
e016cdae 777 if [ "$notset" = "1" ]; then
228edf1d 778 rm -f /var/run/${base}.pid
7742e157 779 fi
bbb612de
AM
780
781 return $result
7742e157
AF
782}
783
784# A function to find the pid of a program.
18bd13ac 785pidofproc() {
944d6d80 786 local pid pidfile base=${1##*/}
8de7f381
AM
787 pidfile="$base.pid"
788 [ -n "$2" ] && pidfile="$2"
7742e157 789
8a835e11 790 # Test syntax.
ac1f65e1 791 if [ $# = 0 ]; then
8a835e11 792 msg_usage " pidofproc {program}"
793 return 2
794 fi
795
8de7f381 796 # First try pidfile or "/var/run/*.pid"
f955cf0f 797 if [[ "$pidfile" = /* ]]; then
1c26fe27
AM
798 pidfile="${pidfile}"
799 else
800 pidfile="/var/run/${pidfile}";
801 fi
ac1f65e1 802 if [ -f "${pidfile}" ]; then
944d6d80 803 local p pid=""
7eb94de6 804 for p in $(< "${pidfile}"); do
3030e60e 805 [ -z "$(echo "$p" | awk '{gsub(/[0-9]/,"");print;}')" ] && pid="$pid $p"
8a835e11 806 done
7742e157 807 fi
8a835e11 808
7742e157 809 # Next try "pidof"
1e5e8177
AM
810 [ -z "$pid" ] && pidof -o $$ -o $PPID -o %PPID -x "$1"
811 pid=$(filter_chroot "$pid")
812 echo $pid
7742e157 813}
12de71be 814
18bd13ac 815status() {
944d6d80 816 local pid subsys daemon cpuset_msg pidfile
4e901aa0
ER
817 if [ "$1" = "--pidfile" ]; then
818 pidfile=$2
f2dd2d31 819 [[ "$pidfile" != /* ]] && pidfile="/var/run/$pidfile"
4e901aa0
ER
820 shift 2
821 fi
822
8a835e11 823 subsys=$1
824 daemon=${2:-$subsys}
bbb612de 825
8a835e11 826 # Test syntax.
ac1f65e1 827 if [ $# = 0 ]; then
4e901aa0 828 msg_usage " status [--pidfile PIDFILE] {subsys} [{daemon}]"
8a835e11 829 return 2
830 fi
bbb612de 831
4e901aa0
ER
832 # if pidfile specified, pid must be there
833 if [ "$pidfile" -a -f "$pidfile" ]; then
834 read pid < $pidfile
835 else
836 pid=$(pidof -o $$ -o $PPID -o %PPID -x $daemon)
837 fi
1e5e8177 838 pid=$(filter_chroot "$pid")
bbb612de 839
b90fbc1e 840 if [ "$pid" ]; then
814e38ce 841 cpuset_msg="..."
b90fbc1e 842 if [ -n "$SERVICE_CPUSET" ] && is_yes "$CPUSETS" ]; then
6c99c680 843 if $(grep -q "$pid" "/dev/cpuset/${SERVICE_CPUSET}/tasks"); then
814e38ce
JR
844 cpuset_msg=$(nls " in cpuset %s..." "$SERVICE_CPUSET")
845 else
846 cpuset_msg=$(nls " outside of configured cpuset %s..." "$SERVICE_CPUSET")
847 fi
848 fi
849 nls "%s (pid %s) is running%s" "$daemon" "$pid" "$cpuset_msg"
8a835e11 850 return 0
8a835e11 851 fi
852
853 # Next try "/var/run/*.pid" files
4e901aa0 854 local base=${daemon##*/}
8a835e11 855 if [ -f /var/run/${base}.pid ]; then
856 read pid < /var/run/${base}.pid
1e5e8177 857 pid=$(filter_chroot "$pid")
8a835e11 858 if [ "$pid" != "" ]; then
859 nls "%s dead but pid file exists" "$subsys"
860 return 1
861 fi
862 fi
863
864 # See if /var/lock/subsys/$subsys exists
865 if [ -f /var/lock/subsys/$subsys ]; then
866 nls "%s dead but subsys locked" "$subsys"
867 return 2
7742e157 868 fi
8a835e11 869 nls "%s is stopped" "$subsys"
870 return 3
7742e157 871}
0524c81f 872
6b4a354c
AM
873# Confirm whether we really want to run this service
874confirm() {
944d6d80 875 local answer
d553f606 876 nls -n "Start service %s (Y)es/(N)o/(C)ontinue? [Y] " "$1"
6b4a354c
AM
877 read answer
878 case $answer in
739070c4 879 y|Y|t|T|j|J|"")
8a835e11 880 return 0
6b4a354c 881 ;;
739070c4 882 c|C|k|K|w|W)
8a835e11 883 return 2
6b4a354c 884 ;;
739070c4 885 n|N)
8a835e11 886 return 1
6b4a354c 887 ;;
739070c4 888 *)
8a835e11 889 confirm $1
890 return $?
6b4a354c
AM
891 ;;
892 esac
893}
894
d553f606 895# module is needed (ie. is requested, is available and isn't loaded already)
18bd13ac 896is_module() {
d553f606 897 # module name without .o at end
5778a670
ER
898 if ! lsmod | grep -q "$1"; then
899 if ls -R /lib/modules/$(uname -r)/ 2> /dev/null | grep -q "${1}.\(\|k\)o\(\|.gz\)"; then
d553f606
JR
900 # true
901 return 0
902 fi
903 fi
904 # false
905 return 1
0524c81f 906}
f7b2d235 907
18bd13ac 908_modprobe() {
944d6d80 909 local parsed single die args foo result
f7b2d235 910 parsed=no
ac1f65e1 911 while is_no "$parsed"; do
f7b2d235 912 case "$1" in
739070c4 913 "single")
8a835e11 914 single=yes
915 shift
916 ;;
739070c4 917 "die")
8a835e11 918 die=yes
919 shift
920 ;;
739070c4 921 -*)
8a835e11 922 args="$args $1"
923 shift
924 ;;
739070c4 925 *)
8a835e11 926 parsed=yes
927 ;;
f7b2d235
JR
928 esac
929 done
ac1f65e1 930 if is_yes "${single}"; then
f7b2d235
JR
931 foo="$@"
932 show "Loading %s kernel module(s)" "$foo"
f7b2d235
JR
933 busy
934 fi
ac1f65e1 935 if [ -x /sbin/modprobe ]; then
f7b2d235
JR
936 /sbin/modprobe -s $args "$@"
937 result=$?
938 else
ac1f65e1 939 deltext; fail
f7b2d235
JR
940 result=1
941 fi
ac1f65e1 942 if is_yes "${single}"; then
f7b2d235 943 deltext
ac1f65e1 944 if [ $result = "0" ]; then
d553f606 945 is_yes "$single" && ok
f7b2d235
JR
946 else
947 fail
ac1f65e1 948 if is_yes "$die"; then
f7b2d235
JR
949 nls "Could not load %s kernel module(s)" "$@"
950 exit 1
951 fi
952 fi
953 fi
f7b2d235 954}
d553f606 955
bc94aa53
ER
956if is_no "$RC_LOGGING"; then
957 log_success() {
958 :
959 }
d553f606 960
18bd13ac 961 log_failed() {
bc94aa53
ER
962 :
963 }
964else
18bd13ac 965 log_success() {
bc94aa53
ER
966 initlog -n $0 -s "$1 $2" -e 1
967 }
968
18bd13ac 969 log_failed() {
bc94aa53
ER
970 initlog -n $0 -s "$1 $2" -e 2
971 }
972fi
d553f606 973
f0c296a0
JR
974# Check if any flavor of portmapper is running
975check_portmapper() {
cbb91a00
ER
976 if [ -x /usr/sbin/rpcinfo ]; then
977 if /usr/sbin/rpcinfo -p localhost >/dev/null 2>/dev/null; then
fd8737b5 978 return 0
f0c296a0
JR
979 else
980 return 1
981 fi
982 elif [ -x /sbin/pidof ]; then
f74fbf2c 983 [ -z "$(/sbin/pidof portmap)" -a \
739070c4 984 -z "$(/sbin/pidof rpcbind)" ] && return 1
f0c296a0
JR
985 fi
986 return 0
987}
988
fab8c1a1
JR
989# is_fsmounted fstype mntpoint
990# Check if filesystem fstype is mounted on mntpoint
991is_fsmounted() {
944d6d80
ER
992 local fstype=$1
993 local mntpoint=$2
fab8c1a1
JR
994
995 [ -n "$fstype" -a -n "$mntpoint" ] || return 1
996
81ebaa15 997 if [ -r /proc/mounts ]; then
bfd0227f 998 grep -qE "[[:blank:]]$mntpoint[[:blank:]]+$fstype[[:blank:]]" /proc/mounts
81ebaa15 999 return $?
fab8c1a1 1000 else
81ebaa15
JR
1001 if [ "$(/bin/stat -L -f -c %T $mntpoint 2>/dev/null)" = "$fstype" ]; then
1002 return 0
1003 else
1004 return 1
1005 fi
fab8c1a1
JR
1006 fi
1007}
1008
0084dcf3 1009rc_cache_init() {
6e311c54
ER
1010 # If we have cachefile, use it.
1011 # If we don't, create memory variables and try to save silently,
acf05b4f 1012 local cachefile='/var/cache/rc-scripts/msg.cache'
0084dcf3 1013
4132441e
ER
1014 local term
1015 if is_yes "$ISATTY"; then
1016 term=$TERM
1017 else
1018 term=dumb
1019 fi
1020
0084dcf3
ER
1021 # We create $check variable which is used to invalidate the cache.
1022 # The $check contains user locale and terminal.
66f7cfac 1023 local check="$term.$LC_MESSAGES.$INIT_COL"
0084dcf3 1024
f9df72e7 1025 if [ -f "$cachefile" -a "$cachefile" -nt /etc/sysconfig/system -a "$cachefile" -nt /etc/sysconfig/init-colors ]; then
0084dcf3
ER
1026 if . "$cachefile" 2>/dev/null; then
1027 if [ "$check" = "$_check" ]; then
1028 return
1029 fi
1030 fi
f9df72e7
ER
1031 fi
1032
1033 # primitive caching
1034 _busy=$(progress "BUSY" "$CBUSY")
1035 _ok=$(progress "DONE")
1036 _started=$(progress "WORK")
1037 _fail=$(progress "FAIL" "$CFAIL")
1038 _died=$(progress "DIED" "$CFAIL")
cc54351b
ER
1039
1040 # we don't use heredoc, as ksh attempts to create tempfile then
3ba0bc12 1041 (> "$cachefile" ) 2>/dev/null || return
cc54351b
ER
1042 echo "_busy='$_busy';" >> "$cachefile"
1043 echo "_ok='$_ok';" >> "$cachefile"
1044 echo "_started='$_started';" >> "$cachefile"
1045 echo "_fail='$_fail';" >> "$cachefile"
1046 echo "_died='$_died';" >> "$cachefile"
1047 echo "_check='$check';" >> "$cachefile"
f9df72e7
ER
1048}
1049
0084dcf3 1050rc_gettext_init() {
9a0a016d
ER
1051 if [ -z "$GETTEXT" ]; then
1052 if [ -x /bin/gettext -o -x /usr/bin/gettext ]; then
1053 GETTEXT=yes
1054 else
1055 GETTEXT=no
1056 fi
1057 fi
1058
1059 if [ -z "$TPUT" ]; then
ac1f65e1 1060 if [ -d /usr/share/terminfo ] && [ -x /usr/bin/tput -o -x /bin/tput ]; then
9a0a016d
ER
1061 TPUT=yes
1062 # check if we are on proper terminal
1063 tput longname >/dev/null 2>&1 || TPUT=no
1064 else
1065 TPUT=no
1066 fi
1067 fi
1068}
1069
0084dcf3
ER
1070rc_gettext_init
1071rc_cache_init
f9df72e7 1072
bbb612de
AM
1073#/*
1074# * Local variables:
1075# * mode: sh
1076# * indent-tabs-mode: notnil
1077# * End:
1078# *
bbb612de 1079# */
This page took 0.431873 seconds and 4 git commands to generate.