summaryrefslogtreecommitdiff
path: root/haircontrol/inspectors.py
diff options
context:
space:
mode:
Diffstat (limited to 'haircontrol/inspectors.py')
-rw-r--r--haircontrol/inspectors.py77
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
+ },
+ }
+