captive: Get MAC address of a device without calling arp
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 25 Apr 2017 11:52:29 +0000 (12:52 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 22 Sep 2017 17:55:27 +0000 (18:55 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
config/cfgroot/network-functions.pl
html/cgi-bin/captive/index.cgi

index 66f1ed5..93b8190 100644 (file)
@@ -374,6 +374,26 @@ sub wifi_get_signal_level($) {
 
        return $signal_level;
 }
+
+sub get_hardware_address($) {
+       my $ip_address = shift;
+       my $ret;
+
+       open(FILE, "/proc/net/arp") or die("Could not read ARP table");
+
+       while (<FILE>) {
+               my ($ip_addr, $hwtype, $flags, $hwaddr, $mask, $device) = split(/\s+/, $_);
+               if ($ip_addr eq $ip_address) {
+                       $ret = $hwaddr;
+                       last;
+               }
+       }
+
+       close(FILE);
+
+       return $ret;
+}
+
 1;
 
 # Remove the next line to enable the testsuite
index 05619b4..bcaf856 100755 (executable)
@@ -58,9 +58,8 @@ if ($cgiparams{'ACTION'} eq "SUBMIT") {
        #Get Clients IP-Address
        my $ip_address = $ENV{X_FORWARDED_FOR} || $ENV{REMOTE_ADDR} ||"";
 
-       #Ask arp to give the corresponding MAC-Address
-       my $mac_address = qx(arp -a|grep $ip_address|cut -d ' ' -f 4);
-       $mac_address =~ s/\n+\z//;
+       # Retrieve the MAC address from the ARP table
+       my $mac_address = &Network::get_hardware_address($ip_address);
 
        &General::readhasharray("$clients", \%clientshash);
        my $key = &General::findhasharraykey(\%clientshash);
@@ -84,15 +83,13 @@ if ($cgiparams{'ACTION'} eq "SUBMIT") {
 
 if ($cgiparams{'ACTION'} eq "SUBMIT") {
        my $ip_address;
-       my $mac_address;
        my $granted=0;
        #Convert voucherinput to uppercase
        $cgiparams{'VOUCHER'} = uc $cgiparams{'VOUCHER'};
        #Get Clients IP-Address
        $ip_address = $ENV{X_FORWARDED_FOR} || $ENV{REMOTE_ADDR} ||"";
        #Ask arp to give the corresponding MAC-Address
-       $mac_address = qx(arp -a|grep $ip_address|cut -d ' ' -f 4);
-       $mac_address =~ s/\n+\z//;
+       my $mac_address = &Network::get_hardware_address($ip_address);
        #Check if voucher is valid and write client to clients file, delete voucher from voucherout
        &General::readhasharray("$voucherout", \%voucherhash);
        &General::readhasharray("$clients", \%clientshash);