Skip to content

Commit

Permalink
Add start/stop hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
Jip-Hop committed Feb 9, 2024
1 parent 6475b13 commit f9730d3
Showing 1 changed file with 59 additions and 6 deletions.
65 changes: 59 additions & 6 deletions jlmkr.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,26 @@ def parse_config(jail_config_path):
return config


def add_hook(jail_path, systemd_run_additional_args, hook_command, hook_type):
if not hook_command:
return

# Run the command directly if it doesn't start with a shebang
if not hook_command.startswith("#!"):
systemd_run_additional_args += [f"--property={hook_type}={hook_command}"]
return

# Otherwise write a script file and call that
hook_file = os.path.abspath(os.path.join(jail_path, f".{hook_type}"))

# Only write if contents are different
if not os.path.exists(hook_file) or Path(hook_file).read_text() != hook_command:
print(hook_command, file=open(hook_file, "w"))

stat_chmod(hook_file, 0o700)
systemd_run_additional_args += [f"--property={hook_type}={hook_file}"]


def start_jail(jail_name, check_startup_enabled=False):
"""
Start jail with given name.
Expand Down Expand Up @@ -401,6 +421,21 @@ def start_jail(jail_name, check_startup_enabled=False):
"--capability=all",
]

# Add hooks to execute commands on the host before starting and after stopping a jail
add_hook(
jail_path,
systemd_run_additional_args,
config.get("pre_start_hook"),
"ExecStartPre",
)

add_hook(
jail_path,
systemd_run_additional_args,
config.get("post_stop_hook"),
"ExecStopPost",
)

# Legacy gpu_passthrough config setting
if config.get("gpu_passthrough") == "1":
gpu_passthrough_intel = "1"
Expand Down Expand Up @@ -1029,13 +1064,31 @@ def create_jail(jail_name, distro="debian", release="bookworm"):
systemd_run_default_args_multiline = "\n\t".join(systemd_run_default_args)
systemd_nspawn_default_args_multiline = "\n\t".join(systemd_nspawn_default_args)

config = "\n".join(
config = cleandoc(
f"""
startup={startup}
docker_compatible={docker_compatible}
gpu_passthrough_intel={gpu_passthrough_intel}
gpu_passthrough_nvidia={gpu_passthrough_nvidia}
"""
)

config += f"\n\nsystemd_nspawn_user_args={systemd_nspawn_user_args_multiline}\n\n"

config += cleandoc(
"""
# Specify command/script to run on the HOST before starting the jail
pre_start_hook=echo 'PRE_START_HOOK'
# Specify a command/script to run on the HOST after stopping the jail
post_stop_hook=#!/usr/bin/bash
echo 'POST STOP HOOK'
"""
)

config += "\n".join(
[
f"startup={startup}",
f"docker_compatible={docker_compatible}",
f"gpu_passthrough_intel={gpu_passthrough_intel}",
f"gpu_passthrough_nvidia={gpu_passthrough_nvidia}",
f"systemd_nspawn_user_args={systemd_nspawn_user_args_multiline}",
"",
"",
"# You generally will not need to change the options below",
f"systemd_run_default_args={systemd_run_default_args_multiline}",
Expand Down

0 comments on commit f9730d3

Please sign in to comment.