|
@@ -7,6 +7,7 @@ from tabulate import tabulate |
|
|
import os
|
|
|
import os
|
|
|
import jailconf
|
|
|
import jailconf
|
|
|
from .mount import getmntinfo
|
|
|
from .mount import getmntinfo
|
|
|
|
|
|
import shlex
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def jail_fs_create(image):
|
|
|
def jail_fs_create(image):
|
|
@@ -26,7 +27,7 @@ def jail_fs_create(image): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def gen_env_command(command, env):
|
|
|
def gen_env_command(command, env):
|
|
|
env = [ 'export ' + k + '=' + quote(v) \
|
|
|
|
|
|
|
|
|
env = [ 'export ' + k + '=' + shlex.quote(v) \
|
|
|
for (k, v) in env.items() ]
|
|
|
for (k, v) in env.items() ]
|
|
|
command = ' && '.join(env + [ command ])
|
|
|
command = ' && '.join(env + [ command ])
|
|
|
return command
|
|
|
return command
|
|
@@ -53,15 +54,15 @@ def jail_create(path, command, env, mounts, hostname=None): |
|
|
print('command:', command)
|
|
|
print('command:', command)
|
|
|
blk['exec.start'] = command
|
|
|
blk['exec.start'] = command
|
|
|
prestart = [ 'cp /etc/resolv.conf ' +
|
|
|
prestart = [ 'cp /etc/resolv.conf ' +
|
|
|
quote(os.path.join(path, 'etc/resolv.conf')) ]
|
|
|
|
|
|
|
|
|
shlex.quote(os.path.join(path, 'etc/resolv.conf')) ]
|
|
|
poststop = []
|
|
|
poststop = []
|
|
|
if mounts:
|
|
|
if mounts:
|
|
|
for (from_, on) in mounts:
|
|
|
for (from_, on) in mounts:
|
|
|
if not from_.startswith('/'):
|
|
|
if not from_.startswith('/'):
|
|
|
from_, _ = zfs_find(from_, focker_type='volume')
|
|
|
from_, _ = zfs_find(from_, focker_type='volume')
|
|
|
from_ = zfs_mountpoint(from_)
|
|
|
from_ = zfs_mountpoint(from_)
|
|
|
prestart.append('mount -t nullfs ' + quote(from_) +
|
|
|
|
|
|
' ' + quote(os.path.join(path, on.strip('/'))))
|
|
|
|
|
|
|
|
|
prestart.append('mount -t nullfs ' + shlex.quote(from_) +
|
|
|
|
|
|
' ' + shlex.quote(os.path.join(path, on.strip('/'))))
|
|
|
poststop += [ 'umount -f ' +
|
|
|
poststop += [ 'umount -f ' +
|
|
|
os.path.join(path, on.strip('/')) \
|
|
|
os.path.join(path, on.strip('/')) \
|
|
|
for (_, on) in reversed(mounts) ]
|
|
|
for (_, on) in reversed(mounts) ]
|
|
@@ -215,7 +216,9 @@ def command_jail_oneshot(args): |
|
|
for a in args.env }
|
|
|
for a in args.env }
|
|
|
mounts = [ [ a.split(':')[0], a.split(':')[1] ] \
|
|
|
mounts = [ [ a.split(':')[0], a.split(':')[1] ] \
|
|
|
for a in args.mounts]
|
|
|
for a in args.mounts]
|
|
|
jailname = jail_create(path, ' '.join(map(quote, args.command)), env, mounts)
|
|
|
|
|
|
|
|
|
jailname = jail_create(path,
|
|
|
|
|
|
' '.join(map(shlex.quote, args.command or ['/bin/sh'])),
|
|
|
|
|
|
env, mounts)
|
|
|
subprocess.run(['jail', '-c', jailname])
|
|
|
subprocess.run(['jail', '-c', jailname])
|
|
|
jail_remove(path)
|
|
|
jail_remove(path)
|
|
|
|
|
|
|
|
|