diff --git a/src/ZEO/start.py b/src/ZEO/start.py index 9a345fcf57e81f9b336f502e7c84761e39d8fdb8..ae24bd8ac72d0dfc5c32992b4753d6d125739e89 100644 --- a/src/ZEO/start.py +++ b/src/ZEO/start.py @@ -86,7 +86,7 @@ """Start the server storage. """ -__version__ = "$Revision: 1.9 $"[11:-2] +__version__ = "$Revision: 1.10 $"[11:-2] import sys, os, getopt, string @@ -149,6 +149,13 @@ def main(argv): -D -- Run in debug mode -U -- Unix-domain socket file to listen on + + -u username or uid number + + The username to run the ZEO server as. You may want to run + the ZEO server as 'nobody' or some other user with limited + resouces. The only works under Unix, and if ZServer is + started by root. -p port -- port to listen on @@ -180,10 +187,12 @@ def main(argv): unix=None prefix='' Z=1 + UID='nobody' for o, v in opts: if o=='-p': port=string.atoi(v) elif o=='-h': host=v elif o=='-U': unix=v + elif o=='-u': UID=v elif o=='-D': debug=1 elif o=='-s': Z=0 @@ -214,6 +223,38 @@ def main(argv): import zdaemon zdaemon.run(sys.argv, '') + + # Try to set uid to "-u" -provided uid. + # Try to set gid to "-u" user's primary group. + # This will only work if this script is run by root. + try: + import pwd + try: + try: UID=string.atoi(UID) + except: pass + gid = None + if type(UID) == type(""): + uid = pwd.getpwnam(UID)[2] + gid = pwd.getpwnam(UID)[3] + elif type(UID) == type(1): + uid = pwd.getpwuid(UID)[2] + gid = pwd.getpwuid(UID)[3] + else: + raise KeyError + try: + if gid is not None: + try: + os.setgid(gid) + except OSError: + pass + os.setuid(uid) + except OSError: + pass + except KeyError: + zLOG.LOG("z2", zLOG.ERROR, ("can't find UID %s" % UID)) + except: + pass + import ZEO.StorageServer, asyncore, zLOG storages={} @@ -232,6 +273,20 @@ def main(argv): import ZODB.FileStorage storages['1']=ZODB.FileStorage.FileStorage(fs) + # Try to set up a signal handler + try: + import signal + def handler(signum, frame, storages=storages, die=signal.SIGTERM): + for storage in storages.values(): + try: storage.close() + finally: pass + if signum==dir: sys.exit(0) + else: sys.exit(1) + + signal.signal(signal.SIGTERM, handler) + signal.signal(signal.SIGHUP, handler) + finally: pass + items=storages.items() items.sort() for kv in items: