diff options
Diffstat (limited to 'bootscripts/contrib/lsb/lib/init-functions')
-rw-r--r-- | bootscripts/contrib/lsb/lib/init-functions | 348 |
1 files changed, 348 insertions, 0 deletions
diff --git a/bootscripts/contrib/lsb/lib/init-functions b/bootscripts/contrib/lsb/lib/init-functions new file mode 100644 index 000000000..3f1ec2400 --- /dev/null +++ b/bootscripts/contrib/lsb/lib/init-functions @@ -0,0 +1,348 @@ + +#******************************************************************************* +# Function - start_daemon [-f] [-n nicelevel] [-p pidfile] pathname [args] +# +# Purpose: This runs the specified program as a daemon +# +# Inputs: -f, run the program even if it is already running +# -n nicelevel, specifies a nice level. See nice(1). +# -p pidfile, uses the specified pidfile +# pathname, pathname to the specified program +# args, arguments to pass to specified program +# +# Outputs: return 0 - Success +# return 2 - Invalid or excessive number of arguments, +# warning in stdout +# return 4 - Program or service status is unknown +# +# Dependencies: nice +# +# Todo: none +# +#******************************************************************************* +start_daemon() +{ + local pidfile="" + local forcestart="" + local nicelevel="0" + + while true + do + case "${1}" in + -f) + forcestart="1" + shift 1 + ;; + -n) + nicelevel="${2}" + shift 2 + ;; + -p) + pidfile="${2}" + shift 2 + ;; + -*) + log_failure_msg "Unknown Option: ${1}" + return 2 + ;; + *) + break + ;; + esac + done + + if [ -z "${forcestart}" ]; then + if [ -z "${pidfile}" ]; then + pidofproc "${1}" > /dev/null + else + pidofproc -p "${pidfile}" "${1}" > /dev/null + fi + + case "${?}" in + 0) + log_warning_msg "Unable to continue: ${1} is running" + return 4 + ;; + 1) + log_warning_msg "Unable to continue: ${pidfile} exists" + return 4 + ;; + 3) + ;; + *) + log_failure_msg "Unknown error code from pidofproc: ${?}" + return 4 + ;; + esac + fi + + nice -n "${nicelevel}" "${@}" +} + +#******************************************************************************* +# Function - killproc [-p pidfile] pathname [signal] +# +# Purpose: +# +# Inputs: -p pidfile, uses the specified pidfile +# pathname, pathname to the specified program +# signal, send this signal to pathname +# +# Outputs: return 0 - Success +# return 1 - Invalid or excessive number of arguments, +# warning in stdout +# return 4 - Unknown Status +# +# Dependencies: kill +# +# Todo: test +# +#******************************************************************************* +killproc() +{ + local pidfile="" + local killsig="" + local pidlist="" + while true + do + case "${1}" in + -p) + pidfile="${2}" + shift 2 + ;; + -*) + log_failure_msg "Unknown Option: ${1}" + return 1 + ;; + *) + break + ;; + esac + done + + if [ "${#}" = "2" ]; then + killsig="${2}" + elif [ "${#}" != "1" ]; then + shift 2 + log_failure_msg "Excess Arguments: $@" + return 1 + fi + + if [ -z "${pidfile}" ]; then + pidlist=`pidofproc "${1}"` + else + pidlist=`pidofproc -p "${pidfile}" "${1}"` + fi + + for pid in ${pidlist} + do + kill -${killsig:-TERM} ${pid} 2> /dev/null + if [ -z "${killsig}" ]; then + # Wait up to 3 seconds, for ${pid} to terminate + local dtime=3 + while [ "${dtime}" != "0" ] + do + kill -0 ${pid} 2> /dev/null || break + sleep 1 + dtime=$(( ${dtime} - 1)) + done + # If ${pid} is still running, kill it + kill -0 ${pid} 2> /dev/null && kill -KILL ${pid} 2> /dev/null + fi + done + + if [ -z "${killsig}" ]; then + pidofproc "${1}" 2>&1 > /dev/null + + # Program was terminated + if [ "$?" != "0" ]; then + # Pidfile Exists + if [ -f "${pidfile}" ]; then + rm -f "${pidfile}" 2>&1 > /dev/null + fi + return 0 + else # Program is still running + return 4 # Unknown Status + fi + else + if [ -z "${pidfile}" ]; then + pidofproc "${1}" 2> /dev/null + else + pidofproc -p "${pidfile}" "${1}" 2> /dev/null + fi + fi +} + +#******************************************************************************* +# Function - pidofproc [-p pidfile] pathname +# +# Purpose: This function returns one or more pid(s) for a particular daemon +# +# Inputs: -p pidfile, use the specified pidfile instead of pidof +# pathname, path to the specified program +# +# Outputs: return 0 - Success, pid's in stdout +# return 1 - Invalid or excessive number of arguments, +# warning in stdout +# return 1 - Program is dead, pidfile exists +# return 3 - Program is not running +# +# Dependencies: pidof, echo +# +# Todo: - Invalid or excessive argments, and program is dead pidfile exists +# conflict with eachother +# +#******************************************************************************* +pidofproc() +{ + local pidfile="" + local lpids="" + local pidlist="" + while true + do + case "${1}" in + -p) + pidfile="${2}" + shift 2 + ;; + -*) + log_failure_msg "Unknown Option: ${1}" + return 1 + ;; + *) + break + ;; + esac + done + + if [ "${#}" != "1" ]; then + shift 1 + log_failure_msg "Excess Arguments: $@" + return 1 + fi + + if [ -n "${pidfile}" ]; then + if [ ! -r "${pidfile}" ]; then + return 3 # Program is not running + fi + + lpids=`head -n 1 ${pidfile}` + for pid in ${lpids} + do + if [ "${pid}" -ne "$$" -a "${pid}" -ne "${PPID}" ]; then + kill -0 "${pid}" 2> /dev/null && + pidlist="${pidlist} ${pid}" + fi + echo ${pidlist} + test -z "${pidlist}" && return 1 # Program is dead, pidfile exists + return 0 + done + + else + pidof "${1}" + fi + + if [ "$?" != "0" ]; then + return 3 # Program is not running + fi +} + +# Screen Dimentions +if [ -z "${COLUMNS}" ]; then + COLUMNS=$(stty size) + COLUMNS=${COLUMNS##* } +fi + +# When using remote connections, such as a serial port, stty size returns 0 +if [ "${COLUMNS}" = "0" ]; then + COLUMNS=80 +fi + +# Measurements for positioning result messages +COL=$((${COLUMNS} - 8)) +WCOL=$((${COL} - 2)) + +# Set Cursur Position Commands, used via echo -e +SET_COL="\\033[${COL}G" # at the $COL char +SET_WCOL="\\033[${WCOL}G" # at the $WCOL char +CURS_UP="\\033[1A\\033[0G" # Up one line, at the 0'th char + +# Set color commands, used via echo -e +# Please consult `man console_codes` for more information +# under the "Set Graphics Resolution" section +# +# Warning, when switching from a 8bit to a 9bit font, +# the linux console will reinterpret the bold (1;) to +# the top 256 glyphs of the 9bit font. This does +# not affect framebuffer consoles +NORMAL="\\033[0;39m" # Standard console grey +SUCCESS="\\033[1;32m" # Success is green +WARNING="\\033[1;33m" # Warnings are yellow +FAILURE="\\033[1;31m" # Failures are red +INFO="\\033[1;36m" # Information is light cyan +BRACKET="\\033[1;34m" # Brackets are blue + +BOOTMESG_PREFIX=" * " # Text at the beginning of every line + + +#******************************************************************************* +# Function - log_success_msg "message" +# +# Purpose: Print a success message +# +# Inputs: +# +# Outputs: +# +# Dependencies: echo +# +# Todo: logging +# +#******************************************************************************* +log_success_msg() +{ + echo -n -e "${BOOTMESG_PREFIX}${@}" + echo -e "${SET_COL}""${BRACKET}""[""${SUCCESS}"" OK ""${BRACKET}""]""${NORMAL}" + return 0 +} + +#******************************************************************************* +# Function - log_failure_msg "message" +# +# Purpose: Print a failure message +# +# Inputs: $@ - Message +# +# Outputs: Text output to screen +# +# Dependencies: echo +# +# Todo: logging +# +#******************************************************************************* +log_failure_msg() { + echo -n -e "${BOOTMESG_PREFIX}${@}" + echo -e "${SET_COL}""${BRACKET}""[""${FAILURE}"" FAIL ""${BRACKET}""]""${NORMAL}" + return 0 +} + +#******************************************************************************* +# Function - log_warning_msg "message" +# +# Purpose: print a warning message +# +# Inputs: $@ - Message +# +# Outputs: Text output to screen +# +# Dependencies: echo +# +# Todo: logging +# +#******************************************************************************* +log_warning_msg() { + echo -n -e "${BOOTMESG_PREFIX}${@}" + echo -e "${SET_COL}""${BRACKET}""[""${WARNING}"" WARN ""${BRACKET}""]""${NORMAL}" + return 0 +} + |