#!/bin/bash # $Header: /home/cvsd/magellan-cvs/magellan-src/magellan-initscripts/sbin/rc-config,v 1.5 2006-03-25 21:13:09 niro Exp $ RC_INIT_BASE=${MROOT}/etc/init.d RC_EXCLUDE="rc functions template splash-functions" VERSION=0.3 get_run_levels() { local SCRIPT local ALL_LEVELS SCRIPT=${RC_INIT_BASE}/$1 ALL_LEVELS=$(grep -i "#%rlevels:" ${SCRIPT} | sed -e 's/#%rlevels://g') echo ${ALL_LEVELS} return 0 } get_needs() { local SCRIPT local ALL_LEVELS SCRIPT=${RC_INIT_BASE}/$1 ALL_LEVELS=$(grep -i "#%needs:" ${SCRIPT} | sed -e 's/#%needs://g') echo ${ALL_LEVELS} return 0 } get_before() { local SCRIPT local ALL_LEVELS SCRIPT=${RC_INIT_BASE}/$1 ALL_LEVELS=$(grep -i "#%before:" ${SCRIPT} | sed -e 's/#%before://g') echo ${ALL_LEVELS} return 0 } get_after() { local SCRIPT local ALL_LEVELS SCRIPT=${RC_INIT_BASE}/$1 ALL_LEVELS=$(grep -i "#%after:" ${SCRIPT} | sed -e 's/#%after://g') echo ${ALL_LEVELS} return 0 } get_start() { local SCRIPT local ALL_LEVELS SCRIPT=${RC_INIT_BASE}/$1 ALL_LEVELS=$(grep -i "#%start:" ${SCRIPT} | sed -e 's/#%start://g') echo ${ALL_LEVELS} return 0 } get_stop() { local SCRIPT local ALL_LEVELS SCRIPT=${RC_INIT_BASE}/$1 ALL_LEVELS=$(grep -i "#%stop:" ${SCRIPT} | sed -e 's/#%stop://g') echo ${ALL_LEVELS} return 0 } rc_service_add() { RC_SERVICE=$1 RC_START=$(get_start ${RC_SERVICE}) RC_STOP=$(get_stop ${RC_SERVICE}) echo "Adding ${RC_SERVICE} to:" for i in $(get_run_levels ${RC_SERVICE}) do case ${i} in # start ?:s) [[ ${i} = 7:s ]] && i="sysinit:s" echo -e "\t\t[rc${i/:s/}.d -> S${RC_START}]" ln -snf ../init.d/${RC_SERVICE} \ ${MROOT}/etc/rc.d/rc${i/:s/}.d/S${RC_START}${RC_SERVICE} ;; # stop ?:k) [[ ${i} = 7:k ]] && i="sysinit:k" echo -e "\t\t[rc${i/:k/}.d -> K${RC_STOP}]" ln -snf ../init.d/${RC_SERVICE} \ ${MROOT}/etc/rc.d/rc${i/:k/}.d/K${RC_STOP}${RC_SERVICE} ;; *) echo "error" exit 1 ;; esac done } rc_service_del() { RC_SERVICE=$1 echo "Deleting ${RC_SERVICE} from all runlevels:" for i in 0 1 2 3 4 5 6 sysinit do for z in 00 01 02 03 04 05 06 07 08 09 $(seq 10 99) do if [ -L "${MROOT}/etc/rc.d/rc${i}.d/S${z}${RC_SERVICE}" ] then echo -e "\t\t[rc${i}.d <- S${z}]" rm ${MROOT}/etc/rc.d/rc${i}.d/S${z}${RC_SERVICE} fi if [ -L "${MROOT}/etc/rc.d/rc${i}.d/K${z}${RC_SERVICE}" ] then echo -e "\t\t[rc${i}.d <- K${z}]" rm ${MROOT}/etc/rc.d/rc${i}.d/K${z}${RC_SERVICE} fi done done } rc_service_show() { RC_SERVICE=$1 local ALL_RUNLEVELS # read'em (single) for i in $(seq 0 7) do level=${i} [[ ${i} = 7 ]] && level=sysinit for script in ${MROOT}/etc/rc.d/rc${level}.d/* do x="$(basename ${script})" [[ ${x/???/} = ${RC_SERVICE} ]] && ALL_RUNLEVELS[${i}]=${x/${RC_SERVICE}/} done done # show them (single) echo -n "${RC_SERVICE}: " for i in $(seq 0 7) do [[ ! -z ${ALL_RUNLEVELS[${i}]} ]] && echo -n "[${i}:${ALL_RUNLEVELS[${i}]}] " done echo } check_not_excluded() { local SCRIPT SCRIPT=$1 for i in ${RC_EXCLUDE} do [[ ${SCRIPT} = ${i} ]] && return 1 done return 0 } chg_initdefault() { local newinitdef declare -i newinitdef="$1" if [[ -z ${newinitdef} ]] then echo "You must give an initlevel." exit 1 fi if [ ${newinitdef} -le 0 -a ${newinitdef} -ge 6 ] then echo "You can only choose initlevels between 1-5." exit 1 fi current=$(cat ${MROOT}/etc/inittab | grep initdefault) cp ${MROOT}/etc/inittab ${MROOT}/etc/inittab-orig sed -e "s/${current}/id:${newinitdef}:initdefault:/g" \ ${MROOT}/etc/inittab-orig > ${MROOT}/etc/inittab if [[ $? = 0 ]] then rm -f ${MROOT}/etc/inittab-orig echo "Changed default initlevel to ${newinitdef} successfully." exit 0 else echo "Error: original inittab was saved to /etc/inittab-orig" exit 1 fi } usage() { echo "Magellan RC Configurator v${VERSION} -- Niels Rogalla (niro@magellan-linux.de)" echo -e "\nUsage: $(basename $0) [Option] [File] ..." echo -e " add adds script to runlevel" echo -e " del deletes script from runlevel" echo -e " show shows current runlevel settings" echo -e " default x changes default runlevel to x" echo -e "\n" } case $1 in add) rc_service_add $2 ;; del) rc_service_del $2 ;; show) # show all if [[ -z $2 ]] then echo "Currently configured Services:" for i in ${RC_INIT_BASE}/* do x=$(basename ${i}) if check_not_excluded ${x} then rc_service_show ${x} fi done else echo "Currently configured Services:" rc_service_show $2 fi ;; default) chg_initdefault $2 ;; *) usage ;; esac