Annotation of /trunk/initscripts/sysvinit/rc/functions
Parent Directory | Revision Log
Revision 1893 -
(hide annotations)
(download)
Wed Aug 22 17:57:39 2012 UTC (11 years, 8 months ago) by niro
File size: 8185 byte(s)
Wed Aug 22 17:57:39 2012 UTC (11 years, 8 months ago) by niro
File size: 8185 byte(s)
-handle the rare case were the COLUMNS variable is empty or zero
1 | niro | 2 | #!/bin/bash |
2 | niro | 931 | # $Id$ |
3 | niro | 71 | |
4 | niro | 2 | # Begin $rc_base/init.d/functions - Run Level Control Functions |
5 | |||
6 | # Based on functions script from LFS-3.1 and earlier. | ||
7 | # Rewritten by Gerard Beekmans - gerard@linuxfromscratch.org | ||
8 | |||
9 | # With code based on Matthias Benkmann's simpleinit-msb @ | ||
10 | # http://winterdrache.de/linux/newboot/index.html | ||
11 | |||
12 | umask 022 | ||
13 | |||
14 | export PATH="/bin:/usr/bin:/sbin:/usr/sbin" | ||
15 | |||
16 | KILLDELAY=3 | ||
17 | |||
18 | COLUMNS=$(stty size) | ||
19 | COLUMNS=${COLUMNS##* } | ||
20 | niro | 1893 | if [[ -z ${COLUMNS} ]] || [[ ${COLUMNS} = 0 ]] |
21 | then | ||
22 | COLUMNS=80 | ||
23 | fi | ||
24 | niro | 2 | COL=$[ $COLUMNS - 10 ] |
25 | WCOL=$[ $COLUMNS - 30 ] | ||
26 | WWCOL=$[ $COLUMNS - 40 ] | ||
27 | SET_COL="echo -en \\033[${COL}G" | ||
28 | SET_WCOL="echo -en \\033[${WCOL}G" | ||
29 | SET_WWCOL="echo -en \\033[${WWCOL}G" | ||
30 | CURS_UP="echo -en \\033[A" | ||
31 | |||
32 | NORMAL="echo -en \\033[0;39m" | ||
33 | SUCCESS="echo -en \\033[1;32m" | ||
34 | WARNING="echo -en \\033[1;33m" | ||
35 | FAILURE="echo -en \\033[1;31m" | ||
36 | |||
37 | COLRED="\033[1;6m\033[31m" | ||
38 | COLGREEN="\033[1;6m\033[32m" | ||
39 | COLYELLOW="\033[1;6m\033[33m" | ||
40 | COLBLUE="\033[1;6m\033[34m" | ||
41 | COLMAGENTA="\033[1;6m\033[35m" | ||
42 | COLWHITE="\033[1;6m\033[37m" | ||
43 | COLDEFAULT="\033[0m" | ||
44 | |||
45 | COLOREDSTAR="${COLBLUE}(${COLGREEN}*${COLBLUE})${COLDEFAULT} " | ||
46 | |||
47 | niro | 1093 | # location to save the started services |
48 | niro | 2 | svcdir="/var/lib/init.d" |
49 | svclib="/lib/rcscripts" | ||
50 | svcmount="no" | ||
51 | svcfstype="tmpfs" | ||
52 | svcsize=1024 | ||
53 | |||
54 | niro | 1807 | rc_echo() { echo "$@"; } |
55 | niro | 1241 | rc_print() { rc_echo -e "${COLOREDSTAR}$@"; } |
56 | niro | 2 | |
57 | # dummy function; needed if splashutils are not installed | ||
58 | niro | 1093 | splash() { return 0; } |
59 | niro | 2 | |
60 | niro | 1093 | # source splash functions if exists |
61 | niro | 2 | [ -f /etc/init.d/splash-functions ] && source /etc/init.d/splash-functions |
62 | |||
63 | print_error_msg() | ||
64 | { | ||
65 | return 0 | ||
66 | echo | ||
67 | $FAILURE | ||
68 | echo -e " An Error occurred." | ||
69 | echo -e " Script: ${COLWHITE}$i${COLRED}" | ||
70 | echo -e " Exitcode: ${COLWHITE}$error_value${COLRED}" | ||
71 | echo | ||
72 | $NORMAL | ||
73 | echo | ||
74 | echo "Press Enter to continue..." | ||
75 | read | ||
76 | } | ||
77 | |||
78 | check_script_status() | ||
79 | { | ||
80 | if [ ! -f $i ] | ||
81 | then | ||
82 | echo "$i is not a valid symlink" | ||
83 | continue | ||
84 | fi | ||
85 | |||
86 | if [ ! -x $i ] | ||
87 | then | ||
88 | echo "$i is not executable, skipping" | ||
89 | continue | ||
90 | fi | ||
91 | } | ||
92 | |||
93 | update_svcstatus() | ||
94 | { | ||
95 | #$1 script | ||
96 | #$2 start/stop | ||
97 | |||
98 | local SVCDIR_MOUNTED | ||
99 | local SVCD_INITSCRIPT | ||
100 | local x | ||
101 | |||
102 | #do this only if proc is mounted | ||
103 | [ ! -f /proc/mounts ] && return 0 | ||
104 | |||
105 | #check if svcdir is mounted | ||
106 | SVCDIR_MOUNTED="$(cat /proc/mounts | grep ${svcdir} | cut -d ' ' -f2)" | ||
107 | if [ "${SVCDIR_MOUNTED}" == "${svcdir}" ] | ||
108 | then | ||
109 | #check if statedir exists | ||
110 | [ ! -d ${svcdir}/started ] && mkdir ${svcdir}/started | ||
111 | niro | 71 | |
112 | niro | 2 | #get real name of the initscript, not from the symlink |
113 | if [ -L "$0" ] | ||
114 | then | ||
115 | x="$(readlink $0)" | ||
116 | SVCD_INITSCRIPT="$(basename ${x})" | ||
117 | else | ||
118 | SVCD_INITSCRIPT="$(basename $0)" | ||
119 | fi | ||
120 | |||
121 | case $1 in | ||
122 | start) | ||
123 | #write to svcddir | ||
124 | #write state | ||
125 | echo ok > ${svcdir}/started/"${SVCD_INITSCRIPT}" | ||
126 | ;; | ||
127 | stop) | ||
128 | #echo "$(ls ${svcdir}/started)" | ||
129 | if [ -f ${svcdir}/started/${SVCD_INITSCRIPT} ] | ||
130 | then | ||
131 | rm ${svcdir}/started/${SVCD_INITSCRIPT} | ||
132 | fi | ||
133 | ;; | ||
134 | esac | ||
135 | fi | ||
136 | } | ||
137 | |||
138 | evaluate_retval() | ||
139 | { | ||
140 | niro | 505 | local error_value="$1" |
141 | [[ -z ${error_value} ]] && error_value=$? | ||
142 | niro | 2 | |
143 | niro | 505 | if [[ ${error_value} = 0 ]] |
144 | niro | 2 | then |
145 | print_status success | ||
146 | else | ||
147 | print_status failure | ||
148 | niro | 1242 | |
149 | if [[ ${SPLASH_VERBOSE_ON_ERRORS} = 1 ]] | ||
150 | then | ||
151 | splash "rc_verbose" "${runlevel}" | ||
152 | fi | ||
153 | niro | 2 | fi |
154 | |||
155 | niro | 505 | return ${error_value} |
156 | niro | 2 | } |
157 | |||
158 | print_status() | ||
159 | { | ||
160 | if [ $# = 0 ] | ||
161 | then | ||
162 | echo "Usage: $0 {success|warning|failure}" | ||
163 | return 1 | ||
164 | fi | ||
165 | |||
166 | $CURS_UP | ||
167 | |||
168 | case "$1" in | ||
169 | success) | ||
170 | $SET_COL | ||
171 | echo -e -n $COLBLUE"[ " | ||
172 | $SUCCESS | ||
173 | echo -e -n "OK" | ||
174 | echo -e $COLBLUE" ]" | ||
175 | $NORMAL | ||
176 | ;; | ||
177 | warning) | ||
178 | case "$2" in | ||
179 | running) | ||
180 | $SET_WCOL | ||
181 | echo "Already running" | ||
182 | $CURS_UP | ||
183 | ;; | ||
184 | not_running) | ||
185 | $SET_WCOL | ||
186 | echo "Not running" | ||
187 | $CURS_UP | ||
188 | ;; | ||
189 | esac | ||
190 | $SET_COL | ||
191 | echo -e -n $COLBLUE"[ " | ||
192 | $WARNING | ||
193 | echo -e -n "ATTN" | ||
194 | echo -e $COLBLUE" ]" | ||
195 | $NORMAL | ||
196 | ;; | ||
197 | failure) | ||
198 | $SET_COL | ||
199 | echo -e -n $COLBLUE"[" | ||
200 | $FAILURE | ||
201 | echo -e -n "FAILED" | ||
202 | echo -e $COLBLUE"]" | ||
203 | $NORMAL | ||
204 | ;; | ||
205 | esac | ||
206 | } | ||
207 | |||
208 | getpids() | ||
209 | { | ||
210 | niro | 1361 | local base=${1##*/} |
211 | local opts | ||
212 | if [[ $(readlink /bin/pidof) = *busybox ]] | ||
213 | then | ||
214 | opts="" | ||
215 | else | ||
216 | opts="-x" | ||
217 | fi | ||
218 | pidlist=$(pidof -o $$ -o $PPID ${opts} $base) | ||
219 | niro | 2 | } |
220 | |||
221 | loadproc() | ||
222 | { | ||
223 | if [ $# = 0 ] | ||
224 | then | ||
225 | echo "Usage: loadproc {program}" | ||
226 | exit 1 | ||
227 | fi | ||
228 | |||
229 | getpids $1 | ||
230 | |||
231 | if [ -z "$pidlist" ] | ||
232 | then | ||
233 | "$@" | ||
234 | evaluate_retval | ||
235 | else | ||
236 | $SET_WCOL | ||
237 | print_status warning running | ||
238 | fi | ||
239 | } | ||
240 | |||
241 | killproc() | ||
242 | { | ||
243 | if [ $# = 0 ] | ||
244 | then | ||
245 | echo "Usage: killproc {program} [signal]" | ||
246 | exit 1 | ||
247 | fi | ||
248 | |||
249 | if [ -z "$2" ]; then | ||
250 | signal=TERM | ||
251 | fallback=KILL | ||
252 | else | ||
253 | signal=${2##-} | ||
254 | signal=${signal##SIG} | ||
255 | fallback="" | ||
256 | fi | ||
257 | |||
258 | getpids $1 | ||
259 | |||
260 | if [ -n "$pidlist" ]; then | ||
261 | failure=0 | ||
262 | |||
263 | for pid in $pidlist | ||
264 | do | ||
265 | kill -$signal $pid 2>/dev/null | ||
266 | |||
267 | for ((i=0; $i<5000; i=$i+1)); do :; done | ||
268 | |||
269 | for ((i=0; $i<$KILLDELAY; i=$i+1)); do | ||
270 | kill -0 $pid 2>/dev/null || break | ||
271 | sleep 1 | ||
272 | done | ||
273 | |||
274 | if [ -n "$fallback" ]; then kill -$fallback $pid 2>/dev/null; fi | ||
275 | |||
276 | kill -0 $pid 2>/dev/null && failure=1 | ||
277 | done | ||
278 | |||
279 | base=${1##*/} | ||
280 | niro | 1665 | if [ $failure = 0 ]; then rm -f /run/$base.pid; fi |
281 | niro | 2 | |
282 | (exit $failure) | ||
283 | evaluate_retval | ||
284 | else | ||
285 | $SET_WCOL | ||
286 | print_status warning not_running | ||
287 | fi | ||
288 | } | ||
289 | |||
290 | reloadproc() | ||
291 | { | ||
292 | if [ $# = 0 ] | ||
293 | then | ||
294 | echo "Usage: reloadproc {program} [signal]" | ||
295 | exit 1 | ||
296 | fi | ||
297 | |||
298 | if [ -z "$2" ]; then | ||
299 | signal=HUP | ||
300 | else | ||
301 | signal=${2##-} | ||
302 | signal=${signal##SIG} | ||
303 | fi | ||
304 | |||
305 | getpids $1 | ||
306 | |||
307 | if [ -n "$pidlist" ] | ||
308 | then | ||
309 | failure=0 | ||
310 | |||
311 | for pid in $pidlist | ||
312 | do | ||
313 | kill -$signal $pid || failure=1 | ||
314 | done | ||
315 | |||
316 | (exit $failure) | ||
317 | evaluate_retval | ||
318 | else | ||
319 | $SET_WCOL | ||
320 | print_status warning not_running | ||
321 | fi | ||
322 | } | ||
323 | |||
324 | statusproc() | ||
325 | { | ||
326 | if [ $# = 0 ] | ||
327 | then | ||
328 | echo "Usage: statusproc {program}" | ||
329 | exit 1 | ||
330 | fi | ||
331 | |||
332 | base=${1##*/} | ||
333 | getpids $base | ||
334 | |||
335 | if [ -n "$pidlist" ] | ||
336 | then | ||
337 | echo "$base is running with Process ID(s) $pidlist" | ||
338 | else | ||
339 | niro | 1665 | if [ -s /run/$base.pid ] |
340 | niro | 2 | then |
341 | niro | 1665 | echo "$1 is not running but /run/$base.pid exists" |
342 | niro | 2 | return 1 |
343 | else | ||
344 | echo "$1 is not running" | ||
345 | fi | ||
346 | fi | ||
347 | } | ||
348 | |||
349 | progressbar() | ||
350 | { | ||
351 | if [ $# != 1 ] | ||
352 | then | ||
353 | echo "Usage: progressbar {progress}" | ||
354 | exit 1 | ||
355 | fi | ||
356 | |||
357 | if [ -f /proc/splash ] | ||
358 | then | ||
359 | echo "show $(( 65534 * $1 / 100 ))" > /proc/splash | ||
360 | fi | ||
361 | } | ||
362 | |||
363 | niro | 317 | kernel_version() |
364 | { | ||
365 | local KV="$(uname -r | cut -d- -f1)" | ||
366 | echo "${KV}" | ||
367 | } | ||
368 | |||
369 | niro | 2 | kernel_major_version() |
370 | { | ||
371 | local KV | ||
372 | niro | 317 | KV="$(uname -r | cut -d. -f1-2)" |
373 | niro | 2 | echo "${KV}" |
374 | } | ||
375 | |||
376 | niro | 317 | dolisting() |
377 | niro | 2 | { |
378 | local x= | ||
379 | local y= | ||
380 | local tmpstr= | ||
381 | local mylist= | ||
382 | local mypath="${*}" | ||
383 | |||
384 | if [ "${mypath%/\*}" != "${mypath}" ] | ||
385 | then | ||
386 | mypath="${mypath%/\*}" | ||
387 | fi | ||
388 | |||
389 | for x in ${mypath} | ||
390 | do | ||
391 | [ ! -e "${x}" ] && continue | ||
392 | |||
393 | if [ ! -d "${x}" ] && ( [ -L "${x}" -o -f "${x}" ] ) | ||
394 | then | ||
395 | mylist="${mylist} $(ls "${x}" 2> /dev/null)" | ||
396 | else | ||
397 | [ "${x%/}" != "${x}" ] && x="${x%/}" | ||
398 | |||
399 | cd "${x}"; tmpstr="$(ls)" | ||
400 | |||
401 | for y in ${tmpstr} | ||
402 | do | ||
403 | mylist="${mylist} ${x}/${y}" | ||
404 | done | ||
405 | fi | ||
406 | done | ||
407 | |||
408 | echo "${mylist}" | ||
409 | } | ||
410 | niro | 147 | |
411 | # searches /proc/mounts for mounted fstypes (like ext3) | ||
412 | niro | 1093 | is_fstype_mounted() |
413 | { | ||
414 | niro | 147 | local filesys |
415 | local i | ||
416 | filesys=$1 | ||
417 | |||
418 | i="$(cat /proc/mounts | grep ${filesys} | cut -d ' ' -f3)" | ||
419 | [[ ${i} != ${filesys} ]] && return 1 | ||
420 | |||
421 | return 0 | ||
422 | } | ||
423 | |||
424 | # searches /proc/mounts for mounted fs names (like udev, proc) | ||
425 | niro | 1093 | is_fs_mounted() |
426 | { | ||
427 | niro | 147 | local filesys |
428 | local i | ||
429 | filesys=$1 | ||
430 | |||
431 | i="$(cat /proc/mounts | grep ${filesys} | cut -d ' ' -f1)" | ||
432 | [[ ${i} != ${filesys} ]] && return 1 | ||
433 | |||
434 | return 0 | ||
435 | } | ||
436 | |||
437 | # checks if kernel supports fs xy | ||
438 | niro | 1093 | kernel_supports_fs() |
439 | { | ||
440 | niro | 147 | local filesys |
441 | local i | ||
442 | filesys=$1 | ||
443 | |||
444 | i="$(cat /proc/filesystems | grep ${filesys} | cut -d $'\t' -f2)" | ||
445 | [[ ${i} != ${filesys} ]] && return 1 | ||
446 | |||
447 | return 0 | ||
448 | } | ||
449 | niro | 274 | |
450 | # bool is_older_than(reference, files/dirs to check) | ||
451 | # | ||
452 | # return 0 if any of the files/dirs are newer than | ||
453 | # the reference file | ||
454 | # | ||
455 | # EXAMPLE: if is_older_than a.out *.o ; then ... | ||
456 | niro | 1093 | is_older_than() |
457 | { | ||
458 | niro | 274 | local x= |
459 | local ref="$1" | ||
460 | shift | ||
461 | |||
462 | for x in "$@" | ||
463 | do | ||
464 | [[ ${x} -nt ${ref} ]] && return 0 | ||
465 | |||
466 | if [[ -d ${x} ]] | ||
467 | then | ||
468 | is_older_than "${ref}" "${x}"/* && return 0 | ||
469 | fi | ||
470 | done | ||
471 | |||
472 | return 1 | ||
473 | } | ||
474 | niro | 1094 | |
475 | niro | 1774 | # read /etc/os-release file |
476 | # read_os_release $item | ||
477 | read_os_release() | ||
478 | { | ||
479 | local NAME | ||
480 | local ID | ||
481 | local Version | ||
482 | local Version_ID | ||
483 | local PRETTY_NAME | ||
484 | local ANSI_COLOR | ||
485 | local CPE_NAME | ||
486 | |||
487 | if [[ -f /etc/os-release ]] | ||
488 | then | ||
489 | source /etc/os-release | ||
490 | |||
491 | case $1 in | ||
492 | name) echo "${NAME}" ;; | ||
493 | id) echo "${ID}" ;; | ||
494 | version) echo "${Version}" ;; | ||
495 | version_id) echo "${Version_ID}" ;; | ||
496 | pretty_name) echo "${PRETTY_NAME}" ;; | ||
497 | ansi_color) echo "${ANSI_COLOR}" ;; | ||
498 | cpe_name) echo "${CPE_NAME}" ;; | ||
499 | esac | ||
500 | fi | ||
501 | } | ||
502 | |||
503 | niro | 1104 | start_devicemanager() { touch /dev/.none; return 0; } |
504 | niro | 1094 | stop_devicemanager() { return 0; } |
Properties
Name | Value |
---|---|
svn:executable | * |