diff --git a/focker.py b/focker.py index 6ee936f..d9972e7 100644 --- a/focker.py +++ b/focker.py @@ -1,4 +1,5 @@ from argparse import ArgumentParser +import argparse import yaml import os # from weir import zfs, process @@ -16,6 +17,10 @@ from .volume import command_volume_create, \ import sys from .zfs import zfs_init from .jail import command_jail_create, \ + command_jail_start, \ + command_jail_stop, \ + command_jail_remove, \ + command_jail_exec, \ command_jail_run, \ command_jail_list, \ command_jail_tag, \ @@ -67,6 +72,23 @@ def create_parser(): parser.add_argument('--mounts', '-m', type=str, nargs='+', default=[]) parser.add_argument('--hostname', '-n', type=str) + parser = subparsers.add_parser('start') + parser.set_defaults(func=command_jail_start) + parser.add_argument('reference', type=str) + + parser = subparsers.add_parser('stop') + parser.set_defaults(func=command_jail_stop) + parser.add_argument('reference', type=str) + + parser = subparsers.add_parser('remove') + parser.set_defaults(func=command_jail_remove) + parser.add_argument('reference', type=str) + + parser = subparsers.add_parser('exec') + parser.set_defaults(func=command_jail_exec) + parser.add_argument('reference', type=str) + parser.add_argument('command', type=str, nargs=argparse.REMAINDER, default=['/bin/sh']) + parser = subparsers.add_parser('run') parser.set_defaults(func=command_jail_run) parser.add_argument('image', type=str) diff --git a/jail.py b/jail.py index cec9ee4..63af6d6 100644 --- a/jail.py +++ b/jail.py @@ -116,9 +116,12 @@ def jail_run(path, command, mounts=[]): def jail_stop(path): try: jid = get_jid(path) - subprocess.run(['jail', '-r', jid]) + jailname = os.path.split(path)[-1] + subprocess.run(['jail', '-r', jailname]) except ValueError: print('JID could not be determined') + # import time + # time.sleep(1) mi = getmntinfo() for m in mi: mntonname = m['f_mntonname'].decode('utf-8') @@ -165,6 +168,32 @@ def command_jail_create(args): print(path) +def command_jail_start(args): + name, _ = zfs_find(args.reference, focker_type='jail') + path = zfs_mountpoint(name) + jailname = os.path.split(path)[-1] + subprocess.run(['jail', '-c', jailname]) + + +def command_jail_stop(args): + name, _ = zfs_find(args.reference, focker_type='jail') + path = zfs_mountpoint(name) + jail_stop(path) + + +def command_jail_remove(args): + name, _ = zfs_find(args.reference, focker_type='jail') + path = zfs_mountpoint(name) + jail_remove(path) + + +def command_jail_exec(args): + name, _ = zfs_find(args.reference, focker_type='jail') + path = zfs_mountpoint(name) + jid = get_jid(path) + subprocess.run(['jexec', str(jid)] + args.command) + + def command_jail_run(args): base, _ = zfs_snapshot_by_tag_or_sha256(args.image) # root = '/'.join(base.split('/')[:-1])