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 34if [ -r /etc/defaults/rc.conf ]; then 35 . /etc/defaults/rc.conf 36fi 37 38if [ -r /etc/rc.conf ]; then 39 . /etc/rc.conf 40fi 41 42buildrclist() 43{ 44 rcfiles=`find /etc/rc.d -type f` 45 for d in $local_startup; do 46 if [ -d $d ]; then 47 rcfiles="$rcfiles `find $d -type f`" 48 fi 49 done 50 # The last element of this list is the script that provides the target 51 # we want to run. 52 # 53 rclist=`rcorder -o $1 $rcfiles` 54} 55 56dostart() 57{ 58 arg=$1 59 shift 60 61 for tgt in $@; do 62 case X`varsym -s -q rcng_$tgt` in 63 Xrunning*) 64 echo "$tgt has already been started" 65 ;; 66 Xconfigured*) 67 echo "$tgt has already been configured" 68 ;; 69 *) 70 _return=0 71 buildrclist $tgt 72 for dep in $rclist; do 73 need=1 74 dep_prvd_list=`rcorder -p $dep` 75 # Because the dependency could actually provide more than one 76 # keyword, iterate it twice, first looking for a match in any 77 # of its PROVIDEs. 78 # 79 for dep_prvd in $dep_prvd_list; do 80 if [ $dep_prvd = $tgt ]; then 81 need=0 82 fi 83 done 84 if [ $need = 1 ]; then 85 for dep_prvd in $dep_prvd_list; do 86 state=`varsym -s -q rcng_$dep_prvd` 87 case X$state in 88 Xrunning*|Xconfigured*|Xirrelevant*|Xdisabled*) 89 ;; 90 *) 91 echo "$tgt depends on $dep_prvd, current state: $state" 92 _return=1 93 ;; 94 esac 95 done 96 fi 97 done 98 # $dep contains the last dependency, which we run 99 # 100 if [ X$dep = X ]; then 101 echo "Unable to find keyword $tgt" 102 elif [ $_return = 0 ]; then 103 echo "Running $dep $arg" 104 (sh $dep $arg) 105 case X`varsym -s -q rcng_$tgt` in 106 Xdisabled*) 107 echo "$tgt is disabled, enable in rc.conf first or use rcforce/rcone" 108 ;; 109 Xfailed*) 110 echo "$tgt has failed to start" 111 ;; 112 113 esac 114 fi 115 ;; 116 esac 117 done 118} 119 120arg=$0 121case ${0##*/} in 122rcstart) 123 arg=start 124 ;; 125rcstop) 126 arg=stop 127 ;; 128rcrestart) 129 arg=restart 130 ;; 131rcreload) 132 arg=reload 133 ;; 134rcvar) 135 arg=rcvar 136 ;; 137rcvars) 138 arg=rcvar 139 ;; 140rclist) 141 arg=list 142 ;; 143rcforce) 144 arg=forcestart 145 ;; 146rcfast) 147 arg=faststart 148 ;; 149rcone) 150 arg=onestart 151 ;; 152rcenable) 153 arg=enable 154 ;; 155rcdisable) 156 arg=disable 157 ;; 158*) 159 arg=$1 160 shift 161 ;; 162esac 163 164case $arg in 165start) 166 dostart start $@ 167 ;; 168forcestart) 169 dostart forcestart $@ 170 ;; 171faststart) 172 dostart faststart $@ 173 ;; 174onestart) 175 dostart onestart $@ 176 ;; 177stop) 178 for tgt in $@; do 179 buildrclist $tgt 180 dep=`echo "$rclist" | tail -1` 181 if [ X$dep = X ]; then 182 echo "Unable to find keyword $tgt" 183 else 184 (sh $dep stop) 185 fi 186 done 187 ;; 188restart) 189 for tgt in $@; do 190 buildrclist $tgt 191 dep=`echo "$rclist" | tail -1` 192 if [ X$dep = X ]; then 193 echo "Unable to find keyword $tgt" 194 else 195 (sh $dep restart) 196 fi 197 done 198 ;; 199reload) 200 for tgt in $@; do 201 buildrclist $tgt 202 dep=`echo "$rclist" | tail -1` 203 if [ X$dep = X ]; then 204 echo "Unable to find keyword $tgt" 205 else 206 (sh $dep reload) 207 fi 208 done 209 ;; 210disable|enable) 211 if [ "$arg" = "enable" ]; then 212 mode=YES 213 else 214 mode=NO 215 fi 216 for tgt in $@; do 217 buildrclist $tgt 218 dep=`echo "$rclist" | tail -1` 219 if [ X$dep = X ]; then 220 echo "Unable to find provider id $tgt" 221 elif [ `varsym -s -q rcng_$tgt` = "$mode" ]; then 222 echo "$tgt is already $mode" 223 else 224 vars=`(sh $dep rcvar) 2>/dev/null | grep = | sed -e 's/\\$//g' | sed -e 's/=.*//g'` 225 cp /etc/rc.conf /etc/rc.conf.bak 226 if [ $arg = disable ]; then 227 rcstop $tgt 228 fi 229 for k in $vars; do 230 rm -f /etc/rc.conf.$$ 231 ( egrep -v "# rcrun enable ${k}$" /etc/rc.conf; printf "${k}=${mode}\t# rcrun enable ${k}\n" ) > /etc/rc.conf.$$ 232 mv -f /etc/rc.conf.$$ /etc/rc.conf 233 echo "added/modified: ${k}=${mode}" 234 done 235 if [ $arg = enable ]; then 236 rcstart $tgt 237 fi 238 fi 239 done 240 ;; 241rcvar) 242 for tgt in $@; do 243 buildrclist $tgt 244 dep=`echo "$rclist" | tail -1` 245 if [ X$dep = X ]; then 246 echo "Unable to find provider id $tgt" 247 else 248 (sh $dep rcvar) 249 fi 250 done 251 ;; 252list) 253 if [ "X$*" = X ]; then 254 for tgt in `varsym -a -s | egrep '^rcng_'`; do 255 echo $tgt 256 done 257 else 258 for tgt in $@; do 259 varsym -s rcng_$tgt 2>/dev/null || varsym -s rcng_$tgt 260 done 261 fi 262 ;; 263*) 264 echo "usage: rcrun action rcscript1 ..." 265 echo " where 'action' is one of:" 266 echo " start|stop|restart|reload|rcvar|list|forcestart|faststart" 267 echo " onestart|disable|enable" 268 ;; 269esac 270