Magellan Linux

Annotation of /trunk/initscripts/sysvinit/rc/functions

Parent Directory Parent Directory | Revision Log 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)
-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 *