Verweise mit IP statt Hostnamen
Auf dem Proxmox-Host loest der Node-Name auf, am Arbeitsplatz meist nicht -
und dann ist der noVNC-Verweis wertlos. Die Adresse kommt jetzt aus
/etc/pve/.members (lokale Datei, kein API-Aufruf); ist dort nichts zu finden,
bleibt es beim Namen.
vorher https://pvetest01:8006/?console=kvm&novnc=1&vmid=102&node=pvetest01
nachher https://172.0.4.1:8006/?console=kvm&novnc=1&vmid=102&node=pvetest01
Der Node bleibt als Name im Verweis stehen - so erwartet Proxmox ihn.
Dasselbe betraf zwei weitere Stellen: den scp-Hinweis beim SPICE-Befehl und
den proxy-Eintrag in der .vv-Datei. Letzterer trug ebenfalls den Hostnamen,
womit auch remote-viewer nicht durchgekommen waere. Die TLS-Pruefung laeuft
ueber "host-subject" und bleibt davon unberuehrt.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
2c2ed79c76
commit
1f668568d1
+39
-1
@@ -63,6 +63,30 @@ DROP_KEYS = {
|
||||
"replicate", "vmstate", "runningmachine", "runningcpu",
|
||||
}
|
||||
|
||||
# Node-Adressen: die Namensaufloesung klappt auf dem Arbeitsplatz haeufig
|
||||
# nicht, auf dem Proxmox-Host dagegen schon. Ein Link mit Hostnamen ist dann
|
||||
# unbrauchbar - deshalb wird die IP eingesetzt.
|
||||
_ADDRESSES = {}
|
||||
|
||||
|
||||
def node_address(node):
|
||||
"""IP-Adresse eines Nodes; faellt auf den Namen zurueck."""
|
||||
node = str(node or "")
|
||||
if not node:
|
||||
return node
|
||||
if not _ADDRESSES:
|
||||
try:
|
||||
with open("/etc/pve/.members", "r", encoding="utf-8") as handle:
|
||||
data = json.load(handle)
|
||||
for name, entry in (data.get("nodelist") or {}).items():
|
||||
if entry.get("ip"):
|
||||
_ADDRESSES[name] = entry["ip"]
|
||||
except (OSError, ValueError, AttributeError) as exc:
|
||||
log.debug("/etc/pve/.members nicht lesbar: %s", exc)
|
||||
_ADDRESSES["-"] = "-" # nicht bei jedem Aufruf erneut versuchen
|
||||
return _ADDRESSES.get(node) or node
|
||||
|
||||
|
||||
class RecoveryError(Exception):
|
||||
"""Eine Wiederherstellung liess sich nicht einrichten."""
|
||||
|
||||
@@ -520,9 +544,11 @@ class Instance:
|
||||
self.source, self.snapshot)
|
||||
|
||||
def console_url(self, host=None):
|
||||
"""noVNC-Adresse. Der Node steht als Name im Verweis - das erwartet
|
||||
Proxmox so -, die Adresse davor aber als IP."""
|
||||
kind = "lxc" if self.type == "lxc" else "kvm"
|
||||
return ("https://%s:8006/?console=%s&novnc=1&vmid=%d&node=%s&resize=off&cmd="
|
||||
% (host or self.node, kind, self.vmid, self.node))
|
||||
% (host or node_address(self.node), kind, self.vmid, self.node))
|
||||
|
||||
def to_dict(self):
|
||||
return {k: getattr(self, k) for k in
|
||||
@@ -1190,6 +1216,18 @@ def spice_file(proxmox, instance):
|
||||
"%s liefert keine SPICE-Verbindung. Laeuft die Maschine, und ist "
|
||||
"die SPICE-Anzeige eingeschaltet (vga: qxl)?" % instance.label)
|
||||
|
||||
# Derselbe Grund wie beim noVNC-Verweis: der Proxy-Eintrag traegt den
|
||||
# Hostnamen des Nodes, und wenn der Arbeitsplatz ihn nicht aufloest,
|
||||
# kommt keine Verbindung zustande. Die TLS-Pruefung laeuft ueber
|
||||
# "host-subject", nicht ueber diesen Namen - die bleibt also gueltig.
|
||||
address = node_address(instance.node)
|
||||
proxy = str(data.get("proxy") or "")
|
||||
if address != instance.node and proxy:
|
||||
for name in (instance.node, "%s." % instance.node):
|
||||
if name in proxy:
|
||||
data["proxy"] = re.sub(r"//[^:/]+", "//" + address, proxy, count=1)
|
||||
break
|
||||
|
||||
lines = ["[virt-viewer]"]
|
||||
for key in _VV_KEYS:
|
||||
if key in data and data[key] not in (None, ""):
|
||||
|
||||
Reference in New Issue
Block a user