summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile2
-rw-r--r--data/templates/firewall/nftables-defines.j22
-rw-r--r--data/templates/firewall/nftables-zone.j236
-rw-r--r--op-mode-definitions/clear-ip.xml.in14
-rw-r--r--op-mode-definitions/clear-ipv6.xml.in14
-rw-r--r--op-mode-definitions/execute-port-scan.xml.in4
-rwxr-xr-xop-mode-definitions/firewall.xml.in58
-rw-r--r--op-mode-definitions/include/bgp/afi-common.xml.i24
-rw-r--r--op-mode-definitions/include/bgp/afi-ipv4-ipv6-common.xml.i36
-rw-r--r--op-mode-definitions/include/bgp/afi-ipv4-ipv6-flowspec.xml.i24
-rw-r--r--op-mode-definitions/include/bgp/afi-ipv4-ipv6-vpn-rd.xml.i4
-rw-r--r--op-mode-definitions/include/bgp/afi-ipv4-ipv6-vpn.xml.i24
-rw-r--r--op-mode-definitions/include/bgp/next-hop.xml.i24
-rw-r--r--op-mode-definitions/include/bgp/show-bgp-common.xml.i83
-rw-r--r--op-mode-definitions/include/bgp/show-ip-bgp-common.xml.i28
-rw-r--r--op-mode-definitions/include/isis-common.xml.i54
-rw-r--r--op-mode-definitions/include/ospf/common.xml.i538
-rw-r--r--op-mode-definitions/include/ospfv3/border-routers.xml.i18
-rw-r--r--op-mode-definitions/include/ospfv3/database.xml.i54
-rw-r--r--op-mode-definitions/include/ospfv3/interface.xml.i90
-rw-r--r--op-mode-definitions/include/ospfv3/linkstate-id-node-tag.xml.i4
-rw-r--r--op-mode-definitions/include/ospfv3/linkstate.xml.i4
-rw-r--r--op-mode-definitions/include/ospfv3/route.xml.i52
-rw-r--r--op-mode-definitions/include/show-route-table.xml.i7
-rw-r--r--op-mode-definitions/include/show-route-tag.xml.i7
-rw-r--r--op-mode-definitions/include/vtysh-generic-interface-virtualTagNode.xml11
-rw-r--r--op-mode-definitions/ipv4-route.xml.in10
-rw-r--r--op-mode-definitions/ipv6-route.xml.in10
-rw-r--r--op-mode-definitions/monitor-command.xml.in29
-rw-r--r--op-mode-definitions/monitor-protocol.xml.in20
-rw-r--r--op-mode-definitions/mtr.xml.in8
-rw-r--r--op-mode-definitions/openvpn.xml.in125
-rw-r--r--op-mode-definitions/ping.xml.in4
-rw-r--r--op-mode-definitions/pki.xml.in46
-rw-r--r--op-mode-definitions/reset-bgp.xml.in172
-rw-r--r--op-mode-definitions/reset-ip-bgp.xml.in46
-rw-r--r--op-mode-definitions/show-bridge.xml.in103
-rw-r--r--op-mode-definitions/show-evpn.xml.in71
-rw-r--r--op-mode-definitions/show-history.xml.in21
-rw-r--r--op-mode-definitions/show-interfaces-bonding.xml.in117
-rw-r--r--op-mode-definitions/show-interfaces-bridge.xml.in40
-rw-r--r--op-mode-definitions/show-interfaces-dummy.xml.in40
-rw-r--r--op-mode-definitions/show-interfaces-ethernet.xml.in131
-rw-r--r--op-mode-definitions/show-interfaces-geneve.xml.in38
-rw-r--r--op-mode-definitions/show-interfaces-input.xml.in34
-rw-r--r--op-mode-definitions/show-interfaces-l2tpv3.xml.in38
-rw-r--r--op-mode-definitions/show-interfaces-loopback.xml.in38
-rw-r--r--op-mode-definitions/show-interfaces-macsec.xml.in26
-rw-r--r--op-mode-definitions/show-interfaces-pppoe.xml.in56
-rw-r--r--op-mode-definitions/show-interfaces-pseudo-ethernet.xml.in40
-rw-r--r--op-mode-definitions/show-interfaces-sstpc.xml.in56
-rw-r--r--op-mode-definitions/show-interfaces-tunnel.xml.in40
-rw-r--r--op-mode-definitions/show-interfaces-virtual-ethernet.xml.in38
-rw-r--r--op-mode-definitions/show-interfaces-vti.xml.in38
-rw-r--r--op-mode-definitions/show-interfaces-vxlan.xml.in38
-rw-r--r--op-mode-definitions/show-interfaces-wireguard.xml.in84
-rw-r--r--op-mode-definitions/show-interfaces-wireless.xml.in90
-rw-r--r--op-mode-definitions/show-interfaces-wwan.xml.in160
-rw-r--r--op-mode-definitions/show-interfaces.xml.in44
-rw-r--r--op-mode-definitions/show-ip-bgp.xml.in10
-rw-r--r--op-mode-definitions/show-ip-route.xml.in56
-rw-r--r--op-mode-definitions/show-ipv6-prefix-list.xml.in90
-rw-r--r--op-mode-definitions/show-ipv6-route.xml.in56
-rwxr-xr-xop-mode-definitions/show-log.xml.in30
-rw-r--r--op-mode-definitions/show-mpls.xml.in80
-rw-r--r--op-mode-definitions/show-openfabric.xml.in2
-rw-r--r--op-mode-definitions/show-vrf.xml.in46
-rw-r--r--op-mode-definitions/terminal.xml.in10
-rw-r--r--op-mode-definitions/traceroute.xml.in4
-rw-r--r--op-mode-definitions/traffic-dump.xml.in4
-rw-r--r--op-mode-definitions/vrrp.xml.in38
-rw-r--r--python/vyos/defaults.py4
-rwxr-xr-xpython/vyos/firewall.py4
-rw-r--r--python/vyos/ifconfig/interface.py4
-rwxr-xr-xpython/vyos/template.py4
-rw-r--r--python/vyos/xml_ref/__init__.py28
-rwxr-xr-xpython/vyos/xml_ref/generate_op_cache.py191
-rw-r--r--python/vyos/xml_ref/op_definition.py246
-rw-r--r--schema/op-mode-definition.rnc13
-rw-r--r--schema/op-mode-definition.rng54
-rwxr-xr-xscripts/build-command-op-templates33
-rwxr-xr-xsrc/conf_mode/pki.py4
-rwxr-xr-xsrc/conf_mode/vrf.py4
-rw-r--r--src/etc/systemd/system/certbot.service.d/10-override.conf7
-rwxr-xr-xsrc/helpers/vyos-load-balancer.py6
-rwxr-xr-xsrc/op_mode/load-balancing_wan.py2
-rwxr-xr-xsrc/op_mode/pki.py15
-rwxr-xr-xsrc/services/vyos-commitd4
89 files changed, 2234 insertions, 1883 deletions
diff --git a/.gitignore b/.gitignore
index 7084332a8..abdc5eb7d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -146,6 +146,7 @@ data/component-versions.json
python/vyos/xml_ref/cache.py
python/vyos/xml_ref/pkg_cache/*_cache.py
python/vyos/xml_ref/op_cache.py
+python/vyos/xml_ref/op_cache.json
python/vyos/xml_ref/pkg_cache/*_op_cache.py
data/reftree.cache
# autogenerated vyos-configd JSON definition
diff --git a/Makefile b/Makefile
index d3248c8d2..e85ccd7f4 100644
--- a/Makefile
+++ b/Makefile
@@ -69,7 +69,7 @@ op_mode_definitions: $(op_xml_obj)
find $(BUILD_DIR)/op-mode-definitions/ -type f -name "*.xml" | xargs -I {} $(CURDIR)/scripts/build-command-op-templates {} $(CURDIR)/schema/op-mode-definition.rng $(OP_TMPL_DIR) || exit 1
- $(CURDIR)/python/vyos/xml_ref/generate_op_cache.py --xml-dir $(BUILD_DIR)/op-mode-definitions || exit 1
+ $(CURDIR)/python/vyos/xml_ref/generate_op_cache.py --check-path-ambiguity --xml-dir $(BUILD_DIR)/op-mode-definitions || exit 1
# XXX: tcpdump, ping, traceroute and mtr must be able to recursivly call themselves as the
# options are provided from the scripts themselves
diff --git a/data/templates/firewall/nftables-defines.j2 b/data/templates/firewall/nftables-defines.j2
index a1d1fa4f6..c4b6b7eba 100644
--- a/data/templates/firewall/nftables-defines.j2
+++ b/data/templates/firewall/nftables-defines.j2
@@ -111,7 +111,7 @@
flags interval
auto-merge
{% if group_conf.interface is vyos_defined or includes %}
- elements = { {{ group_conf.interface | nft_nested_group(includes, group.interface_group, 'interface') | join(",") }} }
+ elements = { {{ group_conf.interface | nft_nested_group(includes, group.interface_group, 'interface') | quoted_join(",") }} }
{% endif %}
}
{% endfor %}
diff --git a/data/templates/firewall/nftables-zone.j2 b/data/templates/firewall/nftables-zone.j2
index 645a38706..66f7e0b1c 100644
--- a/data/templates/firewall/nftables-zone.j2
+++ b/data/templates/firewall/nftables-zone.j2
@@ -9,11 +9,11 @@
{% for zone_name, zone_conf in zone.items() %}
{% if 'local_zone' not in zone_conf %}
{% if 'interface' in zone_conf.member %}
- oifname { {{ zone_conf.member.interface | join(',') }} } counter jump VZONE_{{ zone_name }}
+ oifname { {{ zone_conf.member.interface | quoted_join(',') }} } counter jump VZONE_{{ zone_name }}
{% endif %}
{% if 'vrf' in zone_conf.member %}
{% for vrf_name in zone_conf.member.vrf %}
- oifname { {{ zone_conf['vrf_interfaces'][vrf_name] }} } counter jump VZONE_{{ zone_name }}
+ oifname { "{{ zone_conf['vrf_interfaces'][vrf_name] }}" } counter jump VZONE_{{ zone_name }}
{% endfor %}
{% endif %}
{% endif %}
@@ -49,12 +49,12 @@
{% for from_zone, from_conf in zone_conf.from.items() if from_conf.firewall[fw_name] is vyos_defined %}
{% if 'interface' in zone[from_zone].member %}
- iifname { {{ zone[from_zone].member.interface | join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
- iifname { {{ zone[from_zone].member.interface | join(",") }} } counter return
+ iifname { {{ zone[from_zone].member.interface | quoted_join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
+ iifname { {{ zone[from_zone].member.interface | quoted_join(",") }} } counter return
{% endif %}
{% if 'vrf' in zone[from_zone].member %}
- iifname { {{ zone[from_zone].member.vrf | join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
- iifname { {{ zone[from_zone].member.vrf | join(",") }} } counter return
+ iifname { {{ zone[from_zone].member.vrf | quoted_join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
+ iifname { {{ zone[from_zone].member.vrf | quoted_join(",") }} } counter return
{% endif %}
{% endfor %}
{% endif %}
@@ -65,13 +65,13 @@
{% if zone_conf.from_local is vyos_defined %}
{% for from_zone, from_conf in zone_conf.from_local.items() if from_conf.firewall[fw_name] is vyos_defined %}
{% if 'interface' in zone[from_zone].member %}
- oifname { {{ zone[from_zone].member.interface | join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
- oifname { {{ zone[from_zone].member.interface | join(",") }} } counter return
+ oifname { {{ zone[from_zone].member.interface | quoted_join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
+ oifname { {{ zone[from_zone].member.interface | quoted_join(",") }} } counter return
{% endif %}
{% if 'vrf' in zone[from_zone].member %}
{% for vrf_name in zone[from_zone].member.vrf %}
- oifname { {{ zone[from_zone]['vrf_interfaces'][vrf_name] }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
- oifname { {{ zone[from_zone]['vrf_interfaces'][vrf_name] }} } counter return
+ oifname { "{{ zone[from_zone]['vrf_interfaces'][vrf_name] }}" } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
+ oifname { "{{ zone[from_zone]['vrf_interfaces'][vrf_name] }}" } counter return
{% endfor %}
{% endif %}
{% endfor %}
@@ -81,29 +81,29 @@
{% else %}
chain VZONE_{{ zone_name }} {
{% if 'interface' in zone_conf.member %}
- iifname { {{ zone_conf.member.interface | join(",") }} } counter {{ zone_conf | nft_intra_zone_action(ipv6) }}
+ iifname { {{ zone_conf.member.interface | quoted_join(",") }} } counter {{ zone_conf | nft_intra_zone_action(ipv6) }}
{% endif %}
{% if 'vrf' in zone_conf.member %}
- iifname { {{ zone_conf.member.vrf | join(",") }} } counter {{ zone_conf | nft_intra_zone_action(ipv6) }}
+ iifname { {{ zone_conf.member.vrf | quoted_join(",") }} } counter {{ zone_conf | nft_intra_zone_action(ipv6) }}
{% endif %}
{% if zone_conf.intra_zone_filtering is vyos_defined %}
{% if 'interface' in zone_conf.member %}
- iifname { {{ zone_conf.member.interface | join(",") }} } counter return
+ iifname { {{ zone_conf.member.interface | quoted_join(",") }} } counter return
{% endif %}
{% if 'vrf' in zone_conf.member %}
- iifname { {{ zone_conf.member.vrf | join(",") }} } counter return
+ iifname { {{ zone_conf.member.vrf | quoted_join(",") }} } counter return
{% endif %}
{% endif %}
{% if zone_conf.from is vyos_defined %}
{% for from_zone, from_conf in zone_conf.from.items() if from_conf.firewall[fw_name] is vyos_defined %}
{% if zone[from_zone].local_zone is not defined %}
{% if 'interface' in zone[from_zone].member %}
- iifname { {{ zone[from_zone].member.interface | join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
- iifname { {{ zone[from_zone].member.interface | join(",") }} } counter return
+ iifname { {{ zone[from_zone].member.interface | quoted_join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
+ iifname { {{ zone[from_zone].member.interface | quoted_join(",") }} } counter return
{% endif %}
{% if 'vrf' in zone[from_zone].member %}
- iifname { {{ zone[from_zone].member.vrf | join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
- iifname { {{ zone[from_zone].member.vrf | join(",") }} } counter return
+ iifname { {{ zone[from_zone].member.vrf | quoted_join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }}
+ iifname { {{ zone[from_zone].member.vrf | quoted_join(",") }} } counter return
{% endif %}
{% endif %}
{% endfor %}
diff --git a/op-mode-definitions/clear-ip.xml.in b/op-mode-definitions/clear-ip.xml.in
index 3c75ed11b..cbbd462d1 100644
--- a/op-mode-definitions/clear-ip.xml.in
+++ b/op-mode-definitions/clear-ip.xml.in
@@ -7,12 +7,6 @@
<help>Clear Internet Protocol (IP) statistics or status</help>
</properties>
<children>
- <node name="prefix-list">
- <properties>
- <help>Clear prefix-list statistics or status</help>
- </properties>
- <command>vtysh -c "$*"</command>
- </node>
<tagNode name="prefix-list">
<properties>
<help>Clear prefix-list statistics or status for specified word</help>
@@ -20,9 +14,13 @@
<list>&lt;WORD&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Clear prefix-list statistics or status</help>
+ <command>vtysh -c "$*"</command>
+ </standalone>
<command>vtysh -c "$*"</command>
<children>
- <leafNode name="node.tag">
+ <virtualTagNode>
<properties>
<help>Clear prefix-list statistics or status for given word|network</help>
<completionHelp>
@@ -30,7 +28,7 @@
</completionHelp>
</properties>
<command>vtysh -c "$*"</command>
- </leafNode>
+ </virtualTagNode>
</children>
</tagNode>
</children>
diff --git a/op-mode-definitions/clear-ipv6.xml.in b/op-mode-definitions/clear-ipv6.xml.in
index c062102fc..bdfc9eab7 100644
--- a/op-mode-definitions/clear-ipv6.xml.in
+++ b/op-mode-definitions/clear-ipv6.xml.in
@@ -7,12 +7,6 @@
<help>Clear Internet Protocol (IPv6) statistics or status</help>
</properties>
<children>
- <node name="prefix-list">
- <properties>
- <help>Clear prefix-list statistics or status</help>
- </properties>
- <command>vtysh -c "$*"</command>
- </node>
<tagNode name="prefix-list">
<properties>
<help>Clear prefix-list statistics or status for specified word</help>
@@ -20,9 +14,13 @@
<list>WORD</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Clear prefix-list statistics or status</help>
+ <command>vtysh -c "$*"</command>
+ </standalone>
<command>vtysh -c "$*"</command>
<children>
- <leafNode name="node.tag">
+ <virtualTagNode>
<properties>
<help>Clear prefix-list statistics or status for given word|network</help>
<completionHelp>
@@ -30,7 +28,7 @@
</completionHelp>
</properties>
<command>vtysh -c "$*"</command>
- </leafNode>
+ </virtualTagNode>
</children>
</tagNode>
</children>
diff --git a/op-mode-definitions/execute-port-scan.xml.in b/op-mode-definitions/execute-port-scan.xml.in
index 52cdab5f0..45221cb4c 100644
--- a/op-mode-definitions/execute-port-scan.xml.in
+++ b/op-mode-definitions/execute-port-scan.xml.in
@@ -16,7 +16,7 @@
</properties>
<command>nmap -p- -T4 --max-retries=1 --host-timeout=30s "$4"</command>
<children>
- <leafNode name="node.tag">
+ <virtualTagNode>
<properties>
<help>Port scan options</help>
<completionHelp>
@@ -24,7 +24,7 @@
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/execute_port-scan.py "${@:4}"</command>
- </leafNode>
+ </virtualTagNode>
</children>
</tagNode>
</children>
diff --git a/op-mode-definitions/firewall.xml.in b/op-mode-definitions/firewall.xml.in
index f3f9d3ded..549935de9 100755
--- a/op-mode-definitions/firewall.xml.in
+++ b/op-mode-definitions/firewall.xml.in
@@ -7,43 +7,43 @@
<help>Show firewall information</help>
</properties>
<children>
- <tagNode name="group">
+ <node name="group">
<properties>
<help>Show firewall group</help>
- <completionHelp>
- <path>firewall group address-group</path>
- <path>firewall group network-group</path>
- <path>firewall group port-group</path>
- <path>firewall group domain-group</path>
- <path>firewall group dynamic-group address-group</path>
- <path>firewall group dynamic-group ipv6-address-group</path>
- <path>firewall group interface-group</path>
- <path>firewall group ipv6-address-group</path>
- <path>firewall group ipv6-network-group</path>
- <path>firewall group mac-group</path>
- <path>firewall group network-group</path>
- <path>firewall group port-group</path>
- <path>firewall group remote-group</path>
- </completionHelp>
</properties>
<children>
- <leafNode name="detail">
+ <virtualTagNode>
<properties>
- <help>Show list view of firewall groups</help>
+ <help>Show firewall group</help>
<completionHelp>
- <path>firewall group detail</path>
+ <path>firewall group address-group</path>
+ <path>firewall group network-group</path>
+ <path>firewall group port-group</path>
+ <path>firewall group domain-group</path>
+ <path>firewall group dynamic-group address-group</path>
+ <path>firewall group dynamic-group ipv6-address-group</path>
+ <path>firewall group interface-group</path>
+ <path>firewall group ipv6-address-group</path>
+ <path>firewall group ipv6-network-group</path>
+ <path>firewall group mac-group</path>
+ <path>firewall group network-group</path>
+ <path>firewall group port-group</path>
+ <path>firewall group remote-group</path>
</completionHelp>
</properties>
- <command>${vyos_op_scripts_dir}/firewall.py --action show_group --name $4 --detail $5</command>
- </leafNode>
- </children>
- <command>${vyos_op_scripts_dir}/firewall.py --action show_group --name $4</command>
- </tagNode>
- <node name="group">
- <properties>
- <help>Show firewall group</help>
- </properties>
- <children>
+ <children>
+ <leafNode name="detail">
+ <properties>
+ <help>Show list view of firewall groups</help>
+ <completionHelp>
+ <path>firewall group detail</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/firewall.py --action show_group --name $4 --detail $5</command>
+ </leafNode>
+ </children>
+ <command>${vyos_op_scripts_dir}/firewall.py --action show_group --name $4</command>
+ </virtualTagNode>
<leafNode name="detail">
<properties>
<help>Show list view of firewall group</help>
diff --git a/op-mode-definitions/include/bgp/afi-common.xml.i b/op-mode-definitions/include/bgp/afi-common.xml.i
index acf20d950..e5a72f3b1 100644
--- a/op-mode-definitions/include/bgp/afi-common.xml.i
+++ b/op-mode-definitions/include/bgp/afi-common.xml.i
@@ -1,28 +1,4 @@
<!-- included start from bgp/afi-common.xml.i -->
-<tagNode name="community">
- <properties>
- <help>Community number where AA and NN are (0-65535)</help>
- <completionHelp>
- <list>AA:NN</list>
- </completionHelp>
- </properties>
- <children>
- #include <include/bgp/exact-match.xml.i>
- </children>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
-</tagNode>
-<tagNode name="large-community">
- <properties>
- <help>Display routes matching the large-communities</help>
- <completionHelp>
- <list>AA:BB:CC</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/bgp/exact-match.xml.i>
- </children>
-</tagNode>
<tagNode name="large-community-list">
<properties>
<help>Display routes matching the large-community-list</help>
diff --git a/op-mode-definitions/include/bgp/afi-ipv4-ipv6-common.xml.i b/op-mode-definitions/include/bgp/afi-ipv4-ipv6-common.xml.i
index d5fb7f5ee..86cd27517 100644
--- a/op-mode-definitions/include/bgp/afi-ipv4-ipv6-common.xml.i
+++ b/op-mode-definitions/include/bgp/afi-ipv4-ipv6-common.xml.i
@@ -4,6 +4,18 @@
<help>Display routes matching the community</help>
</properties>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Community number where AA and NN are (0-65535)</help>
+ <completionHelp>
+ <list>AA:NN</list>
+ </completionHelp>
+ </properties>
+ <children>
+ #include <include/bgp/exact-match.xml.i>
+ </children>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </virtualTagNode>
<leafNode name="accept-own">
<properties>
<help>Should accept local VPN route if exported and imported into different VRF (well-known community)</help>
@@ -142,13 +154,21 @@
<help>Show BGP routes matching the specified large-communities</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ <virtualTagNode>
+ <properties>
+ <help>Display routes matching the large-communities</help>
+ <completionHelp>
+ <list>AA:BB:CC</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/bgp/exact-match.xml.i>
+ </children>
+ </virtualTagNode>
+ </children>
</node>
-<leafNode name="neighbors">
- <properties>
- <help>Detailed information on TCP and BGP neighbor connections</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
-</leafNode>
<tagNode name="neighbors">
<properties>
<help>Show BGP information for specified neighbor</help>
@@ -156,6 +176,10 @@
<script>vtysh -c "$(IFS=$' '; echo "${COMP_WORDS[@]:0:${#COMP_WORDS[@]}-2} summary")" | awk '/^[0-9a-f]/ {print $1}'</script>
</completionHelp>
</properties>
+ <standalone>
+ <help>Detailed information on TCP and BGP neighbor connections</help>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </standalone>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
#include <include/bgp/advertised-routes.xml.i>
diff --git a/op-mode-definitions/include/bgp/afi-ipv4-ipv6-flowspec.xml.i b/op-mode-definitions/include/bgp/afi-ipv4-ipv6-flowspec.xml.i
index 34228fdd1..996e2bd3d 100644
--- a/op-mode-definitions/include/bgp/afi-ipv4-ipv6-flowspec.xml.i
+++ b/op-mode-definitions/include/bgp/afi-ipv4-ipv6-flowspec.xml.i
@@ -1,16 +1,4 @@
<!-- included start from bgp/afi-ipv4-ipv6-flowspec.xml.i -->
-<tagNode name="flowspec">
- <properties>
- <help>Network in the BGP routing table to display</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
- </completionHelp>
- </properties>
- <children>
- #include <include/bgp/prefix-bestpath-multipath.xml.i>
- </children>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
-</tagNode>
<node name="flowspec">
<properties>
<help>Flowspec Address Family modifier</help>
@@ -19,6 +7,18 @@
#include <include/bgp/afi-common.xml.i>
#include <include/bgp/afi-ipv4-ipv6-common.xml.i>
#include <include/vtysh-generic-detail.xml.i>
+ <virtualTagNode>
+ <properties>
+ <help>Network in the BGP routing table to display</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
+ </completionHelp>
+ </properties>
+ <children>
+ #include <include/bgp/prefix-bestpath-multipath.xml.i>
+ </children>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </virtualTagNode>
</children>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</node>
diff --git a/op-mode-definitions/include/bgp/afi-ipv4-ipv6-vpn-rd.xml.i b/op-mode-definitions/include/bgp/afi-ipv4-ipv6-vpn-rd.xml.i
index bb95ce3f5..493207f5e 100644
--- a/op-mode-definitions/include/bgp/afi-ipv4-ipv6-vpn-rd.xml.i
+++ b/op-mode-definitions/include/bgp/afi-ipv4-ipv6-vpn-rd.xml.i
@@ -8,7 +8,7 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <tagNode name="">
+ <virtualTagNode>
<properties>
<help>Show IP routes of specified prefix</help>
<completionHelp>
@@ -16,7 +16,7 @@
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
+ </virtualTagNode>
</children>
</tagNode>
<!-- included end -->
diff --git a/op-mode-definitions/include/bgp/afi-ipv4-ipv6-vpn.xml.i b/op-mode-definitions/include/bgp/afi-ipv4-ipv6-vpn.xml.i
index a9fb6e255..f106b8725 100644
--- a/op-mode-definitions/include/bgp/afi-ipv4-ipv6-vpn.xml.i
+++ b/op-mode-definitions/include/bgp/afi-ipv4-ipv6-vpn.xml.i
@@ -1,16 +1,4 @@
<!-- included start from bgp/afi-ipv4-ipv6-vpn.xml.i -->
-<tagNode name="vpn">
- <properties>
- <help>Network in the BGP routing table to display</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
- </completionHelp>
- </properties>
- <children>
- #include <include/bgp/prefix-bestpath-multipath.xml.i>
- </children>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
-</tagNode>
<node name="vpn">
<properties>
<help>VPN Address Family modifier</help>
@@ -19,6 +7,18 @@
#include <include/bgp/afi-common.xml.i>
#include <include/bgp/afi-ipv4-ipv6-common.xml.i>
#include <include/bgp/afi-ipv4-ipv6-vpn-rd.xml.i>
+ <virtualTagNode>
+ <properties>
+ <help>Network in the BGP routing table to display</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
+ </completionHelp>
+ </properties>
+ <children>
+ #include <include/bgp/prefix-bestpath-multipath.xml.i>
+ </children>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </virtualTagNode>
</children>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</node>
diff --git a/op-mode-definitions/include/bgp/next-hop.xml.i b/op-mode-definitions/include/bgp/next-hop.xml.i
index 517a44888..23f07e135 100644
--- a/op-mode-definitions/include/bgp/next-hop.xml.i
+++ b/op-mode-definitions/include/bgp/next-hop.xml.i
@@ -5,19 +5,19 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>IPv4/IPv6 nexthop address</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt; &lt;h:h:h:h:h:h:h:h&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/vtysh-generic-detail.xml.i>
+ </children>
+ </virtualTagNode>
#include <include/vtysh-generic-detail.xml.i>
</children>
</node>
-<tagNode name="nexthop">
- <properties>
- <help>IPv4/IPv6 nexthop address</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt; &lt;h:h:h:h:h:h:h:h&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/vtysh-generic-detail.xml.i>
- </children>
-</tagNode>
<!-- included end -->
diff --git a/op-mode-definitions/include/bgp/show-bgp-common.xml.i b/op-mode-definitions/include/bgp/show-bgp-common.xml.i
index 003451a33..0e488d65f 100644
--- a/op-mode-definitions/include/bgp/show-bgp-common.xml.i
+++ b/op-mode-definitions/include/bgp/show-bgp-common.xml.i
@@ -1,23 +1,23 @@
<!-- included start from bgp/show-bgp-common.xml.i -->
#include <include/bgp/afi-common.xml.i>
#include <include/bgp/afi-ipv4-ipv6-common.xml.i>
-<tagNode name="ipv4">
- <properties>
- <help>Network in the BGP routing table to display</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
- </completionHelp>
- </properties>
- <children>
- #include <include/bgp/prefix-bestpath-multipath.xml.i>
- </children>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
-</tagNode>
<node name="ipv4">
<properties>
<help>IPv4 Address Family</help>
</properties>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Network in the BGP routing table to display</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
+ </completionHelp>
+ </properties>
+ <children>
+ #include <include/bgp/prefix-bestpath-multipath.xml.i>
+ </children>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </virtualTagNode>
#include <include/bgp/afi-common.xml.i>
#include <include/bgp/afi-ipv4-ipv6-common.xml.i>
#include <include/bgp/afi-ipv4-ipv6-flowspec.xml.i>
@@ -25,23 +25,23 @@
</children>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</node>
-<tagNode name="ipv6">
- <properties>
- <help>Network in the BGP routing table to display</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
- </completionHelp>
- </properties>
- <children>
- #include <include/bgp/prefix-bestpath-multipath.xml.i>
- </children>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
-</tagNode>
<node name="ipv6">
<properties>
<help>IPv6 Address Family</help>
</properties>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Network in the BGP routing table to display</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
+ </completionHelp>
+ </properties>
+ <children>
+ #include <include/bgp/prefix-bestpath-multipath.xml.i>
+ </children>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </virtualTagNode>
#include <include/bgp/afi-common.xml.i>
#include <include/bgp/afi-ipv4-ipv6-common.xml.i>
#include <include/bgp/afi-ipv4-ipv6-vpn.xml.i>
@@ -53,21 +53,21 @@
<help>Layer 2 Virtual Private Network</help>
</properties>
<children>
- <tagNode name="evpn">
- <properties>
- <help>Network in the BGP routing table to display</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
<node name="evpn">
<properties>
<help>Ethernet Virtual Private Network</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Network in the BGP routing table to display</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </virtualTagNode>
#include <include/bgp/afi-common.xml.i>
<node name="all">
<properties>
@@ -188,13 +188,20 @@
#include <include/vni-tagnode-all.xml.i>
</children>
</node>
- #include <include/vni-tagnode.xml.i>
- <leafNode name="vni">
+ <tagNode name="vni">
<properties>
- <help>VXLAN network identifier (VNI)</help>
+ <help>VXLAN network identifier (VNI) number</help>
+ <completionHelp>
+ <list>&lt;1-16777215&gt;</list>
+ <script>${vyos_completion_dir}/list_vni.sh</script>
+ </completionHelp>
</properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
+ <standalone>
+ <help>VXLAN network identifier (VNI)</help>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </standalone>
+ <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+ </tagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/include/bgp/show-ip-bgp-common.xml.i b/op-mode-definitions/include/bgp/show-ip-bgp-common.xml.i
index 48475e04e..bb62fd1bb 100644
--- a/op-mode-definitions/include/bgp/show-ip-bgp-common.xml.i
+++ b/op-mode-definitions/include/bgp/show-ip-bgp-common.xml.i
@@ -37,18 +37,21 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <leafNode name="cidr-only">
+ <virtualTagNode>
<properties>
- <help>Display only routes with non-natural netmasks</help>
+ <help>Show BGP information for specified IP address or prefix</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt;</list>
+ </completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
- <node name="community">
+ </virtualTagNode>
+ <leafNode name="cidr-only">
<properties>
- <help>Show BGP routes matching the communities</help>
+ <help>Display only routes with non-natural netmasks</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </node>
+ </leafNode>
<tagNode name="community">
<properties>
<help>Display routes matching the specified communities</help>
@@ -56,6 +59,10 @@
<list>&lt;AA:NN&gt; local-AS no-advertise no-export</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Show BGP routes matching the communities</help>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </standalone>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</tagNode>
<tagNode name="community-list">
@@ -123,15 +130,6 @@
</leafNode>
</children>
</node>
- <tagNode name="unicast">
- <properties>
- <help>Show BGP information for specified IP address or prefix</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
</children>
</node>
<leafNode name="large-community-info">
diff --git a/op-mode-definitions/include/isis-common.xml.i b/op-mode-definitions/include/isis-common.xml.i
index 493a56633..cda46736d 100644
--- a/op-mode-definitions/include/isis-common.xml.i
+++ b/op-mode-definitions/include/isis-common.xml.i
@@ -4,19 +4,19 @@
<help>Show IS-IS link state database</help>
</properties>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Show IS-IS link state database PDU</help>
+ <completionHelp>
+ <list>lsp-id detail</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </virtualTagNode>
#include <include/vtysh-generic-detail.xml.i>
</children>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</node>
-<tagNode name="database">
- <properties>
- <help>Show IS-IS link state database PDU</help>
- <completionHelp>
- <list>lsp-id detail</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
-</tagNode>
<node name="fast-reroute">
<properties>
<help>Show IS-IS fast reroute/loop free alternate (lfa) information</help>
@@ -59,10 +59,10 @@
</properties>
<children>
#include <include/vtysh-generic-detail.xml.i>
+ #include <include/vtysh-generic-interface-virtualTagNode.xml.i>
</children>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</node>
-#include <include/vtysh-generic-interface-tagNode.xml.i>
<node name="mpls">
<properties>
<help>Show MPLS information</help>
@@ -82,13 +82,19 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</leafNode>
- <leafNode name="interface">
+ <tagNode name="interface">
<properties>
- <help>Show interface information</help>
+ <help>Show information about specific interface</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_interfaces</script>
+ </completionHelp>
</properties>
+ <standalone>
+ <help>Show interface information</help>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </standalone>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
- #include <include/vtysh-generic-interface-tagNode.xml.i>
+ </tagNode>
</children>
</node>
<node name="neighbor">
@@ -96,19 +102,19 @@
<help>Show IS-IS neighbor adjacencies</help>
</properties>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Show specific IS-IS neighbor adjacency </help>
+ <completionHelp>
+ <list>system-id</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </virtualTagNode>
#include <include/vtysh-generic-detail.xml.i>
</children>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</node>
-<tagNode name="neighbor">
- <properties>
- <help>Show specific IS-IS neighbor adjacency </help>
- <completionHelp>
- <list>system-id</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
-</tagNode>
<node name="route">
<properties>
<help>Show IS-IS routing table</help>
@@ -180,4 +186,4 @@
</children>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</node>
-<!-- included end --> \ No newline at end of file
+<!-- included end -->
diff --git a/op-mode-definitions/include/ospf/common.xml.i b/op-mode-definitions/include/ospf/common.xml.i
index 684073cc5..1ffe246e4 100644
--- a/op-mode-definitions/include/ospf/common.xml.i
+++ b/op-mode-definitions/include/ospf/common.xml.i
@@ -17,106 +17,86 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <tagNode name="adv-router">
+ <virtualTagNode>
<properties>
- <help>Show IPv4 OSPF ASBR summary database for given address of advertised router</help>
+ <help>Show IPv4 OSPF ASBR summary database information of given address</help>
<completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
+ <list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
- <node name="adv-router">
- <properties>
- <help>Show IPv4 OSPF ASBR summary database for given address of advertised router</help>
- </properties>
- </node>
- </children>
- </node>
- <tagNode name="asbr-summary">
- <properties>
- <help>Show IPv4 OSPF ASBR summary database information of given address</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <node name="adv-router">
- <properties>
- <help>Show advertising router link states</help>
- </properties>
- </node>
+ <children>
+ <tagNode name="adv-router">
+ <properties>
+ <help>Show IPv4 OSPF ASBR summary database of given address for given advertised router</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </tagNode>
+ <leafNode name="self-originate">
+ <properties>
+ <help>Show summary of self-originate IPv4 OSPF ASBR database</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<tagNode name="adv-router">
<properties>
- <help>Show IPv4 OSPF ASBR summary database of given address for given advertised router</help>
+ <help>Show IPv4 OSPF ASBR summary database for given address of advertised router</help>
<completionHelp>
<list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</tagNode>
- <leafNode name="self-originate">
- <properties>
- <help>Show summary of self-originate IPv4 OSPF ASBR database</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
</children>
- </tagNode>
+ </node>
<node name="external">
<properties>
<help>Show IPv4 OSPF external database</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <tagNode name="adv-router">
+ <virtualTagNode>
<properties>
- <help>Show IPv4 OSPF external database for specified IP address of advertised router</help>
+ <help>Show IPv4 OSPF external database information of specified IP address</help>
<completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
+ <list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
- <node name="adv-router">
- <properties>
- <help>Show IPv4 OSPF external database for specified IP address of advertised router</help>
- </properties>
- </node>
- </children>
- </node>
- <tagNode name="external">
- <properties>
- <help>Show IPv4 OSPF external database information of specified IP address</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <node name="adv-router">
- <properties>
- <help>Show advertising router link states</help>
- </properties>
- </node>
+ <children>
+ <tagNode name="adv-router">
+ <properties>
+ <help>Show IPv4 OSPF external database of specified IP address for specified advertised router</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </tagNode>
+ <leafNode name="self-originate">
+ <properties>
+ <help>Show self-originate IPv4 OSPF external database</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<tagNode name="adv-router">
<properties>
- <help>Show IPv4 OSPF external database of specified IP address for specified advertised router</help>
+ <help>Show IPv4 OSPF external database for specified IP address of advertised router</help>
<completionHelp>
<list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</tagNode>
- <leafNode name="self-originate">
- <properties>
- <help>Show self-originate IPv4 OSPF external database</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
</children>
- </tagNode>
+ </node>
<leafNode name="max-age">
<properties>
<help>Show IPv4 OSPF max-age database</help>
@@ -129,318 +109,258 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <tagNode name="adv-router">
+ <virtualTagNode>
<properties>
- <help>Show IPv4 OSPF network database for specified IP address of advertised router</help>
+ <help>Show IPv4 OSPF network database information of specified IP address</help>
<completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
+ <list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
- <node name="adv-router">
- <properties>
- <help>Show IPv4 OSPF network database for given address of advertised router</help>
- </properties>
- </node>
- </children>
- </node>
- <tagNode name="network">
- <properties>
- <help>Show IPv4 OSPF network database information of specified IP address</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <node name="adv-router">
- <properties>
- <help>Show advertising router link states</help>
- </properties>
- </node>
+ <children>
+ <tagNode name="adv-router">
+ <properties>
+ <help>Show IPv4 OSPF network database of specified IP address for specified advertised router</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </tagNode>
+ <leafNode name="self-originate">
+ <properties>
+ <help>Show self-originate IPv4 OSPF network database</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<tagNode name="adv-router">
<properties>
- <help>Show IPv4 OSPF network database of specified IP address for specified advertised router</help>
+ <help>Show IPv4 OSPF network database for specified IP address of advertised router</help>
<completionHelp>
<list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</tagNode>
- <leafNode name="self-originate">
- <properties>
- <help>Show self-originate IPv4 OSPF network database</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
</children>
- </tagNode>
+ </node>
<node name="nssa-external">
<properties>
<help>Show IPv4 OSPF NSSA external database</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <tagNode name="adv-router">
+ <virtualTagNode>
<properties>
- <help>Show IPv4 OSPF NSSA external database for specified IP address of advertised router</help>
+ <help>Show IPv4 OSPF NSSA external database information of specified IP address</help>
<completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
+ <list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
- <node name="adv-router">
- <properties>
- <help>Show IPv4 OSPF NSSA external database for specified IP address of advertised router</help>
- </properties>
- </node>
- </children>
- </node>
- <tagNode name="nssa-external">
- <properties>
- <help>Show IPv4 OSPF NSSA external database information of specified IP address</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <node name="adv-router">
- <properties>
- <help>Show advertising router link states</help>
- </properties>
- </node>
+ <children>
+ <tagNode name="adv-router">
+ <properties>
+ <help>Show IPv4 OSPF NSSA external database of specified IP address for specified advertised router</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </tagNode>
+ <leafNode name="self-originate">
+ <properties>
+ <help>Show self-originate IPv4 OSPF NSSA external database</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<tagNode name="adv-router">
<properties>
- <help>Show IPv4 OSPF NSSA external database of specified IP address for specified advertised router</help>
+ <help>Show IPv4 OSPF NSSA external database for specified IP address of advertised router</help>
<completionHelp>
<list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</tagNode>
- <leafNode name="self-originate">
- <properties>
- <help>Show self-originate IPv4 OSPF NSSA external database</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
</children>
- </tagNode>
+ </node>
<node name="opaque-area">
<properties>
<help>Show IPv4 OSPF opaque-area database</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <tagNode name="adv-router">
+ <virtualTagNode>
<properties>
- <help>Show IPv4 OSPF opaque-area database for specified IP address of advertised router</help>
+ <help>Show IPv4 OSPF opaque-area database information of specified IP address</help>
<completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
+ <list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
- <node name="adv-router">
- <properties>
- <help>Show IPv4 OSPF opaque-area database for specified IP address of advertised router</help>
- </properties>
- </node>
- </children>
- </node>
- <tagNode name="opaque-area">
- <properties>
- <help>Show IPv4 OSPF opaque-area database information of specified IP address</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <node name="adv-router">
- <properties>
- <help>Show advertising router link states</help>
- </properties>
- </node>
+ <children>
+ <tagNode name="adv-router">
+ <properties>
+ <help>Show IPv4 OSPF opaque-area database of specified IP address for specified advertised router</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </tagNode>
+ <leafNode name="self-originate">
+ <properties>
+ <help>Show self-originate IPv4 OSPF opaque-area database</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<tagNode name="adv-router">
<properties>
- <help>Show IPv4 OSPF opaque-area database of specified IP address for specified advertised router</help>
+ <help>Show IPv4 OSPF opaque-area database for specified IP address of advertised router</help>
<completionHelp>
<list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</tagNode>
- <leafNode name="self-originate">
- <properties>
- <help>Show self-originate IPv4 OSPF opaque-area database</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
</children>
- </tagNode>
+ </node>
<node name="opaque-as">
<properties>
<help>Show IPv4 OSPF opaque-as database</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <tagNode name="adv-router">
+ <virtualTagNode>
<properties>
- <help>Show IPv4 OSPF opaque-as database for specified IP address of advertised router</help>
+ <help>Show IPv4 OSPF opaque-as database information of specified IP address</help>
<completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
+ <list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
- <node name="adv-router">
- <properties>
- <help>Show IPv4 OSPF opaque-as database for specified IP address of advertised router</help>
- </properties>
- </node>
- </children>
- </node>
- <tagNode name="opaque-as">
- <properties>
- <help>Show IPv4 OSPF opaque-as database information of specified IP address</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <node name="adv-router">
- <properties>
- <help>Show advertising router link states</help>
- </properties>
- </node>
+ <children>
+ <tagNode name="adv-router">
+ <properties>
+ <help>Show IPv4 OSPF opaque-as database of specified IP address for specified advertised router</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </tagNode>
+ <leafNode name="self-originate">
+ <properties>
+ <help>Show self-originate IPv4 OSPF opaque-as database</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<tagNode name="adv-router">
<properties>
- <help>Show IPv4 OSPF opaque-as database of specified IP address for specified advertised router</help>
+ <help>Show IPv4 OSPF opaque-as database for specified IP address of advertised router</help>
<completionHelp>
<list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</tagNode>
- <leafNode name="self-originate">
- <properties>
- <help>Show self-originate IPv4 OSPF opaque-as database</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
</children>
- </tagNode>
+ </node>
<node name="opaque-link">
<properties>
<help>Show IPv4 OSPF opaque-link database</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <tagNode name="adv-router">
+ <virtualTagNode>
<properties>
- <help>Show IPv4 OSPF opaque-link database for specified IP address of advertised router</help>
+ <help>Show IPv4 OSPF opaque-link database information of specified IP address</help>
<completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
+ <list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
- <node name="adv-router">
- <properties>
- <help>Show IPv4 OSPF opaque-link database for specified IP address of advertised router</help>
- </properties>
- </node>
- </children>
- </node>
- <tagNode name="opaque-link">
- <properties>
- <help>Show IPv4 OSPF opaque-link database information of specified IP address</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <node name="adv-router">
- <properties>
- <help>Show advertising router link states</help>
- </properties>
- </node>
+ <children>
+ <tagNode name="adv-router">
+ <properties>
+ <help>Show IPv4 OSPF opaque-link database of specified IP address for specified advertised router</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </tagNode>
+ <leafNode name="self-originate">
+ <properties>
+ <help>Show self-originate IPv4 OSPF opaque-link database</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<tagNode name="adv-router">
<properties>
- <help>Show IPv4 OSPF opaque-link database of specified IP address for specified advertised router</help>
+ <help>Show IPv4 OSPF opaque-link database for specified IP address of advertised router</help>
<completionHelp>
<list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</tagNode>
- <leafNode name="self-originate">
- <properties>
- <help>Show self-originate IPv4 OSPF opaque-link database</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
</children>
- </tagNode>
+ </node>
<node name="router">
<properties>
<help>Show IPv4 OSPF router database</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <tagNode name="adv-router">
+ <virtualTagNode>
<properties>
- <help>Show IPv4 OSPF router database for specified IP address of advertised router</help>
+ <help>Show IPv4 OSPF router database information of specified IP address</help>
<completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
+ <list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
- <node name="adv-router">
- <properties>
- <help>Show IPv4 OSPF router database for specified IP address of advertised router</help>
- </properties>
- </node>
- </children>
- </node>
- <tagNode name="router">
- <properties>
- <help>Show IPv4 OSPF router database information of specified IP address</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <node name="adv-router">
- <properties>
- <help>Show advertising router link states</help>
- </properties>
- </node>
+ <children>
+ <tagNode name="adv-router">
+ <properties>
+ <help>Show IPv4 OSPF router database of specified IP address for specified advertised router</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </tagNode>
+ <leafNode name="self-originate">
+ <properties>
+ <help>Show self-originate IPv4 OSPF router database</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<tagNode name="adv-router">
<properties>
- <help>Show IPv4 OSPF router database of specified IP address for specified advertised router</help>
+ <help>Show IPv4 OSPF router database for specified IP address of advertised router</help>
<completionHelp>
<list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</tagNode>
- <leafNode name="self-originate">
- <properties>
- <help>Show self-originate IPv4 OSPF router database</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
</children>
- </tagNode>
+ </node>
<leafNode name="self-originate">
<properties>
<help>Show IPv4 OSPF self-originate database</help>
@@ -453,63 +373,59 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <tagNode name="adv-router">
+ <virtualTagNode>
<properties>
- <help>Show IPv4 OSPF summary database for specified IP address of advertised router</help>
+ <help>Show IPv4 OSPF summary database information of specified IP address</help>
<completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
+ <list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </tagNode>
- <node name="adv-router">
- <properties>
- <help>Show IPv4 OSPF summary database for specified IP address of advertised router</help>
- </properties>
- </node>
- </children>
- </node>
- <tagNode name="summary">
- <properties>
- <help>Show IPv4 OSPF summary database information of specified IP address</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <node name="adv-router">
- <properties>
- <help>Show advertising router link states</help>
- </properties>
- </node>
+ <children>
+ <tagNode name="adv-router">
+ <properties>
+ <help>Show IPv4 OSPF summary database of specified IP address for specified advertised router</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </tagNode>
+ <leafNode name="self-originate">
+ <properties>
+ <help>Show self-originate IPv4 OSPF summary database</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<tagNode name="adv-router">
<properties>
- <help>Show IPv4 OSPF summary database of specified IP address for specified advertised router</help>
+ <help>Show IPv4 OSPF summary database for specified IP address of advertised router</help>
<completionHelp>
<list>&lt;x.x.x.x&gt;</list>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</tagNode>
- <leafNode name="self-originate">
- <properties>
- <help>Show self-originate IPv4 OSPF summary database</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
</children>
- </tagNode>
+ </node>
</children>
</node>
#include <include/ospf/graceful-restart.xml.i>
-<node name="interface">
+<tagNode name="interface">
<properties>
- <help>Show IPv4 OSPF interface information</help>
+ <help>Show information about specific interface</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_interfaces</script>
+ </completionHelp>
</properties>
+ <standalone>
+ <help>Show IPv4 OSPF interface information</help>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </standalone>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
-</node>
-#include <include/vtysh-generic-interface-tagNode.xml.i>
+</tagNode>
<node name="mpls">
<properties>
<help>Show MPLS information</help>
@@ -524,19 +440,19 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Show IPv4 OSPF neighbor information for specified IP address or interface</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ <script>${vyos_completion_dir}/list_interfaces</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </virtualTagNode>
#include <include/frr-detail.xml.i>
</children>
</node>
-<tagNode name="neighbor">
- <properties>
- <help>Show IPv4 OSPF neighbor information for specified IP address or interface</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- <script>${vyos_completion_dir}/list_interfaces</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
-</tagNode>
<node name="route">
<properties>
<help>Show IPv4 OSPF route information</help>
diff --git a/op-mode-definitions/include/ospfv3/border-routers.xml.i b/op-mode-definitions/include/ospfv3/border-routers.xml.i
index e8827a2c4..4abd89e6b 100644
--- a/op-mode-definitions/include/ospfv3/border-routers.xml.i
+++ b/op-mode-definitions/include/ospfv3/border-routers.xml.i
@@ -5,16 +5,16 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Border router ID</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </virtualTagNode>
#include <include/frr-detail.xml.i>
</children>
</node>
-<tagNode name="border-routers">
- <properties>
- <help>Border router ID</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
-</tagNode>
<!-- included end -->
diff --git a/op-mode-definitions/include/ospfv3/database.xml.i b/op-mode-definitions/include/ospfv3/database.xml.i
index fdc45f184..d4e7ab695 100644
--- a/op-mode-definitions/include/ospfv3/database.xml.i
+++ b/op-mode-definitions/include/ospfv3/database.xml.i
@@ -21,7 +21,7 @@
<help>Search by Any Link state Type</help>
</properties>
<children>
- <tagNode name="any">
+ <virtualTagNode>
<properties>
<help>Search by Link state ID</help>
<completionHelp>
@@ -32,31 +32,32 @@
#include <include/frr-detail.xml.i>
#include <include/ospfv3/dump.xml.i>
#include <include/ospfv3/internal.xml.i>
+ #include <include/ospfv3/adv-router-id-node-tag.xml.i>
</children>
- </tagNode>
+ </virtualTagNode>
</children>
</node>
- <tagNode name="any">
- <properties>
- <help>Search by Link state ID</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <command>vtysh -c "show ipv6 ospf6 database * $6"</command>
- <children>
- #include <include/frr-detail.xml.i>
- #include <include/ospfv3/dump.xml.i>
- #include <include/ospfv3/internal.xml.i>
- #include <include/ospfv3/adv-router-id-node-tag.xml.i>
- </children>
- </tagNode>
<node name="as-external">
<properties>
<help>Show AS-External LSAs</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Search by Advertising Router IDs</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt;</list>
+ </completionHelp>
+ </properties>
+ <children>
+ #include <include/frr-detail.xml.i>
+ #include <include/ospfv3/dump.xml.i>
+ #include <include/ospfv3/internal.xml.i>
+ #include <include/ospfv3/self-originated.xml.i>
+ #include <include/ospfv3/adv-router-id-node-tag.xml.i>
+ </children>
+ </virtualTagNode>
#include <include/ospfv3/adv-router.xml.i>
<tagNode name="any">
<properties>
@@ -79,21 +80,6 @@
#include <include/ospfv3/self-originated.xml.i>
</children>
</node>
- <tagNode name="as-external">
- <properties>
- <help>Search by Advertising Router IDs</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt;</list>
- </completionHelp>
- </properties>
- <children>
- #include <include/frr-detail.xml.i>
- #include <include/ospfv3/dump.xml.i>
- #include <include/ospfv3/internal.xml.i>
- #include <include/ospfv3/self-originated.xml.i>
- #include <include/ospfv3/adv-router-id-node-tag.xml.i>
- </children>
- </tagNode>
#include <include/frr-detail.xml.i>
#include <include/ospfv3/internal.xml.i>
#include <include/ospfv3/linkstate-id.xml.i>
@@ -188,7 +174,7 @@
#include <include/ospfv3/self-originated.xml.i>
</children>
</node>
- <node name="node.tag">
+ <virtualTagNode>
<properties>
<help>Show LSAs</help>
</properties>
@@ -202,7 +188,7 @@
#include <include/ospfv3/linkstate-id-node-tag.xml.i>
#include <include/ospfv3/self-originated.xml.i>
</children>
- </node>
+ </virtualTagNode>
<node name="router">
<properties>
<help>Show router LSAs</help>
diff --git a/op-mode-definitions/include/ospfv3/interface.xml.i b/op-mode-definitions/include/ospfv3/interface.xml.i
index 45d5dbd45..a918651cf 100644
--- a/op-mode-definitions/include/ospfv3/interface.xml.i
+++ b/op-mode-definitions/include/ospfv3/interface.xml.i
@@ -5,71 +5,71 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- <node name="prefix">
+ <virtualTagNode>
<properties>
- <help>Show connected prefixes to advertise</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/frr-detail.xml.i>
- </children>
- </node>
- <tagNode name="prefix">
- <properties>
- <help>Show interface prefix route specific information</help>
+ <help>Specific insterface to examine</help>
<completionHelp>
- <list>&lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
+ <script>${vyos_completion_dir}/list_interfaces</script>
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- #include <include/frr-detail.xml.i>
- <node name="match">
+ <node name="prefix">
<properties>
- <help>Matched interface prefix information</help>
+ <help>Show connected prefixes to advertise</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ <virtualTagNode>
+ <properties>
+ <help>Show interface prefix route specific information</help>
+ <completionHelp>
+ <list>&lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/frr-detail.xml.i>
+ <node name="match">
+ <properties>
+ <help>Matched interface prefix information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </node>
+ </children>
+ </virtualTagNode>
+ #include <include/frr-detail.xml.i>
+ </children>
</node>
</children>
- </tagNode>
- </children>
-</node>
-<tagNode name="interface">
- <properties>
- <help>Specific insterface to examine</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_interfaces</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
+ </virtualTagNode>
<node name="prefix">
<properties>
<help>Show connected prefixes to advertise</help>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
- #include <include/frr-detail.xml.i>
- </children>
- </node>
- <tagNode name="prefix">
- <properties>
- <help>Show interface prefix route specific information</help>
- <completionHelp>
- <list>&lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/frr-detail.xml.i>
- <node name="match">
+ <virtualTagNode>
<properties>
- <help>Matched interface prefix information</help>
+ <help>Show interface prefix route specific information</help>
+ <completionHelp>
+ <list>&lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
+ </completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </node>
+ <children>
+ #include <include/frr-detail.xml.i>
+ <node name="match">
+ <properties>
+ <help>Matched interface prefix information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </node>
+ </children>
+ </virtualTagNode>
+ #include <include/frr-detail.xml.i>
</children>
- </tagNode>
+ </node>
</children>
-</tagNode>
+</node>
<!-- included end -->
diff --git a/op-mode-definitions/include/ospfv3/linkstate-id-node-tag.xml.i b/op-mode-definitions/include/ospfv3/linkstate-id-node-tag.xml.i
index 66674e754..b5aed4c0a 100644
--- a/op-mode-definitions/include/ospfv3/linkstate-id-node-tag.xml.i
+++ b/op-mode-definitions/include/ospfv3/linkstate-id-node-tag.xml.i
@@ -1,5 +1,5 @@
<!-- included start from ospfv3/linkstate-id-node-tag.xml.i -->
-<node name="node.tag">
+<virtualTagNode>
<properties>
<help>Search by Link state ID</help>
<completionHelp>
@@ -13,5 +13,5 @@
#include <include/ospfv3/internal.xml.i>
#include <include/ospfv3/self-originated.xml.i>
</children>
-</node>
+</virtualTagNode>
<!-- included end -->
diff --git a/op-mode-definitions/include/ospfv3/linkstate.xml.i b/op-mode-definitions/include/ospfv3/linkstate.xml.i
index 030dc7923..3a08d748f 100644
--- a/op-mode-definitions/include/ospfv3/linkstate.xml.i
+++ b/op-mode-definitions/include/ospfv3/linkstate.xml.i
@@ -13,7 +13,7 @@
</completionHelp>
</properties>
<children>
- <node name="node.tag">
+ <virtualTagNode>
<properties>
<help>Specify Link state ID as IPv4 address notation</help>
<completionHelp>
@@ -21,7 +21,7 @@
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </node>
+ </virtualTagNode>
</children>
</tagNode>
<tagNode name="router">
diff --git a/op-mode-definitions/include/ospfv3/route.xml.i b/op-mode-definitions/include/ospfv3/route.xml.i
index a5b97cd05..0128bac1b 100644
--- a/op-mode-definitions/include/ospfv3/route.xml.i
+++ b/op-mode-definitions/include/ospfv3/route.xml.i
@@ -5,6 +5,32 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified route/prefix information</help>
+ <completionHelp>
+ <list>&lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ <node name="longer">
+ <properties>
+ <help>Show routes longer than specified prefix</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </node>
+ <node name="match">
+ <properties>
+ <help>Show routes matching specified prefix</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/frr-detail.xml.i>
+ </children>
+ </node>
+ </children>
+ </virtualTagNode>
<node name="external-1">
<properties>
<help>Show Type-1 External route information</help>
@@ -50,30 +76,4 @@
</node>
</children>
</node>
-<tagNode name="route">
- <properties>
- <help>Show specified route/prefix information</help>
- <completionHelp>
- <list>&lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <node name="longer">
- <properties>
- <help>Show routes longer than specified prefix</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </node>
- <node name="match">
- <properties>
- <help>Show routes matching specified prefix</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/frr-detail.xml.i>
- </children>
- </node>
- </children>
-</tagNode>
<!-- included end -->
diff --git a/op-mode-definitions/include/show-route-table.xml.i b/op-mode-definitions/include/show-route-table.xml.i
index c3cf82a86..7c0f574c8 100644
--- a/op-mode-definitions/include/show-route-table.xml.i
+++ b/op-mode-definitions/include/show-route-table.xml.i
@@ -1,12 +1,7 @@
<!-- included start from show-route-table.xml.i -->
-<node name="table">
- <properties>
- <help>Table to display</help>
- </properties>
-</node>
<tagNode name="table">
<properties>
- <help>The table number to display</help>
+ <help>Show routes in specific routing table</help>
<completionHelp>
<list>all</list>
<path>protocols static table</path>
diff --git a/op-mode-definitions/include/show-route-tag.xml.i b/op-mode-definitions/include/show-route-tag.xml.i
index 8bfa0ae4e..c7279e82e 100644
--- a/op-mode-definitions/include/show-route-tag.xml.i
+++ b/op-mode-definitions/include/show-route-tag.xml.i
@@ -1,12 +1,7 @@
<!-- included start from show-route-tag.xml.i -->
-<node name="tag">
- <properties>
- <help>Show only routes with tag</help>
- </properties>
-</node>
<tagNode name="tag">
<properties>
- <help>Tag value</help>
+ <help>Show route with given tag</help>
<completionHelp>
<list>&lt;1-4294967295&gt;</list>
</completionHelp>
diff --git a/op-mode-definitions/include/vtysh-generic-interface-virtualTagNode.xml b/op-mode-definitions/include/vtysh-generic-interface-virtualTagNode.xml
new file mode 100644
index 000000000..1dfcfc75e
--- /dev/null
+++ b/op-mode-definitions/include/vtysh-generic-interface-virtualTagNode.xml
@@ -0,0 +1,11 @@
+<!-- included start from vtysh-generic-interface-virtualTagNode.xml.i -->
+<virtualTagNode>
+ <properties>
+ <help>Show information about specific interface</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_interfaces</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+</virtualTagNode>
+<!-- included end -->
diff --git a/op-mode-definitions/ipv4-route.xml.in b/op-mode-definitions/ipv4-route.xml.in
index e4dda2851..41a4b62ba 100644
--- a/op-mode-definitions/ipv4-route.xml.in
+++ b/op-mode-definitions/ipv4-route.xml.in
@@ -63,12 +63,6 @@
<help>Reset IP route</help>
</properties>
<children>
- <leafNode name= "cache">
- <properties>
- <help>Flush the kernel route cache</help>
- </properties>
- <command>ip route flush cache</command>
- </leafNode>
<tagNode name="cache">
<properties>
<help>Flush the kernel route cache for a given route</help>
@@ -76,6 +70,10 @@
<list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Flush the kernel route cache</help>
+ <command>ip route flush cache</command>
+ </standalone>
<command>ip route flush cache "$5"</command>
</tagNode>
</children>
diff --git a/op-mode-definitions/ipv6-route.xml.in b/op-mode-definitions/ipv6-route.xml.in
index 311bc6de6..7ea5a13f6 100644
--- a/op-mode-definitions/ipv6-route.xml.in
+++ b/op-mode-definitions/ipv6-route.xml.in
@@ -83,12 +83,6 @@
<help>Reset IPv6 route</help>
</properties>
<children>
- <leafNode name= "cache">
- <properties>
- <help>Flush the kernel IPv6 route cache</help>
- </properties>
- <command>ip -f inet6 route flush cache</command>
- </leafNode>
<tagNode name="cache">
<properties>
<help>Flush the kernel IPv6 route cache for a given route</help>
@@ -96,6 +90,10 @@
<list>&lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Flush the kernel IPv6 route cache</help>
+ <command>ip -f inet6 route flush cache</command>
+ </standalone>
<command>ip -f inet6 route flush cache "$5"</command>
</tagNode>
</children>
diff --git a/op-mode-definitions/monitor-command.xml.in b/op-mode-definitions/monitor-command.xml.in
index 31c68f029..ba242386e 100644
--- a/op-mode-definitions/monitor-command.xml.in
+++ b/op-mode-definitions/monitor-command.xml.in
@@ -2,26 +2,31 @@
<interfaceDefinition>
<node name="monitor">
<children>
- <tagNode name="command">
+ <node name="command">
<properties>
- <help>Monitor operational mode command (refreshes every 2 seconds)</help>
+ <help>Monitor operational mode command output</help>
</properties>
- <command>watch --no-title ${vyos_op_scripts_dir}/vyos-op-cmd-wrapper.sh ${@:3}</command>
- </tagNode>
- <node name="command">
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Monitor operational mode command (refreshes every 2 seconds)</help>
+ </properties>
+ <command>watch --no-title ${vyos_op_scripts_dir}/vyos-op-cmd-wrapper.sh ${@:3}</command>
+ </virtualTagNode>
<node name="diff">
<properties>
<help>Show differences during each run</help>
</properties>
+ <children>
+ <virtualTagNode>
+ <properties>
+ <help>Monitor operational mode command (refreshes every 2 seconds)</help>
+ </properties>
+ <command>watch --no-title --differences ${vyos_op_scripts_dir}/vyos-op-cmd-wrapper.sh ${@:4}</command>
+ </virtualTagNode>
+ </children>
</node>
- <tagNode name="diff">
- <properties>
- <help>Monitor operational mode command (refreshes every 2 seconds)</help>
- </properties>
- <command>watch --no-title --differences ${vyos_op_scripts_dir}/vyos-op-cmd-wrapper.sh ${@:4}</command>
- </tagNode>
- </children>
+ </children>
</node>
</children>
</node>
diff --git a/op-mode-definitions/monitor-protocol.xml.in b/op-mode-definitions/monitor-protocol.xml.in
index f05a1945f..fec30c8a5 100644
--- a/op-mode-definitions/monitor-protocol.xml.in
+++ b/op-mode-definitions/monitor-protocol.xml.in
@@ -35,12 +35,6 @@
</properties>
<command>vtysh -c "no debug bgp ${@:5}"</command>
</node>
- <node name="bestpath">
- <properties>
- <help>Disable BGP allow best path debugging</help>
- </properties>
- <command>vtysh -c "no debug bgp ${@:5}"</command>
- </node>
<tagNode name="bestpath">
<properties>
<help>Disable BGP bestpath IPv4 IPv6</help>
@@ -48,6 +42,10 @@
<list>&lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h/h&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Disable BGP allow best path debugging</help>
+ <command>vtysh -c "no debug bgp ${@:5}"</command>
+ </standalone>
<command>vtysh -c "no debug bgp ${@:5}"</command>
</tagNode>
<node name="flowspec">
@@ -155,12 +153,6 @@
</properties>
<command>vtysh -c "debug bgp ${@:5}"</command>
</node>
- <node name="bestpath">
- <properties>
- <help>Enable BGP allow best path debugging</help>
- </properties>
- <command>vtysh -c "debug bgp ${@:5}"</command>
- </node>
<tagNode name="bestpath">
<properties>
<help>Debug bestpath IPv4 IPv6</help>
@@ -168,6 +160,10 @@
<list>&lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h/h&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Enable BGP allow best path debugging</help>
+ <command>vtysh -c "debug bgp ${@:5}"</command>
+ </standalone>
<command>vtysh -c "debug bgp ${@:5}"</command>
</tagNode>
<node name="flowspec">
diff --git a/op-mode-definitions/mtr.xml.in b/op-mode-definitions/mtr.xml.in
index 66729e2bc..ac146d520 100644
--- a/op-mode-definitions/mtr.xml.in
+++ b/op-mode-definitions/mtr.xml.in
@@ -11,7 +11,7 @@
</properties>
<command>${vyos_op_scripts_dir}/mtr.py ${@:3}</command>
<children>
- <leafNode name="node.tag">
+ <virtualTagNode>
<properties>
<help>Traceroute options</help>
<completionHelp>
@@ -19,7 +19,7 @@
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/mtr.py ${@:3}</command>
- </leafNode>
+ </virtualTagNode>
</children>
</tagNode>
</children>
@@ -33,7 +33,7 @@
</properties>
<command>${vyos_op_scripts_dir}/mtr.py ${@:2}</command>
<children>
- <leafNode name="node.tag">
+ <virtualTagNode>
<properties>
<help>mtr options</help>
<completionHelp>
@@ -41,7 +41,7 @@
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/mtr.py ${@:2}</command>
- </leafNode>
+ </virtualTagNode>
</children>
</tagNode>
</interfaceDefinition>
diff --git a/op-mode-definitions/openvpn.xml.in b/op-mode-definitions/openvpn.xml.in
index 63834a127..692eef836 100644
--- a/op-mode-definitions/openvpn.xml.in
+++ b/op-mode-definitions/openvpn.xml.in
@@ -39,91 +39,84 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-type=openvpn</command>
<children>
+ <leafNode name="client">
+ <properties>
+ <help>Show tunnel status for OpenVPN client interfaces</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/openvpn.py show --mode client</command>
+ </leafNode>
+ <leafNode name="server">
+ <properties>
+ <help>Show tunnel status for OpenVPN server interfaces</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/openvpn.py show --mode server</command>
+ </leafNode>
+ <leafNode name="site-to-site">
+ <properties>
+ <help>Show tunnel status for OpenVPN site-to-site interfaces</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/openvpn.py show --mode site_to_site</command>
+ </leafNode>
<leafNode name="detail">
<properties>
<help>Show detailed OpenVPN interface information</help>
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=openvpn</command>
</leafNode>
- </children>
- </node>
- <tagNode name="openvpn">
- <properties>
- <help>Show OpenVPN interface information</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_interfaces --type openvpn</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name=$4</command>
- <children>
- <tagNode name="user">
+ <virtualTagNode>
<properties>
- <help>Show OpenVPN interface users</help>
+ <help>Show OpenVPN interface information</help>
<completionHelp>
- <script>${vyos_completion_dir}/list_openvpn_users.py --interface ${COMP_WORDS[3]}</script>
+ <script>${vyos_completion_dir}/list_interfaces --type openvpn</script>
</completionHelp>
</properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name=$4</command>
<children>
- <node name="mfa">
+ <tagNode name="user">
<properties>
- <help>Show multi-factor authentication information</help>
+ <help>Show OpenVPN interface users</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_openvpn_users.py --interface ${COMP_WORDS[3]}</script>
+ </completionHelp>
</properties>
<children>
- <leafNode name="secret">
+ <node name="mfa">
<properties>
- <help>Show multi-factor authentication secret</help>
+ <help>Show multi-factor authentication information</help>
</properties>
- <command>${vyos_op_scripts_dir}/show_openvpn_mfa.py --user="$6" --intf="$4" --action=secret</command>
- </leafNode>
- <leafNode name="uri">
- <properties>
- <help>Show multi-factor authentication otpauth uri</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show_openvpn_mfa.py --user="$6" --intf="$4" --action=uri</command>
- </leafNode>
- <leafNode name="qrcode">
- <properties>
- <help>Show multi-factor authentication QR code</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show_openvpn_mfa.py --user="$6" --intf="$4" --action=qrcode</command>
- </leafNode>
+ <children>
+ <leafNode name="secret">
+ <properties>
+ <help>Show multi-factor authentication secret</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_openvpn_mfa.py --user="$6" --intf="$4" --action=secret</command>
+ </leafNode>
+ <leafNode name="uri">
+ <properties>
+ <help>Show multi-factor authentication otpauth uri</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_openvpn_mfa.py --user="$6" --intf="$4" --action=uri</command>
+ </leafNode>
+ <leafNode name="qrcode">
+ <properties>
+ <help>Show multi-factor authentication QR code</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_openvpn_mfa.py --user="$6" --intf="$4" --action=qrcode</command>
+ </leafNode>
+ </children>
+ </node>
</children>
- </node>
+ </tagNode>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of specified OpenVPN interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4"</command>
+ </leafNode>
</children>
- </tagNode>
- <leafNode name="brief">
- <properties>
- <help>Show summary of specified OpenVPN interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4"</command>
- </leafNode>
+ </virtualTagNode>
</children>
- </tagNode>
- </children>
- </node>
- <node name="openvpn">
- <properties>
- <help>Show OpenVPN information</help>
- </properties>
- <children>
- <leafNode name="client">
- <properties>
- <help>Show tunnel status for OpenVPN client interfaces</help>
- </properties>
- <command>${vyos_op_scripts_dir}/openvpn.py show --mode client</command>
- </leafNode>
- <leafNode name="server">
- <properties>
- <help>Show tunnel status for OpenVPN server interfaces</help>
- </properties>
- <command>${vyos_op_scripts_dir}/openvpn.py show --mode server</command>
- </leafNode>
- <leafNode name="site-to-site">
- <properties>
- <help>Show tunnel status for OpenVPN site-to-site interfaces</help>
- </properties>
- <command>${vyos_op_scripts_dir}/openvpn.py show --mode site_to_site</command>
- </leafNode>
+ </node>
</children>
</node>
</children>
diff --git a/op-mode-definitions/ping.xml.in b/op-mode-definitions/ping.xml.in
index 4c25a59ab..fd50398ba 100644
--- a/op-mode-definitions/ping.xml.in
+++ b/op-mode-definitions/ping.xml.in
@@ -9,7 +9,7 @@
</properties>
<command>${vyos_op_scripts_dir}/ping.py ${@:2}</command>
<children>
- <leafNode name="node.tag">
+ <virtualTagNode>
<properties>
<help>Ping options</help>
<completionHelp>
@@ -17,7 +17,7 @@
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/ping.py ${@:2}</command>
- </leafNode>
+ </virtualTagNode>
</children>
</tagNode>
</interfaceDefinition>
diff --git a/op-mode-definitions/pki.xml.in b/op-mode-definitions/pki.xml.in
index 43fb1fe2b..29b08dacb 100644
--- a/op-mode-definitions/pki.xml.in
+++ b/op-mode-definitions/pki.xml.in
@@ -492,12 +492,6 @@
</properties>
<command>${vyos_op_scripts_dir}/pki.py show_all</command>
<children>
- <leafNode name="ca">
- <properties>
- <help>Show x509 CA certificates</help>
- </properties>
- <command>${vyos_op_scripts_dir}/pki.py show_certificate_authority</command>
- </leafNode>
<tagNode name="ca">
<properties>
<help>Show x509 CA certificate by name</help>
@@ -505,6 +499,10 @@
<path>pki ca</path>
</completionHelp>
</properties>
+ <standalone>
+ <help>Show x509 CA certificates</help>
+ <command>${vyos_op_scripts_dir}/pki.py show_certificate_authority</command>
+ </standalone>
<command>${vyos_op_scripts_dir}/pki.py show_certificate_authority --name "$4"</command>
<children>
<leafNode name="pem">
@@ -515,12 +513,6 @@
</leafNode>
</children>
</tagNode>
- <leafNode name="certificate">
- <properties>
- <help>Show x509 certificates</help>
- </properties>
- <command>${vyos_op_scripts_dir}/pki.py show_certificate</command>
- </leafNode>
<tagNode name="certificate">
<properties>
<help>Show x509 certificate by name</help>
@@ -528,6 +520,10 @@
<path>pki certificate</path>
</completionHelp>
</properties>
+ <standalone>
+ <help>Show x509 certificates</help>
+ <command>${vyos_op_scripts_dir}/pki.py show_certificate</command>
+ </standalone>
<command>${vyos_op_scripts_dir}/pki.py show_certificate --name "$4"</command>
<children>
<leafNode name="pem">
@@ -547,12 +543,6 @@
</tagNode>
</children>
</tagNode>
- <leafNode name="crl">
- <properties>
- <help>Show x509 certificate revocation lists</help>
- </properties>
- <command>${vyos_op_scripts_dir}/pki.py show_crl</command>
- </leafNode>
<tagNode name="crl">
<properties>
<help>Show x509 certificate revocation lists by CA name</help>
@@ -560,6 +550,10 @@
<path>pki ca</path>
</completionHelp>
</properties>
+ <standalone>
+ <help>Show x509 certificate revocation lists</help>
+ <command>${vyos_op_scripts_dir}/pki.py show_crl</command>
+ </standalone>
<command>${vyos_op_scripts_dir}/pki.py show_crl --name "$4"</command>
<children>
<leafNode name="pem">
@@ -576,12 +570,20 @@
</node>
<node name="renew">
<children>
- <leafNode name="certbot">
+ <node name="certbot">
<properties>
- <help>Start manual certbot renewal</help>
+ <help>Manual certbot renewal</help>
</properties>
- <command>systemctl start certbot.service</command>
- </leafNode>
+ <command>${vyos_op_scripts_dir}/pki.py renew_certbot</command>
+ <children>
+ <leafNode name="force">
+ <properties>
+ <help>Force manual certbot renewal</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/pki.py renew_certbot --force</command>
+ </leafNode>
+ </children>
+ </node>
</children>
</node>
</interfaceDefinition>
diff --git a/op-mode-definitions/reset-bgp.xml.in b/op-mode-definitions/reset-bgp.xml.in
index a1d42d4a3..3d73fd417 100644
--- a/op-mode-definitions/reset-bgp.xml.in
+++ b/op-mode-definitions/reset-bgp.xml.in
@@ -7,6 +7,18 @@
<help>Border Gateway Protocol (BGP) information</help>
</properties>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>BGP IPv4/IPv6 neighbor to clear</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_bgp_neighbors.sh --both</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/bgp/reset-bgp-neighbor-options.xml.i>
+ </children>
+ </virtualTagNode>
<leafNode name="all">
<properties>
<help>Clear all peers</help>
@@ -37,20 +49,20 @@
</leafNode>
#include <include/bgp/reset-bgp-afi-common.xml.i>
#include <include/bgp/reset-bgp-peer-group.xml.i>
+ <virtualTagNode>
+ <properties>
+ <help>IPv4 neighbor to clear</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_bgp_neighbors.sh --ipv4</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/bgp/reset-bgp-neighbor-options.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
- <tagNode name="ipv4">
- <properties>
- <help>IPv4 neighbor to clear</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_bgp_neighbors.sh --ipv4</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/bgp/reset-bgp-neighbor-options.xml.i>
- </children>
- </tagNode>
<node name="ipv6">
<properties>
<help>IPv6 Address Family</help>
@@ -64,20 +76,20 @@
</leafNode>
#include <include/bgp/reset-bgp-afi-common.xml.i>
#include <include/bgp/reset-bgp-peer-group.xml.i>
+ <virtualTagNode>
+ <properties>
+ <help>IPv6 neighbor to clear</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_bgp_neighbors.sh --ipv6</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/bgp/reset-bgp-neighbor-options.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
- <tagNode name="ipv6">
- <properties>
- <help>IPv6 neighbor to clear</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_bgp_neighbors.sh --ipv6</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/bgp/reset-bgp-neighbor-options.xml.i>
- </children>
- </tagNode>
<node name="l2vpn">
<properties>
<help>Layer 2 Virtual Private Network Address Family</help>
@@ -96,20 +108,20 @@
</leafNode>
#include <include/bgp/reset-bgp-afi-common.xml.i>
#include <include/bgp/reset-bgp-peer-group.xml.i>
+ <virtualTagNode>
+ <properties>
+ <help>BGP IPv4/IPv6 neighbor to clear</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_bgp_neighbors.sh --both</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/bgp/reset-bgp-neighbor-options.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
- <tagNode name="evpn">
- <properties>
- <help>BGP IPv4/IPv6 neighbor to clear</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_bgp_neighbors.sh --both</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/bgp/reset-bgp-neighbor-options.xml.i>
- </children>
- </tagNode>
</children>
</node>
<tagNode name="vrf">
@@ -120,7 +132,7 @@
</completionHelp>
</properties>
<children>
- <node name="node.tag">
+ <virtualTagNode>
<properties>
<help>IPv4/IPv6 neighbor to clear</help>
<completionHelp>
@@ -131,7 +143,7 @@
<children>
#include <include/bgp/reset-bgp-neighbor-options.xml.i>
</children>
- </node>
+ </virtualTagNode>
<leafNode name="all">
<properties>
<help>Clear all peers</help>
@@ -162,20 +174,20 @@
</leafNode>
#include <include/bgp/reset-bgp-afi-common.xml.i>
#include <include/bgp/reset-bgp-peer-group-vrf.xml.i>
+ <virtualTagNode>
+ <properties>
+ <help>IPv4 neighbor to clear</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_bgp_neighbors.sh --ipv4 --vrf ${COMP_WORDS[3]}</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/bgp/reset-bgp-neighbor-options.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
- <tagNode name="ipv4">
- <properties>
- <help>IPv4 neighbor to clear</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_bgp_neighbors.sh --ipv4 --vrf ${COMP_WORDS[3]}</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/bgp/reset-bgp-neighbor-options.xml.i>
- </children>
- </tagNode>
<node name="ipv6">
<properties>
<help>IPv6 Address Family</help>
@@ -189,20 +201,20 @@
</leafNode>
#include <include/bgp/reset-bgp-afi-common.xml.i>
#include <include/bgp/reset-bgp-peer-group-vrf.xml.i>
+ <virtualTagNode>
+ <properties>
+ <help>IPv6 neighbor to clear</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_bgp_neighbors.sh --ipv6 --vrf ${COMP_WORDS[3]}</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/bgp/reset-bgp-neighbor-options.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
- <tagNode name="ipv6">
- <properties>
- <help>IPv6 neighbor to clear</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_bgp_neighbors.sh --ipv6 --vrf ${COMP_WORDS[3]}</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/bgp/reset-bgp-neighbor-options.xml.i>
- </children>
- </tagNode>
<node name="l2vpn">
<properties>
<help>Layer 2 Virtual Private Network Address Family</help>
@@ -221,38 +233,26 @@
</leafNode>
#include <include/bgp/reset-bgp-afi-common.xml.i>
#include <include/bgp/reset-bgp-peer-group-vrf.xml.i>
+ <virtualTagNode>
+ <properties>
+ <help>BGP IPv4/IPv6 neighbor to clear</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_bgp_neighbors.sh --both --vrf ${COMP_WORDS[3]}</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/bgp/reset-bgp-neighbor-options.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
- <tagNode name="evpn">
- <properties>
- <help>BGP IPv4/IPv6 neighbor to clear</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_bgp_neighbors.sh --both --vrf ${COMP_WORDS[3]}</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/bgp/reset-bgp-neighbor-options.xml.i>
- </children>
- </tagNode>
</children>
</node>
</children>
</tagNode>
</children>
</node>
- <tagNode name="bgp">
- <properties>
- <help>BGP IPv4/IPv6 neighbor to clear</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_bgp_neighbors.sh --both</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/bgp/reset-bgp-neighbor-options.xml.i>
- </children>
- </tagNode>
</children>
</node>
</interfaceDefinition>
diff --git a/op-mode-definitions/reset-ip-bgp.xml.in b/op-mode-definitions/reset-ip-bgp.xml.in
index 34a4503d9..9201865dc 100644
--- a/op-mode-definitions/reset-ip-bgp.xml.in
+++ b/op-mode-definitions/reset-ip-bgp.xml.in
@@ -9,28 +9,38 @@
<help>Border Gateway Protocol (BGP) information</help>
</properties>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>BGP IPv4/IPv6 neighbor to clear</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_bgp_neighbors.sh --ipv4</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ #include <include/bgp/reset-bgp-neighbor-options.xml.i>
+ </children>
+ </virtualTagNode>
<leafNode name="all">
<properties>
<help>Clear all BGP peering sessions</help>
</properties>
<command>vtysh -c "clear bgp ipv4 *"</command>
</leafNode>
- <node name="dampening">
- <properties>
- <help>Clear BGP route flap dampening information</help>
- </properties>
- <command>vtysh -c "clear ip bgp dampening"</command>
- </node>
<tagNode name="dampening">
<properties>
- <help>Clear BGP route flap dampening information for given host|network address</help>
+ <help>Clear BGP route flap dampening information for given host ornetwork address</help>
<completionHelp>
<list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Clear BGP route flap dampening information</help>
+ <command>vtysh -c "clear ip bgp dampening"</command>
+ </standalone>
<command>vtysh -c "clear ip bgp dampening $5"</command>
<children>
- <leafNode name="node.tag">
+ <virtualTagNode>
<properties>
<help>Clear BGP route flap dampening information for given network address</help>
<completionHelp>
@@ -38,7 +48,7 @@
</completionHelp>
</properties>
<command>vtysh -c "clear ip bgp dampening $5 $6"</command>
- </leafNode>
+ </virtualTagNode>
</children>
</tagNode>
#include <include/bgp/reset-bgp-afi-common.xml.i>
@@ -57,7 +67,7 @@
</properties>
<command>vtysh -c "clear bgp vrf $5 *"</command>
</leafNode>
- <leafNode name="node.tag">
+ <virtualTagNode>
<properties>
<help>Clear BGP neighbor IP address</help>
<completionHelp>
@@ -65,24 +75,12 @@
</completionHelp>
</properties>
<command>vtysh -c "clear bgp vrf $5 $6"</command>
- </leafNode>
+ </virtualTagNode>
</children>
</tagNode>
</children>
</node>
- <tagNode name="bgp">
- <properties>
- <help>BGP IPv4/IPv6 neighbor to clear</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_bgp_neighbors.sh --ipv4</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- #include <include/bgp/reset-bgp-neighbor-options.xml.i>
- </children>
- </tagNode>
- </children>
+ </children>
</node>
</children>
</node>
diff --git a/op-mode-definitions/show-bridge.xml.in b/op-mode-definitions/show-bridge.xml.in
index 47c3d2e6e..c9558c315 100644
--- a/op-mode-definitions/show-bridge.xml.in
+++ b/op-mode-definitions/show-bridge.xml.in
@@ -6,7 +6,57 @@
<properties>
<help>Show bridging information</help>
</properties>
+ <command>${vyos_op_scripts_dir}/bridge.py show</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Show bridge information for a given bridge interface</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_interfaces --type bridge</script>
+ </completionHelp>
+ </properties>
+ <command>bridge -c link show | grep "master $3"</command>
+ <children>
+ <node name="spanning-tree">
+ <properties>
+ <help>View Spanning Tree info for specified bridges</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/stp.py show_stp --ifname=$3</command>
+ <children>
+ <leafNode name="detail">
+ <properties>
+ <help>Show detailed Spanning Tree info for specified bridge</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/stp.py show_stp --ifname=$3 --detail</command>
+ </leafNode>
+ </children>
+ </node>
+ <leafNode name="mdb">
+ <properties>
+ <help>Displays the multicast group database for the bridge</help>
+ </properties>
+ <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>${vyos_op_scripts_dir}/bridge.py show_fdb --interface=$3</command>
+ </leafNode>
+ <leafNode name="detail">
+ <properties>
+ <help>Display bridge interface details</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/bridge.py show_detail --interface=$3</command>
+ </leafNode>
+ <leafNode name="nexthop-group">
+ <properties>
+ <help>Display bridge interface nexthop-group</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/bridge.py show_detail --nexthop-group --interface=$3</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<node name="spanning-tree">
<properties>
<help>View Spanning Tree info for all bridges</help>
@@ -43,59 +93,6 @@
</leafNode>
</children>
</node>
- <tagNode name="bridge">
- <properties>
- <help>Show bridge information for a given bridge interface</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_interfaces --type bridge</script>
- </completionHelp>
- </properties>
- <command>bridge -c link show | grep "master $3"</command>
- <standalone>
- <help>Show bridge interface information</help>
- <command>${vyos_op_scripts_dir}/bridge.py show</command>
- </standalone>
- <children>
- <node name="spanning-tree">
- <properties>
- <help>View Spanning Tree info for specified bridges</help>
- </properties>
- <command>${vyos_op_scripts_dir}/stp.py show_stp --ifname=$3</command>
- <children>
- <leafNode name="detail">
- <properties>
- <help>Show detailed Spanning Tree info for specified bridge</help>
- </properties>
- <command>${vyos_op_scripts_dir}/stp.py show_stp --ifname=$3 --detail</command>
- </leafNode>
- </children>
- </node>
- <leafNode name="mdb">
- <properties>
- <help>Displays the multicast group database for the bridge</help>
- </properties>
- <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>${vyos_op_scripts_dir}/bridge.py show_fdb --interface=$3</command>
- </leafNode>
- <leafNode name="detail">
- <properties>
- <help>Display bridge interface details</help>
- </properties>
- <command>${vyos_op_scripts_dir}/bridge.py show_detail --interface=$3</command>
- </leafNode>
- <leafNode name="nexthop-group">
- <properties>
- <help>Display bridge interface nexthop-group</help>
- </properties>
- <command>${vyos_op_scripts_dir}/bridge.py show_detail --nexthop-group --interface=$3</command>
- </leafNode>
- </children>
- </tagNode>
</children>
</node>
</interfaceDefinition>
diff --git a/op-mode-definitions/show-evpn.xml.in b/op-mode-definitions/show-evpn.xml.in
index 3c1e5c7d6..885e0e615 100644
--- a/op-mode-definitions/show-evpn.xml.in
+++ b/op-mode-definitions/show-evpn.xml.in
@@ -11,30 +11,30 @@
<properties>
<help>Access VLANs</help>
</properties>
- <children>
- #include <include/frr-detail.xml.i>
- </children>
- <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
- </node>
- <tagNode name="access-vlan">
- <properties>
- <help>Access VLANs interface name</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_interfaces --bridgeable --no-vlan-subinterfaces</script>
- </completionHelp>
- </properties>
- <children>
- <node name="node.tag">
+ <children>
+ <virtualTagNode>
<properties>
- <help>VLAN ID</help>
+ <help>Access VLANs interface name</help>
<completionHelp>
- <list>&lt;1-4094&gt;</list>
+ <script>${vyos_completion_dir}/list_interfaces --bridgeable --no-vlan-subinterfaces</script>
</completionHelp>
</properties>
- <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
- </node>
+ <children>
+ <virtualTagNode>
+ <properties>
+ <help>VLAN ID</help>
+ <completionHelp>
+ <list>&lt;1-4094&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+ </virtualTagNode>
+ </children>
+ </virtualTagNode>
+ #include <include/frr-detail.xml.i>
</children>
- </tagNode>
+ <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+ </node>
<node name="arp-cache">
<properties>
<help>ARP and ND cache</help>
@@ -43,22 +43,22 @@
#include <include/vni-tagnode-all.xml.i>
</children>
</node>
- <tagNode name="es">
- <properties>
- <help>Show ESI information for specified ESI</help>
- <completionHelp>
- <list>&lt;esi&gt;</list>
- <script>${vyos_completion_dir}/list_esi.sh</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
- </tagNode>
<node name="es">
<properties>
<help>Show ESI information</help>
</properties>
<command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Show ESI information for specified ESI</help>
+ <completionHelp>
+ <list>&lt;esi&gt;</list>
+ <script>${vyos_completion_dir}/list_esi.sh</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+ </virtualTagNode>
<leafNode name="detail">
<properties>
<help>Show ESI details</help>
@@ -106,13 +106,22 @@
#include <include/vni-tagnode-all.xml.i>
</children>
</node>
- #include <include/vni-tagnode.xml.i>
<node name="vni">
<properties>
<help>Show VNI information</help>
</properties>
<command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
- <children>
+ <children>
+ <virtualTagNode>
+ <properties>
+ <help>VXLAN network identifier (VNI) number</help>
+ <completionHelp>
+ <list>&lt;1-16777215&gt;</list>
+ <script>${vyos_completion_dir}/list_vni.sh</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+ </virtualTagNode>
<leafNode name="detail">
<properties>
<help>Show VNI details</help>
diff --git a/op-mode-definitions/show-history.xml.in b/op-mode-definitions/show-history.xml.in
index 7fb286264..1781fa267 100644
--- a/op-mode-definitions/show-history.xml.in
+++ b/op-mode-definitions/show-history.xml.in
@@ -14,18 +14,17 @@
</properties>
<command>HISTTIMEFORMAT='%FT%T%z ' HISTFILE="$HOME/.bash_history" \set -o history; history 20</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show last N commands in history</help>
+ <completionHelp>
+ <list>&lt;NUMBER&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>HISTTIMEFORMAT='%FT%T%z ' HISTFILE="$HOME/.bash_history" \set -o history; history $3</command>
+ </virtualTagNode>
</children>
</node>
-
- <tagNode name="history">
- <properties>
- <help>Show last N commands in history</help>
- <completionHelp>
- <list>&lt;NUMBER&gt;</list>
- </completionHelp>
- </properties>
- <command>HISTTIMEFORMAT='%FT%T%z ' HISTFILE="$HOME/.bash_history" \set -o history; history $3</command>
- </tagNode>
- </children>
+ </children>
</node>
</interfaceDefinition>
diff --git a/op-mode-definitions/show-interfaces-bonding.xml.in b/op-mode-definitions/show-interfaces-bonding.xml.in
index 839a4cd91..58f754ad6 100644
--- a/op-mode-definitions/show-interfaces-bonding.xml.in
+++ b/op-mode-definitions/show-interfaces-bonding.xml.in
@@ -4,26 +4,17 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="bonding">
+ <node name="bonding">
<properties>
- <help>Show specified Bonding interface information</help>
- <completionHelp>
- <path>interfaces bonding</path>
- </completionHelp>
+ <help>Show specified bonding interface information</help>
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=bonding</command>
<children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified bonding interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=bonding</command>
- </leafNode>
<leafNode name="detail">
<properties>
- <help>Show detailed interface information</help>
+ <help>Show detailed bonding interface information</help>
</properties>
- <command>${vyos_op_scripts_dir}/show_bonding_detail.sh "$4"</command>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=bonding</command>
</leafNode>
<node name="lacp">
<properties>
@@ -34,13 +25,7 @@
<properties>
<help>Show LACP details</help>
</properties>
- <command>${vyos_op_scripts_dir}/bonding.py show_lacp_detail --interface="$4" </command>
- </leafNode>
- <leafNode name="neighbors">
- <properties>
- <help>Show LACP Neighbors</help>
- </properties>
- <command>${vyos_op_scripts_dir}/bonding.py show_lacp_neighbors --interface="$4"</command>
+ <command>${vyos_op_scripts_dir}/bonding.py show_lacp_detail</command>
</leafNode>
</children>
</node>
@@ -48,59 +33,73 @@
<properties>
<help>Show specified bonding interface information</help>
</properties>
- <command>${vyos_op_scripts_dir}/show-bond.py --interface "$4"</command>
+ <command>${vyos_op_scripts_dir}/show-bond.py --slaves</command>
</leafNode>
- <tagNode name="vif">
+ <virtualTagNode>
<properties>
- <help>Show specified virtual network interface (vif) information</help>
<completionHelp>
- <path>interfaces bonding ${COMP_WORDS[3]} vif</path>
+ <path>interfaces bonding</path>
</completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4.$6" --intf-type=bonding</command>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=bonding</command>
<children>
<leafNode name="brief">
<properties>
- <help>Show summary of specified virtual network interface (vif) information</help>
+ <help>Show summary of the specified bonding interface information</help>
</properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4.$6" --intf-type=bonding</command>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=bonding</command>
</leafNode>
- </children>
- </tagNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="bonding">
- <properties>
- <help>Show Bonding interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-type=bonding</command>
- <children>
- <leafNode name="detail">
- <properties>
- <help>Show detailed bonding interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=bonding</command>
- </leafNode>
- <node name="lacp">
- <properties>
- <help>Show LACP related info</help>
- </properties>
- <children>
<leafNode name="detail">
<properties>
- <help>Show LACP details</help>
+ <help>Show detailed interface information</help>
</properties>
- <command>${vyos_op_scripts_dir}/bonding.py show_lacp_detail</command>
+ <command>${vyos_op_scripts_dir}/show_bonding_detail.sh "$4"</command>
+ </leafNode>
+ <node name="lacp">
+ <properties>
+ <help>Show LACP related info</help>
+ </properties>
+ <children>
+ <leafNode name="detail">
+ <properties>
+ <help>Show LACP details</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/bonding.py show_lacp_detail --interface="$4" </command>
+ </leafNode>
+ <leafNode name="neighbors">
+ <properties>
+ <help>Show LACP Neighbors</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/bonding.py show_lacp_neighbors --interface="$4"</command>
+ </leafNode>
+ </children>
+ </node>
+ <leafNode name="slaves">
+ <properties>
+ <help>Show specified bonding interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show-bond.py --interface "$4"</command>
</leafNode>
+ <tagNode name="vif">
+ <properties>
+ <help>Show specified virtual network interface (vif) information</help>
+ <completionHelp>
+ <path>interfaces bonding ${COMP_WORDS[3]} vif</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4.$6" --intf-type=bonding</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of specified virtual network interface (vif) information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4.$6" --intf-type=bonding</command>
+ </leafNode>
+ </children>
+ </tagNode>
+ #include <include/show-interface-type-event-log.xml.i>
</children>
- </node>
- <leafNode name="slaves">
- <properties>
- <help>Show specified bonding interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show-bond.py --slaves</command>
- </leafNode>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-bridge.xml.in b/op-mode-definitions/show-interfaces-bridge.xml.in
index 998dacd38..f79b7bd7f 100644
--- a/op-mode-definitions/show-interfaces-bridge.xml.in
+++ b/op-mode-definitions/show-interfaces-bridge.xml.in
@@ -4,27 +4,9 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="bridge">
+ <node name="bridge">
<properties>
- <help>Show specified Bridge interface information</help>
- <completionHelp>
- <path>interfaces bridge</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=bridge</command>
- <children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified bridge interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=bridge</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="bridge">
- <properties>
- <help>Show Bridge interface information</help>
+ <help>Show bridge interface information</help>
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-type=bridge</command>
<children>
@@ -34,6 +16,24 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=bridge</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified bridge interface information</help>
+ <completionHelp>
+ <path>interfaces bridge</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=bridge</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of the specified bridge interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=bridge</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-dummy.xml.in b/op-mode-definitions/show-interfaces-dummy.xml.in
index 18f21e97e..fdffeb96b 100644
--- a/op-mode-definitions/show-interfaces-dummy.xml.in
+++ b/op-mode-definitions/show-interfaces-dummy.xml.in
@@ -4,27 +4,9 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="dummy">
+ <node name="dummy">
<properties>
- <help>Show specified Dummy interface information</help>
- <completionHelp>
- <path>interfaces dummy</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=dummy</command>
- <children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified dummy interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=dummy</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="dummy">
- <properties>
- <help>Show Dummy interface information</help>
+ <help>Show dummy interface information</help>
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-type=dummy</command>
<children>
@@ -34,6 +16,24 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=dummy</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified dummy interface information</help>
+ <completionHelp>
+ <path>interfaces dummy</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=dummy</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of the specified dummy interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=dummy</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-ethernet.xml.in b/op-mode-definitions/show-interfaces-ethernet.xml.in
index 8a23455bf..c6e9a2ec2 100644
--- a/op-mode-definitions/show-interfaces-ethernet.xml.in
+++ b/op-mode-definitions/show-interfaces-ethernet.xml.in
@@ -4,85 +4,84 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="ethernet">
+ <node name="ethernet">
<properties>
<help>Show specified Ethernet interface information</help>
- <completionHelp>
- <path>interfaces ethernet</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=ethernet</command>
- <children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified ethernet interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=ethernet</command>
- </leafNode>
- <leafNode name="identify">
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-type=ethernet</command>
+ <children>
+ <leafNode name="detail">
<properties>
- <help>Visually identify specified ethernet interface</help>
+ <help>Show detailed ethernet interface information</help>
</properties>
- <command>echo "Blinking interface $4 for 30 seconds."; ethtool --identify "$4" 30</command>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=ethernet</command>
</leafNode>
- <node name="physical">
- <properties>
- <help>Show physical device information for specified ethernet interface</help>
- </properties>
- <command>ethtool "$4"; ethtool --show-ring "$4"; ethtool --driver "$4"</command>
+ <virtualTagNode>
+ <properties>
+ <completionHelp>
+ <path>interfaces ethernet</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=ethernet</command>
<children>
- <leafNode name="offload">
+ <leafNode name="brief">
<properties>
- <help>Show physical device offloading capabilities</help>
+ <help>Show summary of the specified ethernet interface information</help>
</properties>
- <command>ethtool --show-features "$4" | sed -e 1d -e '/fixed/d' -e 's/^\t*//g' -e 's/://' | column -t -s' '</command>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=ethernet</command>
</leafNode>
- </children>
- </node>
- <leafNode name="statistics">
- <properties>
- <help>Show physical device statistics for specified ethernet interface</help>
- </properties>
- <command>ethtool --statistics "$4"</command>
- </leafNode>
- <leafNode name="transceiver">
- <properties>
- <help>Show transceiver information from modules (e.g SFP+, QSFP)</help>
- </properties>
- <command>ethtool --module-info "$4"</command>
- </leafNode>
- <tagNode name="vif">
- <properties>
- <help>Show specified virtual network interface (vif) information</help>
- <completionHelp>
- <path>interfaces ethernet ${COMP_WORDS[3]} vif</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4.$6" --intf-type=ethernet</command>
- <children>
- <leafNode name="brief">
+ <leafNode name="identify">
<properties>
- <help>Show summary of specified virtual network interface (vif) information</help>
+ <help>Visually identify specified ethernet interface</help>
</properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4.$6" --intf-type=ethernet</command>
+ <command>echo "Blinking interface $4 for 30 seconds."; ethtool --identify "$4" 30</command>
</leafNode>
+ <node name="physical">
+ <properties>
+ <help>Show physical device information for specified ethernet interface</help>
+ </properties>
+ <command>ethtool "$4"; ethtool --show-ring "$4"; ethtool --driver "$4"</command>
+ <children>
+ <leafNode name="offload">
+ <properties>
+ <help>Show physical device offloading capabilities</help>
+ </properties>
+ <command>ethtool --show-features "$4" | sed -e 1d -e '/fixed/d' -e 's/^\t*//g' -e 's/://' | column -t -s' '</command>
+ </leafNode>
+ </children>
+ </node>
+ <leafNode name="statistics">
+ <properties>
+ <help>Show physical device statistics for specified ethernet interface</help>
+ </properties>
+ <command>ethtool --statistics "$4"</command>
+ </leafNode>
+ <leafNode name="transceiver">
+ <properties>
+ <help>Show transceiver information from modules (e.g SFP+, QSFP)</help>
+ </properties>
+ <command>ethtool --module-info "$4"</command>
+ </leafNode>
+ <tagNode name="vif">
+ <properties>
+ <help>Show specified virtual network interface (vif) information</help>
+ <completionHelp>
+ <path>interfaces ethernet ${COMP_WORDS[3]} vif</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4.$6" --intf-type=ethernet</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of specified virtual network interface (vif) information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4.$6" --intf-type=ethernet</command>
+ </leafNode>
+ </children>
+ </tagNode>
+ #include <include/show-interface-type-event-log.xml.i>
</children>
- </tagNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="ethernet">
- <properties>
- <help>Show Ethernet interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-type=ethernet</command>
- <children>
- <leafNode name="detail">
- <properties>
- <help>Show detailed ethernet interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=ethernet</command>
- </leafNode>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-geneve.xml.in b/op-mode-definitions/show-interfaces-geneve.xml.in
index b5fe84ca7..aaaa34757 100644
--- a/op-mode-definitions/show-interfaces-geneve.xml.in
+++ b/op-mode-definitions/show-interfaces-geneve.xml.in
@@ -4,25 +4,7 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="geneve">
- <properties>
- <help>Show specified GENEVE interface information</help>
- <completionHelp>
- <path>interfaces geneve</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=geneve</command>
- <children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified GENEVE interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=geneve</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="geneve">
+ <node name="geneve">
<properties>
<help>Show GENEVE interface information</help>
</properties>
@@ -34,6 +16,24 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=geneve</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified GENEVE interface information</help>
+ <completionHelp>
+ <path>interfaces geneve</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=geneve</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of the specified GENEVE interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=geneve</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-input.xml.in b/op-mode-definitions/show-interfaces-input.xml.in
index c9856f77f..705b94a1a 100644
--- a/op-mode-definitions/show-interfaces-input.xml.in
+++ b/op-mode-definitions/show-interfaces-input.xml.in
@@ -4,9 +4,23 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="input">
+ <node name="input">
+ <properties>
+ <help>Show input (ifb) interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-type=input</command>
+ <children>
+ <leafNode name="detail">
+ <properties>
+ <help>Show detailed input interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=input</command>
+ </leafNode>
+ </children>
+ </node>
+ <virtualTagNode>
<properties>
- <help>Show specified Input interface information</help>
+ <help>Show specified input interface information</help>
<completionHelp>
<path>interfaces input</path>
</completionHelp>
@@ -21,21 +35,7 @@
</leafNode>
#include <include/show-interface-type-event-log.xml.i>
</children>
- </tagNode>
- <node name="input">
- <properties>
- <help>Show Input (ifb) interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-type=input</command>
- <children>
- <leafNode name="detail">
- <properties>
- <help>Show detailed input interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=input</command>
- </leafNode>
- </children>
- </node>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-l2tpv3.xml.in b/op-mode-definitions/show-interfaces-l2tpv3.xml.in
index 88b73d7d7..3d0345001 100644
--- a/op-mode-definitions/show-interfaces-l2tpv3.xml.in
+++ b/op-mode-definitions/show-interfaces-l2tpv3.xml.in
@@ -4,25 +4,7 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="l2tpv3">
- <properties>
- <help>Show specified L2TPv3 interface information</help>
- <completionHelp>
- <path>interfaces l2tpv3</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=l2tpv3</command>
- <children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified L2TPv3 interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=l2tpv3</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="l2tpv3">
+ <node name="l2tpv3">
<properties>
<help>Show L2TPv3 interface information</help>
</properties>
@@ -34,6 +16,24 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=l2tpv3</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified L2TPv3 interface information</help>
+ <completionHelp>
+ <path>interfaces l2tpv3</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=l2tpv3</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of the specified L2TPv3 interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=l2tpv3</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-loopback.xml.in b/op-mode-definitions/show-interfaces-loopback.xml.in
index 467e1a13d..028d1c079 100644
--- a/op-mode-definitions/show-interfaces-loopback.xml.in
+++ b/op-mode-definitions/show-interfaces-loopback.xml.in
@@ -4,25 +4,7 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="loopback">
- <properties>
- <help>Show specified Loopback interface information</help>
- <completionHelp>
- <path>interfaces loopback</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=loopback</command>
- <children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified Loopback interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=loopback</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="loopback">
+ <node name="loopback">
<properties>
<help>Show Loopback interface information</help>
</properties>
@@ -34,6 +16,24 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=loopback</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified Loopback interface information</help>
+ <completionHelp>
+ <path>interfaces loopback</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=loopback</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of the specified Loopback interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=loopback</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-macsec.xml.in b/op-mode-definitions/show-interfaces-macsec.xml.in
index 640031b77..027c05c63 100644
--- a/op-mode-definitions/show-interfaces-macsec.xml.in
+++ b/op-mode-definitions/show-interfaces-macsec.xml.in
@@ -19,21 +19,21 @@
</properties>
<command>ip -s macsec show</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified MACsec interface information</help>
+ <completionHelp>
+ <path>interfaces macsec</path>
+ </completionHelp>
+ </properties>
+ <command>ip macsec show $4</command>
+ <children>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
- <tagNode name="macsec">
- <properties>
- <help>Show specified MACsec interface information</help>
- <completionHelp>
- <path>interfaces macsec</path>
- </completionHelp>
- </properties>
- <command>ip macsec show $4</command>
- <children>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- </children>
+ </children>
</node>
</children>
</node>
diff --git a/op-mode-definitions/show-interfaces-pppoe.xml.in b/op-mode-definitions/show-interfaces-pppoe.xml.in
index 0904418bf..0e13ecdb8 100644
--- a/op-mode-definitions/show-interfaces-pppoe.xml.in
+++ b/op-mode-definitions/show-interfaces-pppoe.xml.in
@@ -4,34 +4,7 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="pppoe">
- <properties>
- <help>Show specified PPPoE interface information</help>
- <completionHelp>
- <path>interfaces pppoe</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=pppoe</command>
- <children>
- <leafNode name="log">
- <properties>
- <help>Show specified PPPoE interface log</help>
- </properties>
- <command>journalctl --no-hostname --boot --follow --unit "ppp@$4".service</command>
- </leafNode>
- <leafNode name="statistics">
- <properties>
- <help>Show specified PPPoE interface statistics</help>
- <completionHelp>
- <path>interfaces pppoe</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/show_ppp_stats.sh "$4"</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="pppoe">
+ <node name="pppoe">
<properties>
<help>Show PPPoE interface information</help>
</properties>
@@ -43,6 +16,33 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=pppoe</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified PPPoE interface information</help>
+ <completionHelp>
+ <path>interfaces pppoe</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=pppoe</command>
+ <children>
+ <leafNode name="log">
+ <properties>
+ <help>Show specified PPPoE interface log</help>
+ </properties>
+ <command>journalctl --no-hostname --boot --follow --unit "ppp@$4".service</command>
+ </leafNode>
+ <leafNode name="statistics">
+ <properties>
+ <help>Show specified PPPoE interface statistics</help>
+ <completionHelp>
+ <path>interfaces pppoe</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_ppp_stats.sh "$4"</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-pseudo-ethernet.xml.in b/op-mode-definitions/show-interfaces-pseudo-ethernet.xml.in
index a9e4257ce..140e7150d 100644
--- a/op-mode-definitions/show-interfaces-pseudo-ethernet.xml.in
+++ b/op-mode-definitions/show-interfaces-pseudo-ethernet.xml.in
@@ -4,27 +4,9 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="pseudo-ethernet">
+ <node name="pseudo-ethernet">
<properties>
- <help>Show specified Pseudo-Ethernet/MACvlan interface information</help>
- <completionHelp>
- <path>interfaces pseudo-ethernet</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=pseudo-ethernet</command>
- <children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified pseudo-ethernet/MACvlan interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=pseudo-ethernet</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="pseudo-ethernet">
- <properties>
- <help>Show Pseudo-Ethernet/MACvlan interface information</help>
+ <help>Show pseudo-ethernet/MACvlan interface information</help>
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-type=pseudo-ethernet</command>
<children>
@@ -34,6 +16,24 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=pseudo-ethernet</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified pseudo-ethernet/MACvlan interface information</help>
+ <completionHelp>
+ <path>interfaces pseudo-ethernet</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=pseudo-ethernet</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of the specified pseudo-ethernet/MACvlan interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=pseudo-ethernet</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-sstpc.xml.in b/op-mode-definitions/show-interfaces-sstpc.xml.in
index 61451db93..e0a53d9f4 100644
--- a/op-mode-definitions/show-interfaces-sstpc.xml.in
+++ b/op-mode-definitions/show-interfaces-sstpc.xml.in
@@ -4,34 +4,7 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="sstpc">
- <properties>
- <help>Show specified SSTP client interface information</help>
- <completionHelp>
- <path>interfaces sstpc</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=sstpc</command>
- <children>
- <leafNode name="log">
- <properties>
- <help>Show specified SSTP client interface log</help>
- </properties>
- <command>journalctl --no-hostname --boot --follow --unit "ppp@$4".service</command>
- </leafNode>
- <leafNode name="statistics">
- <properties>
- <help>Show specified SSTP client interface statistics</help>
- <completionHelp>
- <path>interfaces sstpc</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/show_ppp_stats.sh "$4"</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="sstpc">
+ <node name="sstpc">
<properties>
<help>Show SSTP client interface information</help>
</properties>
@@ -43,6 +16,33 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=sstpc</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified SSTP client interface information</help>
+ <completionHelp>
+ <path>interfaces sstpc</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=sstpc</command>
+ <children>
+ <leafNode name="log">
+ <properties>
+ <help>Show specified SSTP client interface log</help>
+ </properties>
+ <command>journalctl --no-hostname --boot --follow --unit "ppp@$4".service</command>
+ </leafNode>
+ <leafNode name="statistics">
+ <properties>
+ <help>Show specified SSTP client interface statistics</help>
+ <completionHelp>
+ <path>interfaces sstpc</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_ppp_stats.sh "$4"</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-tunnel.xml.in b/op-mode-definitions/show-interfaces-tunnel.xml.in
index 579b173cb..0707fe763 100644
--- a/op-mode-definitions/show-interfaces-tunnel.xml.in
+++ b/op-mode-definitions/show-interfaces-tunnel.xml.in
@@ -4,27 +4,9 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="tunnel">
+ <node name="tunnel">
<properties>
- <help>Show specified Tunnel interface information</help>
- <completionHelp>
- <path>interfaces tunnel</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=tunnel</command>
- <children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified tunnel interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=tunnel</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="tunnel">
- <properties>
- <help>Show Tunnel interface information</help>
+ <help>Show tunnel interface information</help>
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-type=tunnel</command>
<children>
@@ -34,6 +16,24 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=tunnel</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified tunnel interface information</help>
+ <completionHelp>
+ <path>interfaces tunnel</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=tunnel</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of the specified tunnel interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=tunnel</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-virtual-ethernet.xml.in b/op-mode-definitions/show-interfaces-virtual-ethernet.xml.in
index 4112a17af..20e1754e7 100644
--- a/op-mode-definitions/show-interfaces-virtual-ethernet.xml.in
+++ b/op-mode-definitions/show-interfaces-virtual-ethernet.xml.in
@@ -4,25 +4,7 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="virtual-ethernet">
- <properties>
- <help>Show specified virtual-ethernet interface information</help>
- <completionHelp>
- <path>interfaces virtual-ethernet</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=virtual-ethernet</command>
- <children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified virtual-ethernet interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=virtual-ethernet</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="virtual-ethernet">
+ <node name="virtual-ethernet">
<properties>
<help>Show virtual-ethernet interface information</help>
</properties>
@@ -34,6 +16,24 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=virtual-ethernet</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified virtual-ethernet interface information</help>
+ <completionHelp>
+ <path>interfaces virtual-ethernet</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=virtual-ethernet</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of the specified virtual-ethernet interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=virtual-ethernet</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-vti.xml.in b/op-mode-definitions/show-interfaces-vti.xml.in
index d13b3e7cc..460481bde 100644
--- a/op-mode-definitions/show-interfaces-vti.xml.in
+++ b/op-mode-definitions/show-interfaces-vti.xml.in
@@ -4,25 +4,7 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="vti">
- <properties>
- <help>Show specified VTI interface information</help>
- <completionHelp>
- <path>interfaces vti</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=vti</command>
- <children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified vti interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=vti</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="vti">
+ <node name="vti">
<properties>
<help>Show VTI interface information</help>
</properties>
@@ -34,6 +16,24 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=vti</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified VTI interface information</help>
+ <completionHelp>
+ <path>interfaces vti</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=vti</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of the specified vti interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=vti</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-vxlan.xml.in b/op-mode-definitions/show-interfaces-vxlan.xml.in
index 89c8d075b..4623e9371 100644
--- a/op-mode-definitions/show-interfaces-vxlan.xml.in
+++ b/op-mode-definitions/show-interfaces-vxlan.xml.in
@@ -4,25 +4,7 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="vxlan">
- <properties>
- <help>Show specified VXLAN interface information</help>
- <completionHelp>
- <path>interfaces vxlan</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=vxlan</command>
- <children>
- <leafNode name="brief">
- <properties>
- <help>Show summary of the specified VXLAN interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=vxlan</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="vxlan">
+ <node name="vxlan">
<properties>
<help>Show VXLAN interface information</help>
</properties>
@@ -34,6 +16,24 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=vxlan</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified VXLAN interface information</help>
+ <completionHelp>
+ <path>interfaces vxlan</path>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=vxlan</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of the specified VXLAN interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=vxlan</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-wireguard.xml.in b/op-mode-definitions/show-interfaces-wireguard.xml.in
index 6abca3a27..9457953ef 100644
--- a/op-mode-definitions/show-interfaces-wireguard.xml.in
+++ b/op-mode-definitions/show-interfaces-wireguard.xml.in
@@ -4,48 +4,6 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="wireguard">
- <properties>
- <help>Show specified WireGuard interface information</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_interfaces --type wireguard</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=wireguard</command>
- <children>
- <leafNode name="allowed-ips">
- <properties>
- <help>Show all IP addresses allowed for the specified interface</help>
- </properties>
- <command>wg show "$4" allowed-ips</command>
- </leafNode>
- <leafNode name="endpoints">
- <properties>
- <help>Show all endpoints for the specified interface</help>
- </properties>
- <command>wg show "$4" endpoints</command>
- </leafNode>
- <leafNode name="peers">
- <properties>
- <help>Show all peer IDs for the specified interface</help>
- </properties>
- <command>wg show "$4" peers</command>
- </leafNode>
- <leafNode name="public-key">
- <properties>
- <help>Show interface public-key</help>
- </properties>
- <command>wg show "$4" public-key</command>
- </leafNode>
- <leafNode name="summary">
- <properties>
- <help>Shows current configuration and device information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces_wireguard.py show_summary --intf-name="$4"</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
<node name="wireguard">
<properties>
<help>Show WireGuard interface information</help>
@@ -58,6 +16,48 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=wireguard</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified WireGuard interface information</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_interfaces --type wireguard</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=wireguard</command>
+ <children>
+ <leafNode name="allowed-ips">
+ <properties>
+ <help>Show all IP addresses allowed for the specified interface</help>
+ </properties>
+ <command>wg show "$4" allowed-ips</command>
+ </leafNode>
+ <leafNode name="endpoints">
+ <properties>
+ <help>Show all endpoints for the specified interface</help>
+ </properties>
+ <command>wg show "$4" endpoints</command>
+ </leafNode>
+ <leafNode name="peers">
+ <properties>
+ <help>Show all peer IDs for the specified interface</help>
+ </properties>
+ <command>wg show "$4" peers</command>
+ </leafNode>
+ <leafNode name="public-key">
+ <properties>
+ <help>Show interface public-key</help>
+ </properties>
+ <command>wg show "$4" public-key</command>
+ </leafNode>
+ <leafNode name="summary">
+ <properties>
+ <help>Shows current configuration and device information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces_wireguard.py show_summary --intf-name="$4"</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces-wireless.xml.in b/op-mode-definitions/show-interfaces-wireless.xml.in
index 16ea33d82..55e23adf5 100644
--- a/op-mode-definitions/show-interfaces-wireless.xml.in
+++ b/op-mode-definitions/show-interfaces-wireless.xml.in
@@ -6,7 +6,7 @@
<children>
<node name="wireless">
<properties>
- <help>Show Wireless (WLAN) interface information</help>
+ <help>Show wireless (WLAN) interface information</help>
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-type=wireless</command>
<children>
@@ -22,61 +22,61 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces_wireless.py show_info</command>
</leafNode>
- </children>
- </node>
- <tagNode name="wireless">
- <properties>
- <help>Show specified wireless interface information</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_interfaces --type wireless</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=wireless</command>
- <children>
- <leafNode name="brief">
+ <virtualTagNode>
<properties>
- <help>Show brief summary of the specified wireless interface</help>
+ <help>Show specified wireless interface information</help>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_interfaces --type wireless</script>
+ </completionHelp>
</properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=wireless</command>
- </leafNode>
- <node name="scan">
- <properties>
- <help>Scan for networks via specified wireless interface</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces_wireless.py show_scan --intf-name="$4"</command>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=wireless</command>
<children>
- <leafNode name="detail">
+ <leafNode name="brief">
<properties>
- <help>Show detailed scan results</help>
+ <help>Show brief summary of the specified wireless interface</help>
</properties>
- <command>/sbin/iw dev "$4" scan ap-force</command>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4" --intf-type=wireless</command>
</leafNode>
- </children>
- </node>
- <leafNode name="stations">
- <properties>
- <help>Show specified Wireless interface information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces_wireless.py show_stations --intf-name="$4"</command>
- </leafNode>
- <tagNode name="vif">
- <properties>
- <help>Show specified virtual network interface (vif) information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4.$6" --intf-type=wireless</command>
- <children>
- <leafNode name="brief">
+ <node name="scan">
<properties>
- <help>Show summary of specified virtual network interface (vif) information</help>
+ <help>Scan for networks via specified wireless interface</help>
</properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4.$6" --intf-type=wireless</command>
+ <command>${vyos_op_scripts_dir}/interfaces_wireless.py show_scan --intf-name="$4"</command>
+ <children>
+ <leafNode name="detail">
+ <properties>
+ <help>Show detailed scan results</help>
+ </properties>
+ <command>/sbin/iw dev "$4" scan ap-force</command>
+ </leafNode>
+ </children>
+ </node>
+ <leafNode name="stations">
+ <properties>
+ <help>Show specified wireless interface information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces_wireless.py show_stations --intf-name="$4"</command>
</leafNode>
+ <tagNode name="vif">
+ <properties>
+ <help>Show specified virtual network interface (vif) information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4.$6" --intf-type=wireless</command>
+ <children>
+ <leafNode name="brief">
+ <properties>
+ <help>Show summary of specified virtual network interface (vif) information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_summary --intf-name="$4.$6" --intf-type=wireless</command>
+ </leafNode>
+ </children>
+ </tagNode>
+ #include <include/show-interface-type-event-log.xml.i>
</children>
- </tagNode>
- #include <include/show-interface-type-event-log.xml.i>
+ </virtualTagNode>
</children>
- </tagNode>
- </children>
+ </node>
+ </children>
</node>
</children>
</node>
diff --git a/op-mode-definitions/show-interfaces-wwan.xml.in b/op-mode-definitions/show-interfaces-wwan.xml.in
index 87301d6c9..6616de9dc 100644
--- a/op-mode-definitions/show-interfaces-wwan.xml.in
+++ b/op-mode-definitions/show-interfaces-wwan.xml.in
@@ -4,86 +4,7 @@
<children>
<node name="interfaces">
<children>
- <tagNode name="wwan">
- <properties>
- <help>Show specified Wireless Wire Area Network (WWAN) interface information</help>
- <completionHelp>
- <path>interfaces wwan</path>
- <script>cd /sys/class/net; ls -d wwan*</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=wirelessmodem</command>
- <children>
- <leafNode name="capabilities">
- <properties>
- <help>Show WWAN module capabilities</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --capabilities</command>
- </leafNode>
- <leafNode name="firmware">
- <properties>
- <help>Show WWAN module firmware</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --firmware</command>
- </leafNode>
- <leafNode name="imei">
- <properties>
- <help>Show WWAN module IMEI/ESN/MEID</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --imei</command>
- </leafNode>
- <leafNode name="imsi">
- <properties>
- <help>Show WWAN module IMSI</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --imsi</command>
- </leafNode>
- <leafNode name="model">
- <properties>
- <help>Show WWAN module manufacturer</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --model</command>
- </leafNode>
- <leafNode name="msisdn">
- <properties>
- <help>Show WWAN module MSISDN</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --msisdn</command>
- </leafNode>
- <leafNode name="revision">
- <properties>
- <help>Show WWAN module revision</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --revision</command>
- </leafNode>
- <leafNode name="signal">
- <properties>
- <help>Show WWAN module RF signal info</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --signal</command>
- </leafNode>
- <leafNode name="sim">
- <properties>
- <help>Show WWAN module connected SIM card information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --sim</command>
- </leafNode>
- <leafNode name="detail">
- <properties>
- <help>Show WWAN module detailed information summary</help>
- </properties>
- <command>if cli-shell-api existsActive interfaces wwan $4; then mmcli --modem ${4#wwan}; else echo "Interface \"$4\" unconfigured!"; fi</command>
- </leafNode>
- <leafNode name="log">
- <properties>
- <help>Show interface log for specified interface</help>
- </properties>
- <command>echo not implemented</command>
- </leafNode>
- #include <include/show-interface-type-event-log.xml.i>
- </children>
- </tagNode>
- <node name="wwan">
+ <node name="wwan">
<properties>
<help>Show Wireless Modem (WWAN) interface information</help>
</properties>
@@ -95,6 +16,85 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show --intf-type=wwan</command>
</leafNode>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified Wireless Wire Area Network (WWAN) interface information</help>
+ <completionHelp>
+ <path>interfaces wwan</path>
+ <script>cd /sys/class/net; ls -d wwan*</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show --intf-name="$4" --intf-type=wirelessmodem</command>
+ <children>
+ <leafNode name="capabilities">
+ <properties>
+ <help>Show WWAN module capabilities</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --capabilities</command>
+ </leafNode>
+ <leafNode name="firmware">
+ <properties>
+ <help>Show WWAN module firmware</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --firmware</command>
+ </leafNode>
+ <leafNode name="imei">
+ <properties>
+ <help>Show WWAN module IMEI/ESN/MEID</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --imei</command>
+ </leafNode>
+ <leafNode name="imsi">
+ <properties>
+ <help>Show WWAN module IMSI</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --imsi</command>
+ </leafNode>
+ <leafNode name="model">
+ <properties>
+ <help>Show WWAN module manufacturer</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --model</command>
+ </leafNode>
+ <leafNode name="msisdn">
+ <properties>
+ <help>Show WWAN module MSISDN</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --msisdn</command>
+ </leafNode>
+ <leafNode name="revision">
+ <properties>
+ <help>Show WWAN module revision</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --revision</command>
+ </leafNode>
+ <leafNode name="signal">
+ <properties>
+ <help>Show WWAN module RF signal info</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --signal</command>
+ </leafNode>
+ <leafNode name="sim">
+ <properties>
+ <help>Show WWAN module connected SIM card information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/show_wwan.py --interface=$4 --sim</command>
+ </leafNode>
+ <leafNode name="detail">
+ <properties>
+ <help>Show WWAN module detailed information summary</help>
+ </properties>
+ <command>if cli-shell-api existsActive interfaces wwan $4; then mmcli --modem ${4#wwan}; else echo "Interface \"$4\" unconfigured!"; fi</command>
+ </leafNode>
+ <leafNode name="log">
+ <properties>
+ <help>Show interface log for specified interface</help>
+ </properties>
+ <command>echo not implemented</command>
+ </leafNode>
+ #include <include/show-interface-type-event-log.xml.i>
+ </children>
+ </virtualTagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-interfaces.xml.in b/op-mode-definitions/show-interfaces.xml.in
index 2d94080c7..e2d7d3dd3 100644
--- a/op-mode-definitions/show-interfaces.xml.in
+++ b/op-mode-definitions/show-interfaces.xml.in
@@ -26,34 +26,34 @@
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show_summary</command>
</leafNode>
- <tagNode name="kernel">
- <properties>
- <completionHelp>
- <script>ip -j link show | jq -r '.[].ifname'</script>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_kernel --intf-name=$4</command>
- <children>
- <leafNode name="detail">
- <properties>
- <help>Show system interface in JSON format</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_kernel --intf-name=$4 --detail</command>
- </leafNode>
- <leafNode name="json">
- <properties>
- <help>Show system interface in JSON format</help>
- </properties>
- <command>${vyos_op_scripts_dir}/interfaces.py show_kernel --intf-name=$4 --raw</command>
- </leafNode>
- </children>
- </tagNode>
<node name="kernel">
<properties>
<help>Show all interfaces on this system</help>
</properties>
<command>${vyos_op_scripts_dir}/interfaces.py show_kernel</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <completionHelp>
+ <script>ip -j link show | jq -r '.[].ifname'</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_kernel --intf-name=$4</command>
+ <children>
+ <leafNode name="detail">
+ <properties>
+ <help>Show system interface in JSON format</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_kernel --intf-name=$4 --detail</command>
+ </leafNode>
+ <leafNode name="json">
+ <properties>
+ <help>Show system interface in JSON format</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/interfaces.py show_kernel --intf-name=$4 --raw</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<leafNode name="detail">
<properties>
<help>Show system interface in JSON format</help>
diff --git a/op-mode-definitions/show-ip-bgp.xml.in b/op-mode-definitions/show-ip-bgp.xml.in
index ecef320bf..f2b98582e 100644
--- a/op-mode-definitions/show-ip-bgp.xml.in
+++ b/op-mode-definitions/show-ip-bgp.xml.in
@@ -11,12 +11,6 @@
<command>vtysh -c "show ip bgp"</command>
<children>
#include <include/bgp/show-ip-bgp-common.xml.i>
- <leafNode name="vrf">
- <properties>
- <help>Show BGP VRF information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
<tagNode name="vrf">
<properties>
<help>Show BGP VRF related information</help>
@@ -25,6 +19,10 @@
<list>all</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Show BGP VRF information</help>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </standalone>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
<children>
#include <include/bgp/show-ip-bgp-common.xml.i>
diff --git a/op-mode-definitions/show-ip-route.xml.in b/op-mode-definitions/show-ip-route.xml.in
index 37279d3d2..bbac433c7 100644
--- a/op-mode-definitions/show-ip-route.xml.in
+++ b/op-mode-definitions/show-ip-route.xml.in
@@ -13,13 +13,24 @@
</properties>
<command>vtysh -c "show ip route"</command>
<children>
- #include <include/show-route-bgp.xml.i>
- <node name="cache">
+ <virtualTagNode>
<properties>
- <help>Show kernel route cache</help>
+ <help>Show IP routes of specified IP address or prefix</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt;</list>
+ </completionHelp>
</properties>
- <command>ip -s route list cache</command>
- </node>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ <leafNode name="longer-prefixes">
+ <properties>
+ <help>Show longer prefixes of routes for specified prefix</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
+ #include <include/show-route-bgp.xml.i>
<tagNode name="cache">
<properties>
<help>Show kernel route cache for a given route</help>
@@ -27,15 +38,13 @@
<list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Show kernel route cache</help>
+ <command>ip -s route list cache</command>
+ </standalone>
<command>ip -s route list cache $5</command>
</tagNode>
#include <include/show-route-connected.xml.i>
- <node name="forward">
- <properties>
- <help>Show kernel route table</help>
- </properties>
- <command>ip route list</command>
- </node>
<tagNode name="forward">
<properties>
<help>Show kernel route table for a given route</help>
@@ -43,6 +52,10 @@
<list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Show kernel route table</help>
+ <command>ip route list</command>
+ </standalone>
<command>ip -s route list $5</command>
</tagNode>
#include <include/show-route-isis.xml.i>
@@ -93,7 +106,7 @@
#include <include/show-route-static.xml.i>
#include <include/show-route-supernets-only.xml.i>
#include <include/show-route-tag.xml.i>
- <node name="node.tag">
+ <virtualTagNode>
<properties>
<help>Show IP routes of specified IP address or prefix</help>
<completionHelp>
@@ -109,28 +122,11 @@
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</leafNode>
</children>
- </node>
+ </virtualTagNode>
</children>
</tagNode>
</children>
</node>
- <tagNode name="route">
- <properties>
- <help>Show IP routes of specified IP address or prefix</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt; &lt;x.x.x.x/x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <leafNode name="longer-prefixes">
- <properties>
- <help>Show longer prefixes of routes for specified prefix</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
- </children>
- </tagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-ipv6-prefix-list.xml.in b/op-mode-definitions/show-ipv6-prefix-list.xml.in
index 9e9df5b29..db1a2754e 100644
--- a/op-mode-definitions/show-ipv6-prefix-list.xml.in
+++ b/op-mode-definitions/show-ipv6-prefix-list.xml.in
@@ -13,6 +13,50 @@
</properties>
<command>vtysh -c "show ipv6 prefix-list"</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified IPv6 prefix-list</help>
+ <completionHelp>
+ <list>WORD</list>
+ </completionHelp>
+ </properties>
+ <command>vtysh -c "show ipv6 prefix-list $4"</command>
+ <children>
+ <virtualTagNode>
+ <properties>
+ <help>Show select prefix of specified IPv6 prefix-list</help>
+ <completionHelp>
+ <list>&lt;h:h:h:h:h:h:h:h/x&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>vtysh -c "show ipv6 prefix-list $4 $5"</command>
+ <children>
+ <node name="first-match">
+ <properties>
+ <help>Show first-match from select prefix of named IPv6 prefix-list</help>
+ </properties>
+ <command>vtysh -c "show ipv6 prefix-list $4 $5 first-match"</command>
+ </node>
+ <node name="longer">
+ <properties>
+ <help>Show longer match of select prefix from named IPv6 prefix-list</help>
+ </properties>
+ <command>vtysh -c "show ipv6 prefix-list $4 $5 longer"</command>
+ </node>
+ </children>
+ </virtualTagNode>
+ <tagNode name="seq">
+ <properties>
+ <help>Show specified sequence from specified IPv6 prefix-list</help>
+ </properties>
+ <standalone>
+ <help>Show specified sequence from specified IPv6 prefix-list</help>
+ <command>vtysh -c "show ipv6 prefix-list $4 seq"</command>
+ </standalone>
+ <command>vtysh -c "show ipv6 prefix-list $4 seq $6"</command>
+ </tagNode>
+ </children>
+ </virtualTagNode>
<tagNode name="detail">
<properties>
<help>Show detail of specified IPv6 prefix-list</help>
@@ -35,52 +79,6 @@
</tagNode>
</children>
</node>
- <tagNode name="prefix-list">
- <properties>
- <help>Show specified IPv6 prefix-list</help>
- <completionHelp>
- <list>WORD</list>
- </completionHelp>
- </properties>
- <command>vtysh -c "show ipv6 prefix-list $4"</command>
- <children>
- <node name="node.tag">
- <properties>
- <help>Show select prefix of specified IPv6 prefix-list</help>
- <completionHelp>
- <list>&lt;h:h:h:h:h:h:h:h/x&gt;</list>
- </completionHelp>
- </properties>
- <command>vtysh -c "show ipv6 prefix-list $4 $5"</command>
- <children>
- <node name="first-match">
- <properties>
- <help>Show first-match from select prefix of named IPv6 prefix-list</help>
- </properties>
- <command>vtysh -c "show ipv6 prefix-list $4 $5 first-match"</command>
- </node>
- <node name="longer">
- <properties>
- <help>Show longer match of select prefix from named IPv6 prefix-list</help>
- </properties>
- <command>vtysh -c "show ipv6 prefix-list $4 $5 longer"</command>
- </node>
- </children>
- </node>
- <node name="seq">
- <properties>
- <help>Show specified sequence from specified IPv6 prefix-list</help>
- </properties>
- <command>vtysh -c "show ipv6 prefix-list $4 seq"</command>
- </node>
- <tagNode name="seq">
- <properties>
- <help>Show specified sequence from specified IPv6 prefix-list</help>
- </properties>
- <command>vtysh -c "show ipv6 prefix-list $4 seq $6"</command>
- </tagNode>
- </children>
- </tagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-ipv6-route.xml.in b/op-mode-definitions/show-ipv6-route.xml.in
index f68a94971..8690ed710 100644
--- a/op-mode-definitions/show-ipv6-route.xml.in
+++ b/op-mode-definitions/show-ipv6-route.xml.in
@@ -13,13 +13,24 @@
</properties>
<command>vtysh -c "show ipv6 route"</command>
<children>
- #include <include/show-route-bgp.xml.i>
- <node name="cache">
+ <virtualTagNode>
<properties>
- <help>Show kernel IPv6 route cache</help>
+ <help>Show IPv6 routes of given address or prefix</help>
+ <completionHelp>
+ <list>&lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
+ </completionHelp>
</properties>
- <command>ip -s -f inet6 route list cache</command>
- </node>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ <children>
+ <node name="longer-prefixes">
+ <properties>
+ <help>Show longer prefixes of routes for given prefix</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </node>
+ </children>
+ </virtualTagNode>
+ #include <include/show-route-bgp.xml.i>
<tagNode name="cache">
<properties>
<help>Show kernel IPv6 route cache for a given route</help>
@@ -27,15 +38,13 @@
<list>&lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Show kernel IPv6 route cache</help>
+ <command>ip -s -f inet6 route list cache</command>
+ </standalone>
<command>ip -s -f inet6 route list cache $5</command>
</tagNode>
#include <include/show-route-connected.xml.i>
- <node name="forward">
- <properties>
- <help>Show kernel IPv6 route table</help>
- </properties>
- <command>ip -f inet6 route list</command>
- </node>
<tagNode name="forward">
<properties>
<help>Show kernel IPv6 route table for a given route</help>
@@ -43,6 +52,10 @@
<list>&lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Show kernel IPv6 route table</help>
+ <command>ip -f inet6 route list</command>
+ </standalone>
<command>ip -s -f inet6 route list $5</command>
</tagNode>
#include <include/show-route-isis.xml.i>
@@ -83,7 +96,7 @@
</properties>
<command>${vyos_op_scripts_dir}/route.py show_summary --family inet6 --vrf $5</command>
</node>
- <node name="node.tag">
+ <virtualTagNode>
<properties>
<help>Show IPv6 routes of given address or prefix</help>
<completionHelp>
@@ -99,7 +112,7 @@
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</node>
</children>
- </node>
+ </virtualTagNode>
#include <include/show-route-bgp.xml.i>
#include <include/show-route-connected.xml.i>
#include <include/show-route-isis.xml.i>
@@ -114,23 +127,6 @@
</tagNode>
</children>
</node>
- <tagNode name="route">
- <properties>
- <help>Show IPv6 routes of given address or prefix</help>
- <completionHelp>
- <list>&lt;h:h:h:h:h:h:h:h&gt; &lt;h:h:h:h:h:h:h:h/x&gt;</list>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- <children>
- <node name="longer-prefixes">
- <properties>
- <help>Show longer prefixes of routes for given prefix</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </node>
- </children>
- </tagNode>
</children>
</node>
</children>
diff --git a/op-mode-definitions/show-log.xml.in b/op-mode-definitions/show-log.xml.in
index d1320bc00..499e7f84b 100755
--- a/op-mode-definitions/show-log.xml.in
+++ b/op-mode-definitions/show-log.xml.in
@@ -5,21 +5,21 @@
<help>Show system information</help>
</properties>
<children>
- <tagNode name="log">
- <properties>
- <help>Show last number of messages in master logging buffer</help>
- <completionHelp>
- <list>&lt;1-9999&gt;</list>
- </completionHelp>
- </properties>
- <command>if ${vyos_validators_dir}/numeric --range 1-9999 "$3"; then journalctl --no-hostname --boot --lines "$3"; fi</command>
- </tagNode>
- <node name="log">
+ <node name="log">
<properties>
<help>Show contents of current master logging buffer</help>
</properties>
<command>journalctl --no-hostname --boot</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Show last number of messages in master logging buffer</help>
+ <completionHelp>
+ <list>&lt;1-9999&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>if ${vyos_validators_dir}/numeric --range 1-9999 "$3"; then journalctl --no-hostname --boot --lines "$3"; fi</command>
+ </virtualTagNode>
<leafNode name="audit">
<properties>
<help>Show audit logs</help>
@@ -858,14 +858,12 @@
<list>&lt;NUMBER&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Show last 10 lines of /var/log/messages file</help>
+ <command>tail -n 10 /var/log/messages</command>
+ </standalone>
<command>tail -n "$4" /var/log/messages | ${VYATTA_PAGER:-cat}</command>
</tagNode>
- <node name="tail">
- <properties>
- <help>Show last 10 lines of /var/log/messages file</help>
- </properties>
- <command>tail -n 10 /var/log/messages</command>
- </node>
<leafNode name="vpn">
<properties>
<help>Show log for ALL Virtual Private Network services</help>
diff --git a/op-mode-definitions/show-mpls.xml.in b/op-mode-definitions/show-mpls.xml.in
index 86f6f1bcc..43fa26b64 100644
--- a/op-mode-definitions/show-mpls.xml.in
+++ b/op-mode-definitions/show-mpls.xml.in
@@ -18,6 +18,23 @@
</properties>
<command>vtysh -c "show mpls ldp binding"</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>LDP forwarding equivalence class</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h/h&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>vtysh -c "show mpls ldp binding $5"</command>
+ <children>
+ <leafNode name="detail">
+ <properties>
+ <help>Show detailed information</help>
+ </properties>
+ <command>vtysh -c "show mpls ldp binding $5 detail"</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
<node name="detail">
<properties>
<help>Show detailed information</help>
@@ -116,23 +133,6 @@
</tagNode>
</children>
</node>
- <tagNode name="binding">
- <properties>
- <help>LDP forwarding equivalence class</help>
- <completionHelp>
- <list>&lt;x.x.x.x/x&gt; &lt;h:h:h:h:h:h:h:h/h&gt;</list>
- </completionHelp>
- </properties>
- <command>vtysh -c "show mpls ldp binding $5"</command>
- <children>
- <leafNode name="detail">
- <properties>
- <help>Show detailed information</help>
- </properties>
- <command>vtysh -c "show mpls ldp binding $5 detail"</command>
- </leafNode>
- </children>
- </tagNode>
<node name="discovery">
<properties>
<help>Discovery hello information</help>
@@ -171,32 +171,32 @@
</properties>
<command>vtysh -c "show mpls ldp neighbor capabilities"</command>
</leafNode>
- </children>
- </node>
- <tagNode name="neighbor">
- <properties>
- <help>LDP neighbor</help>
- <completionHelp>
- <list>&lt;x.x.x.x&gt; &lt;h:h:h:h:h:h:h:h&gt;</list>
- <script>vtysh -c "show mpls ldp neighbor" | awk '{print $2}' | egrep -v "ID"</script>
- </completionHelp>
- </properties>
- <command>vtysh -c "show mpls ldp neighbor $5"</command>
- <children>
- <leafNode name="detail">
- <properties>
- <help>Show detailed information</help>
- </properties>
- <command>vtysh -c "show mpls ldp neighbor $5 detail"</command>
- </leafNode>
- <leafNode name="capabilities">
+ <virtualTagNode>
<properties>
- <help>Show neighbor capability information</help>
+ <help>LDP neighbor</help>
+ <completionHelp>
+ <list>&lt;x.x.x.x&gt; &lt;h:h:h:h:h:h:h:h&gt;</list>
+ <script>vtysh -c "show mpls ldp neighbor" | awk '{print $2}' | egrep -v "ID"</script>
+ </completionHelp>
</properties>
- <command>vtysh -c "show mpls ldp neighbor $5 capabilities"</command>
- </leafNode>
+ <command>vtysh -c "show mpls ldp neighbor $5"</command>
+ <children>
+ <leafNode name="detail">
+ <properties>
+ <help>Show detailed information</help>
+ </properties>
+ <command>vtysh -c "show mpls ldp neighbor $5 detail"</command>
+ </leafNode>
+ <leafNode name="capabilities">
+ <properties>
+ <help>Show neighbor capability information</help>
+ </properties>
+ <command>vtysh -c "show mpls ldp neighbor $5 capabilities"</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
</children>
- </tagNode>
+ </node>
</children>
</node>
<node name="pseudowire">
diff --git a/op-mode-definitions/show-openfabric.xml.in b/op-mode-definitions/show-openfabric.xml.in
index 2f489866e..124b9616e 100644
--- a/op-mode-definitions/show-openfabric.xml.in
+++ b/op-mode-definitions/show-openfabric.xml.in
@@ -24,11 +24,11 @@
</completionHelp>
</properties>
<children>
+ #include <include/vtysh-generic-interface-virtualTagNode.xml.i>
#include <include/vtysh-generic-detail.xml.i>
</children>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</node>
- #include <include/vtysh-generic-interface-tagNode.xml.i>
<node name="neighbor">
<properties>
<help>Show OpenFabric neighbor adjacencies</help>
diff --git a/op-mode-definitions/show-vrf.xml.in b/op-mode-definitions/show-vrf.xml.in
index c18649844..574e92bfe 100644
--- a/op-mode-definitions/show-vrf.xml.in
+++ b/op-mode-definitions/show-vrf.xml.in
@@ -14,31 +14,31 @@
</properties>
<command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
</leafNode>
- </children>
- </node>
- <tagNode name="vrf">
- <properties>
- <help>Show information on specific VRF instance</help>
- <completionHelp>
- <path>vrf name</path>
- </completionHelp>
- </properties>
- <command>${vyos_op_scripts_dir}/vrf.py show --name="$3"</command>
- <children>
- <leafNode name="processes">
- <properties>
- <help>Shows all process ids associated with VRF</help>
- </properties>
- <command>ip vrf pids "$3"</command>
- </leafNode>
- <leafNode name="vni">
+ <virtualTagNode>
<properties>
- <help>Show VXLAN VNI association</help>
+ <help>Show information on specific VRF instance</help>
+ <completionHelp>
+ <path>vrf name</path>
+ </completionHelp>
</properties>
- <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
- </leafNode>
+ <command>${vyos_op_scripts_dir}/vrf.py show --name="$3"</command>
+ <children>
+ <leafNode name="processes">
+ <properties>
+ <help>Shows all process ids associated with VRF</help>
+ </properties>
+ <command>ip vrf pids "$3"</command>
+ </leafNode>
+ <leafNode name="vni">
+ <properties>
+ <help>Show VXLAN VNI association</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+ </leafNode>
+ </children>
+ </virtualTagNode>
</children>
- </tagNode>
- </children>
+ </node>
+ </children>
</node>
</interfaceDefinition>
diff --git a/op-mode-definitions/terminal.xml.in b/op-mode-definitions/terminal.xml.in
index 25b0dc046..163159846 100644
--- a/op-mode-definitions/terminal.xml.in
+++ b/op-mode-definitions/terminal.xml.in
@@ -74,12 +74,6 @@
</tagNode>
</children>
</node>
- <node name="pager">
- <properties>
- <help>Set terminal pager to default (less)</help>
- </properties>
- <command>VYATTA_PAGER=${_vyatta_default_pager}</command>
- </node>
<tagNode name="pager">
<properties>
<help>Set terminal pager</help>
@@ -87,6 +81,10 @@
<list>&lt;PROGRAM&gt;</list>
</completionHelp>
</properties>
+ <standalone>
+ <help>Set terminal pager to default (less)</help>
+ <command>VYATTA_PAGER=${_vyatta_default_pager}</command>
+ </standalone>
<command>VYATTA_PAGER=$4</command>
</tagNode>
<tagNode name="length">
diff --git a/op-mode-definitions/traceroute.xml.in b/op-mode-definitions/traceroute.xml.in
index aba0f45e3..9976bdd97 100644
--- a/op-mode-definitions/traceroute.xml.in
+++ b/op-mode-definitions/traceroute.xml.in
@@ -9,7 +9,7 @@
</properties>
<command>${vyos_op_scripts_dir}/traceroute.py ${@:2}</command>
<children>
- <leafNode name="node.tag">
+ <virtualTagNode>
<properties>
<help>Traceroute options</help>
<completionHelp>
@@ -17,7 +17,7 @@
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/traceroute.py ${@:2}</command>
- </leafNode>
+ </virtualTagNode>
</children>
</tagNode>
</interfaceDefinition>
diff --git a/op-mode-definitions/traffic-dump.xml.in b/op-mode-definitions/traffic-dump.xml.in
index e86e69736..a145742e9 100644
--- a/op-mode-definitions/traffic-dump.xml.in
+++ b/op-mode-definitions/traffic-dump.xml.in
@@ -16,7 +16,7 @@
</completionHelp>
</properties>
<children>
- <leafNode name="node.tag">
+ <virtualTagNode>
<properties>
<help>Traffic capture options</help>
<completionHelp>
@@ -24,7 +24,7 @@
</completionHelp>
</properties>
<command>${vyos_op_scripts_dir}/tcpdump.py "${@:4}"</command>
- </leafNode>
+ </virtualTagNode>
</children>
</tagNode>
</children>
diff --git a/op-mode-definitions/vrrp.xml.in b/op-mode-definitions/vrrp.xml.in
index ae204602f..b2b2886c0 100644
--- a/op-mode-definitions/vrrp.xml.in
+++ b/op-mode-definitions/vrrp.xml.in
@@ -2,31 +2,31 @@
<interfaceDefinition>
<node name="show">
<children>
- <tagNode name="vrrp">
- <properties>
- <help>Show specified VRRP (Virtual Router Redundancy Protocol) group information</help>
- </properties>
- <children>
- <node name="statistics">
- <properties>
- <help>Show VRRP statistics</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vrrp.py show_statistics --group-name="$3"</command>
- </node>
- <node name="detail">
- <properties>
- <help>Show detailed VRRP state information</help>
- </properties>
- <command>${vyos_op_scripts_dir}/vrrp.py show_detail --group-name="$3"</command>
- </node>
- </children>
- </tagNode>
<node name="vrrp">
<properties>
<help>Show VRRP (Virtual Router Redundancy Protocol) information</help>
</properties>
<command>${vyos_op_scripts_dir}/vrrp.py show_summary</command>
<children>
+ <virtualTagNode>
+ <properties>
+ <help>Show specified VRRP (Virtual Router Redundancy Protocol) group information</help>
+ </properties>
+ <children>
+ <node name="statistics">
+ <properties>
+ <help>Show VRRP statistics</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vrrp.py show_statistics --group-name="$3"</command>
+ </node>
+ <node name="detail">
+ <properties>
+ <help>Show detailed VRRP state information</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/vrrp.py show_detail --group-name="$3"</command>
+ </node>
+ </children>
+ </virtualTagNode>
<node name="statistics">
<properties>
<help>Show VRRP statistics</help>
diff --git a/python/vyos/defaults.py b/python/vyos/defaults.py
index f84b14040..63f3b5358 100644
--- a/python/vyos/defaults.py
+++ b/python/vyos/defaults.py
@@ -15,10 +15,10 @@
import os
-base_dir = '/usr/libexec/vyos/'
+base_dir = '/usr/libexec/vyos'
directories = {
- 'base' : base_dir,
+ 'base' : f'{base_dir}',
'data' : '/usr/share/vyos/',
'conf_mode' : f'{base_dir}/conf_mode',
'op_mode' : f'{base_dir}/op_mode',
diff --git a/python/vyos/firewall.py b/python/vyos/firewall.py
index 64022db84..0643107a9 100755
--- a/python/vyos/firewall.py
+++ b/python/vyos/firewall.py
@@ -361,7 +361,7 @@ def parse_rule(rule_conf, hook, fw_name, rule_id, ip_name):
if iiface[0] == '!':
operator = '!='
iiface = iiface[1:]
- output.append(f'iifname {operator} {{{iiface}}}')
+ output.append(f'iifname {operator} {{"{iiface}"}}')
elif 'group' in rule_conf['inbound_interface']:
iiface = rule_conf['inbound_interface']['group']
if iiface[0] == '!':
@@ -376,7 +376,7 @@ def parse_rule(rule_conf, hook, fw_name, rule_id, ip_name):
if oiface[0] == '!':
operator = '!='
oiface = oiface[1:]
- output.append(f'oifname {operator} {{{oiface}}}')
+ output.append(f'oifname {operator} {{"{oiface}"}}')
elif 'group' in rule_conf['outbound_interface']:
oiface = rule_conf['outbound_interface']['group']
if oiface[0] == '!':
diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py
index 91b3a0c28..33c6830bc 100644
--- a/python/vyos/ifconfig/interface.py
+++ b/python/vyos/ifconfig/interface.py
@@ -423,11 +423,11 @@ class Interface(Control):
self._cmd(f'nft {nft_command}')
def _del_interface_from_ct_iface_map(self):
- nft_command = f'delete element inet vrf_zones ct_iface_map {{ "{self.ifname}" }}'
+ nft_command = f'delete element inet vrf_zones ct_iface_map {{ \'"{self.ifname}"\' }}'
self._nft_check_and_run(nft_command)
def _add_interface_to_ct_iface_map(self, vrf_table_id: int):
- nft_command = f'add element inet vrf_zones ct_iface_map {{ "{self.ifname}" : {vrf_table_id} }}'
+ nft_command = f'add element inet vrf_zones ct_iface_map {{ \'"{self.ifname}"\' : {vrf_table_id} }}'
self._nft_check_and_run(nft_command)
def get_ifindex(self):
diff --git a/python/vyos/template.py b/python/vyos/template.py
index bf2f13183..c6e35e9c7 100755
--- a/python/vyos/template.py
+++ b/python/vyos/template.py
@@ -582,6 +582,10 @@ def snmp_auth_oid(type):
}
return OIDs[type]
+@register_filter('quoted_join')
+def quoted_join(input_list, join_str, quote='"'):
+ return str(join_str).join(f'{quote}{elem}{quote}' for elem in input_list)
+
@register_filter('nft_action')
def nft_action(vyos_action):
if vyos_action == 'accept':
diff --git a/python/vyos/xml_ref/__init__.py b/python/vyos/xml_ref/__init__.py
index 99d8432d2..cd50a3ec2 100644
--- a/python/vyos/xml_ref/__init__.py
+++ b/python/vyos/xml_ref/__init__.py
@@ -14,6 +14,8 @@
# along with this library. If not, see <http://www.gnu.org/licenses/>.
from typing import Optional, Union, TYPE_CHECKING
+from typing import Callable
+from typing import Any
from vyos.xml_ref import definition
from vyos.xml_ref import op_definition
@@ -89,6 +91,7 @@ def from_source(d: dict, path: list) -> bool:
def ext_dict_merge(source: dict, destination: Union[dict, 'ConfigDict']):
return definition.ext_dict_merge(source, destination)
+
def load_op_reference(op_cache=[]):
if op_cache:
return op_cache[0]
@@ -108,5 +111,26 @@ def load_op_reference(op_cache=[]):
return op_xml
-def get_op_ref_path(path: list) -> list[op_definition.PathData]:
- return load_op_reference()._get_op_ref_path(path)
+
+def walk_op_data(func: Callable[[tuple, dict], Any]):
+ return load_op_reference().walk(func)
+
+
+def walk_op_node_data():
+ return load_op_reference().walk_node_data()
+
+
+def lookup_op_data(
+ path: list, tag_values: bool = False, last_node_type: str = ''
+) -> (dict, list[str]):
+ return load_op_reference().lookup(
+ path, tag_values=tag_values, last_node_type=last_node_type
+ )
+
+
+def lookup_op_node_data(
+ path: list, tag_values: bool = False, last_node_type: str = ''
+) -> list[op_definition.NodeData]:
+ return load_op_reference().lookup_node_data(
+ path, tag_values=tag_values, last_node_type=last_node_type
+ )
diff --git a/python/vyos/xml_ref/generate_op_cache.py b/python/vyos/xml_ref/generate_op_cache.py
index 95779d066..0c4ae7182 100755
--- a/python/vyos/xml_ref/generate_op_cache.py
+++ b/python/vyos/xml_ref/generate_op_cache.py
@@ -14,10 +14,13 @@
# 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 os
+import io
import re
import sys
-import json
import glob
+import json
+import atexit
from argparse import ArgumentParser
from os.path import join
@@ -25,23 +28,44 @@ from os.path import abspath
from os.path import dirname
from xml.etree import ElementTree as ET
from xml.etree.ElementTree import Element
+from functools import cmp_to_key
from typing import TypeAlias
from typing import Optional
+from op_definition import NodeData
+from op_definition import OpKey # pylint: disable=unused-import # noqa: F401
+from op_definition import OpData # pylint: disable=unused-import # noqa: F401
+from op_definition import key_name
+from op_definition import key_type
+from op_definition import node_data_difference
+from op_definition import get_node_data
+from op_definition import collapse
+
_here = dirname(__file__)
sys.path.append(join(_here, '..'))
-from defaults import directories
-
-from op_definition import PathData
+# pylint: disable=wrong-import-position,wrong-import-order
+from defaults import directories # noqa: E402
-xml_op_cache_json = 'xml_op_cache.json'
-xml_op_tmp = join('/tmp', xml_op_cache_json)
op_ref_cache = abspath(join(_here, 'op_cache.py'))
+op_ref_json = abspath(join(_here, 'op_cache.json'))
OptElement: TypeAlias = Optional[Element]
-DEBUG = False
+
+
+# It is expected that the node_data help txt contained in top-level nodes,
+# shared across files, e.g.'show', will reveal inconsistencies; to list
+# differences, use --check-xml-consistency
+CHECK_XML_CONSISTENCY = False
+err_buf = io.StringIO()
+
+
+def write_err_buf():
+ err_buf.seek(0)
+ out = err_buf.read()
+ print(out)
+ err_buf.close()
def translate_exec(s: str) -> str:
@@ -74,14 +98,58 @@ def translate_op_script(s: str) -> str:
return s
-def insert_node(n: Element, l: list[PathData], path=None) -> None:
- # pylint: disable=too-many-locals,too-many-branches
+def compare_keys(a, b):
+ # pylint: disable=too-many-return-statements
+ match key_type(a), key_type(b):
+ case None, None:
+ if key_name(a) == key_name(b):
+ return 0
+ return -1 if key_name(a) < key_name(b) else 1
+ case None, _:
+ return -1
+ case _, None:
+ return 1
+ case _, _:
+ if key_name(a) == key_name(b):
+ if key_type(a) == key_type(b):
+ return 0
+ return -1 if key_type(a) < key_type(b) else 1
+ return -1 if key_name(a) < key_name(b) else 1
+
+
+def sort_func(obj: dict, key_func):
+ if not obj or not isinstance(obj, dict):
+ return obj
+ k_list = list(obj.keys())
+ if not isinstance(k_list[0], tuple):
+ return obj
+ k_list = sorted(k_list, key=key_func)
+ v_list = map(lambda t: sort_func(obj[t], key_func), k_list)
+ return dict(zip(k_list, v_list))
+
+
+def sort_op_data(obj):
+ key_func = cmp_to_key(compare_keys)
+ return sort_func(obj, key_func)
+
+
+def insert_node(
+ n: Element, d: dict, path: list[str] = None, parent: NodeData = None, file: str = ''
+) -> None:
+ # pylint: disable=too-many-locals,too-many-branches,too-many-statements
prop: OptElement = n.find('properties')
children: OptElement = n.find('children')
command: OptElement = n.find('command')
- # name is not None as required by schema
- name: str = n.get('name', 'schema_error')
+ standalone: OptElement = n.find('standalone')
node_type: str = n.tag
+
+ if node_type == 'virtualTagNode':
+ name = '__virtual_tag'
+ else:
+ name = n.get('name')
+ if not name:
+ raise ValueError("Node name is required for all node types except <virtualTagNode>")
+
if path is None:
path = []
@@ -95,6 +163,16 @@ def insert_node(n: Element, l: list[PathData], path=None) -> None:
if command_text is not None:
command_text = translate_command(command_text, path)
+ try:
+ standalone_command = translate_command(standalone.find('command').text, path)
+ except AttributeError:
+ standalone_command = None
+
+ try:
+ standalone_help_text = translate_command(standalone.find('help').text, path)
+ except AttributeError:
+ standalone_help_text = None
+
comp_help = {}
if prop is not None:
che = prop.findall('completionHelp')
@@ -124,31 +202,49 @@ def insert_node(n: Element, l: list[PathData], path=None) -> None:
if comp_scripts:
comp_help['script'] = comp_scripts
- cur_node_dict = {}
- cur_node_dict['name'] = name
- cur_node_dict['type'] = node_type
- cur_node_dict['comp_help'] = comp_help
- cur_node_dict['help'] = help_text
- cur_node_dict['command'] = command_text
- cur_node_dict['path'] = path
- cur_node_dict['children'] = []
- l.append(cur_node_dict)
+ cur_node_data = NodeData()
+ cur_node_data.name = name
+ cur_node_data.node_type = node_type
+ cur_node_data.comp_help = comp_help
+ cur_node_data.help_text = help_text
+ cur_node_data.command = command_text
+ cur_node_data.standalone_help_text = standalone_help_text
+ cur_node_data.standalone_command = standalone_command
+ cur_node_data.path = path
+ cur_node_data.file = file
+
+ value = {('__node_data', None): cur_node_data}
+ key = (name, node_type)
+
+ cur_value = d.setdefault(key, value)
+
+ if parent and key not in parent.children:
+ parent.children.append(key)
+
+ if CHECK_XML_CONSISTENCY:
+ out = node_data_difference(get_node_data(cur_value), get_node_data(value))
+ if out:
+ err_buf.write(out)
if children is not None:
inner_nodes = children.iterfind('*')
for inner_n in inner_nodes:
inner_path = path[:]
- insert_node(inner_n, cur_node_dict['children'], inner_path)
+ insert_node(inner_n, d[key], inner_path, cur_node_data, file)
-def parse_file(file_path, l):
+def parse_file(file_path, d):
tree = ET.parse(file_path)
root = tree.getroot()
+ file = os.path.basename(file_path)
for n in root.iterfind('*'):
- insert_node(n, l)
+ insert_node(n, d, file=file)
def main():
+ # pylint: disable=global-statement
+ global CHECK_XML_CONSISTENCY
+
parser = ArgumentParser(description='generate dict from xml defintions')
parser.add_argument(
'--xml-dir',
@@ -156,21 +252,58 @@ def main():
required=True,
help='transcluded xml op-mode-definition file',
)
+ parser.add_argument(
+ '--check-xml-consistency',
+ action='store_true',
+ help='check consistency of node data across files',
+ )
+ parser.add_argument(
+ '--check-path-ambiguity',
+ action='store_true',
+ help='attempt to reduce to unique paths, reporting if error',
+ )
+ parser.add_argument(
+ '--select',
+ type=str,
+ help='limit cache to a subset of XML files: "power_ctl | multicast-group | ..."',
+ )
args = vars(parser.parse_args())
+ if args['check_xml_consistency']:
+ CHECK_XML_CONSISTENCY = True
+ atexit.register(write_err_buf)
+
xml_dir = abspath(args['xml_dir'])
- l = []
+ d = {}
+
+ select = args['select']
+ if select:
+ select = [item.strip() for item in select.split('|')]
+
+ for fname in sorted(glob.glob(f'{xml_dir}/*.xml')):
+ file = os.path.basename(fname)
+ if not select or os.path.splitext(file)[0] in select:
+ parse_file(fname, d)
- for fname in glob.glob(f'{xml_dir}/*.xml'):
- parse_file(fname, l)
+ d = sort_op_data(d)
- with open(xml_op_tmp, 'w') as f:
- json.dump(l, f, indent=2)
+ if args['check_path_ambiguity']:
+ # when the following passes without error, return value will be the
+ # full dictionary indexed by str, not tuple
+ res, out, err = collapse(d)
+ if not err:
+ with open(op_ref_json, 'w') as f:
+ json.dump(res, f, indent=2)
+ else:
+ print('Found the following duplicate paths:\n')
+ print(out)
+ sys.exit(1)
with open(op_ref_cache, 'w') as f:
- f.write(f'op_reference = {str(l)}')
+ f.write('from vyos.xml_ref.op_definition import NodeData\n')
+ f.write(f'op_reference = {str(d)}')
if __name__ == '__main__':
diff --git a/python/vyos/xml_ref/op_definition.py b/python/vyos/xml_ref/op_definition.py
index 914f3a105..6a8368118 100644
--- a/python/vyos/xml_ref/op_definition.py
+++ b/python/vyos/xml_ref/op_definition.py
@@ -13,37 +13,243 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this library. If not, see <http://www.gnu.org/licenses/>.
-from typing import TypedDict
from typing import TypeAlias
-from typing import Optional
from typing import Union
+from typing import Optional
+from typing import Iterator
+from dataclasses import dataclass
+from dataclasses import field
+from dataclasses import fields
+from dataclasses import asdict
+from itertools import filterfalse
+
+
+@dataclass
+class NodeData:
+ # pylint: disable=too-many-instance-attributes
+ name: str = ''
+ node_type: str = 'node'
+ help_text: str = ''
+ comp_help: dict[str, list] = field(default_factory=dict)
+ command: str = ''
+ standalone_help_text: Optional[str] = None
+ standalone_command: Optional[str] = None
+ path: list[str] = field(default_factory=list)
+ file: str = ''
+ children: list[tuple] = field(default_factory=list)
+
+
+OpKey: TypeAlias = tuple[str, str]
+OpData: TypeAlias = dict[OpKey, Union[NodeData, 'OpData']]
+
+
+def key_name(k: OpKey):
+ return k[0]
+
+
+def key_type(k: OpKey):
+ return k[1]
+
+
+def key_names(l: list): # noqa: E741
+ return list(map(lambda t: t[0], l))
+
+
+def keys_of_name(s: str, l: list): # noqa: E741
+ filter(lambda t: t[0] == s, l)
+
+
+def is_tag_node(t: tuple):
+ return t[1] == 'tagNode'
+
+
+def subdict_of_name(s: str, d: dict) -> dict:
+ res = {}
+ for t, v in d.items():
+ if not isinstance(t, tuple):
+ break
+ if key_name(t) == s:
+ res[t] = v
+
+ return res
+
+
+def next_keys(d: dict) -> list:
+ key_set = set()
+ for k in list(d.keys()):
+ if isinstance(d[k], dict):
+ key_set |= set(d[k].keys())
+ return list(key_set)
+
+
+def tuple_paths(d: dict) -> Iterator[list[tuple]]:
+ def func(d, path):
+ if isinstance(d, dict):
+ if not d:
+ yield path
+ for k, v in d.items():
+ if isinstance(k, tuple) and key_name(k) != '__node_data':
+ for r in func(v, path + [k]):
+ yield r
+ else:
+ yield path
+ else:
+ yield path
+ for r in func(d, []):
+ yield r
-class NodeData(TypedDict):
- node_type: Optional[str]
- help_text: Optional[str]
- comp_help: Optional[dict[str, list]]
- command: Optional[str]
- path: Optional[list[str]]
+def match_tuple_paths(
+ path: list[str], paths: list[list[tuple[str, str]]]
+) -> list[list[tuple[str, str]]]:
+ return list(filter(lambda p: key_names(p) == path, paths))
-PathData: TypeAlias = dict[str, Union[NodeData|list['PathData']]]
+
+def get_node_data(d: dict) -> NodeData:
+ return d.get(('__node_data', None), {})
+
+
+def get_node_data_at_path(d: dict, tpath):
+ if not tpath:
+ return {}
+ # operates on actual paths, not names:
+ if not isinstance(tpath[0], tuple):
+ raise ValueError('must be path of tuples')
+ while tpath and d:
+ d = d.get(tpath[0], {})
+ tpath = tpath[1:]
+
+ return get_node_data(d)
+
+
+def node_data_difference(a: NodeData, b: NodeData):
+ out = ''
+ for fld in fields(NodeData):
+ if fld.name in ('children', 'file'):
+ continue
+ a_fld = getattr(a, fld.name)
+ b_fld = getattr(b, fld.name)
+ if a_fld != b_fld:
+ out += f'prev: {a.file} {a.path} {fld.name}: {a_fld}\n'
+ out += f'new: {b.file} {b.path} {fld.name}: {b_fld}\n'
+ out += '\n'
+
+ return out
+
+
+def collapse(d: OpData, acc: dict = None) -> tuple[dict, str, bool]:
+ err = False
+ inner_err = False
+ out = ''
+ inner_out = ''
+ if acc is None:
+ acc = {}
+ if not isinstance(d, dict):
+ return d
+ for k, v in d.items():
+ if isinstance(k, tuple):
+ name = key_name(k)
+ if name != '__node_data':
+ new_data = get_node_data(v)
+ if name in list(acc.keys()):
+ err = True
+ prev_data = acc[name].get('__node_data', {})
+ if prev_data:
+ out += f'prev: {prev_data["file"]} {prev_data["path"]}\n'
+ else:
+ out += '\n'
+ out += f'new: {new_data.file} {new_data.path}\n\n'
+ else:
+ acc[name] = {}
+ acc[name]['__node_data'] = asdict(new_data)
+ inner, o, e = collapse(v)
+ inner_err |= e
+ inner_out += o
+ acc[name].update(inner)
+ else:
+ name = k
+ acc[name] = v
+
+ err |= inner_err
+ out += inner_out
+
+ return acc, out, err
class OpXml:
def __init__(self):
self.op_ref = {}
- def define(self, op_ref: list[PathData]) -> None:
+ def define(self, op_ref: dict) -> None:
self.op_ref = op_ref
- def _get_op_ref_path(self, path: list[str]) -> list[PathData]:
- def _get_path_list(path: list[str], l: list[PathData]) -> list[PathData]:
- if not path:
- return l
- for d in l:
- if path[0] in list(d):
- return _get_path_list(path[1:], d[path[0]])
- return []
- l = self.op_ref
- return _get_path_list(path, l)
+ def walk(self, func):
+ def walk_op_data(obj, func):
+ if isinstance(obj, dict):
+ for k, v in obj.items():
+ if isinstance(k, tuple):
+ res = func(k, v)
+ yield res
+ yield from walk_op_data(v, func)
+
+ return walk_op_data(self.op_ref, func)
+
+ @staticmethod
+ def get_node_data_func(k, v):
+ if key_name(k) == '__node_data':
+ return v
+ return None
+
+ def walk_node_data(self):
+ return filterfalse(lambda x: x is None, self.walk(self.get_node_data_func))
+
+ def lookup(
+ self, path: list[str], tag_values: bool = False, last_node_type: str = ''
+ ) -> (OpData, list[str]):
+ path = path[:]
+
+ ref_path = []
+
+ def prune_tree(d: dict, p: list[str]):
+ p = p[:]
+ if not d or not isinstance(d, dict) or not p:
+ return d
+ op_data: dict = subdict_of_name(p[0], d)
+ op_keys = list(op_data.keys())
+ ref_path.append(p[0])
+ if len(p) < 2:
+ # check last node_type
+ if last_node_type:
+ keys = list(filter(lambda t: t[1] == last_node_type, op_keys))
+ values = list(map(lambda t: op_data[t], keys))
+ return dict(zip(keys, values))
+ return op_data
+
+ if p[1] not in key_names(next_keys(op_data)):
+ # check if tag_values
+ if tag_values:
+ p = p[2:]
+ keys = list(filter(is_tag_node, op_keys))
+ values = list(map(lambda t: prune_tree(op_data[t], p), keys))
+ return dict(zip(keys, values))
+ return {}
+
+ p = p[1:]
+ op_data = list(map(lambda t: prune_tree(op_data[t], p), op_keys))
+
+ return dict(zip(op_keys, op_data))
+
+ return prune_tree(self.op_ref, path), ref_path
+
+ def lookup_node_data(
+ self, path: list[str], tag_values: bool = False, last_node_type: str = ''
+ ) -> list[NodeData]:
+ res = []
+ d, ref_path = self.lookup(path, tag_values, last_node_type)
+ paths = list(tuple_paths(d))
+ paths = match_tuple_paths(ref_path, paths)
+ for p in paths:
+ res.append(get_node_data_at_path(d, p))
+
+ return res
diff --git a/schema/op-mode-definition.rnc b/schema/op-mode-definition.rnc
index 46430daa4..2fcb2ddd8 100644
--- a/schema/op-mode-definition.rnc
+++ b/schema/op-mode-definition.rnc
@@ -60,6 +60,15 @@ standalone = element standalone
help & command
}
+# Virtual tag nodes provide a way to add a variable argument
+# to a command that also needs fixed arguments,
+# like "show ip route" that can take "show ip route bgp"
+# or a network and arguments after it, like "show ip route 10.0.0.0/8 longer-prefixes"
+virtualTagNode = element virtualTagNode
+{
+ (properties? & children? & command?)
+}
+
# Leaf nodes are terminal configuration nodes that can't have children,
# but can have values.
@@ -69,9 +78,11 @@ leafNode = element leafNode
(command & properties)
}
-# Normal and tag nodes may have children
+# Normal and tag nodes may have children: nodes, leaf nodes, or tag nodes.
+# There can only be one virtual tag node child, though.
children = element children
{
+ (virtualTagNode? & (node | tagNode | leafNode)*) |
(node | tagNode | leafNode)+
}
diff --git a/schema/op-mode-definition.rng b/schema/op-mode-definition.rng
index bfd5cb50a..d7a56c6b2 100644
--- a/schema/op-mode-definition.rng
+++ b/schema/op-mode-definition.rng
@@ -102,6 +102,27 @@
</element>
</define>
<!--
+ Virtual tag nodes provide a way to add a variable argument
+ to a command that also needs fixed arguments,
+ like "show ip route" that can take "show ip route bgp"
+ or a network and arguments after it, like "show ip route 10.0.0.0/8 longer-prefixes"
+ -->
+ <define name="virtualTagNode">
+ <element name="virtualTagNode">
+ <interleave>
+ <optional>
+ <ref name="properties"/>
+ </optional>
+ <optional>
+ <ref name="children"/>
+ </optional>
+ <optional>
+ <ref name="command"/>
+ </optional>
+ </interleave>
+ </element>
+ </define>
+ <!--
Leaf nodes are terminal configuration nodes that can't have children,
but can have values.
-->
@@ -114,16 +135,33 @@
</interleave>
</element>
</define>
- <!-- Normal and tag nodes may have children -->
+ <!--
+ Normal and tag nodes may have children: nodes, leaf nodes, or tag nodes.
+ There can only be one virtual tag node child, though.
+ -->
<define name="children">
<element name="children">
- <oneOrMore>
- <choice>
- <ref name="node"/>
- <ref name="tagNode"/>
- <ref name="leafNode"/>
- </choice>
- </oneOrMore>
+ <choice>
+ <interleave>
+ <optional>
+ <ref name="virtualTagNode"/>
+ </optional>
+ <zeroOrMore>
+ <choice>
+ <ref name="node"/>
+ <ref name="tagNode"/>
+ <ref name="leafNode"/>
+ </choice>
+ </zeroOrMore>
+ </interleave>
+ <oneOrMore>
+ <choice>
+ <ref name="node"/>
+ <ref name="tagNode"/>
+ <ref name="leafNode"/>
+ </choice>
+ </oneOrMore>
+ </choice>
</element>
</define>
<!--
diff --git a/scripts/build-command-op-templates b/scripts/build-command-op-templates
index 9eef25a2f..a2b7c9ddc 100755
--- a/scripts/build-command-op-templates
+++ b/scripts/build-command-op-templates
@@ -3,7 +3,7 @@
# build-command-template: converts new style command definitions in XML
# to the old style (bunch of dirs and node.def's) command templates
#
-# Copyright (C) 2017-2024 VyOS maintainers <maintainers@vyos.net>
+# Copyright (C) 2017-2025 VyOS maintainers <maintainers@vyos.net>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -30,6 +30,8 @@ import functools
from lxml import etree as ET
from textwrap import fill
+debug = True
+
# Defaults
validator_dir = "/opt/vyatta/libexec/validators"
default_constraint_err_msg = "Invalid value"
@@ -177,7 +179,13 @@ def process_node(n, tmpl_dir):
node_type = n.tag
- my_tmpl_dir.append(name)
+ if name:
+ my_tmpl_dir.append(name)
+ else:
+ # Virtual tag nodes have no names,
+ # that's a normal situation.
+ # In that case we create subdirs at the current level.
+ pass
if debug:
print(f"Name of the node: {name};\n Created directory: ", end="")
@@ -234,6 +242,27 @@ def process_node(n, tmpl_dir):
inner_nodes = children.iterfind("*")
for inner_n in inner_nodes:
process_node(inner_n, my_tmpl_dir)
+ elif node_type == "virtualTagNode":
+ # The outer structure is already created
+
+ # Create the inner node.tag part
+ my_tmpl_dir.append("node.tag")
+ os.makedirs(make_path(my_tmpl_dir), exist_ok=True)
+ if debug:
+ print("Created path for the virtualTagNode: {}".format(make_path(my_tmpl_dir)), end="")
+
+ # Not sure if we want partially defined tag nodes, write the file unconditionally
+ nodedef_path = os.path.join(make_path(my_tmpl_dir), "node.def")
+ # Only create the "node.def" file if it exists but is empty, or if it
+ # does not exist at all.
+ if not os.path.exists(nodedef_path) or os.path.getsize(nodedef_path) == 0:
+ with open(nodedef_path, "w") as f:
+ f.write(make_node_def(props, command))
+
+ if children is not None:
+ inner_nodes = children.iterfind("*")
+ for inner_n in inner_nodes:
+ process_node(inner_n, my_tmpl_dir)
elif node_type == "leafNode":
# This is a leaf node
if debug:
diff --git a/src/conf_mode/pki.py b/src/conf_mode/pki.py
index 7d01b6642..6522a3897 100755
--- a/src/conf_mode/pki.py
+++ b/src/conf_mode/pki.py
@@ -144,7 +144,7 @@ def certbot_request(name: str, config: dict, dry_run: bool=True):
# When ACME is used behind a reverse proxy, we always bind to localhost
# whatever the CLI listen-address is configured for.
- if ('haproxy' in dict_search('used_by', config) and
+ if ('used_by' in config and 'haproxy' in config['used_by'] and
is_systemd_service_running(systemd_services['haproxy']) and
not check_port_availability(listen_address, 80)):
tmp += f' --http-01-address 127.0.0.1 --http-01-port {internal_ports["certbot_haproxy"]}'
@@ -551,7 +551,7 @@ def generate(pki):
if not ca_cert_present:
tmp = dict_search_args(pki, 'ca', f'{autochain_prefix}{cert}', 'certificate')
if not bool(tmp) or tmp != cert_chain_base64:
- Message(f'Add/replace automatically imported CA certificate for "{cert}"...')
+ Message(f'Add/replace automatically imported CA certificate for "{cert}" ...')
add_cli_node(['pki', 'ca', f'{autochain_prefix}{cert}', 'certificate'], value=cert_chain_base64)
return None
diff --git a/src/conf_mode/vrf.py b/src/conf_mode/vrf.py
index 6e9d4147a..00a202df4 100755
--- a/src/conf_mode/vrf.py
+++ b/src/conf_mode/vrf.py
@@ -240,7 +240,7 @@ def apply(vrf):
vrf_iface.set_dhcpv6(False)
# Remove nftables conntrack zone map item
- nft_del_element = f'delete element inet vrf_zones ct_iface_map {{ "{tmp}" }}'
+ nft_del_element = f'delete element inet vrf_zones ct_iface_map {{ \'"{tmp}"\' }}'
# Check if deleting is possible first to avoid raising errors
_, err = popen(f'nft --check {nft_del_element}')
if not err:
@@ -320,7 +320,7 @@ def apply(vrf):
state = 'down' if 'disable' in config else 'up'
vrf_if.set_admin_state(state)
# Add nftables conntrack zone map item
- nft_add_element = f'add element inet vrf_zones ct_iface_map {{ "{name}" : {table} }}'
+ nft_add_element = f'add element inet vrf_zones ct_iface_map {{ \'"{name}"\' : {table} }}'
cmd(f'nft {nft_add_element}')
# Only call into nftables as long as there is nothing setup to avoid wasting
diff --git a/src/etc/systemd/system/certbot.service.d/10-override.conf b/src/etc/systemd/system/certbot.service.d/10-override.conf
deleted file mode 100644
index 542f77eb2..000000000
--- a/src/etc/systemd/system/certbot.service.d/10-override.conf
+++ /dev/null
@@ -1,7 +0,0 @@
-[Unit]
-After=
-After=vyos-router.service
-
-[Service]
-ExecStart=
-ExecStart=/usr/bin/certbot renew --config-dir /config/auth/letsencrypt --no-random-sleep-on-renew --post-hook "/usr/libexec/vyos/vyos-certbot-renew-pki.sh"
diff --git a/src/helpers/vyos-load-balancer.py b/src/helpers/vyos-load-balancer.py
index 30329fd5c..5852dcdf4 100755
--- a/src/helpers/vyos-load-balancer.py
+++ b/src/helpers/vyos-load-balancer.py
@@ -246,6 +246,7 @@ if __name__ == '__main__':
# Main loop
+ init = True;
try:
while True:
ip_change = False
@@ -273,6 +274,11 @@ if __name__ == '__main__':
if state_changed and state['failure_count'] >= int(health_conf['failure_count']):
state['state'] = False
state['state_changed'] = True
+
+ #Force state changed to trigger the first write
+ if init == True:
+ state['state_changed'] = True
+ init = False
if state['state_changed']:
state['if_addr'] = get_ipv4_address(ifname)
diff --git a/src/op_mode/load-balancing_wan.py b/src/op_mode/load-balancing_wan.py
index 9fa473802..e1e2e8109 100755
--- a/src/op_mode/load-balancing_wan.py
+++ b/src/op_mode/load-balancing_wan.py
@@ -62,7 +62,7 @@ def _get_formatted_output(raw_data):
change_dt = datetime.fromtimestamp(latest_change) if latest_change > 0 else None
success_dt = datetime.fromtimestamp(if_data['last_success']) if if_data['last_success'] > 0 else None
failure_dt = datetime.fromtimestamp(if_data['last_failure']) if if_data['last_failure'] > 0 else None
- now = datetime.utcnow()
+ now = datetime.fromtimestamp(time.time())
fmt_data = {
'ifname': ifname,
diff --git a/src/op_mode/pki.py b/src/op_mode/pki.py
index 49a461e9e..d928bd325 100755
--- a/src/op_mode/pki.py
+++ b/src/op_mode/pki.py
@@ -1373,6 +1373,21 @@ def show_all(raw: bool):
print('\n')
show_crl(raw)
+def renew_certbot(raw: bool, force: typing.Optional[bool] = False):
+ from vyos.defaults import directories
+
+ certbot_config = directories['certbot']
+ hook_dir = directories['base']
+
+ tmp = f'/usr/bin/certbot renew --no-random-sleep-on-renew ' \
+ f'--config-dir "{certbot_config}" ' \
+ f'--post-hook "{hook_dir}/vyos-certbot-renew-pki.sh"'
+ if force:
+ tmp += ' --force-renewal'
+
+ out = cmd(tmp)
+ if not raw:
+ print(out)
if __name__ == '__main__':
try:
diff --git a/src/services/vyos-commitd b/src/services/vyos-commitd
index e7f2d82c7..d67b44931 100755
--- a/src/services/vyos-commitd
+++ b/src/services/vyos-commitd
@@ -42,6 +42,7 @@ from vyos.defaults import directories
from vyos.utils.boot import boot_configuration_complete
from vyos.configsource import ConfigSourceCache
from vyos.configsource import ConfigSourceError
+from vyos.configdiff import get_commit_scripts
from vyos.config import Config
from vyos.frrender import FRRender
from vyos.frrender import get_frrender_dict
@@ -230,6 +231,9 @@ def initialization(session: Session) -> Session:
dependent_func: dict[str, list[typing.Callable]] = {}
setattr(config, 'dependent_func', dependent_func)
+ commit_scripts = get_commit_scripts(config)
+ logger.debug(f'commit_scripts: {commit_scripts}')
+
scripts_called = []
setattr(config, 'scripts_called', scripts_called)