Magellan Linux

Annotation of /trunk/magellan-initscripts/etc/rc.d/init.d/functions

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *