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()
|