From 83a51a045de5db99014f6886f5aca9b792200928 Mon Sep 17 00:00:00 2001 From: Andrew Topp Date: Sun, 9 Jun 2024 02:18:45 +1000 Subject: T6045: Recreate show lldp detail views & improve remote port selection If the remote device has explicitly sent the interface name as the portID, we should use that first as the interface name, before working through the previous priority order. I've brought back LLDP detail views directly calling lldpcli. This can be extended to render a template from op_mode/lldp.py, but lldpcli isn't bad at rendering readable info. Raw mode (including detailed raw) is still accessible for programmatic access. --- op-mode-definitions/lldp.xml.in | 17 +++++++++++++++++ src/op_mode/lldp.py | 23 +++++++++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/op-mode-definitions/lldp.xml.in b/op-mode-definitions/lldp.xml.in index 985262a89..dc1331cc8 100644 --- a/op-mode-definitions/lldp.xml.in +++ b/op-mode-definitions/lldp.xml.in @@ -13,6 +13,12 @@ ${vyos_op_scripts_dir}/lldp.py show_neighbors + + + Show extended detail for LLDP neighbors + + ${vyos_op_scripts_dir}/lldp.py show_neighbors --detail + Show LLDP for specified interface @@ -21,6 +27,17 @@ ${vyos_op_scripts_dir}/lldp.py show_neighbors --interface $5 + + + + Show detailed LLDP for specified interface + + + + + ${vyos_op_scripts_dir}/lldp.py show_neighbors --interface $5 --detail + + diff --git a/src/op_mode/lldp.py b/src/op_mode/lldp.py index 58cfce443..fac622b81 100755 --- a/src/op_mode/lldp.py +++ b/src/op_mode/lldp.py @@ -120,7 +120,12 @@ def _get_formatted_output(raw_data): tmp.append('') # Remote interface - interface = jmespath.search('port.descr', values) + interface = None + if jmespath.search('port.id.type', values) == 'ifname': + # Remote peer has explicitly returned the interface name as the PortID + interface = jmespath.search('port.id.value', values) + if not interface: + interface = jmespath.search('port.descr', values) if not interface: interface = jmespath.search('port.id.value', values) if not interface: @@ -136,11 +141,17 @@ def _get_formatted_output(raw_data): @_verify def show_neighbors(raw: bool, interface: typing.Optional[str], detail: typing.Optional[bool]): - lldp_data = _get_raw_data(interface=interface, detail=detail) - if raw: - return lldp_data - else: - return _get_formatted_output(lldp_data) + if raw or not detail: + lldp_data = _get_raw_data(interface=interface, detail=detail) + if raw: + return lldp_data + else: + return _get_formatted_output(lldp_data) + else: # non-raw, detail + tmp = 'lldpcli -f text show neighbors details' + if interface: + tmp += f' ports {interface}' + return cmd(tmp) if __name__ == "__main__": try: -- cgit v1.2.3