xref: /dragonfly/sbin/rcrun/rcrun.sh (revision e96fb831)
1#!/bin/sh
2#
3# Copyright (c) 2003
4#	The DragonFly Project.  All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9#
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in
14#    the documentation and/or other materials provided with the
15#    distribution.
16# 3. Neither the name of The DragonFly Project nor the names of its
17#    contributors may be used to endorse or promote products derived
18#    from this software without specific, prior written permission.
19#
20# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23# FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
24# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25# INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
26# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31# SUCH DAMAGE.
32#
33
34. /etc/defaults/rc.conf
35
36buildrclist()
37{
38    rcfiles=`find /etc/rc.d -type f`
39    for d in $local_startup; do
40	if [ -d $d ]; then
41	    rcfiles="$rcfiles `find $d -type f`"
42	fi
43    done
44    rclist=`rcorder -o $1 $rcfiles`
45}
46
47dostart()
48{
49    arg=$1
50    shift
51
52    for i in $@; do
53	case X`varsym -s -q rcng_$i` in
54	Xrunning*)
55	    echo "$i has already been started"
56	    ;;
57	Xconfigured*)
58	    echo "$i has already been configured"
59	    ;;
60	*)
61	    _return=0
62	    buildrclist $i
63	    for j in $rclist; do
64		need=1
65		for k in `rcorder -p $j`; do
66		    if [ $k = $i ]; then
67			need=0
68		    else
69			state=`varsym -s -q rcng_$k`
70			case X$state in
71			Xrunning*|Xconfigured*|Xirrelevant*|Xdisabled*)
72			    ;;
73			*)
74			    echo "$i depends on $k, current state: $state"
75			    _return=1
76			    ;;
77			esac
78		    fi
79		done
80	    done
81	    # $j contains the last dependency, which we run
82	    #
83	    if [ X$j = X ]; then
84		echo "Unable to find keyword $i"
85	    elif [ $_return = 0 ]; then
86		echo "Running $j $arg"
87		(sh $j $arg)
88		case X`varsym -s -q rcng_$i` in
89		Xdisabled*)
90		    echo "$i is disabled, enable in rc.conf first or use rcforce"
91		    ;;
92		Xfailed*)
93		    echo "$i has failed to start"
94		    ;;
95
96		esac
97	    fi
98	    ;;
99	esac
100    done
101}
102
103arg=$0
104case ${0##*/} in
105rcstart)
106    arg=start
107    ;;
108rcstop)
109    arg=stop
110    ;;
111rcrestart)
112    arg=restart
113    ;;
114rcvar)
115    arg=rcvar
116    ;;
117rcvars)
118    arg=rcvar
119    ;;
120rclist)
121    arg=list
122    ;;
123rcforce)
124    arg=forcestart
125    ;;
126rcfast)
127    arg=faststart
128    ;;
129rcenable)
130    arg=enable
131    ;;
132rcdisable)
133    arg=disable
134    ;;
135*)
136    arg=$1
137    shift
138    ;;
139esac
140
141case $arg in
142start)
143	dostart start $@
144	;;
145forcestart)
146	dostart forcestart $@
147	;;
148faststart)
149	dostart faststart $@
150	;;
151stop)
152	for i in $@; do
153	    buildrclist $i
154	    j=`echo "$rclist" | tail -1`
155	    if [ X$j = X ]; then
156		echo "Unable to find keyword $i"
157	    else
158		(sh $j stop)
159	    fi
160	done
161	;;
162restart)
163	for i in $@; do
164	    buildrclist $i
165	    j=`echo "$rclist" | tail -1`
166	    if [ X$j = X ]; then
167		echo "Unable to find keyword $i"
168	    else
169		(sh $j restart)
170	    fi
171	done
172	;;
173disable|enable)
174	if [ "$arg" = "enable" ]; then
175	    mode=YES
176	else
177	    mode=NO
178	fi
179	for i in $@; do
180	    buildrclist $i
181	    j=`echo "$rclist" | tail -1`
182	    if [ X$j = X ]; then
183		echo "Unable to find provider id $i"
184	    elif [ `varsym -s -q rcng_$i` = "$mode" ]; then
185		echo "$i is already $mode"
186	    else
187		vars=`(sh $j rcvar) 2>/dev/null | grep = | sed -e 's/\\$//g' | sed -e 's/=.*//g'`
188		cp /etc/rc.conf /etc/rc.conf.bak
189		if [ $arg = disable ]; then
190		    rcstop $i
191		fi
192		for k in $vars; do
193		    rm -f /etc/rc.conf.$$
194		    ( egrep -v "# rcrun enable ${k}$" /etc/rc.conf; printf "${k}=${mode}\t# rcrun enable ${k}\n" ) > /etc/rc.conf.$$
195		    mv -f /etc/rc.conf.$$ /etc/rc.conf
196		    echo "added/modified: ${k}=${mode}"
197		done
198		if [ $arg = enable ]; then
199		    rcstart $i
200		fi
201	    fi
202	done
203	;;
204rcvar)
205	for i in $@; do
206	    buildrclist $i
207	    j=`echo "$rclist" | tail -1`
208	    if [ X$j = X ]; then
209		echo "Unable to find provider id $i"
210	    else
211		(sh $j rcvar)
212	    fi
213	done
214	;;
215list)
216	if [ "X$*" = X ]; then
217	    for i in `varsym -a -s | egrep '^rcng_'`; do
218		echo $i
219	    done
220	else
221	    for i in $@; do
222		varsym -s rcng_$i 2>/dev/null || varsym -s rcng_$i
223	    done
224	fi
225	;;
226*)
227	echo "usage: rcrun start|stop|restart|rcvar|list|forcestart|faststart|disable|enable"
228	echo "             script ..."
229	;;
230esac
231