]>
git.ipfire.org Git - ipfire-2.x.git/blob - html/cgi-bin/wireless.cgi
5 # This code is distributed under the terms of the GPL
7 # (c) 2003 Alan Hourihane <alanh@fairlite.demon.co.uk>
8 # (c) 2005 Eric Oberlander, Robert Kerr - Inline editing & DHCP leases
10 # $Id: wireless.cgi,v 1.4.2.15 2005/06/11 12:14:49 eoberlander Exp $
16 # enable only the following on debugging purpose
18 #use CGI::Carp 'fatalsToBrowser';
20 require 'CONFIG_ROOT/general-functions.pl';
21 require "${General::swroot}/lang.pl";
22 require "${General::swroot}/header.pl";
24 #workaround to suppress a warning when a variable is used only once
25 my @dummy = ( ${Header
::colouryellow
} );
30 my $errormessage = '';
31 my $filename = "${General::swroot}/wireless/config";
32 my $hostsfile = "${General::swroot}/main/hosts";
36 $cgiparams{'ENABLED'} = 'off';
37 $cgiparams{'ACTION'} = '';
38 $cgiparams{'VALID'} = '';
39 $cgiparams{'SOURCE_IP'} ='';
40 $cgiparams{'SOURCE_MAC'} ='';
41 $cgiparams{'REMARK'} ='';
43 &Header
::getcgihash
(\
%cgiparams);
45 &General
::readhash
("${General::swroot}/dhcp/settings", \
%dhcpsettings);
46 &General
::readhash
("${General::swroot}/ethernet/settings", \
%netsettings);
48 &Header
::showhttpheaders
();
50 open(FILE
, $filename) or die 'Unable to open config file.';
54 if ($cgiparams{'ACTION'} eq 'add')
57 if ($cgiparams{'SOURCE_IP'} eq '' && $cgiparams{'SOURCE_MAC'} eq '')
62 $cgiparams{'SOURCE_MAC'} =~ tr/-/:/;
65 foreach my $line (@current)
68 my @temp = split(/\,/,$line);
70 if ($temp[1] ne '' && $cgiparams{'SOURCE_IP'} eq $temp[1] && $cgiparams{'EDITING'} ne $key)
72 $errormessage = $Lang::tr
{'duplicate ip'};
75 if ($temp[2] ne '' && lc($cgiparams{'SOURCE_MAC'}) eq lc($temp[2]) && $cgiparams{'EDITING'} ne $key)
77 $errormessage = $Lang::tr
{'duplicate mac'};
82 if ($cgiparams{'SOURCE_IP'} eq '')
84 $cgiparams{'SOURCE_IP'} = 'NONE';
86 unless(&General
::validip
($cgiparams{'SOURCE_IP'}))
88 $errormessage = $Lang::tr
{'invalid fixed ip address'};
92 if ($cgiparams{'SOURCE_MAC'} eq '')
94 $cgiparams{'SOURCE_MAC'} = 'NONE';
96 unless(&General
::validmac
($cgiparams{'SOURCE_MAC'}))
98 $errormessage = $Lang::tr
{'invalid fixed mac address'};
105 $cgiparams{'SOURCE_MAC'} = '' if $cgiparams{'SOURCE_MAC'} eq 'NONE';
106 $cgiparams{'SOURCE_IP'} = '' if $cgiparams{'SOURCE_IP'} eq 'NONE';
108 if ($cgiparams{'EDITING'} eq 'no') {
109 open(FILE
,">>$filename") or die 'Unable to open config file.';
111 print FILE
"$key,$cgiparams{'SOURCE_IP'},$cgiparams{'SOURCE_MAC'},$cgiparams{'ENABLED'},$cgiparams{'REMARK'}\n";
113 open(FILE
,">$filename") or die 'Unable to open config file.';
116 foreach my $line (@current)
119 if ($cgiparams{'EDITING'} eq $id) {
120 print FILE
"$id,$cgiparams{'SOURCE_IP'},$cgiparams{'SOURCE_MAC'},$cgiparams{'ENABLED'},$cgiparams{'REMARK'}\n";
121 } else { print FILE
"$line"; }
126 &General
::log($Lang::tr
{'wireless config added'});
127 system('/usr/local/bin/restartwireless');
132 if ($cgiparams{'ACTION'} eq 'edit')
135 foreach my $line (@current)
138 if ($cgiparams{'ID'} eq $id)
141 my @temp = split(/\,/,$line);
142 $cgiparams{'SOURCE_IP'} = $temp[1];
143 $cgiparams{'SOURCE_MAC'} = $temp[2];
144 $cgiparams{'ENABLED'} = $temp[3];
145 $cgiparams{'REMARK'} = $temp[4];
146 $cgiparams{'SOURCE_IP'} = '' if $cgiparams{'SOURCE_IP'} eq 'NONE';
147 $cgiparams{'SOURCE_MAC'} = '' if $cgiparams{'SOURCE_MAC'} eq 'NONE';
150 &General
::log($Lang::tr
{'wireless config changed'});
151 system('/usr/local/bin/restartwireless');
154 if ($cgiparams{'ACTION'} eq 'remove' || $cgiparams{'ACTION'} eq 'toggle')
157 open(FILE
, ">$filename") or die 'Unable to open config file.';
159 foreach my $line (@current)
162 unless ($cgiparams{'ID'} eq $id) { print FILE
"$line"; }
163 elsif ($cgiparams{'ACTION'} eq 'toggle')
166 my @temp = split(/\,/,$line);
167 print FILE
"$temp[0],$temp[1],$temp[2],$cgiparams{'ENABLE'},$temp[4]\n";
171 &General
::log($Lang::tr
{'wireless config changed'});
172 system('/usr/local/bin/restartwireless');
176 $checked{'ENABLED'}{'off'} = '';
177 $checked{'ENABLED'}{'on'} = '';
178 $checked{'ENABLED'}{$cgiparams{'ENABLED'}} = "checked='checked'";
181 &Header
::openpage
($Lang::tr
{'wireless configuration'}, 1, '');
183 &Header
::openbigbox
('100%', 'left', '', $errormessage);
186 &Header
::openbox
('100%', 'left', $Lang::tr
{'error messages'});
187 print "<class name='base'>$errormessage\n";
188 print " </class>\n";
192 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
194 my $buttontext = $Lang::tr
{'add'};
195 if ($cgiparams{'ACTION'} eq 'edit') {
196 &Header
::openbox
('100%', 'left', "$Lang::tr{'edit device'}");
197 $buttontext = $Lang::tr
{'update'};
199 &Header
::openbox
('100%', 'left', "$Lang::tr{'add device'}");
205 <td width='25%' class='base'>$Lang::tr{'source ip'}: </td>
206 <td width='25%' ><input type='text' name='SOURCE_IP' value='$cgiparams{'SOURCE_IP'}' size='25' /></td>
207 <td width='25%' class='base' align='right'>$Lang::tr{'enabled'} </td>
208 <td width='25%'><input type='checkbox' name='ENABLED' $checked{'ENABLED'}{'on'} /></td>
211 <td width='25%' class='base'>$Lang::tr{'source'} $Lang::tr{'mac address'}: </td>
212 <td colspan='3'><input type='text' name='SOURCE_MAC' value='$cgiparams{'SOURCE_MAC'}' size='25' /></td>
215 <td width='25%' class='base'>$Lang::tr{'remark'}: <img src='/blob.gif' alt='*' /></td>
216 <td colspan='3'><input type='text' name='REMARK' value='$cgiparams{'REMARK'}' size='40' /></td>
222 <td class='base' valign='top'><img src='/blob.gif' alt='*' /></td>
223 <td width='55%' class='base'>$Lang::tr{'this field may be blank'}</td>
224 <td width='40%' align='center'>
225 <input type='hidden' name='ACTION' value='add' />
226 <input type='submit' name='SUBMIT' value='$buttontext' />
228 <td width='5%' align='right'>
229 <a href='${General::adminmanualurl}/section-firewall.html#section-blue-access' target='_blank'>
230 <img src='/images/web-support.png' alt='$Lang::tr{'online help en'}' title='$Lang::tr{'online help en'}' /></a></td>
236 if ($cgiparams{'ACTION'} eq 'edit') {
237 print "<input type='hidden' name='EDITING' value='$cgiparams{'ID'}' />\n";
239 print "<input type='hidden' name='EDITING' value='no' />\n";
246 &Header
::openbox
('100%', 'left', "$Lang::tr{'devices on blue'}");
251 open (FILE
, "$filename");
252 my @current = <FILE
>;
258 <td align='center' width='20%'><b>$Lang::tr{'hostname'}</b></td>
259 <td align='center' width='20%'><b>$Lang::tr{'source ip'}</b></td>
260 <td align='center' width='20%'><b>$Lang::tr{'mac address'}</b></td>
261 <td align='center' width='35%'><b>$Lang::tr{'remark'}</b></td>
262 <td align='center' colspan='3'><b>$Lang::tr{'action'}</b></td>
269 open (HOSTFILE
, "$hostsfile");
270 my @curhosts = <HOSTFILE
>;
273 my $connstate = &Header
::connectionstatus
();
274 my @arp = `/sbin/arp -n`;
277 foreach my $line (@current)
285 my @temp = split(/\,/,$line);
286 my $wirelessid = $temp[0];
287 my $sourceip = $temp[1];
288 my $sourcemac = $temp[2];
289 if ( $sourceip eq 'NONE' ) {
290 foreach my $aline ( @arp )
293 my @atemp = split( m{\s+}, $aline );
294 my $aipaddr = $atemp[0];
295 my $amacaddr = lc( $atemp[2] );
296 if ( $amacaddr eq $sourcemac ) {
297 $sourceip = $aipaddr;
303 # SourceIP could now have been set by the ARP probe.
304 if ( $sourceip ne 'NONE' ) {
305 foreach my $hline (@curhosts)
308 my @htemp = split(/\,/,$hline);
309 my $hkey = $htemp[0];
310 my $hipaddr = $htemp[1];
311 my $hostname = $htemp[2];
312 my $domainname = $htemp[3];
313 if ($sourceip eq $hipaddr) {
314 $hname = "$hostname.$domainname";
318 if ( $hname eq "" ) {
319 my ($aliases, $addrtype, $length, @addrs);
320 ($hname, $aliases, $addrtype, $length, @addrs) =
321 gethostbyaddr(pack("C4", split(/\./, $sourceip)), 2);
325 if ($temp[3] eq 'on') { $gif = 'on.gif'; $toggle='off'; $gdesc=$Lang::tr
{'click to disable'};}
326 else { $gif = 'off.gif'; $toggle='on'; $gdesc=$Lang::tr
{'click to enable'};}
328 my $remark = &Header
::cleanhtml
($temp[4]);
330 if ($cgiparams{'ACTION'} eq 'edit' && $cgiparams{'ID'} eq $id) {
331 print "<tr bgcolor='${Header::colouryellow}'>\n";
333 print "<tr bgcolor='${Header::table1colour}'>\n";
335 print "<tr bgcolor='${Header::table2colour}'>\n";
337 print "<td align='center'>$hname</td>\n";
338 print "<td align='center'>$sourceip</td>\n";
339 print "<td align='center'>$sourcemac</td>\n";
340 print "<td align='center'>$remark</td>\n";
343 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
344 <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' alt='$gdesc' title='$gdesc' />
345 <input type='hidden' name='ACTION' value='toggle'}' />
346 <input type='hidden' name='ID' value='$id' />
347 <input type='hidden' name='ENABLE' value='$toggle' />
352 <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>
353 <input type='hidden' name='ACTION' value='edit' />
354 <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' alt='$Lang::tr{'edit'}' title='$Lang::tr{'edit'}' />
355 <input type='hidden' name='ID' value='$id' />
360 <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>
361 <input type='hidden' name='ACTION' value='remove' />
362 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' alt='$Lang::tr{'remove'}' title='$Lang::tr{'remove'}' />
363 <input type='hidden' name='ID' value='$id' />
376 if ( $dhcpsettings{"ENABLE_BLUE"} eq 'on') {
380 &Header
::closebigbox
();
382 &Header
::closepage
();
391 my @a = split(/\./,$entries{$a}->{$qs});
392 my @b = split(/\./,$entries{$b}->{$qs});
399 &Header
::openbox
('100%', 'left', "$Lang::tr{'current dhcp leases on blue'}");
403 <td width='25%' align='center'><b>$Lang::tr{'ip address'}</b></td>
404 <td width='25%' align='center'><b>$Lang::tr{'mac address'}</b></td>
405 <td width='20%' align='center'><b>$Lang::tr{'hostname'}</b></td>
406 <td width='30%' align='center'><b>$Lang::tr{'lease expires'} (local time d/m/y)</b></td>
411 my ($ip, $endtime, $ether, $hostname, @record, $record);
412 open(LEASES
,"/var/state/dhcp/dhcpd.leases") or die "Can't open dhcpd.leases";
413 while (my $line = <LEASES
>) {
414 next if( $line =~ /^\s*#/ );
416 my @temp = split (' ', $line);
418 if ($line =~ /^\s*lease/) {
420 # All fields are not necessarily read. Clear everything
424 } elsif ($line =~ /^\s*ends never;/) {
426 } elsif ($line =~ /^\s*ends/) {
427 $line =~ /(\d+)\/(\d
+)\
/(\d+) (\d+):(\d+):(\d+)/;
428 $endtime = timegm
($6, $5, $4, $3, $2 - 1, $1 - 1900);
429 } elsif ($line =~ /^\s*hardware ethernet/) {
432 } elsif ($line =~ /^\s*client-hostname/) {
434 $hostname = join (' ',@temp);
436 $hostname =~ s/\"//g;
437 } elsif ($line eq "}") {
438 # Select records in Blue subnet
439 if ( &General
::IpInSubnet
( $ip,
440 $netsettings{"BLUE_NETADDRESS"},
441 $netsettings{"BLUE_NETMASK"} ) ) {
442 @record = ('IPADDR',$ip,'ENDTIME',$endtime,'ETHER',$ether,'HOSTNAME',$hostname);
443 $record = {}; # create a reference to empty hash
444 %{$record} = @record; # populate that hash with @record
445 $entries{$record->{'IPADDR'}} = $record; # add this to a hash of hashes
452 foreach my $key (sort blueleasesort
keys %entries) {
454 my $hostname = &Header
::cleanhtml
($entries{$key}->{HOSTNAME
},"y");
457 print "<tr bgcolor='$Header::table2colour'>";
459 print "<tr bgcolor='$Header::table1colour'>";
463 <td align='center'>$entries{$key}->{IPADDR}</td>
464 <td align='center'>$entries{$key}->{ETHER}</td>
465 <td align='center'> $hostname </td>
470 if ($entries{$key}->{ENDTIME
} eq 'never') {
471 print "$Lang::tr{'no time limit'}";
473 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $dst);
474 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $dst) = localtime ($entries{$key}->{ENDTIME
});
475 my $enddate = sprintf ("%02d/%02d/%d %02d:%02d:%02d",$mday,$mon+1,$year+1900,$hour,$min,$sec);
477 if ($entries{$key}->{ENDTIME
} < time() ){
478 print "<strike>$enddate</strike>";
484 if ( $hostname eq '' ) {
485 $hostname = $Lang::tr
{'device'};
490 <form method='post' name='frmd$id' action='$ENV{'SCRIPT_NAME'}'>
491 <input type='hidden' name='ACTION' value='add' />
492 <input type='hidden' name='SOURCE_IP' value='' />
493 <input type='hidden' name='SOURCE_MAC' value='$entries{$key}->{ETHER}' />
494 <input type='hidden' name='REMARK' value='$hostname $Lang::tr{'added from dhcp lease list'}' />
495 <input type='hidden' name='ENABLED' value='on' />
496 <input type='hidden' name='EDITING' value='no' />
497 <input type='image' name='$Lang::tr{'add device'}' src='/images/addblue.gif' alt='$Lang::tr{'add device'}' title='$Lang::tr{'add device'}' />