blob: 2b7ad83ec7f36db7af1e071781ad420634c9aed2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
import re
import xml.etree.ElementTree
from haircontrol.data import *
class Discovery:
IPNEIGH = re.compile("^(?P<ip>[a-f0-9:.]+) dev (?P<ifname>.*) lladdr (?P<mac>[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()
|