X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=python%2Fvserver.py;h=b621e4c6602eaf7bac11a0c98f5cda5292059e55;hb=da4283f4995283be5020e58eaf7fb02d014a07da;hp=32f27adc0dbadf76fa4ccbdba801fc3fadb43a6f;hpb=e33814b72dc77e690941742fe82920cab9376799;p=util-vserver.git diff --git a/python/vserver.py b/python/vserver.py index 32f27ad..b621e4c 100644 --- a/python/vserver.py +++ b/python/vserver.py @@ -1,6 +1,6 @@ # Copyright 2005 Princeton University -#$Id: vserver.py,v 1.66 2007/07/31 16:31:04 dhozac Exp $ +#$Id: vserver.py,v 1.71 2007/08/02 15:26:42 dhozac Exp $ import errno import fcntl @@ -61,20 +61,30 @@ class VServerConfig: def __init__(self, name, directory): self.name = name self.dir = directory + self.cache = None + if not (os.path.isdir(self.dir) and + os.access(self.dir, os.R_OK | os.W_OK | os.X_OK)): + raise NoSuchVServer, "%s does not exist" % self.dir def get(self, option, default = None): try: - f = open(os.path.join(self.dir, option), "r") - buf = f.readline().rstrip() - f.close() - return buf - except IOError, e: + if self.cache: + return self.cache[option] + else: + f = open(os.path.join(self.dir, option), "r") + buf = f.read().rstrip() + f.close() + return buf + except: if default is not None: return default else: raise KeyError, "Key %s is not set for %s" % (option, self.name) def update(self, option, value): + if self.cache: + return + try: old_umask = os.umask(0022) filename = os.path.join(self.dir, option) @@ -93,14 +103,35 @@ class VServerConfig: raise def unset(self, option): + if self.cache: + return + try: filename = os.path.join(self.dir, option) os.unlink(filename) - os.removedirs(os.path.dirname(filename)) + try: + os.removedirs(os.path.dirname(filename)) + except: + pass return True except: return False + def cache_it(self): + self.cache = {} + def add_to_cache(cache, dirname, fnames): + for file in fnames: + full_name = os.path.join(dirname, file) + if os.path.islink(full_name): + fnames.remove(file) + elif (os.path.isfile(full_name) and + os.access(full_name, os.R_OK)): + f = open(full_name, "r") + cache[full_name.replace(os.path.join(self.dir, ''), + '')] = f.read().rstrip() + f.close() + os.path.walk(self.dir, add_to_cache, self.cache) + class VServer: @@ -220,7 +251,7 @@ class VServer: return None def __do_chroot(self): - + self.config.cache_it() os.chroot(self.dir) os.chdir("/") @@ -424,14 +455,14 @@ 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]: + for cmd in self.INITSCRIPTS: 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) + os.spawnvp(os.P_WAIT,cmd[0],cmd_args) except: traceback.print_exc() os._exit(1)