diff --git a/jc/lib.py b/jc/lib.py index fb6d8dff..1733a351 100644 --- a/jc/lib.py +++ b/jc/lib.py @@ -73,6 +73,7 @@ parsers = [ 'ping-s', 'pip-list', 'pip-show', + 'postconf', 'ps', 'route', 'rpm-qi', diff --git a/jc/parsers/postconf.py b/jc/parsers/postconf.py new file mode 100644 index 00000000..15eadd62 --- /dev/null +++ b/jc/parsers/postconf.py @@ -0,0 +1,102 @@ +"""jc - JSON Convert `postconf -M` command output parser + +Usage (cli): + + $ postconf -M | jc --postconf + + or + + $ jc postconf -M + +Usage (module): + + import jc + result = jc.parse('postconf', postconf_command_output) + +Schema: + + [ + { + "postconf": string, + "bar": boolean, + "baz": integer + } + ] + +Examples: + + $ postconf | jc --postconf -p + [] + + $ postconf | jc --postconf -p -r + [] +""" +from typing import List, Dict +import jc.utils +from jc.parsers.universal import simple_table_parse + + +class info(): + """Provides parser metadata (version, author, etc.)""" + version = '1.0' + description = '`postconf -M` command parser' + author = 'Kelly Brazil' + author_email = 'kellyjonbrazil@gmail.com' + compatible = ['linux'] + magic_commands = ['postconf -M'] + + +__version__ = info.version + + +def _process(proc_data: List[Dict]) -> List[Dict]: + """ + Final processing to conform to the schema. + + Parameters: + + proc_data: (List of Dictionaries) raw structured data to process + + Returns: + + List of Dictionaries. Structured to conform to the schema. + """ + + # process the data here + # rebuild output for added semantic information + # use helper functions in jc.utils for int, float, bool + # conversions and timestamps + + return proc_data + + +def parse( + data: str, + raw: bool = False, + quiet: bool = False +) -> List[Dict]: + """ + Main text parsing function + + Parameters: + + data: (string) text data to parse + raw: (boolean) unprocessed output if True + quiet: (boolean) suppress warning messages if True + + Returns: + + List of Dictionaries. Raw or processed structured data. + """ + jc.utils.compatibility(__name__, info.compatible, quiet) + jc.utils.input_type_check(data) + + raw_output: List = [] + + if jc.utils.has_data(data): + table = ['service_name service_type private unprivileged chroot wake_up_time process_limit command'] + data_list = list(filter(None, data.splitlines())) + table.extend(data_list) + raw_output = simple_table_parse(table) + + return raw_output if raw else _process(raw_output) diff --git a/tests/fixtures/generic/postconf-M.out b/tests/fixtures/generic/postconf-M.out new file mode 100644 index 00000000..187dd624 --- /dev/null +++ b/tests/fixtures/generic/postconf-M.out @@ -0,0 +1,31 @@ +smtp inet n - y - - smtpd +pickup unix n - y 60 1 pickup +cleanup unix n - y - 0 cleanup +qmgr unix n - n 300 1 qmgr +tlsmgr unix - - y 1000? 1 tlsmgr +rewrite unix - - y - - trivial-rewrite +bounce unix - - y - 0 bounce +defer unix - - y - 0 bounce +trace unix - - y - 0 bounce +verify unix - - y - 1 verify +flush unix n - y 1000? 0 flush +proxymap unix - - n - - proxymap +proxywrite unix - - n - 1 proxymap +smtp unix - - y - - smtp +relay unix - - y - - smtp -o syslog_name=postfix/$service_name +showq unix n - y - - showq +error unix - - y - - error +retry unix - - y - - error +discard unix - - y - - discard +local unix - n n - - local +virtual unix - n n - - virtual +lmtp unix - - y - - lmtp +anvil unix - - y - 1 anvil +scache unix - - y - 1 scache +postlog unix-dgram n - n - 1 postlogd +maildrop unix - n n - - pipe flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient} +uucp unix - n n - - pipe flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient) +ifmail unix - n n - - pipe flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient) +bsmtp unix - n n - - pipe flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient +scalemail-backend unix - n n - 2 pipe flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension} +mailman unix - n n - - pipe flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}