diff options
| -rw-r--r-- | op-mode-definitions/show-bridge.xml.in | 6 | ||||
| -rwxr-xr-x | src/op_mode/bridge.py | 98 | 
2 files changed, 101 insertions, 3 deletions
| diff --git a/op-mode-definitions/show-bridge.xml.in b/op-mode-definitions/show-bridge.xml.in index 8b857888b..dd2a28931 100644 --- a/op-mode-definitions/show-bridge.xml.in +++ b/op-mode-definitions/show-bridge.xml.in @@ -11,7 +11,7 @@              <properties>                <help>View the VLAN filter settings of the bridge</help>              </properties> -            <command>bridge -c vlan show</command> +            <command>${vyos_op_scripts_dir}/bridge.py show_vlan</command>            </leafNode>          </children>        </node> @@ -34,13 +34,13 @@              <properties>                <help>Displays the multicast group database for the bridge</help>              </properties> -            <command>bridge -c mdb show dev $3</command> +            <command>${vyos_op_scripts_dir}/bridge.py show_mdb --interface=$3</command>            </leafNode>            <leafNode name="fdb">              <properties>                <help>Show the forwarding database of the bridge</help>              </properties> -            <command>bridge -c fdb show br $3</command> +            <command>${vyos_op_scripts_dir}/bridge.py show_fdb --interface=$3</command>            </leafNode>          </children>        </tagNode> diff --git a/src/op_mode/bridge.py b/src/op_mode/bridge.py index 4ab127156..411aa06d1 100755 --- a/src/op_mode/bridge.py +++ b/src/op_mode/bridge.py @@ -17,6 +17,7 @@  import jmespath  import json  import sys +import typing  from sys import exit  from tabulate import tabulate @@ -43,6 +44,33 @@ def _get_raw_data_summary():      return data_dict +def _get_raw_data_vlan(): +    """ +    :returns dict +    """ +    json_data = cmd('sudo bridge --json --compressvlans vlan show') +    data_dict = json.loads(json_data) +    return data_dict + + +def _get_raw_data_fdb(bridge): +    """Get MAC-address for the bridge brX +    :returns list +    """ +    json_data = cmd(f'sudo bridge --json fdb show br {bridge}') +    data_dict = json.loads(json_data) +    return data_dict + + +def _get_raw_data_mdb(bridge): +    """Get MAC-address multicast gorup for the bridge brX +    :return list +    """ +    json_data = cmd(f'bridge --json  mdb show br {bridge}') +    data_dict = json.loads(json_data) +    return data_dict + +  def _get_bridge_members(bridge: str) -> list:      """      Get list of interface bridge members @@ -86,6 +114,52 @@ def _get_formatted_output_summary(data):      return output +def _get_formatted_output_vlan(data): +    data_entries = [] +    for entry in data: +        interface = entry.get('ifname') +        vlans = entry.get('vlans') +        for vlan_entry in vlans: +            vlan = vlan_entry.get('vlan') +            if vlan_entry.get('vlanEnd'): +                vlan_end = vlan_entry.get('vlanEnd') +                vlan = f'{vlan}-{vlan_end}' +            flags = ', '.join(vlan_entry.get('flags')).lower() +            data_entries.append([interface, vlan, flags]) + +    headers = ["Interface", "Vlan", "Flags"] +    output = tabulate(data_entries, headers) +    return output + + +def _get_formatted_output_fdb(data): +    data_entries = [] +    for entry in data: +        interface = entry.get('ifname') +        mac = entry.get('mac') +        state = entry.get('state') +        flags = ','.join(entry['flags']) +        data_entries.append([interface, mac, state, flags]) + +    headers = ["Interface", "Mac address", "State", "Flags"] +    output = tabulate(data_entries, headers, numalign="left") +    return output + + +def _get_formatted_output_mdb(data): +    data_entries = [] +    for entry in data: +        for mdb_entry in entry['mdb']: +            interface = mdb_entry.get('port') +            group = mdb_entry.get('grp') +            state = mdb_entry.get('state') +            flags = ','.join(mdb_entry.get('flags')) +            data_entries.append([interface, group, state, flags]) +    headers = ["Interface", "Group", "State", "Flags"] +    output = tabulate(data_entries, headers) +    return output + +  def show(raw: bool):      bridge_data = _get_raw_data_summary()      if raw: @@ -94,6 +168,30 @@ def show(raw: bool):          return _get_formatted_output_summary(bridge_data) +def show_vlan(raw: bool): +    bridge_vlan = _get_raw_data_vlan() +    if raw: +        return bridge_vlan +    else: +        return _get_formatted_output_vlan(bridge_vlan) + + +def show_fdb(raw: bool, interface: str): +    fdb_data = _get_raw_data_fdb(interface) +    if raw: +        return fdb_data +    else: +        return _get_formatted_output_fdb(fdb_data) + + +def show_mdb(raw: bool, interface: str): +    mdb_data = _get_raw_data_mdb(interface) +    if raw: +        return mdb_data +    else: +        return _get_formatted_output_mdb(mdb_data) + +  if __name__ == '__main__':      try:          res = vyos.opmode.run(sys.modules[__name__]) | 
