(role)
| 8447 | } |
| 8448 | const [cls, label] = _BGP_VERDICT_STYLE[d.verdict] || _BGP_VERDICT_STYLE.unknown; |
| 8449 | let html = `<div class="mb-2 px-3 py-2 rounded border ${cls} text-sm">${label}</div>`; |
| 8450 | html += `<p class="text-xs text-gray-500 mb-2">Interface: ${escapeHtml(d.interface || '—')} · ${d.seconds}s · ${d.messages} BGP msgs (${d.updates} UPDATE @ ${d.update_per_s}/s, ${d.notifications} NOTIFICATION) · ${d.prefix_total} prefixes${d.learned ? ' · <span class="text-gray-400">baseline learned now</span>' : ''}</p>`; |
| 8451 | if (d.note) html += `<p class="text-xs text-gray-500 mb-2">${escapeHtml(d.note)}</p>`; |
| 8452 | if (d.enrich_note) html += `<p class="text-xs text-gray-500 mb-2">${escapeHtml(d.enrich_note)}</p>`; |
| 8453 | const asnNames = d.asn_names || {}; |
| 8454 | if (d.peers && d.peers.length) { |
| 8455 | const tp = d.trusted_peers || []; |
| 8456 | html += `<p class="text-xs mb-1 text-gray-400">Peers: ` + |
| 8457 | d.peers.map(a => { |
| 8458 | const nm = asnNames[a] ? ` <span class="text-gray-500">(${escapeHtml(asnNames[a])})</span>` : ''; |
| 8459 | return `<span class="font-mono ${tp.length && tp.indexOf(a) < 0 ? 'text-amber-300' : 'text-gray-200'}">AS${a}</span>${nm}`; |
| 8460 | }).join(', ') + |
| 8461 | ` · TCP-MD5: <span class="${d.md5 ? 'text-green-400' : 'text-amber-300'}">${d.md5 ? 'yes' : 'not seen'}</span></p>`; |
| 8462 | } |
| 8463 | (d.advisories || []).forEach(a => { |
no outgoing calls
no test coverage detected