Update core scanner, parser, SSH client, and UI

This commit is contained in:
2026-05-05 20:07:24 +00:00
parent 40d4679a59
commit d32ca80a22
6 changed files with 313 additions and 79 deletions
+25 -1
View File
@@ -169,6 +169,9 @@ var Xr=function(e){if(!(this instanceof Xr))return new Xr(e);this.id="Thenable/1
}
.btn-primary:hover { background: #3a7de8; }
.btn-primary:disabled { background: var(--surface2); color: var(--text-dim); cursor: not-allowed; }
.btn-danger { background: #c0392b; color: white; }
.btn-danger:hover { background: #e74c3c; }
.btn-danger:disabled { background: var(--surface2); color: var(--text-dim); cursor: not-allowed; }
.btn-sm {
padding: 5px 10px;
@@ -435,6 +438,12 @@ var Xr=function(e){if(!(this instanceof Xr))return new Xr(e);this.id="Thenable/1
<svg width="14" height="14" fill="none" stroke="currentColor" stroke-width="2.5" viewBox="0 0 24 24"><path d="M12 2C6 2 2 7 2 12s4 10 10 10 10-4.5 10-10S18 2 12 2zm0 4c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm4 12H8v-1c0-2.7 5.3-4 8-4v5z"/></svg>
Scan GW
</button>
<button class="btn btn-danger" id="clearScanBtn" onclick="clearAndRescan()">
<svg width="14" height="14" fill="none" stroke="currentColor" stroke-width="2.5" viewBox="0 0 24 24">
<polyline points="3 6 5 6 21 6"/><path d="M19 6l-1 14H6L5 6"/><path d="M10 11v6m4-6v6"/><path d="M9 6V4h6v2"/>
</svg>
Clear &amp; Rescan
</button>
</div>
</header>
@@ -724,9 +733,13 @@ function showNodeDetail(data) {
<span class="detail-val">${data.chassis_id || '—'}</span>
</div>
<div class="detail-row">
<span class="detail-key">Description</span>
<span class="detail-key">Model</span>
<span class="detail-val">${data.description || '—'}</span>
</div>
<div class="detail-row">
<span class="detail-key">Firmware</span>
<span class="detail-val">${data.firmware || '—'}</span>
</div>
<div class="detail-row">
<span class="detail-key">Last Seen</span>
<span class="detail-val">${data.last_seen || '—'}</span>
@@ -793,6 +806,15 @@ async function clearLayout() {
await fetch('/api/layout', { method: 'DELETE' });
alert('Layout cleared.');
}
async function clearAndRescan() {
if (!confirm('This will delete all switch and link data, then run a full scan. Continue?')) return;
const btn = document.getElementById('clearScanBtn');
btn.disabled = true;
const res = await fetch('/api/scan/clear', { method: 'POST' });
if (res.status === 409) { alert('Scan already running'); btn.disabled = false; return; }
startPolling();
}
async function triggerScan(dept) {
const url = dept === 'elec' ? '/api/scan/elec'
: dept === 'gw' ? '/api/scan/gw'
@@ -823,6 +845,7 @@ async function pollStatus() {
scanBtn.disabled = true;
document.getElementById('scanElecBtn').disabled = true;
document.getElementById('scanGwBtn').disabled = true;
document.getElementById('clearScanBtn').disabled = true;
progressWrap.classList.add('visible');
statusBar.classList.add('visible');
@@ -848,6 +871,7 @@ async function pollStatus() {
scanBtn.disabled = false;
document.getElementById('scanElecBtn').disabled = false;
document.getElementById('scanGwBtn').disabled = false;
document.getElementById('clearScanBtn').disabled = false;
progressBar.style.width = '100%';
setTimeout(() => {
progressWrap.classList.remove('visible');