]> git.ipfire.org Git - ipfire-2.x.git/blame - html/cgi-bin/shaping.cgi
SMP-Config angepasst.. CGIs usw. wurden im Windoof-Format gespeichert... muss noch...
[ipfire-2.x.git] / html / cgi-bin / shaping.cgi
CommitLineData
ac1cfefa
MT
1#!/usr/bin/perl
2#
3# Traffic shaping CGI
4#
5# Copyright 2003-04-06 David Kilpatrick <dave@thunder.com.au>
6#
7# $Id: shaping.cgi,v 1.3.2.15 2005/02/27 13:42:05 eoberlander Exp $
8#
9
10use strict;
11
12# enable only the following on debugging purpose
13#use warnings;
14#use CGI::Carp 'fatalsToBrowser';
15
16require 'CONFIG_ROOT/general-functions.pl';
17require "${General::swroot}/lang.pl";
18require "${General::swroot}/header.pl";
19
20#workaround to suppress a warning when a variable is used only once
21my @dummy = ( ${Header::table2colour}, ${Header::colouryellow} );
22undef (@dummy);
23
24my %shapingsettings=();
25my $configfile = "${General::swroot}/shaping/config";
26my $settingsfile = "${General::swroot}/shaping/settings";
27my $errormessage = '';
28
29&Header::showhttpheaders();
30
31$shapingsettings{'ACTION'} = '';
32$shapingsettings{'ENABLE'} = 'off';
33$shapingsettings{'VALID'} = '';
34$shapingsettings{'UPLINK'} = '';
35$shapingsettings{'DOWNLINK'} = '';
36$shapingsettings{'SERVICE_ENABLED'} = '';
37$shapingsettings{'SERVICE_PROT'} = '';
38$shapingsettings{'SERVICE_PRIO'} = '';
39$shapingsettings{'SERVICE_PORT'} = '';
40
41&Header::getcgihash(\%shapingsettings);
42
43open(FILE, "$configfile") or die 'Unable to open shaping config file.';
44my @current = <FILE>;
45close(FILE);
46
47if ($shapingsettings{'ACTION'} eq $Lang::tr{'save'})
48{
49 if (!($shapingsettings{'UPLINK'} =~ /^\d+$/) ||
50 ($shapingsettings{'UPLINK'} < 2))
51 {
52 $errormessage = $Lang::tr{'invalid uplink speed'};
53 goto ERROR;
54 }
55
56 if (!($shapingsettings{'DOWNLINK'} =~ /^\d+$/) ||
57 ($shapingsettings{'DOWNLINK'} < 2))
58 {
59 $errormessage = $Lang::tr{'invalid downlink speed'};
60 goto ERROR;
61 }
62
63ERROR:
64 if ($errormessage) {
65 $shapingsettings{'VALID'} = 'no'; }
66 else {
67 $shapingsettings{'VALID'} = 'yes'; }
68
69 open(FILE,">$settingsfile") or die 'Unable to open shaping settings file.';
70 flock FILE, 2;
71 print FILE "VALID=$shapingsettings{'VALID'}\n";
72 print FILE "ENABLE=$shapingsettings{'ENABLE'}\n";
73 print FILE "UPLINK=$shapingsettings{'UPLINK'}\n";
74 print FILE "DOWNLINK=$shapingsettings{'DOWNLINK'}\n";
75 close FILE;
76
77 if ($shapingsettings{'VALID'} eq 'yes') {
78 system('/usr/local/bin/restartshaping');
79 }
80}
81if ($shapingsettings{'ACTION'} eq $Lang::tr{'add'})
82{
83 unless($shapingsettings{'SERVICE_PROT'} =~ /^(tcp|udp)$/) { $errormessage = $Lang::tr{'invalid input'}; }
84 unless($shapingsettings{'SERVICE_PRIO'} =~ /^(10|20|30)$/) { $errormessage = $Lang::tr{'invalid input'}; }
85 unless(&General::validport($shapingsettings{'SERVICE_PORT'})) { $errormessage = $Lang::tr{'invalid port'}; }
86
87 if ( ! $errormessage)
88 {
89 if ($shapingsettings{'EDITING'} eq 'no')
90 {
91 open(FILE,">>$configfile") or die 'Unable to open shaping config file';
92 flock FILE, 2;
93 print FILE "$shapingsettings{'SERVICE_PROT'},$shapingsettings{'SERVICE_PORT'},$shapingsettings{'SERVICE_PRIO'},$shapingsettings{'SERVICE_ENABLED'}\n";
94 } else {
95 open(FILE,">$configfile") or die 'Unable to open shaping config file';
96 flock FILE, 2;
97 my $id = 0;
98 foreach my $line (@current)
99 {
100 $id++;
101 chomp($line);
102 my @temp = split(/\,/,$line);
103 if ($shapingsettings{'EDITING'} eq $id) {
104 print FILE "$shapingsettings{'SERVICE_PROT'},$shapingsettings{'SERVICE_PORT'},$shapingsettings{'SERVICE_PRIO'},$shapingsettings{'SERVICE_ENABLED'}\n";
105 } else {
106 print FILE "$line\n";
107 }
108 }
109 }
110 close FILE;
111 undef %shapingsettings;
112 system ('/usr/local/bin/restartshaping');
113 } else {
114 # stay on edit mode if an error occur
115 if ($shapingsettings{'EDITING'} ne 'no')
116 {
117 $shapingsettings{'ACTION'} = $Lang::tr{'edit'};
118 $shapingsettings{'ID'} = $shapingsettings{'EDITING'};
119 }
120 }
121}
122
123if ($shapingsettings{'ACTION'} eq $Lang::tr{'edit'})
124{
125 my $id = 0;
126 foreach my $line (@current)
127 {
128 $id++;
129 if ($shapingsettings{"ID"} eq $id)
130 {
131 chomp($line);
132 my @temp = split(/\,/,$line);
133 $shapingsettings{'SERVICE_PROT'} = $temp[0];
134 $shapingsettings{'SERVICE_PORT'} = $temp[1];
135 $shapingsettings{'SERVICE_PRIO'} = $temp[2];
136 $shapingsettings{'SERVICE_ENABLED'} = $temp[3];
137 }
138 }
139}
140
141if ($shapingsettings{'ACTION'} eq $Lang::tr{'remove'} || $shapingsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})
142{
143 open(FILE, ">$configfile") or die 'Unable to open config file.';
144 flock FILE, 2;
145 my $id = 0;
146 foreach my $line (@current)
147 {
148 $id++;
149 unless ($shapingsettings{"ID"} eq $id) { print FILE "$line"; }
150 elsif ($shapingsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})
151 {
152 chomp($line);
153 my @temp = split(/\,/,$line);
154 if ($temp[3] eq "on") {
155 print FILE "$temp[0],$temp[1],$temp[2],off\n";
156 } else {
157 print FILE "$temp[0],$temp[1],$temp[2],on\n";
158 }
159 }
160 }
161 close(FILE);
162 system ('/usr/local/bin/restartshaping');
163}
164
165&General::readhash("${General::swroot}/shaping/settings", \%shapingsettings);
166
167if ($shapingsettings{'ACTION'} eq '')
168{
169 $shapingsettings{'SERVICE_ENABLED'} = 'on';
170 $shapingsettings{'SERVICE_PROT'} = 'tcp';
171 $shapingsettings{'SERVICE_PRIO'} = '20';
172 $shapingsettings{'SERVICE_PORT'} = '';
173}
174
175my %checked=();
176$checked{'ENABLE'}{'off'} = '';
177$checked{'ENABLE'}{'on'} = '';
178$checked{'ENABLE'}{$shapingsettings{'ENABLE'}} = "checked='checked'";
179
180my %service_checked=();
181$service_checked{'SERVICE_ENABLED'}{'off'} = '';
182$service_checked{'SERVICE_ENABLED'}{'on'} = '';
183$service_checked{'SERVICE_ENABLED'}{$shapingsettings{'SERVICE_ENABLED'}} = "checked='checked'";
184
185my %service_selected=();
186$service_selected{'SERVICE_PROT'}{'udp'} = '';
187$service_selected{'SERVICE_PROT'}{'tcp'} = '';
188$service_selected{'SERVICE_PROT'}{$shapingsettings{'SERVICE_PROT'}} = "selected='selected'";
189
190$service_selected{'SERVICE_PRIO'}{'10'} = '';
191$service_selected{'SERVICE_PRIO'}{'20'} = '';
192$service_selected{'SERVICE_PRIO'}{'30'} = '';
193$service_selected{'SERVICE_PRIO'}{$shapingsettings{'SERVICE_PRIO'}} = "selected='selected'";
194
195&Header::openpage($Lang::tr{'traffic shaping settings'}, 1, '');
196
197&Header::openbigbox('100%', 'left', '', $errormessage);
198
199if ($errormessage) {
200 &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
201 print "<font class='base'>$errormessage&nbsp;</font>\n";
202 &Header::closebox();
203}
204
205print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
206
207&Header::openbox('100%', 'left', "$Lang::tr{'settings'}:");
208print <<END
209<table width='100%'>
210<tr>
211 <td><input type='checkbox' name='ENABLE' $checked{'ENABLE'}{'on'} /></td>
212 <td class='base' colspan='2'>$Lang::tr{'traffic shaping'}</td>
213</tr>
214<tr>
215 <td>&nbsp;</td>
216 <td width='30%' class='base'>$Lang::tr{'downlink speed'}:&nbsp;</td>
217 <td width='70%'><input type='text' name='DOWNLINK' value='$shapingsettings{'DOWNLINK'}' size='5' /></td>
218</tr>
219<tr>
220 <td>&nbsp;</td>
221 <td class='base'>$Lang::tr{'uplink speed'}:&nbsp;</td>
222 <td><input type='text' name='UPLINK' value='$shapingsettings{'UPLINK'}' size='5' /></td>
223</tr>
224</table>
225<table width='100%'>
226<hr />
227<tr>
228 <td width='50%'> &nbsp; </td>
229 <td width='50%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
230</tr>
231</table>
232END
233;
234&Header::closebox;
235
236print "</form>\n";
237print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
238
239my $buttontext = $Lang::tr{'add'};
240if($shapingsettings{'ACTION'} eq $Lang::tr{'edit'}) {
241 $buttontext = $Lang::tr{'update'};
242 &Header::openbox('100%', 'left', $Lang::tr{'edit service'});
243} else {
244 &Header::openbox('100%', 'left', $Lang::tr{'add service'});
245}
246
247print <<END
248
249<table width='100%'>
250<tr>
251 <td class='base'>$Lang::tr{'priority'}:&nbsp;</td>
252 <td><select name='SERVICE_PRIO'>
253 <option value='10' $service_selected{'SERVICE_PRIO'}{'10'}>$Lang::tr{'high'}</option>
254 <option value='20' $service_selected{'SERVICE_PRIO'}{'20'}>$Lang::tr{'medium'}</option>
255 <option value='30' $service_selected{'SERVICE_PRIO'}{'30'}>$Lang::tr{'low'}</option>
256 </select></td>
257 <td width='20%' class='base' align='right'>$Lang::tr{'port'}:&nbsp;</td>
258 <td><input type='text' name='SERVICE_PORT' value='$shapingsettings{'SERVICE_PORT'}' size='5' /></td>
259 <td width='20%' class='base' align='right'>$Lang::tr{'protocol'}:&nbsp;</td>
260 <td><select name='SERVICE_PROT'>
261 <option value='tcp' $service_selected{'SERVICE_PROT'}{'tcp'}>TCP</option>
262 <option value='udp' $service_selected{'SERVICE_PROT'}{'udp'}>UDP</option>
263 </select></td>
264 <td width='20%' class='base' align='right'>$Lang::tr{'enabled'}&nbsp;</td>
265 <td width='20%'><input type='checkbox' name='SERVICE_ENABLED' $service_checked{'SERVICE_ENABLED'}{'on'} /></td>
266</tr>
267</table>
268<table width='100%'>
269<hr />
270<tr>
271 <td width='50%'>&nbsp;</td>
272 <td width='50%' align='center'><input type='submit' name='SUBMIT' value='$buttontext' /><input type='hidden' name='ACTION' value='$Lang::tr{'add'}' /></td>
273</tr>
274</table>
275END
276;
277&Header::closebox;
278
279if ($shapingsettings{'ACTION'} eq $Lang::tr{'edit'}) {
280 print "<input type='hidden' name='EDITING' value='$shapingsettings{'ID'}' />\n";
281} else {
282 print "<input type='hidden' name='EDITING' value='no' />\n";
283}
284
285print "</form>\n";
286
287&Header::openbox('100%', 'left', $Lang::tr{'shaping list options'});
288print <<END
289<table width='100%' align='center'>
290<tr>
291 <td width='33%' align='center' class='boldbase'><b>$Lang::tr{'priority'}</b></td>
292 <td width='33%' align='center' class='boldbase'><b>$Lang::tr{'port'}</b></td>
293 <td width='33%' align='center' class='boldbase'><b>$Lang::tr{'protocol'}</b></td>
294 <td align='center' class='boldbase' colspan='3'><b>$Lang::tr{'action'}</b></td>
295</tr>
296END
297;
298
299my $id = 0;
300open(SERVICES, "$configfile") or die 'Unable to open shaping config file.';
301while (<SERVICES>)
302{
303 my $gif = '';
304 my $prio = '';
305 my $gdesc = '';
306 $id++;
307 chomp($_);
308 my @temp = split(/\,/,$_);
309 if ($temp[3] eq "on") {
310 $gif = 'on.gif'; $gdesc=$Lang::tr{'click to disable'}; }
311 else {
312 $gif = 'off.gif'; $gdesc=$Lang::tr{'click to enable'}; }
313 if ($shapingsettings{'ACTION'} eq $Lang::tr{'edit'} && $shapingsettings{'ID'} eq $id) {
314 print "<tr bgcolor='${Header::colouryellow}'>\n"; }
315 elsif ($id % 2) {
316 print "<tr bgcolor='${Header::table1colour}'>\n"; }
317 else {
318 print "<tr bgcolor='${Header::table2colour}'>\n"; }
319 if ($temp[2] eq "10") { $prio = $Lang::tr{'high'}; }
320 if ($temp[2] eq "20") { $prio = $Lang::tr{'medium'}; }
321 if ($temp[2] eq "30") { $prio = $Lang::tr{'low'}; }
322
323print <<END
324<td align='center'>$prio</td>
325<td align='center'>$temp[1]</td>
326<td align='center'>$temp[0]</td>
327
328<td align='center'>
329 <form method='post' action='$ENV{'SCRIPT_NAME'}' name='frma$id'>
330 <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' alt='$gdesc' title='$gdesc' />
331 <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />
332 <input type='hidden' name='ID' value='$id' />
333 </form>
334</td>
335
336<td align='center'>
337 <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>
338 <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' title='$Lang::tr{'edit'}' alt='$Lang::tr{'edit'}' />
339 <input type='hidden' name='ID' value='$id' />
340 <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />
341 </form>
342</td>
343
344<td align='center'>
345 <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>
346 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
347 <input type='hidden' name='ID' value='$id' />
348 <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />
349 </form>
350</td>
351
352</tr>
353END
354;
355}
356close(SERVICES);
357
358print <<END
359</table>
360END
361;
362&Header::closebox;
363
364
365&Header::closebigbox();
366
367&Header::closepage;