my $c = "";
my $direntry = "";
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 @tosruleline = ();
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";
my $tosfile = "/var/ipfire/qos/tosconfig";
open( FILE, "< $classfile" ) or die "Unable to read $classfile";
@classes = <FILE>;
close FILE;
+open( FILE, "< $subclassfile" ) or die "Unable to read $subclassfile";
+@subclasses = <FILE>;
+close FILE;
open( FILE, "< $level7file" ) or die "Unable to read $level7file";
@l7rules = <FILE>;
close FILE;
print "\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];
+ $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)
print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 1:$qossettings{'CLASS'} handle $qossettings{'CLASS'}: fq_codel $fqcodel_options\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'}: fq_codel $fqcodel_options\n";
+ }
+}
print <<END
### ADD QOS-OUT CHAIN TO THE MANGLE TABLE IN IPTABLES
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)
print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 2:$qossettings{'CLASS'} handle $qossettings{'CLASS'}: fq_codel $fqcodel_options\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'}: fq_codel $fqcodel_options\n";
+ }
+}
+
print <<END
### ADD QOS-INC CHAIN TO THE MANGLE TABLE IN IPTABLES
print "\tiptables -t mangle -A QOS-TOS -m mark --mark $qossettings{'CLASS'} -j RETURN\n";
}
}
+ foreach $subclassentry (sort @subclasses)
+ {
+ @subclassline = split( /\;/, $subclassentry );
+ $qossettings{'SUBCLASS'} = $subclassline[1];
+ $qossettings{'TOS'} = $subclassline[8];
+ $qossettings{'TOS'} = abs $qossettings{'TOS'} * 2;
+ if ($qossettings{'TOS'} ne "0") {
+ print "\tiptables -t mangle -A QOS-TOS -m mark --mark $qossettings{'SUBCLASS'} -j TOS --set-tos $qossettings{'TOS'}\n";
+ print "\tiptables -t mangle -A QOS-TOS -m mark --mark $qossettings{'SUBCLASS'} -j RETURN\n";
+ }
+ }
print <<END
WARNING: translation string unused: Remote IP
WARNING: translation string unused: Remote VPN IP
WARNING: translation string unused: Resolv
-WARNING: translation string unused: Subclass
WARNING: translation string unused: TOS Bits
WARNING: translation string unused: Verbose
WARNING: translation string unused: access allowed
WARNING: translation string unused: add network
WARNING: translation string unused: add new ovpn
WARNING: translation string unused: add service
-WARNING: translation string unused: add subclass
WARNING: translation string unused: add xtaccess
WARNING: translation string unused: add-route
WARNING: translation string unused: addon
WARNING: translation string unused: cfg restart
WARNING: translation string unused: check for net traffic update
WARNING: translation string unused: choose config
-WARNING: translation string unused: class in use
WARNING: translation string unused: clear cache
WARNING: translation string unused: compression
WARNING: translation string unused: connect
WARNING: translation string unused: proxy no proxy local
WARNING: translation string unused: proxy port
WARNING: translation string unused: psk
-WARNING: translation string unused: qos add subclass
WARNING: translation string unused: reboot ask
WARNING: translation string unused: reboot question
WARNING: translation string unused: reboot schedule
WARNING: untranslated string: Scan for Songs = unknown string
WARNING: untranslated string: Scan from Directory = Scan from directory
WARNING: untranslated string: Set time on boot = Force setting the system clock on boot
+WARNING: untranslated string: Subclass = Subclass
WARNING: untranslated string: TOS Rule = TOS-Rule
WARNING: untranslated string: TOS rule = TOS rule
WARNING: untranslated string: The class number does not match the specified interface. = The class number does not match the specified interface.
WARNING: untranslated string: add new lease = Add a new fixed lease
WARNING: untranslated string: add printer = Add printer
WARNING: untranslated string: add share = Add share
+WARNING: untranslated string: add subclass = Add subclass
WARNING: untranslated string: add user = Add user
WARNING: untranslated string: added from dhcp lease list = Added from DHCP lease list
WARNING: untranslated string: addons = Addons
WARNING: untranslated string: check vpn lr = Check
WARNING: untranslated string: cipher = Encryption:
WARNING: untranslated string: city = City
+WARNING: untranslated string: class in use = The class is already in use.
WARNING: untranslated string: clear playlist = Empty playlist
WARNING: untranslated string: clenabled = Provide time to local network
WARNING: untranslated string: click to disable = Enabled (click to disable)
WARNING: untranslated string: ptr = PTR
WARNING: untranslated string: pulse = Pulse
WARNING: untranslated string: pulse dial = Pulse dial:
+WARNING: untranslated string: qos add subclass = Add subclass
WARNING: untranslated string: qos enter bandwidths = You will need to enter your downstream and upstream bandwidth!
WARNING: untranslated string: qos graphs = Qos Graphs
WARNING: untranslated string: qos warning = The rule <strong>must</strong> be saved, otherwise it will be discarded!
WARNING: translation string unused: Remote IP
WARNING: translation string unused: Remote VPN IP
WARNING: translation string unused: Resolv
-WARNING: translation string unused: Subclass
WARNING: translation string unused: TOS Bits
WARNING: translation string unused: Verbose
WARNING: translation string unused: access allowed
WARNING: translation string unused: add network
WARNING: translation string unused: add new ovpn
WARNING: translation string unused: add service
-WARNING: translation string unused: add subclass
WARNING: translation string unused: add xtaccess
WARNING: translation string unused: add-route
WARNING: translation string unused: admin user password has been changed
WARNING: translation string unused: check for net traffic update
WARNING: translation string unused: choose config
WARNING: translation string unused: choose media
-WARNING: translation string unused: class in use
WARNING: translation string unused: clear cache
WARNING: translation string unused: compression
WARNING: translation string unused: connect
WARNING: translation string unused: proxy no proxy local
WARNING: translation string unused: proxy port
WARNING: translation string unused: psk
-WARNING: translation string unused: qos add subclass
WARNING: translation string unused: quick control
WARNING: translation string unused: reboot ask
WARNING: translation string unused: reboot question
WARNING: translation string unused: Remote IP
WARNING: translation string unused: Remote VPN IP
WARNING: translation string unused: Resolv
-WARNING: translation string unused: Subclass
WARNING: translation string unused: TOS Bits
WARNING: translation string unused: Verbose
WARNING: translation string unused: access allowed
WARNING: translation string unused: add network
WARNING: translation string unused: add new ovpn
WARNING: translation string unused: add service
-WARNING: translation string unused: add subclass
WARNING: translation string unused: add xtaccess
WARNING: translation string unused: add-route
WARNING: translation string unused: admin user password has been changed
WARNING: translation string unused: check for net traffic update
WARNING: translation string unused: choose config
WARNING: translation string unused: choose media
-WARNING: translation string unused: class in use
WARNING: translation string unused: clear cache
WARNING: translation string unused: compression
WARNING: translation string unused: connect
WARNING: translation string unused: proxy no proxy local
WARNING: translation string unused: proxy port
WARNING: translation string unused: psk
-WARNING: translation string unused: qos add subclass
WARNING: translation string unused: quick control
WARNING: translation string unused: reboot ask
WARNING: translation string unused: reboot question
WARNING: translation string unused: Remote IP
WARNING: translation string unused: Remote VPN IP
WARNING: translation string unused: Resolv
-WARNING: translation string unused: Subclass
WARNING: translation string unused: TOS Bits
WARNING: translation string unused: Verbose
WARNING: translation string unused: access allowed
WARNING: translation string unused: add network
WARNING: translation string unused: add new ovpn
WARNING: translation string unused: add service
-WARNING: translation string unused: add subclass
WARNING: translation string unused: add xtaccess
WARNING: translation string unused: add-route
WARNING: translation string unused: admin user password has been changed
WARNING: translation string unused: check for net traffic update
WARNING: translation string unused: choose config
WARNING: translation string unused: choose media
-WARNING: translation string unused: class in use
WARNING: translation string unused: clear cache
WARNING: translation string unused: compression
WARNING: translation string unused: connect
WARNING: translation string unused: proxy no proxy local
WARNING: translation string unused: proxy port
WARNING: translation string unused: psk
-WARNING: translation string unused: qos add subclass
WARNING: translation string unused: quick control
WARNING: translation string unused: reboot ask
WARNING: translation string unused: reboot question
WARNING: translation string unused: Remote IP
WARNING: translation string unused: Remote VPN IP
WARNING: translation string unused: Resolv
-WARNING: translation string unused: Subclass
WARNING: translation string unused: TOS Bits
WARNING: translation string unused: Verbose
WARNING: translation string unused: access allowed
WARNING: translation string unused: add network
WARNING: translation string unused: add new ovpn
WARNING: translation string unused: add service
-WARNING: translation string unused: add subclass
WARNING: translation string unused: add xtaccess
WARNING: translation string unused: add-route
WARNING: translation string unused: admin user password has been changed
WARNING: translation string unused: check for net traffic update
WARNING: translation string unused: choose config
WARNING: translation string unused: choose media
-WARNING: translation string unused: class in use
WARNING: translation string unused: clear cache
WARNING: translation string unused: compression
WARNING: translation string unused: connect
WARNING: translation string unused: proxy no proxy local
WARNING: translation string unused: proxy port
WARNING: translation string unused: psk
-WARNING: translation string unused: qos add subclass
WARNING: translation string unused: quick control
WARNING: translation string unused: reboot ask
WARNING: translation string unused: reboot question
WARNING: translation string unused: Remote IP
WARNING: translation string unused: Remote VPN IP
WARNING: translation string unused: Resolv
-WARNING: translation string unused: Subclass
WARNING: translation string unused: TOS Bits
WARNING: translation string unused: Verbose
WARNING: translation string unused: access allowed
WARNING: translation string unused: add network
WARNING: translation string unused: add new ovpn
WARNING: translation string unused: add service
-WARNING: translation string unused: add subclass
WARNING: translation string unused: add xtaccess
WARNING: translation string unused: add-route
WARNING: translation string unused: admin user password has been changed
WARNING: translation string unused: check for net traffic update
WARNING: translation string unused: choose config
WARNING: translation string unused: choose media
-WARNING: translation string unused: class in use
WARNING: translation string unused: clear cache
WARNING: translation string unused: compression
WARNING: translation string unused: connect
WARNING: translation string unused: proxy no proxy local
WARNING: translation string unused: proxy port
WARNING: translation string unused: psk
-WARNING: translation string unused: qos add subclass
WARNING: translation string unused: quick control
WARNING: translation string unused: reboot ask
WARNING: translation string unused: reboot question
WARNING: translation string unused: Remote IP
WARNING: translation string unused: Remote VPN IP
WARNING: translation string unused: Resolv
-WARNING: translation string unused: Subclass
WARNING: translation string unused: TOS Bits
WARNING: translation string unused: Verbose
WARNING: translation string unused: access allowed
WARNING: translation string unused: add network
WARNING: translation string unused: add new ovpn
WARNING: translation string unused: add service
-WARNING: translation string unused: add subclass
WARNING: translation string unused: add xtaccess
WARNING: translation string unused: add-route
WARNING: translation string unused: admin user password has been changed
WARNING: translation string unused: check for net traffic update
WARNING: translation string unused: choose config
WARNING: translation string unused: choose media
-WARNING: translation string unused: class in use
WARNING: translation string unused: clear cache
WARNING: translation string unused: compression
WARNING: translation string unused: connect
WARNING: translation string unused: proxy no proxy local
WARNING: translation string unused: proxy port
WARNING: translation string unused: psk
-WARNING: translation string unused: qos add subclass
WARNING: translation string unused: quick control
WARNING: translation string unused: reboot ask
WARNING: translation string unused: reboot question
WARNING: translation string unused: Remote IP
WARNING: translation string unused: Remote VPN IP
WARNING: translation string unused: Resolv
-WARNING: translation string unused: Subclass
WARNING: translation string unused: TOS Bits
WARNING: translation string unused: Verbose
WARNING: translation string unused: access allowed
WARNING: translation string unused: add network
WARNING: translation string unused: add new ovpn
WARNING: translation string unused: add service
-WARNING: translation string unused: add subclass
WARNING: translation string unused: add xtaccess
WARNING: translation string unused: add-route
WARNING: translation string unused: admin user password has been changed
WARNING: translation string unused: check for net traffic update
WARNING: translation string unused: choose config
WARNING: translation string unused: choose media
-WARNING: translation string unused: class in use
WARNING: translation string unused: clear cache
WARNING: translation string unused: compression
WARNING: translation string unused: connect
WARNING: translation string unused: proxy no proxy local
WARNING: translation string unused: proxy port
WARNING: translation string unused: psk
-WARNING: translation string unused: qos add subclass
WARNING: translation string unused: quick control
WARNING: translation string unused: reboot ask
WARNING: translation string unused: reboot question
my $c = "";
my $direntry = "";
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 %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";
$qossettings{'PRIO'} = '';
$qossettings{'SPD'} = '';
$qossettings{'CLASS'} = '';
+$qossettings{'SCLASS'} = '';
$qossettings{'QPORT'} = '';
$qossettings{'DPORT'} = '';
$qossettings{'QIP'} = '';
$qossettings{'BURST'} = '';
$qossettings{'CBURST'} = '';
$qossettings{'DOCLASS'} = '';
+$qossettings{'DOSCLASS'} = '';
$qossettings{'DOLEVEL7'} = '';
$qossettings{'DOPORT'} = '';
$qossettings{'CLASS'} = '';
}
}
close FILE;
+ open( FILE, "< $subclassfile" ) or die "Unable to read $classfile";
+ @tmp = <FILE>;
+ 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 = "$Lang::tr{'Class'} $qossettings{'CLASS'} $Lang::tr{'Class was deleted'}";
}
############################################################################################################################
############################################################################################################################
+if ($qossettings{'DOSCLASS'} eq $Lang::tr{'save'})
+{
+ &validsubclass();
+ &validminbwdth();
+ if ( $qossettings{'VALID'} eq 'yes' ) {
+ open( FILE, ">> $subclassfile" ) or die "Unable to write $subclassfile";
+ print FILE <<END
+$qossettings{'DEVICE'};$qossettings{'CLASS'};$qossettings{'SCLASS'};$qossettings{'PRIO'};$qossettings{'MINBWDTH'};$qossettings{'MAXBWDTH'};$qossettings{'BURST'};$qossettings{'CBURST'};$qossettings{'TOS'};
+END
+;
+ close FILE;
+ } else {
+ $qossettings{'ACTION'} = $Lang::tr{'qos add subclass'};
+ }
+} elsif ($qossettings{'DOSCLASS'} eq $Lang::tr{'delete'})
+{
+ open( FILE, "< $subclassfile" ) or die "Unable to read $classfile";
+ @tmp = <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 = "$Lang::tr{'Subclass'} $qossettings{'CLASS'} $Lang::tr{'was deleted'}.";
+}
+
+############################################################################################################################
+############################################################################################################################
+
if ($qossettings{'DOLEVEL7'} eq $Lang::tr{'save'})
{
if ( $qossettings{'QIP'} ne '' ) {
&Header::closepage();
exit
}
+elsif ($qossettings{'ACTION'} eq $Lang::tr{'qos add subclass'})
+{
+ &subclass();
+ &Header::closebigbox();
+ &Header::closepage();
+ exit
+}
elsif ($qossettings{'ACTION'} eq $Lang::tr{'Add Rule'})
{
&Header::openbox('100%', 'center', $Lang::tr{'Add Rule'});
&Header::closebox();
}
+sub subclass {
+ &Header::openbox('100%', 'center', $Lang::tr{'Subclass'});
+ print <<END
+ <form method='post' action='$ENV{'SCRIPT_NAME'}'>
+ <table width='66%'>
+END
+;
+ if ( $message ne "" ) {
+ print "<tr><td colspan='3' align='center'>$message";
+ }
+ print <<END
+ <tr><td colspan='3' width='100%'>$Lang::tr{'current class'}: $qossettings{'CLASS'}
+ <tr><td width='100%' colspan='3'>$Lang::tr{'enter data'}
+ <tr><td width='33%' align='right'>$Lang::tr{'Subclass'}:<td width='33%' align='left'><select name='SCLASS'>
+END
+;
+ if ($qossettings{'CLASS'} >= 100 && $qossettings{'CLASS'} < 121) {
+ $qossettings{'DEVICE'} = $qossettings{'RED_DEV'};
+ for ( $c = 1000 ; $c <= 1020 ; $c++ )
+ {
+ if ( $qossettings{'SCLASS'} ne $c )
+ { print "<option value='$c'>$c</option>\n"; }
+ else { print "<option selected value='$c'>$c</option>\n"; }
+ }
+ } elsif ($qossettings{'CLASS'} >= 200 && $qossettings{'CLASS'} < 221) {
+ $qossettings{'DEVICE'} = $qossettings{'IMQ_DEV'};
+ for ( $c = 2000 ; $c <= 2020 ; $c++ )
+ {
+ if ( $qossettings{'SCLASS'} ne $c )
+ { print "<option value='$c'>$c</option>\n"; }
+ else { print "<option selected value='$c'>$c</option>\n"; }
+ }
+ }
+ print <<END
+ </select>
+ <td width='33%' align='center'>
+ <tr><td width='33%' align='right'>$Lang::tr{'priority'}:<td width='33%' align='left'><select name='PRIO'>
+END
+;
+ for ( $c = 1 ; $c <= 7 ; $c++ )
+ {
+ if ( $qossettings{'PRIO'} ne $c )
+ { print "<option value='$c'>$c</option>\n"; }
+ else { print "<option selected value='$c'>$c</option>\n"; }
+ }
+ print <<END
+ <td width='33%' align='center'>
+ <tr><td width='33%' align='right'>$Lang::tr{'guaranteed bandwith'}:
+ <td width='33%' align='left'><input type='text' name='MINBWDTH' maxlength='8' required='1' value="$qossettings{'MINBWDTH'}" />
+ <td width='33%' align='center'>
+ <tr><td width='33%' align='right'>$Lang::tr{'max bandwith'}:
+ <td width='33%' align='left'><input type='text' name='MAXBWDTH' maxlength='8' required='1' value="$qossettings{'MAXBWDTH'}" />
+ <td width='33%' align='center'>
+ <tr><td width='33%' align='right'>Burst:
+ <td width='33%' align='left'><input type='text' name='BURST' maxlength='8' value="$qossettings{'BURST'}" />
+ <td width='33%' align='center'>
+ <tr><td width='33%' align='right'>Ceilburst:
+ <td width='33%' align='left'><input type='text' name='CBURST' maxlength='8' value="$qossettings{'CBURST'}" />
+ <td width='33%' align='center'>
+ <tr><td width='33%' align='right'>TOS-Bit:
+ <td width='33%' align='left'><select name='TOS'>
+ <option value='0'>$Lang::tr{'disabled'} (0)</option>
+ <option value='8'>$Lang::tr{'min delay'} (8)</option>
+ <option value='4'>$Lang::tr{'max throughput'} (4)</option>
+ <option value='2'>$Lang::tr{'max reliability'} (2)</option>
+ <option value='1'>$Lang::tr{'min costs'} (1)</option></select>
+ <td width='33%' align='center'><input type='hidden' name='CLASS' value="$qossettings{'CLASS'}" />
+ <input type='hidden' name='DEVICE' value="$qossettings{'DEVICE'}" />
+ <input type='submit' name='DOSCLASS' value='$Lang::tr{'save'}' /> <input type='reset' value='$Lang::tr{'reset'}' />
+ </table></form>
+END
+;
+ &Header::closebox();
+}
+
sub level7rule {
&Header::openbox('100%', 'center', $Lang::tr{'Level7 Rule'});
print <<END
@classes = <FILE>;
close FILE;
if (@classes) {
+ open( FILE, "< $subclassfile" ) or die "Unable to read $subclassfile";
+ @subclasses = <FILE>;
+ close FILE;
open( FILE, "< $level7file" ) or die "Unable to read $level7file";
@l7rules = <FILE>;
close FILE;
<td align='center' bgcolor='$color{'color22'}'>$classline[7]</td>
<td align='right' bgcolor='$color{'color22'}'>
<table border='0'><tr>
+ <td><form method='post' action='$ENV{'SCRIPT_NAME'}'>
+ <input type='hidden' name='CLASS' value='$classline[1]' />
+ <input type='hidden' name='ACTION' value='$Lang::tr{'qos add subclass'}' />
+ <input type='image' alt='$Lang::tr{'add subclass'}' title='$Lang::tr{'add subclass'}' src='/images/addblue.gif' />
+ </form>
<td><form method='post' action='$ENV{'SCRIPT_NAME'}'>
<input type='hidden' name='CLASS' value='$classline[1]' />
<input type='hidden' name='ACTION' value='$Lang::tr{'Add Rule'}' />
}
END
;
+ foreach $subclassentry (sort @subclasses)
+ {
+ @subclassline = split( /\;/, $subclassentry );
+ if ( $subclassline[1] eq $classline[1] ) {
+ print <<END
+ <tr><td align='center' bgcolor='#FAFAFA'>$Lang::tr{'Subclass'}:
+ <td align='center' bgcolor='#FAFAFA'>$subclassline[2]
+ <td align='center' bgcolor='#FAFAFA'>$subclassline[3]
+ <td align='center' bgcolor='#FAFAFA'>$subclassline[4]
+ <td align='center' bgcolor='#FAFAFA'>$subclassline[5]
+ <td align='center' bgcolor='#FAFAFA'>$subclassline[6]
+ <td align='center' bgcolor='#FAFAFA'>$subclassline[7]
+ <td align='center' bgcolor='#FAFAFA'>$subclassline[8]
+ <td align='right' bgcolor='#FAFAFA'>
+ <table border='0'><tr>
+ <td><form method='post' action='$ENV{'SCRIPT_NAME'}'>
+ <input type='hidden' name='CLASS' value='$subclassline[2]' />
+ <input type='hidden' name='ACTION' value='$Lang::tr{'Add Rule'}' />
+ <input type='image' alt='$Lang::tr{'Add Rule'}' title='$Lang::tr{'Add Rule'}' src='/images/addgreen.gif' />
+ </form>
+ <td><form method='post' action='$ENV{'SCRIPT_NAME'}'>
+ <input type='hidden' name='CLASS' value='$subclassline[2]' />
+ <input type='hidden' name='DOSCLASS' value='$Lang::tr{'edit'}' />
+ <input type='image' alt='$Lang::tr{'edit'}' title='$Lang::tr{'edit'}' src='/images/edit.gif' />
+ </form>
+ <td><form method='post' action='$ENV{'SCRIPT_NAME'}'>
+ <input type='hidden' name='CLASS' value='$subclassline[2]' />
+ <input type='hidden' name='DOSCLASS' value='$Lang::tr{'delete'}' />
+ <input type='image' alt='$Lang::tr{'delete'}' title='$Lang::tr{'delete'}' src='/images/delete.gif' />
+ </form>
+ </table>
+END
+;
+ }
+ }
print <<END
</table>
END
}
}
}
+
+sub validsubclass {
+ if ( $qossettings{'VALID'} eq 'yes' ) {
+ open( FILE, "< $subclassfile" ) or die "Unable to read $subclassfile";
+ @tmp = <FILE>;
+ close FILE;
+ foreach $subclassentry (sort @tmp)
+ {
+ @tmpline = split( /\;/, $subclassentry );
+ if ( $tmpline[2] eq $qossettings{'SCLASS'} )
+ {
+ $qossettings{'VALID'} = 'no';
+ $message = "$Lang::tr{'class in use'}";
+ last
+ }
+ }
+ }
+}