From a1a3de32ec14d6ef433e334b9694856698c26d41 Mon Sep 17 00:00:00 2001 From: Kelly Brazil Date: Wed, 23 Oct 2019 17:22:25 -0700 Subject: [PATCH] add lsof parser --- jc/jc.py | 5 +++++ jc/parsers/lsof.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 jc/parsers/lsof.py diff --git a/jc/jc.py b/jc/jc.py index b3be5805..598f6dae 100755 --- a/jc/jc.py +++ b/jc/jc.py @@ -14,6 +14,7 @@ import jc.parsers.iptables import jc.parsers.jobs import jc.parsers.ls import jc.parsers.lsblk +import jc.parsers.lsof import jc.parsers.mount import jc.parsers.netstat import jc.parsers.ps @@ -32,6 +33,7 @@ def helptext(): print(' --jobs jobs parser', file=sys.stderr) print(' --ls ls parser', file=sys.stderr) print(' --lsblk lsblk parser', file=sys.stderr) + print(' --lsof lsof parser', file=sys.stderr) print(' --mount mount parser', file=sys.stderr) print(' --netstat netstat parser', file=sys.stderr) print(' --ps ps parser', file=sys.stderr) @@ -81,6 +83,9 @@ def main(): elif '--lsblk' in sys.argv: result = jc.parsers.lsblk.parse(data) + elif '--lsof' in sys.argv: + result = jc.parsers.lsof.parse(data) + elif '--mount' in sys.argv: result = jc.parsers.mount.parse(data) diff --git a/jc/parsers/lsof.py b/jc/parsers/lsof.py new file mode 100644 index 00000000..8a102f38 --- /dev/null +++ b/jc/parsers/lsof.py @@ -0,0 +1,54 @@ +"""jc - JSON CLI output utility lsof Parser + +Usage: + specify --lsof as the first argument if the piped input is coming from lsof + + Limitations: + No additional columns are supported + +Example: + + +""" + + +def parse(data): + output = [] + + linedata = data.splitlines() + + # Clear any blank lines + cleandata = list(filter(None, linedata)) + + if cleandata: + + # find column value of last character of each header + header_row = cleandata.pop(0) + headers = header_row.split() + header_spec = [] + + for i, h in enumerate(headers): + # header tuple is (index, header_name, col) + header_spec.append((i, h, header_row.find(h) + len(h))) + + # parse lines + for entry in cleandata: + output_line = {} + + # normalize data by inserting -- for missing data + temp_line = entry.split(maxsplit=len(headers) - 1) + + for spec in header_spec: + if spec[1] == 'COMMAND' or spec[1] == 'NAME': + continue + if entry[spec[2] - 1] == ' ': + temp_line.insert(spec[0], '--') + + name = ' '.join(temp_line[9:]) + fixed_line = temp_line[0:9] + fixed_line.append(name) + + output_line = dict(zip(headers, fixed_line)) + output.append(output_line) + + return output