#!/bin/bash # Begin $rc_base/init.d/functions - Run Level Control Functions # Based on functions script from LFS-3.1 and earlier. # Rewritten by Gerard Beekmans - gerard@linuxfromscratch.org # With code based on Matthias Benkmann's simpleinit-msb @ # http://winterdrache.de/linux/newboot/index.html umask 022 export PATH="/bin:/usr/bin:/sbin:/usr/sbin" KILLDELAY=3 COLUMNS=$(stty size) COLUMNS=${COLUMNS##* } COL=$[ $COLUMNS - 10 ] WCOL=$[ $COLUMNS - 30 ] WWCOL=$[ $COLUMNS - 40 ] SET_COL="echo -en \\033[${COL}G" SET_WCOL="echo -en \\033[${WCOL}G" SET_WWCOL="echo -en \\033[${WWCOL}G" CURS_UP="echo -en \\033[A" NORMAL="echo -en \\033[0;39m" SUCCESS="echo -en \\033[1;32m" WARNING="echo -en \\033[1;33m" FAILURE="echo -en \\033[1;31m" COLRED="\033[1;6m\033[31m" COLGREEN="\033[1;6m\033[32m" COLYELLOW="\033[1;6m\033[33m" COLBLUE="\033[1;6m\033[34m" COLMAGENTA="\033[1;6m\033[35m" COLWHITE="\033[1;6m\033[37m" COLDEFAULT="\033[0m" COLOREDSTAR="${COLBLUE}(${COLGREEN}*${COLBLUE})${COLDEFAULT} " #location to save the started services svcdir="/var/lib/init.d" svclib="/lib/rcscripts" svcmount="no" svcfstype="tmpfs" svcsize=1024 # dummy function; needed if splashutils are not installed splash() { return 0 } #source splash functions if exists [ -f /etc/init.d/splash-functions ] && source /etc/init.d/splash-functions print_error_msg() { return 0 echo $FAILURE echo -e " An Error occurred." echo -e " Script: ${COLWHITE}$i${COLRED}" echo -e " Exitcode: ${COLWHITE}$error_value${COLRED}" echo $NORMAL echo echo "Press Enter to continue..." read } check_script_status() { if [ ! -f $i ] then echo "$i is not a valid symlink" continue fi if [ ! -x $i ] then echo "$i is not executable, skipping" continue fi } update_svcstatus() { #$1 script #$2 start/stop local SVCDIR_MOUNTED local SVCD_INITSCRIPT local x #do this only if proc is mounted [ ! -f /proc/mounts ] && return 0 #check if svcdir is mounted SVCDIR_MOUNTED="$(cat /proc/mounts | grep ${svcdir} | cut -d ' ' -f2)" if [ "${SVCDIR_MOUNTED}" == "${svcdir}" ] then #check if statedir exists [ ! -d ${svcdir}/started ] && mkdir ${svcdir}/started #get real name of the initscript, not from the symlink if [ -L "$0" ] then x="$(readlink $0)" SVCD_INITSCRIPT="$(basename ${x})" else SVCD_INITSCRIPT="$(basename $0)" fi case $1 in start) #write to svcddir #write state echo ok > ${svcdir}/started/"${SVCD_INITSCRIPT}" ;; stop) #echo "$(ls ${svcdir}/started)" if [ -f ${svcdir}/started/${SVCD_INITSCRIPT} ] then rm ${svcdir}/started/${SVCD_INITSCRIPT} fi ;; esac fi } evaluate_retval() { error_value=$? if [ $error_value = 0 ] then print_status success else print_status failure fi return $error_value } print_status() { if [ $# = 0 ] then echo "Usage: $0 {success|warning|failure}" return 1 fi $CURS_UP case "$1" in success) $SET_COL echo -e -n $COLBLUE"[ " $SUCCESS echo -e -n "OK" echo -e $COLBLUE" ]" $NORMAL ;; warning) case "$2" in running) $SET_WCOL echo "Already running" $CURS_UP ;; not_running) $SET_WCOL echo "Not running" $CURS_UP ;; esac $SET_COL echo -e -n $COLBLUE"[ " $WARNING echo -e -n "ATTN" echo -e $COLBLUE" ]" $NORMAL ;; failure) $SET_COL echo -e -n $COLBLUE"[" $FAILURE echo -e -n "FAILED" echo -e $COLBLUE"]" $NORMAL ;; esac } getpids() { base=${1##*/} pidlist=$(pidof -o $$ -o $PPID -x $base) } loadproc() { if [ $# = 0 ] then echo "Usage: loadproc {program}" exit 1 fi getpids $1 if [ -z "$pidlist" ] then "$@" evaluate_retval else $SET_WCOL print_status warning running fi } killproc() { if [ $# = 0 ] then echo "Usage: killproc {program} [signal]" exit 1 fi if [ -z "$2" ]; then signal=TERM fallback=KILL else signal=${2##-} signal=${signal##SIG} fallback="" fi getpids $1 if [ -n "$pidlist" ]; then failure=0 for pid in $pidlist do kill -$signal $pid 2>/dev/null for ((i=0; $i<5000; i=$i+1)); do :; done for ((i=0; $i<$KILLDELAY; i=$i+1)); do kill -0 $pid 2>/dev/null || break sleep 1 done if [ -n "$fallback" ]; then kill -$fallback $pid 2>/dev/null; fi kill -0 $pid 2>/dev/null && failure=1 done base=${1##*/} if [ $failure = 0 ]; then rm -f /var/run/$base.pid; fi (exit $failure) evaluate_retval else $SET_WCOL print_status warning not_running fi } reloadproc() { if [ $# = 0 ] then echo "Usage: reloadproc {program} [signal]" exit 1 fi if [ -z "$2" ]; then signal=HUP else signal=${2##-} signal=${signal##SIG} fi getpids $1 if [ -n "$pidlist" ] then failure=0 for pid in $pidlist do kill -$signal $pid || failure=1 done (exit $failure) evaluate_retval else $SET_WCOL print_status warning not_running fi } statusproc() { if [ $# = 0 ] then echo "Usage: statusproc {program}" exit 1 fi base=${1##*/} getpids $base if [ -n "$pidlist" ] then echo "$base is running with Process ID(s) $pidlist" else if [ -s /var/run/$base.pid ] then echo "$1 is not running but /var/run/$base.pid exists" return 1 else echo "$1 is not running" fi fi } progressbar() { if [ $# != 1 ] then echo "Usage: progressbar {progress}" exit 1 fi if [ -f /proc/splash ] then echo "show $(( 65534 * $1 / 100 ))" > /proc/splash fi } kernel_major_version() { local KV KV="$(uname -r|cut -d. -f1-2)" echo "${KV}" } dolisting() { local x= local y= local tmpstr= local mylist= local mypath="${*}" if [ "${mypath%/\*}" != "${mypath}" ] then mypath="${mypath%/\*}" fi for x in ${mypath} do [ ! -e "${x}" ] && continue if [ ! -d "${x}" ] && ( [ -L "${x}" -o -f "${x}" ] ) then mylist="${mylist} $(ls "${x}" 2> /dev/null)" else [ "${x%/}" != "${x}" ] && x="${x%/}" cd "${x}"; tmpstr="$(ls)" for y in ${tmpstr} do mylist="${mylist} ${x}/${y}" done fi done echo "${mylist}" }