|
|
@@ -15,7 +15,41 @@ import os |
|
|
|
import jailconf
|
|
|
|
from .mount import getmntinfo
|
|
|
|
import shlex
|
|
|
|
import fcntl
|
|
|
|
# import pdb
|
|
|
|
import stat
|
|
|
|
|
|
|
|
|
|
|
|
def backup_file(fname, nbackups=10):
|
|
|
|
existing_backups = []
|
|
|
|
for i in range(nbackups):
|
|
|
|
bakname = '%s.%d' % (fname, i)
|
|
|
|
if os.path.exists(bakname):
|
|
|
|
st = os.stat(bakname)
|
|
|
|
existing_backups.append((bakname, st.st_mtime))
|
|
|
|
else:
|
|
|
|
shutil.copyfile(fname, bakname)
|
|
|
|
return bakname
|
|
|
|
existing_backups.sort(key=lambda a: a[1])
|
|
|
|
# overwrite the oldest
|
|
|
|
bakname = existing_backups[0][0]
|
|
|
|
shutil.copyfile(fname, bakname)
|
|
|
|
return bakname
|
|
|
|
|
|
|
|
|
|
|
|
def jail_conf_write(conf):
|
|
|
|
os.makedirs('/var/lock', exist_ok=True)
|
|
|
|
with open('/var/lock/focker.lock', 'a+') as f:
|
|
|
|
print('Waiting for /var/lock/focker.lock ...')
|
|
|
|
fcntl.flock(f, fcntl.LOCK_EX)
|
|
|
|
print('Lock acquired')
|
|
|
|
try:
|
|
|
|
bakname = backup_file('/etc/jail.conf')
|
|
|
|
os.chmod(bakname, 0o600)
|
|
|
|
conf.write('/etc/jail.conf')
|
|
|
|
finally:
|
|
|
|
fcntl.flock(f, fcntl.LOCK_UN)
|
|
|
|
print('Lock released')
|
|
|
|
|
|
|
|
|
|
|
|
def jail_fs_create(image=None):
|
|
|
@@ -92,7 +126,7 @@ def jail_create(path, command, env, mounts, hostname=None, overrides={}): |
|
|
|
blk['host.hostname'] = hostname or name
|
|
|
|
for (k, v) in overrides.items():
|
|
|
|
blk[k] = quote(v)
|
|
|
|
conf.write('/etc/jail.conf')
|
|
|
|
jail_conf_write(conf)
|
|
|
|
return name
|
|
|
|
|
|
|
|
|
|
|
@@ -174,7 +208,7 @@ def jail_remove(path): |
|
|
|
name = os.path.split(path)[-1]
|
|
|
|
if name in conf:
|
|
|
|
del conf[name]
|
|
|
|
conf.write('/etc/jail.conf')
|
|
|
|
jail_conf_write(conf)
|
|
|
|
|
|
|
|
|
|
|
|
def command_jail_create(args):
|
|
|
|