xref: /dflybsd-src/sbin/rcrun/rcrun.sh (revision 9be803700db9c3ea3d47f5087284c7c9f6984fca)
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