|
|
@@ -8,10 +8,10 @@ import os |
|
|
|
import jailconf
|
|
|
|
from .mount import getmntinfo
|
|
|
|
import shlex
|
|
|
|
# import pdb
|
|
|
|
|
|
|
|
|
|
|
|
def jail_fs_create(image):
|
|
|
|
image, _ = zfs_find(image, focker_type='image', zfs_type='snapshot')
|
|
|
|
def jail_fs_create(image=None):
|
|
|
|
sha256 = bytes([ random.randint(0, 255) for _ in range(32) ]).hex()
|
|
|
|
lst = zfs_list(fields=['focker:sha256'], focker_type='image')
|
|
|
|
lst = list(filter(lambda a: a[0] == sha256, lst))
|
|
|
@@ -22,7 +22,12 @@ def jail_fs_create(image): |
|
|
|
name = poolname + '/focker/jails/' + sha256[:pre]
|
|
|
|
if not zfs_exists(name):
|
|
|
|
break
|
|
|
|
zfs_run(['zfs', 'clone', '-o', 'focker:sha256=' + sha256, image, name])
|
|
|
|
if image:
|
|
|
|
image, _ = zfs_find(image, focker_type='image', zfs_type='snapshot')
|
|
|
|
zfs_run(['zfs', 'clone', '-o', 'focker:sha256=' + sha256, image, name])
|
|
|
|
else:
|
|
|
|
print('Creating empty jail:', name)
|
|
|
|
zfs_run(['zfs', 'create', '-o', 'focker:sha256=' + sha256, name])
|
|
|
|
return name
|
|
|
|
|
|
|
|
|
|
|
@@ -103,14 +108,16 @@ def do_mounts(path, mounts): |
|
|
|
name = zfs_mountpoint(name)
|
|
|
|
while target.startswith('/'):
|
|
|
|
target = target[1:]
|
|
|
|
subprocess.check_output(['mount', '-t', 'nullfs', name, os.path.join(path, target)])
|
|
|
|
subprocess.check_output(['mount', '-t', 'nullfs',
|
|
|
|
shlex.quote(name), shlex.quote(os.path.join(path, target))])
|
|
|
|
|
|
|
|
|
|
|
|
def undo_mounts(path, mounts):
|
|
|
|
for (_, target) in reversed(mounts):
|
|
|
|
while target.startswith('/'):
|
|
|
|
target = target[1:]
|
|
|
|
subprocess.check_output(['umount', '-f', os.path.join(path, target)])
|
|
|
|
subprocess.check_output(['umount', '-f',
|
|
|
|
shlex.quote(os.path.join(path, target))])
|
|
|
|
|
|
|
|
|
|
|
|
def jail_run(path, command, mounts=[]):
|
|
|
@@ -202,19 +209,25 @@ def command_jail_exec(args): |
|
|
|
subprocess.run(['jexec', str(jid)] + args.command)
|
|
|
|
|
|
|
|
|
|
|
|
def command_jail_oneshot(args):
|
|
|
|
name = jail_fs_create(args.image)
|
|
|
|
def jail_oneshot(image, command, env, mounts):
|
|
|
|
# pdb.set_trace()
|
|
|
|
name = jail_fs_create(image)
|
|
|
|
path = zfs_mountpoint(name)
|
|
|
|
env = { a.split(':')[0]: ':'.join(a.split(':')[1:]) \
|
|
|
|
for a in args.env }
|
|
|
|
mounts = [ [ a.split(':')[0], a.split(':')[1] ] \
|
|
|
|
for a in args.mounts]
|
|
|
|
jailname = jail_create(path,
|
|
|
|
' '.join(map(shlex.quote, args.command or ['/bin/sh'])),
|
|
|
|
' '.join(map(shlex.quote, command or ['/bin/sh'])),
|
|
|
|
env, mounts)
|
|
|
|
subprocess.run(['jail', '-c', jailname])
|
|
|
|
jail_remove(path)
|
|
|
|
|
|
|
|
|
|
|
|
def command_jail_oneshot(args):
|
|
|
|
env = { a.split(':')[0]: ':'.join(a.split(':')[1:]) \
|
|
|
|
for a in args.env }
|
|
|
|
mounts = [ [ a.split(':')[0], a.split(':')[1] ] \
|
|
|
|
for a in args.mounts]
|
|
|
|
jail_oneshot(args.image, args.command, env, mounts)
|
|
|
|
|
|
|
|
|
|
|
|
# Deprecated
|
|
|
|
def command_jail_oneshot_old():
|
|
|
|
base, _ = zfs_snapshot_by_tag_or_sha256(args.image)
|
|
|
|