]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
lxc-ls: Rewrite nesting code to use the attach API
authorStéphane Graber <stgraber@ubuntu.com>
Thu, 24 Oct 2013 18:45:34 +0000 (14:45 -0400)
committerStéphane Graber <stgraber@ubuntu.com>
Thu, 24 Oct 2013 20:19:56 +0000 (16:19 -0400)
Signed-off-by: Stéphane Graber <stgraber@ubuntu.com>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
src/lxc/lxc-ls

index cc0a1e7587722dc3303eb9a7315595bf8caa7f03..9d454001846a063f1017b4b119a1bd2b3b7e3a4e 100644 (file)
@@ -35,7 +35,7 @@ import json
 import lxc
 import os
 import re
-import subprocess
+import tempfile
 import sys
 
 _ = gettext.gettext
@@ -89,17 +89,23 @@ def getTerminalSize():
 
 
 def getSubContainers(container, lxcpath):
-    attach = ['lxc-attach', '-P', lxcpath, '-R', '-s', 'NETWORK|PID',
-              '-n', container,
-              '--', sys.argv[0], "--nesting"]
-
     with open(os.devnull, "w") as fd:
-        newenv = dict(os.environ)
-        newenv['NESTED'] = "/proc/1/root/%s" % lxc.default_config_path
-        sp = subprocess.Popen(attach, stderr=fd, stdout=subprocess.PIPE,
-                              env=newenv, universal_newlines=True)
-        sp.wait()
-        out = sp.stdout.read()
+        fdnum, path = tempfile.mkstemp()
+        os.remove(path)
+
+        fd = os.fdopen(fdnum)
+
+        container.attach_wait(
+            lxc.attach_run_command, [sys.argv[0], "--nesting"],
+            attach_flags=(lxc.LXC_ATTACH_REMOUNT_PROC_SYS),
+            namespaces=(lxc.CLONE_NEWNET + lxc.CLONE_NEWPID),
+            extra_env_vars=["NESTED=/proc/1/root/%s" %
+                            lxc.default_config_path],
+            stdout=fd)
+
+        fd.seek(0)
+        out = fd.read()
+        fd.close()
         if out:
             return json.loads(out)
     return None
@@ -213,8 +219,8 @@ for container_name in lxc.list_containers(config_path=lxcpath):
     containers.append(entry)
 
     # Nested containers
-    if args.nesting:
-        sub = getSubContainers(container_name, args.lxcpath)
+    if args.nesting and container.state == "RUNNING":
+        sub = getSubContainers(container, args.lxcpath)
         if sub:
             for entry in sub:
                 if 'nesting_parent' not in entry: