]> git.pld-linux.org Git - projects/rc-scripts.git/blob - rc.d/init.d/functions
- show instead of nls in some functions
[projects/rc-scripts.git] / rc.d / init.d / functions
1 # functions     This file contains functions to be used by most or all
2 #               shell scripts in the /etc/init.d directory.
3 #
4 # $Id: functions,v 1.42 2000/03/09 11:43:07 zagrodzki Exp $
5 #
6 # Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
7 # Hacked by:    Greg Galloway and Marc Ewing
8 # Modified for PLD by:
9 #               Marek Obuchowicz <elephant@pld.org.pl>
10 #               Arkadiusz Mi¶kiewicz <misiek@pld.org.pl> 
11
12 # First set up a default search path.
13 export PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
14
15 # Set defaults
16 INIT_COL=67
17
18 # Source configuration if available - may override default values
19 [ -f /etc/sysconfig/system ] && . /etc/sysconfig/system
20
21 [ -z "$COLUMNS" ] && COLUMNS=80
22
23 # Colors workaround
24 termput() 
25 {
26         if [ "$COLOR_INIT" = "no" ]; then
27                 :
28         elif [ ! -d /usr/share/terminfo ] || \
29              ! ( [ -x /usr/bin/tput ] || [ -x /bin/tput ] ) ; then
30                 case "$1" in
31                   hpa)
32                         echo -ne "\033[${2}G"
33                         ;;
34                   cuu*)
35                         echo -ne "\033[${2}A"
36                         ;;
37                   el)
38                         echo -ne "\033[0K"
39                         ;;
40                   setaf)
41                         echo -ne "\033[0;3${2}m"
42                         ;;
43                   esac
44         else
45                 tput "$@"
46         fi
47 }
48
49 # printf equivalent
50 printf_()
51 {
52         text="$1" ;
53         shift ;
54         if [ -n "$1" ]; then
55                 m="$1";
56                 shift;
57                 while [ -n "$1" ]; do
58                         m="$m\",\"$1" ;
59                         shift ;
60                 done
61         fi
62         awk "BEGIN {printf \"$text\", \"$m\"; }"
63 }
64                             
65 # National language support function
66 nls()
67 {
68 if [ -x /bin/gettext -o -x /usr/bin/gettext ]; then
69         OLD_NLS_DOMAIN="$NLS_DOMAIN"
70         if [ "$1" = "--nls-domain" ]; then
71                 shift
72                 NLS_DOMAIN="$1"
73                 shift
74         fi
75         if [ -z "$NLS_DOMAIN" ]; then
76                 NLS_DOMAIN="rc-scripts"
77         fi
78         MESSAGE="$1"
79         # avoid translating empty text. --misiek
80         if [ -n "$MESSAGE" ]; then
81                 text="`TEXTDOMAINDIR="/etc/sysconfig/locale" gettext -e --domain="$NLS_DOMAIN" "$MESSAGE"`"
82         else
83                 text="$MESSAGE"
84         fi
85         shift
86         printf_ "$text" "$@"
87         echo
88         NLS_DOMAIN="$OLD_NLS_DOMAIN"
89 else
90         echo "$@"
91 fi
92 }
93
94 # Some functions to handle PLD-style messages
95 show() 
96 {       
97         what="`nls --nls-domain rc-scripts "DONE"`"; typeset -i offset=${#what}
98         text="`nls "$*"`"
99         echo -n "$text"
100         awk "BEGIN { for (j=length(\"$text\"); j<$INIT_COL; j++) printf \".\" }"
101         # move to column number $INIT_COL
102         # termput hpa $INIT_COL
103 }
104
105 busy() 
106 {
107         termput hpa $INIT_COL
108         echo -n "`termput setaf 6`[`termput setaf 5` `nls --nls-domain rc-scripts "BUSY"` `termput setaf 6`]`termput setaf 7`"
109 }
110
111 ok() 
112 {
113         termput hpa $INIT_COL
114         echo  "`termput setaf 6`[`termput setaf 2` `nls --nls-domain rc-scripts "DONE"` `termput setaf 6`]`termput setaf 7`"
115 }
116
117 started()
118 {
119         termput hpa $INIT_COL
120         echo  "`termput setaf 6`[`termput setaf 2` `nls --nls-domain rc-scripts "WORK"` `termput setaf 6`]`termput setaf 7`"
121 }
122
123 fail() 
124 {
125         termput hpa $INIT_COL
126         echo  "`termput setaf 6`[`termput setaf 1` `nls --nls-domain rc-scripts "FAIL"` `termput setaf 6`]`termput setaf 7`"
127 }
128
129 died() 
130 {
131         termput hpa $INIT_COL
132         echo  "`termput setaf 6`[`termput setaf 1` `nls --nls-domain rc-scripts "DIED"` `termput setaf 6`]`termput setaf 7`"
133 }
134
135 deltext() 
136 {
137         echo -ne "`nls "\b\b\b\b\b\b\b\b"`"     
138 }
139
140 # Usage run_cmd Message command_to_run
141 run_cmd()
142 {
143         exit_code=0
144         _ERRORS=""
145         MESSAGE=$1
146         show "$MESSAGE"; busy
147         shift
148         if _ERRORS="`initlog -c \"$*\" 2>&1`"; then
149                 deltext; ok
150         else
151                 deltext; fail;  [ -n "$_ERRORS" ] && echo $_ERRORS
152                 exit_code=1
153         fi
154         unset _ERRORS
155         return $exit_code
156 }
157
158 # compatibility functions
159 action()
160 {
161         STRING=$1
162         shift
163         run_cmd "$STRING" "$*"
164 }
165                         
166 # A function to start a program (now it's usefull on read-only filesystem too)
167 daemon() 
168 {
169         nicelevel=0
170         exit_code=0
171         _ERRORS=""
172         [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
173         # Test syntax.
174         case $1 in
175         '')     nls "Usage: daemon [+/-nicelevel] {program}\n"
176                 return 1;;
177         -*|+*) SERVICE_RUN_NICE_LEVEL=$1
178                 shift;;
179         esac
180
181         # make sure it doesn't core dump anywhere; while this could mask
182         # problems with the daemon, it also closes some security problems
183         ulimit -c 0
184
185         # And start it up.
186         busy
187         if _ERRORS="`nice -n ${SERVICE_RUN_NICE_LEVEL:-$DEFAULT_SERVICE_RUN_NICE_LEVEL} initlog -c "$*" 2>&1`"; then
188                 deltext
189                 ok
190         else
191                 exit_code=1
192                 deltext
193                 fail
194                 [ -n "$_ERRORS" ] && echo $_ERRORS
195         fi
196         unset _ERRORS
197         return $exit_code
198 }
199
200 # A function to stop a program.
201 killproc() 
202 {
203         # Test syntax.
204         if [ $# = 0 ]; then
205                 nls "Usage: killproc {program} [signal]\n"
206                 return 1
207         fi
208
209         busy
210         
211         notset=0
212         # check for second arg to be kill level
213         if [ "$2" != "" ] ; then
214                 killlevel=$2
215         else
216                 notset=1
217                 killlevel="-9"
218         fi
219
220         # Save basename.
221         base=`basename $1`
222
223         # Find pid.
224         pid=`pidofproc $base`
225
226         # Kill it.
227         if [ "$pid" != "" ] ; then
228                 if [ "$notset" = "1" ] ; then
229                         if ps h $pid>/dev/null 2>&1; then
230                                 # TERM first, then KILL if not dead
231                                 kill -TERM $pid >/dev/null 2>&1
232                                 usleep 100000
233                                 if ps h $pid >/dev/null 2>&1 ; then
234                                         sleep 1
235                                         if ps h $pid >/dev/null 2>&1 ; then
236                                                 sleep 3
237                                                 if ps h $pid >/dev/null 2>&1 ; then
238                                                         kill -KILL $pid >/dev/null 2>&1
239                                                 fi
240                                         fi
241                                 fi
242                                 ps h $pid >/dev/null 2>&1 && (deltext; fail) || (deltext; ok)
243                         else
244                                 deltext; died
245                         fi
246                 # use specified level only
247                 else
248                         if ps h $pid >/dev/null 2>&1; then
249                                 kill $killlevel $pid && (deltext; ok) || (deltext; fail)
250                         else
251                                 deltext; died
252                         fi
253                 fi
254         else
255                 deltext
256                 died
257         fi
258
259         # Remove pid file if any.
260         if [ "$notset" = "1" ]; then
261                 rm -f /var/run/$base.pid
262         fi
263 }
264
265 # A function to find the pid of a program.
266 pidofproc() 
267 {
268         # Test syntax.
269         if [ $# = 0 ] ; then
270                 nls "Usage: pidofproc {program}\n"
271                 return 1
272         fi
273
274         # First try "/var/run/*.pid" files
275         if [ -f /var/run/$1.pid ] ; then
276                 pid=`head -1 /var/run/$1.pid`
277                 if [ "$pid" != "" ] ; then
278                         echo $pid
279                         return 0
280                 fi
281         fi
282
283         # Next try "pidof"
284         pid=`pidof $1`
285         if [ "$pid" != "" ] ; then
286                 echo $pid
287                 return 0
288         fi
289
290         # Finally try to extract it from ps
291         ps ax | awk 'BEGIN { prog=ARGV[1]; ARGC=1 }
292                            { if ((prog == $5) || (("(" prog ")") == $5) ||
293                              (("[" prog "]") == $5) ||
294                            ((prog ":") == $5)) { print $1 ; exit 0 } }' $1
295 }
296
297 status() 
298 {
299         # Test syntax.
300         if [ $# = 0 ] ; then
301                 nls "Usage: status {program}\n"
302                 return 1
303         fi
304
305         # First try "pidof"
306         pid=`pidof $1`
307         if [ "$pid" != "" ] ; then
308                 nls "%s (pid %s) is running...\n" "$1" "$pid"
309                 return 0
310         else
311                 pid=`ps ax | awk 'BEGIN { prog=ARGV[1]; ARGC=1 }
312                            { if ((prog == $5) || (("(" prog ")") == $5) ||
313                              (("[" prog "]") == $5) ||
314                            ((prog ":") == $5)) { print $1 ; exit 0 } }' $1`
315                 if [ "$pid" != "" ] ; then
316                         nls "%s (pid %s) is running...\n" "$1" "$pid"
317                         return 0
318                 fi
319         fi
320
321         # Next try "/var/run/*.pid" files
322         if [ -f /var/run/$1.pid ] ; then
323                 pid=`head -1 /var/run/$1.pid`
324                 if [ "$pid" != "" ] ; then
325                         nls "%s dead but pid file exists\n" "$1"
326                         return 1
327                 fi
328         fi
329         # See if /var/lock/subsys/$1 exists
330         if [ -f /var/lock/subsys/$1 ]; then
331                 nls "%s dead but subsys locked\n" "$1"
332                 return 2
333         fi
334         nls "%s is stopped\n" "$1"
335         return 3
336 }
337
338 # Confirm whether we really want to run this service
339 confirm() {
340         echo -n "`nls "Start service"` $1 `nls "(Y)es/(N)o/(C)ontinue? [Y] "`"
341         read answer
342         case $answer in
343                 y|Y|t|T|"")
344                         return 0
345                 ;;
346                 c|C|k|K)
347                         return 2
348                 ;;
349                 n|N)
350                         return 1
351                 ;;
352                 *)
353                         confirm $1
354                         return $?
355                 ;;
356         esac
357 }
358
359 is_yes()
360 {
361         # Test syntax   
362         if [ $# = 0 ] ; then
363                 nls "Usage: is_yes {value}\n"
364                 return 2
365         fi
366
367         # Check value
368         [ "$1" = "yes" ] ||\
369         [ "$1" = "Yes" ] ||\
370         [ "$1" = "YES" ] ||\
371         [ "$1" = "true" ] ||\
372         [ "$1" = "True" ] ||\
373         [ "$1" = "TRUE" ] ||\
374         [ "$1" = "1" ] ||\
375                 return 1
376         return 0
377 }
378
379 is_no()
380 {
381         # Test syntax
382         if [ $# = 0 ] ; then
383                 nls "Usage: is_no {value}\n"
384                 return 2
385         fi
386         
387         # Check value
388         [ "$1" = "no" ] ||\
389         [ "$1" = "No" ] ||\
390         [ "$1" = "NO" ] ||\
391         [ "$1" = "false" ] ||\
392         [ "$1" = "False" ] ||\
393         [ "$1" = "FALSE" ] ||\
394         [ "$1" = "0" ] ||\
395         [ "$1" = "" ] ||\
396                 return 1
397         return 0
398 }
399
400 msg_Network_Down()
401 {
402         nls "ERROR: Networking is down. %s can't be run.\n" "$1"
403 }
404
405 msg_starting()
406 {
407         show "Starting %s service" "$1"
408 }
409
410 msg_Already_Running()
411 {
412         nls "%s service is already running.\n" "$1"
413 }
414
415 msg_stopping()
416 {
417         show "Stopping %s service" "$1"
418 }
419
420 msg_Not_Running()
421 {
422         nls "%s service is not running.\n" "$1"
423 }
424
425 msg_reloading()
426 {
427         show "Reloading %s service" "$1"
428 }
429
430 msg_Usage_reload()
431 {
432         nls "Usage: %s {start|stop|status|restart|reload|force-reload}\n" "$1"
433 }
434
435 msg_Usage_noreload()
436 {
437         nls "Usage: %s {start|stop|status|restart|force-reload}\n" "$1"
438 }
This page took 0.055307 seconds and 4 git commands to generate.