SPICE und USB lassen sich nachtraeglich einstellen
Bisher liess sich beides nur beim Anlegen waehlen. Wer erst spaeter merkt, dass
er den Dongle braucht, musste die Maschine wegwerfen und neu bauen. Jetzt geht
es in der Detailansicht auf Taste p, mit dem Ist-Zustand im Dialog.
Was dabei geht und was nicht, ist am laufenden System durchgemessen:
SPICE ein/aus Neustart noetig - die Grafikkarte laesst sich einer
laufenden Maschine nicht unterschieben
USB dazu/weg sofort, solange der SPICE-Kanal schon steht
USB ohne SPICE schaltet SPICE mit ein, sonst waeren die Anschluesse
wirkungslos
Vor einem noetigen Neustart wird gewarnt, und bei einer Maschine mit geladenem
Arbeitsspeicher besonders deutlich: der ist danach endgueltig weg, weil
Proxmox ihn schon beim ersten Start freigibt. Ein zweiter startet kalt, offene
Programme und ungespeicherte Daten sind verloren.
Beim Abschalten wird der vga-Eintrag entfernt statt auf "std" gesetzt - dann
steht die Maschine wieder genau so da wie vorher, ohne eine Zeile, die es nie
gab.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
56003a71ab
commit
91c23ce2c0
@@ -1242,6 +1242,84 @@ def spice_file(proxmox, instance):
|
||||
return "\n".join(lines) + "\n"
|
||||
|
||||
|
||||
USB_KEY = re.compile(r"^usb\d+$")
|
||||
|
||||
|
||||
def display_state(proxmox, instance):
|
||||
"""(SPICE an?, Anzahl USB-Weiterleitungen) aus der Konfiguration."""
|
||||
try:
|
||||
config = proxmox.guest_config(instance.guest)
|
||||
except ProxmoxError:
|
||||
return False, 0
|
||||
spice = str(config.get("vga") or "").startswith("qxl")
|
||||
usb = sum(1 for key, value in config.items()
|
||||
if USB_KEY.match(key) and str(value).strip().lower() == "spice")
|
||||
return spice, usb
|
||||
|
||||
|
||||
def set_display(proxmox, instance, spice, usb, progress=None):
|
||||
"""SPICE-Anzeige und USB-Weiterleitung nachtraeglich einstellen.
|
||||
|
||||
Liefert (geaendert, neustart_noetig). Die Anzeige selbst laesst sich nur
|
||||
beim Start festlegen - qxl bringt eine andere Grafikkarte mit, die kann
|
||||
man einer laufenden Maschine nicht unterschieben. USB-Anschluesse dagegen
|
||||
sind steckbar, solange der SPICE-Kanal schon steht.
|
||||
"""
|
||||
def step(text):
|
||||
log.info("%s", text)
|
||||
if progress:
|
||||
progress(text)
|
||||
|
||||
if instance.type != "qemu":
|
||||
raise RecoveryError("SPICE und USB-Weiterleitung gibt es nur bei "
|
||||
"virtuellen Maschinen, nicht bei Containern.")
|
||||
usb = max(0, min(14, int(usb or 0)))
|
||||
if usb and not spice:
|
||||
spice = True
|
||||
step("SPICE wird mit eingeschaltet - ohne den Kanal waeren die "
|
||||
"Anschluesse wirkungslos")
|
||||
|
||||
config = proxmox.guest_config(instance.guest)
|
||||
hat_spice = str(config.get("vga") or "").startswith("qxl")
|
||||
vorhanden = sorted(key for key, value in config.items()
|
||||
if USB_KEY.match(key) and str(value).strip().lower() == "spice")
|
||||
|
||||
aenderungen = {}
|
||||
entfernen = []
|
||||
if spice and not hat_spice:
|
||||
aenderungen["vga"] = "qxl"
|
||||
elif not spice and hat_spice:
|
||||
# Eintrag entfernen statt auf "std" setzen: dann steht die Maschine
|
||||
# wieder genau so da wie vorher, ohne eine Zeile, die es nie gab.
|
||||
entfernen.append("vga")
|
||||
entfernen.extend(vorhanden) # ohne Kanal sind sie sinnlos
|
||||
vorhanden = []
|
||||
|
||||
if spice:
|
||||
for _ in range(usb - len(vorhanden)):
|
||||
slot = _free_usb_slot(dict(config, **aenderungen))
|
||||
aenderungen[slot] = "spice"
|
||||
config = dict(config, **{slot: "spice"})
|
||||
entfernen.extend(vorhanden[usb:])
|
||||
|
||||
if not aenderungen and not entfernen:
|
||||
return False, False
|
||||
|
||||
if entfernen:
|
||||
step("Entferne %s" % ", ".join(entfernen))
|
||||
proxmox.set_guest_config(instance.guest, {"delete": ",".join(entfernen)})
|
||||
if aenderungen:
|
||||
step("Setze %s" % ", ".join("%s=%s" % kv for kv in sorted(aenderungen.items())))
|
||||
proxmox.set_guest_config(instance.guest, aenderungen)
|
||||
|
||||
# Die Grafikkarte wechselt erst beim naechsten Start. USB-Anschluesse
|
||||
# stecken sofort, aber nur wenn der SPICE-Kanal schon lief.
|
||||
laeuft = proxmox.guest_status(instance.guest).get("status") == "running"
|
||||
neustart = laeuft and ("vga" in aenderungen or "vga" in entfernen
|
||||
or (spice and not hat_spice))
|
||||
return True, neustart
|
||||
|
||||
|
||||
def _default_name(guest, plan_):
|
||||
base = re.sub(r"[^A-Za-z0-9-]", "-", guest.name or "vm%d" % guest.vmid)[:40]
|
||||
return ("%s-wdh" % base).strip("-")
|
||||
|
||||
Reference in New Issue
Block a user