]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - html/cgi-bin/shaping.cgi
git-svn-id: http://svn.ipfire.org/svn/ipfire/IPFire/source@16 ea5c0bd1-69bd-2848...
[people/pmueller/ipfire-2.x.git] / html / cgi-bin / shaping.cgi
diff --git a/html/cgi-bin/shaping.cgi b/html/cgi-bin/shaping.cgi
new file mode 100644 (file)
index 0000000..381bbf1
--- /dev/null
@@ -0,0 +1,367 @@
+#!/usr/bin/perl\r
+#\r
+#  Traffic shaping CGI\r
+#\r
+#  Copyright 2003-04-06 David Kilpatrick <dave@thunder.com.au>\r
+#\r
+# $Id: shaping.cgi,v 1.3.2.15 2005/02/27 13:42:05 eoberlander Exp $\r
+#\r
+\r
+use strict;\r
+\r
+# enable only the following on debugging purpose\r
+#use warnings;\r
+#use CGI::Carp 'fatalsToBrowser';\r
+\r
+require 'CONFIG_ROOT/general-functions.pl';\r
+require "${General::swroot}/lang.pl";\r
+require "${General::swroot}/header.pl";\r
+\r
+#workaround to suppress a warning when a variable is used only once\r
+my @dummy = ( ${Header::table2colour}, ${Header::colouryellow} );\r
+undef (@dummy);\r
+\r
+my %shapingsettings=();\r
+my $configfile = "${General::swroot}/shaping/config";\r
+my $settingsfile = "${General::swroot}/shaping/settings";\r
+my $errormessage = '';\r
+\r
+&Header::showhttpheaders();\r
+\r
+$shapingsettings{'ACTION'} = '';\r
+$shapingsettings{'ENABLE'} = 'off';\r
+$shapingsettings{'VALID'} = '';\r
+$shapingsettings{'UPLINK'} = '';\r
+$shapingsettings{'DOWNLINK'} = '';\r
+$shapingsettings{'SERVICE_ENABLED'} = '';\r
+$shapingsettings{'SERVICE_PROT'} = '';\r
+$shapingsettings{'SERVICE_PRIO'} = '';\r
+$shapingsettings{'SERVICE_PORT'} = '';\r
+\r
+&Header::getcgihash(\%shapingsettings);\r
+\r
+open(FILE, "$configfile") or die 'Unable to open shaping config file.';\r
+my @current = <FILE>;\r
+close(FILE);\r
+\r
+if ($shapingsettings{'ACTION'} eq $Lang::tr{'save'})\r
+{\r
+       if (!($shapingsettings{'UPLINK'} =~ /^\d+$/) ||\r
+          ($shapingsettings{'UPLINK'} < 2))\r
+       {\r
+               $errormessage = $Lang::tr{'invalid uplink speed'};\r
+               goto ERROR;\r
+       }\r
+\r
+       if (!($shapingsettings{'DOWNLINK'} =~ /^\d+$/) ||\r
+            ($shapingsettings{'DOWNLINK'} < 2))\r
+       {\r
+               $errormessage = $Lang::tr{'invalid downlink speed'};\r
+               goto ERROR;\r
+       }\r
+\r
+ERROR:\r
+       if ($errormessage) {\r
+               $shapingsettings{'VALID'} = 'no'; }\r
+       else {\r
+               $shapingsettings{'VALID'} = 'yes'; }\r
+       \r
+       open(FILE,">$settingsfile") or die 'Unable to open shaping settings file.';\r
+       flock FILE, 2;\r
+       print FILE "VALID=$shapingsettings{'VALID'}\n";\r
+       print FILE "ENABLE=$shapingsettings{'ENABLE'}\n";\r
+       print FILE "UPLINK=$shapingsettings{'UPLINK'}\n";\r
+       print FILE "DOWNLINK=$shapingsettings{'DOWNLINK'}\n";\r
+       close FILE;\r
+\r
+       if ($shapingsettings{'VALID'} eq 'yes') {\r
+               system('/usr/local/bin/restartshaping');\r
+       }\r
+}\r
+if ($shapingsettings{'ACTION'} eq $Lang::tr{'add'})\r
+{\r
+       unless($shapingsettings{'SERVICE_PROT'} =~ /^(tcp|udp)$/) { $errormessage = $Lang::tr{'invalid input'}; }\r
+       unless($shapingsettings{'SERVICE_PRIO'} =~ /^(10|20|30)$/) { $errormessage = $Lang::tr{'invalid input'}; }\r
+       unless(&General::validport($shapingsettings{'SERVICE_PORT'})) { $errormessage = $Lang::tr{'invalid port'}; }\r
+\r
+       if ( ! $errormessage)\r
+       {\r
+               if ($shapingsettings{'EDITING'} eq 'no')\r
+               {\r
+                       open(FILE,">>$configfile") or die 'Unable to open shaping config file';\r
+                       flock FILE, 2;\r
+                       print FILE "$shapingsettings{'SERVICE_PROT'},$shapingsettings{'SERVICE_PORT'},$shapingsettings{'SERVICE_PRIO'},$shapingsettings{'SERVICE_ENABLED'}\n";\r
+               } else {\r
+                       open(FILE,">$configfile") or die 'Unable to open shaping config file';\r
+                       flock FILE, 2;\r
+                       my $id = 0;\r
+                       foreach my $line (@current)\r
+                       {\r
+                               $id++;\r
+                               chomp($line);\r
+                               my @temp = split(/\,/,$line);\r
+                               if ($shapingsettings{'EDITING'} eq $id) {\r
+                                       print FILE "$shapingsettings{'SERVICE_PROT'},$shapingsettings{'SERVICE_PORT'},$shapingsettings{'SERVICE_PRIO'},$shapingsettings{'SERVICE_ENABLED'}\n";\r
+                               } else {\r
+                                       print FILE "$line\n";\r
+                               }\r
+                       }\r
+               }\r
+               close FILE;\r
+               undef %shapingsettings;\r
+               system ('/usr/local/bin/restartshaping');\r
+       } else {\r
+               # stay on edit mode if an error occur\r
+               if ($shapingsettings{'EDITING'} ne 'no')\r
+               {\r
+                       $shapingsettings{'ACTION'} = $Lang::tr{'edit'};\r
+                       $shapingsettings{'ID'} = $shapingsettings{'EDITING'};\r
+               }\r
+       }\r
+}\r
+\r
+if ($shapingsettings{'ACTION'} eq $Lang::tr{'edit'})\r
+{\r
+       my $id = 0;\r
+       foreach my $line (@current)\r
+       {\r
+               $id++;\r
+               if ($shapingsettings{"ID"} eq $id)\r
+               {\r
+                       chomp($line);\r
+                       my @temp = split(/\,/,$line);\r
+                       $shapingsettings{'SERVICE_PROT'} = $temp[0];\r
+                       $shapingsettings{'SERVICE_PORT'} = $temp[1];\r
+                       $shapingsettings{'SERVICE_PRIO'} = $temp[2];\r
+                       $shapingsettings{'SERVICE_ENABLED'} = $temp[3];\r
+               }\r
+       }\r
+}\r
+\r
+if ($shapingsettings{'ACTION'} eq $Lang::tr{'remove'} || $shapingsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})\r
+{\r
+       open(FILE, ">$configfile") or die 'Unable to open config file.';\r
+       flock FILE, 2;\r
+       my $id = 0;\r
+       foreach my $line (@current)\r
+       {\r
+               $id++;\r
+               unless ($shapingsettings{"ID"} eq $id) { print FILE "$line"; }\r
+               elsif ($shapingsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})\r
+               {\r
+                       chomp($line);\r
+                       my @temp = split(/\,/,$line);\r
+                       if ($temp[3] eq "on") {\r
+                               print FILE "$temp[0],$temp[1],$temp[2],off\n";\r
+                       } else {\r
+                               print FILE "$temp[0],$temp[1],$temp[2],on\n";\r
+                       }\r
+               }\r
+       }\r
+       close(FILE);\r
+       system ('/usr/local/bin/restartshaping');\r
+}\r
+\r
+&General::readhash("${General::swroot}/shaping/settings", \%shapingsettings);\r
+\r
+if ($shapingsettings{'ACTION'} eq '')\r
+{\r
+       $shapingsettings{'SERVICE_ENABLED'} = 'on';\r
+       $shapingsettings{'SERVICE_PROT'} = 'tcp';\r
+       $shapingsettings{'SERVICE_PRIO'} = '20';\r
+       $shapingsettings{'SERVICE_PORT'} = '';\r
+}\r
+\r
+my %checked=();\r
+$checked{'ENABLE'}{'off'} = '';\r
+$checked{'ENABLE'}{'on'} = '';\r
+$checked{'ENABLE'}{$shapingsettings{'ENABLE'}} = "checked='checked'";\r
+\r
+my %service_checked=();\r
+$service_checked{'SERVICE_ENABLED'}{'off'} = '';\r
+$service_checked{'SERVICE_ENABLED'}{'on'} = '';\r
+$service_checked{'SERVICE_ENABLED'}{$shapingsettings{'SERVICE_ENABLED'}} = "checked='checked'";\r
+\r
+my %service_selected=();\r
+$service_selected{'SERVICE_PROT'}{'udp'} = '';\r
+$service_selected{'SERVICE_PROT'}{'tcp'} = '';\r
+$service_selected{'SERVICE_PROT'}{$shapingsettings{'SERVICE_PROT'}} = "selected='selected'";\r
+\r
+$service_selected{'SERVICE_PRIO'}{'10'} = '';\r
+$service_selected{'SERVICE_PRIO'}{'20'} = '';\r
+$service_selected{'SERVICE_PRIO'}{'30'} = '';\r
+$service_selected{'SERVICE_PRIO'}{$shapingsettings{'SERVICE_PRIO'}} = "selected='selected'";\r
+\r
+&Header::openpage($Lang::tr{'traffic shaping settings'}, 1, '');\r
+\r
+&Header::openbigbox('100%', 'left', '', $errormessage);\r
+\r
+if ($errormessage) {\r
+       &Header::openbox('100%', 'left', $Lang::tr{'error messages'});\r
+       print "<font class='base'>$errormessage&nbsp;</font>\n";\r
+       &Header::closebox();\r
+}\r
+\r
+print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";\r
+\r
+&Header::openbox('100%', 'left', "$Lang::tr{'settings'}:");\r
+print <<END\r
+<table width='100%'>\r
+<tr>\r
+       <td><input type='checkbox' name='ENABLE' $checked{'ENABLE'}{'on'} /></td>\r
+       <td class='base' colspan='2'>$Lang::tr{'traffic shaping'}</td>\r
+</tr>\r
+<tr>\r
+       <td>&nbsp;</td>\r
+       <td width='30%' class='base'>$Lang::tr{'downlink speed'}:&nbsp;</td>\r
+       <td width='70%'><input type='text' name='DOWNLINK' value='$shapingsettings{'DOWNLINK'}' size='5' /></td>\r
+</tr>\r
+<tr>\r
+       <td>&nbsp;</td>\r
+       <td class='base'>$Lang::tr{'uplink speed'}:&nbsp;</td>\r
+       <td><input type='text' name='UPLINK' value='$shapingsettings{'UPLINK'}' size='5' /></td>\r
+</tr>\r
+</table>\r
+<table width='100%'>\r
+<hr />\r
+<tr>\r
+       <td width='50%'> &nbsp; </td>\r
+       <td width='50%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>\r
+</tr>\r
+</table>\r
+END\r
+;\r
+&Header::closebox;\r
+\r
+print "</form>\n";\r
+print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";\r
+\r
+my $buttontext = $Lang::tr{'add'};\r
+if($shapingsettings{'ACTION'} eq $Lang::tr{'edit'}) {\r
+       $buttontext = $Lang::tr{'update'};\r
+       &Header::openbox('100%', 'left', $Lang::tr{'edit service'});\r
+} else {\r
+       &Header::openbox('100%', 'left', $Lang::tr{'add service'});\r
+}\r
+\r
+print <<END\r
+\r
+<table width='100%'>\r
+<tr>\r
+       <td class='base'>$Lang::tr{'priority'}:&nbsp;</td>\r
+       <td><select name='SERVICE_PRIO'>\r
+               <option value='10' $service_selected{'SERVICE_PRIO'}{'10'}>$Lang::tr{'high'}</option>\r
+               <option value='20' $service_selected{'SERVICE_PRIO'}{'20'}>$Lang::tr{'medium'}</option>\r
+               <option value='30' $service_selected{'SERVICE_PRIO'}{'30'}>$Lang::tr{'low'}</option>\r
+       </select></td>\r
+       <td width='20%' class='base' align='right'>$Lang::tr{'port'}:&nbsp;</td>\r
+       <td><input type='text' name='SERVICE_PORT' value='$shapingsettings{'SERVICE_PORT'}' size='5' /></td>\r
+       <td width='20%' class='base' align='right'>$Lang::tr{'protocol'}:&nbsp;</td>\r
+       <td><select name='SERVICE_PROT'>\r
+                               <option value='tcp' $service_selected{'SERVICE_PROT'}{'tcp'}>TCP</option>\r
+                               <option value='udp' $service_selected{'SERVICE_PROT'}{'udp'}>UDP</option>\r
+                       </select></td>\r
+       <td width='20%' class='base' align='right'>$Lang::tr{'enabled'}&nbsp;</td> \r
+       <td width='20%'><input type='checkbox' name='SERVICE_ENABLED' $service_checked{'SERVICE_ENABLED'}{'on'} /></td>\r
+</tr>\r
+</table>\r
+<table width='100%'>\r
+<hr />\r
+<tr>\r
+       <td width='50%'>&nbsp;</td>\r
+       <td width='50%' align='center'><input type='submit' name='SUBMIT' value='$buttontext' /><input type='hidden' name='ACTION' value='$Lang::tr{'add'}' /></td>\r
+</tr>\r
+</table>\r
+END\r
+;\r
+&Header::closebox;\r
+\r
+if ($shapingsettings{'ACTION'} eq $Lang::tr{'edit'}) {\r
+       print "<input type='hidden' name='EDITING' value='$shapingsettings{'ID'}' />\n";\r
+} else {\r
+       print "<input type='hidden' name='EDITING' value='no' />\n";\r
+}\r
+\r
+print "</form>\n";\r
+\r
+&Header::openbox('100%', 'left', $Lang::tr{'shaping list options'});\r
+print <<END\r
+<table width='100%' align='center'>\r
+<tr>\r
+       <td width='33%' align='center' class='boldbase'><b>$Lang::tr{'priority'}</b></td>\r
+       <td width='33%' align='center' class='boldbase'><b>$Lang::tr{'port'}</b></td>\r
+       <td width='33%' align='center' class='boldbase'><b>$Lang::tr{'protocol'}</b></td>\r
+       <td align='center' class='boldbase' colspan='3'><b>$Lang::tr{'action'}</b></td>\r
+</tr>\r
+END\r
+;\r
+\r
+my $id = 0;\r
+open(SERVICES, "$configfile") or die 'Unable to open shaping config file.';\r
+while (<SERVICES>)\r
+{\r
+       my $gif = '';\r
+       my $prio = '';\r
+       my $gdesc = '';\r
+       $id++;\r
+       chomp($_);\r
+       my @temp = split(/\,/,$_);\r
+       if ($temp[3] eq "on") {\r
+               $gif = 'on.gif';  $gdesc=$Lang::tr{'click to disable'}; }\r
+       else {\r
+               $gif = 'off.gif'; $gdesc=$Lang::tr{'click to enable'};  }\r
+       if ($shapingsettings{'ACTION'} eq $Lang::tr{'edit'} && $shapingsettings{'ID'} eq $id) {\r
+               print "<tr bgcolor='${Header::colouryellow}'>\n"; }\r
+       elsif ($id % 2) {\r
+               print "<tr bgcolor='${Header::table1colour}'>\n"; }\r
+       else {\r
+               print "<tr bgcolor='${Header::table2colour}'>\n"; }\r
+       if ($temp[2] eq "10") { $prio = $Lang::tr{'high'}; }\r
+       if ($temp[2] eq "20") { $prio = $Lang::tr{'medium'}; }\r
+       if ($temp[2] eq "30") { $prio = $Lang::tr{'low'}; }\r
+       \r
+print <<END\r
+<td align='center'>$prio</td>\r
+<td align='center'>$temp[1]</td>\r
+<td align='center'>$temp[0]</td>\r
+\r
+<td align='center'>\r
+       <form method='post' action='$ENV{'SCRIPT_NAME'}' name='frma$id'>\r
+       <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' alt='$gdesc' title='$gdesc' />\r
+       <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />\r
+       <input type='hidden' name='ID' value='$id' />\r
+       </form>\r
+</td>\r
+\r
+<td align='center'>\r
+       <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>\r
+       <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' title='$Lang::tr{'edit'}' alt='$Lang::tr{'edit'}' />\r
+       <input type='hidden' name='ID' value='$id' />\r
+       <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />\r
+       </form>\r
+</td>\r
+\r
+<td align='center'>\r
+       <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>\r
+       <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />\r
+       <input type='hidden' name='ID' value='$id' />\r
+       <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />\r
+       </form>\r
+</td>\r
+\r
+</tr>\r
+END\r
+;\r
+}\r
+close(SERVICES);\r
+\r
+print <<END\r
+</table>\r
+END\r
+;\r
+&Header::closebox;\r
+\r
+\r
+&Header::closebigbox();\r
+\r
+&Header::closepage;\r