]> git.ipfire.org Git - ipfire-2.x.git/blob - html/cgi-bin/shaping.cgi
Großes Update:
[ipfire-2.x.git] / html / cgi-bin / shaping.cgi
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
10 use strict;
11
12 # enable only the following on debugging purpose
13 #use warnings;
14 #use CGI::Carp 'fatalsToBrowser';
15
16 require 'CONFIG_ROOT/general-functions.pl';
17 require "${General::swroot}/lang.pl";
18 require "${General::swroot}/header.pl";
19
20 #workaround to suppress a warning when a variable is used only once
21 my @dummy = ( ${Header::table2colour}, ${Header::colouryellow} );
22 undef (@dummy);
23
24 my %shapingsettings=();
25 my $configfile = "${General::swroot}/shaping/config";
26 my $settingsfile = "${General::swroot}/shaping/settings";
27 my $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
43 open(FILE, "$configfile") or die 'Unable to open shaping config file.';
44 my @current = <FILE>;
45 close(FILE);
46
47 if ($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
63 ERROR:
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 }
81 if ($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
123 if ($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
141 if ($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
167 if ($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
175 my %checked=();
176 $checked{'ENABLE'}{'off'} = '';
177 $checked{'ENABLE'}{'on'} = '';
178 $checked{'ENABLE'}{$shapingsettings{'ENABLE'}} = "checked='checked'";
179
180 my %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
185 my %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
199 if ($errormessage) {
200 &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
201 print "<font class='base'>$errormessage&nbsp;</font>\n";
202 &Header::closebox();
203 }
204
205 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
206
207 &Header::openbox('100%', 'left', "$Lang::tr{'settings'}:");
208 print <<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>
232 END
233 ;
234 &Header::closebox;
235
236 print "</form>\n";
237 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
238
239 my $buttontext = $Lang::tr{'add'};
240 if($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
247 print <<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>
275 END
276 ;
277 &Header::closebox;
278
279 if ($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
285 print "</form>\n";
286
287 &Header::openbox('100%', 'left', $Lang::tr{'shaping list options'});
288 print <<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>
296 END
297 ;
298
299 my $id = 0;
300 open(SERVICES, "$configfile") or die 'Unable to open shaping config file.';
301 while (<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
323 print <<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>
353 END
354 ;
355 }
356 close(SERVICES);
357
358 print <<END
359 </table>
360 END
361 ;
362 &Header::closebox;
363
364
365 &Header::closebigbox();
366
367 &Header::closepage;