From c5715ca7086b0687e3ee95a24ab72ab9b389b323 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sun, 8 Mar 2020 14:17:29 +0100 Subject: vrf: T31: add member interfaces to 'show ver' output VRF name state mac address flags interfaces -------- ----- ----------- ----- ---------- blue up de:c4:83:d8:74:24 noarp,master,up,lower_up dum200,eth0.302 red up be:36:ce:02:df:aa noarp,master,up,lower_up dum100,eth0.300,bond0.100,peth0 --- src/op_mode/show_vrf.py | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'src/op_mode/show_vrf.py') diff --git a/src/op_mode/show_vrf.py b/src/op_mode/show_vrf.py index ec894d572..66c33e607 100755 --- a/src/op_mode/show_vrf.py +++ b/src/op_mode/show_vrf.py @@ -15,15 +15,30 @@ # along with this program. If not, see . import argparse +import jinja2 from subprocess import check_output from json import loads +vrf_out_tmpl = """ +VRF name state mac address flags interfaces +-------- ----- ----------- ----- ---------- +{%- for v in vrf %} +{{"%-16s"|format(v.ifname)}} {{ "%-8s"|format(v.operstate | lower())}} {{"%-17s"|format(v.address | lower())}} {{ v.flags|join(',')|lower()}} {{v.members|join(',')|lower()}} +{%- endfor %} + +""" + def list_vrfs(): command = 'ip -j -br link show type vrf' answer = loads(check_output(command.split()).decode()) return [_ for _ in answer if _] +def list_vrf_members(vrf): + command = f'ip -j -br link show master {vrf}' + answer = loads(check_output(command.split()).decode()) + return [_ for _ in answer if _] + parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument("-e", "--extensive", action="store_true", @@ -34,15 +49,19 @@ parser.add_argument('interface', metavar='I', type=str, nargs='?', args = parser.parse_args() if args.extensive: - print('{:16} {:7} {:17} {}'.format('interface', 'state', 'mac', 'flags')) - print('{:16} {:7} {:17} {}'.format('---------', '-----', '---', '-----')) + data = { 'vrf': [] } for vrf in list_vrfs(): name = vrf['ifname'] if args.interface and name != args.interface: continue - state = vrf['operstate'].lower() - mac = vrf['address'].lower() - info = ','.join([_.lower() for _ in vrf['flags']]) - print(f'{name:16} {state:7} {mac:17} {info}') + + vrf['members'] = [] + for member in list_vrf_members(name): + vrf['members'].append(member['ifname']) + data['vrf'].append(vrf) + + tmpl = jinja2.Template(vrf_out_tmpl) + print(tmpl.render(data)) + else: print(" ".join([vrf['ifname'] for vrf in list_vrfs()])) -- cgit v1.2.3