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 '' ) {
- unless ( &General::validip($qossettings{'QIP'}) ) {
+ if ((!&General::validipandmask($qossettings{'QIP'})) && (!&General::validip($qossettings{'QIP'}))) {
$qossettings{'VALID'} = 'no';
$message = $Lang::tr{'The source IP address is invalid.'};
}
}
if ( $qossettings{'DIP'} ne '' ) {
- unless ( &General::validip($qossettings{'DIP'}) ) {
+ if ((!&General::validipandmask($qossettings{'DIP'})) && (!&General::validip($qossettings{'DIP'}))) {
$qossettings{'VALID'} = 'no';
$message = $Lang::tr{'The destination IP address is invalid.'};
}
if ($qossettings{'DOPORT'} eq $Lang::tr{'save'})
{
if ( $qossettings{'QIP'} ne '' ) {
- unless ( &General::validip($qossettings{'QIP'}) ) {
+ if ((!&General::validipandmask($qossettings{'QIP'})) && (!&General::validip($qossettings{'QIP'}))) {
$qossettings{'VALID'} = 'no';
- $message = "$Lang::tr{'The source IP address is invalid.'}";
+ $message = $Lang::tr{'The source IP address is invalid.'};
}
}
if ( $qossettings{'DIP'} ne '' ) {
- unless ( &General::validip($qossettings{'DIP'}) ) {
+ if ((!&General::validipandmask($qossettings{'DIP'})) && (!&General::validip($qossettings{'DIP'}))) {
$qossettings{'VALID'} = 'no';
- $message = "$Lang::tr{'The destination IP address is invalid.'}";
+ $message = $Lang::tr{'The destination IP address is invalid.'};
}
}
if ($qossettings{'CLASS'} >= 100 && $qossettings{'CLASS'} < 121) {
$qossettings{'ENABLED'} = 'on';
&General::writehash("${General::swroot}/qos/settings", \%qossettings);
system("/usr/local/bin/qosctrl generate >/dev/null 2>&1");
- system("/usr/bin/touch /var/ipfire/qos/enable");
system("/usr/local/bin/qosctrl start >/dev/null 2>&1");
system("logger -t ipfire 'QoS started'");
}
elsif ($qossettings{'ACTION'} eq $Lang::tr{'stop'})
{
- system("/usr/local/bin/qosctrl stop >/dev/null 2>&1");
- unlink "/var/ipfire/qos/bin/qos.sh";
- unlink "/var/ipfire/qos/enable";
- system("logger -t ipfire 'QoS stopped'");
$qossettings{'ENABLED'} = 'off';
&General::writehash("${General::swroot}/qos/settings", \%qossettings);
+ system("/usr/local/bin/qosctrl stop >/dev/null 2>&1");
+ system("/usr/local/bin/qosctrl generate >/dev/null 2>&1");
+ system("logger -t ipfire 'QoS stopped'");
}
elsif ($qossettings{'ACTION'} eq $Lang::tr{'restart'})
{
}
open( FILE, "> $classfile" ) or die "Unable to write $classfile";
print FILE <<END
-imq0;200;1;$DOWN[10];$DOWN[1];;;8;VoIP;
+imq0;200;1;$DOWN[20];$DOWN[1];;;8;VoIP;
imq0;203;4;$DOWN[20];$DOWN[1];;;0;VPN;
imq0;204;5;$DOWN[20];$DOWN[1];;;8;Webtraffic;
imq0;210;6;1;$DOWN[1];;;0;Default;
imq0;220;7;1;$DOWN[1];;;1;P2P;
-$qossettings{'RED_DEV'};101;1;$UP[2];$UP[1];;;8;ACKs;
-$qossettings{'RED_DEV'};102;2;$UP[3];$UP[1];;;8;VoIP;
+$qossettings{'RED_DEV'};101;1;$UP[10];$UP[1];;;8;ACKs;
+$qossettings{'RED_DEV'};102;2;$UP[10];$UP[1];;;8;VoIP;
+$qossettings{'RED_DEV'};103;4;$UP[10];$UP[1];;;2;VPN;
$qossettings{'RED_DEV'};104;5;$UP[10];$UP[1];;;8;Webtraffic;
$qossettings{'RED_DEV'};110;6;1;$UP[1];;;0;Default;
$qossettings{'RED_DEV'};120;7;1;$UP[1];;;1;P2P;
-$qossettings{'RED_DEV'};103;4;$UP[2];$UP[1];;;2;VPN;
END
;
close FILE;
$qossettings{'ENABLED'} = 'on';
&General::writehash("${General::swroot}/qos/settings", \%qossettings);
system("/usr/local/bin/qosctrl generate >/dev/null 2>&1");
- system("/usr/bin/touch /var/ipfire/qos/enable");
system("/usr/local/bin/qosctrl start >/dev/null 2>&1");
system("logger -t ipfire 'QoS started'");
} else {
&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::openbox('100%', 'center', "$qossettings{'RED_DEV'} $Lang::tr{'graph'}, $Lang::tr{'uplink'}");
- &Graphs::makegraphbox("qos.cgi",$qossettings{'RED_DEV'},"hour","325");
+ &Graphs::makegraphbox("qos.cgi",$qossettings{'RED_DEV'},"hour");
&Header::closebox();
&Header::openbox('100%', 'center', "$qossettings{'IMQ_DEV'} $Lang::tr{'graph'}, $Lang::tr{'downlink'}");
- &Graphs::makegraphbox("qos.cgi",$qossettings{'IMQ_DEV'},"hour","325");
+ &Graphs::makegraphbox("qos.cgi",$qossettings{'IMQ_DEV'},"hour");
&Header::closebox();
&showclasses($qossettings{'RED_DEV'});
<tr><td width='33%' align='right'>$Lang::tr{'guaranteed bandwith'}:
<td width='33%' align='left'><input type='text' size='20' name='MINBWDTH' maxlength='8' required='1' value="$qossettings{'MINBWDTH'}" />
<td width='33%' align='center'>
- <tr><td width='33%' align='right'>$Lang::tr{'max bandwith'}:
+ <tr><td width='33%' align='right'>$Lang::tr{'max bandwith'} <img src='/blob.gif' alt='*' />:
<td width='33%' align='left'><input type='text' size='20' name='MAXBWDTH' maxlength='8' required='1' value="$qossettings{'MAXBWDTH'}" />
<td width='33%' align='center'>
<tr><td width='33%' align='right'>Burst:
<tr><td width='33%' align='right'>Ceilburst:
<td width='33%' align='left'><input type='text' size='20' name='CBURST' maxlength='8' value="$qossettings{'CBURST'}" />
<td width='33%' align='center'>
-END
-;
- $selected{'TOS'}{$qossettings{'TOS'}} = "selected='selected'";
-print <<END
- <tr><td width='33%' align='right'>TOS-Bit:
- <td width='33%' align='left'><select name='TOS'>
- <option value='0' $selected{'TOS'}{'0'}>$Lang::tr{'disabled'} (0)</option>
- <option value='8' $selected{'TOS'}{'8'}>$Lang::tr{'min delay'} (8)</option>
- <option value='4' $selected{'TOS'}{'4'}>$Lang::tr{'max throughput'} (4)</option>
- <option value='2' $selected{'TOS'}{'2'}>$Lang::tr{'max reliability'} (2)</option>
- <option value='1' $selected{'TOS'}{'1'}>$Lang::tr{'min costs'} (1)</option></select>
- <td width='33%' align='center'>
<tr><td width='33%' align='right'>$Lang::tr{'remark'}:
- <td width='66%' colspan='2' align='left'><input type='text' name='REMARK' size='40' maxlength='40' value="$qossettings{'REMARK'}" /> <img alt="" alt='blob' src='/blob.gif' />
- <tr><td width='33%' align='right'>
+ <td width='66%' colspan='2' align='left'><input type='text' name='REMARK' size='40' maxlength='40' value="$qossettings{'REMARK'}" />
+ <tr><td width='33%' align='right'><img src='/blob.gif' alt='*' /> $Lang::tr{'required field'}
<td width='33%' align='left'>
<td width='33%' align='center'><input type='submit' name='DOCLASS' value='$Lang::tr{'save'}' /> <input type='reset' value='$Lang::tr{'reset'}' />
</table></form>
&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
print <<END
</select><td width='33%' align='center'>
<tr><td width='33%' align='right'>$Lang::tr{'source ip'}:
- <td width='33%' align='left'><input type='text' name='QIP' maxlength='15' value='$qossettings{'QIP'}' />
+ <td width='33%' align='left'><input type='text' name='QIP' maxlength='31' value='$qossettings{'QIP'}' />
<td width='33%' align='center'>
<tr><td width='33%' align='right'>$Lang::tr{'destination ip'}:
- <td width='33%' align='left'><input type='text' name='DIP' maxlength='15' value='$qossettings{'DIP'}' />
+ <td width='33%' align='left'><input type='text' name='DIP' maxlength='31' value='$qossettings{'DIP'}' />
<td width='33%' align='center'><input type='hidden' name='CLASS' value='$qossettings{'CLASS'}' /><input type='submit' name='DOLEVEL7' value='$Lang::tr{'save'}' />
<tr><td colspan="3" align='center'><font color="red"><em>$Lang::tr{'qos warning'}</em></font>
</table></form>
<td width='33%' align='left'><input type='text' name='DPORT' maxlength='11' value='$qossettings{'DPORT'}' />
<td width='33%' align='center'>
<tr><td width='33%' align='right'>$Lang::tr{'source ip'}:
- <td width='33%' align='left'><input type='text' name='QIP' maxlength='15' value='$qossettings{'QIP'}' />
+ <td width='33%' align='left'><input type='text' name='QIP' maxlength='31' value='$qossettings{'QIP'}' />
<td width='33%' align='center'>
<tr><td width='33%' align='right'>$Lang::tr{'destination ip'}:
- <td width='33%' align='left'><input type='text' name='DIP' maxlength='15' value='$qossettings{'DIP'}' />
+ <td width='33%' align='left'><input type='text' name='DIP' maxlength='31' value='$qossettings{'DIP'}' />
<td width='33%' align='center'><input type='hidden' name='CLASS' value='$qossettings{'CLASS'}' /><input type='submit' name='DOPORT' value='$Lang::tr{'save'}' />
</table></form>
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
- }
- }
- }
-}