(interfaceName)
| 8818 | out.innerHTML = html; |
| 8819 | } catch (e) { |
| 8820 | out.innerHTML = '<p class="text-sm text-red-400">Failed: ' + escapeHtml(e.message) + '</p>'; |
| 8821 | } finally { |
| 8822 | _ndBusy(btn, false); |
| 8823 | } |
| 8824 | } |
| 8825 | async function eigrpTrustBaseline() { |
| 8826 | try { |
| 8827 | await postAPI('/api/net/eigrp-baseline', { action: 'reset' }); |
| 8828 | addConsoleMessage('EIGRP baseline reset — re-learning current routers & prefixes', 'info'); |
| 8829 | await runEigrpWatch(); |
| 8830 | } catch (e) { |
| 8831 | addConsoleMessage('Failed to reset EIGRP baseline: ' + e.message, 'error'); |
| 8832 | } |
| 8833 | } |
| 8834 | |
| 8835 | // ---- FHRP Watch (passive HSRP/VRRP/GLBP/CARP hijack scanner) ---------------- |
| 8836 | const _FHRP_VERDICT_STYLE = { |
| 8837 | clean: ['bg-green-950/40 border-green-900 text-green-400', '✓ FHRP groups/speakers/GLBP forwarders match the trusted baseline'], |
| 8838 | 'weak-auth': ['bg-amber-950/50 border-amber-800 text-amber-300', '⚠ Weak / no FHRP authentication — a forged hello can win the election'], |
| 8839 | 'glbp-weight-skew': ['bg-amber-950/50 border-amber-800 text-amber-300', '⚠ GLBP forwarder weight changed — load-share shift steers which hosts route through an AVF'], |
| 8840 | 'priority-change': ['bg-amber-950/50 border-amber-800 text-amber-300', '⚠ A known FHRP speaker raised its priority — possible pre-takeover'], |
no test coverage detected