From 94891ea3e44961f4369a7cc67d38c3a98a0e4c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Mon, 1 Feb 2016 17:37:24 +0100 Subject: [PATCH 1/2] Remove legacy versions of lxc-ls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lxc-ls nowadays is a C binary so there's no need to keep the python and shell versions around anymore, remove them from the branch and cleanup documentation and Makefiles. Signed-off-by: Stéphane Graber --- .gitignore | 4 - configure.ac | 5 - doc/Makefile.am | 4 +- doc/ja/Makefile.am | 4 +- doc/ja/legacy/lxc-ls.sgml.in | 176 ------------ doc/ko/Makefile.am | 4 +- doc/ko/legacy/lxc-ls.sgml.in | 176 ------------ doc/legacy/lxc-ls.sgml.in | 156 ----------- src/lxc/Makefile.am | 4 - src/lxc/legacy/lxc-ls.in | 99 ------- src/lxc/lxc-ls.in | 515 ----------------------------------- 11 files changed, 3 insertions(+), 1144 deletions(-) delete mode 100644 doc/ja/legacy/lxc-ls.sgml.in delete mode 100644 doc/ko/legacy/lxc-ls.sgml.in delete mode 100644 doc/legacy/lxc-ls.sgml.in delete mode 100644 src/lxc/legacy/lxc-ls.in delete mode 100755 src/lxc/lxc-ls.in diff --git a/.gitignore b/.gitignore index 338117a2c..23fd4effb 100644 --- a/.gitignore +++ b/.gitignore @@ -62,7 +62,6 @@ src/lxc/lxc-unfreeze src/lxc/lxc-unshare src/lxc/lxc-usernsexec src/lxc/lxc-wait -src/lxc/legacy/lxc-ls src/lxc/lxc-user-nic src/lxc/version.h @@ -121,12 +120,9 @@ doc/*.7 doc/ja/*.1 doc/ja/*.5 doc/ja/*.7 -doc/ja/legacy/*.1 -doc/legacy/*.1 doc/ko/*.1 doc/ko/*.5 doc/ko/*.7 -doc/ko/legacy/*.1 doc/manpage.links doc/manpage.refs doc/api/html/* diff --git a/configure.ac b/configure.ac index d1902fb32..83bf4c594 100644 --- a/configure.ac +++ b/configure.ac @@ -685,7 +685,6 @@ AC_CONFIG_FILES([ doc/Makefile doc/api/Makefile - doc/legacy/lxc-ls.sgml doc/lxc-attach.sgml doc/lxc-autostart.sgml doc/lxc-cgroup.sgml @@ -734,7 +733,6 @@ AC_CONFIG_FILES([ doc/examples/lxc-complex.conf doc/ja/Makefile - doc/ja/legacy/lxc-ls.sgml doc/ja/lxc-attach.sgml doc/ja/lxc-autostart.sgml doc/ja/lxc-cgroup.sgml @@ -772,7 +770,6 @@ AC_CONFIG_FILES([ doc/ja/see_also.sgml doc/ko/Makefile - doc/ko/legacy/lxc-ls.sgml doc/ko/lxc-attach.sgml doc/ko/lxc-autostart.sgml doc/ko/lxc-cgroup.sgml @@ -835,9 +832,7 @@ AC_CONFIG_FILES([ src/Makefile src/lxc/Makefile src/lxc/lxc-checkconfig - src/lxc/lxc-ls src/lxc/lxc-start-ephemeral - src/lxc/legacy/lxc-ls src/lxc/lxc.functions src/lxc/version.h src/python-lxc/Makefile diff --git a/doc/Makefile.am b/doc/Makefile.am index 0db1f6cc8..c309ef8b1 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -31,6 +31,7 @@ man_MANS = \ lxc-execute.1 \ lxc-freeze.1 \ lxc-info.1 \ + lxc-ls.1 \ lxc-monitor.1 \ lxc-snapshot.1 \ lxc-start.1 \ @@ -50,10 +51,7 @@ man_MANS = \ lxc.7 if ENABLE_PYTHON - man_MANS += lxc-ls.1 man_MANS += lxc-start-ephemeral.1 -else - man_MANS += legacy/lxc-ls.1 endif %.1 : %.sgml diff --git a/doc/ja/Makefile.am b/doc/ja/Makefile.am index 1813ff852..671dcfe41 100644 --- a/doc/ja/Makefile.am +++ b/doc/ja/Makefile.am @@ -23,6 +23,7 @@ man_MANS = \ lxc-execute.1 \ lxc-freeze.1 \ lxc-info.1 \ + lxc-ls.1 \ lxc-monitor.1 \ lxc-snapshot.1 \ lxc-start.1 \ @@ -42,10 +43,7 @@ man_MANS = \ lxc.7 if ENABLE_PYTHON - man_MANS += lxc-ls.1 man_MANS += lxc-start-ephemeral.1 -else - man_MANS += legacy/lxc-ls.1 endif %.1 : %.sgml diff --git a/doc/ja/legacy/lxc-ls.sgml.in b/doc/ja/legacy/lxc-ls.sgml.in deleted file mode 100644 index 0fdfafd3e..000000000 --- a/doc/ja/legacy/lxc-ls.sgml.in +++ /dev/null @@ -1,176 +0,0 @@ - - - -]> - - - - @LXC_GENERATE_DATE@ - - - lxc-ls - 1 - - - - lxc-ls - - - - システム上に存在するコンテナをリスト表示する。 - - - - - - lxc-ls - --active - ls option - - - - - <!-- Description -->説明 - - - lxc-ls はシステム上に存在するコンテナをリスト表示します。 - - - - - <!-- Options -->オプション - - - - - - - - - - 稼働中のコンテナをリスト表示します。 - - - - - - - - - - - - lxc-ls が受け付けるオプションは、ls コマンドと同じです。 - - - - - - - - - - <!-- Examples -->例 - - - lxc-ls -l - - - - 全てのコンテナとそのパーミッションをリスト表示します。 - - - - - - lxc-ls --active -1 - - - - 稼働中のコンテナを一列にリスト表示します。 - - - - - - - - - See Also - - - - ls - 1 - , - - - - - &seealso; - - - <!-- Author -->作者 - Daniel Lezcano daniel.lezcano@free.fr - - - - - diff --git a/doc/ko/Makefile.am b/doc/ko/Makefile.am index 5eb60b408..6d0cf4dc0 100644 --- a/doc/ko/Makefile.am +++ b/doc/ko/Makefile.am @@ -23,6 +23,7 @@ man_MANS = \ lxc-execute.1 \ lxc-freeze.1 \ lxc-info.1 \ + lxc-ls.1 \ lxc-monitor.1 \ lxc-snapshot.1 \ lxc-start.1 \ @@ -42,10 +43,7 @@ man_MANS = \ lxc.7 if ENABLE_PYTHON - man_MANS += lxc-ls.1 man_MANS += lxc-start-ephemeral.1 -else - man_MANS += legacy/lxc-ls.1 endif %.1 : %.sgml diff --git a/doc/ko/legacy/lxc-ls.sgml.in b/doc/ko/legacy/lxc-ls.sgml.in deleted file mode 100644 index ffd6b4eeb..000000000 --- a/doc/ko/legacy/lxc-ls.sgml.in +++ /dev/null @@ -1,176 +0,0 @@ - - - -]> - - - - @LXC_GENERATE_DATE@ - - - lxc-ls - 1 - - - - lxc-ls - - - - 시스템 내에 존재하는 컨테이너들의 리스트 표시 - - - - - - lxc-ls - --active - ls option - - - - - <!-- Description -->설명 - - - lxc-ls는 시스템 내에 존재하는 컨테이너들의 리스트를 표시한다. - - - - - <!-- Options -->옵션 - - - - - - - - - - 동작 중인 컨테이너들의 리스트를 표시한다. - - - - - - - - - - - - lxc-ls에는 ls와 같은 옵션을 사용할 수 있다. - - - - - - - - - - <!-- Examples -->예제 - - - lxc-ls -l - - - - 모든 컨테이너들의 리스트와 그들의 퍼미션 정보를 표시한다. - - - - - - lxc-ls --active -1 - - - - 동작 중인 컨테이너들의 리스트를 1열로 표시한다. - - - - - - - - - <!-- See Also -->참조 - - - - ls - 1 - , - - - - - &seealso; - - - <!-- Author -->저자 - Daniel Lezcano daniel.lezcano@free.fr - - - - - diff --git a/doc/legacy/lxc-ls.sgml.in b/doc/legacy/lxc-ls.sgml.in deleted file mode 100644 index bed9b8a93..000000000 --- a/doc/legacy/lxc-ls.sgml.in +++ /dev/null @@ -1,156 +0,0 @@ - - - - -]> - - - - @LXC_GENERATE_DATE@ - - - lxc-ls - 1 - - - - lxc-ls - - - list the containers existing on the system - - - - - - lxc-ls - --active - ls options - - - - - Description - - lxc-ls list the containers existing on the - system. - - - - - Options - - - - - - - - - List active containers. - - - - - - - - - - - The option passed to lxc-ls are the - same as the ls command. - - - - - - - - - - Examples - - - lxc-ls -l - - - list all the container and their permissions. - - - - - - lxc-ls --active -1 - - - list active containers and display the list in one column. - - - - - - - - - See Also - - - - ls - 1 - , - - - - - &seealso; - - - Author - Daniel Lezcano daniel.lezcano@free.fr - - - - - diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am index 06a15fc52..85791db69 100644 --- a/src/lxc/Makefile.am +++ b/src/lxc/Makefile.am @@ -190,14 +190,10 @@ endif bin_SCRIPTS = lxc-checkconfig EXTRA_DIST = \ - lxc-ls \ lxc-top.lua if ENABLE_PYTHON -bin_SCRIPTS += lxc-ls bin_SCRIPTS += lxc-start-ephemeral -else -bin_SCRIPTS += legacy/lxc-ls endif bin_PROGRAMS = \ diff --git a/src/lxc/legacy/lxc-ls.in b/src/lxc/legacy/lxc-ls.in deleted file mode 100644 index a823bd04c..000000000 --- a/src/lxc/legacy/lxc-ls.in +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/sh - -# -# lxc: linux Container library - -# 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 - -. @DATADIR@/lxc/lxc.functions - -usage() -{ - echo "usage: $(basename $0) [--active] [--] [LS_OPTIONS...]" >&2 -} - -help() { - usage - echo >&2 - echo "List containers existing on the system." >&2 - echo >&2 - echo " --active list active containers" >&2 - echo " LS_OPTIONS ls command options (see \`ls --help')" >&2 -} - -get_parent_cgroup() -{ - parent_cgroup="" - - # Obtain a list of hierarchies that contain one or more subsystems - hierarchies=$(tail -n +2 /proc/cgroups | cut -f 2) - - # Iterate through the list until a suitable hierarchy is found - for hierarchy in $hierarchies; do - # Obtain information about the init process in the hierarchy - fields=$(grep -E "^$hierarchy:" /proc/1/cgroup | head -n 1) - if [ -z "$fields" ]; then continue; fi - fields=${fields#*:} - - # Get a comma-separated list of the hierarchy's subsystems - subsystems=${fields%:*} - - # Get the cgroup of the init process in the hierarchy - init_cgroup=${fields#*:} - - # Get the filesystem mountpoint of the hierarchy - mountpoint=$(awk -v subsysregex="(^|,)$subsystems(,|\$)" \ - '$3 == "cgroup" && $4 ~ subsysregex {print $2}' /proc/self/mounts) - if [ -z "$mountpoint" ]; then continue; fi - - # Return the absolute path to the containers' parent cgroup - # (do not append '/lxc' if the hierarchy contains the 'ns' subsystem) - case ",$subsystems," in - *,ns,*) parent_cgroup="${mountpoint}${init_cgroup%/}";; - *) parent_cgroup="${mountpoint}${init_cgroup%/}/lxc";; - esac - break - done -} - -directory=$(readlink -f "$lxc_path") - -for i in "$@"; do - case $i in - --help) - help; exit;; - --active) - get_parent_cgroup; directory="$parent_cgroup"; shift;; - --) - shift; break;; - *) - break;; - esac -done - -containers="" -if [ ! -z "$directory" ]; then - if [ x"$parent_cgroup" = x ]; then - containers=$(find -L $directory -mindepth 2 -maxdepth 2 -name config -type f |awk -F "/" '{print $(NF-1)}') - else - containers=$(find $directory -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sed 's:.*/::') - fi - if [ x"$containers" = x ]; then - exit 0 - fi -fi - -cd "$directory" -ls -d $@ -- $containers diff --git a/src/lxc/lxc-ls.in b/src/lxc/lxc-ls.in deleted file mode 100755 index b83ee7391..000000000 --- a/src/lxc/lxc-ls.in +++ /dev/null @@ -1,515 +0,0 @@ -#!/usr/bin/env python3 -# -# lxc-ls: List containers -# -# This python implementation is based on the work done in the original -# shell implementation done by Serge Hallyn in Ubuntu (and other contributors) -# -# (C) Copyright Canonical Ltd. 2012 -# -# Authors: -# Stéphane Graber -# -# 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 -# - -import argparse -import gettext -import json -import lxc -import os -import re -import shutil -import tempfile -import sys - -_ = gettext.gettext -gettext.textdomain("lxc-ls") - -# Required for containers without python -import encodings.ascii -assert encodings.ascii - -# Constants -LXCPATH = "@LXCPATH@" -RUNTIME_PATH = "@RUNTIME_PATH@" - - -# Functions used later on -def batch(iterable, cols=1): - import math - - length = len(iterable) - lines = math.ceil(length / cols) - - for line in range(lines): - fields = [] - for col in range(cols): - index = line + (col * lines) - if index < length: - fields.append(iterable[index]) - yield fields - - -def get_terminal_size(): - import os - env = os.environ - - def ioctl_GWINSZ(fd): - try: - import fcntl - import termios - import struct - cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, - '1234')) - return cr - except: - return - - cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) - if not cr: - try: - fd = os.open(os.ctermid(), os.O_RDONLY) - cr = ioctl_GWINSZ(fd) - os.close(fd) - except: - pass - - if not cr: - cr = (env.get('LINES', 25), env.get('COLUMNS', 80)) - - return int(cr[1]), int(cr[0]) - - -def get_root_path(path): - lxc_path = LXCPATH - global_conf = "%s/etc/lxc/lxc.conf" % path - if os.path.exists(global_conf): - with open(global_conf, "r") as fd: - for line in fd: - if line.startswith("lxc.lxcpath"): - lxc_path = line.split("=")[-1].strip() - break - return lxc_path - - -# Constants -FIELDS = ("name", "state", "interfaces", "ipv4", "ipv6", "autostart", "pid", - "memory", "ram", "swap", "groups") -DEFAULT_FIELDS = ("name", "state", "ipv4", "ipv6", "groups", "autostart") - -# Begin parsing the command line -parser = argparse.ArgumentParser(description=_("LXC: List containers"), - formatter_class=argparse.RawTextHelpFormatter, - epilog=_("""Valid fancy-format fields: - %s - -Default fancy-format fields: - %s\n""" % (", ".join(FIELDS), ", ".join(DEFAULT_FIELDS)))) - -parser.add_argument("-1", dest="one", action="store_true", - help=_("list one container per line (default when piped)")) - -parser.add_argument("-P", "--lxcpath", dest="lxcpath", metavar="PATH", - help=_("Use specified container path"), - default=lxc.default_config_path) - -parser.add_argument("--active", action="store_true", - help=_("list only active containers")) - -parser.add_argument("--frozen", dest="state", action="append_const", - const="FROZEN", help=_("list only frozen containers")) - -parser.add_argument("--running", dest="state", action="append_const", - const="RUNNING", help=_("list only running containers")) - -parser.add_argument("--stopped", dest="state", action="append_const", - const="STOPPED", help=_("list only stopped containers")) - -parser.add_argument("-f", "--fancy", action="store_true", - help=_("use fancy output")) - -parser.add_argument("-F", "--fancy-format", type=str, - default=",".join(DEFAULT_FIELDS), - help=_("comma separated list of fields to show")) - -parser.add_argument("-g", "--groups", type=str, action="append", - metavar="GROUPS", - help=_("groups (comma separated) the container must " - "be a member of")) - -parser.add_argument("--nesting", dest="nesting", action="store_true", - help=_("show nested containers")) - -parser.add_argument("filter", metavar='FILTER', type=str, nargs="?", - help=_("regexp to be applied on the container list")) - -parser.add_argument("--version", action="version", version=lxc.version) - -args = parser.parse_args() - -# --active is the same as --running --frozen -if args.active: - if not args.state: - args.state = [] - args.state += ["RUNNING", "FROZEN", "UNKNOWN"] - -# If the output is piped, default to --one -if not sys.stdout.isatty(): - args.one = True - -# Turn args.fancy_format into a list -args.fancy_format = args.fancy_format.strip().split(",") - -if set(args.fancy_format) - set(FIELDS): - parser.error(_("Invalid field(s): %s" % - ", ".join(list(set(args.fancy_format) - set(FIELDS))))) - -# Basic checks -## Check for setns -SUPPORT_SETNS = os.path.exists("/proc/self/ns") -SUPPORT_SETNS_NET = False -SUPPORT_SETNS_PID = False -if SUPPORT_SETNS: - SUPPORT_SETNS_NET = os.path.exists("/proc/self/ns/net") - SUPPORT_SETNS_PID = os.path.exists("/proc/self/ns/pid") - -## Nesting requires setns to pid and net ns -if args.nesting: - if not SUPPORT_SETNS: - parser.error(_("Showing nested containers requires setns support " - "which your kernel doesn't support.")) - - if not SUPPORT_SETNS_NET: - parser.error(_("Showing nested containers requires setns to the " - "network namespace which your kernel doesn't support.")) - - if not SUPPORT_SETNS_PID: - parser.error(_("Showing nested containers requires setns to the " - "PID namespace which your kernel doesn't support.")) - -# Set the actual lxcpath value -if not args.lxcpath: - args.lxcpath = lxc.default_config_path - - -# List of containers, stored as dictionaries -def get_containers(fd=None, base="/", root=False): - containers = [] - - paths = [args.lxcpath] - - if not root: - paths.append(get_root_path(base)) - - # Generate a unique list of valid paths - paths = set([os.path.normpath("%s/%s" % (base, path)) for path in paths]) - - for path in paths: - if not os.access(path, os.R_OK): - continue - - for container_name in lxc.list_containers(config_path=path): - entry = {} - entry['name'] = container_name - - # Apply filter - if root and args.filter and \ - not re.match(args.filter, container_name): - continue - - # Return before grabbing the object (non-root) - if not args.state and not args.fancy and not args.nesting \ - and not args.groups: - containers.append(entry) - continue - - try: - container = lxc.Container(container_name, path) - except: - continue - - if args.groups or "autostart" in args.fancy_format \ - or "groups" in args.fancy_format: - try: - groups = container.get_config_item("lxc.group") - except KeyError: - groups = [] - - if args.groups: - set_has = set(groups) - - for group in args.groups: - set_must = set(group.split(",")) - if not set_must - set_has: - break - else: - continue - - if container.controllable: - state = container.state - else: - state = 'UNKNOWN' - - # Filter by status - if args.state and state not in args.state: - continue - - # Nothing more is needed if we're not printing some fancy output - if not args.fancy and not args.nesting: - containers.append(entry) - continue - - # Some extra field we may want - if 'state' in args.fancy_format: - entry['state'] = state - - if 'pid' in args.fancy_format: - entry['pid'] = "-" - if state == 'UNKNOWN': - entry['pid'] = state - elif container.init_pid != -1: - entry['pid'] = str(container.init_pid) - - if 'groups' in args.fancy_format: - entry['groups'] = "-" - if len(groups) > 0: - entry['groups'] = ", ".join(groups) - - if 'autostart' in args.fancy_format: - entry['autostart'] = "NO" - try: - if container.get_config_item("lxc.start.auto") == "1": - if len(groups) > 0: - entry['autostart'] = "BY-GROUP" - else: - entry['autostart'] = "YES" - except KeyError: - pass - - if 'memory' in args.fancy_format or \ - 'ram' in args.fancy_format or \ - 'swap' in args.fancy_format: - - if container.running: - try: - memory_ram = int(container.get_cgroup_item( - "memory.usage_in_bytes")) - except: - memory_ram = 0 - - try: - memory_stat = container.get_cgroup_item("memory.stat") - beg = memory_stat.find("\nswap ") + 6 - end = memory_stat[beg:].find("\n") + len(memory_stat[:beg]) - memory_swap = int(memory_stat[beg:end]) - except: - memory_swap = 0 - else: - memory_ram = 0 - memory_swap = 0 - - memory_total = memory_ram + memory_swap - - if 'memory' in args.fancy_format: - if container.running: - entry['memory'] = "%sMB" % round(memory_total / 1048576, 2) - else: - entry['memory'] = "-" - - if 'ram' in args.fancy_format: - if container.running: - entry['ram'] = "%sMB" % round(memory_ram / 1048576, 2) - else: - entry['ram'] = "-" - - if 'swap' in args.fancy_format: - if container.running: - entry['swap'] = "%sMB" % round(memory_swap / 1048576, 2) - else: - entry['swap'] = "-" - - # Get the IPs - for family, protocol in {'inet': 'ipv4', 'inet6': 'ipv6'}.items(): - if protocol in args.fancy_format: - entry[protocol] = "-" - - if state == 'UNKNOWN': - entry[protocol] = state - continue - - if container.running: - if not SUPPORT_SETNS_NET: - entry[protocol] = 'UNKNOWN' - continue - - ips = container.get_ips(family=family) - if ips: - entry[protocol] = ", ".join(ips) - - # Get the interfaces - if 'interfaces' in args.fancy_format: - entry['interfaces'] = "-" - - if state == 'UNKNOWN' or (container.running and - not SUPPORT_SETNS_NET): - entry['interfaces'] = "UNKNOWN" - elif container.running: - interfaces = container.get_interfaces() - if interfaces: - entry['interfaces'] = ", ".join(interfaces) - - # Nested containers - if args.nesting: - if container.running: - # Recursive call in container namespace - temp_fd, temp_file = tempfile.mkstemp() - os.remove(temp_file) - - container.attach_wait(get_containers, temp_fd) - - json_file = os.fdopen(temp_fd, "r") - json_file.seek(0) - - try: - sub_containers = json.loads(json_file.read()) - except: - sub_containers = [] - - json_file.close() - else: - def clear_lock(): - try: - lock_path = "%s/lxc/lock/%s/%s" % (RUNTIME_PATH, - path, - entry['name']) - if os.path.exists(lock_path): - if os.path.isdir(lock_path): - shutil.rmtree(lock_path) - else: - os.remove(lock_path) - except: - pass - - clear_lock() - - # Recursive call using container rootfs - sub_containers = get_containers( - base="%s/%s" % ( - base, container.get_config_item("lxc.rootfs"))) - - clear_lock() - - for sub in sub_containers: - if 'nesting_parent' not in sub: - sub['nesting_parent'] = [] - sub['nesting_parent'].insert(0, entry['name']) - sub['nesting_real_name'] = sub.get('nesting_real_name', - sub['name']) - sub['name'] = "%s/%s" % (entry['name'], sub['name']) - containers.append(sub) - - # Append the container - containers.append(entry) - - if fd: - json_file = os.fdopen(fd, "w+") - json_file.write(json.dumps(containers)) - return - - return containers - -containers = get_containers(root=True) - -# Print the list -## Standard list with one entry per line -if not args.fancy and args.one: - for container in sorted(containers, - key=lambda container: container['name']): - print(container['name']) - sys.exit(0) - -## Standard list with multiple entries per line -if not args.fancy and not args.one: - # Get the longest name and extra simple list - field_maxlength = 0 - container_names = [] - for container in containers: - if len(container['name']) > field_maxlength: - field_maxlength = len(container['name']) - container_names.append(container['name']) - - # Figure out how many we can put per line - width = get_terminal_size()[0] - - entries = int(width / (field_maxlength + 2)) - if entries == 0: - entries = 1 - - for line in batch(sorted(container_names), entries): - line_format = "" - for index in range(len(line)): - line_format += "{line[%s]:%s}" % (index, field_maxlength + 2) - - print(line_format.format(line=line)) - -## Fancy listing -if args.fancy: - field_maxlength = {} - - # Get the maximum length per field - for field in args.fancy_format: - field_maxlength[field] = len(field) - - for container in containers: - for field in args.fancy_format: - if field == 'name' and 'nesting_real_name' in container: - fieldlen = len(" " * ((len(container['nesting_parent']) - 1) - * 4) + " \_ " + container['nesting_real_name']) - if fieldlen > field_maxlength[field]: - field_maxlength[field] = fieldlen - elif len(container[field]) > field_maxlength[field]: - field_maxlength[field] = len(container[field]) - - # Generate the line format string based on the maximum length and - # a 2 character padding - line_format = "" - index = 0 - for field in args.fancy_format: - line_format += "{fields[%s]:%s}" % (index, field_maxlength[field] + 2) - index += 1 - - # Get the line length minus the padding of the last field - line_length = -2 - for field in field_maxlength: - line_length += field_maxlength[field] + 2 - - # Print header - print(line_format.format(fields=[header.upper() - for header in args.fancy_format])) - print("-" * line_length) - - # Print the entries - for container in sorted(containers, - key=lambda container: container['name']): - fields = [] - for field in args.fancy_format: - if field == 'name' and 'nesting_real_name' in container: - prefix = " " * ((len(container['nesting_parent']) - 1) * 4) - fields.append(prefix + " \_ " + container['nesting_real_name']) - else: - fields.append(container[field]) - - print(line_format.format(fields=fields)) From 5de4efe3b3d43b4d39ac1540594a56865e4c695e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Mon, 1 Feb 2016 17:57:00 +0100 Subject: [PATCH 2/2] Fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber --- src/lxc/lxc_usernsexec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lxc/lxc_usernsexec.c b/src/lxc/lxc_usernsexec.c index 37d92fbed..6745ac308 100644 --- a/src/lxc/lxc_usernsexec.c +++ b/src/lxc/lxc_usernsexec.c @@ -291,7 +291,7 @@ int main(int argc, char *argv[]) } ret = readlink("/proc/self/fd/2", ttyname2, sizeof(ttyname2)); if (ret < 0) { - printf("Warning: unable to open stderr, continueing."); + printf("Warning: unable to open stderr, continuing."); memset(ttyname2, '\0', sizeof(ttyname2)); } }