Merge branch 'develop'
This commit is contained in:
commit
77e5f7993a
92
jlmkr.py
92
jlmkr.py
|
@ -342,6 +342,40 @@ def validate_sha256(file_path, digest):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def run_lxc_download_script(jail_name=None, jail_path=None, jail_rootfs_path=None, distro=None, release=None):
|
||||||
|
|
||||||
|
arch = 'amd64'
|
||||||
|
lxc_dir = '.lxc'
|
||||||
|
lxc_cache = os.path.join(lxc_dir, 'cache')
|
||||||
|
lxc_download_script = os.path.join(lxc_dir, 'lxc-download.sh')
|
||||||
|
|
||||||
|
# Create the lxc dirs if nonexistent
|
||||||
|
os.makedirs(lxc_dir, exist_ok=True)
|
||||||
|
stat_chmod(lxc_dir, 0o700)
|
||||||
|
os.makedirs(lxc_cache, exist_ok=True)
|
||||||
|
stat_chmod(lxc_cache, 0o700)
|
||||||
|
|
||||||
|
# Remove if owner of lxc_download_script is not root
|
||||||
|
if os.stat(lxc_download_script).st_uid != 0:
|
||||||
|
os.remove(lxc_download_script)
|
||||||
|
|
||||||
|
# Fetch the lxc download script if not present locally (or hash doesn't match)
|
||||||
|
if not validate_sha256(lxc_download_script, DOWNLOAD_SCRIPT_DIGEST):
|
||||||
|
urllib.request.urlretrieve(
|
||||||
|
"https://raw.githubusercontent.com/Jip-Hop/lxc/58520263041b6864cadad96278848f9b8ce78ee9/templates/lxc-download.in", lxc_download_script)
|
||||||
|
if not validate_sha256(lxc_download_script, DOWNLOAD_SCRIPT_DIGEST):
|
||||||
|
fail("Abort! Downloaded script has unexpected contents.")
|
||||||
|
|
||||||
|
stat_chmod(lxc_download_script, 0o700)
|
||||||
|
|
||||||
|
if None not in [jail_name, jail_path, jail_rootfs_path, distro, release]:
|
||||||
|
subprocess.run([lxc_download_script, f'--name={jail_name}', f'--path={jail_path}', f'--rootfs={jail_rootfs_path}', f'--arch={arch}',
|
||||||
|
f'--dist={distro}', f'--release={release}'], check=True, env={"LXC_CACHE_PATH": lxc_cache})
|
||||||
|
else:
|
||||||
|
subprocess.run([lxc_download_script, '--list',
|
||||||
|
f'--arch={arch}'], env={'LXC_CACHE_PATH': lxc_cache})
|
||||||
|
|
||||||
|
|
||||||
def stat_chmod(file_path, mode):
|
def stat_chmod(file_path, mode):
|
||||||
"""
|
"""
|
||||||
Change mode if file doesn't already have this mode.
|
Change mode if file doesn't already have this mode.
|
||||||
|
@ -415,11 +449,6 @@ def create_jail(jail_name):
|
||||||
|
|
||||||
print(DISCLAIMER)
|
print(DISCLAIMER)
|
||||||
|
|
||||||
arch = 'amd64'
|
|
||||||
lxc_dir = '.lxc'
|
|
||||||
lxc_cache = os.path.join(lxc_dir, 'cache')
|
|
||||||
lxc_download_script = os.path.join(lxc_dir, 'lxc-download.sh')
|
|
||||||
|
|
||||||
if os.path.basename(os.getcwd()) != 'jailmaker':
|
if os.path.basename(os.getcwd()) != 'jailmaker':
|
||||||
fail(dedent(f"""
|
fail(dedent(f"""
|
||||||
{SCRIPT_NAME} needs to create files.
|
{SCRIPT_NAME} needs to create files.
|
||||||
|
@ -439,28 +468,10 @@ def create_jail(jail_name):
|
||||||
if not agree("Do you wish to ignore this warning and continue?", 'n'):
|
if not agree("Do you wish to ignore this warning and continue?", 'n'):
|
||||||
fail("Aborting...")
|
fail("Aborting...")
|
||||||
|
|
||||||
# Create the lxc dirs if nonexistent
|
|
||||||
os.makedirs(lxc_dir, exist_ok=True)
|
|
||||||
stat_chmod(lxc_dir, 0o700)
|
|
||||||
os.makedirs(lxc_cache, exist_ok=True)
|
|
||||||
stat_chmod(lxc_cache, 0o700)
|
|
||||||
|
|
||||||
# Create the dir where to store the jails
|
# Create the dir where to store the jails
|
||||||
os.makedirs(JAILS_DIR_PATH, exist_ok=True)
|
os.makedirs(JAILS_DIR_PATH, exist_ok=True)
|
||||||
stat_chmod(JAILS_DIR_PATH, 0o700)
|
stat_chmod(JAILS_DIR_PATH, 0o700)
|
||||||
|
|
||||||
# Fetch the lxc download script if not present locally (or hash doesn't match)
|
|
||||||
if not validate_sha256(lxc_download_script, DOWNLOAD_SCRIPT_DIGEST):
|
|
||||||
urllib.request.urlretrieve(
|
|
||||||
"https://raw.githubusercontent.com/Jip-Hop/lxc/58520263041b6864cadad96278848f9b8ce78ee9/templates/lxc-download.in", lxc_download_script)
|
|
||||||
if not validate_sha256(lxc_download_script, DOWNLOAD_SCRIPT_DIGEST):
|
|
||||||
fail("Abort! Downloaded script has unexpected contents.")
|
|
||||||
|
|
||||||
stat_chmod(lxc_download_script, 0o700)
|
|
||||||
|
|
||||||
distro = 'debian'
|
|
||||||
release = 'bullseye'
|
|
||||||
|
|
||||||
print()
|
print()
|
||||||
if not agree("Install the recommended distro (Debian 11)?", 'y'):
|
if not agree("Install the recommended distro (Debian 11)?", 'y'):
|
||||||
print(dedent(f"""
|
print(dedent(f"""
|
||||||
|
@ -474,8 +485,7 @@ def create_jail(jail_name):
|
||||||
input("Press Enter to continue...")
|
input("Press Enter to continue...")
|
||||||
print()
|
print()
|
||||||
|
|
||||||
subprocess.call([lxc_download_script, '--list',
|
run_lxc_download_script()
|
||||||
'--arch=' + arch], env={'LXC_CACHE_PATH': lxc_cache})
|
|
||||||
|
|
||||||
print(dedent("""
|
print(dedent("""
|
||||||
Choose from the DIST column.
|
Choose from the DIST column.
|
||||||
|
@ -595,8 +605,8 @@ def create_jail(jail_name):
|
||||||
# but we don't need it so we will remove it later
|
# but we don't need it so we will remove it later
|
||||||
open(jail_config_path, "a").close()
|
open(jail_config_path, "a").close()
|
||||||
|
|
||||||
subprocess.run([lxc_download_script, f'--name={jail_name}', f'--path={jail_path}', f'--rootfs={jail_rootfs_path}', f'--arch={arch}',
|
run_lxc_download_script(jail_name, jail_path,
|
||||||
f'--dist={distro}', f'--release={release}'], check=True, env={"LXC_CACHE_PATH": lxc_cache})
|
jail_rootfs_path, distro, release)
|
||||||
|
|
||||||
# Assuming the name of your jail is "myjail"
|
# Assuming the name of your jail is "myjail"
|
||||||
# and "machinectl shell myjail" doesn't work
|
# and "machinectl shell myjail" doesn't work
|
||||||
|
@ -857,13 +867,16 @@ def main():
|
||||||
|
|
||||||
parser.add_argument('--version', action='version', version=VERSION)
|
parser.add_argument('--version', action='version', version=VERSION)
|
||||||
|
|
||||||
subparsers = parser.add_subparsers(title='commands', dest='subcommand')
|
subparsers = parser.add_subparsers(
|
||||||
|
title='commands', dest='subcommand', metavar="")
|
||||||
|
|
||||||
subparsers.add_parser(name='create', epilog=DISCLAIMER).add_argument(
|
create_parser = subparsers.add_parser(
|
||||||
'name', nargs='?', help='name of the jail to create')
|
name='create', epilog=DISCLAIMER, help='create a new jail')
|
||||||
|
create_parser.add_argument('name', nargs='?', help='name of the jail')
|
||||||
|
|
||||||
subparsers.add_parser(name='start', epilog=DISCLAIMER).add_argument(
|
start_parser = subparsers.add_parser(
|
||||||
'name', help='name of the jail to start')
|
name='start', epilog=DISCLAIMER, help='start a previously created jail')
|
||||||
|
start_parser.add_argument('name', help='name of the jail')
|
||||||
|
|
||||||
subparsers.add_parser(name='edit', epilog=DISCLAIMER).add_argument(
|
subparsers.add_parser(name='edit', epilog=DISCLAIMER).add_argument(
|
||||||
'name', help='name of the jail to edit')
|
'name', help='name of the jail to edit')
|
||||||
|
@ -876,13 +889,20 @@ def main():
|
||||||
subparsers.add_parser(name='install', epilog=DISCLAIMER,
|
subparsers.add_parser(name='install', epilog=DISCLAIMER,
|
||||||
help="Install jailmaker dependencies and create symlink")
|
help="Install jailmaker dependencies and create symlink")
|
||||||
|
|
||||||
|
images_parser = subparsers.add_parser(
|
||||||
|
name='images', epilog=DISCLAIMER, help='show the list of images available to create jails from')
|
||||||
|
|
||||||
|
parser.usage = f"{parser.format_usage()[7:]}{create_parser.format_usage()}{start_parser.format_usage()}{images_parser.format_usage()}"
|
||||||
|
|
||||||
if os.getuid() != 0:
|
if os.getuid() != 0:
|
||||||
parser.print_usage()
|
parser.print_usage()
|
||||||
fail("Run this script as root...")
|
fail("Run this script as root...")
|
||||||
|
|
||||||
os.chdir(SCRIPT_DIR_PATH)
|
|
||||||
# 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_NAME, 0o700)
|
stat_chmod(__file__, 0o700)
|
||||||
|
|
||||||
|
# Work relative to this script
|
||||||
|
os.chdir(SCRIPT_DIR_PATH)
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
@ -907,6 +927,10 @@ def main():
|
||||||
elif args.subcommand == 'install':
|
elif args.subcommand == 'install':
|
||||||
install_jailmaker()
|
install_jailmaker()
|
||||||
|
|
||||||
|
elif args.subcommand == 'images':
|
||||||
|
# TODO: print some info before and after the list of images
|
||||||
|
run_lxc_download_script()
|
||||||
|
|
||||||
elif args.subcommand:
|
elif args.subcommand:
|
||||||
parser.print_usage()
|
parser.print_usage()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue