#!/bin/bash #rc-config2 #header layout #runlevenumber:start #runlevenumber:stop #%rlevels 1:k 2:s #start number #%start #stop number #%stop #deps; unused yet #%needs #%before #%after RC_INIT_BASE=/etc/init.d RC_EXCLUDE="rc functions template splash-functions" VERSION=0.2 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} \ /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} \ /etc/rc.d/rc${i/:k/}.d/K${RC_STOP}${RC_SERVICE} ;; *) echo "error" exit 1 ;; esac done #echo "." } 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 "/etc/rc.d/rc${i}.d/S${z}${RC_SERVICE}" ] then echo -e "\t\t[rc${i}.d <- S${z}]" rm /etc/rc.d/rc${i}.d/S${z}${RC_SERVICE} fi if [ -L "/etc/rc.d/rc${i}.d/K${z}${RC_SERVICE}" ] then echo -e "\t\t[rc${i}.d <- K${z}]" rm /etc/rc.d/rc${i}.d/K${z}${RC_SERVICE} fi done done } rc_service_show_old() { RC_SERVICE=$1 local ALL_RUNLEVELS [ -z "${RC_SERVICE}" ] && RC_SERVICE=all if [ "${RC_SERVICE}" != all ] then #read'em (single) for i in $(seq 0 7) do if [ ${i} -eq 7 ] then level=sysinit else level=${i} fi for script in /etc/rc.d/rc${level}.d/* do x="$(basename ${script})" if [ "${x/???/}" == "${RC_SERVICE}" ] then ALL_RUNLEVELS[${i}]=${x/${RC_SERVICE}/} fi done done #show them (single) #echo "Currently configured Services:" echo -n "${RC_SERVICE}: " for i in $(seq 0 7) do if [ ${i} -eq 7 ] then level=sysinit else level=${i} fi if [ ! -z "${ALL_RUNLEVELS[${i}]}" ] then echo -n "[${level}:${ALL_RUNLEVELS[${i}]}] " fi done echo else local MY_RC_SERVICE local initscripts #read'em (all) echo "Currently configured Services:" for initscript in ${RC_INIT_BASE}/* do MY_RC_SERVICE=$(basename ${initscript}) unset ALL_RUNLEVELS unset level i x for i in $(seq 0 7) do if [ ${i} -eq 7 ] then level=sysinit else level=${i} fi for script in /etc/rc.d/rc${level}.d/* do x=$(basename ${script}) if [ "${x/???/}" == "${MY_RC_SERVICE}" ] then ALL_RUNLEVELS[${i}]=${x/${MY_RC_SERVICE}/} fi done done #show them (all) echo -n "${MY_RC_SERVICE}: " for i in $(seq 0 7) do if [ ${i} -eq 7 ] then level=sysinit else level=${i} fi if [ ! -z "${ALL_RUNLEVELS[${i}]}" ] then echo -n "[${level}:${ALL_RUNLEVELS[${i}]}] " fi done echo done fi } rc_service_show() { RC_SERVICE=$1 local ALL_RUNLEVELS #read'em (single) for i in $(seq 0 7) do if [ ${i} -eq 7 ] then level=sysinit else level=${i} fi for script in /etc/rc.d/rc${level}.d/* do x="$(basename ${script})" if [ "${x/???/}" == "${RC_SERVICE}" ] then ALL_RUNLEVELS[${i}]=${x/${RC_SERVICE}/} fi done done #show them (single) # echo "Currently configured Services:" echo -n "${RC_SERVICE}: " for i in $(seq 0 7) do if [ ! -z "${ALL_RUNLEVELS[${i}]}" ] then echo -n "[${i}:${ALL_RUNLEVELS[${i}]}] " fi done echo } check_not_excluded(){ local SCRIPT SCRIPT=$1 for i in ${RC_EXCLUDE} do if [ ${SCRIPT} == ${i} ] then return 1 fi 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 /etc/inittab|grep initdefault) #echo "$current" cp /etc/inittab /etc/inittab-orig sed -e "s/${current}/id:${newinitdef}:initdefault:/g" \ /etc/inittab-orig > /etc/inittab if [ "$?" == "0" ] then rm -f /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