Home | History | Annotate | Line # | Download | only in chkconfig
      1 #!/bin/sh
      2 #
      3 #	$NetBSD: chkconfig.sh,v 1.3 2004/01/05 23:23:32 jmmv Exp $
      4 #
      5 # Copyright (c) 2001 Zembu Labs, Inc.
      6 # All rights reserved.
      7 #
      8 # Author: Dan Mercer <dmercer (at] zembu.com>
      9 #
     10 # Redistribution and use in source and binary forms, with or without
     11 # modification, are permitted provided that the following conditions
     12 # are met:
     13 # 1. Redistributions of source code must retain the above copyright
     14 #    notice, this list of conditions and the following disclaimer.
     15 # 2. Redistributions in binary form must reproduce the above copyright
     16 #    notice, this list of conditions and the following disclaimer in the
     17 #    documentation and/or other materials provided with the distribution.
     18 # 3. All advertising materials mentioning features or use of this software
     19 #    must display the following acknowledgement:
     20 #	This product includes software developed by Zembu Labs, Inc.
     21 # 4. Neither the name of Zembu Labs nor the names of its employees may
     22 #    be used to endorse or promote products derived from this software
     23 #    without specific prior written permission.
     24 #
     25 # THIS SOFTWARE IS PROVIDED BY ZEMBU LABS, INC. ``AS IS'' AND ANY EXPRESS
     26 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WAR-
     27 # RANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DIS-
     28 # CLAIMED.  IN NO EVENT SHALL ZEMBU LABS BE LIABLE FOR ANY DIRECT, INDIRECT,
     29 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     30 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     31 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     32 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     33 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     34 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     35 #
     36 
     37 # chkconfig - configuration state checker
     38 #
     39 # This script is written to work with the NetBSD (1.5 and later) rc system. 
     40 # It is meant to provide the same functionality as found in IRIX chkconfig. 
     41 # This script has nothing to do with the abortion produced by RedHat that
     42 # has the same name.
     43 #
     44 # chkconfig makes use of the '-k' flag to rcorder. It will not work 
     45 # with versions of rcorder that do not support '-k'.
     46 #
     47 # Dan Mercer <dmercer (at] zembu.com>
     48 
     49 . /etc/rc.subr
     50 
     51 display()
     52 {
     53 	# output $1 with 'on' or 'off' based on the return of checkyesno()
     54 	# Returns 0 for yes, 1 for no.
     55 
     56 	_name=$1	
     57 	load_rc_config ${_name}
     58 	if checkyesno ${_name}; then
     59 		printf "\t%-15s\t\ton\n" ${_name}
     60 		return 0
     61 	else
     62 		printf "\t%-15s\t\toff\n" ${_name}
     63 		return 1
     64 	fi
     65 }
     66 
     67 exists()
     68 {
     69 	# Returns true if an executable named $1 exists
     70 	# in /etc/rc.d/
     71 
     72 	_name=$1
     73 	fqp="/etc/rc.d/${_name}"
     74 	if [ -x "${fqp}" ]; then
     75 		return 0
     76 	else
     77 		usage "${fqp} does not exist"
     78 		return 1
     79 	fi
     80 }
     81 
     82 is_valid()
     83 {
     84 	# Returns true if $1 appears to be a valid NetBSD
     85 	# rc script.
     86 
     87 	_name=$1
     88 	fqp="/etc/rc.d/${_name}"
     89 	if ! grep -s '. /etc/rc.subr' ${fqp} > /dev/null 2>&1; then
     90 		usage "${fqp} does not appear to be a NetBSD rc script"
     91 		return 1
     92 	elif ! grep -s '# KEYWORD:' ${fqp} > /dev/null 2>&1; then
     93 		if [ ${force} -ne 1 ]; then
     94 			usage "${fqp} doesn't contain a KEYWORD directive. Use -f"
     95 		else
     96 			return 1
     97 		fi
     98 	else
     99 		is_chkconfig=`grep -s '# KEYWORD:' ${fqp}|grep -s ${KEYWORD}`
    100 		if [ "${is_chkconfig}" ]; then
    101 			return 0
    102 		else
    103 			if [ ${force} -ne 1 ]; then
    104 				usage "${fqp} not under chkconfig control. Use -f"
    105 			else
    106 				return 1
    107 			fi	
    108 		fi
    109 	fi
    110 	return 1
    111 }
    112 
    113 add_keyword()
    114 {
    115 	# Adds the 'chkconfig' keyword to $1 if it is not
    116 	# there already, returning a 0. Otherwise exits
    117 	# with an appropriate usage error.
    118 
    119 	_name=$1
    120         fqp="/etc/rc.d/${_name}"
    121 	if is_valid ${_name}; then
    122 		usage "${fqp} is already managed by chkconfig."
    123 	else
    124 		echo '# KEYWORD: chkconfig' >> ${fqp}
    125 		return 0
    126 	fi
    127 }
    128 
    129 usage()
    130 {
    131 	# Print a (hopefully) useful usage message and exit nonzero.
    132 	# We don't make use of err() from rc.subr because we
    133 	# don't want error messages going to syslog.
    134 
    135 	_err=$1
    136 	echo "Error: ${_err}"
    137 	echo "usage: $0 flag"
    138 	echo "       $0 flag [ on | off ] "
    139 	echo "       $0 [-f] flag [ on | off ]"
    140 	exit 1
    141 }
    142 
    143 on()
    144 {
    145 	_name=$1
    146 	if [ ${force} -eq 1 ]; then
    147 		add_keyword ${_name}
    148 	fi
    149 
    150 	if is_valid ${_name}; then
    151 		output="/etc/rc.conf.d/${_name}"
    152 		echo "${_name}=YES" > "${output}"
    153 	fi
    154 	return 0
    155 }
    156 
    157 off()
    158 {
    159 	_name=$1
    160 	if [ ${force} -eq 1 ]; then
    161 		add_keyword ${_name}
    162 	fi
    163 
    164 	if is_valid ${_name}; then
    165 		output="/etc/rc.conf.d/${_name}"
    166 		echo "${_name}=NO" > "${output}"
    167 	fi
    168 	return 0
    169 }
    170 
    171 KEYWORD='chkconfig'
    172 action='show'
    173 force=0
    174 
    175 for i
    176 do
    177 	case $1 in
    178 	-f)
    179 		force=1
    180 		;;
    181 	on)
    182 		action='on'
    183 		break
    184 		;;
    185 	off)
    186 		action='off'
    187 		break
    188 		;;
    189 	-*)
    190 		usage "Invalid argument ${i}"
    191 		exit 1
    192 		;;
    193 	*)
    194 		rcfile=${i}
    195 		;;
    196 	esac
    197 	shift
    198 done
    199 
    200 case ${action} in
    201 	show)
    202 		if [ ${force} -eq 1 ]; then
    203 			usage "-f flag requires 'on' or 'off'"
    204 		fi
    205 		if [ ! ${rcfile} ]; then
    206 			printf "\tService\t\t\tState\n"
    207 			printf "\t=======\t\t\t=====\n"
    208 			for i in `(cd /etc/rc.d; rcorder -k ${KEYWORD} *)`; do
    209 				display ${i}
    210 			done
    211 		else
    212 			if exists ${rcfile} && is_valid ${rcfile}; then
    213 				display ${rcfile}
    214 				exit $?
    215 			else
    216 				usage "Invalid rcfile: ${rcfile}"
    217 			fi
    218 		fi
    219 		exit 0
    220 		;;
    221 	on)
    222 		if exists ${rcfile}; then
    223 			on ${rcfile}
    224 		fi	
    225 		;;
    226 	off)
    227 		if exists ${rcfile}; then
    228 			off ${rcfile}
    229 		fi
    230 		;;
    231 esac
    232