fix: preserve guest network identities and refresh session profiles
This commit is contained in:
+12
-1
@@ -3,6 +3,7 @@
|
||||
import contextlib
|
||||
import errno
|
||||
import fcntl
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import socket
|
||||
@@ -54,6 +55,14 @@ def _intel_render_node() -> Path | None:
|
||||
return None
|
||||
|
||||
|
||||
def _stable_mac(paths: VMPaths) -> str:
|
||||
# Disk/state identity survives restarts and runtime socket-directory changes.
|
||||
# UID distinguishes owners even when a shared bridge sees the same names.
|
||||
digest = bytearray(hashlib.sha256(f'{os.getuid()}:{paths.disk}'.encode()).digest()[:6])
|
||||
digest[0] = (digest[0] & 0xfc) | 0x02
|
||||
return ':'.join(f'{octet:02x}' for octet in digest)
|
||||
|
||||
|
||||
def build_qemu_argv(profile: Profile, paths: VMPaths) -> list[str]:
|
||||
accel = 'kvm' if os.access('/dev/kvm', os.R_OK | os.W_OK) else 'tcg'
|
||||
argv = [os.environ.get('HYDRA_QEMU', 'qemu-system-x86_64'), '-name', profile.name,
|
||||
@@ -78,7 +87,7 @@ def build_qemu_argv(profile: Profile, paths: VMPaths) -> list[str]:
|
||||
argv += ['-device', 'virtio-blk-pci,drive=disk']
|
||||
if profile.iso is not None:
|
||||
argv += ['-device', 'ide-cd,drive=iso']
|
||||
argv += ['-boot', 'order=dc' if profile.iso is not None else 'order=c', '-device', 'virtio-net-pci,netdev=net',
|
||||
argv += ['-boot', 'order=dc' if profile.iso is not None else 'order=c', '-device', f'virtio-net-pci,netdev=net,mac={profile.mac or _stable_mac(paths)}',
|
||||
'-netdev', 'user,id=net' if profile.network == 'user'
|
||||
else f'bridge,id=net,br={profile.bridge}',
|
||||
'-device', 'qemu-xhci,id=usb', '-device', 'usb-tablet', '-device', 'usb-kbd']
|
||||
@@ -136,6 +145,8 @@ class Runtime:
|
||||
def add(self, profile: Profile) -> None:
|
||||
self._validate_media(profile.iso)
|
||||
_private_dir(self.config)
|
||||
if profile.mac is None:
|
||||
profile = replace(profile, mac=_stable_mac(self.paths(profile.name)))
|
||||
save_profile(self.config / f'{profile.name}.toml', profile)
|
||||
|
||||
@staticmethod
|
||||
|
||||
Reference in New Issue
Block a user