make sure MAC is not resolved twice if both MACFetcher and MACVendorFetcher are active, but in random order

This commit is contained in:
Anton Keks 2013-03-12 00:24:02 +02:00
parent f251851b9d
commit 369bd0ff9f
3 changed files with 21 additions and 15 deletions

View File

@ -2,6 +2,7 @@ package net.azib.ipscan.fetchers;
import net.azib.ipscan.core.ScanningSubject;
import java.net.InetAddress;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -13,6 +14,16 @@ public abstract class MACFetcher extends AbstractFetcher {
return ID;
}
@Override
public final String scan(ScanningSubject subject) {
String mac = (String) subject.getParameter(ID);
if (mac == null) mac = resolveMAC(subject.getAddress());
subject.setParameter(ID, mac);
return mac;
}
protected abstract String resolveMAC(InetAddress address);
static String bytesToMAC(byte[] bytes) {
StringBuilder mac = new StringBuilder();
for (byte b : bytes) mac.append(String.format("%02X", b)).append(":");
@ -24,9 +35,4 @@ public abstract class MACFetcher extends AbstractFetcher {
Matcher m = macAddressPattern.matcher(line);
return m.find() ? m.group().toUpperCase() : null;
}
String remember(String mac, ScanningSubject subject) {
subject.setParameter(ID, mac);
return mac;
}
}

View File

@ -1,6 +1,5 @@
package net.azib.ipscan.fetchers;
import net.azib.ipscan.core.ScanningSubject;
import net.azib.ipscan.util.IOUtils;
import java.io.BufferedReader;
@ -13,8 +12,8 @@ public class UnixMACFetcher extends MACFetcher {
@Override public void init() {
}
@Override public String scan(ScanningSubject subject) {
String ip = subject.getAddress().getHostAddress();
@Override public String resolveMAC(InetAddress address) {
String ip = address.getHostAddress();
BufferedReader reader = null;
try {
// highly inefficient implementation, there must be a better way (using JNA?)
@ -23,7 +22,7 @@ public class UnixMACFetcher extends MACFetcher {
String line;
while ((line = reader.readLine()) != null) {
if (line.contains(ip))
return remember(extractMAC(line), subject);
return extractMAC(line);
}
// see if it is a local address
@ -34,8 +33,8 @@ public class UnixMACFetcher extends MACFetcher {
Enumeration<InetAddress> addrs = netif.getInetAddresses();
while (addrs.hasMoreElements()) {
InetAddress addr = addrs.nextElement();
if (addr.equals(subject.getAddress()))
return remember(bytesToMAC(netif.getHardwareAddress()), subject);
if (addr.equals(address))
return bytesToMAC(netif.getHardwareAddress());
}
}
}

View File

@ -2,10 +2,11 @@ package net.azib.ipscan.fetchers;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import net.azib.ipscan.core.ScanningSubject;
import net.azib.ipscan.core.net.WinIpHlpDll;
import net.azib.ipscan.core.net.WinIpHlpDll.IpAddrByVal;
import java.net.InetAddress;
public class WinMACFetcher extends MACFetcher {
private WinIpHlpDll dll;
@ -13,9 +14,9 @@ public class WinMACFetcher extends MACFetcher {
dll = WinIpHlpDll.Loader.load();
}
@Override public String scan(ScanningSubject subject) {
@Override public String resolveMAC(InetAddress address) {
IpAddrByVal destIP = new IpAddrByVal();
destIP.bytes = subject.getAddress().getAddress();
destIP.bytes = address.getAddress();
Pointer pmac = new Memory(8);
Pointer plen = new Memory(4);
@ -26,6 +27,6 @@ public class WinMACFetcher extends MACFetcher {
if (result != 0) return null;
byte[] bytes = pmac.getByteArray(0, plen.getInt(0));
return remember(bytesToMAC(bytes), subject);
return bytesToMAC(bytes);
}
}