X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=python%2Fvserver.py;h=e4afacde9e0af47a4a21098264076a4ed87dcaa7;hb=b5324a5c1a77c154114e17c591b79081497f9f01;hp=8aa410e17d691c80feca75205653fae0d7baea32;hpb=8c938b9ba948fdb03ead8d12ec2a968e3ad5f999;p=util-vserver-pl.git diff --git a/python/vserver.py b/python/vserver.py index 8aa410e..e4afacd 100644 --- a/python/vserver.py +++ b/python/vserver.py @@ -129,6 +129,26 @@ class VServerConfig: os.path.walk(self.dir, add_to_cache, self.cache) +def adjust_lim(goal, curr): + gh = goal[0] + gs = goal[1] + gm = goal[2] + soft = curr[0] + hard = curr[1] + if gm != VC_LIM_KEEP: + if gm > soft or gm == resource.RLIM_INFINITY: + soft = gm + if gm > hard or gm == resource.RLIM_INFINITY: + hard = gm + if gs != VC_LIM_KEEP: + if gs > soft or gs == resource.RLIM_INFINITY: + soft = gs + if gh != VC_LIM_KEEP: + if gh > hard or gh == resource.RLIM_INFINITY: + hard = gh + return (soft, hard) + + class VServer: INITSCRIPTS = [('/etc/rc.vinit', 'start'), @@ -181,6 +201,10 @@ class VServer: resource_type = RLIMITS[type] try: vserverimpl.setrlimit(self.ctx, resource_type, hard, soft, min) + if hasattr(resource, 'RLIMIT_' + type): + lim = resource.getrlimit(resource_type) + lim = adjust_lim((hard, soft, min), lim) + resource.setrlimit(resource_type, lim) except OSError, e: self.log("Error: setrlimit(%d, %s, %d, %d, %d): %s" % (self.ctx, type.lower(), hard, soft, min)) @@ -277,7 +301,7 @@ class VServer: try: vserverimpl.unsetdlimit(self.dir, self.ctx) except OSError, e: - self.log("Unexpected error with unsetdlimit for context %d" % self.ctx) + self.log("Unexpected error with unsetdlimit for context %d: %r" % (self.ctx,e)) return if self.vm_running: @@ -297,7 +321,7 @@ class VServer: vserverimpl.DLIMIT_INF, # inode limit 2) # %age reserved for root except OSError, e: - self.log("Unexpected error with setdlimit for context %d" % self.ctx) + self.log("Unexpected error with setdlimit for context %d: %r" % (self.ctx, e)) self.config.update('dlimits/0/space_total', block_limit) @@ -456,7 +480,7 @@ class VServer: self.__do_chroot() removed = self.__cleanvar() - log = open("/var/log/boot.log", "a", 0) + log = open("/var/log/nm", "a", 0) if log.fileno() != 1: os.dup2(log.fileno(), 1) os.dup2(1, 2) @@ -477,6 +501,8 @@ class VServer: if os.path.isfile(cmd[0]): print >>log, "executing '%s'" % " ".join(cmd_args) os.spawnvp(os.P_NOWAIT,cmd[0],cmd_args) + else: + print >>log, "WARNING: could not run %s"%cmd[0] except: print >>log, traceback.format_exc()