#!/bin/bash # $Header: /home/cvsd/magellan-cvs/magellan-src/busybox-initscripts/sbin/rc-config,v 1.3 2008-06-19 12:37:36 niro Exp $ RC_INIT_BASE=${MROOT}/etc/init.d RC_EXCLUDE="rc functions template splash-functions udev mdev" 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 # ignore these runlevels: [1245]:[sk]) continue ;; # start ?:s) [[ ${i} = 7:s ]] && i="sysinit:s" [[ ${i} = 3:s ]] && i="boot:s" [[ ${i} = 0:s ]] && i="shutdown: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" [[ ${i} = 3:k ]] && i="boot:k" [[ ${i} = 0:k ]] && i="shutdown: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 boot shutdown 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 [[ ${i} = 3 ]] && level=boot [[ ${i} = 0 ]] && level=shutdown 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 } 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 "\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 ;; *) usage ;; esac