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