+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
+
+
+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:
+ 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)
+ try:
+ os.makedirs(os.path.dirname(filename), 0755)
+ except:
+ pass
+ f = open(filename, 'w')
+ if isinstance(value, list):
+ f.write("%s\n" % "\n".join(value))
+ else:
+ f.write("%s\n" % value)
+ f.close()
+ os.umask(old_umask)
+ except:
+ raise
+
+ def unset(self, option):
+ if self.cache:
+ return
+
+ try:
+ filename = os.path.join(self.dir, option)
+ os.unlink(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)
+