summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViacheslav Hletenko <v.gletenko@vyos.io>2022-07-26 17:40:31 +0000
committerViacheslav Hletenko <v.gletenko@vyos.io>2022-07-26 17:40:31 +0000
commit97e0e0eb3ddc1645be3ee255cd7a17fa4b9c1e80 (patch)
tree2818dd9616f7415008a7819b7611e44e07e6465e
parente72795a11fe1ab79aade677a09f6f0f716421e86 (diff)
downloadvyos-1x-97e0e0eb3ddc1645be3ee255cd7a17fa4b9c1e80.tar.gz
vyos-1x-97e0e0eb3ddc1645be3ee255cd7a17fa4b9c1e80.zip
bridge: T4569: Extend bridge.py for op-mode
Extend bridge.py op-mode script, allow next commands to use own op-mode functions Add: show bridge vlan show bridge brX fdb show bridge brX mdb
-rw-r--r--op-mode-definitions/show-bridge.xml.in6
-rwxr-xr-xsrc/op_mode/bridge.py98
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__])