#!/usr/bin/perl # # IPFire CGIs # # This code is distributed under the terms of the GPL # # (c) The IPFire Team # use RRDs; 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"; 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); &Header::showhttpheaders(); $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{'SFQ_PERTUB'} = '10'; $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'} = ''; $qossettings{'CLASS'} = ''; $qossettings{'CLASSPRFX'} = ''; $qossettings{'DEV'} = ''; &General::readhash("${General::swroot}/qos/settings", \%qossettings); &Header::getcgihash(\%qossettings); &Header::openpage('QoS', 1, ''); &Header::openbigbox('100%', 'left', '', $errormessage); ############################################################################################################################ ############################################################################################################################ if ($qossettings{'DOCLASS'} eq $Lang::tr{'save'}) { &validclass(); &validminbwdth(); &validmaxbwdth(); if ( $qossettings{'VALID'} eq 'yes' ) { open( FILE, ">> $classfile" ) or die "Unable to write $classfile"; print FILE <; close FILE; open( FILE, "> $classfile" ) or die "Unable to write $classfile"; foreach $classentry (sort @classes) { @classline = split( /\;/, $classentry ); if ( $classline[1] ne $qossettings{'CLASS'} ) { print FILE $classentry; } else { $qossettings{'DEVICE'} = $classline[0]; $qossettings{'PRIO'} = $classline[2]; $qossettings{'MINBWDTH'} = $classline[3]; $qossettings{'MAXBWDTH'} = $classline[4]; $qossettings{'BURST'} = $classline[5]; $qossettings{'CBURST'} = $classline[6]; $qossettings{'EDIT'} = 'yes'; } } close FILE; &parentclass(); &Header::closebigbox(); &Header::closepage(); exit } elsif ($qossettings{'DOCLASS'} eq 'Loeschen') { open( FILE, "< $classfile" ) or die "Unable to read $classfile"; @tmp = ; close FILE; open( FILE, "> $classfile" ) or die "Unable to write $classfile"; foreach $classentry (sort @tmp) { @tmpline = split( /\;/, $classentry ); if ( $tmpline[1] ne $qossettings{'CLASS'} ) { print FILE $classentry; } } close FILE; open( FILE, "< $subclassfile" ) or die "Unable to read $classfile"; @tmp = ; close FILE; open( FILE, "> $subclassfile" ) or die "Unable to write $classfile"; foreach $subclassentry (sort @tmp) { @tmpline = split( /\;/, $subclassentry ); if ( $tmpline[1] ne $qossettings{'CLASS'} ) { print FILE $subclassentry; } } close FILE; $message = "Klasse $qossettings{'CLASS'} wurde mit eventuell vorhandenen Unterklassen geloescht."; } ############################################################################################################################ ############################################################################################################################ 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 <; close FILE; open( FILE, "> $subclassfile" ) or die "Unable to write $classfile"; foreach $subclassentry (sort @tmp) { @tmpline = split( /\;/, $subclassentry ); if ( $tmpline[2] ne $qossettings{'CLASS'} ) { print FILE $subclassentry; } } close FILE; $message = "Unterklasse $qossettings{'CLASS'} wurde geloescht."; } ############################################################################################################################ ############################################################################################################################ if ($qossettings{'DOLEVEL7'} eq $Lang::tr{'save'}) { if ( $qossettings{'QIP'} ne '' ) { unless ( &General::validip($qossettings{'QIP'}) ) { $qossettings{'VALID'} = 'no'; $message = "Die Quell-IP-Adresse ist ungueltig."; } } if ( $qossettings{'DIP'} ne '' ) { unless ( &General::validip($qossettings{'DIP'}) ) { $qossettings{'VALID'} = 'no'; $message = "Die Ziel-IP-Adresse ist ungueltig."; } } 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'}; } if ( $qossettings{'VALID'} eq 'yes' ) { open( FILE, ">> $level7file" ) or die "Unable to write $level7file"; print FILE <; close FILE; open( FILE, "> $level7file" ) or die "Unable to read $level7file"; foreach $l7ruleentry (sort @l7rules) { @l7ruleline = split( /\;/, $l7ruleentry ); if ( ($l7ruleline[0] ne $qossettings{'CLASS'}) && ($l7ruleline[2] ne $qossettings{'L7PROT'})) { print FILE $l7ruleentry; } } close FILE; $message = "Level7-Regel ($qossettings{'CLASS'} - $qossettings{'L7PROT'}) wurde geloescht."; } ############################################################################################################################ ############################################################################################################################ if ($qossettings{'DOPORT'} eq $Lang::tr{'save'}) { if ( $qossettings{'QIP'} ne '' ) { unless ( &General::validip($qossettings{'QIP'}) ) { $qossettings{'VALID'} = 'no'; $message = "Die Quell-IP-Adresse ist ungueltig."; } } if ( $qossettings{'DIP'} ne '' ) { unless ( &General::validip($qossettings{'DIP'}) ) { $qossettings{'VALID'} = 'no'; $message = "Die Ziel-IP-Adresse ist ungueltig."; } } 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'}; } if ( $qossettings{'VALID'} eq 'yes' ) { open( FILE, ">> $portfile" ) or die "Unable to write $portfile"; print FILE <; close FILE; open( FILE, "> $portfile" ) or die "Unable to read $portfile"; foreach $portruleentry (sort @portrules) { @portruleline = split( /\;/, $portruleentry ); unless ( ($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'})) { print FILE $portruleentry; } } close FILE; $message = "Port-Regel ($qossettings{'CLASS'} - $qossettings{'PPROT'}) wurde geloescht."; } ############################################################################################################################ ############################################################################################################################ if ($qossettings{'ACTION'} eq 'Start') { system("sleep 1 && /usr/bin/perl /var/ipfire/qos/bin/makeqosscripts.pl > /var/ipfire/qos/bin/qos.sh &"); system("/bin/touch /var/ipfire/qos/enable"); system("sleep 2 && /usr/local/bin/qosctrl start >/dev/null 2>&1"); system("logger -t ipfire 'QoS started'"); $qossettings{'ENABLED'} = 'on'; &General::writehash("${General::swroot}/qos/settings", \%qossettings); } elsif ($qossettings{'ACTION'} eq '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') { if ($qossettings{'ENABLED'} eq 'on'){ system("/usr/local/bin/qosctrl stop >/dev/null 2>&1"); system("sleep 1 && /usr/bin/perl /var/ipfire/qos/bin/makeqosscripts.pl > /var/ipfire/qos/bin/qos.sh &"); system("sleep 5 && /usr/local/bin/qosctrl start >/dev/null 2>&1"); system("logger -t ipfire 'QoS restarted'"); } } elsif ($qossettings{'ACTION'} eq $Lang::tr{'save'}) { if ($qossettings{'DEF_INC_SPD'} eq '') { $qossettings{'DEF_INC_SPD'} = int($qossettings{'INC_SPD'} * 0.9); } if ($qossettings{'DEF_OUT_SPD'} eq '') { $qossettings{'DEF_OUT_SPD'} = int($qossettings{'OUT_SPD'} * 0.9); } &General::writehash("${General::swroot}/qos/settings", \%qossettings); } elsif ($qossettings{'ACTION'} eq 'Statusinformationen') { &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 "QoS ist nicht aktiviert!"; } &Header::closebox(); &Header::closebigbox(); &Header::closepage(); exit } elsif ($qossettings{'ACTION'} eq 'Grafische Auswertung') { &Header::openbox('100%', 'left', 'QoS Graphen'); print <Diese Seite braucht je nach Geschwindigkeit des Computers laenger zum Laden. END ; open( FILE, "< $classfile" ) or die "Unable to read $classfile"; @classes = ; close FILE; foreach $classentry (sort @classes) { @classline = split( /\;/, $classentry ); $qossettings{'DEV'}=$classline[0]; $qossettings{'CLASS'}=$classline[1]; &gengraph($qossettings{'DEV'},$qossettings{'CLASS'}); print <$qossettings{'CLASS'} ($qossettings{'DEV'}) END ; } print < END ; &Header::closebox(); &Header::closebigbox(); &Header::closepage(); exit } elsif ($qossettings{'ACTION'} eq 'Parentklasse hinzufuegen') { &parentclass(); &Header::closebigbox(); &Header::closepage(); exit } elsif ($qossettings{'ACTION'} eq 'Unterklasse hinzufuegen') { &subclass(); &Header::closebigbox(); &Header::closepage(); exit } elsif ($qossettings{'ACTION'} eq 'Level7-Regel hinzufuegen') { &level7rule(); &Header::closebigbox(); &Header::closepage(); exit } elsif ($qossettings{'ACTION'} eq 'Port-Regel hinzufuegen') { &portrule(); &Header::closebigbox(); &Header::closepage(); exit } elsif ($qossettings{'ACTION'} eq 'Erweiterte Einstellungen') { &expert(); &Header::closebigbox(); &Header::closepage(); exit } if ($qossettings{'ACTIONBW'} eq 'Andern') { &changebandwidth(); &Header::closebigbox(); &Header::closepage(); exit } if ($qossettings{'ACTIONDEF'} eq 'Andern') { &changedefclasses(); &Header::closebigbox(); &Header::closepage(); exit } &General::readhash("${General::swroot}/qos/settings", \%qossettings); my $status = $Lang::tr{'stopped'}; my $statuscolor = '#993333'; if ( $qossettings{'ENABLED'} eq 'on' ) { $status = $Lang::tr{'running'}; $statuscolor = '#339933'; } if ( $netsettings{'RED_TYPE'} ne 'PPPOE' ) { $qossettings{'RED_DEV'} = $netsettings{'RED_DEV'}; } if ($errormessage) { &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); print "$errormessage\n"; print " \n"; &Header::closebox(); } ############################################################################################################################ ############################################################################################################################ &Header::openbox('100%', 'center', 'Quality of Service'); print < END ; if ( $message ne "" ) { print "
$message"; } print <Quality of Service: $status
END ; if (($qossettings{'OUT_SPD'} ne '') && ($qossettings{'INC_SPD'} ne '')) { print < 
Downloadgeschwindigkeit: $qossettings{'INC_SPD'} kbps
Uploadgeschwindigkeit: $qossettings{'OUT_SPD'} kbps END ; } if (($qossettings{'DEFCLASS_OUT'} ne '') && ($qossettings{'DEFCLASS_INC'} ne '')&& ($qossettings{'ACK'} ne '')) { print <
Downloadstandardklasse: $qossettings{'DEFCLASS_INC'}
Uploadstandardklasse: $qossettings{'DEFCLASS_OUT'}
ACKs: $qossettings{'ACK'}

END ; } print "
"; &Header::closebox(); if ( ($qossettings{'OUT_SPD'} eq '') || ($qossettings{'INC_SPD'} eq '') ) { &changebandwidth(); &Header::closebox(); &Header::closebigbox(); &Header::closepage(); exit } if ( ($qossettings{'DEFCLASS_INC'} eq '') || ($qossettings{'DEFCLASS_OUT'} eq '') || ($qossettings{'ACK'} eq '') ) { &changedefclasses(); &Header::closebigbox(); &Header::closepage(); exit } &showclasses(); &showl7rules(); &showportrules(); &Header::closebigbox(); &Header::closepage(); ############################################################################################################################ ############################################################################################################################ sub changedefclasses { &Header::openbox('100%', 'center', 'Standardklassen:'); print <
Legen sie hier die Standardklassen fest durch die nicht-gefilterte Pakete gehen.
Download: 
Upload: 

Legen sie hier die ACK-Klasse fest
und klicken Sie danach auf Speichern.
ACKs:
END ; &Header::closebox(); } sub changebandwidth { &Header::openbox('100%', 'center', 'Bandbreiteneinstellungen'); if ($qossettings{'ENABLED'} eq 'on') { print "Sie koennen die Bandbreiteneinstellungen nicht bearbeiten, wenn QoS eingeschaltet ist. Schalten sie es zuerst dazu aus.

"; print "Zurueck"; } else { print <
Geben Sie bitte hier ihre Download- bzw. Upload-Geschwindigkeit ein
und klicken Sie danach auf Speichern.
Download-Geschwindigkeit:   kbps  
Upload-Geschwindigkeit:   kbps  
END ; } &Header::closebox(); } sub parentclass { &Header::openbox('100%', 'center', 'Parentklasse'); print < END ; if ( $message ne "" ) { print "
$message"; } if ( $qossettings{'EDIT'} eq 'yes' ) { print ""; print ""; } print <Geben sie die Daten ein
und klicken Sie danach auf Speichern.
Interface: END ; if ( $qossettings{'EDIT'} eq 'yes' ) { print ""; } if ( $qossettings{'DEVICE'} eq $qossettings{'RED_DEV'} ) { $qossettings{'RED_DEV_SEL'} = 'selected'; } elsif ( $qossettings{'DEVICE'} eq $qossettings{'IMQ_DEV'} ) { $qossettings{'IMQ_DEV_SEL'} = 'selected'; } print <$qossettings{'RED_DEV'}  
Klasse: END ; if ( $qossettings{'EDIT'} eq 'yes' ) { print ""; } for ( $c = 100 ; $c <= 120 ; $c++ ) { if ( $qossettings{'CLASS'} ne $c ) { print "\n"; } else { print "\n"; } } for ( $c = 200 ; $c <= 220 ; $c++ ) { if ( $qossettings{'CLASS'} ne $c ) { print "\n"; } else { print "\n"; } } print <  
Prioritaet:
Garantierte Bandbreite:  
Maximale Bandbreite:  
Burst:  
Ceilburst:  
END ; &Header::closebox(); } sub subclass { &Header::openbox('100%', 'center', 'Unterklasse'); print < END ; if ( $message ne "" ) { print "
$message"; } print <Aktuelle Klasse: $qossettings{'CLASS'}
Geben sie die Daten ein
und klicken Sie danach auf Speichern.
Unterklasse: 
Prioritaet:
Garantierte Bandbreite:  
Maximale Bandbreite:  
Burst:  
Ceilburst:  
END ; &Header::closebox(); } sub level7rule { &Header::openbox('100%', 'center', 'Level7-Regel'); print < END ; if ( $message ne "" ) { print "
$message"; } print <Aktuelle Klasse: $qossettings{'CLASS'}
Geben sie die Daten ein
und klicken Sie danach auf Speichern.
Protokoll:  
Quell-IP-Adresse:  
Ziel-IP-Adresse:
END ; &Header::closebox(); } sub portrule { &Header::openbox('100%', 'center', 'Port-Regel hinzufuegen'); print <
Geben sie die Daten ein
und klicken Sie danach auf Speichern.
Protokoll:  
Quell-Port:  
Ziel-Port:  
Quell-IP-Adresse:  
Ziel-IP-Adresse:
END ; &Header::closebox(); } sub showclasses { open( FILE, "< $classfile" ) or die "Unable to read $classfile"; @classes = ; close FILE; if (@classes) { open( FILE, "< $subclassfile" ) or die "Unable to read $subclassfile"; @subclasses = ; close FILE; &Header::openbox('100%', 'center', 'Klassen'); print < Interface Klasse Prioritaet Garantierte Bandbreite Maximale Bandbreite Burst Ceil Burst Aktionen END ; foreach $classentry (sort @classes) { @classline = split( /\;/, $classentry ); if ( $classline[0] eq $qossettings{'RED_DEV'} ) { print <$classline[0] $classline[1] $classline[2] $classline[3] $classline[4] $classline[5] $classline[6]
END ; foreach $subclassentry (sort @subclasses) { @subclassline = split( /\;/, $subclassentry ); if ( $subclassline[1] eq $classline[1] ) { print <Subklasse: $subclassline[2] $subclassline[3] $subclassline[4] $subclassline[5] $subclassline[6] $subclassline[7]
END ; } } } } print "\t"; foreach $classentry (sort @classes) { @classline = split( /\;/, $classentry ); if ( $classline[0] eq $qossettings{'IMQ_DEV'} ) { print <$classline[0] $classline[1] $classline[2] $classline[3] $classline[4] $classline[5] $classline[6]
END ; foreach $subclassentry (sort @subclasses) { @subclassline = split( /\;/, $subclassentry ); if ( $subclassline[1] eq $classline[1] ) { print <Subklasse: $subclassline[2] $subclassline[3] $subclassline[4] $subclassline[5] $subclassline[6] $subclassline[7]
END ; } } } } print <Legende:   Klasse bearbeiten |  Unterklasse hinzufuegen |  Level7-Regel hinzufuegen |  Port-Regel hinzufuegen |  Klasse loeschen   END ; &Header::closebox(); } } sub showl7rules { open( FILE, "< $level7file" ) or die "Unable to read $level7file"; @l7rules = ; close FILE; if (@l7rules) { &Header::openbox('100%', 'center', 'Level7-Regeln'); print < Interface Klasse Protokoll Quell-IP-Adresse Ziel-IP-Adresse Aktionen END ; foreach $l7ruleentry (sort @l7rules) { @l7ruleline = split( /\;/, $l7ruleentry ); if ( $l7ruleline[1] eq $qossettings{'RED_DEV'} ) { print <$l7ruleline[1] $l7ruleline[0] $l7ruleline[2] $l7ruleline[3] $l7ruleline[4]
END ; } } print "\t"; foreach $l7ruleentry (sort @l7rules) { @l7ruleline = split( /\;/, $l7ruleentry ); if ( $l7ruleline[1] eq $qossettings{'IMQ_DEV'} ) { print <$l7ruleline[1] $l7ruleline[0] $l7ruleline[2] $l7ruleline[3] $l7ruleline[4]
END ; } } print <Legende:   Regel bearbeiten |  Regel loeschen   END ; &Header::closebox(); } } sub showportrules { open( FILE, "< $portfile" ) or die "Unable to read $portfile"; @portrules = ; close FILE; if (@portrules) { &Header::openbox('100%', 'center', 'Port-Regeln'); print < Interface Klasse Protokoll Quell-IP-Adresse Quell-Port Ziel-IP-Adresse Ziel-Port Aktionen END ; foreach $portruleentry (sort @portrules) { @portruleline = split( /\;/, $portruleentry ); if ( $portruleline[1] eq $qossettings{'RED_DEV'} ) { print <$portruleline[1] $portruleline[0] $portruleline[2] $portruleline[3] $portruleline[4] $portruleline[5] $portruleline[6]
END ; } } print "\t"; foreach $portruleentry (sort @portrules) { @portruleline = split( /\;/, $portruleentry ); if ( $portruleline[1] eq $qossettings{'IMQ_DEV'} ) { print <$portruleline[1] $portruleline[0] $portruleline[2] $portruleline[3] $portruleline[4] $portruleline[5] $portruleline[6]
END ; } } print <Legende:   Regel bearbeiten |  Regel loeschen   END ; &Header::closebox(); } } sub expert { &Header::openbox('100%', 'center', 'Expertenoptionen:'); print <
Diese Einstellungen sollten sie nur veraendern, wenn sie wirklich wissen, was sie tun.
Download-Rate 90\%:  
Upload-Rate 90\%:  


MTU: Diese Einstellung aendert die MTU nicht global sondern nur fuer das QoS.
Queue Laenge:  
SFQ Perturb:
END ; &Header::closebox(); } sub validminbwdth { if ( $qossettings{'VALID'} eq 'yes' ) { if ( $qossettings{'DEVICE'} eq $qossettings{'RED_DEV'} ) { $qossettings{'SPD'} = $qossettings{'OUT_SPD'}; } elsif ( $qossettings{'DEVICE'} eq $qossettings{'IMQ_DEV'} ) { $qossettings{'SPD'} = $qossettings{'INC_SPD'}; } unless ( ( $qossettings{'MINBDWTH'} >= 0 ) && ( $qossettings{'MINBDWTH'} <= $qossettings{'SPD'} ) ) { $qossettings{'VALID'} = 'no'; $message = "Mindestbandbreite ist ungueltig."; } $qossettings{'SPD'} = ''; } } sub validmaxbwdth { if ( $qossettings{'VALID'} eq 'yes' ) { if ( $qossettings{'DEVICE'} eq $qossettings{'RED_DEV'} ) { $qossettings{'SPD'} = $qossettings{'OUT_SPD'}; } elsif ( $qossettings{'DEVICE'} eq $qossettings{'IMQ_DEV'} ) { $qossettings{'SPD'} = $qossettings{'INC_SPD'}; } unless ( ( $qossettings{'MAXBDWTH'} >= 0 ) && ($qossettings{'MAXBDWTH'} >= $qossettings{'MINBDWTH'}) &&( $qossettings{'MAXBDWTH'} <= $qossettings{'SPD'} ) ) { $qossettings{'VALID'} = 'no'; $message = "Mamimalbandbreite ist ungueltig."; } $qossettings{'SPD'} = ''; } } sub validclass { if ( $qossettings{'VALID'} eq 'yes' ) { 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."; } } elsif ( $qossettings{'DEVICE'} eq $qossettings{'IMQ_DEV'} ) { if ($qossettings{'CLASS'} lt 200 || $qossettings{'CLASS'} ge 221) { $qossettings{'VALID'} = 'no'; $message = "Die Klassennummer passt nicht zum angegebenen Interface."; } } open( FILE, "< $classfile" ) or die "Unable to read $classfile"; @tmp = ; close FILE; foreach $classentry (sort @tmp) { @tmpline = split( /\;/, $classentry ); if ( $tmpline[1] eq $qossettings{'CLASS'} ) { $qossettings{'VALID'} = 'no'; $message = "Die aktuelle Klasse wird bereits verwendet."; last } } } } sub validsubclass { if ( $qossettings{'VALID'} eq 'yes' ) { open( FILE, "< $subclassfile" ) or die "Unable to read $subclassfile"; @tmp = ; close FILE; foreach $subclassentry (sort @tmp) { @tmpline = split( /\;/, $subclassentry ); if ( $tmpline[2] eq $qossettings{'SCLASS'} ) { $qossettings{'VALID'} = 'no'; $message = "Die aktuelle Klasse wird bereits verwendet."; last } } } } sub gengraph { $qossettings{'DEV'} = shift; $qossettings{'CLASS'} = shift; my $ERROR=""; if ( $qossettings{'DEV'} eq $qossettings{'RED_DEV'} ) { $qossettings{'CLASSPRFX'} = '1'; } else { $qossettings{'CLASSPRFX'} = '2'; } RRDs::graph ("/home/httpd/html/graphs/class_$qossettings{'CLASSPRFX'}-$qossettings{'CLASS'}_$qossettings{'DEV'}-packets.png", "--start", "-3240", "-aPNG", "-i", "-z", "--alt-y-grid", "-w 800", "-h 150", "-r", "--color", "SHADEA#EAE9EE", "--color", "SHADEB#EAE9EE", "--color", "BACK#FFFFFF", "-t $qossettings{'CLASS'} ($qossettings{'DEV'})", "DEF:pkts=/var/log/rrd/class_$qossettings{'CLASSPRFX'}-$qossettings{'CLASS'}_$qossettings{'DEV'}.rrd:pkts:AVERAGE", "DEF:dropped=/var/log/rrd/class_$qossettings{'CLASSPRFX'}-$qossettings{'CLASS'}_$qossettings{'DEV'}.rrd:dropped:AVERAGE", "DEF:overlimits=/var/log/rrd/class_$qossettings{'CLASSPRFX'}-$qossettings{'CLASS'}_$qossettings{'DEV'}.rrd:overlimits:AVERAGE", "AREA:pkts#00FFFF:packets", "GPRINT:pkts:LAST:total packets\\:%8.3lf %s packets\\j", "LINE3:dropped#FF0000:dropped", "GPRINT:dropped:LAST:dropped packets\\:%8.3lf %s packets\\j", "LINE3:overlimits#0000FF:overlimits", "GPRINT:overlimits:LAST:overlimits\\:%8.3lf %s packets\\j", ); $ERROR = RRDs::error; print "$ERROR"; RRDs::graph ("/home/httpd/html/graphs/class_$qossettings{'CLASSPRFX'}-$qossettings{'CLASS'}_$qossettings{'DEV'}-borrowed.png", "--start", "-3240", "-aPNG", "-i", "-z", "--alt-y-grid", "-w 800", "-h 150", "-r", "--color", "SHADEA#EAE9EE", "--color", "SHADEB#EAE9EE", "--color", "BACK#FFFFFF", "-t $qossettings{'CLASS'} ($qossettings{'DEV'})", "DEF:lended=/var/log/rrd/class_$qossettings{'CLASSPRFX'}-$qossettings{'CLASS'}_$qossettings{'DEV'}.rrd:lended:AVERAGE", "DEF:borrowed=/var/log/rrd/class_$qossettings{'CLASSPRFX'}-$qossettings{'CLASS'}_$qossettings{'DEV'}.rrd:borrowed:AVERAGE", "DEF:giants=/var/log/rrd/class_$qossettings{'CLASSPRFX'}-$qossettings{'CLASS'}_$qossettings{'DEV'}.rrd:giants:AVERAGE", "AREA:lended#99ff99:lended", "GPRINT:lended:LAST:lended\\:%8.3lf %s packets\\j", "LINE3:borrowed#f70566:borrowed", "GPRINT:borrowed:LAST:borrowed\\:%8.3lf %s packets\\j", "LINE3:giants#05ad05:giants", "GPRINT:giants:LAST:giants\\:%8.3lf %s packets\\j", ); $ERROR = RRDs::error; print "$ERROR"; RRDs::graph ("/home/httpd/html/graphs/class_$qossettings{'CLASSPRFX'}-$qossettings{'CLASS'}_$qossettings{'DEV'}-bytes.png", "--start", "-3240", "-aPNG", "-i", "-z", "--alt-y-grid", "-w 800", "-h 150", "-r", "--color", "SHADEA#EAE9EE", "--color", "SHADEB#EAE9EE", "--color", "BACK#FFFFFF", "-t $qossettings{'CLASS'} ($qossettings{'DEV'})", "DEF:bits=/var/log/rrd/class_$qossettings{'CLASSPRFX'}-$qossettings{'CLASS'}_$qossettings{'DEV'}.rrd:bits:AVERAGE", "DEF:bytes=/var/log/rrd/class_$qossettings{'CLASSPRFX'}-$qossettings{'CLASS'}_$qossettings{'DEV'}.rrd:bytes:AVERAGE", "CDEF:kbytes=bytes,1024,/", "CDEF:kbits=bits,1024,/,8,/", "AREA:kbytes#FFBE7D:kbytes", "GPRINT:kbytes:LAST:rate\\: %8.3lf kbytes\\j", "GPRINT:kbits:LAST:rate\\:%8.2lf kbits\\r", ); $ERROR = RRDs::error; print "$ERROR"; }