parent
742a70b3d0
commit
9da33ab2b0
31
jlmkr.py
31
jlmkr.py
|
@ -115,9 +115,6 @@ systemd_nspawn_default_args=--bind-ro=/sys/module
|
||||||
# Always add --bind-ro=/sys/module to make lsmod happy
|
# Always add --bind-ro=/sys/module to make lsmod happy
|
||||||
# https://manpages.debian.org/bookworm/manpages/sysfs.5.en.html
|
# https://manpages.debian.org/bookworm/manpages/sysfs.5.en.html
|
||||||
|
|
||||||
JAILS_DIR_PATH = "jails"
|
|
||||||
JAIL_CONFIG_NAME = "config"
|
|
||||||
JAIL_ROOTFS_NAME = "rootfs"
|
|
||||||
DOWNLOAD_SCRIPT_DIGEST = (
|
DOWNLOAD_SCRIPT_DIGEST = (
|
||||||
"cfcb5d08b24187d108f2ab0d21a6cc4b73dcd7f5d7dfc80803bfd7f1642d638d"
|
"cfcb5d08b24187d108f2ab0d21a6cc4b73dcd7f5d7dfc80803bfd7f1642d638d"
|
||||||
)
|
)
|
||||||
|
@ -125,6 +122,9 @@ SCRIPT_PATH = os.path.realpath(__file__)
|
||||||
SCRIPT_NAME = os.path.basename(SCRIPT_PATH)
|
SCRIPT_NAME = os.path.basename(SCRIPT_PATH)
|
||||||
SCRIPT_DIR_PATH = os.path.dirname(SCRIPT_PATH)
|
SCRIPT_DIR_PATH = os.path.dirname(SCRIPT_PATH)
|
||||||
COMMAND_NAME = os.path.basename(__file__)
|
COMMAND_NAME = os.path.basename(__file__)
|
||||||
|
JAILS_DIR_PATH = os.path.join(SCRIPT_DIR_PATH, "jails")
|
||||||
|
JAIL_CONFIG_NAME = "config"
|
||||||
|
JAIL_ROOTFS_NAME = "rootfs"
|
||||||
SHORTNAME = "jlmkr"
|
SHORTNAME = "jlmkr"
|
||||||
|
|
||||||
# Only set a color if we have an interactive tty
|
# Only set a color if we have an interactive tty
|
||||||
|
@ -591,7 +591,7 @@ def start_jail(jail_name):
|
||||||
|
|
||||||
systemd_run_additional_args = [
|
systemd_run_additional_args = [
|
||||||
f"--unit={SHORTNAME}-{jail_name}",
|
f"--unit={SHORTNAME}-{jail_name}",
|
||||||
f"--working-directory=./{jail_path}",
|
f"--working-directory={jail_path}",
|
||||||
f"--description=My nspawn jail {jail_name} [created with jailmaker]",
|
f"--description=My nspawn jail {jail_name} [created with jailmaker]",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -940,6 +940,8 @@ def get_mount_point(path):
|
||||||
path = os.path.dirname(path)
|
path = os.path.dirname(path)
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
def get_relative_path_in_jailmaker_dir(absolute_path):
|
||||||
|
return PurePath(absolute_path).relative_to(SCRIPT_DIR_PATH)
|
||||||
|
|
||||||
def get_zfs_dataset(path):
|
def get_zfs_dataset(path):
|
||||||
"""
|
"""
|
||||||
|
@ -970,21 +972,23 @@ def get_zfs_base_path():
|
||||||
return zfs_base_path
|
return zfs_base_path
|
||||||
|
|
||||||
|
|
||||||
def create_zfs_dataset(relative_path):
|
def create_zfs_dataset(absolute_path):
|
||||||
"""
|
"""
|
||||||
Create a ZFS Dataset.
|
Create a ZFS Dataset inside the jailmaker directory at the provided absolute path.
|
||||||
Receives the dataset to be created relative to the jailmaker script (e.g. "jails" or "jails/newjail").
|
E.g. "/mnt/mypool/jailmaker/jails" or "/mnt/mypool/jailmaker/jails/newjail").
|
||||||
"""
|
"""
|
||||||
|
relative_path = get_relative_path_in_jailmaker_dir(absolute_path)
|
||||||
dataset_to_create = os.path.join(get_zfs_base_path(), relative_path)
|
dataset_to_create = os.path.join(get_zfs_base_path(), relative_path)
|
||||||
eprint(f"Creating ZFS Dataset {dataset_to_create}")
|
eprint(f"Creating ZFS Dataset {dataset_to_create}")
|
||||||
subprocess.run(["zfs", "create", dataset_to_create], check=True)
|
subprocess.run(["zfs", "create", dataset_to_create], check=True)
|
||||||
|
|
||||||
|
|
||||||
def remove_zfs_dataset(relative_path):
|
def remove_zfs_dataset(absolute_path):
|
||||||
"""
|
"""
|
||||||
Remove a ZFS Dataset.
|
Remove a ZFS Dataset inside the jailmaker directory at the provided absolute path.
|
||||||
Receives the dataset to be removed relative to the jailmaker script (e.g. "jails/oldjail").
|
E.g. "/mnt/mypool/jailmaker/jails/oldjail".
|
||||||
"""
|
"""
|
||||||
|
relative_path = get_relative_path_in_jailmaker_dir(absolute_path)
|
||||||
dataset_to_remove = os.path.join((get_zfs_base_path()), relative_path)
|
dataset_to_remove = os.path.join((get_zfs_base_path()), relative_path)
|
||||||
eprint(f"Removing ZFS Dataset {dataset_to_remove}")
|
eprint(f"Removing ZFS Dataset {dataset_to_remove}")
|
||||||
subprocess.run(["zfs", "destroy", "-r", dataset_to_remove], check=True)
|
subprocess.run(["zfs", "destroy", "-r", dataset_to_remove], check=True)
|
||||||
|
@ -1232,7 +1236,7 @@ def interactive_config():
|
||||||
def create_jail(**kwargs):
|
def create_jail(**kwargs):
|
||||||
print(DISCLAIMER)
|
print(DISCLAIMER)
|
||||||
|
|
||||||
if os.path.basename(os.getcwd()) != "jailmaker":
|
if os.path.basename(SCRIPT_DIR_PATH) != "jailmaker":
|
||||||
eprint(
|
eprint(
|
||||||
dedent(
|
dedent(
|
||||||
f"""
|
f"""
|
||||||
|
@ -1244,7 +1248,7 @@ def create_jail(**kwargs):
|
||||||
)
|
)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
if not PurePath(get_mount_point(os.getcwd())).is_relative_to("/mnt"):
|
if not PurePath(get_mount_point(SCRIPT_DIR_PATH)).is_relative_to("/mnt"):
|
||||||
print(
|
print(
|
||||||
dedent(
|
dedent(
|
||||||
f"""
|
f"""
|
||||||
|
@ -1967,9 +1971,6 @@ def main():
|
||||||
# Set appropriate permissions (if not already set) for this file, since it's executed as root
|
# Set appropriate permissions (if not already set) for this file, since it's executed as root
|
||||||
stat_chmod(SCRIPT_PATH, 0o700)
|
stat_chmod(SCRIPT_PATH, 0o700)
|
||||||
|
|
||||||
# Work relative to this script
|
|
||||||
os.chdir(SCRIPT_DIR_PATH)
|
|
||||||
|
|
||||||
# Ignore all args after the first "--"
|
# Ignore all args after the first "--"
|
||||||
args_to_parse = split_at_string(sys.argv[1:], "--")[0]
|
args_to_parse = split_at_string(sys.argv[1:], "--")[0]
|
||||||
# Check for help
|
# Check for help
|
||||||
|
|
Loading…
Reference in New Issue