| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 | 
#*******************************************************************************# 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 Dimentionsif [ -z "${COLUMNS}" ]; then  COLUMNS=$(stty size)  COLUMNS=${COLUMNS##* }fi# When using remote connections, such as a serial port, stty size returns 0if [ "${COLUMNS}" = "0" ]; then  COLUMNS=80fi# Measurements for positioning result messagesCOL=$((${COLUMNS} - 8))WCOL=$((${COL} - 2))# Set Cursur Position Commands, used via echo -eSET_COL="\\033[${COL}G"      # at the $COL charSET_WCOL="\\033[${WCOL}G"    # at the $WCOL charCURS_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 consolesNORMAL="\\033[0;39m"         # Standard console greySUCCESS="\\033[1;32m"        # Success is greenWARNING="\\033[1;33m"        # Warnings are yellowFAILURE="\\033[1;31m"        # Failures are redINFO="\\033[1;36m"           # Information is light cyanBRACKET="\\033[1;34m"        # Brackets are blueBOOTMESG_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}
 |