From: ms Date: Wed, 5 Jul 2006 21:22:59 +0000 (+0000) Subject: Hinzugefügt: X-Git-Tag: v2.3-beta1~1057 X-Git-Url: http://git.ipfire.org/?p=ipfire-2.x.git;a=commitdiff_plain;h=84cab4735929d6c6b6885fb4128df789dcf67253 Hinzugefügt: * Fehlende Grafik. * QoS-Script, das aus den Einstellungen ein Bashscript generiert. Geändert: * QoS-CGI-Update. git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@197 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- diff --git a/config/qos/makeqosscripts.pl b/config/qos/makeqosscripts.pl new file mode 100644 index 0000000000..e7546527db --- /dev/null +++ b/config/qos/makeqosscripts.pl @@ -0,0 +1,547 @@ +#!/usr/bin/perl +# +# IPFire Scripts +# +# This code is distributed under the terms of the GPL +# +# (c) The IPFire Team +# + +use strict; +# enable only the following on debugging purpose +use warnings; + +require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl"; + +my %qossettings = (); +my %checked = (); +my %netsettings = (); +my $message = ""; +my $errormessage = ""; +my $c = ""; +my $direntry = ""; +my $classentry = ""; +my $subclassentry = ""; +my $l7ruleentry = ""; +my $portruleentry = ""; +my @tmp = (); +my @classes = (); +my @subclasses = (); +my @l7rules = (); +my @portrules = (); +my @tmpline = (); +my @classline = (); +my @subclassline = (); +my @l7ruleline = (); +my @portruleline = (); +my @proto = (); +my %selected= () ; +my $classfile = "/var/ipfire/qos/classes"; +my $subclassfile = "/var/ipfire/qos/subclasses"; +my $level7file = "/var/ipfire/qos/level7config"; +my $portfile = "/var/ipfire/qos/portconfig"; + +&General::readhash("${General::swroot}/ethernet/settings", \%netsettings); + +$qossettings{'ENABLED'} = 'off'; +$qossettings{'EDIT'} = 'no'; +$qossettings{'OUT_SPD'} = ''; +$qossettings{'INC_SPD'} = ''; +$qossettings{'DEF_OUT_SPD'} = ''; +$qossettings{'DEF_INC_SPD'} = ''; +$qossettings{'DEFCLASS_INC'} = ''; +$qossettings{'DEFCLASS_OUT'} = ''; +$qossettings{'ACK'} = ''; +$qossettings{'MTU'} = '1492'; +$qossettings{'RED_DEV'} = `cat /var/ipfire/red/iface`; +$qossettings{'IMQ_DEV'} = 'imq0'; +$qossettings{'VALID'} = 'yes'; + +&General::readhash("${General::swroot}/qos/settings", \%qossettings); + +open( FILE, "< $classfile" ) or die "Unable to read $classfile"; +@classes = ; +close FILE; +open( FILE, "< $subclassfile" ) or die "Unable to read $subclassfile"; +@subclasses = ; +close FILE; +open( FILE, "< $level7file" ) or die "Unable to read $level7file"; +@l7rules = ; +close FILE; +open( FILE, "< $portfile" ) or die "Unable to read $portfile"; +@portrules = ; +close FILE; + +############################################################################################################################ +############################################################################################################################ + +print < /dev/null + iptables -t mangle -L QOS-INC -v -x 2> /dev/null + exit 0 + ;; + start) + ### FIRST CLEAR EVERYTHING + \$0 clear + + ### + ### $qossettings{'RED_DEV'} + ### + + ### INIT KERNEL + modprobe sch_htb + + ### SET QUEUE LENGTH & MTU - has just to be tested!!! IMPORTANT + ip link set dev $qossettings{'RED_DEV'} qlen $qossettings{'QLENGTH'} + ip link set dev $qossettings{'RED_DEV'} mtu $qossettings{'MTU'} + + ### ADD HTB QDISC FOR $qossettings{'RED_DEV'} + tc qdisc add dev $qossettings{'RED_DEV'} root handle 1: htb default $qossettings{'DEFCLASS_OUT'} + + ### MAIN RATE LIMIT + tc class add dev $qossettings{'RED_DEV'} parent 1: classid 1:1 htb rate $qossettings{'OUT_SPD'}kbit + + ### CLASSES FOR $qossettings{'RED_DEV'} +END +; +foreach $classentry (sort @classes) +{ + @classline = split( /\;/, $classentry ); + if ($qossettings{'RED_DEV'} eq $classline[0]) { + $qossettings{'DEVICE'} = $classline[0]; + $qossettings{'CLASS'} = $classline[1]; + $qossettings{'PRIO'} = $classline[2]; + $qossettings{'RATE'} = $classline[3]; + $qossettings{'CEIL'} = $classline[4]; + $qossettings{'BURST'} = $classline[5]; + $qossettings{'CBURST'} = $classline[6]; + print "\ttc class add dev $qossettings{'DEVICE'} parent 1:1 classid 1:$qossettings{'CLASS'} htb rate $qossettings{'RATE'}kbit ceil $qossettings{'CEIL'}kbit prio $qossettings{'PRIO'} "; + if ($qossettings{'BURST'} > 0) { + print "burst $qossettings{'BURST'}k "; + } + if (($qossettings{'CBURST'} ne '') || ($qossettings{'CBURST'} ne 0)) { + print "cburst $qossettings{'CBURST'}k"; + } + print "\n"; + } +} +foreach $subclassentry (sort @subclasses) { + @subclassline = split( /\;/, $subclassentry ); + $qossettings{'DEVICE'} = $subclassline[0]; + $qossettings{'CLASS'} = $subclassline[1]; + $qossettings{'SCLASS'} = $subclassline[2]; + $qossettings{'SPRIO'} = $subclassline[3]; + $qossettings{'SRATE'} = $subclassline[4]; + $qossettings{'SCEIL'} = $subclassline[5]; + $qossettings{'SBURST'} = $subclassline[6]; + $qossettings{'SCBURST'} = $subclassline[7]; + print "\ttc class add dev $qossettings{'DEVICE'} parent 1:$qossettings{'CLASS'} classid 1:$qossettings{'SCLASS'} htb rate $qossettings{'SRATE'}kbit ceil $qossettings{'SCEIL'}kbit prio $qossettings{'SPRIO'} "; + if ($qossettings{'SBURST'} > 0) { + print "burst $qossettings{'SBURST'}k "; + } + if (($qossettings{'SCBURST'} ne '') || ($qossettings{'SCBURST'} ne 0)) { + print "cburst $qossettings{'CBURST'}k"; + } + print "\n"; +} + +print "\n\t### ATTACH QDISC TO LEAF CLASSES\n"; +foreach $classentry (sort @classes) +{ + @classline = split( /\;/, $classentry ); + if ($qossettings{'RED_DEV'} eq $classline[0]) { + $qossettings{'DEVICE'} = $classline[0]; + $qossettings{'CLASS'} = $classline[1]; + print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 1:$qossettings{'CLASS'} handle $qossettings{'CLASS'}: sfq perturb $qossettings{'SFQ_PERTUB'}\n"; + } +} +foreach $subclassentry (sort @subclasses) { + @subclassline = split( /\;/, $subclassentry ); + if ($qossettings{'RED_DEV'} eq $subclassline[0]) { + $qossettings{'DEVICE'} = $subclassline[0]; + $qossettings{'SCLASS'} = $subclassline[2]; + print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 1:$qossettings{'SCLASS'} handle $qossettings{'SCLASS'}: sfq perturb $qossettings{'SFQ_PERTUB'}\n"; + } +} +print "\n\t### FILTER TRAFFIC INTO CLASSES\n"; +foreach $classentry (sort @classes) +{ + @classline = split( /\;/, $classentry ); + if ($qossettings{'RED_DEV'} eq $classline[0]) { + $qossettings{'DEVICE'} = $classline[0]; + $qossettings{'CLASS'} = $classline[1]; + print "\ttc filter add dev $qossettings{'DEVICE'} parent 1:0 prio 0 protocol ip handle $qossettings{'CLASS'} fw flowid 1:$qossettings{'CLASS'}\n"; + } +} +foreach $subclassentry (sort @subclasses) { + @subclassline = split( /\;/, $subclassentry ); + if ($qossettings{'RED_DEV'} eq $subclassline[0]) { + $qossettings{'DEVICE'} = $subclassline[0]; + $qossettings{'CLASS'} = $subclassline[1]; + $qossettings{'SCLASS'} = $subclassline[2]; + print "\ttc filter add dev $qossettings{'DEVICE'} parent 1:$qossettings{'CLASS'} prio 0 protocol ip handle $qossettings{'SCLASS'} fw flowid 1:$qossettings{'SCLASS'}\n"; + } +} +print < 0) { + print "burst $qossettings{'BURST'}k "; + } + if (($qossettings{'CBURST'} ne '') || ($qossettings{'CBURST'} ne 0)) { + print "cburst $qossettings{'CBURST'}k"; + } + print "\n"; + } +} +foreach $subclassentry (sort @subclasses) { + @subclassline = split( /\;/, $subclassentry ); + if ($qossettings{'IMQ_DEV'} eq $subclassline[0]) { + $qossettings{'DEVICE'} = $subclassline[0]; + $qossettings{'CLASS'} = $subclassline[1]; + $qossettings{'SCLASS'} = $subclassline[2]; + $qossettings{'SPRIO'} = $subclassline[3]; + $qossettings{'SRATE'} = $subclassline[4]; + $qossettings{'SCEIL'} = $subclassline[5]; + $qossettings{'SBURST'} = $subclassline[6]; + $qossettings{'SCBURST'} = $subclassline[7]; + print "\ttc class add dev $qossettings{'DEVICE'} parent 2:$qossettings{'CLASS'} classid 2:$qossettings{'SCLASS'} htb rate $qossettings{'SRATE'}kbit ceil $qossettings{'SCEIL'}kbit prio $qossettings{'SPRIO'} "; + if ($qossettings{'SBURST'} > 0) { + print "burst $qossettings{'SBURST'}k "; + } + if (($qossettings{'SCBURST'} ne '') || ($qossettings{'SCBURST'} ne 0)) { + print "cburst $qossettings{'CBURST'}k"; + } + print "\n"; + } +} + +print "\n\t### ATTACH QDISC TO LEAF CLASSES\n"; +foreach $classentry (sort @classes) +{ + @classline = split( /\;/, $classentry ); + if ($qossettings{'IMQ_DEV'} eq $classline[0]) { + $qossettings{'DEVICE'} = $classline[0]; + $qossettings{'CLASS'} = $classline[1]; + print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 2:$qossettings{'CLASS'} handle $qossettings{'CLASS'}: sfq perturb $qossettings{'SFQ_PERTUB'}\n"; + } +} +foreach $subclassentry (sort @subclasses) { + @subclassline = split( /\;/, $subclassentry ); + if ($qossettings{'IMQ_DEV'} eq $subclassline[0]) { + $qossettings{'DEVICE'} = $subclassline[0]; + $qossettings{'SCLASS'} = $subclassline[2]; + print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 2:$qossettings{'SCLASS'} handle $qossettings{'SCLASS'}: sfq perturb $qossettings{'SFQ_PERTUB'}\n"; + } +} +print "\n\t### FILTER TRAFFIC INTO CLASSES\n"; +foreach $classentry (sort @classes) +{ + @classline = split( /\;/, $classentry ); + if ($qossettings{'IMQ_DEV'} eq $classline[0]) { + $qossettings{'DEVICE'} = $classline[0]; + $qossettings{'CLASS'} = $classline[1]; + print "\ttc filter add dev $qossettings{'DEVICE'} parent 2:0 prio 0 protocol ip handle $qossettings{'CLASS'} fw flowid 2:$qossettings{'CLASS'}\n"; + } +} +foreach $subclassentry (sort @subclasses) { + @subclassline = split( /\;/, $subclassentry ); + if ($qossettings{'IMQ_DEV'} eq $subclassline[0]) { + $qossettings{'DEVICE'} = $subclassline[0]; + $qossettings{'CLASS'} = $subclassline[1]; + $qossettings{'SCLASS'} = $subclassline[2]; + print "\ttc filter add dev $qossettings{'DEVICE'} parent 2:$qossettings{'CLASS'} prio 0 protocol ip handle $qossettings{'SCLASS'} fw flowid 2:$qossettings{'SCLASS'}\n"; + } +} +print < /dev/null + tc qdisc del dev $qossettings{'IMQ_DEV'} root &> /dev/null + # REMOVE & FLUSH CHAINS + iptables -t mangle -D POSTROURING -o $qossettings{'RED_DEV'} -j QOS-OUT &> /dev/null + iptables -t mangle -F QOS-OUT &> /dev/null + iptables -t mangle -X QOS-OUT &> /dev/null + iptables -t mangle -D POSTROURING -o $qossettings{'IMQ_DEV'} -j QOS-INC &> /dev/null + iptables -t mangle -F QOS-INC &> /dev/null + iptables -t mangle -X QOS-INC &> /dev/null + # STOP IMQ-DEVICE + ip link set $qossettings{'IMQ_DEV'} down &> /dev/null + rmmod imq &> /dev/null + rmmod sch_htb &> /dev/null + echo "Quality of Service was successfully cleared!" + ;; +esac +### EOF +END +; + +############################################################################################################################ +############################################################################################################################ + diff --git a/html/cgi-bin/qos.cgi b/html/cgi-bin/qos.cgi index 53390ac3e4..06b397314a 100644 --- a/html/cgi-bin/qos.cgi +++ b/html/cgi-bin/qos.cgi @@ -26,19 +26,23 @@ my $direntry = ""; my $classentry = ""; my $subclassentry = ""; my $l7ruleentry = ""; +my $portruleentry = ""; my @tmp = (); my @classes = (); my @subclasses = (); my @l7rules = (); +my @portrules = (); my @tmpline = (); my @classline = (); my @subclassline = (); my @l7ruleline = (); +my @portruleline = (); my @proto = (); my %selected= () ; my $classfile = "/var/ipfire/qos/classes"; my $subclassfile = "/var/ipfire/qos/subclasses"; my $level7file = "/var/ipfire/qos/level7config"; +my $portfile = "/var/ipfire/qos/portconfig"; &General::readhash("${General::swroot}/ethernet/settings", \%netsettings); &Header::showhttpheaders(); @@ -47,17 +51,46 @@ $qossettings{'ENABLED'} = 'off'; $qossettings{'EDIT'} = 'no'; $qossettings{'OUT_SPD'} = ''; $qossettings{'INC_SPD'} = ''; +$qossettings{'DEF_OUT_SPD'} = ''; +$qossettings{'DEF_INC_SPD'} = ''; $qossettings{'DEFCLASS_INC'} = ''; $qossettings{'DEFCLASS_OUT'} = ''; $qossettings{'ACK'} = ''; +$qossettings{'MTU'} = '1492'; +$qossettings{'QLENGTH'} = '30'; $qossettings{'RED_DEV'} = `cat /var/ipfire/red/iface`; $qossettings{'IMQ_DEV'} = 'imq0'; $qossettings{'VALID'} = 'yes'; +### Values that have to be initialized +$qossettings{'ACTION'} = ''; +$qossettings{'ACTIONDEF'} = ''; +$qossettings{'ACTIONBW'} = ''; +$qossettings{'PRIO'} = ''; +$qossettings{'SPD'} = ''; +$qossettings{'CLASS'} = ''; +$qossettings{'SCLASS'} = ''; +$qossettings{'QPORT'} = ''; +$qossettings{'DPORT'} = ''; +$qossettings{'QIP'} = ''; +$qossettings{'DIP'} = ''; +$qossettings{'PPROT'} = ''; +$qossettings{'L7PROT'} = ''; +$qossettings{'DEVICE'} = ''; +$qossettings{'MINBWDTH'} = ''; +$qossettings{'MAXBWDTH'} = ''; +$qossettings{'BURST'} = ''; +$qossettings{'CBURST'} = ''; +$qossettings{'DOCLASS'} = ''; +$qossettings{'DOSCLASS'} = ''; +$qossettings{'DOLEVEL7'} = ''; +$qossettings{'DOPORT'} = ''; + &General::readhash("${General::swroot}/qos/settings", \%qossettings); &Header::getcgihash(\%qossettings); &Header::openpage('QoS', 1, ''); + print <