import asyncio
import logging
import re
from typing import List
from caspia.toolbox.arp.response import ArpResponse
logger = logging.getLogger(__name__)
[docs]async def scan(interface=None) -> List[ArpResponse]:
"""Issue ARP request and return all responses."""
interface_spec = f'--interface {interface}' if interface else ''
process = await asyncio.create_subprocess_shell(f'arp-scan -g --localnet {interface_spec}',
stdout=asyncio.subprocess.PIPE)
stdout, _ = await process.communicate()
if process.returncode > 0:
raise RuntimeError(f'failed to invoke arp-scan (code {process.returncode})')
pattern = re.compile(r'^(\S+)\t(\S+)\t+(.+)$')
results = []
for line in stdout.decode('utf-8').split('\n'):
match = pattern.match(line)
if match is None:
continue
results.append(
ArpResponse(ip_addr=match.group(1), mac_addr=match.group(2), name=match.group(3)))
return results
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
for result in asyncio.get_event_loop().run_until_complete(scan()):
print(result)