From 76583dcd2f5ef32e58ca87149154563b07e061cb Mon Sep 17 00:00:00 2001 From: Kelly Brazil Date: Mon, 3 Feb 2020 19:07:31 -0800 Subject: [PATCH] add ini file parser --- jc/cli.py | 2 + jc/parsers/ini.py | 111 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 jc/parsers/ini.py diff --git a/jc/cli.py b/jc/cli.py index 7eaa1707..f0604f7c 100644 --- a/jc/cli.py +++ b/jc/cli.py @@ -18,6 +18,7 @@ import jc.parsers.fstab import jc.parsers.history import jc.parsers.hosts import jc.parsers.ifconfig +import jc.parsers.ini import jc.parsers.iptables import jc.parsers.jobs import jc.parsers.ls @@ -53,6 +54,7 @@ parser_map = { '--history': jc.parsers.history, '--hosts': jc.parsers.hosts, '--ifconfig': jc.parsers.ifconfig, + '--ini': jc.parsers.ini, '--iptables': jc.parsers.iptables, '--jobs': jc.parsers.jobs, '--ls': jc.parsers.ls, diff --git a/jc/parsers/ini.py b/jc/parsers/ini.py new file mode 100644 index 00000000..6d60c106 --- /dev/null +++ b/jc/parsers/ini.py @@ -0,0 +1,111 @@ +"""jc - JSON CLI output utility ini Parser + +Usage: + + specify --ini as the first argument if the piped input is coming from a ini file + +Compatibility: + + 'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' + +Examples: + + $ cat example.ini + [DEFAULT] + ServerAliveInterval = 45 + Compression = yes + CompressionLevel = 9 + ForwardX11 = yes + + [bitbucket.org] + User = hg + + [topsecret.server.com] + Port = 50022 + ForwardX11 = no + + $ cat example.ini | jc --ini -p + { + "bitbucket.org": { + "serveraliveinterval": "45", + "compression": "yes", + "compressionlevel": "9", + "forwardx11": "yes", + "user": "hg" + }, + "topsecret.server.com": { + "serveraliveinterval": "45", + "compression": "yes", + "compressionlevel": "9", + "forwardx11": "no", + "port": "50022" + } + } +""" +import jc.utils +import configparser + + +class info(): + version = '1.0' + description = 'ini file parser' + author = 'Kelly Brazil' + author_email = 'kellyjonbrazil@gmail.com' + details = 'Using configparser from the standard library' + + # compatible options: linux, darwin, cygwin, win32, aix, freebsd + compatible = ['linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd'] + + +__version__ = info.version + + +def process(proc_data): + """ + Final processing to conform to the schema. + + Parameters: + + proc_data: (dictionary) raw structured data to process + + Returns: + + Dictionary representing an ini document: + + { + ini Document converted to a Dictionary + } + """ + + # No further processing + return proc_data + + +def parse(data, raw=False, quiet=False): + """ + Main text parsing function + + Parameters: + + data: (string) text data to parse + raw: (boolean) output preprocessed JSON if True + quiet: (boolean) suppress warning messages if True + + Returns: + + Dictionary representing the ini file + """ + if not quiet: + jc.utils.compatibility(__name__, info.compatible) + + raw_output = {} + + if data: + ini = configparser.ConfigParser() + ini.read_string(data) + raw_output = {s:dict(ini.items(s)) for s in ini.sections()} + + if raw: + return raw_output + else: + return process(raw_output)