Source code for mac_to_ip.mac_to_ip
import subprocess
import socket
import os
[docs]def mac_to_ip(device_mac_addresses, ip_address_range=None):
"""
Find all ip addresses using provided mac addresses
Returns a dict with a key value dict where key
is a device identifier and value is a IP address
:param device_mac_addresses: A key value dict where key
is a device identifier and value is a MAC address
:param ip_address_range: A valid nmap ip address range.
"""
if ip_address_range is None:
# fmt: off
ip_address = [l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) if l][0][0] # noqa: E741 E501
# fmt: on
ip_address_range = ".".join(ip_address.split(".")[:-1]) + ".*"
subprocess.call(['nmap', '-T5', '-sP', ip_address_range],
stdout=open(os.devnull, 'w'))
device_ips = {}
for device in device_mac_addresses:
mac_address = device_mac_addresses[device]
arp_cmd = "arp -a | grep %s | awk '{print $2}'" % mac_address
ip_address = subprocess.Popen(
arp_cmd, shell=True, stdout=subprocess.PIPE).stdout.read()
ip_address = ip_address.decode("utf-8")
ip_address = ip_address.replace("(", "")
ip_address = ip_address.replace(")", "")
ip_address = ip_address.replace("\n", "")
if ip_address == "":
ip_address = None
device_ips[device] = ip_address
return device_ips