import re import xml.etree.ElementTree from haircontrol.data import * class Discovery: IPNEIGH = re.compile("^(?P[a-f0-9:.]+) dev (?P.*) lladdr (?P[a-f0-9:]*)") # fe80::8300 dev eth1 lladdr 10:fe:ed:f1:e1:f3 router STALE # 172.16.20.210 dev eth1 lladdr c0:4a:00:fe:1f:87 REACHABLE def __init__(self, inspector): self.inspector = inspector self.net = EtherDomain() def discover_hinting_from_lldp(self, e_lldp): self.net.add_equipment(e_lldp) self.inspector.connect(e_lldp) fd = self.inspector.command('lldp') root = xml.etree.ElementTree.parse(fd).getroot() for iface in root.iter('interface'): ifname = iface.get('name') chassis = iface.find('chassis') e = Equipment() e.name = chassis.find('name').text e.mgmtip = chassis.find('mgmt-ip').text self.net.add_equipment(e) for port in iface.findall('port'): #remote_ifname = port.find('id').text e.add_seen_mac(ifname, 'lldp') #XXX fd.close() self.inspector.disconnect() def discover_from_root(self, e_root): self.net.add_equipment(e_root) self.inspector.connect(e_root) fd = self.inspector.command('ip-neigh') for line in fd: matches = Discovery.IPNEIGH.search(line) if matches: ip, ifname, mac = [ matches.group(k) for k in ['ip','ifname','mac'] ] self.net.index_mac_ip(mac, ip) e_root.add_seen_mac(ifname, mac) fd.close() self.inspector.disconnect()