diff options
| author | Viacheslav Hletenko <v.gletenko@vyos.io> | 2022-07-23 13:47:50 +0000 | 
|---|---|---|
| committer | Viacheslav Hletenko <v.gletenko@vyos.io> | 2022-07-23 14:30:41 +0000 | 
| commit | 4caffa16a076f8f174cd86b666021c5fac878af1 (patch) | |
| tree | bb2c5c0073a69d0ad45ac65639017c8b98023e78 | |
| parent | e1e9f690d3eb4cd03aba118558fffd5b6b2920c8 (diff) | |
| download | vyos-1x-4caffa16a076f8f174cd86b666021c5fac878af1.tar.gz vyos-1x-4caffa16a076f8f174cd86b666021c5fac878af1.zip | |
vrf: T4562: Rewrite show vrf to vyos.opmode format
| -rw-r--r-- | op-mode-definitions/show-vrf.xml.in | 2 | ||||
| -rwxr-xr-x | src/op_mode/vrf.py | 80 | 
2 files changed, 81 insertions, 1 deletions
| diff --git a/op-mode-definitions/show-vrf.xml.in b/op-mode-definitions/show-vrf.xml.in index 9c38c30fe..d8d5284d7 100644 --- a/op-mode-definitions/show-vrf.xml.in +++ b/op-mode-definitions/show-vrf.xml.in @@ -6,7 +6,7 @@          <properties>            <help>Show VRF information</help>          </properties> -        <command>${vyos_op_scripts_dir}/show_vrf.py -e</command> +        <command>${vyos_op_scripts_dir}/vrf.py show</command>        </node>        <tagNode name="vrf">          <properties> diff --git a/src/op_mode/vrf.py b/src/op_mode/vrf.py new file mode 100755 index 000000000..63d9b5ee5 --- /dev/null +++ b/src/op_mode/vrf.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2022 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. + +import json +import sys + +from tabulate import tabulate +from vyos.util import cmd + +import vyos.opmode + + +def _get_raw_data(): +    """ +    :return: list +    """ +    output = cmd('sudo ip --json --brief link show type vrf') +    data = json.loads(output) +    return data + + +def _get_vrf_members(vrf: str) -> list: +    """ +    Get list of interface VRF members +    :param vrf: str +    :return: list +    """ +    output = cmd(f'sudo ip --json --brief link show master {vrf}') +    answer = json.loads(output) +    interfaces = [] +    for data in answer: +        if 'ifname' in data: +            interfaces.append(data.get('ifname')) +    return interfaces if len(interfaces) > 0 else ['n/a'] + + +def _get_formatted_output(raw_data): +    data_entries = [] +    for vrf in raw_data: +        name = vrf.get('ifname') +        state = vrf.get('operstate').lower() +        hw_address = vrf.get('address') +        flags = ','.join(vrf.get('flags')).lower() +        members = ','.join(_get_vrf_members(name)) +        data_entries.append([name, state, hw_address, flags, members]) + +    headers = ["Name", "State", "MAC address", "Flags", "Interfaces"] +    output = tabulate(data_entries, headers, numalign="left") +    return output + + +def show(raw: bool): +    vrf_data = _get_raw_data() +    if raw: +        return vrf_data +    else: +        return _get_formatted_output(vrf_data) + + +if __name__ == "__main__": +    try: +        res = vyos.opmode.run(sys.modules[__name__]) +        if res: +            print(res) +    except ValueError as e: +        print(e) +        sys.exit(1) | 
