from pathlib import Path from typing import Callable from l4d2host.fs.base import OverlayMounter from l4d2host.process import run_command class FuseOverlayFSMounter(OverlayMounter): def mount( self, *, lowerdirs: str, upperdir: Path, workdir: Path, merged: Path, on_stdout: Callable[[str], None] | None = None, on_stderr: Callable[[str], None] | None = None, passthrough: bool = False, should_cancel: Callable[[], bool] | None = None, ) -> None: run_command( [ "fuse-overlayfs", "-o", f"lowerdir={lowerdirs},upperdir={upperdir},workdir={workdir}", str(merged), ], on_stdout=on_stdout, on_stderr=on_stderr, passthrough=passthrough, should_cancel=should_cancel, ) def unmount( self, *, merged: Path, on_stdout: Callable[[str], None] | None = None, on_stderr: Callable[[str], None] | None = None, passthrough: bool = False, should_cancel: Callable[[], bool] | None = None, ) -> None: run_command( ["fusermount3", "-u", str(merged)], on_stdout=on_stdout, on_stderr=on_stderr, passthrough=passthrough, should_cancel=should_cancel, )