mirror of
https://github.com/angryip/ipscan.git
synced 2025-10-26 11:18:17 +00:00
make sure MAC is not resolved twice if both MACFetcher and MACVendorFetcher are active, but in random order
This commit is contained in:
parent
f251851b9d
commit
369bd0ff9f
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user