]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - html/cgi-bin/qos.cgi
HinzugefĆ¼gt:
[people/pmueller/ipfire-2.x.git] / html / cgi-bin / qos.cgi
1 #!/usr/bin/perl
2 #
3 # IPFire CGIs
4 #
5 # This code is distributed under the terms of the GPL
6 #
7 # (c) The IPFire Team
8 #
9
10 use strict;
11 # enable only the following on debugging purpose
12 use warnings;
13 use CGI::Carp 'fatalsToBrowser';
14
15 require '/var/ipfire/general-functions.pl';
16 require "${General::swroot}/lang.pl";
17 require "${General::swroot}/header.pl";
18
19 my %qossettings = ();
20 my %checked = ();
21 my %netsettings = ();
22 my $message = "";
23 my $errormessage = "";
24 my $c = "";
25 my $direntry = "";
26 my $classentry = "";
27 my $subclassentry = "";
28 my $l7ruleentry = "";
29 my $portruleentry = "";
30 my @tmp = ();
31 my @classes = ();
32 my @subclasses = ();
33 my @l7rules = ();
34 my @portrules = ();
35 my @tmpline = ();
36 my @classline = ();
37 my @subclassline = ();
38 my @l7ruleline = ();
39 my @portruleline = ();
40 my @proto = ();
41 my %selected= () ;
42 my $classfile = "/var/ipfire/qos/classes";
43 my $subclassfile = "/var/ipfire/qos/subclasses";
44 my $level7file = "/var/ipfire/qos/level7config";
45 my $portfile = "/var/ipfire/qos/portconfig";
46 &General::readhash("${General::swroot}/ethernet/settings", \%netsettings);
47
48 &Header::showhttpheaders();
49
50 $qossettings{'ENABLED'} = 'off';
51 $qossettings{'EDIT'} = 'no';
52 $qossettings{'OUT_SPD'} = '';
53 $qossettings{'INC_SPD'} = '';
54 $qossettings{'DEF_OUT_SPD'} = '';
55 $qossettings{'DEF_INC_SPD'} = '';
56 $qossettings{'DEFCLASS_INC'} = '';
57 $qossettings{'DEFCLASS_OUT'} = '';
58 $qossettings{'ACK'} = '';
59 $qossettings{'MTU'} = '1492';
60 $qossettings{'SFQ_PERTUB'} = '10';
61 $qossettings{'QLENGTH'} = '30';
62 $qossettings{'RED_DEV'} = `cat /var/ipfire/red/iface`;
63 $qossettings{'IMQ_DEV'} = 'imq0';
64 $qossettings{'VALID'} = 'yes';
65 ### Values that have to be initialized
66 $qossettings{'ACTION'} = '';
67 $qossettings{'ACTIONDEF'} = '';
68 $qossettings{'ACTIONBW'} = '';
69 $qossettings{'PRIO'} = '';
70 $qossettings{'SPD'} = '';
71 $qossettings{'CLASS'} = '';
72 $qossettings{'SCLASS'} = '';
73 $qossettings{'QPORT'} = '';
74 $qossettings{'DPORT'} = '';
75 $qossettings{'QIP'} = '';
76 $qossettings{'DIP'} = '';
77 $qossettings{'PPROT'} = '';
78 $qossettings{'L7PROT'} = '';
79 $qossettings{'DEVICE'} = '';
80 $qossettings{'MINBWDTH'} = '';
81 $qossettings{'MAXBWDTH'} = '';
82 $qossettings{'BURST'} = '';
83 $qossettings{'CBURST'} = '';
84 $qossettings{'DOCLASS'} = '';
85 $qossettings{'DOSCLASS'} = '';
86 $qossettings{'DOLEVEL7'} = '';
87 $qossettings{'DOPORT'} = '';
88
89
90 &General::readhash("${General::swroot}/qos/settings", \%qossettings);
91 &Header::getcgihash(\%qossettings);
92
93 &Header::openpage('QoS', 1, '');
94
95 print <<END
96 <script type="text/javascript">
97 <!--
98 function BorderOn (id) { id.className='btnOn' }
99 function BorderOff(id) { id.className='btnOff' }
100 //-->
101 </script>
102 <style type=text/css>
103 .btnOn {
104 border-right: #D5F0FF 2px Inset;
105 border-top: #D5F0FF 2px Inset;
106 border-left: #D5F0FF 2px Inset;
107 border-bottom: #D5F0FF 2px Inset;
108 text-align: Center;
109 text-decoration: None;
110 background-color: #FFFFFF;
111 }
112 .btnOff {
113 border-right: #D5F0FF 2px Outset;
114 border-top: #D5F0FF 2px Outset;
115 border-left: #D5F0FF 2px Outset;
116 border-bottom: #D5F0FF 2px Outset;
117 text-align: Center;
118 text-decoration: None;
119 background-color: #FFFFFF;
120 }
121 </style>
122 END
123 ;
124
125 &Header::openbigbox('100%', 'left', '', $errormessage);
126
127 ############################################################################################################################
128 ############################################################################################################################
129
130 if ($qossettings{'DOCLASS'} eq $Lang::tr{'save'})
131 {
132 &validclass();
133 &validminbwdth();
134 &validmaxbwdth();
135 if ( $qossettings{'VALID'} eq 'yes' ) {
136 open( FILE, ">> $classfile" ) or die "Unable to write $classfile";
137 print FILE <<END
138 $qossettings{'DEVICE'};$qossettings{'CLASS'};$qossettings{'PRIO'};$qossettings{'MINBWDTH'};$qossettings{'MAXBWDTH'};$qossettings{'BURST'};$qossettings{'CBURST'};
139 END
140 ;
141 close FILE;
142 } else {
143 $qossettings{'ACTION'} = 'Parentklasse hinzufuegen';
144 }
145 }
146 elsif ($qossettings{'DOCLASS'} eq 'Bearbeiten')
147 {
148 open( FILE, "< $classfile" ) or die "Unable to read $classfile";
149 @classes = <FILE>;
150 close FILE;
151 open( FILE, "> $classfile" ) or die "Unable to write $classfile";
152 foreach $classentry (sort @classes)
153 {
154 @classline = split( /\;/, $classentry );
155 if ( $classline[1] ne $qossettings{'CLASS'} ) {
156 print FILE $classentry;
157 } else {
158 $qossettings{'DEVICE'} = $classline[0];
159 $qossettings{'PRIO'} = $classline[2];
160 $qossettings{'MINBWDTH'} = $classline[3];
161 $qossettings{'MAXBWDTH'} = $classline[4];
162 $qossettings{'BURST'} = $classline[5];
163 $qossettings{'CBURST'} = $classline[6];
164 $qossettings{'EDIT'} = 'yes';
165 }
166 }
167 close FILE;
168 &parentclass();
169 &Header::closebigbox();
170 &Header::closepage();
171 exit
172 }
173 elsif ($qossettings{'DOCLASS'} eq 'Loeschen')
174 {
175 open( FILE, "< $classfile" ) or die "Unable to read $classfile";
176 @tmp = <FILE>;
177 close FILE;
178 open( FILE, "> $classfile" ) or die "Unable to write $classfile";
179 foreach $classentry (sort @tmp)
180 {
181 @tmpline = split( /\;/, $classentry );
182 if ( $tmpline[1] ne $qossettings{'CLASS'} )
183 {
184 print FILE $classentry;
185 }
186 }
187 close FILE;
188 open( FILE, "< $subclassfile" ) or die "Unable to read $classfile";
189 @tmp = <FILE>;
190 close FILE;
191 open( FILE, "> $subclassfile" ) or die "Unable to write $classfile";
192 foreach $subclassentry (sort @tmp)
193 {
194 @tmpline = split( /\;/, $subclassentry );
195 if ( $tmpline[1] ne $qossettings{'CLASS'} )
196 {
197 print FILE $subclassentry;
198 }
199 }
200 close FILE;
201 $message = "Klasse $qossettings{'CLASS'} wurde mit eventuell vorhandenen Unterklassen geloescht.";
202 }
203
204 ############################################################################################################################
205 ############################################################################################################################
206
207 if ($qossettings{'DOSCLASS'} eq $Lang::tr{'save'})
208 {
209 if ($qossettings{'SCLASS'} >= 1000 && $qossettings{'CLASS'} < 1021) {
210 $qossettings{'DEVICE'} = $qossettings{'RED_DEV'};
211 } elsif ($qossettings{'SCLASS'} >= 2000 && $qossettings{'CLASS'} < 2021) {
212 $qossettings{'DEVICE'} = $qossettings{'IMQ_DEV'};
213 }
214 &validsubclass();
215 &validminbwdth();
216 if ( $qossettings{'VALID'} eq 'yes' ) {
217 open( FILE, ">> $subclassfile" ) or die "Unable to write $subclassfile";
218 print FILE <<END
219 $qossettings{'DEVICE'};$qossettings{'CLASS'};$qossettings{'SCLASS'};$qossettings{'PRIO'};$qossettings{'MINBWDTH'};$qossettings{'MAXBWDTH'};$qossettings{'BURST'};$qossettings{'CBURST'};
220 END
221 ;
222 close FILE;
223 } else {
224 $qossettings{'ACTION'} = 'Unterklasse hinzufuegen';
225 }
226 } elsif ($qossettings{'DOSCLASS'} eq 'Loeschen')
227 {
228 open( FILE, "< $subclassfile" ) or die "Unable to read $classfile";
229 @tmp = <FILE>;
230 close FILE;
231 open( FILE, "> $subclassfile" ) or die "Unable to write $classfile";
232 foreach $subclassentry (sort @tmp)
233 {
234 @tmpline = split( /\;/, $subclassentry );
235 if ( $tmpline[2] ne $qossettings{'CLASS'} )
236 {
237 print FILE $subclassentry;
238 }
239 }
240 close FILE;
241 $message = "Unterklasse $qossettings{'CLASS'} wurde geloescht.";
242 }
243
244 ############################################################################################################################
245 ############################################################################################################################
246
247 if ($qossettings{'DOLEVEL7'} eq $Lang::tr{'save'})
248 {
249 if ( $qossettings{'QIP'} ne '' ) {
250 unless ( &General::validip($qossettings{'QIP'}) ) {
251 $qossettings{'VALID'} = 'no';
252 $message = "Die Quell-IP-Adresse ist ungueltig.";
253 }
254 }
255 if ( $qossettings{'DIP'} ne '' ) {
256 unless ( &General::validip($qossettings{'DIP'}) ) {
257 $qossettings{'VALID'} = 'no';
258 $message = "Die Ziel-IP-Adresse ist ungueltig.";
259 }
260 }
261 if ($qossettings{'CLASS'} >= 100 && $qossettings{'CLASS'} < 121) {
262 $qossettings{'DEVICE'} = $qossettings{'RED_DEV'};
263 } elsif ($qossettings{'CLASS'} >= 1000 && $qossettings{'CLASS'} < 1021) {
264 $qossettings{'DEVICE'} = $qossettings{'RED_DEV'};
265 } elsif ($qossettings{'CLASS'} >= 200 && $qossettings{'CLASS'} < 221) {
266 $qossettings{'DEVICE'} = $qossettings{'IMQ_DEV'};
267 } elsif ($qossettings{'CLASS'} >= 2000 && $qossettings{'CLASS'} < 2021) {
268 $qossettings{'DEVICE'} = $qossettings{'IMQ_DEV'};
269 }
270 if ( $qossettings{'VALID'} eq 'yes' ) {
271 open( FILE, ">> $level7file" ) or die "Unable to write $level7file";
272 print FILE <<END
273 $qossettings{'CLASS'};$qossettings{'DEVICE'};$qossettings{'L7PROT'};$qossettings{'QIP'};$qossettings{'DIP'};
274 END
275 ;
276 close FILE;
277 } else {
278 $qossettings{'ACTION'} = 'Level7-Regel hinzufuegen';
279 }
280 }
281 elsif ($qossettings{'DOLEVEL7'} eq 'Loeschen')
282 {
283 open( FILE, "< $level7file" ) or die "Unable to read $level7file";
284 @l7rules = <FILE>;
285 close FILE;
286 open( FILE, "> $level7file" ) or die "Unable to read $level7file";
287 foreach $l7ruleentry (sort @l7rules)
288 {
289 @l7ruleline = split( /\;/, $l7ruleentry );
290 if ( ($l7ruleline[0] ne $qossettings{'CLASS'}) && ($l7ruleline[2] ne $qossettings{'L7PROT'}))
291 {
292 print FILE $l7ruleentry;
293 }
294 }
295 close FILE;
296 $message = "Level7-Regel ($qossettings{'CLASS'} - $qossettings{'L7PROT'}) wurde geloescht.";
297 }
298
299 ############################################################################################################################
300 ############################################################################################################################
301
302 if ($qossettings{'DOPORT'} eq $Lang::tr{'save'})
303 {
304 if ( $qossettings{'QIP'} ne '' ) {
305 unless ( &General::validip($qossettings{'QIP'}) ) {
306 $qossettings{'VALID'} = 'no';
307 $message = "Die Quell-IP-Adresse ist ungueltig.";
308 }
309 }
310 if ( $qossettings{'DIP'} ne '' ) {
311 unless ( &General::validip($qossettings{'DIP'}) ) {
312 $qossettings{'VALID'} = 'no';
313 $message = "Die Ziel-IP-Adresse ist ungueltig.";
314 }
315 }
316 if ($qossettings{'CLASS'} >= 100 && $qossettings{'CLASS'} < 121) {
317 $qossettings{'DEVICE'} = $qossettings{'RED_DEV'};
318 } elsif ($qossettings{'CLASS'} >= 1000 && $qossettings{'CLASS'} < 1021) {
319 $qossettings{'DEVICE'} = $qossettings{'RED_DEV'};
320 } elsif ($qossettings{'CLASS'} >= 200 && $qossettings{'CLASS'} < 221) {
321 $qossettings{'DEVICE'} = $qossettings{'IMQ_DEV'};
322 } elsif ($qossettings{'CLASS'} >= 2000 && $qossettings{'CLASS'} < 2021) {
323 $qossettings{'DEVICE'} = $qossettings{'IMQ_DEV'};
324 }
325 if ( $qossettings{'VALID'} eq 'yes' ) {
326 open( FILE, ">> $portfile" ) or die "Unable to write $portfile";
327 print FILE <<END
328 $qossettings{'CLASS'};$qossettings{'DEVICE'};$qossettings{'PPROT'};$qossettings{'QIP'};$qossettings{'QPORT'};$qossettings{'DIP'};$qossettings{'DPORT'};
329 END
330 ;
331 close FILE;
332 } else {
333 $qossettings{'ACTION'} = 'Port-Regel hinzufuegen';
334 }
335 } elsif ($qossettings{'DOPORT'} eq 'Loeschen')
336 {
337 open( FILE, "< $portfile" ) or die "Unable to read $portfile";
338 @portrules = <FILE>;
339 close FILE;
340 open( FILE, "> $portfile" ) or die "Unable to read $portfile";
341 foreach $portruleentry (sort @portrules)
342 {
343 @portruleline = split( /\;/, $portruleentry );
344 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'}))
345 {
346 print FILE $portruleentry;
347 }
348 }
349 close FILE;
350 $message = "Port-Regel ($qossettings{'CLASS'} - $qossettings{'PPROT'}) wurde geloescht.";
351 }
352
353 ############################################################################################################################
354 ############################################################################################################################
355
356 if ($qossettings{'ACTION'} eq 'Start')
357 {
358 system("sleep 2 && /usr/bin/perl /var/ipfire/qos/bin/makeqosscripts.pl > /var/ipfire/qos/bin/qos.sh &");
359 system("/bin/touch /var/ipfire/qos/enable");
360 $qossettings{'ENABLED'} = 'on';
361 &General::writehash("${General::swroot}/qos/settings", \%qossettings);
362 }
363 elsif ($qossettings{'ACTION'} eq 'Stop')
364 {
365 unlink "/var/ipfire/qos/bin/qos.sh";
366 unlink "/var/ipfire/qos/enable";
367 $qossettings{'ENABLED'} = 'off';
368 &General::writehash("${General::swroot}/qos/settings", \%qossettings);
369 }
370 elsif ($qossettings{'ACTION'} eq 'Neustart')
371 {
372 if ($qossettings{'ENABLED'} eq 'on'){
373 system("sleep 2 && /usr/bin/perl /var/ipfire/qos/bin/makeqosscripts.pl > /var/ipfire/qos/bin/qos.sh &");
374 }
375 }
376 elsif ($qossettings{'ACTION'} eq $Lang::tr{'save'})
377 {
378 if ($qossettings{'DEF_INC_SPD'} eq '') {
379 $qossettings{'DEF_INC_SPD'} = int($qossettings{'INC_SPD'} * 0.9);
380 }
381 if ($qossettings{'DEF_OUT_SPD'} eq '') {
382 $qossettings{'DEF_OUT_SPD'} = int($qossettings{'OUT_SPD'} * 0.9);
383 }
384 &General::writehash("${General::swroot}/qos/settings", \%qossettings);
385 }
386 elsif ($qossettings{'ACTION'} eq 'Parentklasse hinzufuegen')
387 {
388 &parentclass();
389 &Header::closebigbox();
390 &Header::closepage();
391 exit
392 }
393 elsif ($qossettings{'ACTION'} eq 'Unterklasse hinzufuegen')
394 {
395 &subclass();
396 &Header::closebigbox();
397 &Header::closepage();
398 exit
399 }
400 elsif ($qossettings{'ACTION'} eq 'Level7-Regel hinzufuegen')
401 {
402 &level7rule();
403 &Header::closebigbox();
404 &Header::closepage();
405 exit
406 }
407 elsif ($qossettings{'ACTION'} eq 'Port-Regel hinzufuegen')
408 {
409 &portrule();
410 &Header::closebigbox();
411 &Header::closepage();
412 exit
413 }
414 elsif ($qossettings{'ACTION'} eq 'Erweiterte Einstellungen')
415 {
416 &expert();
417 &Header::closebigbox();
418 &Header::closepage();
419 exit
420 }
421 if ($qossettings{'ACTIONBW'} eq 'Andern')
422 {
423 &changebandwidth();
424 &Header::closebigbox();
425 &Header::closepage();
426 exit
427 }
428 if ($qossettings{'ACTIONDEF'} eq 'Andern')
429 {
430 &changedefclasses();
431 &Header::closebigbox();
432 &Header::closepage();
433 exit
434 }
435
436 &General::readhash("${General::swroot}/qos/settings", \%qossettings);
437
438 my $status = $Lang::tr{'stopped'};
439 my $statuscolor = '#993333';
440 if ( $qossettings{'ENABLED'} eq 'on' ) {
441 $status = $Lang::tr{'running'};
442 $statuscolor = '#339933';
443 }
444
445 if ( $netsettings{'RED_TYPE'} ne 'PPPOE' ) {
446 $qossettings{'RED_DEV'} = $netsettings{'RED_DEV'};
447 }
448
449 if ($errormessage) {
450 &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
451 print "<class name='base'>$errormessage\n";
452 print "&nbsp;</class>\n";
453 &Header::closebox();
454 }
455
456 ############################################################################################################################
457 ############################################################################################################################
458
459 &Header::openbox('100%', 'center', 'Quality of Service');
460 print <<END
461 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
462 <table width='33%'>
463 END
464 ;
465 if ( $message ne "" ) {
466 print "<tr><td colspan='2' align='center'><font color='red'>$message</font>";
467 }
468 print <<END
469 <tr><td width='50%' align='left'><b>Quality of Service:</b>
470 <td width='50%' align='center' bgcolor='$statuscolor'><font color='white'>$status</font>
471 <tr><td width='100%' align='center' colspan='2'>
472 <input type='submit' name='ACTION' value='Start' />
473 <input type='submit' name='ACTION' value='Stop' />
474 <input type='submit' name='ACTION' value='$Lang::tr{'restart'}' />
475 END
476 ;
477 if (($qossettings{'OUT_SPD'} ne '') && ($qossettings{'INC_SPD'} ne '')) {
478 print <<END
479 <tr><td colspan='3'>&nbsp;
480 <tr><td width='40%' align='right'>Downloadgeschwindigkeit: <td width='40%' align='left'>$qossettings{'INC_SPD'} kbps
481 <td width='20%' rowspan='2' align='center' valign='middle'><input type='submit' name='ACTIONBW' value='Andern'>
482 <tr><td width='40%' align='right'>Uploadgeschwindigkeit: <td width='40%' align='left'>$qossettings{'OUT_SPD'} kbps
483 END
484 ;
485 }
486 if (($qossettings{'DEFCLASS_OUT'} ne '') && ($qossettings{'DEFCLASS_INC'} ne '')&& ($qossettings{'ACK'} ne '')) {
487 print <<END
488 <tr><td colspan='3'><hr>
489 <tr><td width='40%' align='right'>Downloadstandardklasse: <td width='40%' align='left'>$qossettings{'DEFCLASS_INC'}
490 <td width='20%' rowspan='3' align='center' valign='middle'><input type='submit' name='ACTIONDEF' value='Andern'>
491 <tr><td width='40%' align='right'>Uploadstandardklasse: <td width='40%' align='left'>$qossettings{'DEFCLASS_OUT'}
492 <tr><td width='40%' align='right'>ACKs: <td width='40%' align='left'>$qossettings{'ACK'}
493 <tr><td colspan='3' width='100%'><hr>
494 <tr><td colspan='3' width='100%' align='center'><input type='submit' name='ACTION' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)' value='Parentklasse hinzufuegen'><input type='submit' name='ACTION' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)' value='Erweiterte Einstellungen'>
495 </form>
496 END
497 ;
498 }
499 print "</table>";
500 &Header::closebox();
501
502 if ( ($qossettings{'OUT_SPD'} eq '') || ($qossettings{'INC_SPD'} eq '') ) {
503 &changebandwidth();
504 &Header::closebox();
505 &Header::closebigbox();
506 &Header::closepage();
507 exit
508 }
509
510 if ( ($qossettings{'DEFCLASS_INC'} eq '') || ($qossettings{'DEFCLASS_OUT'} eq '') || ($qossettings{'ACK'} eq '') ) {
511 &changedefclasses();
512 &Header::closebigbox();
513 &Header::closepage();
514 exit
515 }
516
517 &showclasses();
518 &showl7rules();
519 &showportrules();
520
521 &Header::closebigbox();
522 &Header::closepage();
523
524 ############################################################################################################################
525 ############################################################################################################################
526
527 sub changedefclasses {
528 &Header::openbox('100%', 'center', 'Standardklassen:');
529 print <<END
530 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
531 <table width='66%'>
532 <tr><td width='100%' colspan='3'>Legen sie hier die Standardklassen fest durch die nicht-gefilterte Pakete gehen.
533 <tr><td width='33%' align='right'>Download:<td width='33%' align='left'><select name='DEFCLASS_INC'>
534 END
535 ;
536 for ( $c = 200 ; $c <= 220 ; $c++ )
537 {
538 if ( $qossettings{'DEFCLASS_INC'} ne $c )
539 { print "<option value='$c'>$c</option>\n"; }
540 else { print "<option selected value='$c'>$c</option>\n"; }
541 }
542 print <<END
543 </select><td width='33%' align='center'>&nbsp;
544 <tr><td width='33%' align='right'>Upload:<td width='33%' align='left'><select name='DEFCLASS_OUT'>
545 END
546 ;
547 for ( $c = 100 ; $c <= 120 ; $c++ )
548 {
549 if ( $qossettings{'DEFCLASS_OUT'} ne $c )
550 { print "<option value='$c'>$c</option>\n"; }
551 else { print "<option selected value='$c'>$c</option>\n"; }
552 }
553 print <<END
554 </select><td width='33%' align='center'>&nbsp;
555 </table>
556 <hr>
557 <table width='66%'>
558 <tr><td width='100%' colspan='3'>Legen sie hier die ACK-Klasse fest <br> und klicken Sie danach auf <i>Speichern</i>.
559 <tr><td width='33%' align='right'>ACKs:<td width='33%' align='left'><select name='ACK'>
560 END
561 ;
562 for ( $c = 100 ; $c <= 120 ; $c++ )
563 {
564 if ( $qossettings{'ACK'} ne $c )
565 { print "<option value='$c'>$c</option>\n"; }
566 else { print "<option selected value='$c'>$c</option>\n"; }
567 }
568 print <<END
569 </select><td width='33%' align='center'><input type='submit' name='ACTION' value=$Lang::tr{'save'} />
570 </table>
571 </form>
572 END
573 ;
574 &Header::closebox();
575 }
576
577 sub changebandwidth {
578 &Header::openbox('100%', 'center', 'Bandbreiteneinstellungen');
579 if ($qossettings{'ENABLED'} eq 'on') {
580 print "Sie koennen die Bandbreiteneinstellungen nicht bearbeiten, wenn QoS eingeschaltet ist. Schalten sie es zuerst dazu aus.<p>";
581 print "<a href='/cgi-bin/qos.cgi'>Zurueck</a>";
582 } else {
583 print <<END
584 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
585 <input type='hidden' name='DEF_OUT_SPD' value=''><input type='hidden' name='DEF_INC_SPD' value=''>
586 <table width='66%'>
587 <tr><td width='100%' colspan='3'>Geben Sie bitte hier ihre Download- bzw. Upload-Geschwindigkeit ein <br> und klicken Sie danach auf <i>Speichern</i>.
588 <tr><td width='33%' align='right'>Download-Geschwindigkeit:
589 <td width='33%' align='left'><input type='text' name='INC_SPD' maxlength='8' value=$qossettings{'INC_SPD'}> &nbsp; kbps
590 <td width='33%' align='center'>&nbsp;
591 <tr><td width='33%' align='right'>Upload-Geschwindigkeit:
592 <td width='33%' align='left'><input type='text' name='OUT_SPD' maxlength='8' value=$qossettings{'OUT_SPD'}> &nbsp; kbps
593 <td width='33%' align='center'><input type='submit' name='ACTION' value=$Lang::tr{'save'} />&nbsp;<input type='reset' name='ACTION' value=$Lang::tr{'reset'} />
594 </table>
595 </form>
596 END
597 ;
598 }
599 &Header::closebox();
600 }
601
602 sub parentclass {
603 &Header::openbox('100%', 'center', 'Parentklasse');
604 print <<END
605 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
606 <table width='66%'>
607 END
608 ;
609 if ( $message ne "" ) {
610 print "<tr><td colspan='3' align='center'>$message";
611 }
612 if ( $qossettings{'EDIT'} eq 'yes' ) {
613 print "<input type='hidden' name='CLASS' value=$qossettings{'CLASS'}>";
614 print "<input type='hidden' name='DEVICE' value=$qossettings{'DEVICE'}>";
615 }
616 print <<END
617 <tr><td width='100%' colspan='3'>Geben sie die Daten ein <br> und klicken Sie danach auf <i>Speichern</i>.
618 <tr><td width='33%' align='right'>Interface:
619 <td width='33%' align='left'>
620 END
621 ;
622 if ( $qossettings{'EDIT'} eq 'yes' ) {
623 print "<select name='DEVICE' disabled>";
624 } else {
625 print "<select name='DEVICE'>";
626 }
627 if ( $qossettings{'DEVICE'} eq $qossettings{'RED_DEV'} ) {
628 $qossettings{'RED_DEV_SEL'} = 'selected';
629 } elsif ( $qossettings{'DEVICE'} eq $qossettings{'IMQ_DEV'} ) {
630 $qossettings{'IMQ_DEV_SEL'} = 'selected';
631 }
632 print <<END
633 <option value=$qossettings{'RED_DEV'} $qossettings{'RED_DEV_SEL'}>$qossettings{'RED_DEV'}</option>
634 <option value=$qossettings{'IMQ_DEV'} $qossettings{'IMQ_DEV_SEL'}>$qossettings{'IMQ_DEV'}</option></select>
635 <td width='33%' align='center'>&nbsp;
636 <tr><td width='33%' align='right'>Klasse:<td width='33%' align='left'>
637 END
638 ;
639 if ( $qossettings{'EDIT'} eq 'yes' ) {
640 print "<select name='CLASS' disabled>";
641 } else {
642 print "<select name='CLASS'>";
643 }
644 for ( $c = 100 ; $c <= 120 ; $c++ )
645 {
646 if ( $qossettings{'CLASS'} ne $c )
647 { print "<option value='$c'>$c</option>\n"; }
648 else { print "<option selected value='$c'>$c</option>\n"; }
649 }
650 for ( $c = 200 ; $c <= 220 ; $c++ )
651 {
652 if ( $qossettings{'CLASS'} ne $c )
653 { print "<option value='$c'>$c</option>\n"; }
654 else { print "<option selected value='$c'>$c</option>\n"; }
655 }
656 print <<END
657 </select>
658 <td width='33%' align='center'>&nbsp;
659 <tr><td width='33%' align='right'>Prioritaet:<td width='33%' align='left'><select name='PRIO'>
660 END
661 ;
662 for ( $c = 1 ; $c <= 7 ; $c++ )
663 {
664 if ( $qossettings{'PRIO'} ne $c )
665 { print "<option value='$c'>$c</option>\n"; }
666 else { print "<option selected value='$c'>$c</option>\n"; }
667 }
668 print <<END
669 <td width='33%' align='center'>&nbsp;
670 <tr><td width='33%' align='right'>Garantierte Bandbreite:
671 <td width='33%' align='left'><input type='text' name='MINBWDTH' maxlength='8' required='1' value=$qossettings{'MINBWDTH'} >
672 <td width='33%' align='center'>&nbsp;
673 <tr><td width='33%' align='right'>Maximale Bandbreite:
674 <td width='33%' align='left'><input type='text' name='MAXBWDTH' maxlength='8' required='1' value=$qossettings{'MAXBWDTH'}>
675 <td width='33%' align='center'>&nbsp;
676 <tr><td width='33%' align='right'>Burst:
677 <td width='33%' align='left'><input type='text' name='BURST' maxlength='8' value=$qossettings{'BURST'}>
678 <td width='33%' align='center'>&nbsp;
679 <tr><td width='33%' align='right'>Ceilburst:
680 <td width='33%' align='left'><input type='text' name='CBURST' maxlength='8' value=$qossettings{'CBURST'}>
681 <td width='33%' align='center'><input type='submit' name='DOCLASS' value=$Lang::tr{'save'} />&nbsp;<input type='reset' value=$Lang::tr{'reset'} />
682 </table></form>
683 END
684 ;
685 &Header::closebox();
686 }
687
688 sub subclass {
689 &Header::openbox('100%', 'center', 'Unterklasse');
690 print <<END
691 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
692 <table width='66%'>
693 END
694 ;
695 if ( $message ne "" ) {
696 print "<tr><td colspan='3' align='center'>$message";
697 }
698 print <<END
699 <tr><td colspan='3' width='100%'>Aktuelle Klasse: $qossettings{'CLASS'}
700 <tr><td width='100%' colspan='3'>Geben sie die Daten ein <br> und klicken Sie danach auf <i>Speichern</i>.
701 <tr><td width='33%' align='right'>Unterklasse:<td width='33%' align='left'><select name='SCLASS'>
702 END
703 ;
704 if ($qossettings{'CLASS'} >= 100 && $qossettings{'CLASS'} < 121) {
705 $qossettings{'DEVICE'} = $qossettings{'RED_DEV'};
706 for ( $c = 1000 ; $c <= 1020 ; $c++ )
707 {
708 if ( $qossettings{'SCLASS'} ne $c )
709 { print "<option value='$c'>$c</option>\n"; }
710 else { print "<option selected value='$c'>$c</option>\n"; }
711 }
712 } elsif ($qossettings{'CLASS'} >= 200 && $qossettings{'CLASS'} < 221) {
713 $qossettings{'DEVICE'} = $qossettings{'IMQ_DEV'};
714 for ( $c = 2000 ; $c <= 2020 ; $c++ )
715 {
716 if ( $qossettings{'SCLASS'} ne $c )
717 { print "<option value='$c'>$c</option>\n"; }
718 else { print "<option selected value='$c'>$c</option>\n"; }
719 }
720 }
721 print <<END
722 </select>
723 <td width='33%' align='center'>&nbsp;
724 <tr><td width='33%' align='right'>Prioritaet:<td width='33%' align='left'><select name='PRIO'>
725 END
726 ;
727 for ( $c = 1 ; $c <= 7 ; $c++ )
728 {
729 if ( $qossettings{'PRIO'} ne $c )
730 { print "<option value='$c'>$c</option>\n"; }
731 else { print "<option selected value='$c'>$c</option>\n"; }
732 }
733 print <<END
734 <td width='33%' align='center'>&nbsp;
735 <tr><td width='33%' align='right'>Garantierte Bandbreite:
736 <td width='33%' align='left'><input type='text' name='MINBWDTH' maxlength='8' required='1' value=$qossettings{'MINBWDTH'} >
737 <td width='33%' align='center'>&nbsp;
738 <tr><td width='33%' align='right'>Maximale Bandbreite:
739 <td width='33%' align='left'><input type='text' name='MAXBWDTH' maxlength='8' required='1' value=$qossettings{'MAXBWDTH'}>
740 <td width='33%' align='center'>&nbsp;
741 <tr><td width='33%' align='right'>Burst:
742 <td width='33%' align='left'><input type='text' name='BURST' maxlength='8' value=$qossettings{'BURST'}>
743 <td width='33%' align='center'>&nbsp;
744 <tr><td width='33%' align='right'>Ceilburst:
745 <td width='33%' align='left'><input type='text' name='CBURST' maxlength='8' value=$qossettings{'CBURST'}>
746 <td width='33%' align='center'><input type='hidden' name='CLASS' value=$qossettings{'CLASS'}><input type='submit' name='DOSCLASS' value=$Lang::tr{'save'} />&nbsp;<input type='reset' value=$Lang::tr{'reset'} />
747 </table></form>
748 END
749 ;
750 &Header::closebox();
751 }
752
753 sub level7rule {
754 &Header::openbox('100%', 'center', 'Level7-Regel');
755 print <<END
756 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
757 <table width='66%'>
758 END
759 ;
760 if ( $message ne "" ) {
761 print "<tr><td colspan='3' align='center'><font color='red'>$message</font>";
762 }
763 print <<END
764 <tr><td colspan='3' width='100%'>Aktuelle Klasse: $qossettings{'CLASS'}
765 <tr><td width='100%' colspan='3'>Geben sie die Daten ein <br> und klicken Sie danach auf <i>Speichern</i>.
766 <tr><td width='33%' align='right'>Protokoll:
767 <td width='33%' align='left'><select name='L7PROT'>
768 END
769 ;
770 opendir( DIR, "/etc/l7-protocols/protocols" );
771 foreach $direntry ( sort readdir(DIR) )
772 {
773 next if $direntry eq ".";
774 next if $direntry eq "..";
775 next if -d "/etc/l7-protocols/protocols/$direntry";
776 @proto = split( /\./, $direntry );
777 if ( $proto[0] eq $qossettings{'L7PROT'} ) {
778 print "<option value='$proto[0]' selected>$proto[0]</option>\n";
779 } else {
780 print "<option value='$proto[0]'>$proto[0]</option>\n";
781 }
782 }
783 closedir DIR;
784 print <<END
785 </select><td width='33%' align='center'>&nbsp;
786 <tr><td width='33%' align='right'>Quell-IP-Adresse:
787 <td width='33%' align='left'><input type='text' name='QIP' maxlength='15' value=$qossettings{'QIP'}>
788 <td width='33%' align='center'>&nbsp;
789 <tr><td width='33%' align='right'>Ziel-IP-Adresse:
790 <td width='33%' align='left'><input type='text' name='DIP' maxlength='15' value=$qossettings{'DIP'}>
791 <td width='33%' align='center'><input type='hidden' name='CLASS' value=$qossettings{'CLASS'}><input type='submit' name='DOLEVEL7' value=$Lang::tr{'save'} />
792 </table></form>
793 END
794 ;
795 &Header::closebox();
796 }
797
798 sub portrule {
799 &Header::openbox('100%', 'center', 'Port-Regel hinzufuegen');
800 print <<END
801 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
802 <table width='66%'>
803 <tr><td width='100%' colspan='3'>Geben sie die Daten ein <br> und klicken Sie danach auf <i>Speichern</i>.
804 <tr><td width='33%' align='right'>Protokoll:
805 <td width='33%' align='left'><select name='PPROT'>
806 END
807 ;
808 open( FILE, "< /etc/protocols" );
809 @proto = <FILE>;
810 close FILE;
811 foreach $direntry (sort @proto)
812 {
813 @tmpline = split( /\ /, $direntry );
814 next if $tmpline[0] =~ "#";
815 if ( $tmpline[0] eq $qossettings{'PPROT'} ) {
816 print "<option value='$tmpline[0]' selected>$tmpline[0]</option>\n";
817 } else {
818 print "<option value='$tmpline[0]'>$tmpline[0]</option>\n";
819 }
820 }
821 print <<END
822 </select><td width='33%' align='center'>&nbsp;
823 <tr><td width='33%' align='right'>Quell-Port:
824 <td width='33%' align='left'><input type='text' name='QPORT' maxlength='5' value=$qossettings{'QPORT'}>
825 <td width='33%' align='center'>&nbsp;
826 <tr><td width='33%' align='right'>Ziel-Port:
827 <td width='33%' align='left'><input type='text' name='DPORT' maxlength='5' value=$qossettings{'DPORT'}>
828 <td width='33%' align='center'>&nbsp;
829 <tr><td width='33%' align='right'>Quell-IP-Adresse:
830 <td width='33%' align='left'><input type='text' name='QIP' maxlength='15' value=$qossettings{'QIP'}>
831 <td width='33%' align='center'>&nbsp;
832 <tr><td width='33%' align='right'>Ziel-IP-Adresse:
833 <td width='33%' align='left'><input type='text' name='DIP' maxlength='15' value=$qossettings{'DIP'}>
834 <td width='33%' align='center'><input type='hidden' name='CLASS' value='$qossettings{'CLASS'}'><input type='submit' name='DOPORT' value=$Lang::tr{'save'} />
835 </table></form>
836 END
837 ;
838 &Header::closebox();
839 }
840
841 sub showclasses {
842 open( FILE, "< $classfile" ) or die "Unable to read $classfile";
843 @classes = <FILE>;
844 close FILE;
845 if (@classes) {
846 open( FILE, "< $subclassfile" ) or die "Unable to read $subclassfile";
847 @subclasses = <FILE>;
848 close FILE;
849 &Header::openbox('100%', 'center', 'Klassen');
850 print <<END
851 <table border='0' width='100%' cellspacing='0'>
852 <tr><td bgcolor='lightgrey' width='10%'>Interface
853 <td bgcolor='lightgrey' width='10%'>Klasse
854 <td bgcolor='lightgrey' width='10%'>Prioritaet
855 <td bgcolor='lightgrey' width='10%'>Garantierte Bandbreite
856 <td bgcolor='lightgrey' width='10%'>Maximale Bandbreite
857 <td bgcolor='lightgrey' width='10%'>Burst
858 <td bgcolor='lightgrey' width='10%'>Ceil Burst
859 <td bgcolor='lightgrey' width='30%'>Aktionen
860 END
861 ;
862 foreach $classentry (sort @classes)
863 {
864 @classline = split( /\;/, $classentry );
865 if ( $classline[0] eq $qossettings{'RED_DEV'} )
866 {
867 print <<END
868 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
869 <tr><td align='center' bgcolor='#EAEAEA'>$classline[0]
870 <td align='center' bgcolor='#EAEAEA'>$classline[1]
871 <td align='center' bgcolor='#EAEAEA'>$classline[2]
872 <td align='center' bgcolor='#EAEAEA'>$classline[3]
873 <td align='center' bgcolor='#EAEAEA'>$classline[4]
874 <td align='center' bgcolor='#EAEAEA'>$classline[5]
875 <td align='center' bgcolor='#EAEAEA'>$classline[6]
876 <td align='right' bgcolor='#EAEAEA'><input type='hidden' name='CLASS' value='$classline[1]'>
877 <button type='submit' name='DOCLASS' value='Bearbeiten' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/edit.gif' width="20" height="20" alt="Klasse bearbeiten"></button>&nbsp;
878 <button type='submit' name='ACTION' value='Unterklasse hinzufuegen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/addblue.gif' width="20" height="20" alt="Unterklasse hinzufuegen"></button>&nbsp;
879 <button type='submit' name='ACTION' value='Level7-Regel hinzufuegen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/addgreen.gif' width="20" height="20" alt="Level7-Regel hinzufuegen"></button>&nbsp;
880 <button type='submit' name='ACTION' value='Port-Regel hinzufuegen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/add.gif' width="20" height="20" alt="Port-Regel hinzufuegen"></button>&nbsp;
881 <button type='submit' name='DOCLASS' value='Loeschen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/delete.gif' width="20" height="20" alt="Klasse loeschen"></button>
882 </form>
883 END
884 ;
885 foreach $subclassentry (sort @subclasses)
886 {
887 @subclassline = split( /\;/, $subclassentry );
888 if ( $subclassline[1] eq $classline[1] ) {
889 print <<END
890 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
891 <tr><td align='center' bgcolor='#FFFFFF'>Subklasse:
892 <td align='center' bgcolor='#FAFAFA'>$subclassline[2]
893 <td align='center' bgcolor='#FAFAFA'>$subclassline[3]
894 <td align='center' bgcolor='#FAFAFA'>$subclassline[4]
895 <td align='center' bgcolor='#FAFAFA'>$subclassline[5]
896 <td align='center' bgcolor='#FAFAFA'>$subclassline[6]
897 <td align='center' bgcolor='#FAFAFA'>$subclassline[7]
898 <td align='right' bgcolor='#FAFAFA'><input type='hidden' name='CLASS' value='$subclassline[2]'>
899 <button type='submit' name='DOSCLASS' value='Bearbeiten' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/edit.gif' width="20" height="20" alt="Klasse bearbeiten"></button>&nbsp;
900 <button type='submit' name='ACTION' value='Level7-Regel hinzufuegen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/addgreen.gif' width="20" height="20" alt="Level7-Regel hinzufuegen"></button>&nbsp;
901 <button type='submit' name='ACTION' value='Port-Regel hinzufuegen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/add.gif' width="20" height="20" alt="Port-Regel hinzufuegen"></button>&nbsp;
902 <button type='submit' name='DOSCLASS' value='Loeschen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/delete.gif' width="20" height="20" alt="Klasse loeschen"></button>
903 </form>
904 END
905 ;
906 }
907 }
908 }
909 }
910 print "\t<tr><td colspan='8' bgcolor='lightgrey' height='2'>";
911 foreach $classentry (sort @classes)
912 {
913 @classline = split( /\;/, $classentry );
914 if ( $classline[0] eq $qossettings{'IMQ_DEV'} )
915 {
916 print <<END
917 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
918 <tr><td align='center' bgcolor='#EAEAEA'>$classline[0]
919 <td align='center' bgcolor='#EAEAEA'>$classline[1]
920 <td align='center' bgcolor='#EAEAEA'>$classline[2]
921 <td align='center' bgcolor='#EAEAEA'>$classline[3]
922 <td align='center' bgcolor='#EAEAEA'>$classline[4]
923 <td align='center' bgcolor='#EAEAEA'>$classline[5]
924 <td align='center' bgcolor='#EAEAEA'>$classline[6]
925 <td align='right' bgcolor='#EAEAEA'><input type='hidden' name='CLASS' value='$classline[1]'>
926 <button type='submit' name='DOCLASS' value='Bearbeiten' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/edit.gif' width="20" height="20" alt="Klasse bearbeiten"></button>&nbsp;
927 <button type='submit' name='ACTION' value='Unterklasse hinzufuegen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/addblue.gif' width="20" height="20" alt="Unterklasse hinzufuegen"></button>&nbsp;
928 <button type='submit' name='ACTION' value='Level7-Regel hinzufuegen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/addgreen.gif' width="20" height="20" alt="Level7-Regel hinzufuegen"></button>&nbsp;
929 <button type='submit' name='ACTION' value='Port-Regel hinzufuegen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/add.gif' width="20" height="20" alt="Port-Regel hinzufuegen"></button>&nbsp;
930 <button type='submit' name='DOCLASS' value='Loeschen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/delete.gif' width="20" height="20" alt="Klasse loeschen"></button>
931 </form>
932 END
933 ;
934 foreach $subclassentry (sort @subclasses)
935 {
936 @subclassline = split( /\;/, $subclassentry );
937 if ( $subclassline[1] eq $classline[1] ) {
938 print <<END
939 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
940 <tr><td align='center' bgcolor='#FFFFFF'>Subklasse:
941 <td align='center' bgcolor='#FAFAFA'>$subclassline[2]
942 <td align='center' bgcolor='#FAFAFA'>$subclassline[3]
943 <td align='center' bgcolor='#FAFAFA'>$subclassline[4]
944 <td align='center' bgcolor='#FAFAFA'>$subclassline[5]
945 <td align='center' bgcolor='#FAFAFA'>$subclassline[6]
946 <td align='center' bgcolor='#FAFAFA'>$subclassline[7]
947 <td align='right' bgcolor='#FAFAFA'><input type='hidden' name='CLASS' value='$subclassline[2]'>
948 <button type='submit' name='DOSCLASS' value='Bearbeiten' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/edit.gif' width="20" height="20" alt="Klasse bearbeiten"></button>&nbsp;
949 <button type='submit' name='ACTION' value='Level7-Regel hinzufuegen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/addgreen.gif' width="20" height="20" alt="Level7-Regel hinzufuegen"></button>&nbsp;
950 <button type='submit' name='ACTION' value='Port-Regel hinzufuegen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/add.gif' width="20" height="20" alt="Port-Regel hinzufuegen"></button>&nbsp;
951 <button type='submit' name='DOSCLASS' value='Loeschen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/delete.gif' width="20" height="20" alt="Klasse loeschen"></button>
952 </form>
953 END
954 ;
955 }
956 }
957 }
958 }
959 print <<END
960 <tr><td colspan='8' align='right' valign='middle'><b>Legende:</b>&nbsp;&nbsp;<img src='/images/edit.gif'>&nbsp;Klasse bearbeiten | <img src='/images/addblue.gif'>&nbsp;Unterklasse hinzufuegen | <img src='/images/addgreen.gif'>&nbsp;Level7-Regel hinzufuegen | <img src='/images/add.gif'>&nbsp;Port-Regel hinzufuegen | <img src='/images/delete.gif'>&nbsp;Klasse loeschen &nbsp;
961 </table>
962 END
963 ;
964 &Header::closebox();
965 }
966 }
967
968 sub showl7rules {
969 open( FILE, "< $level7file" ) or die "Unable to read $level7file";
970 @l7rules = <FILE>;
971 close FILE;
972 if (@l7rules) {
973 &Header::openbox('100%', 'center', 'Level7-Regeln');
974 print <<END
975 <table border='0' width='100%' cellspacing='0'>
976 <tr><td bgcolor='lightgrey' width='14%'>Interface
977 <td bgcolor='lightgrey' width='14%'>Klasse
978 <td bgcolor='lightgrey' width='14%'>Protokoll
979 <td bgcolor='lightgrey' width='14%'>Quell-IP-Adresse
980 <td bgcolor='lightgrey' width='14%'>Ziel-IP-Adresse
981 <td bgcolor='lightgrey' width='30%'>Aktionen
982 END
983 ;
984 foreach $l7ruleentry (sort @l7rules)
985 {
986 @l7ruleline = split( /\;/, $l7ruleentry );
987 if ( $l7ruleline[1] eq $qossettings{'RED_DEV'} )
988 {
989 print <<END
990 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
991 <tr><td align='center' bgcolor='#EAEAEA'>$l7ruleline[1]
992 <td align='center' bgcolor='#EAEAEA'>$l7ruleline[0]
993 <td align='center' bgcolor='#EAEAEA'>$l7ruleline[2]
994 <td align='center' bgcolor='#EAEAEA'>$l7ruleline[3]
995 <td align='center' bgcolor='#EAEAEA'>$l7ruleline[4]
996 <td align='right' bgcolor='#EAEAEA'><input type='hidden' name='CLASS' value='$l7ruleline[0]'><input type='hidden' name='L7PROT' value='$l7ruleline[2]'>
997 <button type='submit' name='DOLEVEL7' value='Bearbeiten' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/edit.gif' width="20" height="20" alt="Klasse bearbeiten"></button>&nbsp;
998 <button type='submit' name='DOLEVEL7' value='Loeschen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/delete.gif' width="20" height="20" alt="Klasse loeschen"></button>
999 </form>
1000 END
1001 ;
1002 }
1003 }
1004 print "\t<tr><td colspan='8' bgcolor='lightgrey' height='2'>";
1005 foreach $l7ruleentry (sort @l7rules)
1006 {
1007 @l7ruleline = split( /\;/, $l7ruleentry );
1008 if ( $l7ruleline[1] eq $qossettings{'IMQ_DEV'} )
1009 {
1010 print <<END
1011 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1012 <tr><td align='center' bgcolor='#EAEAEA'>$l7ruleline[1]
1013 <td align='center' bgcolor='#EAEAEA'>$l7ruleline[0]
1014 <td align='center' bgcolor='#EAEAEA'>$l7ruleline[2]
1015 <td align='center' bgcolor='#EAEAEA'>$l7ruleline[3]
1016 <td align='center' bgcolor='#EAEAEA'>$l7ruleline[4]
1017 <td align='right' bgcolor='#EAEAEA'><input type='hidden' name='CLASS' value='$l7ruleline[0]'><input type='hidden' name='L7PROT' value='$l7ruleline[2]'>
1018 <button type='submit' name='DOLEVEL7' value='Bearbeiten' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/edit.gif' width="20" height="20" alt="Klasse bearbeiten"></button>&nbsp;
1019 <button type='submit' name='DOLEVEL7' value='Loeschen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/delete.gif' width="20" height="20" alt="Klasse loeschen"></button>
1020 </form>
1021 END
1022 ;
1023 }
1024 }
1025 print <<END
1026 <tr><td colspan='8' align='right' valign='middle'><b>Legende:</b>&nbsp;&nbsp;<img src='/images/edit.gif'>&nbsp;Regel bearbeiten | <img src='/images/delete.gif'>&nbsp;Regel loeschen &nbsp;
1027 </table>
1028 END
1029 ;
1030 &Header::closebox();
1031 }
1032 }
1033
1034 sub showportrules {
1035 open( FILE, "< $portfile" ) or die "Unable to read $portfile";
1036 @portrules = <FILE>;
1037 close FILE;
1038 if (@portrules) {
1039 &Header::openbox('100%', 'center', 'Port-Regeln');
1040 print <<END
1041 <table border='0' width='100%' cellspacing='0'>
1042 <tr><td bgcolor='lightgrey' width='10%'>Interface
1043 <td bgcolor='lightgrey' width='10%'>Klasse
1044 <td bgcolor='lightgrey' width='10%'>Protokoll
1045 <td bgcolor='lightgrey' width='10%'>Quell-IP-Adresse
1046 <td bgcolor='lightgrey' width='10%'>Quell-Port
1047 <td bgcolor='lightgrey' width='10%'>Ziel-IP-Adresse
1048 <td bgcolor='lightgrey' width='10%'>Ziel-Port
1049 <td bgcolor='lightgrey' width='30%'>Aktionen
1050 END
1051 ;
1052 foreach $portruleentry (sort @portrules)
1053 {
1054 @portruleline = split( /\;/, $portruleentry );
1055 if ( $portruleline[1] eq $qossettings{'RED_DEV'} )
1056 {
1057 print <<END
1058 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1059 <tr><td align='center' bgcolor='#EAEAEA'>$portruleline[1]
1060 <td align='center' bgcolor='#EAEAEA'>$portruleline[0]
1061 <td align='center' bgcolor='#EAEAEA'>$portruleline[2]
1062 <td align='center' bgcolor='#EAEAEA'>$portruleline[3]
1063 <td align='center' bgcolor='#EAEAEA'>$portruleline[4]
1064 <td align='center' bgcolor='#EAEAEA'>$portruleline[5]
1065 <td align='center' bgcolor='#EAEAEA'>$portruleline[6]
1066 <td align='right' bgcolor='#EAEAEA'>
1067 <input type='hidden' name='CLASS' value='$portruleline[0]'>
1068 <input type='hidden' name='PPROT' value='$portruleline[2]'>
1069 <input type='hidden' name='QIP' value='$portruleline[3]'>
1070 <input type='hidden' name='QPORT' value='$portruleline[4]'>
1071 <input type='hidden' name='DIP' value='$portruleline[5]'>
1072 <input type='hidden' name='DPORT' value='$portruleline[6]'>
1073 <button type='submit' name='DOPORT' value='Bearbeiten' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/edit.gif' width="20" height="20" alt="Klasse bearbeiten"></button>&nbsp;
1074 <button type='submit' name='DOPORT' value='Loeschen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/delete.gif' width="20" height="20" alt="Klasse loeschen"></button>
1075 </form>
1076 END
1077 ;
1078 }
1079 }
1080 print "\t<tr><td colspan='8' bgcolor='lightgrey' height='2'>";
1081 foreach $portruleentry (sort @portrules)
1082 {
1083 @portruleline = split( /\;/, $portruleentry );
1084 if ( $portruleline[1] eq $qossettings{'IMQ_DEV'} )
1085 {
1086 print <<END
1087 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1088 <tr><td align='center' bgcolor='#EAEAEA'>$portruleline[1]
1089 <td align='center' bgcolor='#EAEAEA'>$portruleline[0]
1090 <td align='center' bgcolor='#EAEAEA'>$portruleline[2]
1091 <td align='center' bgcolor='#EAEAEA'>$portruleline[3]
1092 <td align='center' bgcolor='#EAEAEA'>$portruleline[4]
1093 <td align='center' bgcolor='#EAEAEA'>$portruleline[5]
1094 <td align='center' bgcolor='#EAEAEA'>$portruleline[6]
1095 <td align='right' bgcolor='#EAEAEA'>
1096 <input type='hidden' name='CLASS' value='$portruleline[0]'>
1097 <input type='hidden' name='PPROT' value='$portruleline[2]'>
1098 <input type='hidden' name='QIP' value='$portruleline[3]'>
1099 <input type='hidden' name='QPORT' value='$portruleline[4]'>
1100 <input type='hidden' name='DIP' value='$portruleline[5]'>
1101 <input type='hidden' name='DPORT' value='$portruleline[6]'>
1102 <button type='submit' name='DOPORT' value='Bearbeiten' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/edit.gif' width="20" height="20" alt="Klasse bearbeiten"></button>&nbsp;
1103 <button type='submit' name='DOPORT' value='Loeschen' class='btnOff' onmouseover='BorderOn(this)' onmouseout='BorderOff(this)'><img src='/images/delete.gif' width="20" height="20" alt="Klasse loeschen"></button>
1104 </form>
1105 END
1106 ;
1107 }
1108 }
1109 print <<END
1110 <tr><td colspan='8' align='right' valign='middle'><b>Legende:</b>&nbsp;&nbsp;<img src='/images/edit.gif'>&nbsp;Regel bearbeiten | <img src='/images/delete.gif'>&nbsp;Regel loeschen &nbsp;
1111 </table>
1112 END
1113 ;
1114 &Header::closebox();
1115 }
1116 }
1117
1118 sub expert
1119 {
1120 &Header::openbox('100%', 'center', 'Expertenoptionen:');
1121 print <<END
1122 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1123 <table width='66%'>
1124 <tr><td width='100%' colspan='3'>Diese Einstellungen sollten sie nur veraendern, wenn sie wirklich wissen, was sie tun.
1125 <tr><td width='33%' align='right'>Download-Rate 90\%:<td width='33%' align='left'>
1126 <input type='text' name='DEF_INC_SPD' maxlength='8' required='4' value=$qossettings{'DEF_INC_SPD'}>
1127 <td width='33%' align='center'>&nbsp;
1128 <tr><td width='33%' align='right'>Upload-Rate 90\%:<td width='33%' align='left'>
1129 <input type='text' name='DEF_OUT_SPD' maxlength='8' required='4' value=$qossettings{'DEF_OUT_SPD'}>
1130 <td width='33%' align='center'>&nbsp;
1131 </table>
1132 <hr>
1133 <table width='66%'>
1134 <tr><td width='33%' align='right'>MTU:<td width='33%' align='left'>
1135 <input type='text' name='MTU' maxlength='8' required='4' value=$qossettings{'MTU'}>
1136 <td width='33%' align='center'>Diese Einstellung aendert die MTU nicht global sondern nur fuer das QoS.
1137 <tr><td width='33%' align='right'>Queue Laenge:<td width='33%' align='left'>
1138 <input type='text' name='QLENGTH' maxlength='8' required='2' value=$qossettings{'QLENGTH'}>
1139 <td width='33%' align='center'>&nbsp;
1140 <tr><td width='33%' align='right'>SFQ Perturb:<td width='33%' align='left'>
1141 <input type='text' name='SFQ_PERTUB' maxlength='8' required='1' value=$qossettings{'SFQ_PERTUB'}>
1142 <td width='33%' align='center'><input type='submit' name='ACTION' value=$Lang::tr{'save'} />
1143 </table>
1144 </form>
1145 END
1146 ;
1147 &Header::closebox();
1148 }
1149
1150 sub validminbwdth {
1151 if ( $qossettings{'VALID'} eq 'yes' ) {
1152 if ( $qossettings{'DEVICE'} eq $qossettings{'RED_DEV'} ) {
1153 $qossettings{'SPD'} = $qossettings{'OUT_SPD'};
1154 } elsif ( $qossettings{'DEVICE'} eq $qossettings{'IMQ_DEV'} ) {
1155 $qossettings{'SPD'} = $qossettings{'INC_SPD'};
1156 }
1157 unless ( ( $qossettings{'MINBDWTH'} >= 0 ) && ( $qossettings{'MINBDWTH'} <= $qossettings{'SPD'} ) ) {
1158 $qossettings{'VALID'} = 'no';
1159 $message = "Mindestbandbreite ist ungueltig.";
1160 }
1161 $qossettings{'SPD'} = '';
1162 }
1163 }
1164
1165 sub validmaxbwdth {
1166 if ( $qossettings{'VALID'} eq 'yes' ) {
1167 if ( $qossettings{'DEVICE'} eq $qossettings{'RED_DEV'} ) {
1168 $qossettings{'SPD'} = $qossettings{'OUT_SPD'};
1169 } elsif ( $qossettings{'DEVICE'} eq $qossettings{'IMQ_DEV'} ) {
1170 $qossettings{'SPD'} = $qossettings{'INC_SPD'};
1171 }
1172 unless ( ( $qossettings{'MAXBDWTH'} >= 0 ) && ($qossettings{'MAXBDWTH'} >= $qossettings{'MINBDWTH'}) &&( $qossettings{'MAXBDWTH'} <= $qossettings{'SPD'} ) ) {
1173 $qossettings{'VALID'} = 'no';
1174 $message = "Mamimalbandbreite ist ungueltig.";
1175 }
1176 $qossettings{'SPD'} = '';
1177 }
1178 }
1179
1180 sub validclass {
1181 if ( $qossettings{'VALID'} eq 'yes' ) {
1182 if ( $qossettings{'DEVICE'} eq $qossettings{'RED_DEV'} ) {
1183 if ($qossettings{'CLASS'} lt 100 || $qossettings{'CLASS'} ge 121) {
1184 $qossettings{'VALID'} = 'no';
1185 $message = "Die Klassennummer passt nicht zum angegebenen Interface.";
1186 }
1187 } elsif ( $qossettings{'DEVICE'} eq $qossettings{'IMQ_DEV'} ) {
1188 if ($qossettings{'CLASS'} lt 200 || $qossettings{'CLASS'} ge 221) {
1189 $qossettings{'VALID'} = 'no';
1190 $message = "Die Klassennummer passt nicht zum angegebenen Interface.";
1191 }
1192 }
1193 open( FILE, "< $classfile" ) or die "Unable to read $classfile";
1194 @tmp = <FILE>;
1195 close FILE;
1196 foreach $classentry (sort @tmp)
1197 {
1198 @tmpline = split( /\;/, $classentry );
1199 if ( $tmpline[1] eq $qossettings{'CLASS'} )
1200 {
1201 $qossettings{'VALID'} = 'no';
1202 $message = "Die aktuelle Klasse wird bereits verwendet.";
1203 last
1204 }
1205 }
1206 }
1207 }
1208
1209 sub validsubclass {
1210 if ( $qossettings{'VALID'} eq 'yes' ) {
1211 open( FILE, "< $subclassfile" ) or die "Unable to read $subclassfile";
1212 @tmp = <FILE>;
1213 close FILE;
1214 foreach $subclassentry (sort @tmp)
1215 {
1216 @tmpline = split( /\;/, $subclassentry );
1217 if ( $tmpline[2] eq $qossettings{'SCLASS'} )
1218 {
1219 $qossettings{'VALID'} = 'no';
1220 $message = "Die aktuelle Klasse wird bereits verwendet.";
1221 last
1222 }
1223 }
1224 }
1225 }