Source code for caspia.toolbox.arp.scanner

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)