carp: Change 1/0 usage of int into boolean_t, which is more expressive
[dragonfly.git] / sbin / rcrun / rcrun.sh
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
36 buildrclist()
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
47 dostart()
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/rcone"
91                     ;;
92                 Xfailed*)
93                     echo "$i has failed to start"
94                     ;;
95                         
96                 esac
97             fi
98             ;;
99         esac
100     done
101 }
102
103 arg=$0
104 case ${0##*/} in
105 rcstart)
106     arg=start
107     ;;
108 rcstop)
109     arg=stop
110     ;;
111 rcrestart)
112     arg=restart
113     ;;
114 rcvar)
115     arg=rcvar
116     ;;
117 rcvars)
118     arg=rcvar
119     ;;
120 rclist)
121     arg=list
122     ;;
123 rcforce)
124     arg=forcestart
125     ;;
126 rcfast)
127     arg=faststart
128     ;;
129 rcone)
130     arg=onestart
131     ;;
132 rcenable)
133     arg=enable
134     ;;
135 rcdisable)
136     arg=disable
137     ;;
138 *)
139     arg=$1
140     shift
141     ;;
142 esac
143
144 case $arg in
145 start)
146         dostart start $@
147         ;;
148 forcestart)
149         dostart forcestart $@
150         ;;
151 faststart)
152         dostart faststart $@
153         ;;
154 onestart)
155         dostart onestart $@
156         ;;
157 stop)
158         for i in $@; do
159             buildrclist $i
160             j=`echo "$rclist" | tail -1`
161             if [ X$j = X ]; then
162                 echo "Unable to find keyword $i"
163             else
164                 (sh $j stop)
165             fi
166         done
167         ;;
168 restart)
169         for i in $@; do
170             buildrclist $i
171             j=`echo "$rclist" | tail -1`
172             if [ X$j = X ]; then
173                 echo "Unable to find keyword $i"
174             else
175                 (sh $j restart)
176             fi
177         done
178         ;;
179 disable|enable)
180         if [ "$arg" = "enable" ]; then
181             mode=YES
182         else
183             mode=NO
184         fi
185         for i in $@; do
186             buildrclist $i
187             j=`echo "$rclist" | tail -1`
188             if [ X$j = X ]; then
189                 echo "Unable to find provider id $i"
190             elif [ `varsym -s -q rcng_$i` = "$mode" ]; then
191                 echo "$i is already $mode"
192             else
193                 vars=`(sh $j rcvar) 2>/dev/null | grep = | sed -e 's/\\$//g' | sed -e 's/=.*//g'`
194                 cp /etc/rc.conf /etc/rc.conf.bak
195                 if [ $arg = disable ]; then
196                     rcstop $i
197                 fi
198                 for k in $vars; do
199                     rm -f /etc/rc.conf.$$
200                     ( egrep -v "# rcrun enable ${k}$" /etc/rc.conf; printf "${k}=${mode}\t# rcrun enable ${k}\n" ) > /etc/rc.conf.$$
201                     mv -f /etc/rc.conf.$$ /etc/rc.conf
202                     echo "added/modified: ${k}=${mode}"
203                 done
204                 if [ $arg = enable ]; then
205                     rcstart $i
206                 fi
207             fi
208         done
209         ;;
210 rcvar)
211         for i in $@; do
212             buildrclist $i
213             j=`echo "$rclist" | tail -1`
214             if [ X$j = X ]; then
215                 echo "Unable to find provider id $i"
216             else
217                 (sh $j rcvar)
218             fi
219         done
220         ;;
221 list)
222         if [ "X$*" = X ]; then
223             for i in `varsym -a -s | egrep '^rcng_'`; do
224                 echo $i
225             done
226         else
227             for i in $@; do
228                 varsym -s rcng_$i 2>/dev/null || varsym -s rcng_$i
229             done
230         fi
231         ;;
232 *)
233         echo "usage: rcrun action rcscript1 ..."
234         echo "  where 'action' is one of:"
235         echo "    start|stop|restart|rcvar|list|forcestart|faststart|onestart"
236         echo "    disable|enable"
237         ;;
238 esac