mirror of
https://git.kernel.org/pub/scm/network/iproute2/iproute2.git
synced 2026-01-27 06:24:13 +00:00
Not sure if anyone uses the routel script. The script was a combination of ip route, shell and awk doing command scraping. It is now possible to do this much better using the JSON output formats and python. Rewriting also fixes the bug where the old script could not parse the current output format. At the end was getting: /usr/bin/routel: 48: shift: can't shift that many The new script also has IPv6 as option. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Signed-off-by: David Ahern <dsahern@kernel.org>
63 lines
1.6 KiB
Python
Executable File
63 lines
1.6 KiB
Python
Executable File
#! /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()
|