46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
from pathlib import Path
|
|
from typing import Callable
|
|
|
|
from l4d2host.spec import load_spec
|
|
from l4d2host.systemd_user import daemon_reload, ensure_template_unit
|
|
|
|
|
|
DEFAULT_ROOT = Path("/opt/l4d2")
|
|
|
|
|
|
def initialize_instance(
|
|
name: str,
|
|
spec_path: Path,
|
|
*,
|
|
root: Path = DEFAULT_ROOT,
|
|
on_stdout: Callable[[str], None] | None = None,
|
|
on_stderr: Callable[[str], None] | None = None,
|
|
passthrough: bool = False,
|
|
) -> None:
|
|
spec = load_spec(spec_path)
|
|
|
|
instance_dir = root / "instances" / name
|
|
runtime_dir = root / "runtime" / name
|
|
(runtime_dir / "upper").mkdir(parents=True, exist_ok=True)
|
|
(runtime_dir / "work").mkdir(parents=True, exist_ok=True)
|
|
(runtime_dir / "merged").mkdir(parents=True, exist_ok=True)
|
|
instance_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
lowerdirs = [str(root / "overlays" / overlay) for overlay in spec.overlays]
|
|
lowerdirs.append(str(root / "installation"))
|
|
|
|
instance_env = "\n".join(
|
|
[
|
|
f"L4D2_PORT={spec.port}",
|
|
f"L4D2_ARGS={' '.join(spec.arguments)}",
|
|
f"L4D2_LOWERDIRS={':'.join(lowerdirs)}",
|
|
]
|
|
) + "\n"
|
|
(instance_dir / "instance.env").write_text(instance_env)
|
|
|
|
server_cfg = "\n".join(spec.config) if spec.config else ""
|
|
(instance_dir / "server.cfg").write_text(server_cfg)
|
|
|
|
if root.resolve() == DEFAULT_ROOT:
|
|
ensure_template_unit()
|
|
daemon_reload(on_stdout=on_stdout, on_stderr=on_stderr, passthrough=passthrough)
|