minimal
This commit is contained in:
parent
85b070b132
commit
4c15e16a3a
|
|
@ -26,7 +26,7 @@ _lxcd_completion() {
|
||||||
case "${subcommand}" in
|
case "${subcommand}" in
|
||||||
create)
|
create)
|
||||||
if [[ "$cur" == -* ]]; then
|
if [[ "$cur" == -* ]]; then
|
||||||
COMPREPLY=($(compgen -W "--nested --sshd --git --certs --aptcache --ssh-client -i --image" -- "$cur"))
|
COMPREPLY=($(compgen -W "--nested --git --certs --aptcache --ssh-client -i --image -m --minimal" -- "$cur"))
|
||||||
else
|
else
|
||||||
COMPREPLY=($(compgen -W "ubuntu: ubuntu/24.04 ubuntu/22.04 debian/12 debian/11" -- "$cur"))
|
COMPREPLY=($(compgen -W "ubuntu: ubuntu/24.04 ubuntu/22.04 debian/12 debian/11" -- "$cur"))
|
||||||
fi
|
fi
|
||||||
|
|
@ -52,7 +52,7 @@ _lxcd_completion() {
|
||||||
if [ $cword -eq 2 ]; then
|
if [ $cword -eq 2 ]; then
|
||||||
COMPREPLY=($(compgen -W "${containers}" -- "$cur"))
|
COMPREPLY=($(compgen -W "${containers}" -- "$cur"))
|
||||||
elif [[ "$cur" == -* ]]; then
|
elif [[ "$cur" == -* ]]; then
|
||||||
COMPREPLY=($(compgen -W "--nested --sshd --git --certs --aptcache --ssh-client" -- "$cur"))
|
COMPREPLY=($(compgen -W "--nested --git --certs --aptcache --ssh-client" -- "$cur"))
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|
|
||||||
34
lxcd.py
34
lxcd.py
|
|
@ -129,7 +129,7 @@ def handle_list(args):
|
||||||
active_opts.append("nesting")
|
active_opts.append("nesting")
|
||||||
|
|
||||||
# Check labels for other features
|
# Check labels for other features
|
||||||
for feature in ("certs", "git", "sshd", "aptcache", "ssh-client"):
|
for feature in ("certs", "git", "aptcache", "ssh-client"):
|
||||||
if get_config(f"user.lxcd.{feature}") == "true":
|
if get_config(f"user.lxcd.{feature}") == "true":
|
||||||
active_opts.append(feature)
|
active_opts.append(feature)
|
||||||
|
|
||||||
|
|
@ -158,6 +158,8 @@ def handle_clone(args):
|
||||||
|
|
||||||
def handle_create(args):
|
def handle_create(args):
|
||||||
host_username, uid, gid, host_home = get_real_user_info()
|
host_username, uid, gid, host_home = get_real_user_info()
|
||||||
|
if args.minimal:
|
||||||
|
args.image = "ubuntu-minimal:"
|
||||||
host_timezone = detect_timezone()
|
host_timezone = detect_timezone()
|
||||||
host_locale = detect_locale()
|
host_locale = detect_locale()
|
||||||
|
|
||||||
|
|
@ -173,12 +175,6 @@ def handle_create(args):
|
||||||
|
|
||||||
print(f"Creating LXD container '{args.name}' from image '{args.image}'...")
|
print(f"Creating LXD container '{args.name}' from image '{args.image}'...")
|
||||||
|
|
||||||
# Determine SSH action based on --sshd flag
|
|
||||||
ssh_action = "systemctl disable --now ssh.service ssh.socket"
|
|
||||||
if args.sshd:
|
|
||||||
ssh_action = "systemctl enable --now ssh.service ssh.socket"
|
|
||||||
print("Security profiles adjusted: SSH daemon and socket explicitly requested.")
|
|
||||||
|
|
||||||
# Cloud-init configuration
|
# Cloud-init configuration
|
||||||
apt_proxy_cmd = (
|
apt_proxy_cmd = (
|
||||||
f" - mkdir -p /etc/apt/apt.conf.d\n"
|
f" - mkdir -p /etc/apt/apt.conf.d\n"
|
||||||
|
|
@ -215,7 +211,7 @@ runcmd:
|
||||||
- cp -rpn /etc/skel/. /home/{host_username}/
|
- cp -rpn /etc/skel/. /home/{host_username}/
|
||||||
- mkdir -p {container_coder_path}
|
- mkdir -p {container_coder_path}
|
||||||
{ssh_client_cmd} - chown -R {host_username}:{host_username} /home/{host_username}
|
{ssh_client_cmd} - chown -R {host_username}:{host_username} /home/{host_username}
|
||||||
- {ssh_action}
|
- echo "SSH left at default image state"
|
||||||
{apt_proxy_cmd}"""
|
{apt_proxy_cmd}"""
|
||||||
|
|
||||||
# Initialize container
|
# Initialize container
|
||||||
|
|
@ -257,10 +253,6 @@ runcmd:
|
||||||
lxc_run([ "config", "set", args.name, "security.syscalls.intercept.mknod", "true"])
|
lxc_run([ "config", "set", args.name, "security.syscalls.intercept.mknod", "true"])
|
||||||
set_label(args.name, "nested")
|
set_label(args.name, "nested")
|
||||||
|
|
||||||
# Handle --sshd label (already handled in cloud-init config above)
|
|
||||||
if args.sshd:
|
|
||||||
set_label(args.name, "sshd")
|
|
||||||
|
|
||||||
# Handle --aptcache option
|
# Handle --aptcache option
|
||||||
if args.aptcache:
|
if args.aptcache:
|
||||||
print(f"APT cache/proxy will be configured to {args.aptcache} via cloud-init...")
|
print(f"APT cache/proxy will be configured to {args.aptcache} via cloud-init...")
|
||||||
|
|
@ -396,7 +388,7 @@ def handle_add(args):
|
||||||
print(f"Error: Container '{args.name}' does not exist.", file=sys.stderr)
|
print(f"Error: Container '{args.name}' does not exist.", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if not args.nested and not args.sshd and not args.git and not args.certs and not args.aptcache and not args.ssh_client:
|
if not args.nested and not args.git and not args.certs and not args.aptcache and not args.ssh_client:
|
||||||
print("Error: Specify at least one option to add.\n"
|
print("Error: Specify at least one option to add.\n"
|
||||||
"Example: lxcd add <name> --git --nested", file=sys.stderr)
|
"Example: lxcd add <name> --git --nested", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
@ -417,17 +409,8 @@ def handle_add(args):
|
||||||
lxc_run([ "config", "set", args.name, "security.syscalls.intercept.mknod", "true"])
|
lxc_run([ "config", "set", args.name, "security.syscalls.intercept.mknod", "true"])
|
||||||
set_label(args.name, "nested")
|
set_label(args.name, "nested")
|
||||||
|
|
||||||
if args.sshd:
|
|
||||||
print(f"Activating SSH daemon and socket inside '{args.name}'...")
|
|
||||||
lxc_run([ "exec", args.name, "--", "systemctl", "enable", "--now", "ssh.service", "ssh.socket"])
|
|
||||||
set_label(args.name, "sshd")
|
|
||||||
|
|
||||||
if args.git:
|
if args.git:
|
||||||
was_running = not was_stopped
|
was_running = not was_stopped
|
||||||
print(f"Installing git inside '{args.name}'...")
|
|
||||||
lxc_run([ "exec", args.name, "--", "env", "DEBIAN_FRONTEND=noninteractive", "apt-get", "update", "-y"])
|
|
||||||
lxc_run([ "exec", args.name, "--", "env", "DEBIAN_FRONTEND=noninteractive", "apt-get", "install", "-y", "git"])
|
|
||||||
|
|
||||||
host_gitconfig = host_home / ".gitconfig"
|
host_gitconfig = host_home / ".gitconfig"
|
||||||
if host_gitconfig.exists():
|
if host_gitconfig.exists():
|
||||||
print(f"Mapping host .gitconfig into '{args.name}' as a device mount...")
|
print(f"Mapping host .gitconfig into '{args.name}' as a device mount...")
|
||||||
|
|
@ -443,7 +426,7 @@ def handle_add(args):
|
||||||
lxc_run([ "start", args.name])
|
lxc_run([ "start", args.name])
|
||||||
lxc_run([ "exec", args.name, "--", "cloud-init", "status", "--wait"], check=False)
|
lxc_run([ "exec", args.name, "--", "cloud-init", "status", "--wait"], check=False)
|
||||||
else:
|
else:
|
||||||
print(f"Warning: Host ~/.gitconfig not found. Git was installed, but file copy skipped.")
|
print(f"Warning: Host ~/.gitconfig not found. Skipping git config mapping.")
|
||||||
|
|
||||||
if args.certs:
|
if args.certs:
|
||||||
host_certs = Path("/etc/ssl/certs/ca-certificates.crt")
|
host_certs = Path("/etc/ssl/certs/ca-certificates.crt")
|
||||||
|
|
@ -515,8 +498,8 @@ def main():
|
||||||
parser_create = subparsers.add_parser("create", help="Create a new LXD container")
|
parser_create = subparsers.add_parser("create", help="Create a new LXD container")
|
||||||
parser_create.add_argument("name", help="Name of the container")
|
parser_create.add_argument("name", help="Name of the container")
|
||||||
parser_create.add_argument("-i", "--image", default="ubuntu:", help="LXD image to use (defaults to 'ubuntu:')")
|
parser_create.add_argument("-i", "--image", default="ubuntu:", help="LXD image to use (defaults to 'ubuntu:')")
|
||||||
|
parser_create.add_argument("-m", "--minimal", action="store_true", help="Use ubuntu-minimal: image instead")
|
||||||
parser_create.add_argument("--nested", action="store_true", help="Enable nesting")
|
parser_create.add_argument("--nested", action="store_true", help="Enable nesting")
|
||||||
parser_create.add_argument("--sshd", action="store_true", help="Enable SSH daemon")
|
|
||||||
parser_create.add_argument("--git", action="store_true", help="Map host ~/.gitconfig into the container")
|
parser_create.add_argument("--git", action="store_true", help="Map host ~/.gitconfig into the container")
|
||||||
parser_create.add_argument("--certs", action="store_true", help="Mount host CA certificates bundle")
|
parser_create.add_argument("--certs", action="store_true", help="Mount host CA certificates bundle")
|
||||||
parser_create.add_argument("--aptcache", help="URL for an APT cache/proxy (e.g. http://10.0.0.1:3142)")
|
parser_create.add_argument("--aptcache", help="URL for an APT cache/proxy (e.g. http://10.0.0.1:3142)")
|
||||||
|
|
@ -560,8 +543,7 @@ def main():
|
||||||
parser_add = subparsers.add_parser("add", help="Add features to an existing container")
|
parser_add = subparsers.add_parser("add", help="Add features to an existing container")
|
||||||
parser_add.add_argument("name", help="Name of the container")
|
parser_add.add_argument("name", help="Name of the container")
|
||||||
parser_add.add_argument("--nested", action="store_true", help="Enable nesting")
|
parser_add.add_argument("--nested", action="store_true", help="Enable nesting")
|
||||||
parser_add.add_argument("--sshd", action="store_true", help="Enable SSH daemon")
|
parser_add.add_argument("--git", action="store_true", help="Map host ~/.gitconfig into the container")
|
||||||
parser_add.add_argument("--git", action="store_true", help="Install git and copy ~/.gitconfig")
|
|
||||||
parser_add.add_argument("--certs", action="store_true", help="Mount host CA certificates bundle")
|
parser_add.add_argument("--certs", action="store_true", help="Mount host CA certificates bundle")
|
||||||
parser_add.add_argument("--aptcache", help="URL for an APT cache/proxy (e.g. http://10.0.0.1:3142)")
|
parser_add.add_argument("--aptcache", help="URL for an APT cache/proxy (e.g. http://10.0.0.1:3142)")
|
||||||
parser_add.add_argument("--ssh-client", action="store_true",
|
parser_add.add_argument("--ssh-client", action="store_true",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue