From 0b1641db6dbd3ecfd0766aba93ba080ac07a6376 Mon Sep 17 00:00:00 2001 From: maniacikarus Date: Sat, 28 Jul 2007 17:03:50 +0000 Subject: [PATCH] Qosgraphen in das Standardschema gepackt Qosgraph CGI komplett neu Qos CGI multilingual (ich hoffe das geht ueberhaupt noch was :D ) git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@724 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- config/cfgroot/graphs.pl | 68 ++++++++ config/rootfiles/common/apache2 | 1 + doc/language_issues.de | 2 - doc/language_issues.en | 2 - html/cgi-bin/qos.cgi | 270 +++++++++++++------------------- html/cgi-bin/qosgraph.cgi | 80 ++++++++++ langs/de/cgi-bin/de.pl | 41 +++++ langs/en/cgi-bin/en.pl | 41 +++++ 8 files changed, 343 insertions(+), 162 deletions(-) create mode 100644 html/cgi-bin/qosgraph.cgi diff --git a/config/cfgroot/graphs.pl b/config/cfgroot/graphs.pl index 3390811157..82b8d1dfca 100644 --- a/config/cfgroot/graphs.pl +++ b/config/cfgroot/graphs.pl @@ -1,6 +1,8 @@ +#!/usr/bin/perl # Generate Graphs exported from Makegraphs to minimize system load an only generate the Graphs when displayed # This is part of the IPFire Firewall + package Graphs; use strict; @@ -502,3 +504,69 @@ sub updatevoltgraph $ERROR = RRDs::error; print("Error in RRD::graph for temp: $ERROR\n")if $ERROR; } + +sub overviewgraph { + + my $period = $_[0]; + my $periodstring; + my $description; + my %qossettings = (); + &General::readhash("${General::swroot}/qos/settings", \%qossettings); + my $classentry = ""; + my @classes = (); + my @classline = (); + my $classfile = "/var/ipfire/qos/classes"; + + $qossettings{'DEV'} = $_[1]; + if ( $qossettings{'DEV'} eq $qossettings{'RED_DEV'} ) { + $qossettings{'CLASSPRFX'} = '1'; + } else { + $qossettings{'CLASSPRFX'} = '2'; + } + + if ( $period ne '3240' ){ $periodstring = "-1$period";}else{ $periodstring = "-".$period;} + if ( $period ne '3240' ){ $description = "-t $Lang::tr{'Utilization on'} ($qossettings{'DEV'}) ($Lang::tr{'graph per'} $Lang::tr{$period})";}else{ $description = "-t $Lang::tr{'Utilization on'} ($qossettings{'DEV'})";} + + my $ERROR=""; + my $count="1"; + my $color="#000000"; + my @command=("/srv/web/ipfire/html/graphs/qos-graph-$qossettings{'DEV'}-$period.png", + "--start", $periodstring, "-aPNG", "-i", "-z", + "--alt-y-grid", "-w 600", "-h 150", "-r", + "--color", "SHADEA".$color{"color19"}, + "--color", "SHADEB".$color{"color19"}, + "--color", "BACK".$color{"color21"}, + $description + ); + open( FILE, "< $classfile" ) or die "Unable to read $classfile"; + @classes = ; + close FILE; + foreach $classentry (sort @classes) + { + @classline = split( /\;/, $classentry ); + if ( $classline[0] eq $qossettings{'DEV'} ) + { + $color=random_hex_color(6); + push(@command, "DEF:$classline[1]=/var/log/rrd/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bits:AVERAGE"); + + if ($count eq "1") { + push(@command, "AREA:$classline[1]$color:Klasse $classline[1] - $classline[8]\\j"); + } else { + push(@command, "STACK:$classline[1]$color:Klasse $classline[1] - $classline[8]\\j"); + } + $count++; + } + } + RRDs::graph (@command); + $ERROR = RRDs::error; + print "$ERROR"; +} + +sub random_hex_color { + my $size = shift; + $size = 6 if $size !~ /^3|6$/; + my @hex = ( 0 .. 9, 'a' .. 'f' ); + my @color; + push @color, @hex[rand(@hex)] for 1 .. $size; + return join('', '#', @color); +} diff --git a/config/rootfiles/common/apache2 b/config/rootfiles/common/apache2 index f2a534152b..04fa07b348 100644 --- a/config/rootfiles/common/apache2 +++ b/config/rootfiles/common/apache2 @@ -1309,6 +1309,7 @@ srv/web/ipfire/cgi-bin/pppsetup.cgi srv/web/ipfire/cgi-bin/proxy.cgi srv/web/ipfire/cgi-bin/proxygraphs.cgi srv/web/ipfire/cgi-bin/qos.cgi +srv/web/ipfire/cgi-bin/qosgraph.cgi srv/web/ipfire/cgi-bin/remote.cgi srv/web/ipfire/cgi-bin/services.cgi srv/web/ipfire/cgi-bin/speed.cgi diff --git a/doc/language_issues.de b/doc/language_issues.de index 843fd288ba..02415de62d 100644 --- a/doc/language_issues.de +++ b/doc/language_issues.de @@ -100,7 +100,6 @@ WARNING: translation string unused: disconnect WARNING: translation string unused: display traffic at home WARNING: translation string unused: dns server WARNING: translation string unused: do not log this port list -WARNING: translation string unused: downlink speed WARNING: translation string unused: dynamic dns client WARNING: translation string unused: eciadsl help WARNING: translation string unused: eciadsl upload @@ -335,7 +334,6 @@ WARNING: translation string unused: update transcript WARNING: translation string unused: updates WARNING: translation string unused: updates is old1 WARNING: translation string unused: updates is old2 -WARNING: translation string unused: uplink speed WARNING: translation string unused: upload file WARNING: translation string unused: upload static key WARNING: translation string unused: upload successful diff --git a/doc/language_issues.en b/doc/language_issues.en index 5eb881c326..8d21491335 100644 --- a/doc/language_issues.en +++ b/doc/language_issues.en @@ -124,7 +124,6 @@ WARNING: translation string unused: display traffic at home WARNING: translation string unused: dns server WARNING: translation string unused: do not log this port list WARNING: translation string unused: done -WARNING: translation string unused: downlink speed WARNING: translation string unused: dynamic dns client WARNING: translation string unused: eciadsl help WARNING: translation string unused: eciadsl upload @@ -367,7 +366,6 @@ WARNING: translation string unused: update transcript WARNING: translation string unused: updates WARNING: translation string unused: updates is old1 WARNING: translation string unused: updates is old2 -WARNING: translation string unused: uplink speed WARNING: translation string unused: upload fcdsl.o WARNING: translation string unused: upload file WARNING: translation string unused: upload static key diff --git a/html/cgi-bin/qos.cgi b/html/cgi-bin/qos.cgi index 5e600ed569..396f88195f 100644 --- a/html/cgi-bin/qos.cgi +++ b/html/cgi-bin/qos.cgi @@ -16,6 +16,7 @@ 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 = (); @@ -186,7 +187,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'}"; } ############################################################################################################################ @@ -221,7 +222,7 @@ END } } close FILE; - $message = "Unterklasse $qossettings{'CLASS'} wurde geloescht."; + $message = "$Lang::tr{'Subclass'} $qossettings{'CLASS'} $Lang::tr{'was deleted'}."; } ############################################################################################################################ @@ -350,7 +351,7 @@ 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 'Bearbeiten') { open( FILE, "< $portfile" ) or die "Unable to read $portfile"; @@ -408,7 +409,7 @@ elsif ($qossettings{'DOTOS'} eq 'Loeschen') } } close FILE; - $message = "TOS-Regel ($qossettings{'CLASS'} - $qossettings{'TOS'}) wurde geloescht."; + $message = "$Lang::tr{'TOS Rule'} ($qossettings{'CLASS'} - $qossettings{'TOS'}) $Lang::tr{'was deleted'}."; } elsif ($qossettings{'DOTOS'} eq 'Bearbeiten') { open( FILE, "< $tosfile" ) or die "Unable to read $tosfile"; @@ -482,7 +483,7 @@ elsif ($qossettings{'ACTION'} eq 'Statusinformationen') $output = `/usr/local/bin/qosctrl status`; $output = &Header::cleanhtml($output,"y"); print "
$output
\n"; - } else { print "QoS ist nicht aktiviert!"; } + } else { print "$Lang::tr{'QoS not enabled'}"; } &Header::closebox(); &Header::closebigbox(); &Header::closepage(); @@ -504,10 +505,10 @@ elsif ($qossettings{'ACTION'} eq 'Unterklasse hinzufuegen') } elsif ($qossettings{'ACTION'} eq 'Regel hinzufuegen') { - &Header::openbox('100%', 'center', 'Regel hinzufuegen'); + &Header::openbox('100%', 'center', $Lang::tr{'Add Rule'}); print < - Waehlen sie eine der untenstehenden Regeln aus. + $Lang::tr{'Choose Rule'} @@ -610,9 +611,9 @@ END
  -
Downloadgeschwindigkeit: $qossettings{'INC_SPD'} kbps +
$Lang::tr{'downlink speed'}: $qossettings{'INC_SPD'} kbps -
Uploadgeschwindigkeit: $qossettings{'OUT_SPD'} kbps +
$Lang::tr{'uplink speed'}: $qossettings{'OUT_SPD'} kbps
END ; @@ -622,9 +623,9 @@ END
+ END ;} +else +{ +print $Lang::tr{'no information available'}; +} print "\t

-
Downloadstandardklasse: $qossettings{'DEFCLASS_INC'} +
$Lang::tr{'downlink std class'}: $qossettings{'DEFCLASS_INC'} -
Uploadstandardklasse: $qossettings{'DEFCLASS_OUT'} +
$Lang::tr{'uplink std class'}: $qossettings{'DEFCLASS_OUT'}
ACKs: $qossettings{'ACK'}

@@ -657,20 +658,24 @@ if ( ($qossettings{'DEFCLASS_INC'} eq '') || ($qossettings{'DEFCLASS_OUT'} eq '' } &Header::openbox('100%', 'center', $Lang::tr{'info'}); -&overviewgraph($qossettings{'RED_DEV'}); -&overviewgraph($qossettings{'IMQ_DEV'}); +&Graphs::overviewgraph("3240",$qossettings{'RED_DEV'}); +&Graphs::overviewgraph("3240",$qossettings{'IMQ_DEV'}); print < -
 Unterklasse hinzufuegen |  Regel hinzufuegen |  Bearbeiten |  Loeschen   -
TOS-Bits:  0 - Deaktiviert | 8 - Minimale Verzoegerung | 4 - Maximaler Durchsatz | 2 - Maximale Zuverlaessigkeit | 1 - Minimale Kosten   +
 $Lang::tr{'add subclass'} |  $Lang::tr{'Add Rule'} |  $Lang::tr{'edit'} |  $Lang::tr{'delete'}   +
$Lang::tr{'TOS Bits'}:  0 - $Lang::tr{'disabled'} | 8 - $Lang::tr{'min delay'} | 4 - $Lang::tr{'max throughput'} | 2 - $Lang::tr{'max reliability'} | 1 - $Lang::tr{'min costs'}   END ; -if (( -e "/srv/web/ipfire/html/graphs/qos-graph-$qossettings{'RED_DEV'}.png") && ( -e "/srv/web/ipfire/html/graphs/qos-graph-$qossettings{'IMQ_DEV'}.png")) { +if (( -e "/srv/web/ipfire/html/graphs/qos-graph-$qossettings{'RED_DEV'}-3240.png") && ( -e "/srv/web/ipfire/html/graphs/qos-graph-$qossettings{'IMQ_DEV'}-3240.png")) { print < -
+
"; &Header::closebox(); @@ -685,11 +690,11 @@ print "\t"; ############################################################################################################################ sub changedefclasses { - &Header::openbox('100%', 'center', 'Standardklassen:'); + &Header::openbox('100%', 'center', $Lang::tr{'std classes'}); print < -
Legen sie hier die Standardklassen fest durch die nicht-gefilterte Pakete gehen. +
$Lang::tr{'no filter pass'}
Download:

- @@ -1130,7 +1135,7 @@ END if ( $l7ruleline[0] eq $classline[1] ) { print <
Legen sie hier die ACK-Klasse fest
und klicken Sie danach auf Speichern. +
$Lang::tr{'enter ack class'}
ACKs: -
Geben Sie bitte hier ihre Download- bzw. Upload-Geschwindigkeit ein
und klicken Sie danach auf Speichern. -
Download-Geschwindigkeit: +
$Lang::tr{'down and up speed'} +
$Lang::tr{'downlink speed'}:   kbps   -
Upload-Geschwindigkeit: +
$Lang::tr{'uplink speed'}:   kbps  
@@ -760,7 +765,7 @@ END } sub parentclass { - &Header::openbox('100%', 'center', 'Parentklasse'); + &Header::openbox('100%', 'center', $Lang::tr{'parentclass'}); print < @@ -774,8 +779,8 @@ END print ""; } print < @@ -1098,22 +1103,22 @@ sub showclasses {
Geben sie die Daten ein
und klicken Sie danach auf Speichern. -
Interface: +
$Lang::tr{'enter data'} +
$Lang::tr{'interface'}: END ; @@ -793,7 +798,7 @@ END   -
Klasse: +
$Lang::tr{'Class'}: END ; if ( $qossettings{'EDIT'} eq 'yes' ) { @@ -816,7 +821,7 @@ END print <   -
Prioritaet:
$Lang::tr{'priority'}:  -
Garantierte Bandbreite: +
$Lang::tr{'guaranteed bandwith'}:   -
Maximale Bandbreite: +
$Lang::tr{'max bandwith'}:  
Burst: @@ -843,11 +848,11 @@ END  
TOS-Bit: + + + + +  
$Lang::tr{'remark'}: @@ -861,7 +866,7 @@ END } sub subclass { - &Header::openbox('100%', 'center', 'Unterklasse'); + &Header::openbox('100%', 'center', $Lang::tr{'Subclass'}); print < @@ -871,9 +876,9 @@ END print "
$message"; } print <Aktuelle Klasse: $qossettings{'CLASS'} -
Geben sie die Daten ein
und klicken Sie danach auf Speichern. -
Unterklasse:
$Lang::tr{'current class'}: $qossettings{'CLASS'} +
$Lang::tr{'enter data'} +
$Lang::tr{'Subclass'}:  -
Prioritaet:
$Lang::tr{'priority'}:
Garantierte Bandbreite: +
$Lang::tr{'guaranteed bandwith'}:   -
Maximale Bandbreite: +
$Lang::tr{'max bandwith'}:  
Burst: @@ -921,11 +926,11 @@ END  
TOS-Bit: + + + + +   @@ -936,7 +941,7 @@ END } sub level7rule { - &Header::openbox('100%', 'center', 'Level7-Regel'); + &Header::openbox('100%', 'center', $Lang::tr{'Level7 Rule'}); print < @@ -946,9 +951,9 @@ END print "
$message"; } print <Aktuelle Klasse: $qossettings{'CLASS'} -
Geben sie die Daten ein
und klicken Sie danach auf Speichern. -
Protokoll: +
$Lang::tr{'current class'}: $qossettings{'CLASS'} +
$Lang::tr{'enter data'} +
$Lang::tr{'protocol'}:   -
Quell-IP-Adresse: +
$Lang::tr{'source ip'}:   -
Ziel-IP-Adresse: +
$Lang::tr{'destination ip'}:
@@ -981,12 +986,12 @@ END } sub portrule { - &Header::openbox('100%', 'center', 'Port-Regel hinzufuegen'); + &Header::openbox('100%', 'center', $Lang::tr{'Add Port Rule'}); print < -
Geben sie die Daten ein
und klicken Sie danach auf Speichern. -
Protokoll: +
$Lang::tr{'enter data'} +
$Lang::tr{'protocol'}:   -
Quell-Port: +
$Lang::tr{'source port'}:   -
Ziel-Port: +
$Lang::tr{'destination port'}:   -
Quell-IP-Adresse: +
$Lang::tr{'source ip'}:   -
Ziel-IP-Adresse: +
$Lang::tr{'destination ip'}:
@@ -1024,9 +1029,9 @@ END } sub tosrule { - &Header::openbox('100%', 'center', 'TOS-Regel'); + &Header::openbox('100%', 'center', $Lang::tr{'TOS Rule'}); if ($qossettings{'TOS'}) { - $checked[$qossettings{'TOS'}] = "checked"; + $checked{$qossettings{'TOS'}} = "checked"; } print < @@ -1037,12 +1042,12 @@ END print "
$message"; } print <Aktuelle Klasse: $qossettings{'CLASS'} -
Aktivieren oder deaktivieren sie die TOS-Bits
und klicken Sie danach auf Speichern. -
Minimale Verzoegerung (8) -
Maximaler Durchsatz (4) -
Maximale Zuverlaessigkeit (2) -
Minimale Kosten (1) +
$Lang::tr{'current class'}: $qossettings{'CLASS'} +
$Lang::tr{'Enter TOS'} +
$Lang::tr{'min delay'} (8) +
$Lang::tr{'max throughput'} (4) +
$Lang::tr{'max reliability'} (2) +
END @@ -1077,14 +1082,14 @@ sub showclasses { print <
$Lang::tr{'interface'} - Klasse - Prioritaet - Garantierte Bandbreite - Maximale Bandbreite + $Lang::tr{'Class'} + $Lang::tr{'priority'} + $Lang::tr{'guaranteed bandwith'} + $Lang::tr{'max bandwith'} Burst Ceil Burst TOS - Aktionen + $Lang::tr{'action'}
$classline[0] $classline[1] $classline[2]
- +
- +
- +
- +
Level7-Protokoll: +
$Lang::tr{'Level7 Protocol'}: $l7ruleline[2] @@ -1152,8 +1157,8 @@ END if (($l7ruleline[3] ne "") || ($l7ruleline[4] ne "")){ print <
  - Quell-IP: $l7ruleline[3] - Ziel-IP: $l7ruleline[4] + $Lang::tr{'source ip'}: $l7ruleline[3] + $Lang::tr{'destination ip'}: $l7ruleline[4] END ; } @@ -1173,7 +1178,7 @@ END if ( $portruleline[0] eq $classline[1] ) { print <Port-Regel: +
$Lang::tr{'Port Rule'}: ($portruleline[2]) END @@ -1203,7 +1208,7 @@ END - +
@@ -1213,7 +1218,7 @@ END - +
END @@ -1221,8 +1226,8 @@ END if (($portruleline[3] ne "") || ($portruleline[5] ne "")){ print <
  - Quell-IP: $portruleline[3] - Ziel-IP: $portruleline[5] + $Lang::tr{'source ip'}: $portruleline[3] + $Lang::tr{'destination ip'}: $portruleline[5] END ; } @@ -1243,13 +1248,13 @@ END END ; if ( $tosruleline[2] eq "8") { - print "Minimale Verzoegerung\n"; + print "$Lang::tr{'min delay'}\n"; } elsif ( $tosruleline[2] eq "4") { - print "Maximaler Durchsatz\n"; + print "$Lang::tr{'max throughput'}\n"; } elsif ( $tosruleline[2] eq "2") { - print "Maximaler Durchsatz\n"; + print "$Lang::tr{'max reliability'}\n"; } elsif ( $tosruleline[2] eq "1") { - print "Minimale Kosten\n"; + print "$Lang::tr{'min costs'}\n"; } else { print " \n"; } print < - +
- +
END @@ -1283,7 +1288,7 @@ END @subclassline = split( /\;/, $subclassentry ); if ( $subclassline[1] eq $classline[1] ) { print <Subklasse: + $Lang::tr{'Subclass'}: $subclassline[2] $subclassline[3] $subclassline[4] @@ -1296,17 +1301,17 @@ END
- +
- +
- +
END @@ -1325,14 +1330,14 @@ END sub expert { - &Header::openbox('100%', 'center', 'Expertenoptionen:'); + &Header::openbox('100%', 'center', $Lang::tr{'expertoptions'}); print <
MTU: - Diese Einstellung aendert die MTU nicht global sondern nur fuer das QoS. -
Queue Laenge: + $Lang::tr{'mtu QoS'} +
$Lang::tr{'Queuelenght'}:  
SFQ Perturb: @@ -1354,7 +1359,7 @@ sub validminbwdth { } unless ( ( $qossettings{'MINBWDTH'} >= 1 ) && ( $qossettings{'MINBWDTH'} <= $qossettings{'SPD'} ) ) { $qossettings{'VALID'} = 'no'; - $message = "Mindestbandbreite ist ungueltig."; + $message = "$Lang::tr{'false min bandwith'}"; } $qossettings{'SPD'} = ''; } @@ -1369,7 +1374,7 @@ sub validmaxbwdth { } unless ( ( $qossettings{'MAXBDWTH'} >= 0 ) && ($qossettings{'MAXBDWTH'} >= $qossettings{'MINBDWTH'}) &&( $qossettings{'MAXBDWTH'} <= $qossettings{'SPD'} ) ) { $qossettings{'VALID'} = 'no'; - $message = "Mamimalbandbreite ist ungueltig."; + $message = "$Lang::tr{'false max bandwith'}"; } $qossettings{'SPD'} = ''; } @@ -1380,7 +1385,7 @@ sub validclass { if ( $qossettings{'DEVICE'} eq $qossettings{'RED_DEV'} ) { if ($qossettings{'CLASS'} lt 100 || $qossettings{'CLASS'} ge 121) { $qossettings{'VALID'} = 'no'; - $message = "Die Klassennummer passt nicht zum angegebenen Interface."; + $message = "$Lang::tr{'false classnumber'}"; } } elsif ( $qossettings{'DEVICE'} eq $qossettings{'IMQ_DEV'} ) { if ($qossettings{'CLASS'} lt 200 || $qossettings{'CLASS'} ge 221) { @@ -1397,7 +1402,7 @@ sub validclass { if ( $tmpline[1] eq $qossettings{'CLASS'} ) { $qossettings{'VALID'} = 'no'; - $message = "Die aktuelle Klasse wird bereits verwendet."; + $message = "$Lang::tr{'false classnumber'}"; last } } @@ -1415,60 +1420,9 @@ sub validsubclass { if ( $tmpline[2] eq $qossettings{'SCLASS'} ) { $qossettings{'VALID'} = 'no'; - $message = "Die aktuelle Klasse wird bereits verwendet."; + $message = "$Lang::tr{'class in use'}"; last } } } } - -sub overviewgraph { - $qossettings{'DEV'} = shift; - if ( $qossettings{'DEV'} eq $qossettings{'RED_DEV'} ) { - $qossettings{'CLASSPRFX'} = '1'; - } else { - $qossettings{'CLASSPRFX'} = '2'; - } - my $ERROR=""; - my $count="1"; - my $color="#000000"; - my @command=("/srv/web/ipfire/html/graphs/qos-graph-$qossettings{'DEV'}.png", - "--start", "-3240", "-aPNG", "-i", "-z", - "--alt-y-grid", "-w 600", "-h 150", "-r", - "--color", "SHADEA#EAE9EE", - "--color", "SHADEB#EAE9EE", - "--color", "BACK#FFFFFF", - "-t Auslastung auf ($qossettings{'DEV'})" - ); - open( FILE, "< $classfile" ) or die "Unable to read $classfile"; - @classes = ; - close FILE; - foreach $classentry (sort @classes) - { - @classline = split( /\;/, $classentry ); - if ( $classline[0] eq $qossettings{'DEV'} ) - { - $color=random_hex_color(6); - push(@command, "DEF:$classline[1]=/var/log/rrd/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bits:AVERAGE"); - - if ($count eq "1") { - push(@command, "AREA:$classline[1]$color:Klasse $classline[1] - $classline[8]\\j"); - } else { - push(@command, "STACK:$classline[1]$color:Klasse $classline[1] - $classline[8]\\j"); - } - $count++; - } - } - RRDs::graph (@command); - $ERROR = RRDs::error; - print "$ERROR"; -} - -sub random_hex_color { - my $size = shift; - $size = 6 if $size !~ /^3|6$/; - my @hex = ( 0 .. 9, 'a' .. 'f' ); - my @color; - push @color, @hex[rand(@hex)] for 1 .. $size; - return join('', '#', @color); -} diff --git a/html/cgi-bin/qosgraph.cgi b/html/cgi-bin/qosgraph.cgi new file mode 100644 index 0000000000..f4964f6b6f --- /dev/null +++ b/html/cgi-bin/qosgraph.cgi @@ -0,0 +1,80 @@ +#!/usr/bin/perl +# +# SmoothWall CGIs +# +# This code is distributed under the terms of the GPL +# +# (c) The SmoothWall Team +# +# + +use strict; + +# enable only the following on debugging purpose +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 @cgigraph=(); +my $errormessage = ""; + +&Header::showhttpheaders(); + +$ENV{'QUERY_STRING'} =~ s/&//g; +@cgigraph = split(/graph=/,$ENV{'QUERY_STRING'}); +$cgigraph[1] = '' unless defined $cgigraph[1]; + +&Graphs::overviewgraph("day",$cgigraph[1]); +&Graphs::overviewgraph("week",$cgigraph[1]); +&Graphs::overviewgraph("month",$cgigraph[1]); +&Graphs::overviewgraph("year",$cgigraph[1]); + +&Header::openpage('QoS', 1, ''); +&Header::openbigbox('100%', 'left', '', $errormessage); +&Header::openbox('100%', 'left', $cgigraph[1]); + + if (-e "/srv/web/ipfire/html/graphs/qos-graph-$cgigraph[1]-day.png") { + my $ftime = localtime((stat("/srv/web/ipfire/html/graphs/qos-graph-$cgigraph[1]-day.png"))[9]); + print "
"; + print "$Lang::tr{'the statistics were last updated at'}: $ftime

\n"; + print "
"; + } else { + print $Lang::tr{'no information available'}; + } + + if (-e "/srv/web/ipfire/html/graphs/qos-graph-$cgigraph[1]-week.png") { + my $ftime = localtime((stat("/srv/web/ipfire/html/graphs/qos-graph-$cgigraph[1]-week.png"))[9]); + print "
"; + print "$Lang::tr{'the statistics were last updated at'}: $ftime

\n"; + print "
"; + } else { + print $Lang::tr{'no information available'}; + } + + if (-e "/srv/web/ipfire/html/graphs/qos-graph-$cgigraph[1]-month.png") { + my $ftime = localtime((stat("/srv/web/ipfire/html/graphs/qos-graph-$cgigraph[1]-month.png.png"))[9]); + print "
"; + print "$Lang::tr{'the statistics were last updated at'}: $ftime

\n"; + print "
"; + } else { + print $Lang::tr{'no information available'}; + } + + if (-e "/srv/web/ipfire/html/graphs/qos-graph-$cgigraph[1]-year.png") { + my $ftime = localtime((stat("/srv/web/ipfire/html/graphs/qos-graph-$cgigraph[1]-year.png"))[9]); + print "
"; + print "$Lang::tr{'the statistics were last updated at'}: $ftime

\n"; + print "
"; + } else { + print $Lang::tr{'no information available'}; + } + + print""; + +&Header::closebox(); +&Header::closebigbox(); +&Header::closepage(); diff --git a/langs/de/cgi-bin/de.pl b/langs/de/cgi-bin/de.pl index 70b1247ba7..ba638327e2 100644 --- a/langs/de/cgi-bin/de.pl +++ b/langs/de/cgi-bin/de.pl @@ -2,6 +2,11 @@ %tr, 'Act as' => 'Konfiguriert als', +'Add Port Rule' => 'Port Regel hinzufügen', +'Add Rule' => 'Regel hinzufügen', +'Choose Rule' => 'Waehlen sie eine der untenstehenden Regeln aus.', +'Class' => 'Klasse', +'Class was deleted' => 'wurde mit eventuell vorhandenen Unterklassen geloescht', 'Client status and controlc' => 'Client Status und Kontrolle', 'ConnSched action' => 'Aktion:', 'ConnSched add action' => 'Aktion hinzufügen', @@ -17,8 +22,11 @@ 'ConnSched time' => 'Zeit:', 'ConnSched up' => 'Hoch', 'ConnSched weekdays' => 'Wochentage:', +'Enter TOS' => 'Aktivieren oder deaktivieren sie die TOS-Bits
und klicken Sie danach auf Speichern.', 'Existing Files' => 'Dateien in der Datenbank', 'HDD temperature' => 'HDD-Temperatur', +'Level7 Protocol' => 'Level7-Protokoll', +'Level7 Rule' => 'Level7-Regel', 'Local VPN IP' => 'Internes Netzwerk (GREEN)', 'MTU' => 'MTU Size', 'Number of IPs for the pie chart' => 'Anzahl der angezeigten IPs im Diagramm', @@ -27,11 +35,18 @@ 'OpenVPN' => 'OpenVPN', 'Pages' => 'Seiten', 'Ping' => 'Ping ', +'Port Rule' => 'Port-Regel', +'QoS not enabled' => 'QoS ist nicht aktiviert!', +'Queuelenght' => 'Warteschlangenlaenge', 'Remote IP' => 'Entfernte IP / Hostname (DynDNS)', 'Remote VPN IP' => 'VPN Subnetz (z.B. 10.0.10.0/255.255.255.0)', 'Resolv' => 'Resolv-Retry', 'Scan for Files' => 'Nach Dateien suchen', 'Scan from Directory' => 'Scan Verzeichnis', +'Subclass' => 'Unterklasse', +'TOS Bits' => 'TOS-Bits', +'TOS Rule' => 'TOS-Regel', +'Utilization on' => 'Auslastung auf', 'Verbose' => 'Verbose', 'WakeOnLan' => 'Wake On LAN', 'a ca certificate with this name already exists' => 'Ein CA-Zertifikat mit diesem Namen existiert bereits.', @@ -59,6 +74,7 @@ 'add printer' => 'Drucker hinzufügen', 'add service' => 'Dienst hinzufügen', 'add share' => 'Freigabe anlegen', +'add subclass' => 'Unterklasse hinzufügen', 'add user' => 'Benutzer anlegen', 'add xtaccess' => 'Externen Zugang hinzugefügt', 'add-route' => 'Additional push route', @@ -347,6 +363,8 @@ 'bad return code' => 'Das Hilfsprogramm hat einen Fehlercode gemeldet', 'bad source range' => 'Der erste Wert des Quellportbereich ist größer oder gleich dem zweiten Wert.', 'bandwidth usage' => 'Bandbreitenauslastung (extern)', +'bandwitherror' => 'Sie koennen die Bandbreiteneinstellungen nicht bearbeiten, wenn QoS eingeschaltet ist. Schalten sie es zuerst dazu aus.

', +'bandwithsettings' => 'Bandbreiteneinstellungen', 'basic options' => 'Basisoptionen', 'beep when ppp connects or disconnects' => 'Piepen, wenn IPFire verbindet oder trennt', 'behind a proxy' => 'Hinter einem Proxy:', @@ -431,6 +449,7 @@ 'choose config' => 'Konfiguration auswaehlen', 'cipher' => 'Verschlüsselung', 'city' => 'Stadt', +'class in use' => 'Die aktuelle Klasse wird bereits verwendet.', 'clear cache' => 'Zwischenspeicher löschen', 'clear playlist' => 'leere Playlist', 'clenabled' => 'Uhrzeit dem lokalen Netzwerk zur Verfügung stellen', @@ -484,6 +503,7 @@ 'cron server' => 'Cron-Server', 'current' => 'Aktuell', 'current aliases' => 'Aktuelle Alias-Adresse:', +'current class' => 'Aktuelle Klasse', 'current devices' => 'Schnittstellen', 'current dhcp leases on blue' => 'Aktuelle DHCP Zuordnungen auf Blau', 'current dynamic leases' => 'Aktuelle dynamische Zuordnungen', @@ -580,6 +600,7 @@ 'dialup settings' => 'Einwahl-Einstellungen', 'directory mask' => 'UNIX Verzeichnis Rechte', 'directory writeable' => 'Verzeichnis schreibbar', +'disabled' => 'deaktiviert', 'disconnect' => 'OVPN Stop / Trennen', 'disconnects' => 'Abbrüche', 'disk access per' => 'Plattenzugriff je', @@ -607,7 +628,9 @@ 'domain name' => 'Domainname', 'domain name suffix' => 'Domain-Name-Suffix:', 'domain not set' => 'Domain nicht eingegeben.', +'down and up speed' => 'Geben Sie bitte hier ihre Download- bzw. Upload-Geschwindigkeit ein
und klicken Sie danach auf Speichern.', 'downlink speed' => 'Downlink-Geschwindigkeit (kBit/sek)', +'downlink std class' => 'Downloadstandardklasse', 'download' => 'herunterladen', 'download ca certificate' => 'CA Zertifikat herunterladen', 'download certificate' => 'Zertifikate herunterladen', @@ -657,6 +680,8 @@ 'encapsulation' => 'Encapsulation', 'encrypted' => 'Verschlüsselt', 'end address' => 'Endadresse:', +'enter ack class' => 'Legen sie hier die ACK-Klasse fest
und klicken Sie danach auf Speichern.', +'enter data' => 'Geben sie die Daten ein
und klicken Sie danach auf Speichern.', 'err bk 1' => 'Fehler beim Erzeugen des Archivs', 'err bk 10 password' => 'Fehler beim Datensicherungs-Passwort', 'err bk 2 key' => 'Fehler beim Erzeugen der Schlüsseldatei', @@ -679,6 +704,7 @@ 'exampel' => 'Beispiel', 'excluding buffers and cache' => '-/+ Puffer/Zwischenspeicher', 'expected' => 'Erwartet', +'expertoptions' => 'Expertenoptionen', 'expires' => 'Ablaufdatum', 'export' => 'Export', 'exportkey' => 'PSK exportieren', @@ -688,6 +714,9 @@ 'external access rule changed' => 'External access Regel geaendert; Der access controller wird neu gestartet.', 'external access rule removed' => ' Regel für externen Zugang entfernt; Starte Zugangskontroller neu', 'external aliases configuration' => 'Externe Alias-Konfiguration', +'false classnumber' => 'Die Klassennummer passt nicht zum angegebenen Interface.', +'false max bandwith' => 'Maximalbandbreite ist ungueltig.', +'false min bandwith' => 'Mindestbandbreite ist ungueltig.', 'february' => 'Februar', 'fetch ip from' => 'Schätze die echte öffentliche IP-Adresse mit Hilfe eines externen Servers', 'filename' => 'Dateiname', @@ -743,6 +772,7 @@ 'graph per' => 'Diagramm pro', 'green' => 'GRÜN', 'green interface' => 'Grünes Interface', +'guaranteed bandwith' => 'Garantierte Bandbreite', 'guest ok' => 'Gastzugang gewähren', 'gui settings' => 'Benutzeroberfläche', 'gz with key' => 'Nur ein verschlüsseltes Archiv kann auf dieser Maschine wiederhergestellt werden.', @@ -977,12 +1007,15 @@ 'map to guest' => 'Map to Guest', 'march' => 'März', 'marked' => 'Markiert', +'max bandwith' => 'Maximale Bandbreite', 'max incoming size' => 'Max. eingehende Größe (kB):', 'max lease time' => 'Max. Haltezeit in min:', 'max outgoing size' => 'Max. abgehende Größe (kB):', +'max reliability' => 'Maximale Zuverlaessigkeit', 'max renewal time' => 'Maximale Aktualisierungszeit', 'max retries not set' => 'Maximale Wiederholversuche nicht angegeben.', 'max size' => 'Max. Objektgröße (kB):', +'max throughput' => 'Maximaler Durchsatz', 'maximal' => 'Maximal', 'maximum retries' => 'Maximale Wiederholversuche:', 'may' => 'Mai', @@ -1004,6 +1037,8 @@ 'memory information' => 'Speicherinformationen', 'memory usage per' => 'Speichernutzung pro', 'method' => 'Methode:', +'min costs' => 'Minimale Kosten', +'min delay' => 'Minimale Verzoegerung', 'min size' => 'Min. Objektgröße (kB):', 'minimal' => 'Minimal', 'minutes' => 'Minuten', @@ -1039,6 +1074,7 @@ 'mpfire scanning' => 'Nach neuen Dateien suchen', 'mpfire songs' => 'MPFire Songliste', 'mpfire webradio' => 'MPFire Webradio', +'mtu QoS' => 'Diese Einstellung aendert die MTU nicht global sondern nur fuer das QoS.', 'my new share' => 'Meine neue Freigabe', 'name' => 'Name', 'name is invalid' => 'Name ist ungültig', @@ -1079,6 +1115,7 @@ 'no cfg upload' => 'Keine Daten wurden hochgeladen', 'no dhcp lease' => 'Eine DHCP-Zuordnung konnte nicht empfangen werden', 'no eciadsl synch.bin file' => 'Keine ECI ADSL Datei synch.bin vorhanden. Bitte hochladen.', +'no filter pass' => 'Legen sie hier die Standardklassen fest durch die nicht-gefilterte Pakete gehen.', 'no fritzdsl driver' => 'Kein Fritz!DSL-Treiber vorhanden. Bitte hochladen.', 'no information available' => 'Keine Informationen verfügbar.', 'no log selected' => 'kein Log ausgewählt', @@ -1180,6 +1217,7 @@ 'pakfire updates' => 'Zur Verfügung stehende Updates:', 'pakfire working' => 'Pakfire führt gerade eine Aufgabe aus... Bitte warten sie, bis diese erfolgreich beendet wurde.', 'pap or chap' => 'PAP oder CHAP', +'parentclass' => 'Parentklasse', 'password' => 'Passwort:', 'password contains illegal characters' => 'Passwort enthält ungültige(s) Zeichen.', 'password crypting key' => 'Schlüssel wird mit dem Passwort chiffriert', @@ -1432,6 +1470,7 @@ 'status' => 'Status', 'status information' => 'Statusinformationen', 'status ovpn' => 'OpenVPN', +'std classes' => 'Standardklassen', 'stop' => 'Stop', 'stop ovpn server' => 'Stoppe OpenVPN Server', 'stopped' => 'ANGEHALTEN', @@ -1583,6 +1622,7 @@ 'updxlrtr year' => 'einem Jahr', 'upgrade' => 'upgrade', 'uplink speed' => 'Uplink-Geschwindigkeit (kBit/sek)', +'uplink std class' => 'Uploadstandardklasse', 'upload' => 'Hochladen', 'upload a certificate' => 'Ein Zertifikat hochladen:', 'upload a certificate request' => 'Eine Zertifikatsanfrage hochladen:', @@ -1852,6 +1892,7 @@ 'waiting to synchronize clock' => 'Bitte warten, die Uhr wird synchronisiert', 'warn when traffic reaches' => 'Warnen wenn Traffic x % erreicht', 'warning messages' => 'Warnhinweise', +'was deleted' => 'wurde gelöscht', 'web hits' => 'Gesamtanzahl der Websites zum ausgewählten Kriterium', 'web proxy' => 'Web-Proxy', 'web proxy configuration' => 'Web-Proxy-Konfiguration', diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl index 47958db355..c48537bcda 100644 --- a/langs/en/cgi-bin/en.pl +++ b/langs/en/cgi-bin/en.pl @@ -2,6 +2,11 @@ %tr, 'Act as' => 'Act as:', +'Add Port Rule' => 'Add port rule', +'Add Rule' => 'Add Rule', +'Choose Rule' => 'Choose one of the following rules.', +'Class' => 'Class', +'Class was deleted' => 'with potential Subclasses was deleted', 'Client status and controlc' => 'Client status and control:', 'ConnSched action' => 'Action:', 'ConnSched add action' => 'Add action', @@ -17,8 +22,11 @@ 'ConnSched time' => 'Time:', 'ConnSched up' => 'Up', 'ConnSched weekdays' => 'Days of the week:', +'Enter TOS' => 'Activate or Deactivate TOS-Bits
and then press Save.', 'Existing Files' => 'Files in database', 'HDD temperature' => 'HDD temperature', +'Level7 Protocol' => 'Level7-Protocol', +'Level7 Rule' => 'Level7-Rule', 'Local VPN IP' => 'Internal Network (GREEN):', 'MTU' => 'MTU Size:', 'Number of IPs for the pie chart' => 'Number of IPs for the pie chart', @@ -27,11 +35,18 @@ 'OpenVPN' => 'OpenVPN', 'Pages' => 'Pages', 'Ping' => 'Ping :', +'Port Rule' => 'Port-Rule', +'QoS not enabled' => 'QoS is not enabled!', +'Queuelenght' => 'Queuelenght', 'Remote IP' => 'Remote IP / Hostname (DynDNS):', 'Remote VPN IP' => 'VPN Subnet (e.g. 10.0.10.0/255.255.255.0):', 'Resolv' => 'Resolv-Retry:', 'Scan for Files' => 'Scan for files', 'Scan from Directory' => 'Scan from directory', +'Subclass' => 'Subclass', +'TOS Bits' => 'TOS-Bits', +'TOS Rule' => 'TOS-Rule', +'Utilization on' => 'Utilization on', 'Verbose' => 'Verbose:', 'WakeOnLan' => 'Wake On LAN', 'a ca certificate with this name already exists' => 'A CA Certificate with this name already exists.', @@ -59,6 +74,7 @@ 'add printer' => 'add printer', 'add service' => 'Add service', 'add share' => 'add share', +'add subclass' => 'add subclass', 'add user' => 'add User', 'add xtaccess' => 'Add External Access', 'add-route' => 'Additional push route', @@ -364,6 +380,8 @@ 'bad return code' => 'Helper program returned error code', 'bad source range' => 'The Source port range has a first value that is greater than or equal to the second value.', 'bandwidth usage' => 'bandwidth usage (external)', +'bandwitherror' => 'You cannot change the bandwithsettings, with Qos being enabled. First disable Qos.

', +'bandwithsettings' => 'Bandwithsettings', 'basic options' => 'Basic Options', 'beep when ppp connects or disconnects' => 'Beep when IPFire connects or disconnects', 'behind a proxy' => 'Behind a proxy:', @@ -451,6 +469,7 @@ 'choose media' => 'Choose media', 'cipher' => 'Encryption:', 'city' => 'City', +'class in use' => 'The class is already in use.', 'clear cache' => 'Clear Cache', 'clear playlist' => 'empty playlist', 'clenabled' => 'Provide time to local network', @@ -505,6 +524,7 @@ 'cron server' => 'CRON server', 'current' => 'Current', 'current aliases' => 'Current aliases:', +'current class' => 'Current class', 'current devices' => 'Current devices', 'current dhcp leases on blue' => 'Current DHCP leases on Blue', 'current dynamic leases' => 'Current dynamic leases', @@ -603,6 +623,7 @@ 'dialup settings' => 'Dialup Settings', 'directory mask' => 'UNIX directory rights', 'directory writeable' => 'directory writeable', +'disabled' => 'disabled', 'disconnect' => 'OVPN Stop / Disconnect', 'disconnects' => 'Disconnects', 'disk access per' => 'Disk Access per', @@ -631,7 +652,9 @@ 'domain name suffix' => 'Domain name suffix:', 'domain not set' => 'Domain not set.', 'done' => 'Do it', +'down and up speed' => 'Enter your Down- and Uplink-Speed
and then press Save.', 'downlink speed' => 'Downlink speed (kbit/sec)', +'downlink std class' => 'downlink standard class', 'download' => 'download', 'download ca certificate' => 'Download CA Certificate', 'download certificate' => 'Download Certificate', @@ -681,6 +704,8 @@ 'encapsulation' => 'Encapsulation', 'encrypted' => 'Encrypted', 'end address' => 'End address:', +'enter ack class' => 'Enter the ACK- Class
and then press Save.', +'enter data' => 'Enter your settings
and then press Save.', 'err bk 1' => 'Error creating archive', 'err bk 10 password' => 'Error with Backup Password', 'err bk 2 key' => 'Error creating key file', @@ -703,6 +728,7 @@ 'exampel' => 'exampel', 'excluding buffers and cache' => '-/+ buffers/cache', 'expected' => 'Expected', +'expertoptions' => 'Expert options', 'expires' => 'Expires', 'export' => 'Export', 'exportkey' => 'Export PSK', @@ -712,6 +738,9 @@ 'external access rule changed' => 'External access rule changed; restarting access controller', 'external access rule removed' => ' External access rule removed; restarting access controller', 'external aliases configuration' => 'External aliases configuration', +'false classnumber' => 'The Class-Number does not match the interface.', +'false max bandwith' => 'Maximum bandwith is false.', +'false min bandwith' => 'Minimum bandwith is false.', 'february' => 'February', 'fetch ip from' => 'Guess the real public IP with help of an external server', 'filename' => 'Filename', @@ -769,6 +798,7 @@ 'graph per' => 'Graph per', 'green' => 'GREEN', 'green interface' => 'Green Interface', +'guaranteed bandwith' => 'Guaranteed bandwith', 'guest ok' => 'allow guests to access', 'gui settings' => 'GUI Settings', 'gz with key' => 'Only an encrypted archive can be restored on this machine.', @@ -1004,12 +1034,15 @@ 'map to guest' => 'Map to Guest', 'march' => 'March', 'marked' => 'Marked', +'max bandwith' => 'Maximum bandwith', 'max incoming size' => 'Max incoming size (KB):', 'max lease time' => 'Max lease time (mins):', 'max outgoing size' => 'Max outgoing size (KB):', +'max reliability' => 'Maximum reliability', 'max renewal time' => 'Maximum Renewal Time', 'max retries not set' => 'Max retries not set.', 'max size' => 'Max object size (KB):', +'max throughput' => 'Maximum throughput', 'maximal' => 'Maximal', 'maximum retries' => 'Maximum retries:', 'may' => 'May', @@ -1031,6 +1064,8 @@ 'memory information' => 'memory information', 'memory usage per' => 'Memory Usage per', 'method' => 'Method:', +'min costs' => 'Minimum costs', +'min delay' => 'Minimum delay', 'min size' => 'Min object size (KB):', 'minimal' => 'Minimal', 'minutes' => 'Minutes', @@ -1066,6 +1101,7 @@ 'mpfire scanning' => 'Scan for new files', 'mpfire songs' => 'MPFire songlist', 'mpfire webradio' => 'MPFire Webradio', +'mtu QoS' => 'This does not change the global MTU, it only sets MTU for QoS.', 'my new share' => 'My new share', 'name' => 'Name', 'name is invalid' => 'Name is invalid', @@ -1106,6 +1142,7 @@ 'no cfg upload' => 'No data was uploaded', 'no dhcp lease' => 'No DHCP lease has been acquired', 'no eciadsl synch.bin file' => 'No ECI ADSL synch.bin file. Please upload.', +'no filter pass' => 'Enter the standard class for non-filtered packets.', 'no fritzdsl driver' => 'No Fritz!DSL driver. Please upload.', 'no information available' => 'No information available.', 'no log selected' => 'no log selected', @@ -1208,6 +1245,7 @@ 'pakfire updates' => 'Available Update:', 'pakfire working' => 'Pakfire ist working ... Please wait until everything is done successfull.', 'pap or chap' => 'PAP or CHAP', +'parentclass' => 'Parentclass', 'password' => 'Password:', 'password contains illegal characters' => 'Password contains illegal characters.', 'password crypting key' => 'Password crypting the key', @@ -1464,6 +1502,7 @@ 'status' => 'Status', 'status information' => 'Status information', 'status ovpn' => '4. OpenVPN Status / Configuration:', +'std classes' => 'Standardclasses', 'stop' => 'stop', 'stop ovpn server' => 'Stop OpenVPN Server', 'stopped' => 'STOPPED', @@ -1615,6 +1654,7 @@ 'updxlrtr year' => 'one year', 'upgrade' => 'upgrade', 'uplink speed' => 'Uplink speed (kbit/sec)', +'uplink std class' => 'uplink standard class', 'upload' => 'Upload', 'upload a certificate' => 'Upload a certificate:', 'upload a certificate request' => 'Upload a certificate request:', @@ -1886,6 +1926,7 @@ 'waiting to synchronize clock' => 'Waiting to synchronize clock', 'warn when traffic reaches' => 'Warn when traffic reaches x %', 'warning messages' => 'Warning messages', +'was deleted' => 'was deleted', 'web hits' => 'Total number of websites matching selected criteria for', 'web proxy' => 'Web proxy', 'web proxy configuration' => 'Web proxy configuration', -- 2.39.2