175326d0eSMatthew Dillon#!/bin/sh 275326d0eSMatthew Dillon# 3faee0ee7SSascha Wildner# Copyright (c) 2003 4faee0ee7SSascha Wildner# The DragonFly Project. All rights reserved. 575326d0eSMatthew Dillon# 6faee0ee7SSascha Wildner# Redistribution and use in source and binary forms, with or without 7faee0ee7SSascha Wildner# modification, are permitted provided that the following conditions 8faee0ee7SSascha Wildner# are met: 9faee0ee7SSascha Wildner# 10faee0ee7SSascha Wildner# 1. Redistributions of source code must retain the above copyright 11faee0ee7SSascha Wildner# notice, this list of conditions and the following disclaimer. 12faee0ee7SSascha Wildner# 2. Redistributions in binary form must reproduce the above copyright 13faee0ee7SSascha Wildner# notice, this list of conditions and the following disclaimer in 14faee0ee7SSascha Wildner# the documentation and/or other materials provided with the 15faee0ee7SSascha Wildner# distribution. 16faee0ee7SSascha Wildner# 3. Neither the name of The DragonFly Project nor the names of its 17faee0ee7SSascha Wildner# contributors may be used to endorse or promote products derived 18faee0ee7SSascha Wildner# from this software without specific, prior written permission. 19faee0ee7SSascha Wildner# 20faee0ee7SSascha Wildner# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21faee0ee7SSascha Wildner# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22faee0ee7SSascha Wildner# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23faee0ee7SSascha Wildner# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24faee0ee7SSascha Wildner# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25faee0ee7SSascha Wildner# INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 26faee0ee7SSascha Wildner# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27faee0ee7SSascha Wildner# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28faee0ee7SSascha Wildner# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29faee0ee7SSascha Wildner# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 30faee0ee7SSascha Wildner# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31faee0ee7SSascha Wildner# SUCH DAMAGE. 32faee0ee7SSascha Wildner# 33faee0ee7SSascha Wildner 3477cf93c9SSascha Wildnerif [ -r /etc/defaults/rc.conf ]; then 35faee0ee7SSascha Wildner . /etc/defaults/rc.conf 3677cf93c9SSascha Wildnerfi 3777cf93c9SSascha Wildner 3877cf93c9SSascha Wildnerif [ -r /etc/rc.conf ]; then 3977cf93c9SSascha Wildner . /etc/rc.conf 4077cf93c9SSascha Wildnerfi 41faee0ee7SSascha Wildner 42faee0ee7SSascha Wildnerbuildrclist() 43faee0ee7SSascha Wildner{ 44faee0ee7SSascha Wildner rcfiles=`find /etc/rc.d -type f` 45faee0ee7SSascha Wildner for d in $local_startup; do 46faee0ee7SSascha Wildner if [ -d $d ]; then 47faee0ee7SSascha Wildner rcfiles="$rcfiles `find $d -type f`" 48faee0ee7SSascha Wildner fi 49faee0ee7SSascha Wildner done 50383f7785SSascha Wildner # The last element of this list is the script that provides the target 51383f7785SSascha Wildner # we want to run. 52383f7785SSascha Wildner # 53faee0ee7SSascha Wildner rclist=`rcorder -o $1 $rcfiles` 54faee0ee7SSascha Wildner} 5575326d0eSMatthew Dillon 5675326d0eSMatthew Dillondostart() 5775326d0eSMatthew Dillon{ 5875326d0eSMatthew Dillon arg=$1 5975326d0eSMatthew Dillon shift 6075326d0eSMatthew Dillon 614fb199c4SSascha Wildner for tgt in $@; do 624fb199c4SSascha Wildner case X`varsym -s -q rcng_$tgt` in 6375326d0eSMatthew Dillon Xrunning*) 644fb199c4SSascha Wildner echo "$tgt has already been started" 6575326d0eSMatthew Dillon ;; 666d94234bSMatthew Dillon Xconfigured*) 674fb199c4SSascha Wildner echo "$tgt has already been configured" 686d94234bSMatthew Dillon ;; 6975326d0eSMatthew Dillon *) 7075326d0eSMatthew Dillon _return=0 714fb199c4SSascha Wildner buildrclist $tgt 724fb199c4SSascha Wildner for dep in $rclist; do 7375326d0eSMatthew Dillon need=1 74383f7785SSascha Wildner dep_prvd_list=`rcorder -p $dep` 75383f7785SSascha Wildner # Because the dependency could actually provide more than one 76383f7785SSascha Wildner # keyword, iterate it twice, first looking for a match in any 77383f7785SSascha Wildner # of its PROVIDEs. 78383f7785SSascha Wildner # 79383f7785SSascha Wildner for dep_prvd in $dep_prvd_list; do 804fb199c4SSascha Wildner if [ $dep_prvd = $tgt ]; then 8175326d0eSMatthew Dillon need=0 82383f7785SSascha Wildner fi 83383f7785SSascha Wildner done 84383f7785SSascha Wildner if [ $need = 1 ]; then 85383f7785SSascha Wildner for dep_prvd in $dep_prvd_list; do 864fb199c4SSascha Wildner state=`varsym -s -q rcng_$dep_prvd` 8775326d0eSMatthew Dillon case X$state in 886d94234bSMatthew Dillon Xrunning*|Xconfigured*|Xirrelevant*|Xdisabled*) 89453375e0SMatthew Dillon ;; 9075326d0eSMatthew Dillon *) 914fb199c4SSascha Wildner echo "$tgt depends on $dep_prvd, current state: $state" 9275326d0eSMatthew Dillon _return=1 9375326d0eSMatthew Dillon ;; 9475326d0eSMatthew Dillon esac 9575326d0eSMatthew Dillon done 96383f7785SSascha Wildner fi 9775326d0eSMatthew Dillon done 984fb199c4SSascha Wildner # $dep contains the last dependency, which we run 9975326d0eSMatthew Dillon # 1004fb199c4SSascha Wildner if [ X$dep = X ]; then 1014fb199c4SSascha Wildner echo "Unable to find keyword $tgt" 10275326d0eSMatthew Dillon elif [ $_return = 0 ]; then 1034fb199c4SSascha Wildner echo "Running $dep $arg" 1044fb199c4SSascha Wildner (sh $dep $arg) 1054fb199c4SSascha Wildner case X`varsym -s -q rcng_$tgt` in 106453375e0SMatthew Dillon Xdisabled*) 1074fb199c4SSascha Wildner echo "$tgt is disabled, enable in rc.conf first or use rcforce/rcone" 108453375e0SMatthew Dillon ;; 1096d94234bSMatthew Dillon Xfailed*) 1104fb199c4SSascha Wildner echo "$tgt has failed to start" 1116d94234bSMatthew Dillon ;; 1126d94234bSMatthew Dillon 113453375e0SMatthew Dillon esac 11475326d0eSMatthew Dillon fi 11575326d0eSMatthew Dillon ;; 11675326d0eSMatthew Dillon esac 11775326d0eSMatthew Dillon done 11875326d0eSMatthew Dillon} 11975326d0eSMatthew Dillon 12075326d0eSMatthew Dillonarg=$0 12175326d0eSMatthew Dilloncase ${0##*/} in 12275326d0eSMatthew Dillonrcstart) 12375326d0eSMatthew Dillon arg=start 12475326d0eSMatthew Dillon ;; 12575326d0eSMatthew Dillonrcstop) 12675326d0eSMatthew Dillon arg=stop 12775326d0eSMatthew Dillon ;; 12875326d0eSMatthew Dillonrcrestart) 12975326d0eSMatthew Dillon arg=restart 13075326d0eSMatthew Dillon ;; 131958ca0fdSZach Crownoverrcreload) 132958ca0fdSZach Crownover arg=reload 133958ca0fdSZach Crownover ;; 134*9be80370SRobin Hahlingrcstatus) 135*9be80370SRobin Hahling arg=status 136*9be80370SRobin Hahling ;; 13775326d0eSMatthew Dillonrcvar) 13875326d0eSMatthew Dillon arg=rcvar 13975326d0eSMatthew Dillon ;; 14075326d0eSMatthew Dillonrcvars) 14175326d0eSMatthew Dillon arg=rcvar 14275326d0eSMatthew Dillon ;; 14375326d0eSMatthew Dillonrclist) 14475326d0eSMatthew Dillon arg=list 14575326d0eSMatthew Dillon ;; 14675326d0eSMatthew Dillonrcforce) 14775326d0eSMatthew Dillon arg=forcestart 14875326d0eSMatthew Dillon ;; 14975326d0eSMatthew Dillonrcfast) 15075326d0eSMatthew Dillon arg=faststart 15175326d0eSMatthew Dillon ;; 152c19a53a9SChris Turnerrcone) 153c19a53a9SChris Turner arg=onestart 154c19a53a9SChris Turner ;; 1556d94234bSMatthew Dillonrcenable) 1566d94234bSMatthew Dillon arg=enable 1576d94234bSMatthew Dillon ;; 1586d94234bSMatthew Dillonrcdisable) 1596d94234bSMatthew Dillon arg=disable 1606d94234bSMatthew Dillon ;; 16175326d0eSMatthew Dillon*) 16275326d0eSMatthew Dillon arg=$1 16375326d0eSMatthew Dillon shift 16475326d0eSMatthew Dillon ;; 16575326d0eSMatthew Dillonesac 16675326d0eSMatthew Dillon 16775326d0eSMatthew Dilloncase $arg in 16875326d0eSMatthew Dillonstart) 16975326d0eSMatthew Dillon dostart start $@ 17075326d0eSMatthew Dillon ;; 17175326d0eSMatthew Dillonforcestart) 17275326d0eSMatthew Dillon dostart forcestart $@ 17375326d0eSMatthew Dillon ;; 17475326d0eSMatthew Dillonfaststart) 17575326d0eSMatthew Dillon dostart faststart $@ 17675326d0eSMatthew Dillon ;; 177c19a53a9SChris Turneronestart) 178c19a53a9SChris Turner dostart onestart $@ 179c19a53a9SChris Turner ;; 18075326d0eSMatthew Dillonstop) 1814fb199c4SSascha Wildner for tgt in $@; do 1824fb199c4SSascha Wildner buildrclist $tgt 1834fb199c4SSascha Wildner dep=`echo "$rclist" | tail -1` 1844fb199c4SSascha Wildner if [ X$dep = X ]; then 1854fb199c4SSascha Wildner echo "Unable to find keyword $tgt" 18675326d0eSMatthew Dillon else 1874fb199c4SSascha Wildner (sh $dep stop) 18875326d0eSMatthew Dillon fi 18975326d0eSMatthew Dillon done 19075326d0eSMatthew Dillon ;; 19175326d0eSMatthew Dillonrestart) 1924fb199c4SSascha Wildner for tgt in $@; do 1934fb199c4SSascha Wildner buildrclist $tgt 1944fb199c4SSascha Wildner dep=`echo "$rclist" | tail -1` 1954fb199c4SSascha Wildner if [ X$dep = X ]; then 1964fb199c4SSascha Wildner echo "Unable to find keyword $tgt" 19775326d0eSMatthew Dillon else 1984fb199c4SSascha Wildner (sh $dep restart) 19975326d0eSMatthew Dillon fi 20075326d0eSMatthew Dillon done 20175326d0eSMatthew Dillon ;; 202958ca0fdSZach Crownoverreload) 203958ca0fdSZach Crownover for tgt in $@; do 204958ca0fdSZach Crownover buildrclist $tgt 205958ca0fdSZach Crownover dep=`echo "$rclist" | tail -1` 206958ca0fdSZach Crownover if [ X$dep = X ]; then 207958ca0fdSZach Crownover echo "Unable to find keyword $tgt" 208958ca0fdSZach Crownover else 209958ca0fdSZach Crownover (sh $dep reload) 210958ca0fdSZach Crownover fi 211958ca0fdSZach Crownover done 212958ca0fdSZach Crownover ;; 213*9be80370SRobin Hahlingstatus) 214*9be80370SRobin Hahling for tgt in $@; do 215*9be80370SRobin Hahling buildrclist $tgt 216*9be80370SRobin Hahling dep=`echo "$rclist" | tail -1` 217*9be80370SRobin Hahling if [ X$dep = X ]; then 218*9be80370SRobin Hahling echo "Unable to find keyword $tgt" 219*9be80370SRobin Hahling else 220*9be80370SRobin Hahling (sh $dep status) 221*9be80370SRobin Hahling fi 222*9be80370SRobin Hahling done 223*9be80370SRobin Hahling ;; 2246d94234bSMatthew Dillondisable|enable) 2256d94234bSMatthew Dillon if [ "$arg" = "enable" ]; then 2266d94234bSMatthew Dillon mode=YES 2276d94234bSMatthew Dillon else 2286d94234bSMatthew Dillon mode=NO 2296d94234bSMatthew Dillon fi 2304fb199c4SSascha Wildner for tgt in $@; do 2314fb199c4SSascha Wildner buildrclist $tgt 2324fb199c4SSascha Wildner dep=`echo "$rclist" | tail -1` 2334fb199c4SSascha Wildner if [ X$dep = X ]; then 2344fb199c4SSascha Wildner echo "Unable to find provider id $tgt" 2354fb199c4SSascha Wildner elif [ `varsym -s -q rcng_$tgt` = "$mode" ]; then 2364fb199c4SSascha Wildner echo "$tgt is already $mode" 2376d94234bSMatthew Dillon else 2384fb199c4SSascha Wildner vars=`(sh $dep rcvar) 2>/dev/null | grep = | sed -e 's/\\$//g' | sed -e 's/=.*//g'` 2396d94234bSMatthew Dillon cp /etc/rc.conf /etc/rc.conf.bak 2406eb624aaSSascha Wildner if [ $arg = disable ]; then 2414fb199c4SSascha Wildner rcstop $tgt 2426eb624aaSSascha Wildner fi 2436d94234bSMatthew Dillon for k in $vars; do 2446d94234bSMatthew Dillon rm -f /etc/rc.conf.$$ 2456eb624aaSSascha Wildner ( egrep -v "# rcrun enable ${k}$" /etc/rc.conf; printf "${k}=${mode}\t# rcrun enable ${k}\n" ) > /etc/rc.conf.$$ 2466d94234bSMatthew Dillon mv -f /etc/rc.conf.$$ /etc/rc.conf 2476d94234bSMatthew Dillon echo "added/modified: ${k}=${mode}" 2486d94234bSMatthew Dillon done 2496d94234bSMatthew Dillon if [ $arg = enable ]; then 2504fb199c4SSascha Wildner rcstart $tgt 2516d94234bSMatthew Dillon fi 2526d94234bSMatthew Dillon fi 2536d94234bSMatthew Dillon done 2546d94234bSMatthew Dillon ;; 25575326d0eSMatthew Dillonrcvar) 2564fb199c4SSascha Wildner for tgt in $@; do 2574fb199c4SSascha Wildner buildrclist $tgt 2584fb199c4SSascha Wildner dep=`echo "$rclist" | tail -1` 2594fb199c4SSascha Wildner if [ X$dep = X ]; then 2604fb199c4SSascha Wildner echo "Unable to find provider id $tgt" 26175326d0eSMatthew Dillon else 2624fb199c4SSascha Wildner (sh $dep rcvar) 26375326d0eSMatthew Dillon fi 26475326d0eSMatthew Dillon done 26575326d0eSMatthew Dillon ;; 26675326d0eSMatthew Dillonlist) 26723da15d3SSascha Wildner if [ "X$*" = X ]; then 2684fb199c4SSascha Wildner for tgt in `varsym -a -s | egrep '^rcng_'`; do 2694fb199c4SSascha Wildner echo $tgt 27075326d0eSMatthew Dillon done 27175326d0eSMatthew Dillon else 2724fb199c4SSascha Wildner for tgt in $@; do 2734fb199c4SSascha Wildner varsym -s rcng_$tgt 2>/dev/null || varsym -s rcng_$tgt 27475326d0eSMatthew Dillon done 27575326d0eSMatthew Dillon fi 27675326d0eSMatthew Dillon ;; 27775326d0eSMatthew Dillon*) 278c19a53a9SChris Turner echo "usage: rcrun action rcscript1 ..." 279c19a53a9SChris Turner echo " where 'action' is one of:" 280*9be80370SRobin Hahling echo " start|stop|restart|reload|status|rcvar|list|forcestart|faststart" 281958ca0fdSZach Crownover echo " onestart|disable|enable" 28275326d0eSMatthew Dillon ;; 28375326d0eSMatthew Dillonesac 284