[LARTC] [tcng] sysVinit script

raptor raptor@tvskat.net
Fri, 11 Oct 2002 11:12:08 -0400


hi below is sysvinit script for handling tcng-script .... please excuse my bad bash skils, correct me where i'm doing stupid things :")

what is left... many things, if i have time i will implement them too :

- start [devices] - and then correct handling of service lock files i.e. per device lock file
- stats blah ... - all ideas are welcome !!
- test  or some such, i mean the ability to use temprary config file and restore back original if something
goes wrong.. ideas?  Or something like last-good-known config/s

And u normaly start this on sysv system like this :

service tcng [command] [subcommands|devices]

Don't forget to set correct paths to "tc, tcc and tcng-config"....

PS. probably the script can be easly tweaked to work also as pure TC -service !! 

#===============sample output==================================
[root@qos tcng]# ./tcng 
*** Usage: 
	    tcng {start|stop|status|restart} [devices]
	    tcng show [all|qdisc|class|filter] [devices]


[root@qos tcng]# ./tcng stop
Stopping some/all tcng services: 
No traffic control running on : eth0
Flushing : eth1
No traffic control running on : hdlc0
No traffic control running on : hdlc1
No traffic control running on : pvc0
No traffic control running on : pvc1
[root@qos tcng]# ./tcng start
Starting tcng services: 
Execute :  qdisc add dev eth1 handle 1:0 root dsmark indices 4 default_index 0:
Execute :  qdisc add dev eth1 handle 2:0 parent 1:0 htb:
Execute :  class add dev eth1 parent 2:0 classid 2:1 htb rate 56000bps:
Execute :  class add dev eth1 parent 2:1 classid 2:2 htb rate 125bps ceil 2400bps:
..................................
[root@qos tcng]# ./tcng status 
traffic control on eth0: [OFF]
traffic control on eth1 : [ON]
traffic control on hdlc0: [OFF]
traffic control on hdlc1: [OFF]
traffic control on pvc0: [OFF]
traffic control on pvc1: [OFF]
[root@qos tcng]# ./tcng status eth1
traffic control on eth1 : [ON]
[root@qos tcng]# ./tcng show class eth1

class htb 2:1 root rate 56000bps ceil 56000bps burst 2159b cburst 2159b 
class htb 2:2 parent 2:1 prio 0 rate 125bps ceil 2400bps burst 1600b cburst 1623b 
class htb 2:3 parent 2:1 leaf 3: prio 0 rate 125bps ceil 4200bps burst 1600b cburst 1641b 

[root@qos tcng]# ./tcng show           
qdisc sfq 3: limit 128p quantum 1514b 
qdisc htb 2: r2q 10 default 0 direct_packets_stat 0
qdisc dsmark 1: indices 0x0004 default_index 0x0000 
class htb 2:1 root rate 56000bps ceil 56000bps burst 2159b cburst 2159b 
.......................
[root@qos tcng]# 

#==================THE SCRIPT====================
#!/bin/sh
#
# tcng:       Starts the tcng Server
#
# Version:      @(#) /etc/rc.d/init.d/tcng 0.1
#
# chkconfig: 2345 90 10
# description: Starts and stops the tcng at boot time and shutdown.
#
# processname: tcng
#
# created : from Raptor
#

#path to the tc command
tc=/sbin/tc
#path to the tcc command
tcc=/arh/bin/com.pl
#where is the tcng config file
tcngConf=/etc/sysconfig/tcng

offMsg=OFF
onMsg=ON
debug=1

# Source function library.
. /etc/rc.d/init.d/functions

isUp () {
    res=`$tc qdisc show dev $1`
    if [ -z "$res" ]; then return 1; fi
    return 0
}

start () {
    gprintf "Starting tcng services: "; echo
    OLDIFS="$IFS"
    IFS="
"
    cmds=`$tcc $tcngConf | grep -v "^#" | sed -e "s/^tc//"`
    for cmd in $cmds; do
        [ $debug -eq 1 ] && gprintf "Execute : $cmd:" && echo; 
        eval "$tc $cmd"
    done
    touch /var/lock/subsys/tcng
    IFS="$OLDIFS"
}


stop () {
    gprintf "Stopping some/all tcng services: "
    echo
    #if explictly specified shut only these devices
    if [ "$1" ]; then devs=$*; fi
#	echo $devs
    for d in $devs; do
        if isUp $d ; then 
    	    gprintf "Flushing : $d"; echo
    	    $tc qdisc del dev $d root
	else gprintf "No traffic control running on : $d"; echo
        fi
#    	    rm -f /var/lock/subsys/tcng-$d	    
    done	
    rm -f /var/lock/subsys/tcng;#this is not the correct behavior 	
}


status () {
    if [ "$1" ]; then devs=$*; fi	
#    echo $devs
    for d in $devs; do
        if isUp $d ; 
    	    then gprintf "traffic control on $d : [$onMsg]"; echo;
	    else gprintf "traffic control on $d: [$offMsg]"; echo;
	fi
    done		
}

show () {
    if [ -z "$1" ]; then what=all; else what=$1; fi
    shift
    if [ "$1" ]; then devs=$*; fi	
    for d in $devs; do
	if isUp $d; then
    	    [ "$what" = "all" ] || [ "$what" = "qdisc" ] && gprintf "`$tc qdisc show dev $d`"; echo    
    	    [ "$what" = "all" ] || [ "$what" = "class" ] && gprintf "`$tc class show dev $d`"; echo    	
    	    [ "$what" = "all" ] || [ "$what" = "filter" ] && gprintf "`$tc filter show dev $d`"; echo    	
	fi
    done
}


devs=`ifconfig -a | grep '^\w' | grep -v lo | cut -f 1 -d ' '`
command=$1
shift;

case "$command" in
  start) start ;;
  stop)	stop $@ ;;
  status) status $@ ;;
  show) show $@ ;;	
  restart)
	gprintf "Restarting tcng. "; echo
	stop $@
	start $@
	;;
  *)
	gprintf "*** Usage: 
	    tcng {start|stop|status|restart} [devices]
	    tcng show [all|qdisc|class|filter] [devices]
	"; echo
	exit 1
esac

exit 0