Fix configuration conversion
[util-vserver.git] / python / vserver.py
index 24704d5..e923309 100644 (file)
@@ -1,6 +1,6 @@
 # Copyright 2005 Princeton University
 
-#$Id: vserver.py,v 1.59 2007/07/17 17:56:04 faiyaza Exp $
+#$Id: vserver.py,v 1.62 2007/07/20 19:45:35 dhozac Exp $
 
 import errno
 import fcntl
@@ -11,6 +11,8 @@ import signal
 import sys
 import time
 import traceback
+import subprocess
+import resource
 
 import mountimpl
 import runcmd
@@ -21,16 +23,6 @@ import cpulimit, bwlimit
 from vserverimpl import VS_SCHED_CPU_GUARANTEED as SCHED_CPU_GUARANTEED
 from vserverimpl import DLIMIT_INF
 from vserverimpl import VC_LIM_KEEP
-
-from vserverimpl import RLIMIT_CPU
-from vserverimpl import RLIMIT_RSS
-from vserverimpl import RLIMIT_NPROC
-from vserverimpl import RLIMIT_NOFILE
-from vserverimpl import RLIMIT_MEMLOCK
-from vserverimpl import RLIMIT_AS
-from vserverimpl import RLIMIT_LOCKS
-from vserverimpl import RLIMIT_SIGPENDING
-from vserverimpl import RLIMIT_MSGQUEUE
 from vserverimpl import VLIMIT_NSOCK
 from vserverimpl import VLIMIT_OPENFD
 from vserverimpl import VLIMIT_ANON
@@ -48,19 +40,19 @@ FLAGS_HIDEINFO = 32
 FLAGS_ULIMIT = 64
 FLAGS_NAMESPACE = 128
 
-RLIMITS = {"CPU": RLIMIT_CPU,
-           "RSS": RLIMIT_RSS,
-           "NPROC": RLIMIT_NPROC,
-           "NOFILE": RLIMIT_NOFILE,
-           "MEMLOCK": RLIMIT_MEMLOCK,
-           "AS": RLIMIT_AS,
-           "LOCKS": RLIMIT_LOCKS,
-           "SIGPENDING": RLIMIT_SIGPENDING,
-           "MSGQUEUE": RLIMIT_MSGQUEUE,
-           "NSOCK": VLIMIT_NSOCK,
-           "OPENFD": VLIMIT_OPENFD,
-           "ANON": VLIMIT_ANON,
-           "SHMEM": VLIMIT_SHMEM}
+RLIMITS = { "NSOCK": VLIMIT_NSOCK,
+            "OPENFD": VLIMIT_OPENFD,
+            "ANON": VLIMIT_ANON,
+            "SHMEM": VLIMIT_SHMEM}
+
+# add in the platform supported rlimits
+for entry in resource.__dict__.keys():
+    if entry.find("RLIMIT_")==0:
+        k = entry[len("RLIMIT_"):]
+        if not RLIMITS.has_key(k):
+            RLIMITS[k]=resource.__dict__[entry]
+        else:
+            print "WARNING: duplicate RLIMITS key %s" % k
 
 class NoSuchVServer(Exception): pass
 
@@ -181,7 +173,7 @@ class VServer:
 
     def set_capabilities_config(self, capabilities):
         self.config.update('bcapabilities', capabilities)
-       self.set_capabilities(capabilities)
+        self.set_capabilities(capabilities)
 
     def get_capabilities(self):
         return vserverimpl.bcaps2text(vserverimpl.getbcaps(self.ctx))
@@ -332,8 +324,9 @@ class VServer:
                          ([], filter_fn))[0]
         garbage += filter(os.path.isfile, map((LOCKDIR + "/").__add__,
                                               os.listdir(LOCKDIR)))
-        for f in garbage:
-            os.unlink(f)
+        if False:
+            for f in garbage:
+                os.unlink(f)
 
         # set the initial runlevel
         f = open(RUNDIR + "/utmp", "w")
@@ -390,17 +383,17 @@ class VServer:
                 # execute each init script in turn
                 # XXX - we don't support all scripts that vserver script does
                 self.__do_chcontext(state_file)
-               for cmd in self.INITSCRIPTS + [None]:
-                       try:
-                           # enter vserver context
-                           arg_subst = { 'runlevel': runlevel }
-                           cmd_args = [cmd[0]] + map(lambda x: x % arg_subst,
-                                           cmd[1:])
-                           print >>log, "executing '%s'" % " ".join(cmd_args)
-                           os.spawnvp(os.P_WAIT,cmd[0],*cmd_args)
-                       except:
-                               traceback.print_exc()
-                               os._exit(1)
+                for cmd in self.INITSCRIPTS + [None]:
+                     try:
+                         # enter vserver context
+                         arg_subst = { 'runlevel': runlevel }
+                         cmd_args = [cmd[0]] + map(lambda x: x % arg_subst,
+                                                   cmd[1:])
+                         print >>log, "executing '%s'" % " ".join(cmd_args)
+                         os.spawnvp(os.P_WAIT,cmd[0],*cmd_args)
+                     except:
+                         traceback.print_exc()
+                         os._exit(1)
 
             # we get here due to an exception in the top-level child process
             except Exception, ex:
@@ -419,13 +412,17 @@ class VServer:
 
     def init_disk_info(self):
         cmd = "/usr/sbin/vdu --script --space --inodes --blocksize 1024 --xid %d %s" % (self.ctx, self.dir)
-        (child_stdin, child_stdout, child_stderr) = os.popen3(cmd)
-        child_stdin.close()
-        line = child_stdout.readline()
+        p = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE,
+                             stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+                             close_fds=True)
+        p.stdin.close()
+        line = p.stdout.readline()
         if not line:
-            sys.stderr.write(child_stderr.readline())
-        child_stdout.close()
-        child_stderr.close()
+            sys.stderr.write(p.stderr.read())
+        p.stdout.close()
+        p.stderr.close()
+        ret = p.wait()
+
         (space, inodes) = line.split()
         self.disk_inodes = int(inodes)
         self.disk_blocks = int(space)