X-Git-Url: http://git.ipfire.org/?p=people%2Fpmueller%2Fipfire-2.x.git;a=blobdiff_plain;f=html%2Fcgi-bin%2Fqos.cgi;h=1beb9e3363f8de45f8bdc7cd85956b539a6f2ed5;hp=29e449ce804d943771dde689f6297b11fc868d22;hb=dd862e474183235317a5e795c20ff00d4fe2ddc9;hpb=649fd2958d715c838ef0fa28e93931327983cafd diff --git a/html/cgi-bin/qos.cgi b/html/cgi-bin/qos.cgi index 29e449ce80..1beb9e3363 100644 --- a/html/cgi-bin/qos.cgi +++ b/html/cgi-bin/qos.cgi @@ -1,25 +1,39 @@ #!/usr/bin/perl -# -# IPFire CGIs -# -# This code is distributed under the terms of the GPL -# -# (c) The IPFire Team -# +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2007 Michael Tremer & Christian Schmidt # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +############################################################################### +use RRDs; use strict; # enable only the following on debugging purpose -use warnings; -use CGI::Carp 'fatalsToBrowser'; +# use warnings; +# use CGI::Carp 'fatalsToBrowser'; require '/var/ipfire/general-functions.pl'; require "${General::swroot}/lang.pl"; require "${General::swroot}/header.pl"; +require "${General::swroot}/graphs.pl"; my %qossettings = (); my %checked = (); my %netsettings = (); -my $message = ""; +my $message = ''; my $errormessage = ""; my $c = ""; my $direntry = ""; @@ -27,26 +41,29 @@ my $classentry = ""; my $subclassentry = ""; my $l7ruleentry = ""; my $portruleentry = ""; +my $tosruleentry = ""; my @tmp = (); my @classes = (); my @subclasses = (); my @l7rules = (); my @portrules = (); +my @tosrules = (); my @tmpline = (); my @classline = (); my @subclassline = (); my @l7ruleline = (); my @portruleline = (); +my @tosruleline = (); my @proto = (); -my %selected= () ; +my %selected= (); +my @checked = (); my $classfile = "/var/ipfire/qos/classes"; my $subclassfile = "/var/ipfire/qos/subclasses"; my $level7file = "/var/ipfire/qos/level7config"; my $portfile = "/var/ipfire/qos/portconfig"; +my $tosfile = "/var/ipfire/qos/tosconfig"; &General::readhash("${General::swroot}/ethernet/settings", \%netsettings); -&Header::showhttpheaders(); - $qossettings{'ENABLED'} = 'off'; $qossettings{'EDIT'} = 'no'; $qossettings{'OUT_SPD'} = ''; @@ -66,6 +83,8 @@ $qossettings{'VALID'} = 'yes'; $qossettings{'ACTION'} = ''; $qossettings{'ACTIONDEF'} = ''; $qossettings{'ACTIONBW'} = ''; +$qossettings{'RED_DEV_SEL'} = ''; +$qossettings{'IMQ_DEV_SEL'} = ''; $qossettings{'PRIO'} = ''; $qossettings{'SPD'} = ''; $qossettings{'CLASS'} = ''; @@ -85,44 +104,33 @@ $qossettings{'DOCLASS'} = ''; $qossettings{'DOSCLASS'} = ''; $qossettings{'DOLEVEL7'} = ''; $qossettings{'DOPORT'} = ''; +$qossettings{'CLASS'} = ''; +$qossettings{'CLASSPRFX'} = ''; +$qossettings{'DEV'} = ''; +$qossettings{'TOS'} = ''; &General::readhash("${General::swroot}/qos/settings", \%qossettings); &Header::getcgihash(\%qossettings); -&Header::openpage('QoS', 1, ''); +my %color = (); +my %mainsettings = (); +&General::readhash("${General::swroot}/main/settings", \%mainsettings); +&General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color); -print < - - - -END -; +my @querry = split(/\?/,$ENV{'QUERY_STRING'}); +$querry[0] = '' unless defined $querry[0]; +$querry[1] = 'hour' unless defined $querry[1]; -&Header::openbigbox('100%', 'left', '', $errormessage); +if ( $querry[0] ne ""){ + print "Content-type: image/png\n\n"; + binmode(STDOUT); + &Graphs::updateqosgraph($querry[0],$querry[1]); +}else{ + &Header::showhttpheaders(); + + &Header::openpage('QoS', 1, ''); + &Header::openbigbox('100%', 'left', '', $errormessage); ############################################################################################################################ ############################################################################################################################ @@ -135,15 +143,15 @@ if ($qossettings{'DOCLASS'} eq $Lang::tr{'save'}) if ( $qossettings{'VALID'} eq 'yes' ) { open( FILE, ">> $classfile" ) or die "Unable to write $classfile"; print FILE <; @@ -161,6 +169,8 @@ elsif ($qossettings{'DOCLASS'} eq 'Bearbeiten') $qossettings{'MAXBWDTH'} = $classline[4]; $qossettings{'BURST'} = $classline[5]; $qossettings{'CBURST'} = $classline[6]; + $qossettings{'TOS'} = $classline[7]; + $qossettings{'REMARK'} = $classline[8]; $qossettings{'EDIT'} = 'yes'; } } @@ -170,7 +180,7 @@ elsif ($qossettings{'DOCLASS'} eq 'Bearbeiten') &Header::closepage(); exit } -elsif ($qossettings{'DOCLASS'} eq 'Loeschen') +elsif ($qossettings{'DOCLASS'} eq $Lang::tr{'delete'}) { open( FILE, "< $classfile" ) or die "Unable to read $classfile"; @tmp = ; @@ -198,7 +208,7 @@ elsif ($qossettings{'DOCLASS'} eq 'Loeschen') } } close FILE; - $message = "Klasse $qossettings{'CLASS'} wurde mit eventuell vorhandenen Unterklassen geloescht."; + $message = "$Lang::tr{'Class'} $qossettings{'CLASS'} $Lang::tr{'Class was deleted'}"; } ############################################################################################################################ @@ -206,24 +216,19 @@ elsif ($qossettings{'DOCLASS'} eq 'Loeschen') if ($qossettings{'DOSCLASS'} eq $Lang::tr{'save'}) { - if ($qossettings{'SCLASS'} >= 1000 && $qossettings{'CLASS'} < 1021) { - $qossettings{'DEVICE'} = $qossettings{'RED_DEV'}; - } elsif ($qossettings{'SCLASS'} >= 2000 && $qossettings{'CLASS'} < 2021) { - $qossettings{'DEVICE'} = $qossettings{'IMQ_DEV'}; - } &validsubclass(); &validminbwdth(); if ( $qossettings{'VALID'} eq 'yes' ) { open( FILE, ">> $subclassfile" ) or die "Unable to write $subclassfile"; print FILE <; @@ -238,7 +243,7 @@ END } } close FILE; - $message = "Unterklasse $qossettings{'CLASS'} wurde geloescht."; + $message = "$Lang::tr{'Subclass'} $qossettings{'CLASS'} $Lang::tr{'was deleted'}."; } ############################################################################################################################ @@ -247,15 +252,15 @@ END if ($qossettings{'DOLEVEL7'} eq $Lang::tr{'save'}) { if ( $qossettings{'QIP'} ne '' ) { - unless ( &General::validip($qossettings{'QIP'}) ) { + unless ( &General::validip($qossettings{'QIP'}) ) { $qossettings{'VALID'} = 'no'; - $message = "Die Quell-IP-Adresse ist ungueltig."; + $message = $Lang::tr{'The source IP address is invalid.'}; } } if ( $qossettings{'DIP'} ne '' ) { - unless ( &General::validip($qossettings{'DIP'}) ) { + unless ( &General::validip($qossettings{'DIP'}) ) { $qossettings{'VALID'} = 'no'; - $message = "Die Ziel-IP-Adresse ist ungueltig."; + $message = $Lang::tr{'The destination IP address is invalid.'}; } } if ($qossettings{'CLASS'} >= 100 && $qossettings{'CLASS'} < 121) { @@ -275,26 +280,46 @@ END ; close FILE; } else { - $qossettings{'ACTION'} = 'Level7-Regel hinzufuegen'; + $qossettings{'ACTION'} = $Lang::tr{'Add Level7 rule'}; } -} -elsif ($qossettings{'DOLEVEL7'} eq 'Loeschen') +} elsif ($qossettings{'DOLEVEL7'} eq $Lang::tr{'delete'}) { open( FILE, "< $level7file" ) or die "Unable to read $level7file"; @l7rules = ; close FILE; - open( FILE, "> $level7file" ) or die "Unable to read $level7file"; + system("rm $level7file"); foreach $l7ruleentry (sort @l7rules) { @l7ruleline = split( /\;/, $l7ruleentry ); - if ( ($l7ruleline[0] ne $qossettings{'CLASS'}) && ($l7ruleline[2] ne $qossettings{'L7PROT'})) - { - print FILE $l7ruleentry; - } - } + if ( ($l7ruleline[0] eq $qossettings{'CLASS'}) && ($l7ruleline[2] eq $qossettings{'L7PROT'})) + {$message = "$Lang::tr{'Level7 Rule'} ($qossettings{'CLASS'} - $qossettings{'L7PROT'}) $Lang::tr{'was deleted'}.";} + else + { open( FILE, ">> $level7file" ) or die "Unable to read $level7file"; + print FILE $l7ruleentry; + close FILE; + } + } + open( FILE, "< $level7file" ) or system("touch $level7file");close FILE; + } elsif ($qossettings{'DOLEVEL7'} eq $Lang::tr{'edit'}) +{ + open( FILE, "< $level7file" ) or die "Unable to read $level7file"; + @l7rules = ; close FILE; - $message = "Level7-Regel ($qossettings{'CLASS'} - $qossettings{'L7PROT'}) wurde geloescht."; -} + system("rm $level7file"); + foreach $l7ruleentry (sort @l7rules) + { + @l7ruleline = split( /\;/, $l7ruleentry ); + if ( ($l7ruleline[0] eq $qossettings{'CLASS'}) && ($l7ruleline[2] eq $qossettings{'L7PROT'})) + {$qossettings{'QIP'} = $l7ruleline[3];$qossettings{'DIP'} = $l7ruleline[4];} + else { + open( FILE, ">> $level7file" ) or die "Unable to write $level7file"; + print FILE $l7ruleentry; + close FILE; + } + } + &level7rule; + open( FILE, "< $level7file" ) or system("touch $level7file");close FILE; + } ############################################################################################################################ ############################################################################################################################ @@ -302,15 +327,15 @@ elsif ($qossettings{'DOLEVEL7'} eq 'Loeschen') if ($qossettings{'DOPORT'} eq $Lang::tr{'save'}) { if ( $qossettings{'QIP'} ne '' ) { - unless ( &General::validip($qossettings{'QIP'}) ) { + unless ( &General::validip($qossettings{'QIP'}) ) { $qossettings{'VALID'} = 'no'; - $message = "Die Quell-IP-Adresse ist ungueltig."; + $message = "$Lang::tr{'The source IP address is invalid.'}"; } } if ( $qossettings{'DIP'} ne '' ) { - unless ( &General::validip($qossettings{'DIP'}) ) { + unless ( &General::validip($qossettings{'DIP'}) ) { $qossettings{'VALID'} = 'no'; - $message = "Die Ziel-IP-Adresse ist ungueltig."; + $message = "$Lang::tr{'The destination IP address is invalid.'}"; } } if ($qossettings{'CLASS'} >= 100 && $qossettings{'CLASS'} < 121) { @@ -330,9 +355,9 @@ END ; close FILE; } else { - $qossettings{'ACTION'} = 'Port-Regel hinzufuegen'; + $qossettings{'ACTION'} = $Lang::tr{'Add Port Rule'}; } -} elsif ($qossettings{'DOPORT'} eq 'Loeschen') +} elsif ($qossettings{'DOPORT'} eq $Lang::tr{'delete'}) { open( FILE, "< $portfile" ) or die "Unable to read $portfile"; @portrules = ; @@ -347,30 +372,118 @@ END } } close FILE; - $message = "Port-Regel ($qossettings{'CLASS'} - $qossettings{'PPROT'}) wurde geloescht."; + $message = "$Lang::tr{'Port Rule'} ($qossettings{'CLASS'} - $qossettings{'PPROT'}) $Lang::tr{'was deleted'}."; +} elsif ($qossettings{'DOPORT'} eq $Lang::tr{'edit'}) +{ + open( FILE, "< $portfile" ) or die "Unable to read $portfile"; + @portrules = ; + close FILE; + system("rm $portfile"); + foreach $portruleentry (sort @portrules) + { + @portruleline = split( /\;/, $portruleentry ); + if ( ($portruleline[0] eq $qossettings{'CLASS'}) && ($portruleline[2] eq $qossettings{'PPROT'}) && ($portruleline[3] eq $qossettings{'QIP'}) && ($portruleline[4] eq $qossettings{'QPORT'}) && ($portruleline[5] eq $qossettings{'DIP'}) && ($portruleline[6] eq $qossettings{'DPORT'})) + {$qossettings{'CLASS'}=$portruleline[0];$qossettings{'PPROT'}=$portruleline[2];$qossettings{'QIP'}=$portruleline[3];$qossettings{'QPORT'}=$portruleline[4];$qossettings{'DIP'}=$portruleline[5];$qossettings{'DPORT'}=$portruleline[6];} + else { + open( FILE, ">> $portfile" ) or die "Unable to write $portfile"; + print FILE $portruleentry; + close FILE; + } + } + &portrule; + open( FILE, "< $portfile" ) or system("touch $portfile");close FILE; + } + +############################################################################################################################ +############################################################################################################################ + +if ($qossettings{'DOTOS'} eq $Lang::tr{'save'}) +{ + if ($qossettings{'CLASS'} >= 100 && $qossettings{'CLASS'} < 121) { + $qossettings{'DEVICE'} = $qossettings{'RED_DEV'}; + } elsif ($qossettings{'CLASS'} >= 1000 && $qossettings{'CLASS'} < 1021) { + $qossettings{'DEVICE'} = $qossettings{'RED_DEV'}; + } elsif ($qossettings{'CLASS'} >= 200 && $qossettings{'CLASS'} < 221) { + $qossettings{'DEVICE'} = $qossettings{'IMQ_DEV'}; + } elsif ($qossettings{'CLASS'} >= 2000 && $qossettings{'CLASS'} < 2021) { + $qossettings{'DEVICE'} = $qossettings{'IMQ_DEV'}; + } + open( FILE, ">> $tosfile" ) or die "Unable to write $tosfile"; + print FILE <; + close FILE; + open( FILE, "> $tosfile" ) or die "Unable to read $tosfile"; + foreach $tosruleentry (sort @tosrules) + { + @tosruleline = split( /\;/, $tosruleentry ); + unless ( ($tosruleline[0] eq $qossettings{'CLASS'}) && ($tosruleline[2] eq $qossettings{'TOS'})) + { + print FILE $tosruleentry; + } + } + close FILE; + $message = "$Lang::tr{'TOS Rule'} ($qossettings{'CLASS'} - $qossettings{'TOS'}) $Lang::tr{'was deleted'}."; +} elsif ($qossettings{'DOTOS'} eq $Lang::tr{'edit'}) +{ + open( FILE, "< $tosfile" ) or die "Unable to read $tosfile"; + @tosrules = ; + close FILE; + open( FILE, "> $tosfile" ) or die "Unable to write $tosfile"; + foreach $tosruleentry (sort @tosrules) + { + @tosruleline = split( /\;/, $tosruleentry ); + if (( $tosruleline[0] eq $qossettings{'CLASS'} ) && ( $tosruleline[2] eq $qossettings{'TOS'} )) { + $qossettings{'DEVICE'} = $tosruleline[1]; + $qossettings{'CLASS'} = $tosruleline[0]; + $qossettings{'TOS'} = $tosruleline[2]; + $qossettings{'EDIT'} = 'yes'; + } else { + print FILE $tosruleentry; + } + } + close FILE; + &tosrule(); + &Header::closebigbox(); + &Header::closepage(); + exit } ############################################################################################################################ ############################################################################################################################ -if ($qossettings{'ACTION'} eq 'Start') +if ($qossettings{'ACTION'} eq $Lang::tr{'start'}) { - system("sleep 2 && /usr/bin/perl /var/ipfire/qos/bin/makeqosscripts.pl > /var/ipfire/qos/bin/qos.sh &"); - system("/bin/touch /var/ipfire/qos/enable"); $qossettings{'ENABLED'} = 'on'; &General::writehash("${General::swroot}/qos/settings", \%qossettings); + system("/usr/local/bin/qosctrl generate >/dev/null 2>&1"); + system("/usr/bin/touch /var/ipfire/qos/enable"); + system("/usr/local/bin/qosctrl start >/dev/null 2>&1"); + system("logger -t ipfire 'QoS started'"); } -elsif ($qossettings{'ACTION'} eq 'Stop') +elsif ($qossettings{'ACTION'} eq $Lang::tr{'stop'}) { + system("/usr/local/bin/qosctrl stop >/dev/null 2>&1"); unlink "/var/ipfire/qos/bin/qos.sh"; unlink "/var/ipfire/qos/enable"; + system("logger -t ipfire 'QoS stopped'"); $qossettings{'ENABLED'} = 'off'; &General::writehash("${General::swroot}/qos/settings", \%qossettings); } -elsif ($qossettings{'ACTION'} eq 'Neustart') +elsif ($qossettings{'ACTION'} eq $Lang::tr{'restart'}) { if ($qossettings{'ENABLED'} eq 'on'){ - system("sleep 2 && /usr/bin/perl /var/ipfire/qos/bin/makeqosscripts.pl > /var/ipfire/qos/bin/qos.sh &"); + system("/usr/local/bin/qosctrl stop >/dev/null 2>&1"); + system("/usr/local/bin/qosctrl generate >/dev/null 2>&1"); + system("/usr/local/bin/qosctrl start >/dev/null 2>&1"); + system("logger -t ipfire 'QoS restarted'"); } } elsif ($qossettings{'ACTION'} eq $Lang::tr{'save'}) @@ -383,49 +496,182 @@ elsif ($qossettings{'ACTION'} eq $Lang::tr{'save'}) } &General::writehash("${General::swroot}/qos/settings", \%qossettings); } -elsif ($qossettings{'ACTION'} eq 'Parentklasse hinzufuegen') +elsif ($qossettings{'ACTION'} eq $Lang::tr{'template'} ) { - &parentclass(); + my @UP; + #print "UP
"; + for(my $i = 1; $i <= 10; $i++) { + $UP[$i] = int($qossettings{'OUT_SPD'} / $i ); + #print $i."=".$UP[$i]." "; + } + my @DOWN; + #print "

Down
"; + for(my $i = 1; $i <= 20; $i++) { + $DOWN[$i] = int($qossettings{'INC_SPD'} / $i); + #print $i."=".$DOWN[$i]." "; + } + open( FILE, "> $classfile" ) or die "Unable to write $classfile"; + print FILE < $level7file" ) or die "Unable to write $level7file"; + print FILE < $portfile" ) or die "Unable to write $portfile"; + print FILE </dev/null 2>&1"); + system("/usr/bin/touch /var/ipfire/qos/enable"); + system("/usr/local/bin/qosctrl start >/dev/null 2>&1"); + system("logger -t ipfire 'QoS started'"); +} +elsif ($qossettings{'ACTION'} eq $Lang::tr{'status'} ) +{ + &Header::openbox('100%', 'left', 'QoS Status'); + if ($qossettings{'ENABLED'} eq 'on'){ + my $output = ""; + $output = `/usr/local/bin/qosctrl status`; + $output = &Header::cleanhtml($output,"y"); + print "
$output
\n"; + } else { print "$Lang::tr{'QoS not enabled'}"; } + &Header::closebox(); &Header::closebigbox(); &Header::closepage(); exit } -elsif ($qossettings{'ACTION'} eq 'Unterklasse hinzufuegen') +elsif ($qossettings{'ACTION'} eq $Lang::tr{'parentclass add'} ) { - &subclass(); + &parentclass(); &Header::closebigbox(); &Header::closepage(); exit } -elsif ($qossettings{'ACTION'} eq 'Level7-Regel hinzufuegen') +elsif ($qossettings{'ACTION'} eq $Lang::tr{'qos add subclass'}) { - &level7rule(); + &subclass(); &Header::closebigbox(); &Header::closepage(); exit } -elsif ($qossettings{'ACTION'} eq 'Port-Regel hinzufuegen') +elsif ($qossettings{'ACTION'} eq $Lang::tr{'Add Rule'}) { - &portrule(); + &Header::openbox('100%', 'center', $Lang::tr{'Add Rule'}); + print < + $Lang::tr{'Choose Rule'} + + + + + +END +; + &Header::closebox(); + print <