#!/bin/sh # Shell wrapper for runscript # Copyright 2007-2008 Roy Marples # 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 "${SVCNAME}" && _inactive=true mark_service_inactive "${SVCNAME}" 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 "${SVCNAME}" 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 "${SVCNAME}"; 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 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