42 lines
1.0 KiB
Python
42 lines
1.0 KiB
Python
import contextlib
|
|
import shutil
|
|
import subprocess
|
|
import time
|
|
from collections.abc import Iterator
|
|
from pathlib import Path
|
|
|
|
from ..errors import ClanError
|
|
from ..nix import nix_shell
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def start_virtiofsd(socket_path: Path) -> Iterator[None]:
|
|
sandbox = "namespace"
|
|
if shutil.which("newuidmap") is None:
|
|
sandbox = "none"
|
|
virtiofsd = nix_shell(
|
|
["nixpkgs#virtiofsd"],
|
|
[
|
|
"virtiofsd",
|
|
"--socket-path",
|
|
str(socket_path),
|
|
"--cache",
|
|
"always",
|
|
"--sandbox",
|
|
sandbox,
|
|
"--shared-dir",
|
|
"/nix/store",
|
|
],
|
|
)
|
|
with subprocess.Popen(virtiofsd) as proc:
|
|
try:
|
|
while not socket_path.exists():
|
|
rc = proc.poll()
|
|
if rc is not None:
|
|
msg = f"virtiofsd exited unexpectedly with code {rc}"
|
|
raise ClanError(msg)
|
|
time.sleep(0.1)
|
|
yield
|
|
finally:
|
|
proc.kill()
|