source: bootscripts/lfs/init.d/functions @ 6c32364

clfs-1.2clfs-2.1clfs-3.0.0-systemdclfs-3.0.0-sysvinitsystemdsysvinit
Last change on this file since 6c32364 was 6c32364, checked in by Jim Gifford <clfs@…>, 15 years ago

r4177@server: jim | 2006-06-29 16:00:12 -0700
Disable interactive Prompts. Added ccheck for /etc/sysconfig/createfiles.

  • Property mode set to 100644
File size: 15.9 KB
Line 
1#!/bin/sh
2########################################################################
3# Begin $rc_base/init.d/functions
4#
5# Description : Run Level Control Functions
6#
7# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
8#
9# Version     : 00.00
10#
11# Notes       : With code based on Matthias Benkmann's simpleinit-msb
12#               http://winterdrache.de/linux/newboot/index.html
13#
14########################################################################
15
16if [ -e /etc/sysconfig/lcd ]; then
17        if [ -e /dev/lcd ]; then
18                source /etc/sysconfig/lcd
19        fi
20fi
21
22if [ -e /etc/sysconfig/bootscripts ]; then
23        source /etc/sysconfig/bootscripts
24fi
25
26## Environmental setup
27# Setup default values for environment
28umask 022
29export PATH="/bin:/usr/bin:/sbin:/usr/sbin"
30
31# Signal sent to running processes to refresh their configuration
32RELOADSIG="HUP"
33
34# Number of seconds between STOPSIG and FALLBACK when stopping processes
35KILLDELAY="3"
36
37## Screen Dimensions
38# Find current screen size
39if [ -z "${COLUMNS}" ]; then
40        COLUMNS=$(stty size)
41        COLUMNS=${COLUMNS##* }
42fi
43
44# When using remote connections, such as a serial port, stty size returns 0
45if [ "${COLUMNS}" = "0" ]; then 
46        COLUMNS=80
47fi
48
49## Measurements for positioning result messages
50COL=$((${COLUMNS} - 8))
51WCOL=$((${COL} - 2))
52
53## Set Cursor Position Commands, used via echo -e
54SET_COL="\\033[${COL}G"      # at the $COL char
55SET_WCOL="\\033[${WCOL}G"    # at the $WCOL char
56CURS_UP="\\033[1A\\033[0G"   # Up one line, at the 0'th char
57
58## Set color commands, used via echo -e
59# Please consult `man console_codes for more information
60# under the "ECMA-48 Set Graphics Rendition" section
61#
62# Warning: when switching from a 8bit to a 9bit font,
63# the linux console will reinterpret the bold (1;) to
64# the top 256 glyphs of the 9bit font.  This does
65# not affect framebuffer consoles
66NORMAL="\\033[0;39m"         # Standard console grey
67SUCCESS="\\033[1;32m"        # Success is green
68WARNING="\\033[1;33m"        # Warnings are yellow
69FAILURE="\\033[1;31m"        # Failures are red
70INFO="\\033[1;36m"           # Information is light cyan
71BRACKET="\\033[1;34m"        # Brackets are blue
72
73STRING_LENGTH="0"   # the length of the current message
74
75#*******************************************************************************
76# Function - boot_mesg()
77#
78# Purpose:      Sending information from bootup scripts to the console
79#
80# Inputs:       $1 is the message
81#               $2 is the colorcode for the console
82#
83# Outputs:      Standard Output
84#
85# Dependencies: - sed for parsing strings.
86#               - grep for counting string length.
87#               
88# Todo:         
89#*******************************************************************************
90boot_mesg()
91{
92        local ECHOPARM=""
93
94        if [ "$LCD_PROG" ]; then
95                LCD_OUT1="${1:0:$LCD_CHAR}"
96                $LCD_PROG "$LCD_OUT1" > /dev/null 2>&1
97        fi
98
99        while true
100        do
101                case "${1}" in
102                        -n)
103                                ECHOPARM=" -n "
104                                shift 1
105                                ;;
106                        -*)
107                                echo "Unknown Option: ${1}"
108                                return 1
109                                ;;
110                        *)
111                                break
112                                ;;
113                esac
114        done
115
116        ## Figure out the length of what is to be printed to be used
117        ## for warning messges.
118        STRING_LENGTH="`echo "${1}" | sed \
119                -e 's,.,.,g' -e 'l 1' | grep -c \$`"
120
121        # Print the message to the screen
122        echo ${ECHOPARM} -e "${2}${1}"
123       
124}
125
126boot_mesg_flush()
127{
128        # Reset STRING_LENGTH for next message
129        STRING_LENGTH="0"
130}
131
132boot_log()
133{
134        # Left in for backwards compatibility
135        echo -n ""
136}
137
138echo_ok()
139{
140        echo -n -e "${CURS_UP}${SET_COL}${BRACKET}[${SUCCESS}  OK  ${BRACKET}]"
141        echo -e "${NORMAL}"
142        boot_mesg_flush "[  OK  ]"
143        if [ "$LCD_PROG" ]; then
144                if [ "$LCD_LINES" = "2" ]; then
145                        LCD_OUT2="[  OK  ]"
146                        $LCD_PROG "$LCD_OUT1" "$LCD_OUT2" > /dev/null 2>&1
147                else
148                        LCD_OUT2="${LCD_OUT1:0:12} OK"
149                        $LCD_PROG "$LCD_OUT2" > /dev/null 2>&1
150                fi                     
151        fi
152}
153
154echo_failure()
155{
156        echo -n -e "${CURS_UP}${SET_COL}${BRACKET}[${FAILURE} FAIL ${BRACKET}]"
157        echo -e "${NORMAL}"
158        boot_mesg_flush "[ FAIL ]"
159        if [ "$LCD_PROG" ]; then
160                if [ "$LCD_LINES" = "2" ]; then
161                        LCD_OUT2="[ FAIL  ]"
162                        $LCD_PROG "$LCD_OUT1" "$LCD_OUT2" > /dev/null 2>&1
163                else
164                        LCD_OUT2="${LCD_OUT1:0:10} FAIL"
165                        $LCD_PROG "$LCD_OUT2" > /dev/null 2>&1
166                fi
167        fi
168}
169
170echo_warning()
171{
172        echo -n -e "${CURS_UP}${SET_COL}${BRACKET}[${WARNING} WARN ${BRACKET}]"
173        echo -e "${NORMAL}"
174        if [ "$LCD_PROG" ]; then
175                if [ "$LCD_LINES" = "2" ]; then
176                        LCD_OUT2="[ WARN  ]"
177                        $LCD_PROG "$LCD_OUT1" "$LCD_OUT2" > /dev/null 2>&1
178                else
179                        LCD_OUT2="${LCD_OUT1:0:10} WARN"
180                        $LCD_PROG "$LCD_OUT2" > /dev/null 2>&1
181                fi                     
182        fi
183        boot_mesg_flush "[ WARN ]"
184}
185
186print_error_msg()
187{
188        echo_failure
189        # $i is inherited by the rc script
190        boot_log "\n\n${i} failed and exited with a return value of ${error_value}."
191        boot_mesg_flush
192        boot_mesg -n "FAILURE:\n\nYou should not be reading this error message.\n\n" ${FAILURE}
193        boot_mesg -n " It means that an unforeseen error took"
194        boot_mesg -n " place in ${i}, which exited with a return value of"
195        boot_mesg " ${error_value}.\n"
196        boot_mesg_flush
197        boot_mesg -n "If you're able to track this"
198        boot_mesg -n " error down to a bug in one of the files provided by"
199        boot_mesg -n " the LFS book, please be so kind to inform us at"
200        boot_mesg " lfs-dev@linuxfromscratch.org.\n"
201        boot_mesg_flush
202        if [ "$INTERACTIVE" ]; then
203                boot_mesg -n "Press Enter to continue..." ${INFO}
204                boot_mesg "" ${NORMAL}
205                if [ "$LCD_PROG" ]; then
206                        sleep 10
207                else
208                        read ENTER
209                fi
210        fi
211}
212
213check_script_status()
214{
215        # $i is inherited by the rc script
216        if [ ! -f ${i} ]; then
217                boot_mesg "${i} is not a valid symlink." ${WARNING}
218                echo_warning
219                continue
220        fi
221
222        if [ ! -x ${i} ]; then
223                boot_mesg "${i} is not executable, skipping." ${WARNING}
224                echo_warning
225                continue
226        fi
227}
228
229evaluate_retval()
230{
231        error_value="${?}"
232
233        if [ ${error_value} = 0 ]; then
234                echo_ok
235        else
236                echo_failure
237        fi
238
239        # This prevents the 'An Unexpected Error Has Occurred' from trivial
240        # errors.
241        return 0
242}
243
244print_status()
245{
246        if [ "${#}" = "0" ]; then
247                echo "Usage: ${0} {success|warning|failure}"
248                return 1
249        fi
250
251#       boot_mesg_flush
252#       echo_warning
253
254        case "${1}" in
255
256                success)
257                        echo_ok
258                        ;;
259
260                warning)
261                        # Leave this extra case in because old scripts
262                        # may call it this way.
263                        case "${2}" in
264                                running)
265                                        echo -e -n "${CURS_UP}"
266                                        echo -e -n "\\033[${STRING_LENGTH}G   "
267                                        boot_mesg "Already running." ${WARNING}
268                                        echo_warning
269                                        ;;
270                                not_running)
271                                        echo -e -n "${CURS_UP}"
272                                        echo -e -n "\\033[${STRING_LENGTH}G   "
273                                        boot_mesg "Not running." ${WARNING}
274                                        echo_warning
275                                        ;;
276                                not_available)
277                                        echo -e -n "${CURS_UP}"
278                                        echo -e -n "\\033[${STRING_LENGTH}G   "
279                                        boot_mesg "Not available." ${WARNING}
280                                        echo_warning
281                                        ;;
282                                *)
283                                        # This is how it is supposed to
284                                        # be called
285                                        echo_warning
286                                        ;;
287                        esac
288                ;;
289
290                failure)
291                        echo_failure
292                ;;
293
294        esac
295
296}
297
298reloadproc()
299{
300        if [ "${#}" = "0" ]; then
301                echo "Usage: reloadproc [{program}]"
302                exit 1
303        fi
304
305        getpids "${1}"
306
307        if [ -n "${pidlist}" ]; then
308                failure="0"
309                for pid in ${pidlist}
310                do
311                        kill -"${RELOADSIG}" "${pid}" || failure="1"
312                done
313
314                (exit ${failure})
315                evaluate_retval
316
317        else
318                boot_mesg "Process ${1} not running." ${WARNING}
319                echo_warning
320        fi
321}
322
323statusproc()
324{
325        if [ "${#}" = "0" ]
326        then
327                echo "Usage: statusproc {program}"
328                exit 1
329        fi
330
331        getpids "${1}"
332
333        if [ -n "${pidlist}" ]; then
334                echo -e "${INFO}${base} is running with Process"\
335                        "ID(s) ${pidlist}.${NORMAL}"
336        else
337                if [ -n "${base}" -a -e "/var/run/${base}.pid" ]; then
338                        echo -e "${WARNING}${1} is not running but"\
339                                "/var/run/${base}.pid exists.${NORMAL}"
340                else
341                        if [ -n "${PIDFILE}" -a -e "${PIDFILE}" ]; then
342                                echo -e "${WARNING}${1} is not running"\
343                                        "but ${PIDFILE} exists.${NORMAL}"
344                        else
345                                echo -e "${INFO}${1} is not running.${NORMAL}"
346                        fi
347                fi
348        fi
349}
350
351# The below functions are documented in the LSB-generic 2.1.0
352
353#*******************************************************************************
354# Function - pidofproc [-s] [-p pidfile] pathname
355#
356# Purpose: This function returns one or more pid(s) for a particular daemon
357#
358# Inputs: -p pidfile, use the specified pidfile instead of pidof
359#         pathname, path to the specified program
360#
361# Outputs: return 0 - Success, pid's in stdout
362#          return 1 - Program is dead, pidfile exists
363#          return 2 - Invalid or excessive number of arguments,
364#                     warning in stdout
365#          return 3 - Program is not running
366#
367# Dependencies: pidof, echo, head
368#
369# Todo: Remove dependency on head
370#       This depreciates getpids
371#       Test changes to pidof
372#
373#*******************************************************************************
374pidofproc()
375{
376        local pidfile=""
377        local lpids=""
378        local silent=""
379        pidlist=""
380        while true
381        do
382                case "${1}" in
383                        -p)
384                                pidfile="${2}"
385                                shift 2
386                                ;;
387
388                        -s)
389                                # Added for legacy opperation of getpids
390                                # eliminates several '> /dev/null'
391                                silent="1"
392                                shift 1
393                                ;;
394                        -*)
395                                log_failure_msg "Unknown Option: ${1}"
396                                return 2
397                                ;;
398                        *)
399                                break
400                                ;;
401                esac
402        done
403
404        if [ "${#}" != "1" ]; then
405                shift 1
406                log_failure_msg "Usage: pidofproc [-s] [-p pidfile] pathname"
407                return 2
408        fi
409
410        if [ -n "${pidfile}" ]; then
411                if [ ! -r "${pidfile}" ]; then
412                        return 3 # Program is not running
413                fi
414
415                lpids=`head -n 1 ${pidfile}`
416                for pid in ${lpids}
417                do
418                        if [ "${pid}" -ne "$$" -a "${pid}" -ne "${PPID}" ]; then
419                                kill -0 "${pid}" > /dev/null &&
420                                pidlist="${pidlist} ${pid}"
421                        fi
422                       
423                        if [ "${silent}" -ne "1" ]; then
424                                echo "${pidlist}"
425                        fi
426
427                        test -z "${pidlist}" && 
428                        # Program is dead, pidfile exists
429                        return 1
430                        # else
431                        return 0
432                done
433
434        else
435                pidlist=`pidof -o $$ -o $PPID -x "$1"`
436                if [ "x${silent}" != "x1" ]; then
437                        echo "${pidlist}"
438                fi
439
440                # Get provide correct running status
441                if [ -n "${pidlist}" ]; then
442                        return 0
443                else
444                        return 3
445                fi
446
447        fi
448
449        if [ "$?" != "0" ]; then
450                return 3 # Program is not running
451        fi
452}
453
454# This will ensure compatibility with previous LFS Bootscripts
455getpids()
456{
457        if [ -z "${PIDFILE}" ]; then
458                pidofproc -s -p "${PIDFILE}" $@
459        else
460                pidofproc -s $@
461        fi
462        base="${1##*/}"
463}
464
465#*******************************************************************************
466# Function - loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]
467#
468# Purpose: This runs the specified program as a daemon
469#
470# Inputs: -f, run the program even if it is already running
471#         -n nicelevel, specifies a nice level. See nice(1).
472#         -p pidfile, uses the specified pidfile
473#         pathname, pathname to the specified program
474#         args, arguments to pass to specified program
475#
476# Outputs: return 0 - Success
477#          return 2 - Invalid of excessive number of arguments,
478#                     warning in stdout
479#          return 4 - Program or service status is unknown
480#
481# Dependencies: nice
482#
483# Todo: LSB says this should be called start_daemon
484#       LSB does not say that it should call evaluate_retval
485#       It checks for PIDFILE, which is deprecated.
486#         Will be removed after BLFS 6.0
487#       loadproc returns 0 if program is already running, not LSB compliant
488#
489#*******************************************************************************
490loadproc()
491{
492        local pidfile=""
493        local forcestart=""
494        local nicelevel="10"
495
496# This will ensure compatibility with previous LFS Bootscripts
497        if [ -n "${PIDFILE}" ]; then
498                pidfile="${PIDFILE}"
499        fi
500
501  while true
502        do
503                case "${1}" in
504                        -f)
505                                forcestart="1"
506                                shift 1
507                                ;;
508                        -n)
509                                nicelevel="${2}"
510                                shift 2
511                                ;;
512                        -p)
513                                pidfile="${2}"
514                                shift 2
515                                ;;
516                        -*)
517                                log_failure_msg "Unknown Option: ${1}"
518                                return 2 #invalid or excess argument(s)
519                                ;;
520                        *)
521                                break
522                                ;;
523                esac
524        done
525
526        if [ "${#}" = "0" ]; then
527                log_failure_msg "Usage: loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]"
528                return 2 #invalid or excess argument(s)
529        fi
530
531        if [ -z "${forcestart}" ]; then
532                if [ -z "${pidfile}" ]; then
533                        pidofproc -s "${1}"
534                else
535                        pidofproc -s -p "${pidfile}" "${1}"
536                fi
537
538                case "${?}" in
539                        0)
540                                log_warning_msg "Unable to continue: ${1} is running"
541                                return 0 # 4
542                                ;;
543                        1)
544                                log_warning_msg "Unable to continue: ${pidfile} exists"
545                                return 0 # 4
546                                ;;
547                        3)
548                                ;;
549                        *)
550                                log_failure_msg "Unknown error code from pidofproc: ${?}"
551                                return 4
552                                ;;
553                esac
554        fi
555
556        nice -n "${nicelevel}" "${@}"
557        evaluate_retval # This is "Probably" not LSB compliant, but required to be compatible with older bootscripts
558        return 0
559}
560
561#*******************************************************************************
562# Function - killproc  [-p pidfile] pathname [signal]
563#
564# Purpose:
565#
566# Inputs: -p pidfile, uses the specified pidfile
567#         pathname, pathname to the specified program
568#         signal, send this signal to pathname
569#
570# Outputs: return 0 - Success
571#          return 2 - Invalid of excessive number of arguments,
572#                     warning in stdout
573#          return 4 - Unknown Status
574#
575# Dependencies: kill
576#
577# Todo: LSB does not say that it should call evaluate_retval
578#       It checks for PIDFILE, which is deprecated.
579#         Will be removed after BLFS 6.0
580#
581#*******************************************************************************
582killproc()
583{
584        local pidfile=""
585        local killsig=""
586        pidlist=""
587
588# This will ensure compatibility with previous LFS Bootscripts
589        if [ -n "${PIDFILE}" ]; then
590                pidfile="${PIDFILE}"
591        fi
592
593        while true
594        do
595                case "${1}" in
596                        -p)
597                                pidfile="${2}"
598                                shift 2
599                                ;;
600                        -*)
601                                log_failure_msg "Unknown Option: ${1}"
602                                return 2
603                        ;;
604                        *)
605                                break
606                                ;;
607                esac
608        done
609
610        if [ "${#}" = "2" ]; then
611                killsig="${2}"
612        elif [ "${#}" != "1" ]; then
613                shift 2
614                log_failure_msg "Usage: killproc  [-p pidfile] pathname [signal]"
615                return 2
616        fi
617
618        if [ -z "${pidfile}" ]; then
619                pidofproc -s "${1}"
620        else
621                pidofproc -s -p "${pidfile}" "${1}"
622        fi
623
624    # Change....
625    if [ -n "${pidlist}" ]; then
626        for pid in ${pidlist}
627        do
628                kill -${killsig:-TERM} ${pid} 2>/dev/null
629                if [ -z "${killsig}" ]; then
630                        # Wait up to 3 seconds, for ${pid} to terminate
631                        local dtime=${KILLDELAY}
632                        while [ "${dtime}" != "0" ]
633                        do
634                                kill -0 ${pid} 2>/dev/null || break
635                                sleep 1
636                                dtime=$(( ${dtime} - 1))
637                        done
638                        # If ${pid} is still running, kill it
639                        kill -0 ${pid} 2>/dev/null && kill -KILL ${pid} 2>/dev/null
640                fi
641        done
642
643        if [ -z "${killsig}" ]; then
644                pidofproc -s "${1}"
645
646                # Program was terminated
647                if [ "$?" != "0" ]; then
648                        # Pidfile Exists
649                        if [ -f "${pidfile}" ]; then
650                                rm -f "${pidfile}"
651                        fi
652                        echo_ok
653                        return 0
654                else # Program is still running
655                        echo_failure
656                        return 4 # Unknown Status
657                fi
658        else
659                if [ -z "${pidfile}" ]; then
660                        pidofproc -s "${1}"
661                else
662                        pidofproc -s -p "${pidfile}" "${1}"
663                fi
664        fi
665
666        evaluate_retval # This is "Probably" not LSB compliant, but required to be compatible with older bootscripts
667
668    else
669        print_status warning not_running
670    fi
671}
672
673
674#*******************************************************************************
675# Function - log_success_msg "message"
676#
677# Purpose: Print a success message
678#
679# Inputs: $@ - Message
680#
681# Outputs: Text output to screen
682#
683# Dependencies: echo
684#
685# Todo: logging
686#
687#*******************************************************************************
688log_success_msg()
689{
690        echo -n -e "${BOOTMESG_PREFIX}${@}"
691        echo -e "${SET_COL}""${BRACKET}""[""${SUCCESS}""  OK  ""${BRACKET}""]""${NORMAL}"
692        return 0
693}
694
695#*******************************************************************************
696# Function - log_failure_msg "message"
697#
698# Purpose: Print a failure message
699#
700# Inputs: $@ - Message
701#
702# Outputs: Text output to screen
703#
704# Dependencies: echo
705#
706# Todo: logging
707#
708#*******************************************************************************
709log_failure_msg() {
710        echo -n -e "${BOOTMESG_PREFIX}${@}"
711        echo -e "${SET_COL}""${BRACKET}""[""${FAILURE}"" FAIL ""${BRACKET}""]""${NORMAL}"
712        return 0
713}
714
715#*******************************************************************************
716# Function - log_warning_msg "message"
717#
718# Purpose: print a warning message
719#
720# Inputs: $@ - Message
721#
722# Outputs: Text output to screen
723#
724# Dependencies: echo
725#
726# Todo: logging
727#
728#*******************************************************************************
729log_warning_msg() {
730        echo -n -e "${BOOTMESG_PREFIX}${@}"
731        echo -e "${SET_COL}""${BRACKET}""[""${WARNING}"" WARN ""${BRACKET}""]""${NORMAL}"
732        return 0
733}
734
735# End $rc_base/init.d/functions
Note: See TracBrowser for help on using the repository browser.