diff options
Diffstat (limited to 'haircontrol/inspectors.py')
-rw-r--r-- | haircontrol/inspectors.py | 77 |
1 files changed, 53 insertions, 24 deletions
diff --git a/haircontrol/inspectors.py b/haircontrol/inspectors.py index b81d832..3d7b766 100644 --- a/haircontrol/inspectors.py +++ b/haircontrol/inspectors.py @@ -12,26 +12,36 @@ class Inspector(): def connect(self, e): self.e = e + self.e.inspected = 'in-progress' def disconnect(self): + self.e.inspected = True self.e = None def command(self, cmdname): cmddef = self.cmds.get(cmdname) if not cmddef: return None - fd = self._exec(cmdname, cmddef['cmd']) + cmd = cmddef['cmd'] result = [] - re = cmddef.get('re') - func = cmddef.get('func') - if re: - for line in fd: - matches = re.match(line) - if matches: - result.append(matches.groups()) - elif func: - result = func(self, fd) - fd.close() + fd = None + try: + fd = self._exec(cmdname, cmd) + re = cmddef.get('re') + func = cmddef.get('func') + if re: + for line in fd: + matches = re.match(line) + if matches: + result.append(matches.groups()) + elif func: + result = func(self, fd) + except Exception: + print("Error : can't exec/read %s (%s) on %s (%s)"%(cmdname, cmd, self.e.name, self.e.mgmtip)) + finally: + if fd: + fd.close() + return result def _exec(self, cmdname, cmd): @@ -39,6 +49,18 @@ class Inspector(): mockfile = self.testDataPath + '/' + self.e.name + '-' + cmdname + '.out' return open(mockfile) + def _parse_cgi_json(self, fd): + for cgi_headers in fd: + if cgi_headers == '\n': + break + js = {} + try: + js = json.load(fd) + except ValueError: + print("Warn : unparsable json for %s (%s)"%(self.e.name, self.e.mgmtip)) + finally: + fd.close() + return js class LinuxInspector(Inspector): @@ -101,21 +123,8 @@ class LinuxInspector(Inspector): } - class UbntInspector(Inspector): - def _parse_cgi_json(self, fd): - for cgi_headers in fd: - if cgi_headers == '\n': - break - js = {} - try: - js = json.load(fd) - except ValueError: - print("Warn : unparsable json") - fd.close() - return js - def parse_status_json(self, fd): result = [] interfaces = self._parse_cgi_json(fd).get('interfaces') @@ -151,3 +160,23 @@ class UbntInspector(Inspector): } } +class ToughSwitchInspector(Inspector): + + def parse_mactable_data_cgi(self, fd): + result = [] + macs = self._parse_cgi_json(fd).get('macs') + if macs: + for line in macs: + if isinstance(line, dict): + ifname = "p%i"%line.get('port') + mac = line.get('mac') + result.append( (ifname, mac) ) + return result + + cmds = { + 'mactable_data.cgi': { + 'cmd':'/usr/www/mactable_data.cgi', + 'func': parse_mactable_data_cgi + }, + } + |