|
@@ -12,10 +12,14 @@ import subprocess
|
|
|
import logging
|
|
|
logger = logging.getLogger()
|
|
|
|
|
|
+class UnknownFieldsException(Exception):
|
|
|
+ def __init__(self, fields):
|
|
|
+ Exception.__init__(self, "unknown tshark fields %s" % ','.join(fields))
|
|
|
+ self.fields = fields
|
|
|
|
|
|
_tshark_filter_arg = '-Y'
|
|
|
|
|
|
-def run_tshark(filename, filter, display=None, wait=True):
|
|
|
+def _run_tshark(filename, filter, display=None, wait=True):
|
|
|
global _tshark_filter_arg
|
|
|
|
|
|
if wait:
|
|
@@ -44,8 +48,21 @@ def run_tshark(filename, filter, display=None, wait=True):
|
|
|
out = output[0]
|
|
|
res = cmd.wait()
|
|
|
if res == 1:
|
|
|
- if "Some fields aren't valid" in output[1]:
|
|
|
- raise Exception("Unknown tshark field")
|
|
|
+ errmsg = "Some fields aren't valid"
|
|
|
+ if errmsg in output[1]:
|
|
|
+ errors = output[1].split('\n')
|
|
|
+ fields = []
|
|
|
+ collect = False
|
|
|
+ for f in errors:
|
|
|
+ if collect:
|
|
|
+ f = f.strip()
|
|
|
+ if f:
|
|
|
+ fields.append(f)
|
|
|
+ continue
|
|
|
+ if errmsg in f:
|
|
|
+ collect = True
|
|
|
+ continue
|
|
|
+ raise UnknownFieldsException(fields)
|
|
|
# remember this for efficiency
|
|
|
_tshark_filter_arg = '-R'
|
|
|
arg[3] = '-R'
|
|
@@ -55,3 +72,19 @@ def run_tshark(filename, filter, display=None, wait=True):
|
|
|
cmd.wait()
|
|
|
|
|
|
return out
|
|
|
+
|
|
|
+def run_tshark(filename, filter, display=None, wait=True):
|
|
|
+ if display is None: display = []
|
|
|
+ try:
|
|
|
+ return _run_tshark(filename, filter, display, wait)
|
|
|
+ except UnknownFieldsException, e:
|
|
|
+ all_wlan_mgt = True
|
|
|
+ for f in e.fields:
|
|
|
+ if not f.startswith('wlan_mgt.'):
|
|
|
+ all_wlan_mgt = False
|
|
|
+ break
|
|
|
+ if not all_wlan_mgt:
|
|
|
+ raise
|
|
|
+ return _run_tshark(filename, filter.replace('wlan_mgt', 'wlan'),
|
|
|
+ [x.replace('wlan_mgt', 'wlan') for x in display],
|
|
|
+ wait)
|