diff options
author | Roy Marples <roy@marples.name> | 2008-02-27 20:29:32 +0000 |
---|---|---|
committer | Roy Marples <roy@marples.name> | 2008-02-27 20:29:32 +0000 |
commit | c2648ca5f539c450b27d35c7c0a3d41c6e193d8f (patch) | |
tree | 1de8b046bd8c1029165670c697eace4c89ece8f5 /sh/runscript.sh.in | |
parent | 143570689bc93c68fa83c3eb56d622b707ec0e18 (diff) |
Makefile SH variable now tweaks the default shell used by our scripts.
Diffstat (limited to 'sh/runscript.sh.in')
-rw-r--r-- | sh/runscript.sh.in | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/sh/runscript.sh.in b/sh/runscript.sh.in new file mode 100644 index 00000000..6b8c3db2 --- /dev/null +++ b/sh/runscript.sh.in @@ -0,0 +1,185 @@ +#!@SHELL@ +# Shell wrapper for runscript + +# Copyright 2007-2008 Roy Marples <roy@marples.name> +# All rights reserved. Released under the 2-clause BSD license. + +. /etc/init.d/functions.sh +. "${RC_LIBDIR}"/sh/rc-functions.sh + +# Support LiveCD foo +if [ -r /sbin/livecd-functions.sh ]; then + . /sbin/livecd-functions.sh + livecd_read_commandline +fi + +if [ -z "$1" -o -z "$2" ]; then + eerror "${SVCNAME}: not enough arguments" + exit 1 +fi + +# Descript the init script to the user +describe() +{ + if [ -n "${description}" ]; then + einfo "${description}" + else + ewarn "No description for ${SVCNAME}" + fi + + local svc= desc= + for svc in ${extra_commands:-${opts}} ${extra_started_commands}; do + eval desc=\$description_${svc} + if [ -n "${desc}" ]; then + einfo "${HILITE}${svc}${NORMAL}: ${desc}" + else + ewarn "${HILITE}${svc}${NORMAL}: no description" + fi + done +} + +yesno ${RC_DEBUG} && set -x + +# If we're net.eth0 or openvpn.work then load net or openvpn config +_c=${SVCNAME%%.*} +if [ -n "${_c}" -a "${_c}" != "${SVCNAME}" ]; then + if [ -e "/etc/conf.d/${_c}.${RC_SOFTLEVEL}" ]; then + . "/etc/conf.d/${_c}.${RC_SOFTLEVEL}" + elif [ -e "/etc/conf.d/${_c}" ]; then + . "/etc/conf.d/${_c}" + fi +fi +unset _c + +# Overlay with our specific config +if [ -e "/etc/conf.d/${SVCNAME}.${RC_SOFTLEVEL}" ]; then + . "/etc/conf.d/${SVCNAME}.${RC_SOFTLEVEL}" +elif [ -e "/etc/conf.d/${SVCNAME}" ]; then + . "/etc/conf.d/${SVCNAME}" +fi + +# Load any system overrides +[ -e /etc/rc.conf ] && . /etc/rc.conf + +# Apply any ulimit defined +[ -n "${rc_ulimit:-${RC_ULIMIT}}" ] && ulimit ${rc_ulimit:-${RC_ULIMIT}} + +# Load our script +. $1 +shift + +for _d in ${required_dirs}; do + if [ ! -d ${_d} ]; then + eerror "${SVCNAME}: \`${_d}' is not a directory" + exit 1 + fi +done +unset _d + +for _f in ${required_files}; do + if [ ! -r ${_f} ]; then + eerror "${SVCNAME}: \`${_f}' is not readable" + exit 1 + fi +done +unset _f + +# If we have a default command then supply a default start function +if [ -n "${command}" ]; then + if ! type start >/dev/null 2>&1; then + start() { + local _background= + ebegin "Starting ${name:-${SVCNAME}}" + if yesno "${command_background}"; then + _background="--background --pidfile" + fi + if yesno "${start_inactive}"; then + local _inactive=false + service_inactive && _inactive=true + mark_service_inactive + fi + start-stop-daemon --start \ + --exec ${command} \ + ${procname:+--name} ${procname} \ + ${pidfile:+--pidfile} ${pidfile} \ + ${_background} ${start_stop_daemon_args} \ + -- ${command_args} + eend $? "Failed to start ${SVCNAME}" && return 0 + if yesno "${start_inactive}"; then + if ! ${_inactive}; then + mark_service_stopped + fi + fi + return 1 + } + fi +fi + +# If we have a default command, procname or pidfile then supply a default stop +# function +if [ -n "${command}" -o -n "${procname}" -o -n "${pidfile}" ]; then + if ! type stop >/dev/null 2>&1; then + stop() { + ebegin "Stopping ${name:-${SVCNAME}}" + start-stop-daemon --stop \ + ${command:+--exec} ${command} \ + ${procname:+--name} ${procname} \ + ${pidfile:+--pidfile} ${pidfile} + eend $? "Failed to stop ${SVCNAME}" + } + fi +fi + +while [ -n "$1" ]; do + # See if we have the required function and run it + for _cmd in describe start stop ${extra_commands:-${opts}} \ + ${extra_started_commands}; do + if [ "${_cmd}" = "$1" ]; then + if type "$1" >/dev/null 2>&1; then + # If we're in the background, we may wish to + # fake some commands. We do this so we can + # "start" ourselves from inactive which then + # triggers other services to start which depend + # on us. A good example of this is openvpn. + if yesno ${IN_BACKGROUND}; then + for _cmd in ${in_background_fake}; do + if [ "${_cmd}" = "$1" ]; then + shift + continue 3 + fi + done + fi + # Check to see if we need to be started before + # we can run this command + for _cmd in ${extra_started_commands}; do + if [ "${_cmd}" = "$1" ]; then + if ! service_started; then + eerror "${SVCNAME}: cannot \`$1' as it has not been started" + exit 1 + fi + fi + done + unset _cmd + if type "$1"_pre >/dev/null 2>&1; then + "$1"_pre || exit $? + fi + "$1" || exit $? + if type "$1"_post >/dev/null 2>&1; then + "$1"_post || exit $? + fi + shift + continue 2 + else + if [ "${_cmd}" = "start" -o "${_cmd}" = "stop" ]; then + shift + continue 2 + else + eerror "${SVCNAME}: function \`$1' defined but does not exist" + exit 1 + fi + fi + fi + done + eerror "${SVCNAME}: unknown function \`$1'" + exit 1 +done |