#! /usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0
#
# This is simple script to process JSON output from ip route
# command and format it.  Based on earlier shell script version.
"""Script to parse ip route output into more readable text."""

import sys
import json
import getopt
import subprocess


def usage():
    '''Print usage and exit'''
    print("Usage: {} [tablenr [raw ip args...]]".format(sys.argv[0]))
    sys.exit(64)


def main():
    '''Process the arguments'''
    family = 'inet'
    try:
        opts, args = getopt.getopt(sys.argv[1:], "h46f:", ["help", "family="])
    except getopt.GetoptError as err:
        print(err)
        usage()

    for opt, arg in opts:
        if opt in ["-h", "--help"]:
            usage()
        elif opt == '-6':
            family = 'inet6'
        elif opt == "-4":
            family = 'inet'
        elif opt in ["-f", "--family"]:
            family = arg
        else:
            assert False, "unhandled option"

    if not args:
        args = ['0']

    cmd = ['ip', '-f', family, '-j', 'route', 'list', 'table'] + args
    process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    tbl = json.load(process.stdout)
    if family == 'inet':
        fmt = '{:15} {:15} {:15} {:8} {:8}{:<16} {}'
    else:
        fmt = '{:32} {:32} {:32} {:8} {:8}{:<16} {}'

    # ip route json keys
    keys = ['dst', 'gateway', 'prefsrc', 'protocol', 'scope', 'dev', 'table']
    print(fmt.format(*map(lambda x: x.capitalize(), keys)))

    for record in tbl:
        fields = [record[k] if k in record else '' for k in keys]
        print(fmt.format(*fields))


if __name__ == "__main__":
    main()
