[libvirt] [PATCH sandbox] Delete the virt-sandbox-service command
Cedric Bosdonnat
cbosdonnat at suse.com
Mon Mar 26 15:56:46 UTC 2018
On Mon, 2018-03-26 at 15:35 +0100, Daniel P. Berrangé wrote:
> This command attempted to create sandboxed containers for running
> systemd services that exist on the host. This code has proved very
> fragile, however, since it needs heuristics to figure out which dirs
> need to be made private in the container vs shared with the host. Even
> a relatively simple "httpd.service" sandbox no longer works with
> current Fedora.
>
> Users wanting to sandbox services are better served by using systemd's
> native container functionality, or using Docker container images. The
> virt-sandbox-image tool can even run Docker/virt-builder images directly.
>
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
> TODO | 24 -
> bin/Makefile.am | 80 +-
> bin/virt-sandbox-service | 1314 ---------------------------
> bin/virt-sandbox-service-bash-completion.sh | 141 ---
> bin/virt-sandbox-service-clone.pod | 100 --
> bin/virt-sandbox-service-connect.pod | 59 --
> bin/virt-sandbox-service-create.pod | 264 ------
> bin/virt-sandbox-service-delete.pod | 65 --
> bin/virt-sandbox-service-execute.pod | 71 --
> bin/virt-sandbox-service-reload.pod | 63 --
> bin/virt-sandbox-service-upgrade.pod | 74 --
> bin/virt-sandbox-service-util.c | 305 -------
> bin/virt-sandbox-service.logrotate | 9 -
> bin/virt-sandbox-service.pod | 85 --
> cfg.mk | 2 +-
> libvirt-sandbox.spec.in | 7 -
> libvirt-sandbox/tests/containers_test.sh | 37 -
> po/POTFILES.in | 1 -
> 18 files changed, 3 insertions(+), 2698 deletions(-)
> delete mode 100644 TODO
> delete mode 100755 bin/virt-sandbox-service
> delete mode 100755 bin/virt-sandbox-service-bash-completion.sh
> delete mode 100644 bin/virt-sandbox-service-clone.pod
> delete mode 100644 bin/virt-sandbox-service-connect.pod
> delete mode 100644 bin/virt-sandbox-service-create.pod
> delete mode 100644 bin/virt-sandbox-service-delete.pod
> delete mode 100644 bin/virt-sandbox-service-execute.pod
> delete mode 100644 bin/virt-sandbox-service-reload.pod
> delete mode 100644 bin/virt-sandbox-service-upgrade.pod
> delete mode 100644 bin/virt-sandbox-service-util.c
> delete mode 100644 bin/virt-sandbox-service.logrotate
> delete mode 100644 bin/virt-sandbox-service.pod
> delete mode 100755 libvirt-sandbox/tests/containers_test.sh
>
> diff --git a/TODO b/TODO
> deleted file mode 100644
> index fc63361..0000000
> --- a/TODO
> +++ /dev/null
> @@ -1,24 +0,0 @@
> - libvirt-sandbox TODO list
> - =================
> -
> -systemd-tmpfiles --create needs to be run within the container, before any
> -apps are started, since it will populate /run (Completed)
> -
> -CGROUPFS: integration so libvirt does it rather then systemd within the container
> - We need kernel labeling support for cgroupfs so we can allow systemd to write to its section of the
> cgroupfs.
> -
> -SYSLOG: Currently syslog messages are going no where within the container.
> -If we run a syslog within the container will it get messages from the outside? Should we just use systemd-
> journal. I think sysadmins will want to be able to look in /var/log/messages within the container. (systemd-journal
> is now running within a container)
> -
> -EXECUTE:
> - virt-sandbox-service execute --command "BLAH" does not work. We need to have the ability to execute any
> random command within the container, and get stdin, stdout, stderror outside the container. (Partially Completed)
> -Still needs kernel to implement missing container namespace files under /proc/PID/ns, Also need a mechanism to get
> the PID of systemd from libvirt.
> -
> -HOSTNAME:
> - Currently if I execute hostname within the container it sees the name of the host not the name based on the
> container name or the IP Address associated with dhclient. (Completed)
> -
> -virt-sandbox-service connect NAME hangs when you attempt to end the connection.
> -^d should bring you back to the host terminal.
> -
> -Need a mechanism to allow admins to specify additional services to run within
> -the container. For example you may want to run mysql and apache within the same container. (Completed) You can do
> this using systemctl enabel BLAH
> diff --git a/bin/Makefile.am b/bin/Makefile.am
> index deedcf6..db0a1d1 100644
> --- a/bin/Makefile.am
> +++ b/bin/Makefile.am
> @@ -1,39 +1,12 @@
>
> bin_PROGRAMS = virt-sandbox
>
> -libexec_PROGRAMS = virt-sandbox-service-util
> +bin_SCRIPTS = virt-sandbox-image
>
> -bin_SCRIPTS = virt-sandbox-service \
> - virt-sandbox-image
> -
> -virtsandboxcompdir = $(datarootdir)/bash-completion/completions/
> -
> -crondailydir = $(sysconfdir)/cron.daily
> -crondaily_SCRIPTS = virt-sandbox-service.logrotate
> -
> -POD_FILES = \
> - virt-sandbox-service.pod \
> - virt-sandbox-service-execute.pod \
> - virt-sandbox-service-create.pod \
> - virt-sandbox-service-clone.pod \
> - virt-sandbox-service-connect.pod \
> - virt-sandbox-service-delete.pod \
> - virt-sandbox-service-reload.pod \
> - virt-sandbox-service-upgrade.pod \
> - $(NULL)
> -EXTRA_DIST = $(bin_SCRIPTS) $(POD_FILES) virt-sandbox-service-bash-completion.sh virt-sandbox-service.logrotate
> -EXTRA_DIST += virt-sandbox-service-bash-completion.sh
> +EXTRA_DIST = $(bin_SCRIPTS)
>
> man1_MANS = \
> virt-sandbox.1 \
> - virt-sandbox-service.1 \
> - virt-sandbox-service-execute.1 \
> - virt-sandbox-service-create.1 \
> - virt-sandbox-service-clone.1 \
> - virt-sandbox-service-connect.1 \
> - virt-sandbox-service-delete.1 \
> - virt-sandbox-service-reload.1 \
> - virt-sandbox-service-upgrade.1 \
> $(NULL)
>
> POD2MAN = pod2man -c "Virtualization Support" -r "$(PACKAGE)-$(VERSION)"
> @@ -41,30 +14,6 @@ POD2MAN = pod2man -c "Virtualization Support" -r "$(PACKAGE)-$(VERSION)"
> virt-sandbox.1: virt-sandbox.c Makefile
> $(AM_V_GEN)$(POD2MAN) $< $(srcdir)/$@
>
> -virt-sandbox-service.1: virt-sandbox-service.pod Makefile
> - $(AM_V_GEN)$(POD2MAN) $< $(srcdir)/$@
> -
> -virt-sandbox-service-execute.1: virt-sandbox-service-execute.pod Makefile
> - $(AM_V_GEN)$(POD2MAN) $< $(srcdir)/$@
> -
> -virt-sandbox-service-clone.1: virt-sandbox-service-clone.pod Makefile
> - $(AM_V_GEN)$(POD2MAN) $< $(srcdir)/$@
> -
> -virt-sandbox-service-create.1: virt-sandbox-service-create.pod Makefile
> - $(AM_V_GEN)$(POD2MAN) $< $(srcdir)/$@
> -
> -virt-sandbox-service-connect.1: virt-sandbox-service-connect.pod Makefile
> - $(AM_V_GEN)$(POD2MAN) $< $(srcdir)/$@
> -
> -virt-sandbox-service-delete.1: virt-sandbox-service-delete.pod Makefile
> - $(AM_V_GEN)$(POD2MAN) $< $(srcdir)/$@
> -
> -virt-sandbox-service-reload.1: virt-sandbox-service-reload.pod Makefile
> - $(AM_V_GEN)$(POD2MAN) $< $(srcdir)/$@
> -
> -virt-sandbox-service-upgrade.1: virt-sandbox-service-upgrade.pod Makefile
> - $(AM_V_GEN)$(POD2MAN) $< $(srcdir)/$@
> -
> CLEANFILES = $(man1_MANS)
>
> virt_sandbox_SOURCES = virt-sandbox.c
> @@ -81,28 +30,3 @@ virt_sandbox_LDFLAGS = \
> ../libvirt-sandbox/libvirt-sandbox-1.0.la \
> $(WARN_CFLAGS) \
> $(NULL)
> -
> -virt_sandbox_service_util_SOURCES = virt-sandbox-service-util.c
> -virt_sandbox_service_util_CFLAGS = \
> - $(GIO_UNIX_CFLAGS) \
> - $(LIBVIRT_GOBJECT_CFLAGS) \
> - -I$(top_srcdir) \
> - -DLOCALEDIR="\"$(datadir)/locale"\" \
> - $(WARN_CFLAGS) \
> - $(NULL)
> -virt_sandbox_service_util_LDFLAGS = \
> - $(GIO_UNIX_LIBS) \
> - $(LIBVIRT_GOBJECT_LIBS) \
> - ../libvirt-sandbox/libvirt-sandbox-1.0.la \
> - $(WARN_CFLAGS) \
> - $(NULL)
> -
> -install-data-local:
> - $(MKDIR_P) $(DESTDIR)$(sysconfdir)/libvirt-sandbox/services
> - $(MKDIR_P) $(DESTDIR)$(virtsandboxcompdir)
> - cp $(srcdir)/virt-sandbox-service-bash-completion.sh $(DESTDIR)$(virtsandboxcompdir)/virt-sandbox-
> service
> -
> -uninstall-local:
> - $(rmdir) $(DESTDIR)$(sysconfdir)/libvirt-sandbox/services ||:
> - $(rmdir) $(DESTDIR)$(sysconfdir)/libvirt-sandbox ||:
> - rm -f $(DESTDIR)$(virtsandboxcompdir)/virt-sandbox-service
> diff --git a/bin/virt-sandbox-service b/bin/virt-sandbox-service
> deleted file mode 100755
> index c458716..0000000
> --- a/bin/virt-sandbox-service
> +++ /dev/null
> @@ -1,1314 +0,0 @@
> -#!/usr/bin/env python3
> -#
> -# Authors: Dan Walsh <dwalsh at redhat.com>
> -#
> -# Copyright (C) 2012-2013 Red Hat, Inc.
> -#
> -# This program is free software; you can redistribute it and/or modify
> -# it under the terms of the GNU General Public License as published by
> -# the Free Software Foundation; either version 2 of the License, or
> -# (at your option) any later version.
> -#
> -# This program is distributed in the hope that it will be useful,
> -# but WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> -# GNU General Public License for more details.
> -#
> -# You should have received a copy of the GNU General Public License
> -# along with this program; if not, write to the Free Software
> -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> -#
> -
> -import gi
> -gi.require_version('LibvirtGConfig', '1.0')
> -from gi.repository import LibvirtGConfig
> -gi.require_version('LibvirtGObject', '1.0')
> -from gi.repository import LibvirtGObject
> -gi.require_version('LibvirtSandbox', '1.0')
> -from gi.repository import LibvirtSandbox
> -from gi.repository import GLib
> -import gi
> -import re
> -import os, sys, shutil, errno, stat
> -import rpm
> -from subprocess import Popen, PIPE, STDOUT
> -import gettext
> -import pwd
> -
> -if os.path.exists("/sys/fs/selinux"):
> - import selinux
> -else:
> - selinux = None
> -
> -LibvirtGObject.init_object_check(None)
> -LibvirtSandbox.init_check(None)
> -
> -gettext.bindtextdomain("libvirt-sandbox", "/usr/share/locale")
> -gettext.textdomain("libvirt-sandbox")
> -try:
> - gettext.install("libvirt-sandbox",
> - localedir="/usr/share/locale",
> - codeset = 'utf-8')
> -except IOError:
> - import __builtin__
> - __builtin__.__dict__['_'] = unicode
> -
> -CONFIG_PATH = "/etc/libvirt-sandbox/services/"
> -def get_config_path(name):
> - return CONFIG_PATH + name + "/config/sandbox.cfg"
> -
> -def get_legacy_config_path(name):
> - return CONFIG_PATH + name + ".sandbox"
> -
> -def read_config(name):
> - path = get_config_path(name)
> - if not os.path.exists(path):
> - return None
> - return LibvirtSandbox.Config.load_from_path(path)
> -
> -# shutil.copytree throws a fit if it finds sockets
> -# or fifos, and has really bad behaviour on block
> -# and character devices too.
> -def copydirtree(src, dst):
> - filenames = os.listdir(src)
> - os.makedirs(dst)
> -
> - for filename in filenames:
> - srcfilepath = os.path.join(src, filename)
> - dstfilepath = os.path.join(dst, filename)
> -
> - st = os.lstat(srcfilepath)
> - if stat.S_ISDIR(st.st_mode):
> - copydirtree(srcfilepath, dstfilepath)
> -
> - os.utime(dstfilepath, (st.st_atime, st.st_mtime))
> - os.chmod(dstfilepath, stat.S_IMODE(st.st_mode))
> - elif stat.S_ISREG(st.st_mode):
> - with open(srcfilepath, 'rb') as fsrc:
> - with open(dstfilepath, 'wb') as fdst:
> - while 1:
> - buf = fsrc.read(1024*32)
> - if not buf:
> - break
> - fdst.write(buf)
> -
> - os.utime(dstfilepath, (st.st_atime, st.st_mtime))
> - os.chmod(dstfilepath, stat.S_IMODE(st.st_mode))
> - elif stat.S_ISLNK(st.st_mode):
> - linkdst = os.readlink(srcfilepath)
> - os.symlink(linkdst, dstfilepath)
> - else:
> - # Ignore all other special files (block/char/sock/fifo)
> - pass
> -
> -class Container:
> - DEFAULT_PATH = "/var/lib/libvirt/filesystems"
> - DEFAULT_IMAGE = "/var/lib/libvirt/images/%s.raw"
> - SELINUX_FILE_TYPE = "svirt_lxc_file_t"
> -
> - def __init__(self, name=None, uri = "lxc:///", path = DEFAULT_PATH, config=None, create=False):
> - self.uri = uri
> - self.use_image = False
> - self.size = 10 * MB
> - self.path = path
> - self.config = config
> - if self.config:
> - self.name = self.config.get_name()
> - else:
> - self.name = name
> - self.dest = "%s/%s" % (self.path, self.name)
> - self.file_type = self.SELINUX_FILE_TYPE
> - self.conn = None
> - self.image = None
> - self.uid = 0
> - self.mounts = []
> -
> - def get_file_type(self):
> - return self.file_type
> -
> - def set_file_type(self, file_type):
> - self.file_type = file_type
> -
> - def set_uid(self, uid):
> - self.config.set_userid(uid)
> -
> - def get_uid(self):
> - return self.config.get_userid(uid)
> -
> - def set_gid(self, gid):
> - self.config.set_groupid(gid)
> -
> - def get_gid(self):
> - return self.config.get_groupid(gid)
> -
> - def set_username(self, username):
> - self.config.set_username(username)
> -
> - def get_username(self):
> - return self.config.get_username()
> -
> - def set_homedir(self, homedir):
> - self.config.set_homedir(homedir)
> -
> - def get_homedir(self):
> - return self.config.get_homedir()
> -
> - def set_mounts(self, mounts):
> - self.mounts = mounts
> -
> - def get_mounts(self):
> - return self.mounts
> -
> - def add_mounts(self):
> - self.config.add_mount_strv(self.mounts)
> -
> - def get_config_path(self, name = None):
> - if not name:
> - name = self.name
> - return get_config_path(name)
> -
> - def get_filesystem_path(self, name = None):
> - if not name:
> - name = self.get_name()
> - return "%s/%s" % (self.path, name)
> -
> - def get_image_path(self, name = None):
> - if not name:
> - name = self.get_name()
> - return self.DEFAULT_IMAGE % name
> -
> - def set_image(self, size):
> - self.use_image = True
> - self.size = size * MB
> -
> - def set_path(self, path):
> - self.path = path
> - self.dest = "%s/%s" % (self.path, self.name)
> -
> - def get_name(self):
> - return self.name
> -
> - def set_name(self, name):
> - if self.config:
> - raise ValueError([_("Cannot modify Name")])
> - self.name = name
> - self.dest = "%s/%s" % (self.path, self.name)
> -
> - def set_security(self, val):
> - self.config.set_security_opts(val)
> -
> - def add_network(self, val):
> - self.config.add_network_opts(val)
> -
> - def get_security_dynamic(self):
> - return self.config.get_security_dynamic()
> -
> - def get_security_label(self):
> - return self.config.get_security_label()
> -
> - def set_security_label(self):
> - if selinux is None:
> - return
> -
> - if self.image or self.get_security_dynamic():
> - return
> -
> - selabel = self.get_security_label()
> - if selabel is None:
> - raise ValueError([_("Missing security label configuration")])
> - parts = selabel.split(":")
> - selinux.chcon(self.dest, "system_u:object_r:%s:%s" % (
> - self.get_file_type(), ":".join(parts[3:])), True)
> -
> - def gen_filesystems(self):
> - if self.use_image:
> - self.image = self.DEFAULT_IMAGE % self.get_name()
> - mount = LibvirtSandbox.ConfigMountHostImage.new(self.image, self.dest,
> - LibvirtGConfig.DomainDiskFormat.RAW)
> - self.config.add_mount(mount)
> -
> - def fix_stat(self, f):
> - try:
> - s = os.stat(f)
> - path = "%s%s" % (self.dest, f)
> - os.chown(path, s.st_uid, s.st_gid)
> - os.chmod(path, s.st_mode)
> - except OSError as e:
> - if not e.errno == errno.ENOENT:
> - raise
> -
> - def fix_protection(self):
> - l = len(self.dest)
> - for root, dirs, files in os.walk(self.dest):
> - for f in files:
> - dest = root + "/" + f
> - self.fix_stat(dest[l:])
> - for d in dirs:
> - dest = root + "/" + d
> - self.fix_stat(dest[l:])
> -
> - def makedirs(self, d):
> - try:
> - path = "%s%s" % (self.dest, d)
> - os.makedirs(path)
> - except OSError as e:
> - if not e.errno == errno.EEXIST:
> - raise
> -
> - def makefile(self, f):
> - self.makedirs(os.path.dirname(f))
> - try:
> - path = "%s%s" % (self.dest, f)
> - fd=open(path, "w")
> - fd.close()
> - except OSError as e:
> - if not e.errno == errno.EEXIST:
> - raise
> -
> - def umount(self):
> - p = Popen(["/bin/umount", self.dest])
> - p.communicate()
> - if p.returncode and p.returncode != 0:
> - raise OSError(_("Failed to unmount image %s from %s") % (self.image, self.dest))
> -
> - def create_image(self):
> - fd = open(self.image, "w")
> - fd.truncate(self.size)
> - fd.close()
> - p = Popen(["/sbin/mkfs","-F", "-t", "ext4", self.image],stdout=PIPE, stderr=PIPE)
> - p.communicate()
> - if p.returncode and p.returncode != 0:
> - raise OSError(_("Failed to build image %s") % self.image )
> -
> - p = Popen(["/bin/mount", self.image, self.dest])
> - p.communicate()
> - if p.returncode and p.returncode != 0:
> - raise OSError(_("Failed to mount image %s on %s") % (self.image, self.dest))
> -
> - def save_config(self):
> - self.connect()
> - context = self.context()
> - context.define()
> - sys.stdout.write(_("Created sandbox config %s\n") % get_config_path(self.name))
> -
> - def update_config(self):
> - self.connect()
> - context = self.context()
> - context.undefine()
> - context.define()
> - sys.stdout.write(_("Re-created sandbox config %s\n") % get_config_path(self.name))
> -
> - def delete(self):
> - self.connect()
> - self.conn.fetch_domains(None)
> - dom = self.conn.find_domain_by_name(self.name)
> - if dom is not None:
> - info = dom.get_info()
> - if info.state == LibvirtGObject.DomainState.RUNNING:
> - raise ValueError([_("Cannot delete running container")])
> -
> - # Not sure we should remove content
> - if os.path.exists(self.dest):
> - shutil.rmtree(self.dest)
> -
> - image = self.get_image_path()
> - if os.path.exists(image):
> - os.remove(image)
> -
> - context = self.context()
> - context.undefine()
> -
> - def get_security_model(self):
> - model = None
> -
> - # Make sure we have a connection
> - self.connect()
> -
> - # Loop over the security models from the host capabilities
> - # The first in "selinux" and "apparmor" will be the returned model
> - # Those two models can't coexist on a machine
> - configCaps = self.conn.get_capabilities()
> - hostCaps = configCaps.get_host()
> - secmodels = hostCaps.get_secmodels()
> - for secmodel in secmodels:
> - if secmodel.get_model() == "selinux":
> - model = "selinux"
> - break
> - elif secmodel.get_model() == "apparmor":
> - model = "apparmor"
> - break
> -
> - return model
> -
> -
> - def create(self):
> - self.connect()
> - if self.get_security_model() is not None and \
> - self.config.get_security_dynamic() and not self.use_image:
> - raise ValueError([_("Dynamic security label only supported for image based containers")])
> - if self.uri != "lxc:///":
> - self.config.set_shell(True)
> - if not os.path.exists(self.dest):
> - os.mkdir(self.dest)
> -
> - def connect(self):
> - if not self.conn:
> - self.conn=LibvirtGObject.Connection.new(self.uri)
> - self.conn.open(None)
> -
> - def disconnect(self):
> - if self.conn:
> - self.conn.close()
> - self.conn = None
> -
> - def context(self):
> - return LibvirtSandbox.ContextService.new(self.conn, self.config)
> -
> - def add_bind_mount(self, source, dest):
> - if self.image is None:
> - mount = LibvirtSandbox.ConfigMountHostBind.new(source, dest)
> - else:
> - mount = LibvirtSandbox.ConfigMountGuestBind.new(source, dest)
> - self.config.add_mount(mount)
> -
> - def add_ram_mount(self, dest, size):
> - mount = LibvirtSandbox.ConfigMountRam.new(dest, size);
> - self.config.add_mount(mount)
> -
> -class GenericContainer(Container):
> - def __init__(self, name=None, uri = "lxc:///", path = Container.DEFAULT_PATH, config=None, create=False):
> - Container.__init__(self, name, uri, path, config, create)
> -
> - if create:
> - self.config = LibvirtSandbox.ConfigServiceGeneric.new(name)
> -
> - def gen_filesystems(self):
> - Container.gen_filesystems(self)
> - self.add_bind_mount(self.dest, self.path)
> - self.add_mounts()
> -
> - def create_generic(self):
> - Container.create(self)
> - self.gen_filesystems()
> -
> - if self.image:
> - self.create_image()
> - self.umount()
> - sys.stdout.write(_("Created sandbox container image %s\n") % self.image)
> - else:
> - sys.stdout.write(_("Created sandbox container dir %s\n") % self.dest)
> - self.save_config()
> -
> - def create(self):
> - try:
> - self.create_generic()
> - except Exception as e:
> - try:
> - self.delete()
> - except Exception as e2:
> - pass
> - raise e
> -
> - def set_command(self, command):
> - self.config.set_command(command)
> -
> -
> -def is_template_unit(unit):
> - return '@' in unit
> -
> -class SystemdContainer(Container):
> - IGNORE_DIRS = [ "/var/run/", "/etc/logrotate.d/", "/etc/pam.d" ]
> - DEFAULT_DIRS = [ "/etc", "/var" ]
> - PROFILE_FILES = [ ".bashrc", ".bash_profile", ".profile" ]
> - MACHINE_ID = "/etc/machine-id"
> - HOSTNAME = "/etc/hostname"
> - SYSVINIT_PATH = "/etc/rc.d"
> - ANACONDA_WANTS_PATH = "/usr/lib/systemd/system/anaconda.target.wants"
> - MULTI_USER_WANTS_PATH = "/usr/lib/systemd/system/multi-user.target.wants"
> - SYSINIT_WANTS_PATH = "/usr/lib/systemd/system/sysinit.target.wants"
> - SOCKET_WANTS_PATH = "/usr/lib/systemd/system/sockets.target.wants"
> - MAKE_SYSTEM_DIRS = [ "/var/lib/dhclient", "/var/lib/dbus", "/var/log", "/var/spool", "/var/cache", "/var/tmp",
> "/var/lib/nfs/rpc_pipefs", SYSVINIT_PATH, "/lib/lsb" ]
> - BIND_SYSTEM_DIRS = [ "/var", "/home", "/root", "/etc/systemd/system", "/etc/rc.d",
> "/usr/lib/systemd/system/basic.target.wants", "/usr/lib/systemd/system/local-fs.target.wants", ANACONDA_WANTS_PATH,
> MULTI_USER_WANTS_PATH, SYSINIT_WANTS_PATH, SOCKET_WANTS_PATH ]
> - BIND_SYSTEM_FILES = [ MACHINE_ID, "/etc/fstab", HOSTNAME ]
> - LOCAL_LINK_FILES = { SYSINIT_WANTS_PATH : [ "systemd-tmpfiles-setup.service" ] , SOCKET_WANTS_PATH : [
> "dbus.socket", "systemd-journald.socket", "systemd-shutdownd.socket", "systemd-initctl.socket" ] }
> -
> - DEFAULT_UNIT = "/etc/systemd/system/%s_sandbox.service"
> -
> - def __init__(self, name=None, uri = "lxc:///", path = Container.DEFAULT_PATH, config=None, create=False,
> packages=[]):
> - Container.__init__(self, name, uri, path, config, create)
> - self.copy = False
> - self.unit_file_list = []
> - self.packages = packages
> - if create:
> - self.config = LibvirtSandbox.ConfigServiceSystemd.new(name)
> - self.unitfile = None
> - else:
> - self.unitfile = self.get_unit_path()
> -
> - def follow_units(self):
> - unitst=""
> - for i, src in self.unit_file_list:
> - unitst += "ReloadPropagatedFrom=%s\n" % i
> -
> - return unitst
> -
> - def get_unit_path(self, name = None):
> - if not name:
> - name = self.get_name()
> - return self.DEFAULT_UNIT % name
> -
> - def set_unit_file_list(self, unit_file_list):
> - self.unit_file_list = unit_file_list
> -
> - def get_sandboxed_service(self):
> - return self.unit_file_list[0][0].split(".")[0]
> -
> - def create_system_unit(self):
> - self.unitfile = self.get_unit_path()
> - unit = r"""
> -[Unit]
> -Description=Secure Sandbox Container %(NAME)s
> -Requires=libvirtd.service
> -After=libvirtd.service
> -%(FOLLOW)s
> -[Service]
> -Type=simple
> -ExecStart=/usr/libexec/virt-sandbox-service-util -c %(URI)s -s %(NAME)s
> -ExecReload=/usr/bin/virt-sandbox-service -c %(URI)s reload -u %(RELOAD)s %(NAME)s
> -ExecStop=/usr/bin/virsh -c %(URI)s destroy %(NAME)s
> -
> -[Install]
> -WantedBy=multi-user.target
> -""" % { 'NAME':self.name,
> - 'FOLLOW':self.follow_units(),
> - 'RELOAD': " -u ".join(map(lambda x: x[0], self.unit_file_list)),
> - 'URI': self.uri,
> - }
> -
> - fd = open(self.unitfile, "w")
> - fd.write(unit)
> - fd.close()
> - if selinux is not None:
> - selinux.restorecon(self.unitfile)
> - sys.stdout.write(_("Created unit file %s\n") % self.unitfile)
> -
> - def add_dir(self, newd):
> - if newd in self.all_dirs:
> - return
> - for ignd in self.IGNORE_DIRS:
> - if newd.startswith(ignd):
> - return
> - for defd in self.DEFAULT_DIRS:
> - if newd.startswith(defd):
> - self.all_dirs.append(newd)
> - tmp_dirs = []
> - for d in self.dirs:
> - if newd.startswith(d):
> - return
> - if not d.startswith(newd):
> - tmp_dirs.append(d)
> - self.dirs = tmp_dirs
> - self.dirs.append(newd)
> - break;
> -
> - def add_file(self, newf):
> - if newf in self.files:
> - return
> - for d in self.IGNORE_DIRS:
> - if newf.startswith(d):
> - return
> - for d in self.DEFAULT_DIRS:
> - if newf.startswith(d):
> - self.files.append(newf)
> - break;
> -
> - def get_name(self):
> - if self.config:
> - return self.config.get_name()
> - raise ValueError([_("Name not configured")])
> -
> - def set_copy(self, copy):
> - self.copy = copy
> -
> - def get_security_dynamic(self):
> - return self.config.get_security_dynamic()
> -
> - def extract_rpms(self):
> - self.all_dirs = []
> - self.dirs = []
> - self.files = []
> -
> - self.ts = rpm.ts()
> -
> - nb_packages = 0
> - for u, src in self.unit_file_list:
> - rpm_name = self.get_rpm_for_unit(src)
> - if rpm_name:
> - self.extract_rpm(rpm_name)
> - nb_packages += 1
> -
> - for package in self.packages:
> - self.extract_rpm(package)
> - nb_packages += 1
> -
> - if nb_packages == 0:
> - raise ValueError([_("Cannot autodetect the package for unit files, please use --package")])
> -
> - def split_filename(self, filename):
> - if filename[-4:] == '.rpm':
> - filename = filename[:-4]
> -
> - archIndex = filename.rfind('.')
> - arch = filename[archIndex+1:]
> -
> - relIndex = filename[:archIndex].rfind('-')
> - rel = filename[relIndex+1:archIndex]
> -
> - verIndex = filename[:relIndex].rfind('-')
> - ver = filename[verIndex+1:relIndex]
> -
> - epochIndex = filename.find(':')
> - if epochIndex == -1:
> - epoch = ''
> - else:
> - epoch = filename[:epochIndex]
> -
> - name = filename[epochIndex + 1:verIndex]
> - return name, ver, rel, epoch, arch
> -
> - def get_rpm_for_unit(self, unitfile):
> - mi = self.ts.dbMatch(rpm.RPMTAG_BASENAMES, unitfile)
> - try:
> - h = next(mi);
> - except StopIteration:
> - return None
> - return h['name']
> -
> -
> - def extract_rpm(self, rpm_name):
> - mi = self.ts.dbMatch('name', rpm_name)
> - try:
> - h = next(mi);
> - except StopIteration:
> - raise ValueError([_("Cannot find package named %s") % rpm_name])
> -
> - for fentry in h.fiFromHeader():
> - fname = fentry[0]
> -
> - if os.path.isdir(fname):
> - self.add_dir(fname)
> - if os.path.isfile(fname):
> - self.add_file(fname)
> -
> - srcrpm = str(h[rpm.RPMTAG_SOURCERPM], encoding='utf-8')
> - srcrpmbits = self.split_filename(srcrpm)
> -
> - if srcrpmbits[0] == str(h[rpm.RPMTAG_NAME], encoding='utf-8'):
> - return
> -
> - mi = self.ts.dbMatch(rpm.RPMTAG_NAME, srcrpmbits[0])
> - try:
> - h = next(mi);
> - except StopIteration:
> - raise ValueError([_("Cannot find base package %s") % srcrpmbits[0]])
> -
> - for fentry in h.fiFromHeader():
> - fname = fentry[0]
> -
> - if os.path.isdir(fname):
> - self.add_dir(fname)
> - if os.path.isfile(fname):
> - self.add_file(fname)
> -
> - def gen_hostname(self):
> - fd=open(self.dest + self.HOSTNAME, "w")
> - fd.write("%s\n" % self.name )
> - fd.close()
> -
> - def gen_machine_id(self):
> - uuid_fd = open("/proc/sys/kernel/random/uuid")
> - uuid = uuid_fd.read().replace("-","").rstrip()
> - uuid_fd.close()
> - self.config.set_uuid(uuid)
> - fd=open(self.dest + self.MACHINE_ID, "w")
> - fd.write("%s\n" % uuid)
> - fd.close()
> -
> - if not self.use_image:
> - # Link /var/log/journal within the container to /var/log/journal/UUID
> - # on host. This will allow the hosts journalctl to easily read
> - # containers journal information.
> - jdir = "/var/log/journal/"
> - jpath = jdir + uuid
> - if not os.path.exists(self.dest + jpath):
> - os.makedirs(self.dest + jpath)
> - if not os.path.exists(jdir):
> - os.makedirs(jdir)
> -
> - os.symlink(self.dest + jpath, jpath)
> -
> - def gen_filesystems(self):
> - Container.gen_filesystems(self)
> - # 10 MB /run
> - mount = LibvirtSandbox.ConfigMountRam.new("/run", 10 * 1024 * 1024);
> - self.config.add_mount(mount)
> -
> - # 100 MB /tmp
> - mount = LibvirtSandbox.ConfigMountRam.new("/tmp", 100 * 1024 * 1024);
> - self.config.add_mount(mount)
> -
> - # 100 MB /tmp
> - mount = LibvirtSandbox.ConfigMountRam.new("/dev/shm", 100 * 1024 * 1024);
> - self.config.add_mount(mount)
> -
> - for d in self.BIND_SYSTEM_DIRS:
> - if d != "/var" and os.path.exists(d):
> - source = "%s%s" % ( self.dest, d)
> - self.add_bind_mount(source, d)
> -
> - for f in self.BIND_SYSTEM_FILES:
> - if os.path.exists(f):
> - source = "%s%s" % ( self.dest, f)
> - self.add_bind_mount(source, f)
> -
> - for d in self.dirs:
> - found = False
> - # Dont add dirs whos parents are in SYSTEM_DIRS
> - for s in self.BIND_SYSTEM_DIRS:
> - if d.startswith(s):
> - found = True
> - break
> - if not found:
> - source = "%s%s" % ( self.dest, d)
> - self.add_bind_mount(source, d)
> -
> - # /var contains the mounted image if there is an image: should be the
> - # last thing to mount
> - self.add_bind_mount("%s/var" % self.dest, "/var")
> - self.add_mounts()
> -
> - def get_expanded_unit_template(self, unit):
> - return unit.replace('@', '@' + self.name)
> -
> - def create_container_unit(self, src, dest, unit):
> - if is_template_unit(unit):
> - shutil.copy(src, dest + "/" + unit)
> - unit = self.get_expanded_unit_template(unit)
> - os.symlink(src, dest + "/" + unit)
> -
> - dropin_dir = "%s/%s.d" % (dest, unit)
> - if not os.path.exists(dropin_dir):
> - os.mkdir(dropin_dir)
> -
> - fd = open(dropin_dir + "/virt-sandbox.conf", "w")
> - fd.write("""; file placed here by virt-sandbox-service
> -[Service]
> -PrivateTmp=false
> -PrivateNetwork=false
> -""" )
> - fd.close()
> -
> - def gen_content(self):
> - if self.copy:
> - for d in self.dirs:
> - copydirtree(d, "%s%s" % (self.dest, d))
> - for f in self.files:
> - self.makedirs(os.path.dirname(f))
> - shutil.copy(f, "%s%s" % (self.dest, f))
> - else:
> - for d in self.all_dirs:
> - self.makedirs(d)
> - for f in self.files:
> - self.makedirs(os.path.dirname(f))
> - self.makefile(f)
> -
> - for d in self.BIND_SYSTEM_DIRS + self.MAKE_SYSTEM_DIRS:
> - self.makedirs(d)
> -
> - for f in self.BIND_SYSTEM_FILES:
> - self.makefile(f)
> -
> - destpath = self.dest + self.SYSVINIT_PATH
> - for i in range(7):
> - os.mkdir(destpath+("/rc%s.d" % i))
> -
> - # Copy both /etc/rc.d/init.d/functions and /lib/lsb/init-functions, even
> - # though the latter is the one recommended
> - if os.path.exists(self.SYSVINIT_PATH + "/init.d/functions"):
> - os.mkdir(destpath+"/init.d")
> - shutil.copy(self.SYSVINIT_PATH + "/init.d/functions" , destpath + "/init.d")
> -
> - if os.path.exists("/lib/lsb/init-functions"):
> - shutil.copy("/lib/lsb/init-functions" , self.dest + "/lib/lsb/")
> -
> - self.gen_machine_id()
> - self.gen_hostname()
> -
> - for k in self.LOCAL_LINK_FILES:
> - for d in self.LOCAL_LINK_FILES[k]:
> - src = "../%s" % ( d)
> - dest = "%s%s/%s" % ( self.dest, k, d)
> - os.symlink(src,dest)
> -
> - unitdir = "/etc/systemd/system"
> - tgtdir = unitdir + "/multi-user.target.wants"
> -
> - self.makedirs(unitdir)
> - self.makedirs(tgtdir)
> - os.symlink("/run", self.dest + "/var/run")
> -
> - for i, src in self.unit_file_list:
> - self.create_container_unit(src, self.dest + unitdir, i)
> - if is_template_unit(i):
> - i = self.get_expanded_unit_template(i)
> - os.symlink(src, self.dest + tgtdir + "/" + i)
> -
> - tgtfile = unitdir + "/multi-user.target"
> - try:
> - fd = open(self.dest + tgtfile, "w")
> - fd.write("[Unit]\n")
> - fd.write("Description=Sandbox multi-user target\n")
> - fd.close()
> - except OSError as e:
> - if not e.errno == errno.EEXIST:
> - raise
> -
> - for p in self.PROFILE_FILES:
> - profile = "/etc/skel/" + p
> - if os.path.exists(profile):
> - shutil.copy(profile, self.dest + "/root/")
> -
> - self.fix_protection()
> -
> - def delete(self):
> - try:
> - uuid = self.config.get_uuid()
> - if uuid is not None:
> - jpath = "/var/log/journal/" + uuid
> - if os.path.lexists(jpath):
> - os.remove(jpath)
> - except Exception as e:
> - sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
> - sys.stderr.flush()
> -
> - Container.delete(self)
> -
> - if self.unitfile and os.path.exists(self.unitfile):
> - p = Popen(["/usr/bin/systemctl","disable", self.unitfile],stdout=PIPE, stderr=PIPE)
> - p.communicate()
> - if p.returncode and p.returncode != 0:
> - raise OSError(_("Failed to disable %s unit file") % self.unitfile)
> - os.remove(self.unitfile)
> -
> - def create_systemd(self):
> - self.extract_rpms()
> - Container.create(self)
> - self.gen_filesystems()
> - if self.image:
> - self.create_image()
> - self.gen_content()
> - self.umount()
> - sys.stdout.write(_("Created sandbox container image %s\n") % self.image)
> - else:
> - self.gen_content()
> - sys.stdout.write(_("Created sandbox container dir %s\n") % self.dest)
> - self.set_security_label()
> - self.create_system_unit()
> - self.config.set_boot_target("multi-user.target")
> - self.save_config()
> -
> - def create(self):
> - if os.path.exists(self.dest):
> - raise OSError(_("%s already exists") % self.dest)
> -
> - try:
> - self.create_systemd()
> - except Exception as e:
> - try:
> - self.delete()
> - except Exception as e2:
> - sys.stderr.write("Cleanup failed: %s\n" % str(e2))
> - raise
> -
> - def reload(self, unitfiles):
> - class Args:
> - command = []
> - noseclabel = None
> - name = self.name
> - uri = self.uri
> - args = Args()
> - args.command = [ "systemctl", "reload" ] + map(lambda x: x[0], unitfiles)
> - execute(args)
> -
> -MB = int(1000000)
> -
> -def delete(args):
> - config = read_config(args.name)
> - if config is None:
> - sys.stderr.write("Sandbox '%s' does not exist\n" % args.name)
> - sys.exit(1)
> -
> - if isinstance(config, gi.repository.LibvirtSandbox.ConfigServiceGeneric):
> - container = GenericContainer(uri=args.uri, config = config)
> - else:
> - container = SystemdContainer(uri=args.uri, config = config)
> - container.set_path(args.path)
> - container.delete()
> -
> -def create(args):
> - if len(args.command) > 0 and len(args.unitfiles) > 0:
> - raise ValueError([_("Commands cannot be specified with unit files")])
> -
> - if len(args.command) == 0 and len(args.unitfiles) == 0:
> - raise ValueError([_("You must specify a command or a unit file")])
> -
> - if args.packages and len(args.unitfiles) != 1:
> - raise ValueError([_("Option --package cannot be used without a unit file")])
> -
> - if len(args.command) > 0:
> - container = GenericContainer(name = args.name, uri=args.uri, create = True)
> - container.set_command(args.command)
> - else:
> - container = SystemdContainer(name = args.name, uri=args.uri, create = True, packages = args.packages)
> - container.set_copy(args.copy)
> - container.set_unit_file_list(args.unitfiles)
> - for net in args.network:
> - container.add_network(net)
> - if args.security:
> - container.set_security(args.security)
> - container.set_uid(args.uid)
> - if not args.homedir:
> - args.homedir = pwd.getpwuid(args.uid).pw_dir
> - container.set_homedir(args.homedir)
> - if not args.username:
> - args.username = pwd.getpwuid(args.uid).pw_name
> - container.set_username(args.username)
> - if not args.gid:
> - args.gid = pwd.getpwuid(args.uid).pw_gid
> - container.set_gid(args.gid)
> - container.set_path(args.path)
> - container.set_file_type(args.file_type)
> - container.set_mounts(args.mounts)
> - if args.imagesize:
> - container.set_image(args.imagesize)
> -
> - container.create()
> -
> -def usage(parser, msg):
> - parser.print_help()
> -
> - sys.stderr.write("\n%s\n" % msg)
> - sys.stderr.flush()
> - sys.exit(1)
> -
> -def sandbox_reload(args):
> - config = read_config(args.name)
> - if isinstance(config, gi.repository.LibvirtSandbox.ConfigServiceGeneric):
> - raise ValueError([_("Generic Containers do not support reload")])
> - container = SystemdContainer(uri = args.uri, config = config)
> - container.reload(args.unitfiles)
> -
> -def connect(args):
> - if args.uri == "lxc:///":
> - class Args:
> - command = []
> - noseclabel = None
> - name = args.name
> - uri = args.uri
> -
> - args = Args()
> - args.command = [ "/bin/sh" ]
> - execute(args)
> - return
> -
> - print ("""\
> -Connected to %s.
> -Type 'Ctrl + ]' to detach from the console.
> -""" % ( args.name ))
> - os.execl("/usr/libexec/virt-sandbox-service-util",
> - "virt-sandbox-service-util",
> - "-c", args.uri,
> - "-a", args.name)
> -
> -#
> -# Search Path for command to execute within the container.
> -#
> -def fullpath(cmd):
> - for i in [ "/", "./", "../" ]:
> - if cmd.startswith(i):
> - return cmd
> - for i in os.environ["PATH"].split(':'):
> - f = "%s/%s" % (i, cmd)
> - if os.access(f, os.X_OK):
> - return f
> - return cmd
> -
> -def execute(args):
> - if args.uri != "lxc:///":
> - raise ValueError([_("Can only execute commands inside of linux containers.")])
> -
> - myexec = [ "virsh", "-c", args.uri, "lxc-enter-namespace" ]
> - if args.noseclabel:
> - myexec.append("--noseclabel")
> - myexec.extend([ args.name, "--", fullpath(args.command[0])] + args.command[1:])
> - os.execv("/usr/bin/virsh", myexec)
> -
> -def clone(args):
> - config = read_config(args.source)
> - if isinstance(config, gi.repository.LibvirtSandbox.ConfigServiceGeneric):
> - container = GenericContainer(uri=args.uri, config=config)
> - else:
> - container = SystemdContainer(uri=args.uri, config=config)
> - newcontainer = None
> -
> - container.set_path(args.path)
> -
> - old_path = container.get_filesystem_path()
> - new_path = container.get_filesystem_path(args.dest)
> -
> - if os.path.exists(new_path):
> - raise OSError(_("%s already exists") % new_path)
> -
> - try:
> - fd = open(container.get_config_path(),"r")
> - recs = fd.read()
> - fd.close()
> -
> - newrec = recs.replace(old_path + "/", new_path + "/")
> - newrec = newrec.replace("name=" + args.source, "name=" + args.dest)
> - old_image_path = container.get_image_path()
> - if os.path.exists(old_image_path):
> - new_image_path = container.get_image_path(args.dest)
> - newrec = newrec.replace(old_image_path, new_image_path)
> - shutil.copy(old_image_path, new_image_path)
> - sys.stdout.write(_("Created sandbox container image %s\n") % new_image_path)
> - os.mkdir(new_path)
> - else:
> - copydirtree(old_path, new_path)
> - sys.stdout.write(_("Created sandbox container dir %s\n") % new_path)
> -
> - if isinstance(config, gi.repository.LibvirtSandbox.ConfigServiceGeneric):
> - newcontainer = GenericContainer(name=args.dest, uri=args.uri, create=True)
> - newcontainer.set_path(args.path)
> - else:
> - fd = open(container.get_unit_path())
> - recs = fd.read()
> - fd.close()
> -
> - new_unit = container.get_unit_path(args.dest)
> - fd = open(new_unit, "wx")
> - fd.write(recs.replace(args.source, args.dest))
> - fd.close()
> -
> - sys.stdout.write(_("Created unit file %s\n") % new_unit)
> -
> - config = LibvirtSandbox.Config.load_from_data(newrec)
> - newcontainer = SystemdContainer(config=config, uri=args.uri)
> - newcontainer.set_path(args.path)
> - newcontainer.gen_machine_id()
> - newcontainer.gen_hostname()
> -
> - if args.security:
> - newcontainer.set_security(args.security)
> - newcontainer.set_security_label()
> - newcontainer.save_config()
> - except Exception as e:
> - if newcontainer is not None:
> - newcontainer.delete()
> - raise
> -
> -
> -def upgrade_config_legacy(path):
> - config = LibvirtSandbox.Config.load_from_path(path)
> -
> - if isinstance(config, gi.repository.LibvirtSandbox.ConfigServiceGeneric):
> - container = GenericContainer(uri=args.uri, config=config)
> - else:
> - container = SystemdContainer(uri=args.uri, config=config)
> -
> - fd = open(container.get_unit_path())
> - unitfile = fd.read()
> - fd.close()
> -
> - unitfile = unitfile.replace("/usr/bin/virt-sandbox-service start",
> - "/usr/libexec/virt-sandbox-service-util -c lxc:/// -s")
> - unitfile = unitfile.replace("/usr/bin/virt-sandbox-service reload",
> - "/usr/bin/virt-sandbox-service -c lxc:/// reload")
> - unitfile = unitfile.replace("/usr/bin/virt-sandbox-service stop",
> - "/usr/bin/virsh -c lxc:/// destroy")
> -
> - unitfile = re.sub("WantedBy=.*\.target",
> - "WantedBy=multi-user.target",
> - unitfile)
> -
> - os.remove(container.get_unit_path())
> - fd = open(container.get_unit_path(), "wx")
> - fd.write(unitfile)
> - fd.close()
> -
> - sys.stdout.write(_("Created unit file %s\n") %
> - container.get_unit_path())
> -
> - # Create new config file + libvirt persistent XML config
> - container.save_config()
> - # Kill legacy config file
> - os.remove(path)
> -
> -
> -def upgrade_config_current(path):
> - config = LibvirtSandbox.Config.load_from_path(path)
> -
> - if isinstance(config, gi.repository.LibvirtSandbox.ConfigServiceGeneric):
> - container = GenericContainer(uri=args.uri, config=config)
> - else:
> - container = SystemdContainer(uri=args.uri, config=config)
> -
> - # Create new config file + libvirt persistent XML config
> - container.update_config()
> -
> -
> -def upgrade_config(args):
> - newconfigfile = get_config_path(args.name)
> - oldconfigfile = get_legacy_config_path(args.name)
> - if os.path.exists(oldconfigfile):
> - upgrade_config_legacy(oldconfigfile)
> - elif os.path.exists(newconfigfile):
> - upgrade_config_current(newconfigfile)
> - else:
> - sys.stderr.write("Sandbox '%s' does not exist\n" % args.name)
> - sys.exit(1)
> -
> -
> -def upgrade_filesystem(args):
> - # This is where we'd look at RPM DB and upgrade the
> - # filesystem with new info for the unit files
> - pass
> -
> -# This function must be capable of reading configs created by
> -# old releases and "fixing" them to work with the new release
> -def upgrade(args):
> - upgrade_config(args)
> - upgrade_filesystem(args)
> -
> -import argparse
> -class AddMount(argparse.Action):
> - def __call__(self, parser, namespace, values, option_string=None):
> - newval = getattr(namespace, self.dest)
> - if not newval:
> - newval = []
> - for v in values:
> - newval.append(v)
> - setattr(namespace, self.dest, newval)
> -
> -class SizeAction(argparse.Action):
> - def __call__(self, parser, namespace, values, option_string=None):
> - setattr(namespace, self.dest, int(values))
> -
> -class CheckUnit(argparse.Action):
> - def __call__(self, parser, namespace, value, option_string=None):
> - def check_unit(unit):
> - src = "/etc/systemd/system/" + unit
> - if os.path.exists(src):
> - return src
> - src = "/usr/lib/systemd/system/" + unit
> - if os.path.exists(src):
> - return src
> - return None
> - src = check_unit(value)
> - if not src:
> - src = check_unit(value + ".service")
> - if src:
> - value = value + ".service"
> - else:
> - raise OSError(_("Requested unit %s does not exist") % value)
> -
> - unitfiles = getattr(namespace, self.dest)
> - if unitfiles:
> - unitfiles.append((value, src))
> - else:
> - unitfiles = [ (value, src) ]
> - setattr(namespace, self.dest, unitfiles)
> -
> -class SetNet(argparse.Action):
> - def __call__(self, parser, namespace, values, option_string=None):
> - nets = getattr(namespace, self.dest)
> - if nets:
> - nets.append(values)
> - else:
> - nets = [values]
> - setattr(namespace, self.dest, nets)
> -
> -class CheckPackage(argparse.Action):
> - def __call__(self, parser, namespace, value, option_string=None):
> - nb_rpm = len(rpm.TransactionSet().dbMatch('name', value))
> - if nb_rpm == 0:
> - raise OSError(_("Cannot find %s rpm") % value)
> - elif nb_rpm > 1:
> - raise OSError(_("%s rpm is installed more than once") % value)
> - packages = getattr(namespace, self.dest)
> - if packages:
> - packages.append(value)
> - else:
> - packages = [ value ]
> - setattr(namespace, self.dest, packages)
> -
> -def requires_name(parser):
> - parser.add_argument("name",
> - help=_("name of the sandbox container"))
> -
> -def default_security_opts():
> - if selinux is None:
> - return None
> -
> - # XXX vary per URI for kvm/qemu/lxc.
> - # XXX generate a random category
> - return "static,label=system_u:system_r:svirt_lxc_net_t:s0"
> -
> -def gen_create_args(subparser):
> - parser = subparser.add_parser("create",
> - help=_("Create a sandbox container."))
> -
> - parser.add_argument("-C", "--copy", default=False,
> - action="store_true",
> - help=_("copy content from the hosts /etc and /var directories that will be mounted within the
> sandbox"))
> -
> - parser.add_argument("-f", "--filetype", dest="file_type",
> - default=c.get_file_type(),
> - help=_("SELinux file type to assign to content within the sandbox. Default: %s") %
> c.get_file_type())
> - parser.add_argument("--homedir", dest="homedir",
> - help=_("Specify the homedir for the container. Default: UID homedir."))
> - parser.add_argument("-G", "--gid", dest="gid",
> - default=None, type=int,
> - help=_("Specify the login gid for the container. Default: login GID of the UID."))
> - parser.add_argument("-i", "--imagesize", dest="imagesize", default = None,
> - action=SizeAction,
> - help=_("create image of this many megabytes."))
> - parser.add_argument("-m", "--mount", dest="mounts",default=[], nargs="*", action=AddMount,
> - help=_("Mount a filesytem in the sandbox"))
> - parser.add_argument("-N", "--network", dest="network",
> - action=SetNet, default=[],
> - help=_("Specify the network configuration"))
> - parser.add_argument("-p", "--path", dest="path", default=c.DEFAULT_PATH,
> - help=_("select path to store sandbox content. Default: %s") % c.DEFAULT_PATH)
> - parser.add_argument("-s", "--security", dest="security",
> - default=default_security_opts(),
> - help=_("Specify the security model configuration for the sandbox: Defaults to dynamic"))
> - parser.add_argument("-u", "--unitfile",
> - action=CheckUnit,
> - dest="unitfiles", default=[],
> - help=_("Systemd Unit file to run within the systemd sandbox container. Commands cannot be
> specified with unit files."))
> - parser.add_argument("-P", "--package",
> - action=CheckPackage,
> - dest="packages", default=[],
> - help=_("RPM package to be used in the container. Default: autodetected from unit files."))
> - parser.add_argument("--username", dest="username",
> - help=_("Specify the username for the container. Default: UID username."))
> - parser.add_argument("-U", "--uid", dest="uid",
> - default=os.getuid(),type=int,
> - help=_("Specify the uid for the container: Default to current UID."))
> -
> - requires_name(parser)
> - parser.add_argument("command", default=[], nargs="*",
> - help=_("Command to run within the generic sandbox container. Commands cannot be specified
> with unit files."))
> -
> - parser.set_defaults(func=create)
> -
> -def gen_connect_args(subparser):
> - parser = subparser.add_parser("connect",
> - help=_("Connect to a sandbox container"))
> - requires_name(parser)
> - parser.set_defaults(func=connect)
> -
> -def gen_execute_args(subparser):
> - parser = subparser.add_parser("execute",
> - help=_("Execute a command within a sandbox container. Only available for lxc:///"))
> - parser.add_argument("-N", "--noseclabel", dest="noseclabel",
> - default=False, action="store_true",
> - help=_("do not modify the label of the executable process. By default all commands execute
> with the label of the sandbox"))
> - requires_name(parser)
> - parser.add_argument("command", nargs="+",
> - help=_("command to execute within the container"))
> - parser.set_defaults(func=execute)
> -
> -def gen_reload_args(subparser):
> - parser = subparser.add_parser("reload",
> - help=_("Reload a running sandbox container"))
> - parser.add_argument("-u", "--unitfile", required=True,
> - action=CheckUnit, dest="unitfiles",
> - help=_("Systemd Unit file to reload within the sandbox container"))
> - requires_name(parser)
> - parser.set_defaults(func=sandbox_reload)
> -
> -def gen_clone_args(subparser):
> - parser = subparser.add_parser("clone",
> - help=_("Clone an existing sandbox container"))
> - parser.set_defaults(func=clone)
> - parser.add_argument("-p", "--path", dest="path", default=c.DEFAULT_PATH,
> - help=_("select path to copy sandbox content from/to. Default: %s") % c.DEFAULT_PATH)
> - parser.add_argument("-s", "--security", dest="security",
> - default=default_security_opts(),
> - help=_("Specify the security model configuration for the sandbox: Defaults to dynamic"))
> -
> - parser.add_argument("source",
> - help=_("source sandbox container name"))
> - parser.add_argument("dest",
> - help=_("dest name of the new sandbox container"))
> -
> -def gen_delete_args(subparser):
> - parser = subparser.add_parser("delete",
> - help=_("Delete a sandbox container"))
> - parser.add_argument("-p", "--path", dest="path", default=c.DEFAULT_PATH,
> - help=_("select path to delete sandbox content from. Default: %s") % c.DEFAULT_PATH)
> - requires_name(parser)
> - parser.set_defaults(func=delete)
> -
> -def gen_upgrade_args(subparser):
> - parser = subparser.add_parser("upgrade",
> - help=_("Upgrade the sandbox container"))
> - requires_name(parser)
> - parser.set_defaults(func=upgrade)
> -
> -if __name__ == '__main__':
> - c = Container()
> -
> - parser = argparse.ArgumentParser(description='Sandbox Container Tool')
> - parser.add_argument("-c", "--connect", required=False, dest="uri", default="lxc:///",
> - help=_("libvirt connection URI to use (lxc:/// [default] or qemu:///session)"))
> -
> - subparser = parser.add_subparsers(help=_("commands"))
> - gen_create_args(subparser)
> - gen_clone_args(subparser)
> - gen_connect_args(subparser)
> - gen_delete_args(subparser)
> - gen_execute_args(subparser)
> - gen_reload_args(subparser)
> - gen_upgrade_args(subparser)
> -
> - try:
> - args = parser.parse_args()
> - if args.uri[0:3] != "lxc":
> - sys.stderr.write("%s: only lxc:/// URIs are currently supported\n" % sys.argv[0])
> - sys.exit(1)
> - if os.geteuid() != 0:
> - sys.stderr.write("%s: lxc:/// URIs are only supported when run as root\n" % sys.argv[0])
> - sys.exit(1)
> - args.func(args)
> - sys.exit(0)
> - except KeyboardInterrupt as e:
> - sys.exit(0)
> - except ValueError as e:
> - sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
> - sys.stderr.flush()
> - sys.exit(1)
> - except IOError as e:
> - sys.stderr.write("%s: %s: %s\n" % (sys.argv[0], e.filename, e.strerror))
> - sys.stderr.flush()
> - sys.exit(1)
> - except OSError as e:
> - sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
> - sys.stderr.flush()
> - sys.exit(1)
> - except GLib.GError as e:
> - sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
> - sys.stderr.flush()
> - sys.exit(1)
> diff --git a/bin/virt-sandbox-service-bash-completion.sh b/bin/virt-sandbox-service-bash-completion.sh
> deleted file mode 100755
> index a101f4a..0000000
> --- a/bin/virt-sandbox-service-bash-completion.sh
> +++ /dev/null
> @@ -1,141 +0,0 @@
> -# This file is part of libvirt-sandbox.
> -#
> -# Copyright (C) 2012-2013 Red Hat, Inc.
> -#
> -# systemd is free software; you can redistribute it and/or modify it
> -# under the terms of the GNU General Public License as published by
> -# the Free Software Foundation; either version 2 of the License, or
> -# (at your option) any later version.
> -#
> -# systemd is distributed in the hope that it will be useful, but
> -# WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> -# General Public License for more details.
> -#
> -# You should have received a copy of the GNU General Public License
> -# along with systemd; If not, see <http://www.gnu.org/licenses/>.
> -#
> -# Authors: Dan Walsh <dwalsh at redhat.com>
> -#
> -__contains_word () {
> - local word=$1; shift
> - for w in $*; do [[ $w = $word ]] && return 0; done
> - return 1
> -}
> -
> -ALL_OPTS='-h --help'
> -
> -__get_all_unit_files () {
> - systemctl list-unit-files --no-legend | cut -d' ' -f 1 | grep -v '@'
> -}
> -
> -__get_all_containers () {
> - virt-sandbox-service list
> -}
> -
> -__get_all_running_containers () {
> - virt-sandbox-service list --running
> -}
> -
> -__get_all_file_types () {
> - seinfo -afile_type -x 2>/dev/null | tail -n +2
> -}
> -
> -_virt_sandbox_service () {
> - local command=${COMP_WORDS[1]}
> - local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
> - local verb comps
> - local -A VERBS=(
> - [CONNECT]='connect'
> - [CREATE]='create'
> - [DELETE]='delete'
> - [RELOAD]='reload'
> - [START]='start'
> - [EXECUTE]='execute'
> - [STOP]='stop'
> - [LIST]='list'
> - )
> - local -A OPTS=(
> - [ALL]='-h --help'
> - [CREATE]='-C --copy -f --filetype -G --gid -i --imagesize --homedir -m --mount -N --network -p --path -s --
> security -u --unitfile --username -U -uid'
> - [LIST]='-r --running'
> - [RELOAD]='-u --unitfile'
> - [EXECUTE]='-N --noseclabel'
> - )
> -
> - for ((i=0; $i <= $COMP_CWORD; i++)); do
> - if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
> - ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG}]}; then
> - verb=${COMP_WORDS[i]}
> - break
> - fi
> - done
> -
> - if test "$verb" = "" && test "$prev" = "virt-sandbox-service" ; then
> - comps="${VERBS[*]}"
> - COMPREPLY=( $(compgen -W "$comps" -- "$cur") )
> - return 0
> - elif test "$verb" == "list" ; then
> - if test "$prev" = "-r" || test "$prev" = "--running" ; then
> - return 0
> - fi
> - COMPREPLY=( $(compgen -W "${OPTS[ALL]} ${OPTS[LIST]} " -- "$cur") )
> - return 0
> - elif test "$verb" == "delete" ; then
> - COMPREPLY=( $(compgen -W "${OPTS[ALL]} $( __get_all_containers ) " -- "$cur") )
> - return 0
> - elif test "$verb" == "start" ; then
> - COMPREPLY=( $(compgen -W "${OPTS[ALL]} $( __get_all_containers ) " -- "$cur") )
> - return 0
> - elif test "$verb" == "stop" ; then
> - COMPREPLY=( $(compgen -W "${OPTS[ALL]} $( __get_all_running_containers ) " -- "$cur") )
> - return 0
> - elif test "$verb" == "reload" ; then
> - COMPREPLY=( $(compgen -W "${OPTS[ALL]} ${OPTS[RELOAD]} $( __get_all_running_containers ) " -- "$cur") )
> - return 0
> - elif test "$verb" == "connect" ; then
> - COMPREPLY=( $(compgen -W "${OPTS[ALL]} $( __get_all_running_containers ) " -- "$cur") )
> - return 0
> - elif test "$verb" == "execute" ; then
> - if test "$prev" = "execute"; then
> - COMPREPLY=( $(compgen -W "${OPTS[ALL]} ${OPTS[EXECUTE]} $( __get_all_running_containers ) " -- "$cur") )
> - else
> - COMPREPLY=( $( compgen -c -- "$cur") )
> - fi
> - return 0
> - elif test "$verb" == "create" ; then
> - if test "$prev" = "-p" || test "$prev" = "--path" ; then
> - COMPREPLY=( $( compgen -d -- "$cur") )
> - compopt -o filenames
> - return 0
> - elif test "$prev" = "-u" || test "$prev" = "--unitfile" ; then
> - COMPREPLY=( $(compgen -W "$( __get_all_unit_files ) " -- "$cur") )
> - return 0
> - elif test "$prev" = "-f" || test "$prev" = "--filetype" ; then
> - COMPREPLY=( $(compgen -W "$( __get_all_file_types ) " -- "$cur") )
> - return 0
> - elif test "$prev" = "-s" || test "$prev" = "--security" ; then
> - return 0
> - elif test "$prev" = "-m" || test "$prev" = "--mount" ; then
> - return 0
> - elif test "$prev" = "-n" || test "$prev" = "--network" ; then
> - return 0
> - elif test "$prev" = "-i" || test "$prev" = "--imagesize" ; then
> - return 0
> - elif __contains_word "$command" ${VERBS[CREATE]} ; then
> - COMPREPLY=( $(compgen -W "${OPTS[ALL]} ${OPTS[CREATE]}" -- "$cur") )
> - return 0
> - elif __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} ; then
> - COMPREPLY=( $(compgen -W "${OPTS[ALL]}" -- "$cur") )
> - return 0
> - fi
> - else
> - if ! __contains_word "${prev}" ${VERBS[*]} &&
> - ! __contains_word "${prev}" ${OPTS[*]}; then
> - return 0
> - fi
> - fi
> - COMPREPLY=( $(compgen -W "${OPTS[ALL]} $( __get_all_containers ) " -- "$cur") )
> - return 0
> -}
> -complete -F _virt_sandbox_service virt-sandbox-service
> diff --git a/bin/virt-sandbox-service-clone.pod b/bin/virt-sandbox-service-clone.pod
> deleted file mode 100644
> index e9d997b..0000000
> --- a/bin/virt-sandbox-service-clone.pod
> +++ /dev/null
> @@ -1,100 +0,0 @@
> -=head1 NAME
> -
> -virt-sandbox-service clone - clone an existing Secure container
> -
> -=head1 SYNOPSIS
> -
> -Clone a Security container
> -
> - virt-sandbox-service [-c URI] clone [-h] [-p PATH] [-s SECURITY-OPTS] SOURCE DEST
> -
> -=head1 DESCRIPTION
> -
> -virt-sandbox-service is used to manage secure sandboxed system services.
> -These applications will be launched via libvirt and run within a virtualization
> -technology such as LinuX Containers (LXC), or optionally QEMU/KVM. The
> -container / virtual machines will be secured by SELinux and resource
> -separated using cgroups.
> -
> -The clone command will clone the SOURCE security sandbox container into the DEST security sandbox container.
> -
> -=head1 OPTIONS
> -
> -=over 4
> -
> -=item B<-h>, B<--help>
> -
> -Display help message
> -
> -=item B<-c> URI, B<--connect URI>
> -
> -The connection URI for the hypervisor (currently only LXC URIs are
> -supported).
> -
> -=item B<-p PATH>, B<--path PATH>
> -
> -Set path to copy container content from/to. This argument must match the value of
> -the C<-p> arg given when creating the original source container.
> -
> -Default: C</var/lib/libvirt/filesystems>.
> -
> -=item B<-s SECURITY-OPTIONS>, B<--security=SECURITY-OPTIONS>
> -
> -Use alternative security options. SECURITY-OPTIONS is a set of key=val pairs,
> -separated by commas. The following options are valid for SELinux
> -
> -=over 4
> -
> -=item dynamic
> -
> -Dynamically allocate an SELinux label, using the default base context.
> -The default base context is system_u:system_r:svirt_lxc_net_t:s0 for LXC,
> -system_u:system_r:svirt_t:s0 for KVM, system_u:system_r:svirt_tcg_t:s0
> -for QEMU.
> -
> -=item dynamic,label=USER:ROLE:TYPE:LEVEL
> -
> -Dynamically allocate an SELinux label, using the base context
> -USER:ROLE:TYPE:LEVEL, instead of the default base context.
> -
> -=item static,label=USER:ROLE:TYPE:LEVEL
> -
> -To set a completely static label. For example,
> -static,label=system_u:system_r:svirt_t:s0:c412,c355
> -
> -=back
> -
> -=back
> -
> -=head1 EXAMPLE
> -
> -Execute /bin/sh in httpd1 container
> -
> - # virt-sandbox-service clone -s static,label=system_u:system_r:svirt_lxc_net_t:s0:c1,c2 httpd1 httpd2
> -
> -=head1 SEE ALSO
> -
> -C<libvirt(8)>, C<selinux(8)>, C<systemd(8)>, C<virt-sandbox-service(1)>
> -
> -=head1 FILES
> -
> -Container content will be stored in subdirectories of
> -/var/lib/libvirt/filesystems, by default. You can manage the
> -content in these directories outside of the container and
> -processes within the container will see the content.
> -
> -=head1 AUTHORS
> -
> -Daniel Walsh <dwalsh at redhat.com>
> -Daniel P. Berrange <dan at berrange.com>
> -
> -=head1 COPYRIGHT
> -
> -Copyright (C) 2011-2013 Red Hat, Inc.
> -
> -=head1 LICENSE
> -
> -virt-sandbox is distributed under the terms of the GNU LGPL v2+.
> -This is free software; see the source for copying conditions.
> -There is NO warranty; not even for MERCHANTABILITY or FITNESS
> -FOR A PARTICULAR PURPOSE
> diff --git a/bin/virt-sandbox-service-connect.pod b/bin/virt-sandbox-service-connect.pod
> deleted file mode 100644
> index cefa37a..0000000
> --- a/bin/virt-sandbox-service-connect.pod
> +++ /dev/null
> @@ -1,59 +0,0 @@
> -=head1 NAME
> -
> -virt-sandbox-service connect - Connect to a security container console
> -
> -=head1 SYNOPSIS
> -
> - virt-sandbox-service [-c URI] connect [-h] NAME
> -
> -=head1 DESCRIPTION
> -
> -virt-sandbox-service is used to manage secure sandboxed system services.
> -These applications will be launched via libvirt and run within a virtualization
> -technology such as LinuX Containers (LXC), or optionally QEMU/KVM. The
> -container / virtual machines will be secured by SELinux and resource
> -separated using cgroups.
> -
> -The connect command will connect to the security sandbox container console NAME.
> -
> -=head1 OPTIONS
> -
> -=over 4
> -
> -=item B<-h>, B<--help>
> -
> -Display help message
> -
> -=item B<-c URI>, B<--connect URI>
> -
> -The connection URI for the hypervisor (currently only LXC URIs are
> -supported).
> -
> -=back
> -
> -=head1 EXAMPLE
> -
> -Connect to the in httpd1 container console
> -
> - # virt-sandbox-service connect httpd1
> - #
> -
> -=head1 SEE ALSO
> -
> -C<libvirt(8)>, C<selinux(8)>, C<systemd(8)>, C<virt-sandbox-service(1)>
> -
> -=head1 AUTHORS
> -
> -Daniel Walsh <dwalsh at redhat.com>
> -Daniel P. Berrange <dan at berrange.com>
> -
> -=head1 COPYRIGHT
> -
> -Copyright (C) 2011-2013 Red Hat, Inc.
> -
> -=head1 LICENSE
> -
> -virt-sandbox is distributed under the terms of the GNU LGPL v2+.
> -This is free software; see the source for copying conditions.
> -There is NO warranty; not even for MERCHANTABILITY or FITNESS
> -FOR A PARTICULAR PURPOSE
> diff --git a/bin/virt-sandbox-service-create.pod b/bin/virt-sandbox-service-create.pod
> deleted file mode 100644
> index d2f5fdb..0000000
> --- a/bin/virt-sandbox-service-create.pod
> +++ /dev/null
> @@ -1,264 +0,0 @@
> -=head1 NAME
> -
> -virt-sandbox-service create - Create a Security container
> -
> -=head1 SYNOPSIS
> -
> - virt-sandbox-service [-c URI] create [-h] [-C] [-f FILE_TYPE]
> - [--homedir HOMEDIR] [-G GID] [-i IMAGESIZE]
> - [[-m TYPE:DST=SRC ] ...]
> - [-N NETWORK] [-p PATH] [-s SECURITY]
> - [[-u UNITFILES] ...] [--username USERNAME]
> - [-U UID] [[-P package] ... ]
> - NAME -- COMMAND [ARG1 [ARG2...]]
> -
> -=head1 DESCRIPTION
> -
> -virt-sandbox-service is used to manage secure sandboxed system services.
> -These applications will be launched via libvirt and run within a virtualization
> -technology such as LinuX Containers (LXC), or optionally QEMU/KVM. The
> -container / virtual machines will be secured by SELinux and resource
> -separated using cgroups.
> -
> -The create command can setup a sandbox for running one or more systemd unit files.
> -It can also setup a sandbox for running a command in an GenericContainer.
> -Specify a unit file to create the SystemdContainer and the command to create an
> -GenericContainer.
> -
> -=head1 OPTIONS
> -
> -=over 4
> -
> -=item B<-h>, B<--help>
> -
> -Display help message
> -
> -=item B<-c URI>, B<--connect URI>
> -
> -The connection URI for the hypervisor (currently only LXC URIs are
> -supported).
> -
> -=item B<-u UNIT_FILE>, B<--unitfile UNIT_FILE>
> -
> -Name of the systemd unit file to be to run within the Systemd Container.
> -Can be repeated if multiple unit files are required within the sandbox.
> -Cannot be specified if you are using a COMMAND. If the unit file end
> -with @, this will be considered as a template, and a instantiated
> -systemd unit will be created, using the name of the container as a
> -instance identifier.
> -
> -=item B<-C>, B<--copy>
> -
> -Copy content from /etc and /var directories that will be mounted within the container.
> -
> -=item B<-G GID>, B<--gid GID>
> -
> -Set login gid to use within the container.
> -
> -Default: C<Login GID of UID>.
> -
> -=item B<-f FILETYPE>, B<--filetype FILETYPE>
> -
> -Set SELinux file type to use within container.
> -
> -Default: C<svirt_lxc_file_t>.
> -
> -=item B<-p PATH>, B<--path PATH>
> -
> -Set path to store container content. NB if this argument is used when creating
> -a container, the exact same argument must also be used when later cloning or
> -deleting the container.
> -
> -Default: C</var/lib/libvirt/filesystems>.
> -
> -=item B<--homedir HOMEDIR>
> -
> -Set homedir path to use within container.
> -
> -Default: C<UID's Homedir>.
> -
> -=item B<-m TYPE:DST=SRC>, B<--mount TYPE:DST=SRC>
> -
> -Sets up a mount inside the sandbox at B<DST> backed by B<SRC>. The
> -meaning of B<SRC> depends on the value of C<TYPE> specified:
> -
> -=over 4
> -
> -=item B<host-bind>
> -
> -If B<TYPE> is B<host-bind>, then B<SRC> is interpreted as the path
> -to a directory on the host filesystem. If C<SRC> is the empty string,
> -then a temporary (empty) directory is created on the host before
> -starting the sandbox and deleted afterwards. The C<--include> option
> -is useful for populating these temporary directories with copies of host
> -files.
> -
> -=item B<host-image>
> -
> -If B<TYPE> is B<host-image>, then B<SRC> is interpreted as the path
> -to a disk image file on the host filesystem. The image should be
> -formatted with a filesystem that can be auto-detected by the sandbox,
> -such as B<ext3>, B<ext4>, etc. The disk image itself should be a raw
> -file, not qcow2 or any other special format
> -
> -=item B<guest-bind>
> -
> -If B<TYPE> is B<guest-bind>, then B<SRC> is interpreted as the path
> -to another directory in the container filesystem.
> -
> -=item B<ram>
> -
> -If B<TYPE> is B<ram>, then B<SRC> is interpreted as specifying the
> -size of the RAM disk in bytes. The suffix B<K>, B<KiB>, B<M>,
> -B<MiB>, B<G>, B<GiB> can used to alter the units from bytes to a
> -coarser level.
> -
> -=back
> -
> -Some examples
> -
> - -m host-bind:/tmp=/var/lib/sandbox/demo/tmp
> - -m host-image:/=/var/lib/sandbox/demo.img
> - -m guest-bind:/home=/tmp/home
> - -m ram:/tmp=500M
> -
> -=item B<-N NETWORK-OPTIONS>, B<--network NETWORK-OPTIONS>
> -
> -Add a network interface to the sandbox. By default the sandbox will
> -only have a loopback interface. This option allows for connectivity
> -to the LAN in some manner. NETWORK-OPTIONS is a set of
> -key=val pairs, separated by commas. The following options are valid
> -
> -=over 4
> -
> -=item dhcp
> -
> -Configure the network interface using dhcp. This key takes no value.
> -No other keys may be specified. eg
> -
> - -N dhcp,source=default
> - --network dhcp,source=lan
> -
> -where 'source' is the name of any libvirt virtual network.
> -
> -=item source=NETWORK
> -
> -Set the name of the network to connect the interface to. C<NETWORK>
> -is the name of any libvirt virtual network. See also B<virsh net-list>
> -
> -=item mac=NN:NN:NN:NN:NN:NN
> -
> -Set the MAC address of the network interface, where each NN is a pair
> -of hex digits.
> -
> -=item address=IP-ADDRESS/PREFIX%BROADCAST
> -
> -Configure the network interface with the static IPv4 or IPv6 address
> -B<IP-ADDRESS>. The B<PREFIX> value is the length of the network
> -prefix in B<IP-ADDRESS>. The optional B<BROADCAST> parameter
> -specifies the broadcast address. Some examples
> -
> - address=192.168.122.1/24
> - address=192.168.122.1/24%192.168.122.255
> - address=2001:212::204:2/64
> -
> -=item route=IP-NETWORK/PREFIX%GATEWAY
> -
> -Configure the network interface with the static IPv4 or IPv6 route
> -B<IP-NETWORK>. The B<PREFIX> value is the length of the network
> -prefix in B<IP-NETWORK>. The B<GATEWAY> parameter specifies the
> -address of the gateway for the route. Some examples
> -
> - route=192.168.122.255/24%192.168.1.1
> -
> -=back
> -
> -=item B<-s SECURITY-OPTIONS>, B<--security=SECURITY-OPTIONS>
> -
> -Use alternative security options. SECURITY-OPTIONS is a set of key=val pairs,
> -separated by commas. The following options are valid for SELinux
> -
> -=over 4
> -
> -=item dynamic
> -
> -Dynamically allocate an SELinux label, using the default base context.
> -The default base context is system_u:system_r:svirt_lxc_net_t:s0 for LXC,
> -system_u:system_r:svirt_t:s0 for KVM, system_u:system_r:svirt_tcg_t:s0
> -for QEMU.
> -
> -=item dynamic,label=USER:ROLE:TYPE:LEVEL
> -
> -Dynamically allocate an SELinux label, using the base context
> -USER:ROLE:TYPE:LEVEL, instead of the default base context.
> -
> -=item static,label=USER:ROLE:TYPE:LEVEL
> -
> -To set a completely static label. For example,
> -static,label=system_u:system_r:svirt_t:s0:c412,c355
> -
> -=back
> -
> -=item B<-i SIZE>, B<--image SIZE>
> -
> -Create file system image file of this size to store container content.
> -
> -=item B<-P PACKAGE>, B<--package PACKAGE>
> -
> -Package(s) to be used within the container.
> -
> -=item B<-U UID>, B<--uid UID>
> -
> -Set uid to use within container.
> -
> -Default: C<CURRENT UID>.
> -
> -=item B<--username USERNAME>
> -
> -Set username to use within container.
> -
> -Default: C<UID's Username>.
> -
> -=back
> -
> -=head1 EXAMPLE
> -
> -Create httpd1 Systemd container
> -
> - # virt-sandbox-service create -C -u httpd.service httpd1
> - Created container dir /var/lib/libvirt/filesystems/httpd1
> - Created sandbox config /etc/libvirt-sandbox/services/httpd1/config/sandbox.cfg
> - Created unit file /etc/systemd/system/httpd at httpd1.service
> -
> -Create foobar1 Generic container
> -
> - # virt-sandbox-service create -U 1234 foobar1 -- /usr/bin/foobar -a -b
> - Created container dir /var/lib/libvirt/filesystems/foobar1
> - Created sandbox config /etc/libvirt-sandbox/services/foobar1/config/sandbox.cfg
> -
> -=head1 SEE ALSO
> -
> -C<libvirt(8)>, C<selinux(8)>, C<systemd(8)>, C<virt-sandbox-service(1)>
> -
> -=head1 FILES
> -
> -Container content will be stored in subdirectories of
> -C</var/lib/libvirt/filesystems>, by default. You can manage the
> -content in these directories outside of the container and
> -processes within the container will see the content.
> -
> -=head1 AUTHORS
> -
> -Daniel Walsh <dwalsh at redhat.com>
> -Daniel P. Berrange <dan at berrange.com>
> -
> -=head1 COPYRIGHT
> -
> -Copyright (C) 2011-2013 Red Hat, Inc.
> -
> -=head1 LICENSE
> -
> -virt-sandbox is distributed under the terms of the GNU LGPL v2+.
> -This is free software; see the source for copying conditions.
> -There is NO warranty; not even for MERCHANTABILITY or FITNESS
> -FOR A PARTICULAR PURPOSE
> diff --git a/bin/virt-sandbox-service-delete.pod b/bin/virt-sandbox-service-delete.pod
> deleted file mode 100644
> index 3b17b97..0000000
> --- a/bin/virt-sandbox-service-delete.pod
> +++ /dev/null
> @@ -1,65 +0,0 @@
> -=head1 NAME
> -
> -virt-sandbox-service delete - Delete a security container
> -
> -=head1 SYNOPSIS
> -
> - virt-sandbox-service [-c URI] delete [-h] [-p PATH] NAME
> -
> -=head1 DESCRIPTION
> -
> -virt-sandbox-service is used to manage secure sandboxed system services.
> -These applications will be launched via libvirt and run within a virtualization
> -technology such as LinuX Containers (LXC), or optionally QEMU/KVM. The
> -container / virtual machines will be secured by SELinux and resource
> -separated using cgroups.
> -
> -The delete command will delete a sandbox container.
> -
> -=head1 OPTIONS
> -
> -=over 4
> -
> -=item B<-h>, B<--help>
> -
> -Display help message
> -
> -=item B<-c URI>, B<--connect URI>
> -
> -The connection URI for the hypervisor (currently only LXC URIs are
> -supported).
> -
> -=item B<-p PATH>, B<--path PATH>
> -
> -Set path to delete container content from. This argument must match the value of
> -the C<-p> arg given when creating the original source container.
> -
> -Default: C</var/lib/libvirt/filesystems>.
> -
> -=back
> -
> -=head1 EXAMPLE
> -
> -Delete the httpd1 container
> -
> - # virt-sandbox-service delete httpd1
> -
> -=head1 SEE ALSO
> -
> -C<libvirt(8)>, C<selinux(8)>, C<systemd(8)>, C<virt-sandbox-service(1)>
> -
> -=head1 AUTHORS
> -
> -Daniel Walsh <dwalsh at redhat.com>
> -Daniel P. Berrange <dan at berrange.com>
> -
> -=head1 COPYRIGHT
> -
> -Copyright (C) 2011-2013 Red Hat, Inc.
> -
> -=head1 LICENSE
> -
> -virt-sandbox is distributed under the terms of the GNU LGPL v2+.
> -This is free software; see the source for copying conditions.
> -There is NO warranty; not even for MERCHANTABILITY or FITNESS
> -FOR A PARTICULAR PURPOSE
> diff --git a/bin/virt-sandbox-service-execute.pod b/bin/virt-sandbox-service-execute.pod
> deleted file mode 100644
> index 62771eb..0000000
> --- a/bin/virt-sandbox-service-execute.pod
> +++ /dev/null
> @@ -1,71 +0,0 @@
> -=head1 NAME
> -
> -virt-sandbox-service execute - execute commands inside Secure container
> -
> -=head1 SYNOPSIS
> -
> -Execute a command within a security container
> -
> - virt-sandbox-service [-c URI] execute [-h] [-N] NAME -- COMMAND [ARG1 [ARG2...]]
> -
> -=head1 DESCRIPTION
> -
> -virt-sandbox-service is used to manage secure sandboxed system services.
> -These applications will be launched via libvirt and run within a virtualization
> -technology such as LinuX Containers (LXC), or optionally QEMU/KVM. The
> -container / virtual machines will be secured by SELinux and resource
> -separated using cgroups.
> -
> -The execute subcommand is used to execute commands within an already running container.
> -
> -=head1 OPTIONS
> -
> -=over 4
> -
> -=item B<-h>, B<--help>
> -
> -Display help message
> -
> -=item B<-c> URI, B<--connect URI>
> -
> -The connection URI for the hypervisor (currently only LXC URIs are
> -supported).
> -
> -=item B<-N>, B<--noseclabel>
> -
> -Execute command within the container.
> -
> -=back
> -
> -=head1 EXAMPLE
> -
> -Execute /bin/sh in httpd1 container
> -
> - # virt-sandbox-service execute httpd1 -- /bin/sh
> -
> -=head1 SEE ALSO
> -
> -C<libvirt(8)>, C<selinux(8)>, C<systemd(8)>, C<virt-sandbox-service(1)>
> -
> -=head1 FILES
> -
> -Container content will be stored in subdirectories of
> -/var/lib/libvirt/filesystems, by default. You can manage the
> -content in these directories outside of the container and
> -processes within the container will see the content.
> -
> -=head1 AUTHORS
> -
> -Daniel Walsh <dwalsh at redhat.com>
> -Daniel P. Berrange <dan at berrange.com>
> -
> -=head1 COPYRIGHT
> -
> -Copyright (C) 2011-2013 Red Hat, Inc.
> -
> -=head1 LICENSE
> -
> -virt-sandbox is distributed under the terms of the GNU LGPL v2+.
> -This is free software; see the source for copying conditions.
> -There is NO warranty; not even for MERCHANTABILITY or FITNESS
> -FOR A PARTICULAR PURPOSE
> diff --git a/bin/virt-sandbox-service-reload.pod b/bin/virt-sandbox-service-reload.pod
> deleted file mode 100644
> index fe6fbcc..0000000
> --- a/bin/virt-sandbox-service-reload.pod
> +++ /dev/null
> @@ -1,63 +0,0 @@
> -=head1 NAME
> -
> -virt-sandbox-service reload - Reload a security container
> -
> -=head1 SYNOPSIS
> -
> - virt-sandbox-service [-c URI] reload [-h] -u UNIT_FILE NAME
> -
> -=head1 DESCRIPTION
> -
> -virt-sandbox-service is used to manage secure sandboxed system services.
> -These applications will be launched via libvirt and run within a virtualization
> -technology such as LinuX Containers (LXC), or optionally QEMU/KVM. The
> -container / virtual machines will be secured by SELinux and resource
> -separated using cgroups.
> -
> -The reload command will reload a sandbox container. This is used when software is updated outside of a container and
> processes within the container need to reload or restart. For example, if you update your httpd software, and you had
> a running container that was using the httpd service, systemd would send the reload to the container.
> -
> -=head1 OPTIONS
> -
> -=over 4
> -
> -=item B<-h>, B<--help>
> -
> -Display help message
> -
> -=item B<-c URI>, B<--connect URI>
> -
> -The connection URI for the hypervisor (currently only LXC URIs are
> -supported).
> -
> -=item B<-u UNIT_FILE>, B<--unitfile UNIT_FILE>
> -
> -Name of the systemd unit file to reload within the container. Can be repeated
> -if multiple unit files need to be reloaded within the sandbox.
> -
> -=back
> -
> -=head1 EXAMPLE
> -
> -Reload the httpd1 container
> -
> - # virt-sandbox-service reload -u httpd.service httpd1
> -
> -=head1 SEE ALSO
> -
> -C<libvirt(8)>, C<selinux(8)>, C<systemd(8)>, C<virt-sandbox-service(1)>
> -
> -=head1 AUTHORS
> -
> -Daniel Walsh <dwalsh at redhat.com>
> -Daniel P. Berrange <dan at berrange.com>
> -
> -=head1 COPYRIGHT
> -
> -Copyright (C) 2011-2013 Red Hat, Inc.
> -
> -=head1 LICENSE
> -
> -virt-sandbox is distributed under the terms of the GNU LGPL v2+.
> -This is free software; see the source for copying conditions.
> -There is NO warranty; not even for MERCHANTABILITY or FITNESS
> -FOR A PARTICULAR PURPOSE
> diff --git a/bin/virt-sandbox-service-upgrade.pod b/bin/virt-sandbox-service-upgrade.pod
> deleted file mode 100644
> index 76eb428..0000000
> --- a/bin/virt-sandbox-service-upgrade.pod
> +++ /dev/null
> @@ -1,74 +0,0 @@
> -=head1 NAME
> -
> -virt-sandbox-service upgrade - upgrade an existing Secure container
> -
> -=head1 SYNOPSIS
> -
> -Upgrade a Security container
> -
> - virt-sandbox-service [-c URI] upgrade NAME
> -
> -=head1 DESCRIPTION
> -
> -virt-sandbox-service is used to manage secure sandboxed system services.
> -These applications will be launched via libvirt and run within a virtualization
> -technology such as LinuX Containers (LXC), or optionally QEMU/KVM. The
> -container / virtual machines will be secured by SELinux and resource
> -separated using cgroups.
> -
> -The upgrade command will update the config files for NAME to be compatible
> -with the currently installed software version. NB this works in an upgrade
> -direction only, it is not possible to install older versions of the software
> -and use this command to downgrade the configs.
> -
> -If you have editted the main sandbox configuration file manually, this
> -command can also be used to update the libvirt guest configuration to
> -match it.
> -
> -=head1 OPTIONS
> -
> -=over 4
> -
> -=item B<-h>, B<--help>
> -
> -Display help message
> -
> -=item B<-c URI>, B<--connect URI>
> -
> -The connection URI for the hypervisor (currently only LXC URIs are
> -supported).
> -
> -=back
> -
> -=head1 EXAMPLE
> -
> -Execute /bin/sh in httpd1 container
> -
> - # virt-sandbox-service upgrade httpd
> -
> -=head1 SEE ALSO
> -
> -C<libvirt(8)>, C<selinux(8)>, C<systemd(8)>, C<virt-sandbox-service(1)>
> -
> -=head1 FILES
> -
> -Container content will be stored in subdirectories of
> -/var/lib/libvirt/filesystems, by default. You can manage the
> -content in these directories outside of the container and
> -processes within the container will see the content.
> -
> -=head1 AUTHORS
> -
> -Daniel Walsh <dwalsh at redhat.com>
> -Daniel P. Berrange <dan at berrange.com>
> -
> -=head1 COPYRIGHT
> -
> -Copyright (C) 2011-2013 Red Hat, Inc.
> -
> -=head1 LICENSE
> -
> -virt-sandbox is distributed under the terms of the GNU LGPL v2+.
> -This is free software; see the source for copying conditions.
> -There is NO warranty; not even for MERCHANTABILITY or FITNESS
> -FOR A PARTICULAR PURPOSE
> diff --git a/bin/virt-sandbox-service-util.c b/bin/virt-sandbox-service-util.c
> deleted file mode 100644
> index a0e090d..0000000
> --- a/bin/virt-sandbox-service-util.c
> +++ /dev/null
> @@ -1,305 +0,0 @@
> -/*
> - * virt-sandbox-service-util.c: libvirt sandbox service util command
> - *
> - * Copyright (C) 2012-2013 Red Hat, Inc.
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2.1 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> - *
> - * Author: Daniel J Walsh <dwalsh at redhat.com>
> - * Author: Daniel P. Berrange <berrange at redhat.com>
> - */
> -
> -#include <config.h>
> -
> -#include <libvirt-sandbox/libvirt-sandbox.h>
> -#include <glib/gi18n.h>
> -
> -#define STREQ(x,y) (strcmp(x,y) == 0)
> -
> -static gboolean do_close(GVirSandboxConsole *con G_GNUC_UNUSED,
> - gboolean error G_GNUC_UNUSED,
> - gpointer opaque)
> -{
> - GMainLoop *loop = opaque;
> - g_main_loop_quit(loop);
> - return FALSE;
> -}
> -
> -
> -static void libvirt_sandbox_version(void)
> -{
> - g_print(_("%s version %s\n"), PACKAGE, VERSION);
> - exit(EXIT_SUCCESS);
> -}
> -
> -
> -static GVirSandboxContext *libvirt_sandbox_get_context(const char *uri,
> - const char *name)
> -{
> - GVirSandboxConfig *config = NULL;
> - GVirSandboxContextService *ctx = NULL;
> - GError *err = NULL;
> - GVirConnection *conn = NULL;
> - gchar *configfile = NULL;
> -
> - configfile = g_strdup_printf("/etc/libvirt-sandbox/services/%s/config/sandbox.cfg", name);
> -
> - if (uri)
> - conn = gvir_connection_new(uri);
> - else
> - conn = gvir_connection_new("lxc:///");
> -
> - if (!gvir_connection_open(conn, NULL, &err)) {
> - g_printerr(_("Unable to open connection: %s\n"),
> - err && err->message ? err->message : _("unknown"));
> - goto cleanup;
> - }
> -
> - if (!(config = gvir_sandbox_config_load_from_path(configfile, &err))) {
> - g_printerr(_("Unable to read config file %s: %s\n"), configfile,
> - err && err->message ? err->message : _("unknown"));
> - goto cleanup;
> - }
> -
> - if (!(ctx = gvir_sandbox_context_service_new(conn, GVIR_SANDBOX_CONFIG_SERVICE(config)))) {
> - g_printerr(_("Unable to create new context service: %s\n"),
> - err && err->message ? err->message : _("unknown"));
> - goto cleanup;
> - }
> -
> -cleanup:
> - g_free(configfile);
> - if (conn)
> - g_object_unref(conn);
> - if (config)
> - g_object_unref(config);
> -
> - return ctx ? GVIR_SANDBOX_CONTEXT(ctx) : NULL;
> -}
> -
> -static int container_start(const char *uri, const char *name, GMainLoop *loop)
> -{
> - int ret = EXIT_FAILURE;
> - GError *err = NULL;
> - GVirSandboxConsole *con = NULL;
> - GVirSandboxContext *ctx = NULL;
> -
> - if (!(ctx = libvirt_sandbox_get_context(uri, name)))
> - goto cleanup;
> -
> - if (!(gvir_sandbox_context_start(ctx, &err))) {
> - g_printerr(_("Unable to start container: %s\n"),
> - err && err->message ? err->message : _("unknown"));
> - goto cleanup;
> - }
> -
> - if (!(con = gvir_sandbox_context_get_log_console(ctx, &err))) {
> - g_printerr(_("Unable to get log console for container: %s\n"),
> - err && err->message ? err->message : _("unknown"));
> - goto cleanup;
> - }
> -
> - gvir_sandbox_console_set_direct(con, TRUE);
> -
> - g_signal_connect(con, "closed", (GCallback)do_close, loop);
> -
> - if (gvir_sandbox_console_attach_stderr(con, &err) < 0) {
> - g_printerr(_("Unable to attach console to stderr in the container: %s\n"),
> - err && err->message ? err->message : _("unknown"));
> - goto cleanup;
> - }
> -
> - /* Stop holding open libvirt connection */
> - if (gvir_sandbox_console_isolate(con, &err) < 0) {
> - g_printerr(_("Unable to disconnect console from libvirt: %s\n"),
> - err && err->message ? err->message : _("unknown"));
> - goto cleanup;
> - }
> -
> - gvir_sandbox_context_detach(ctx, NULL);
> - g_object_unref(ctx);
> - ctx = NULL;
> -
> - g_main_loop_run(loop);
> -
> - ret = EXIT_SUCCESS;
> -
> -cleanup:
> - if (ctx)
> - g_object_unref(ctx);
> - if (con)
> - g_object_unref(con);
> - return ret;
> -}
> -
> -static int container_attach(const char *uri, const char *name, GMainLoop *loop)
> -{
> - int ret = EXIT_FAILURE;
> - GError *err = NULL;
> - GVirSandboxConsole *con = NULL;
> - GVirSandboxContext *ctx = NULL;
> -
> - if (!(ctx = libvirt_sandbox_get_context(uri, name)))
> - goto cleanup;
> -
> - if (!(gvir_sandbox_context_attach(ctx, &err))) {
> - g_printerr(_("Unable to attach to container: %s\n"),
> - err && err->message ? err->message : _("unknown"));
> - goto cleanup;
> - }
> -
> - if (!(con = gvir_sandbox_context_get_shell_console(ctx, &err))) {
> - g_printerr(_("Unable to get shell console for container: %s\n"),
> - err && err->message ? err->message : _("unknown"));
> - goto cleanup;
> - }
> -
> - gvir_sandbox_console_set_direct(con, TRUE);
> -
> - g_signal_connect(con, "closed", (GCallback)do_close, loop);
> -
> - if (!(gvir_sandbox_console_attach_stdio(con, &err))) {
> - g_printerr(_("Unable to attach to container: %s\n"),
> - err && err->message ? err->message : _("unknown"));
> - goto cleanup;
> - }
> -
> - /* Stop holding open libvirt connection */
> - if (gvir_sandbox_console_isolate(con, &err) < 0) {
> - g_printerr(_("Unable to disconnect console from libvirt: %s\n"),
> - err && err->message ? err->message : _("unknown"));
> - goto cleanup;
> - }
> -
> - gvir_sandbox_context_detach(ctx, NULL);
> -
> - g_object_unref(ctx);
> - ctx = NULL;
> -
> - g_main_loop_run(loop);
> -
> - ret = EXIT_SUCCESS;
> -
> -cleanup:
> - if (ctx)
> - g_object_unref(ctx);
> - if (con)
> - g_object_unref(con);
> - return ret;
> -}
> -
> -
> -static int (*container_func)(const char *uri, const char *name, GMainLoop *loop) = NULL;
> -
> -static gboolean libvirt_lxc_start(const gchar *option_name,
> - const gchar *value,
> - const gpointer *data,
> - const GError **error)
> -
> -{
> - if (container_func) return FALSE;
> - container_func = container_start;
> - return TRUE;
> -}
> -
> -static gboolean libvirt_lxc_attach(const gchar *option_name,
> - const gchar *value,
> - const gpointer *data,
> - const GError **error)
> -
> -{
> - if (container_func) return FALSE;
> - container_func = container_attach;
> - return TRUE;
> -}
> -
> -int main(int argc, char **argv)
> -{
> - GError *err = NULL;
> - GMainLoop *loop = NULL;
> - int ret = EXIT_FAILURE;
> - pid_t pid = 0;
> - gchar *uri = NULL;
> -
> - gchar **cmdargs = NULL;
> - GOptionContext *context;
> - GOptionEntry options[] = {
> - { "version", 'V', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
> - libvirt_sandbox_version, N_("Display version information"), NULL },
> - { "start", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
> - libvirt_lxc_start, N_("Start a container"), NULL },
> - { "attach", 'a', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
> - libvirt_lxc_attach, N_("Attach to a container"), NULL },
> - { "pid", 'p', 0, G_OPTION_ARG_INT, &pid,
> - N_("Pid of process in container to which the command will run"), "PID"},
> - { "connect", 'c', 0, G_OPTION_ARG_STRING, &uri,
> - N_("Connect to hypervisor Default:'lxc:///'"), "URI"},
> - { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &cmdargs,
> - NULL, "CONTAINER_NAME" },
> - { NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL }
> - };
> - const char *help_msg = N_("Run 'virt-sandbox-service-util --help' to see a full list of available command line
> options\n");
> -
> - setlocale(LC_ALL, "");
> - bindtextdomain(PACKAGE, LOCALEDIR);
> - bind_textdomain_codeset(PACKAGE, "UTF-8");
> - textdomain(PACKAGE);
> -
> - if (!gvir_sandbox_init_check(&argc, &argv, &err))
> - exit(EXIT_FAILURE);
> -
> - context = g_option_context_new (_("- Libvirt Sandbox Service"));
> - g_option_context_add_main_entries (context, options, NULL);
> - g_option_context_parse (context, &argc, &argv, &err);
> -
> - if (err) {
> - g_printerr("%s\n%s\n",
> - err->message,
> - gettext(help_msg));
> - goto cleanup;
> - }
> -
> - if ( container_func == NULL ) {
> - g_printerr(_("Invalid command: You must specify --start or --attach\n%s"),
> - gettext(help_msg));
> - goto cleanup;
> - }
> -
> - if (!cmdargs || !cmdargs[0] ) {
> - g_printerr(_("Invalid command CONTAINER_NAME required: %s"),
> - gettext(help_msg));
> - goto cleanup;
> - }
> -
> - g_option_context_free(context);
> -
> - g_set_application_name(_("Libvirt Sandbox Service"));
> -
> - loop = g_main_loop_new(g_main_context_default(), 1);
> - ret = container_func(uri, cmdargs[0], loop);
> - g_main_loop_unref(loop);
> -
> -cleanup:
> - exit(ret);
> -}
> -
> -/*
> - * Local variables:
> - * c-indent-level: 4
> - * c-basic-offset: 4
> - * indent-tabs-mode: nil
> - * tab-width: 8
> - * End:
> - */
> diff --git a/bin/virt-sandbox-service.logrotate b/bin/virt-sandbox-service.logrotate
> deleted file mode 100644
> index 6bb7d68..0000000
> --- a/bin/virt-sandbox-service.logrotate
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -#!/bin/sh
> -for name in `/usr/bin/virsh -c lxc:/// -q list | awk '{print $2}'`
> -do
> - if test -d "/etc/libvirt-sandbox/services/$name"
> - then
> - /usr/bin/virt-sandbox-service -c lxc:/// execute $name -- /etc/cron.daily/logrotate
> - fi
> -done
> -exit 0
> diff --git a/bin/virt-sandbox-service.pod b/bin/virt-sandbox-service.pod
> deleted file mode 100644
> index e6f0739..0000000
> --- a/bin/virt-sandbox-service.pod
> +++ /dev/null
> @@ -1,85 +0,0 @@
> -=head1 NAME
> -
> -virt-sandbox-service - Secure container tool
> -
> -=head1 SYNOPSIS
> -
> - {create,clone,connect,delete,execute,reload,upgrade}
> -
> - commands:
> -
> - create create a sandbox container
> -
> - clone Clone an existing sandbox container
> -
> - connect Connect to a sandbox container
> -
> - delete Delete a sandbox container
> -
> - execute Execute a command within a sandbox container
> -
> - reload Reload a running sandbox container
> -
> - upgrade Upgrade an existing sandbox container
> -
> -=head1 DESCRIPTION
> -
> -virt-sandbox-service is used to provision secure sandboxed system services.
> -These applications will be launched via libvirt and run within a virtualization
> -technology such as LinuX Containers (LXC), or optionally QEMU/KVM. The
> -container / virtual machines will be secured by SELinux and resource
> -separated using cgroups.
> -
> -By default, it will use the libvirt LXC driver, with the C<lxc:///> URI.
> -This is different from libvirt's normal behaviour, which is to probe
> -for the best URI to use. Thus if using C<virsh> to get a list of containers,
> -one must specify an explicit URI for it, C<virsh -c lxc:///>. Alternatively
> -the C<LIBVIRT_DEFAULT_URI> environment variable can be set, or the config
> -file C</etc/libvirt/libvirt.conf> can have a default URI set.
> -
> -=head1 OPTIONS
> -
> -=over 4
> -
> -=item B<-h>, B<--help>
> -
> -Display help message
> -
> -=item B<-c URI>, B<--connect URI>
> -
> -The connection URI for the hypervisor (currently only LXC URIs are
> -supported).
> -
> -=back
> -
> -=head1 SEE ALSO
> -
> -C<libvirt(8)>, C<selinux(8)>, C<systemd(8)>, C<virt-sandbox(1)>,
> -C<virt-sandbox-service-create(1)>, C<virt-sandbox-service-clone(1)>,
> -C<virt-sandbox-service-connect(1)>, C<virt-sandbox-service-delete(1)>,
> -C<virt-sandbox-service-execute(1)>, C<virt-sandbox-service-reload(1)>,
> -C<virt-sandbox-service-upgrade(1)>
> -
> -=head1 FILES
> -
> -Container content will be stored in subdirectories of
> -/var/lib/libvirt/filesystems, by default. You can manage the
> -content in these directories outside of the container and
> -processes within the container will see the content.
> -
> -=head1 AUTHORS
> -
> -Daniel Walsh <dwalsh at redhat.com>
> -
> -Daniel P. Berrange <dan at berrange.com>
> -
> -=head1 COPYRIGHT
> -
> -Copyright (C) 2011-2013 Red Hat, Inc.
> -
> -=head1 LICENSE
> -
> -virt-sandbox is distributed under the terms of the GNU LGPL v2+.
> -This is free software; see the source for copying conditions.
> -There is NO warranty; not even for MERCHANTABILITY or FITNESS
> -FOR A PARTICULAR PURPOSE
> diff --git a/cfg.mk b/cfg.mk
> index 37e5050..39b54f6 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -129,6 +129,6 @@ prev_version_file = /dev/null
>
> exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = ^libvirt-sandbox/tests
>
> -exclude_file_name_regexp--sc_bindtextdomain = ^(libvirt-sandbox/tests)|(libvirt-sandbox/libvirt-sandbox-init-
> *)|(bin/virt-sandbox.c)|(bin/virt-sandbox-service-util.c)
> +exclude_file_name_regexp--sc_bindtextdomain = ^(libvirt-sandbox/tests)|(libvirt-sandbox/libvirt-sandbox-init-
> *)|(bin/virt-sandbox.c)
>
> exclude_file_name_regexp--sc_preprocessor_indentation = ^*/*.[ch]
> diff --git a/libvirt-sandbox.spec.in b/libvirt-sandbox.spec.in
> index f5868c1..125a361 100644
> --- a/libvirt-sandbox.spec.in
> +++ b/libvirt-sandbox.spec.in
> @@ -101,17 +101,10 @@ rm -rf $RPM_BUILD_ROOT
>
> %files
> %defattr(-,root,root,-)
> -%{_datadir}/bash-completion/completions/virt-sandbox-service
> -%config(noreplace) %{_sysconfdir}/cron.daily/virt-sandbox-service.logrotate
> -%dir %{_sysconfdir}/libvirt-sandbox/services
> %{_bindir}/virt-sandbox
> -%{_bindir}/virt-sandbox-service
> %{_bindir}/virt-sandbox-image
> -%{_libexecdir}/virt-sandbox-service-util
> %{python3_sitelib}/libvirt_sandbox
> %{_mandir}/man1/virt-sandbox.1*
> -%{_mandir}/man1/virt-sandbox-service.1*
> -%{_mandir}/man1/virt-sandbox-service-*.1*
>
> %files libs -f %{name}.lang
> %defattr(-,root,root,-)
> diff --git a/libvirt-sandbox/tests/containers_test.sh b/libvirt-sandbox/tests/containers_test.sh
> deleted file mode 100755
> index 9b2a716..0000000
> --- a/libvirt-sandbox/tests/containers_test.sh
> +++ /dev/null
> @@ -1,37 +0,0 @@
> -#!/bin/bash
> -#
> -# Simple script to setup hundreds of containers at the same time
> -#
> -# In order to create 100 containers execute
> -# containers_test.sh create apache 100
> -# Start
> -# containers_test.sh start apache 100
> -# Stop
> -# containers_test.sh stop apache 100
> -# Delete
> -# containers_test.sh delete apache 100
> -#
> -
> -create() {
> - virt-sandbox-service create -C -l s0:c$2 -u httpd.service $1
> -}
> -
> -delete() {
> - virt-sandbox-service delete $1
> -}
> -
> -start() {
> - systemctl start httpd@$1.service
> -}
> -
> -stop() {
> - systemctl stop httpd@$1.service
> -}
> -
> -command=$1
> -name=$2
> -repeat=$3
> -for i in $(seq 1 $repeat)
> -do
> - eval $command $name$i $i
> -done
> diff --git a/po/POTFILES.in b/po/POTFILES.in
> index 724c49c..6c500b2 100644
> --- a/po/POTFILES.in
> +++ b/po/POTFILES.in
> @@ -1,5 +1,4 @@
> bin/virt-sandbox.c
> -bin/virt-sandbox-service-util.c
> libvirt-sandbox/libvirt-sandbox-builder-initrd.c
> libvirt-sandbox/libvirt-sandbox-builder-machine.c
> libvirt-sandbox/libvirt-sandbox-config.c
ACK, but would be good to also remove the 'bin/virt-sandbox-service-util'
entry in .gitignore.
--
Cedric
More information about the libvir-list
mailing list