summaryrefslogtreecommitdiff
path: root/haircontrol/discovery.py
diff options
context:
space:
mode:
Diffstat (limited to 'haircontrol/discovery.py')
-rw-r--r--haircontrol/discovery.py57
1 files changed, 21 insertions, 36 deletions
diff --git a/haircontrol/discovery.py b/haircontrol/discovery.py
index 680eb4c..243e3b6 100644
--- a/haircontrol/discovery.py
+++ b/haircontrol/discovery.py
@@ -1,56 +1,41 @@
-import re
-import xml.etree.ElementTree
from haircontrol.data import *
+from haircontrol.inspectors import *
class Discovery:
- IPNEIGH = re.compile("(?P<ip>[a-f0-9:.]+) dev (?P<ifname>.*) lladdr (?P<mac>[a-f0-9:]*)")
- IPLINKSHOW = re.compile("(?P<id>\d+):\s+(?P<ifname>[^:]*):.+\s+(?:link/ether\s+(?P<mac>[a-f0-9:]*)\s+brd|link/none)")
- def __init__(self, inspector):
- self.inspector = inspector
+ def __init__(self): #, inspector):
+ self.linux_inspector = LinuxInspector()
+ self.ubnt_inspector = UbntInspector()
self.net = EtherDomain()
def discover_hinting_from_lldp(self, e_lldp):
self.net.add_equipment(e_lldp)
- self.inspector.connect(e_lldp)
+ self.linux_inspector.connect(e_lldp)
# Learn local interfaces of e_lldp
- fd = self.inspector.command('ip-link')
- for line in fd:
- matches = Discovery.IPLINKSHOW.match(line)
- if matches:
- ifname, mac = [ matches.group(k) for k in ['ifname','mac'] ]
- e_lldp.ifaces[ifname] = Interface(ifname, mac)
- fd.close()
+ result = self.linux_inspector.command('ip-link')
+ for (_, ifname, mac) in result:
+ e_lldp.ifaces[ifname] = Interface(ifname, mac)
# Create equipments and ifaces from LLDP neighbour discovery
- fd = self.inspector.command('lldp')
- root = xml.etree.ElementTree.parse(fd).getroot()
- for iface in root.iter('interface'):
- local_ifname = iface.get('name')
- local_mac = e_lldp.ifaces[local_ifname].mac
- chassis = iface.find('chassis')
- remote_name = chassis.find('name').text
- remote_ipmgmt = chassis.find('mgmt-ip').text
+ result = self.linux_inspector.command('lldpctl')
+ for (local_ifname, local_mac, remote_name, remote_ipmgmt, ports) in result:
e = Equipment(remote_name, remote_ipmgmt)
self.net.add_equipment(e)
- for port in iface.findall('port'):
- remote_ifname = port.find('id').text
+ for remote_ifname in ports:
e.add_seen_mac(remote_ifname, local_mac)
- fd.close()
- self.inspector.disconnect()
+
+ self.linux_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.match(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()
+ self.linux_inspector.connect(e_root)
+
+ result = self.linux_inspector.command('ip-neigh')
+ for (ip, ifname, mac) in result:
+ self.net.index_mac_ip(mac, ip)
+ e_root.add_seen_mac(ifname, mac)
+
+ self.linux_inspector.disconnect()