Decouple cutover HF from portrait and tighten ops UI.

Portrait stays on biz-monitor; cutover create/ensure owns purpose=cutover_hf slots with project collect override, multi-interval bindings, window pause, and industrial detail UX. Also expand ZTE collect/config parsers and TextFSM for route/BGP/L2VPN/VRRP coverage.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-09-19 21:11:31 +08:00
parent a65c9fc420
commit 285c19e5a3
67 changed files with 9510 additions and 723 deletions

View file

@ -9,6 +9,16 @@ zte/zte_zxros_show_interface.textfsm, .*, zte_zxros, sh[[ow]] int[[erface]] .+
zte/zte_zxros_show_ip_vrf.textfsm, .*, zte_zxros, sh[[ow]] ip vrf$
zte/zte_zxros_show_arp.textfsm, .*, zte_zxros, sh[[ow]] arp
zte/zte_zxros_show_running_config_if_intf.textfsm, .*, zte_zxros, sh[[ow]] run[[ning-config]] if-intf
zte/zte_zxros_show_bgp_summary.textfsm, .*, zte_zxros, sh[[ow]] bgp .+ sum[[mary]]
zte/zte_zxros_show_ospf_neighbor.textfsm, .*, zte_zxros, sh[[ow]] ip ospf nei[[ghbor]]
zte/zte_zxros_show_vrrp_brief.textfsm, .*, zte_zxros, sh[[ow]] vrrp .+ br[[ief]]
zte/zte_zxros_show_opticalinfo_brief.textfsm, .*, zte_zxros, sh[[ow]] opticalinfo br[[ief]]
zte/zte_zxros_show_bgp_neighbor_routes.textfsm, .*, zte_zxros, sh[[ow]] bgp .+ nei[[ghbor]] (in|out)
zte/zte_zxros_show_ip_forwarding_route.textfsm, .*, zte_zxros, sh[[ow]] ip forw[[arding]] rou[[te]]
zte/zte_zxros_show_ipv6_forwarding_route.textfsm, .*, zte_zxros, sh[[ow]] ipv6 forw[[arding]] rou[[te]]
zte/zte_zxros_show_l2vpn_forwardinfo.textfsm, .*, zte_zxros, sh[[ow]] l2vpn forw[[ardinfo]]
zte/zte_zxros_show_mac_l2vpn.textfsm, .*, zte_zxros, sh[[ow]] mac l2vpn
zte/zte_zxros_show_bgp_evpn_mac.textfsm, .*, zte_zxros, sh[[ow]] bgp evpn mac
# --- cisco ---
cisco/cisco_ios_show_interfaces.textfsm, .*, cisco_ios, sh[[ow]] int[[erfaces]] .+

View file

@ -0,0 +1,23 @@
Value NETWORK (\S+)
Value NEXT_HOP (\S+)
Value METRIC (\S*)
Value LOC_PRF (\S*)
Value RT_PRF (\S*)
Value PATH (.*)
Start
^\s*Network\s+Next\s+Hop -> Routes
^Status\s+codes
^Origin\s+codes
^Route\s+Distinguisher
^\s*$$
^.* -> Start
Routes
^Route\s+Distinguisher
^\s*\*?\s*>?\s*${NETWORK}\s+${NEXT_HOP}\s+${METRIC}\s+${LOC_PRF}\s+${RT_PRF}\s+${PATH}\s*$$ -> Record
^\s*\*?\s*>?\s*${NETWORK}\s+${NEXT_HOP}\s+${PATH}\s*$$ -> Record
^\s*$$
^\S+\s*#\s*$$ -> End
^.*#\s*$$ -> End
^.* -> Routes

View file

@ -0,0 +1,29 @@
Value NETWORK (\S+)
Value NEXT_HOP (\S+)
Value METRIC (\S*)
Value LOC_PRF (\S*)
Value TAG (\S*)
Value PATH (.*)
Start
^Routes\s+(Learned|Sent) -> Routes
^\s*\*?\s*Network -> Routes
^Network\s+ -> Routes
^\s*$$
^.* -> Start
Routes
^Route\s+Distinguisher
^Status\s+codes
^Origin\s+codes
^Total\s+number
^\s+Valid
^\s+Invalid
^Local\s+router
^Remote\s+router
^\s*\*?\s*>?\s*${NETWORK}\s+${NEXT_HOP}\s+${METRIC}\s+${LOC_PRF}\s+${TAG}\s+${PATH}\s*$$ -> Record
^\s*\*?\s*>?\s*${NETWORK}\s+${NEXT_HOP}\s+${PATH}\s*$$ -> Record
^\s*$$
^\S+\s*#\s*$$ -> End
^.*#\s*$$ -> End
^.* -> Routes

View file

@ -0,0 +1,22 @@
Value NEIGHBOR (\S+)
Value VER (\d+)
Value ASN (\S+)
Value MSG_RCVD (\d+)
Value MSG_SEND (\d+)
Value UP_DOWN (\S+)
Value STATE_PFX (\S+)
Start
^Neighbor\s+Ver\s+As -> Peers
^\s*$$
^.* -> Start
Peers
^${NEIGHBOR}\s+${VER}\s+${ASN}\s+${MSG_RCVD}\s+${MSG_SEND}\s+${UP_DOWN}\s+${STATE_PFX}\s*$$ -> Record
^All\s+
^BGP\s+
^Local\s+
^\s*$$
^\S+\s*#\s*$$ -> End
^.*#\s*$$ -> End
^.* -> Peers

View file

@ -1,7 +1,11 @@
Value Filldown IFNAME (\S+)
Value Filldown ADMIN_OPER (up|down)
Value Filldown ADMIN_STATE ((?:administratively\s+)?(?:up|down))
Value Filldown IFINDEX (\d+)
Value Filldown DESCRIPTION (.+?)
Value Filldown PORT_MEDIA (\S+)
Value Filldown NEGOTIATION (\S+)
Value Filldown BW_RAW (\d+(?:\.\d+)?\s*[kKmMgGtT]?\s*(?:G?bit|bit)/s(?:ec)?)
Value Filldown MTU (\d+)
Value Filldown RATE_PERIOD (\d+)
Value Filldown INPUT_BPS ([\d.]+)
Value Filldown OUTPUT_BPS ([\d.]+)
@ -9,9 +13,12 @@ Value IN_UTIL ([\d.]+)
Value OUT_UTIL ([\d.]+)
Start
^${IFNAME}\s+is\s+${ADMIN_OPER}\b
^${IFNAME}\s+is\s+${ADMIN_STATE}(?:,\s*ifindex:\s*${IFINDEX})?
^\s*Description:\s*${DESCRIPTION}\s*$$
^\s*The\s+port\s+is\s+${PORT_MEDIA}
^\s*Negotiation\s+${NEGOTIATION}
^\s*BW\s+${BW_RAW}
^\s*MTU\s+${MTU}\s+bytes
^\s*Rate\s+period\s*:\s*${RATE_PERIOD}\s*s -> Rates
^\s*$$
^.* -> Start
@ -20,11 +27,13 @@ Rates
^\s*Input\s*:\s*${INPUT_BPS}\s*bit/s
^\s*Output\s*:\s*${OUTPUT_BPS}\s*bit/s
^\s*Peak\s+rate: -> AfterPeak
^\s*Intf\s+utilization:\s*input\s*${IN_UTIL}%\s+output\s*${OUT_UTIL}% -> Record
^\s*Intf\s+utilization:\s*input\s*${IN_UTIL}%\s+output\s*${OUT_UTIL}% -> Record Start
^${IFNAME}\s+is\s+${ADMIN_STATE}(?:,\s*ifindex:\s*${IFINDEX})? -> Clearall Start
^\s*$$
^.* -> Rates
AfterPeak
^\s*Intf\s+utilization:\s*input\s*${IN_UTIL}%\s+output\s*${OUT_UTIL}% -> Record
^\s*Intf\s+utilization:\s*input\s*${IN_UTIL}%\s+output\s*${OUT_UTIL}% -> Record Start
^${IFNAME}\s+is\s+${ADMIN_STATE}(?:,\s*ifindex:\s*${IFINDEX})? -> Clearall Start
^\s*$$
^.* -> AfterPeak

View file

@ -0,0 +1,23 @@
Value FLAGS (\S*)
Value DEST (\S+)
Value GATEWAY (\S+)
Value INTERFACE (\S+)
Value OWNER (\S+)
Value PRI (\S+)
Value METRIC (\S+)
Start
^\s*Dest\s+Gw -> Entries
^Headers:
^Codes
^Status\s+codes
^\s*$$
^.* -> Start
Entries
^\s*${FLAGS}\s*${DEST}\s+${GATEWAY}\s+${INTERFACE}\s+${OWNER}\s+${PRI}\s+${METRIC}\s*$$ -> Record
^\s*${DEST}\s+${GATEWAY}\s+${INTERFACE}\s+${OWNER}\s+${PRI}\s+${METRIC}\s*$$ -> Record
^\s*$$
^\S+\s*#\s*$$ -> End
^.*#\s*$$ -> End
^.* -> Entries

View file

@ -1,6 +1,7 @@
Value Required NAME (\S+)
Value RD (\S+)
Value INTERFACES (.*)
Value PROTOCOLS (\S+)
Value VRF_ID (\d+)
Start
^Name\s+Default\s+RD -> Records
@ -10,7 +11,8 @@ Start
^.* -> Start
Records
^${NAME}\s+${RD}\s+${INTERFACES}\s*$$ -> Record
^${NAME}\s+${RD}\s+${PROTOCOLS}\s+${VRF_ID}\s*$$ -> Record
^${NAME}\s+${RD}\s+${PROTOCOLS}\s*$$ -> Record
^${NAME}\s+${RD}\s*$$ -> Record
^${NAME}\s*$$ -> Record
^-+

View file

@ -0,0 +1,23 @@
Value DEST (\S+)
Value OWNER (\S+)
Value PRI (\S+)
Value METRIC (\S+)
Value FLAGS (\S*)
Value GATEWAY (\S+)
Value INTERFACE (\S+)
Start
^Headers:
^Codes
^Flag\s+codes
^\s*Dest -> Entries
^\s*$$
^.* -> Start
Entries
^\s*${DEST}\s+${OWNER}\s+${PRI}\s+${METRIC}\s+${FLAGS}\s*$$ -> Record
^\s+${GATEWAY},${INTERFACE}\s*$$ -> Record
^\s*$$
^\S+\s*#\s*$$ -> End
^.*#\s*$$ -> End
^.* -> Entries

View file

@ -0,0 +1,23 @@
Value PW_NAME (\S+)
Value PEER (\S+)
Value FEC (\S+)
Value PW_TYPE (\S+)
Value STATE (\S+)
Value LLABEL (\S+)
Value RLABEL (\S+)
Value VPN_OWNER (\S+)
Start
^PWName\s+PeerIP -> Entries
^PW\s+count
^Headers:
^Codes
^\s*$$
^.* -> Start
Entries
^${PW_NAME}\s+${PEER}\s+${FEC}\s+${PW_TYPE}\s+${STATE}\s+${LLABEL}\s+${RLABEL}\s+${VPN_OWNER}\s*$$ -> Record
^\s*$$
^\S+\s*#\s*$$ -> End
^.*#\s*$$ -> End
^.* -> Entries

View file

@ -0,0 +1,19 @@
Value MAC (\S+)
Value VPN (\S+)
Value VLAN (\S+)
Value OUTGOING (.*)
Value ATTRIBUTE (\S+)
Start
^MAC\s+VPN -> Entries
^Total\s+MAC
^Headers:
^\s*$$
^.* -> Start
Entries
^${MAC}\s+${VPN}\s+${VLAN}\s+${OUTGOING}\s+${ATTRIBUTE}\s*$$ -> Record
^\s*$$
^\S+\s*#\s*$$ -> End
^.*#\s*$$ -> End
^.* -> Entries

View file

@ -0,0 +1,18 @@
Value INTERFACE (\S+)
Value OPTIC_TYPE (\S+)
Value WAVELENGTH (\S+)
Value RX_POWER (\S+)
Value TX_POWER (\S+)
Value STATUS (\S+)
Start
^Interface\s+Type -> Entries
^\s*$$
^.* -> Start
Entries
^${INTERFACE}\s+${OPTIC_TYPE}\s+${WAVELENGTH}\s+${RX_POWER}\s+${TX_POWER}\s+${STATUS}(?:\s+\S+)?\s*$$ -> Record
^\s*$$
^\S+\s*#\s*$$ -> End
^.*#\s*$$ -> End
^.* -> Entries

View file

@ -0,0 +1,23 @@
Value Filldown PROCESS_ID (\d+)
Value Required NEIGHBOR_ID (\S+)
Value PRI (\S+)
Value STATE (\S+)
Value DEAD_TIME (\S+)
Value ADDRESS (\S+)
Value INTERFACE (\S+)
Start
^\s*OSPF\s+Router\s+with\s+ID\s+\S+\s+\(Process\s+ID\s+${PROCESS_ID}\) -> Neighbors
^Neighbor\s+ID -> Neighbors
^\s*$$
^.* -> Start
Neighbors
^\s*OSPF\s+Router\s+with\s+ID\s+\S+\s+\(Process\s+ID\s+${PROCESS_ID}\) -> Neighbors
^Neighbor\s+ID
^Codes:
^${NEIGHBOR_ID}\s+${PRI}\s+${STATE}\s+${DEAD_TIME}\s+${ADDRESS}\s+${INTERFACE}\s*$$ -> Record
^\s*$$
^\S+\s*#\s*$$ -> End
^.*#\s*$$ -> End
^.* -> Neighbors

View file

@ -0,0 +1,21 @@
Value INTERFACE (\S+)
Value VR_ID (\S+)
Value PRIORITY (\S+)
Value TIME (\S+)
Value FLAGS (\S*)
Value STATE (\S+)
Value MASTER_ADDR (\S+)
Value VROUTER_ADDR (\S+)
Start
^Interface\s+vrID -> Entries
^\s*$$
^.* -> Start
Entries
^${INTERFACE}\s+${VR_ID}\s+${PRIORITY}\s+${TIME}\s+${FLAGS}\s+${STATE}\s+${MASTER_ADDR}\s+${VROUTER_ADDR}\s*$$ -> Record
^${INTERFACE}\s+${VR_ID}\s+${PRIORITY}\s+${TIME}\s+${STATE}\s+${MASTER_ADDR}\s+${VROUTER_ADDR}\s*$$ -> Record
^\s*$$
^\S+\s*#\s*$$ -> End
^.*#\s*$$ -> End
^.* -> Entries