source: bootscripts/lfs/init.d/functions @ a6ede08

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

r3512@server: jim | 2006-05-15 16:13:26 -0700
Updated LCD Support

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