From b15227e7ba5377e5fb6799d1b9e4ed5a11c6d92f Mon Sep 17 00:00:00 2001 From: Kelly Brazil Date: Tue, 22 Oct 2019 11:55:11 -0700 Subject: [PATCH] add lsblk parser --- README.md | 49 +++++++++++++++++++++++++++++++ changelog.txt | 1 + jc/jc.py | 5 ++++ jc/parsers/lsblk.py | 70 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 125 insertions(+) create mode 100644 jc/parsers/lsblk.py diff --git a/README.md b/README.md index 2ca5a0bb..ee37b234 100755 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ jc [parser] [options] - `--free` enables the `free` parser - `--ifconfig` enables the `ifconfig` parser - `--ls` enables the `ls` parser +- `--lsblk` enables the `lsblk` parser - `--netstat` enables the `netstat` parser - `--ps` enables the `ps` parser - `--route` enables the `route` parser @@ -261,6 +262,54 @@ $ ls -l /bin | jc --ls -p ... ] ``` +### lsblk +``` +$ lsblk | jc --lsblk -p +[ + { + "NAME": "loop0", + "MAJ:MIN": "7:0", + "RM": "0", + "SIZE": "54.5M", + "RO": "1", + "TYPE": "loop", + "MOUNTPOINT": "/snap/core18/1223" + }, + { + "NAME": "sda", + "MAJ:MIN": "8:0", + "RM": "0", + "SIZE": "20G", + "RO": "0", + "TYPE": "disk" + }, + { + "NAME": "sda1", + "MAJ:MIN": "8:1", + "RM": "0", + "SIZE": "1M", + "RO": "0", + "TYPE": "part" + }, + { + "NAME": "sda2", + "MAJ:MIN": "8:2", + "RM": "0", + "SIZE": "20G", + "RO": "0", + "TYPE": "part", + "MOUNTPOINT": "/" + }, + { + "NAME": "sr0", + "MAJ:MIN": "11:0", + "RM": "1", + "SIZE": "64.8M", + "RO": "0", + "TYPE": "rom" + } +] +``` ### netstat ``` $ netstat -p | jc --netstat -p diff --git a/changelog.txt b/changelog.txt index 2c2b9246..5c56c507 100644 --- a/changelog.txt +++ b/changelog.txt @@ -4,6 +4,7 @@ jc changelog - Add env parser - Add df parser - Add free parser +- Add lsblk parser 20191021 v0.6.4 - Flatten netstat parser output diff --git a/jc/jc.py b/jc/jc.py index de436b0b..44c66b6c 100755 --- a/jc/jc.py +++ b/jc/jc.py @@ -11,6 +11,7 @@ import jc.parsers.env import jc.parsers.free import jc.parsers.ifconfig import jc.parsers.ls +import jc.parsers.lsblk import jc.parsers.netstat import jc.parsers.ps import jc.parsers.route @@ -38,6 +39,9 @@ def main(): elif '--ls' in sys.argv: result = jc.parsers.ls.parse(data) + elif '--lsblk' in sys.argv: + result = jc.parsers.lsblk.parse(data) + elif '--netstat' in sys.argv: result = jc.parsers.netstat.parse(data) @@ -56,6 +60,7 @@ def main(): print(' --free free parser', file=sys.stderr) print(' --ifconfig iconfig parser', file=sys.stderr) print(' --ls ls parser', file=sys.stderr) + print(' --lsblk lsblk parser', file=sys.stderr) print(' --netstat netstat parser', file=sys.stderr) print(' --ps ps parser', file=sys.stderr) print(' --route route parser\n', file=sys.stderr) diff --git a/jc/parsers/lsblk.py b/jc/parsers/lsblk.py new file mode 100644 index 00000000..eb78975f --- /dev/null +++ b/jc/parsers/lsblk.py @@ -0,0 +1,70 @@ +"""jc - JSON CLI output utility lsblk Parser + +Usage: + specify --lsblk as the first argument if the piped input is coming from lsblk + +Example: + +$ lsblk | jc --lsblk -p +[ + { + "NAME": "loop0", + "MAJ:MIN": "7:0", + "RM": "0", + "SIZE": "54.5M", + "RO": "1", + "TYPE": "loop", + "MOUNTPOINT": "/snap/core18/1223" + }, + { + "NAME": "sda", + "MAJ:MIN": "8:0", + "RM": "0", + "SIZE": "20G", + "RO": "0", + "TYPE": "disk" + }, + { + "NAME": "sda1", + "MAJ:MIN": "8:1", + "RM": "0", + "SIZE": "1M", + "RO": "0", + "TYPE": "part" + }, + { + "NAME": "sda2", + "MAJ:MIN": "8:2", + "RM": "0", + "SIZE": "20G", + "RO": "0", + "TYPE": "part", + "MOUNTPOINT": "/" + }, + { + "NAME": "sr0", + "MAJ:MIN": "11:0", + "RM": "1", + "SIZE": "64.8M", + "RO": "0", + "TYPE": "rom" + } +] +""" + + +def parse(data): + + # code adapted from Conor Heine at: + # https://gist.github.com/cahna/43a1a3ff4d075bcd71f9d7120037a501 + + cleandata = data.splitlines() + headers = [h for h in ' '.join(cleandata[0].strip().split()).split() if h] + + raw_data = map(lambda s: s.strip().split(None, len(headers) - 1), cleandata[1:]) + output = [dict(zip(headers, r)) for r in raw_data] + + for entry in output: + entry['NAME'] = entry['NAME'].encode('ascii', errors='ignore').decode() + + return output