| 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 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
 
- }
 
 
  |