]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - html/cgi-bin/wireless.cgi
git-svn-id: http://svn.ipfire.org/svn/ipfire/IPFire/source@16 ea5c0bd1-69bd-2848...
[ipfire-2.x.git] / html / cgi-bin / wireless.cgi
diff --git a/html/cgi-bin/wireless.cgi b/html/cgi-bin/wireless.cgi
new file mode 100644 (file)
index 0000000..8b2bbb8
--- /dev/null
@@ -0,0 +1,508 @@
+#!/usr/bin/perl\r
+#\r
+# IPCop CGIs\r
+#\r
+# This code is distributed under the terms of the GPL\r
+#\r
+# (c) 2003 Alan Hourihane <alanh@fairlite.demon.co.uk>\r
+# (c) 2005 Eric Oberlander, Robert Kerr - Inline editing & DHCP leases\r
+#\r
+# $Id: wireless.cgi,v 1.4.2.15 2005/06/11 12:14:49 eoberlander Exp $\r
+#\r
+\r
+use strict;\r
+use Time::Local;\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::colouryellow} );\r
+undef (@dummy);\r
+\r
+my %cgiparams=();\r
+my %checked=();\r
+my $errormessage = '';\r
+my $filename = "${General::swroot}/wireless/config";\r
+my $hostsfile = "${General::swroot}/main/hosts";\r
+our %dhcpsettings=(); \r
+our %netsettings=();\r
+\r
+$cgiparams{'ENABLED'} = 'off';\r
+$cgiparams{'ACTION'} = '';\r
+$cgiparams{'VALID'} = '';\r
+$cgiparams{'SOURCE_IP'} ='';\r
+$cgiparams{'SOURCE_MAC'} ='';\r
+$cgiparams{'REMARK'} ='';\r
+\r
+&Header::getcgihash(\%cgiparams);\r
+\r
+&General::readhash("${General::swroot}/dhcp/settings", \%dhcpsettings);\r
+&General::readhash("${General::swroot}/ethernet/settings", \%netsettings);\r
+\r
+&Header::showhttpheaders();\r
+\r
+open(FILE, $filename) or die 'Unable to open config file.';\r
+my @current = <FILE>;\r
+close(FILE);\r
+\r
+if ($cgiparams{'ACTION'} eq 'add')\r
+{\r
+\r
+       if ($cgiparams{'SOURCE_IP'} eq '' && $cgiparams{'SOURCE_MAC'} eq '')\r
+       {\r
+               goto ADDEXIT;\r
+       }\r
+\r
+       $cgiparams{'SOURCE_MAC'} =~ tr/-/:/;\r
+\r
+       my $key = 0;\r
+       foreach my $line (@current)\r
+       {\r
+               $key++;\r
+               my @temp = split(/\,/,$line);\r
+\r
+               if ($temp[1] ne '' && $cgiparams{'SOURCE_IP'} eq $temp[1] && $cgiparams{'EDITING'} ne $key)\r
+               {\r
+                       $errormessage = $Lang::tr{'duplicate ip'};\r
+                       goto ADDERROR;\r
+               }\r
+               if ($temp[2] ne '' && lc($cgiparams{'SOURCE_MAC'}) eq lc($temp[2]) && $cgiparams{'EDITING'} ne $key)\r
+               {\r
+                       $errormessage = $Lang::tr{'duplicate mac'};\r
+                       goto ADDERROR;\r
+               }\r
+       }\r
+\r
+       if ($cgiparams{'SOURCE_IP'} eq '')\r
+       {\r
+               $cgiparams{'SOURCE_IP'} = 'NONE';\r
+       } else {\r
+               unless(&General::validip($cgiparams{'SOURCE_IP'})) \r
+               {\r
+                       $errormessage = $Lang::tr{'invalid fixed ip address'}; \r
+                       goto ADDERROR;\r
+               }\r
+       }\r
+       if ($cgiparams{'SOURCE_MAC'} eq '')\r
+       {\r
+               $cgiparams{'SOURCE_MAC'} = 'NONE';\r
+       } else {\r
+               unless(&General::validmac($cgiparams{'SOURCE_MAC'})) \r
+               { \r
+                       $errormessage = $Lang::tr{'invalid fixed mac address'}; \r
+               }\r
+       }\r
+\r
+ADDERROR:\r
+       if ($errormessage)\r
+       {\r
+               $cgiparams{'SOURCE_MAC'} = '' if $cgiparams{'SOURCE_MAC'} eq 'NONE';\r
+               $cgiparams{'SOURCE_IP'} = '' if $cgiparams{'SOURCE_IP'} eq 'NONE';\r
+       } else {\r
+               if ($cgiparams{'EDITING'} eq 'no') {\r
+                       open(FILE,">>$filename") or die 'Unable to open config file.';\r
+                       flock FILE, 2;\r
+                       print FILE "$key,$cgiparams{'SOURCE_IP'},$cgiparams{'SOURCE_MAC'},$cgiparams{'ENABLED'},$cgiparams{'REMARK'}\n";\r
+               } else {\r
+                       open(FILE,">$filename") or die 'Unable to open config file.';\r
+                       flock FILE, 2;\r
+                       my $id = 0;\r
+                       foreach my $line (@current)\r
+                       {\r
+                               $id++;\r
+                               if ($cgiparams{'EDITING'} eq $id) {\r
+                                       print FILE "$id,$cgiparams{'SOURCE_IP'},$cgiparams{'SOURCE_MAC'},$cgiparams{'ENABLED'},$cgiparams{'REMARK'}\n";\r
+                               } else { print FILE "$line"; }\r
+                       }\r
+               }\r
+               close(FILE);\r
+               undef %cgiparams;\r
+               &General::log($Lang::tr{'wireless config added'});\r
+               system('/usr/local/bin/restartwireless');\r
+       }\r
+ADDEXIT:\r
+}\r
+\r
+if ($cgiparams{'ACTION'} eq 'edit')\r
+{\r
+       my $id = 0;\r
+       foreach my $line (@current)\r
+       {\r
+               $id++;\r
+               if ($cgiparams{'ID'} eq $id)\r
+               {\r
+                       chomp($line);\r
+                       my @temp = split(/\,/,$line);\r
+                       $cgiparams{'SOURCE_IP'}  = $temp[1];\r
+                       $cgiparams{'SOURCE_MAC'} = $temp[2];\r
+                       $cgiparams{'ENABLED'}    = $temp[3];\r
+                       $cgiparams{'REMARK'}     = $temp[4];\r
+                       $cgiparams{'SOURCE_IP'} = '' if $cgiparams{'SOURCE_IP'} eq 'NONE';\r
+                       $cgiparams{'SOURCE_MAC'} = '' if $cgiparams{'SOURCE_MAC'} eq 'NONE';\r
+               }\r
+       }\r
+       &General::log($Lang::tr{'wireless config changed'});\r
+       system('/usr/local/bin/restartwireless');\r
+}\r
+\r
+if ($cgiparams{'ACTION'} eq 'remove' || $cgiparams{'ACTION'} eq 'toggle')\r
+{\r
+       my $id = 0;\r
+       open(FILE, ">$filename") or die 'Unable to open config file.';\r
+       flock FILE, 2;\r
+       foreach my $line (@current)\r
+       {\r
+               $id++;\r
+               unless ($cgiparams{'ID'} eq $id) { print FILE "$line"; }\r
+               elsif ($cgiparams{'ACTION'} eq 'toggle')\r
+               {\r
+                       chomp($line);\r
+                       my @temp = split(/\,/,$line);\r
+                       print FILE "$temp[0],$temp[1],$temp[2],$cgiparams{'ENABLE'},$temp[4]\n";\r
+               }\r
+       }\r
+       close(FILE);\r
+       &General::log($Lang::tr{'wireless config changed'});\r
+       system('/usr/local/bin/restartwireless');\r
+}\r
+\r
+\r
+$checked{'ENABLED'}{'off'} = '';\r
+$checked{'ENABLED'}{'on'} = '';\r
+$checked{'ENABLED'}{$cgiparams{'ENABLED'}} = "checked='checked'";\r
+\r
+\r
+&Header::openpage($Lang::tr{'wireless configuration'}, 1, '');\r
+\r
+&Header::openbigbox('100%', 'left', '', $errormessage);\r
+\r
+if ($errormessage) {\r
+       &Header::openbox('100%', 'left', $Lang::tr{'error messages'});\r
+       print "<class name='base'>$errormessage\n";\r
+       print "&nbsp;</class>\n";\r
+       &Header::closebox();\r
+}\r
+\r
+print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";\r
+\r
+my $buttontext = $Lang::tr{'add'};\r
+if ($cgiparams{'ACTION'} eq 'edit') {\r
+       &Header::openbox('100%', 'left', "$Lang::tr{'edit device'}");\r
+       $buttontext = $Lang::tr{'update'};\r
+} else {\r
+       &Header::openbox('100%', 'left', "$Lang::tr{'add device'}");\r
+}\r
+\r
+print <<END\r
+<table width='100%'>\r
+<tr>\r
+<td width='25%' class='base'>$Lang::tr{'source ip'}:&nbsp;</td>\r
+<td width='25%' ><input type='text' name='SOURCE_IP' value='$cgiparams{'SOURCE_IP'}' size='25' /></td>\r
+<td width='25%' class='base' align='right'>$Lang::tr{'enabled'}&nbsp;</td>\r
+<td width='25%'><input type='checkbox' name='ENABLED' $checked{'ENABLED'}{'on'} /></td>\r
+</tr>\r
+<tr>\r
+<td width='25%' class='base'>$Lang::tr{'source'} $Lang::tr{'mac address'}:&nbsp;</td>\r
+<td colspan='3'><input type='text' name='SOURCE_MAC' value='$cgiparams{'SOURCE_MAC'}' size='25' /></td>\r
+</tr>\r
+<tr>\r
+<td width='25%' class='base'>$Lang::tr{'remark'}:&nbsp;<img src='/blob.gif' alt='*' /></td>\r
+<td colspan='3'><input type='text' name='REMARK' value='$cgiparams{'REMARK'}' size='40' /></td>\r
+</tr>\r
+</table>\r
+<hr />\r
+<table width='100%'>\r
+<tr>\r
+    <td class='base' valign='top'><img src='/blob.gif' alt='*' /></td>\r
+    <td width='55%' class='base'>$Lang::tr{'this field may be blank'}</td>\r
+    <td width='40%' align='center'>\r
+      <input type='hidden' name='ACTION' value='add' />\r
+      <input type='submit' name='SUBMIT' value='$buttontext' />\r
+    </td>\r
+    <td width='5%' align='right'>\r
+    <a href='${General::adminmanualurl}/section-firewall.html#section-blue-access' target='_blank'>\r
+    <img src='/images/web-support.png' alt='$Lang::tr{'online help en'}' title='$Lang::tr{'online help en'}' /></a></td>\r
+</tr>\r
+</table>\r
+END\r
+;\r
+\r
+if ($cgiparams{'ACTION'} eq 'edit') {\r
+       print "<input type='hidden' name='EDITING' value='$cgiparams{'ID'}' />\n";\r
+} else {\r
+       print "<input type='hidden' name='EDITING' value='no' />\n";\r
+}\r
+\r
+&Header::closebox();\r
+\r
+print "</form>\n";\r
+\r
+&Header::openbox('100%', 'left', "$Lang::tr{'devices on blue'}");\r
+print <<END\r
+<div align='center'>\r
+END\r
+;\r
+open (FILE, "$filename");\r
+my @current = <FILE>;\r
+close (FILE);\r
+\r
+print <<END\r
+<table width='100%'>\r
+<tr>\r
+<td align='center' width='20%'><b>$Lang::tr{'hostname'}</b></td>\r
+<td align='center' width='20%'><b>$Lang::tr{'source ip'}</b></td>\r
+<td align='center' width='20%'><b>$Lang::tr{'mac address'}</b></td>\r
+<td align='center' width='35%'><b>$Lang::tr{'remark'}</b></td>\r
+<td align='center' colspan='3'><b>$Lang::tr{'action'}</b></td>\r
+</tr>\r
+END\r
+;\r
+\r
+my $id = 0;\r
+\r
+open (HOSTFILE, "$hostsfile");\r
+my @curhosts = <HOSTFILE>;\r
+close (HOSTFILE);\r
+\r
+my $connstate = &Header::connectionstatus();\r
+my @arp = `/sbin/arp -n`;\r
+shift @arp;\r
+\r
+foreach my $line (@current)\r
+{\r
+       $id++;\r
+       chomp($line);\r
+       my $gif = "";\r
+       my $gdesc = "";\r
+       my $hname = "";\r
+       my $toggle = "";\r
+       my @temp = split(/\,/,$line);\r
+       my $wirelessid = $temp[0];\r
+       my $sourceip = $temp[1];\r
+       my $sourcemac = $temp[2];\r
+       if ( $sourceip eq 'NONE' ) {\r
+               foreach my $aline ( @arp )\r
+               {\r
+                       chomp($aline);\r
+                       my @atemp = split( m{\s+}, $aline );\r
+                       my $aipaddr = $atemp[0];\r
+                       my $amacaddr = lc( $atemp[2] );\r
+                       if ( $amacaddr eq $sourcemac ) {\r
+                               $sourceip = $aipaddr;\r
+                               last;\r
+                       }\r
+               }\r
+       }\r
+\r
+       # SourceIP could now have been set by the ARP probe.\r
+       if ( $sourceip ne 'NONE' ) {\r
+               foreach my $hline (@curhosts)\r
+               {\r
+                       chomp($hline);\r
+                       my @htemp = split(/\,/,$hline);\r
+                       my $hkey = $htemp[0];\r
+                       my $hipaddr = $htemp[1];\r
+                       my $hostname = $htemp[2];\r
+                       my $domainname = $htemp[3];\r
+                       if ($sourceip eq $hipaddr) {\r
+                               $hname = "$hostname.$domainname";\r
+                               last;\r
+                       }\r
+               }\r
+               if ( $hname eq "" ) {\r
+                       my ($aliases, $addrtype, $length, @addrs);\r
+                       ($hname, $aliases, $addrtype, $length, @addrs) = \r
+                               gethostbyaddr(pack("C4", split(/\./,  $sourceip)), 2);\r
+               }\r
+       }\r
+\r
+       if ($temp[3] eq 'on') { $gif = 'on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};}\r
+               else { $gif = 'off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'};}\r
+\r
+       my $remark    = &Header::cleanhtml($temp[4]);\r
+\r
+       if ($cgiparams{'ACTION'} eq 'edit' && $cgiparams{'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
+       }\r
+       print "<td align='center'>$hname</td>\n";\r
+       print "<td align='center'>$sourceip</td>\n";\r
+       print "<td align='center'>$sourcemac</td>\n";\r
+       print "<td align='center'>$remark</td>\n";\r
+print<<END\r
+<td align='center'>\r
+       <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>\r
+       <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' alt='$gdesc' title='$gdesc' />\r
+       <input type='hidden' name='ACTION' value='toggle'}' />\r
+       <input type='hidden' name='ID' value='$id' />\r
+       <input type='hidden' name='ENABLE' value='$toggle' />\r
+       </form>\r
+</td>\r
+\r
+<td align='center'>\r
+       <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>\r
+       <input type='hidden' name='ACTION' value='edit' />\r
+       <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' alt='$Lang::tr{'edit'}' title='$Lang::tr{'edit'}' />\r
+       <input type='hidden' name='ID' value='$id' />\r
+       </form>\r
+</td>\r
+\r
+<td align='center'>\r
+       <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>\r
+       <input type='hidden' name='ACTION' value='remove' />\r
+       <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' alt='$Lang::tr{'remove'}' title='$Lang::tr{'remove'}' />\r
+       <input type='hidden' name='ID' value='$id' />\r
+       </form>\r
+</td>\r
+END\r
+       ;\r
+       print "</tr>\n";\r
+}\r
+print "</table>\n";\r
+\r
+print "</div>\n";\r
+\r
+&Header::closebox();\r
+\r
+if ( $dhcpsettings{"ENABLE_BLUE"} eq 'on') {\r
+       &printblueleases;\r
+}\r
+\r
+&Header::closebigbox();\r
+\r
+&Header::closepage();\r
+\r
+sub printblueleases\r
+{\r
+       our %entries = ();\r
+\r
+       sub blueleasesort {\r
+               # Sort by IP address\r
+               my $qs ='IPADDR';\r
+               my @a = split(/\./,$entries{$a}->{$qs});\r
+               my @b = split(/\./,$entries{$b}->{$qs});\r
+               ($a[0]<=>$b[0]) ||\r
+               ($a[1]<=>$b[1]) ||\r
+               ($a[2]<=>$b[2]) ||\r
+               ($a[3]<=>$b[3]);\r
+       }\r
+\r
+       &Header::openbox('100%', 'left', "$Lang::tr{'current dhcp leases on blue'}");\r
+       print <<END\r
+<table width='100%'>\r
+<tr>\r
+<td width='25%' align='center'><b>$Lang::tr{'ip address'}</b></td>\r
+<td width='25%' align='center'><b>$Lang::tr{'mac address'}</b></td>\r
+<td width='20%' align='center'><b>$Lang::tr{'hostname'}</b></td>\r
+<td width='30%' align='center'><b>$Lang::tr{'lease expires'} (local time d/m/y)</b></td>\r
+</tr>\r
+END\r
+       ;\r
+\r
+       my ($ip, $endtime, $ether, $hostname, @record, $record);\r
+       open(LEASES,"/var/state/dhcp/dhcpd.leases") or die "Can't open dhcpd.leases";\r
+       while (my $line = <LEASES>) {\r
+               next if( $line =~ /^\s*#/ );\r
+               chomp($line);\r
+               my @temp = split (' ', $line);\r
+\r
+               if ($line =~ /^\s*lease/) {\r
+                       $ip = $temp[1];\r
+                       # All fields are not necessarily read. Clear everything\r
+                       $endtime = 0;\r
+                       $ether = "";\r
+                       $hostname = "";\r
+               } elsif ($line =~ /^\s*ends never;/) {\r
+                       $endtime = 'never';\r
+               } elsif ($line =~ /^\s*ends/) {\r
+                       $line =~ /(\d+)\/(\d+)\/(\d+) (\d+):(\d+):(\d+)/;\r
+                       $endtime = timegm($6, $5, $4, $3, $2 - 1, $1 - 1900);\r
+               } elsif ($line =~ /^\s*hardware ethernet/) {\r
+                       $ether = $temp[2];\r
+                       $ether =~ s/;//g;\r
+               } elsif ($line =~ /^\s*client-hostname/) {\r
+                       shift (@temp);\r
+                       $hostname = join (' ',@temp);\r
+                       $hostname =~ s/;//g;\r
+                       $hostname =~ s/\"//g;\r
+               } elsif ($line eq "}") {\r
+                       # Select records in Blue subnet\r
+                       if ( &General::IpInSubnet ( $ip,\r
+                               $netsettings{"BLUE_NETADDRESS"},\r
+                               $netsettings{"BLUE_NETMASK"} ) ) {\r
+                               @record = ('IPADDR',$ip,'ENDTIME',$endtime,'ETHER',$ether,'HOSTNAME',$hostname);\r
+                               $record = {};                                   # create a reference to empty hash\r
+                               %{$record} = @record;                           # populate that hash with @record\r
+                               $entries{$record->{'IPADDR'}} = $record;        # add this to a hash of hashes\r
+                       }\r
+               }\r
+       }\r
+       close(LEASES);\r
+\r
+       my $id = 0;\r
+       foreach my $key (sort blueleasesort keys %entries) {\r
+\r
+               my $hostname = &Header::cleanhtml($entries{$key}->{HOSTNAME},"y");\r
+\r
+               if ($id % 2) {\r
+                       print "<tr bgcolor='$Header::table2colour'>";\r
+               } else {\r
+                       print "<tr bgcolor='$Header::table1colour'>";\r
+               }\r
+\r
+               print <<END\r
+<td align='center'>$entries{$key}->{IPADDR}</td>\r
+<td align='center'>$entries{$key}->{ETHER}</td>\r
+<td align='center'>&nbsp;$hostname </td>\r
+<td align='center'>\r
+END\r
+               ;\r
+\r
+               if ($entries{$key}->{ENDTIME} eq 'never') {\r
+                       print "$Lang::tr{'no time limit'}";\r
+               } else {\r
+                       my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $dst);\r
+                       ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $dst) = localtime ($entries{$key}->{ENDTIME});\r
+                       my $enddate = sprintf ("%02d/%02d/%d %02d:%02d:%02d",$mday,$mon+1,$year+1900,$hour,$min,$sec);\r
+\r
+                       if ($entries{$key}->{ENDTIME} < time() ){\r
+                               print "<strike>$enddate</strike>";\r
+                       } else {\r
+                               print "$enddate";\r
+                       }\r
+               }\r
+\r
+               if ( $hostname eq '' ) {\r
+                       $hostname = $Lang::tr{'device'};\r
+               }\r
+\r
+               print <<END\r
+<td align='center'>\r
+       <form method='post' name='frmd$id' action='$ENV{'SCRIPT_NAME'}'>\r
+       <input type='hidden' name='ACTION' value='add' />\r
+       <input type='hidden' name='SOURCE_IP' value='' />\r
+       <input type='hidden' name='SOURCE_MAC' value='$entries{$key}->{ETHER}' />\r
+       <input type='hidden' name='REMARK' value='$hostname $Lang::tr{'added from dhcp lease list'}' />\r
+       <input type='hidden' name='ENABLED' value='on' />\r
+       <input type='hidden' name='EDITING' value='no' />\r
+       <input type='image' name='$Lang::tr{'add device'}' src='/images/addblue.gif' alt='$Lang::tr{'add device'}' title='$Lang::tr{'add device'}' />\r
+       </form>\r
+</td></tr>\r
+END\r
+               ;\r
+               $id++;\r
+       }\r
+\r
+       print "</table>";\r
+       &Header::closebox();\r
+}\r
+\r