feat(satellite): der Satelliten-Rechner steht selbst mit in der Geraeteliste
Der Satellit laeuft auf einem ganz normalen Rechner — bei Stefan auf duffy-desktop. Dort laufen typischerweise noch andere Dienste (FreeCAD-MCP, Web-App, Dateiserver). Bisher war ausgerechnet dieser Rechner unsichtbar: man findet sich nicht per mDNS/ARP selbst. Er erscheint jetzt als normales Geraet — ansprechbar wie jedes andere, nur zusaetzlich mit 🛰️ markiert und blau abgesetzt, damit klar ist, dass dort der Satellit traegt. Abschaltbar ueber LIST_SELF=false, falls man den Traeger bewusst heraushalten will. Nebeneffekt, der ein echtes Problem loest: der eigene Rechner gilt damit als "gefunden" und ist ohne Eintrag in TUNNEL_ALLOW tunnelbar. Genau der Fall, um den es ging — der FreeCAD-MCP laeuft auf dem Satelliten-Host selbst. Beim Zusammenfuehren bleibt die Markierung erhalten: findet mDNS denselben Rechner nochmal, haette der Merge isSatellite sonst verschluckt. hostname kommt aus demselben Grund mit in die erhaltenen Felder. Dazu ein ✎-Knopf pro Geraet in der Diagnostic: Namen vergeben, damit ARIA "duffy-desktop" ansprechen kann statt einer IP. Der Name haengt an der MAC und ueberlebt einen DHCP-Wechsel. 8 Pruefungen: Selbst-Eintrag vollstaendig, Markierung ueberlebt den Merge, mDNS-Infos bleiben erhalten, eigener Rechner ohne TUNNEL_ALLOW erlaubt, fremde IP weiterhin blockiert. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+34
-4
@@ -5378,6 +5378,20 @@
|
||||
renderSatellites();
|
||||
send({ action: 'sat_discover', satellite: id });
|
||||
}
|
||||
|
||||
/** Geraetenamen vergeben. Danach kann ARIA das Geraet so ansprechen
|
||||
* ("mach mir Port 5000 von duffy-desktop auf") statt ueber eine IP.
|
||||
* Gespeichert wird an der MAC — ein IP-Wechsel per DHCP verliert den
|
||||
* Namen dann nicht. */
|
||||
function renameSatDevice(satId, mac, ip, current) {
|
||||
const name = prompt(
|
||||
'Name für ' + (ip || mac) + '\n\n'
|
||||
+ 'ARIA spricht das Gerät danach so an. Leer lassen = Namen entfernen.',
|
||||
current || '');
|
||||
if (name === null) return; // abgebrochen
|
||||
send({ action: 'sat_name_set', satellite: satId, mac: mac, ip: ip, name: name.trim() });
|
||||
setTimeout(() => scanSatellite(satId), 400);
|
||||
}
|
||||
function renderSatellites() {
|
||||
const box = document.getElementById('sat-list');
|
||||
if (!box) return;
|
||||
@@ -5409,6 +5423,12 @@
|
||||
if (d.adbCapable) tags.push('ADB');
|
||||
if (d.mac) tags.push(escapeHtml(d.mac));
|
||||
const tagStr = tags.length ? ' <span style="color:#666;">(' + tags.join(' · ') + ')</span>' : '';
|
||||
// Namen vergeben — danach ist das Geraet fuer ARIA ansprechbar
|
||||
// ("duffy-desktop" statt einer IP).
|
||||
const nameBtn = (d.ip || d.mac) ? '<button class="btn secondary" title="Namen vergeben — ARIA kann das Gerät dann so ansprechen" ' +
|
||||
'onclick="renameSatDevice(\'' + escapeHtml(s.id) + '\',\'' + escapeHtml(d.mac || '') + '\',\'' +
|
||||
escapeHtml(d.ip || '') + '\',\'' + escapeHtml(d.name || '') + '\')" ' +
|
||||
'style="padding:1px 6px;font-size:11px;margin-left:6px;">✎</button>' : '';
|
||||
const hasCreds = d.ip && (satCreds[s.id] || {})[d.ip] && (satCreds[s.id][d.ip] || []).length;
|
||||
const keyBtn = d.ip ? '<button class="btn secondary" title="Zugangsdaten (SNMP / HTTP / FritzBox)" ' +
|
||||
'onclick="openDeviceCreds(\'' + escapeHtml(s.id) + '\',\'' + escapeHtml(d.ip) + '\',\'' + escapeHtml(d.name || d.ip) + '\')" ' +
|
||||
@@ -5418,12 +5438,22 @@
|
||||
const apkBtn = canAdb ? '<button class="btn secondary" title="ARIA-Agent (APK) auf dieses Gerät ausrollen" ' +
|
||||
'onclick="openApkDeploy(\'' + escapeHtml(s.id) + '\',\'' + escapeHtml(d.ip) + '\',\'' + escapeHtml(d.name || d.ip) + '\')" ' +
|
||||
'style="padding:1px 6px;font-size:11px;margin-left:6px;">📦</button>' : '';
|
||||
return '<div style="padding:3px 6px;background:#0D0D1A;border-radius:4px;display:flex;align-items:center;">' +
|
||||
'<div style="flex:1;min-width:0;">' +
|
||||
'<span style="color:#E0E0F0;">' + escapeHtml(d.name || d.id || '?') + '</span> ' +
|
||||
// Der Rechner, auf dem der Satellit selbst laeuft. Er ist ein
|
||||
// Host wie jeder andere (und oft der interessanteste — dort
|
||||
// laufen meist noch weitere Dienste), nur eben zusaetzlich
|
||||
// Traeger des Satelliten. Darum normal auflisten + markieren.
|
||||
const satBadge = d.isSatellite
|
||||
? '<span title="Auf diesem Rechner läuft der Satellit selbst" ' +
|
||||
'style="margin-right:5px;">🛰️</span>'
|
||||
: '';
|
||||
const rowBg = d.isSatellite ? '#111426' : '#0D0D1A';
|
||||
const rowBorder = d.isSatellite ? ';border-left:2px solid #0096FF' : '';
|
||||
return '<div style="padding:3px 6px;background:' + rowBg + ';border-radius:4px;display:flex;align-items:center' + rowBorder + ';">' +
|
||||
'<div style="flex:1;min-width:0;">' + satBadge +
|
||||
'<span style="color:#E0E0F0;">' + escapeHtml(d.name || d.hostname || d.id || '?') + '</span> ' +
|
||||
'<span style="color:#0096FF;">[' + escapeHtml(d.type || '?') + ']</span> ' +
|
||||
'<span style="color:#8888AA;">' + escapeHtml(d.ip || '') + '</span>' + tagStr +
|
||||
'</div>' + keyBtn + apkBtn +
|
||||
'</div>' + nameBtn + keyBtn + apkBtn +
|
||||
'</div>';
|
||||
}).join('') + '</div>';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user