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