#!/bin/bash
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/initng/ngcontrol/ng-update,v 1.5 2005/03/15 21:57:39 cvs Exp $

source /sbin/functions.sh
if [ "${EUID}" -ne 0 ]
then
	eerror "$0: must be root."
	exit 1
fi

usage() {
cat << FOO
usage: rc-update -a|add script runlevel2 [runlevel2...]
       rc-update -d|del script [runlevel1...]

note:  After ng-update executes, the script dependency cache is automatically
       updated.

examples:
       ng-update add net/eth0 default
       Adds the net/eth0 script (in /etc/initng) to the "default" runlevel.

       ng-update del daemon/sysklogd
       Removes sysklogd from all runlevels.

       ng-update del net/eth2 default wumpus
       Removes net/eth2 from runlevel default and wumpus

FOO
	exit 1
}

add() {
	local x=
	local myscript=
	
	if [ $# -lt 3 ]
	then
		eerror "${0}: at least two arguments expected after \"$1\"."
		exit 1
	fi
	shift
	myscript="$1"
	if [ ! -e "/etc/initng/${myscript}.i" ]
	then
		eerror "$0: /etc/initng/${myscript}.i not found; aborting."
		exit 1
	fi
	shift
	for x in $*
	do
		if [ ! -e "/etc/initng/${x}.runlevel" ]
		then
			ewarn "runlevel ${x} not found; skipping"
			continue
		fi
		
		#cat /etc/initng/${x}.runlevel | grep -x ${myscript} &> /dev/null
		# if string not zero 
		if [ ! -z $(grep -x ${myscript} /etc/initng/${x} &> /dev/null)]
		then
			ewarn "${myscript} already installed in runlevel ${x}; skipping"
			continue
		fi
		
		echo ${myscript} >> /etc/initng/${x}.runlevel
		if [ "$?" -ne 0 ]
		then
			eerror "$0: failed to add ${myscript} to ${x}."
			exit 1
		fi
		regen=1
		einfo "${myscript} added to runlevel ${x}"
		/sbin/ngc -r ${myscript} -r ${x} &> /dev/null
	done
}

del() {
	local x=
	local mylevels=
	local myscript=
	local remlevels=
	
	if [ $# -lt 2 ]
	then
		eerror "$0: at least one argument expected after \"$1\"."
		exit 1
	fi
	shift
	myscript=$1
	shift
	if [ $# -eq 0 ]
	then
		mylevels="`( cd /etc/initng; ls *.runlevel )`"
		for x in ${mylevels}
		do
		    if [ -e "/etc/initng/${x}" ]
		    then
			cat /etc/initng/${x} | grep -x ${myscript} &> /dev/null
			if [ ! $? -ne 0 ]
			then
			    cat /etc/initng/${x} | grep -x -v ${myscript} > /etc/initng/${x}.new
			    mv /etc/initng/${x}.new /etc/initng/${x}
			    regen=1
			    remlevels="${remlevels} ${x}"
			fi
			regen=1
			remlevels="${remlevels} ${x}"
		    fi
		done
	else
		mylevels="$*"
		for x in ${mylevels}
		do
		    if [ -e "/etc/initng/${x}.runlevel" ]
		    then
			
			cat /etc/initng/${x}.runlevel | grep -x ${myscript} &> /dev/null
			if [ ! $? -ne 0 ]
			then
			    cat /etc/initng/${x}.runlevel | grep -x -v ${myscript} > /etc/initng/${x}.new
			    mv /etc/initng/${x}.new /etc/initng/${x}.runlevel
			    regen=1
			    /sbin/ngc -r ${x} &> /dev/null
			    remlevels="${remlevels} ${x}"
			fi
		    fi
		done
	fi


	if [ "${remlevels}" = "" ]
	then
		einfo "${myscript} not found in any of the specified runlevels."
	else
		einfo "${myscript} removed from the following runlevels:${remlevels}"
		/sbin/ngc -r ${myscript} &> /dev/null
	fi
}

if [ $# -lt 1 ]
then
	usage
	exit 1
fi

regen=0

case "$1" in
	add|-a)
		add "$@"
		;;
	del|delete|-d)
		del "$@"
		;;
	*)
		usage
		exit 1
		;;
esac

if [ "${regen}" -eq 1 ]
then
	# depscan doesnt actually read runlevels so no point ...
	#/sbin/depscan.sh
	einfo "ng-update complete."
fi


# vim:ts=4
