diff -r 392960e8be0e -r bc52ce9ab0c2 tweetcast/server-gevent/tweetcast.py --- a/tweetcast/server-gevent/tweetcast.py Tue Dec 20 09:57:29 2011 +0100 +++ b/tweetcast/server-gevent/tweetcast.py Tue Dec 20 15:03:38 2011 +0100 @@ -11,7 +11,11 @@ from gevent.pywsgi import WSGIServer from urlparse import parse_qs import datetime -from server_setup import SQL_CONNECT, WEB_PORT +from server_setup import SQL_CONNECT, LISTENER +import os +import _socket +import pwd +from gevent.server import StreamServer Base = declarative_base() engine = create_engine(SQL_CONNECT) @@ -106,15 +110,47 @@ textids(tweetdict['retweeted_status']) return tweetdict -class Tweetcast(): + +def bind_unix_listener(path, backlog=50, user=None): + pid = os.getpid() + tempname = '%s.%s.tmp' % (path, pid) + backname = '%s.%s.bak' % (path, pid) + unlink(tempname) + unlink(backname) + link(path, backname) + try: + sock = _socket.socket(_socket.AF_UNIX, _socket.SOCK_STREAM) + sock.setblocking(0) + sock.bind(tempname) + try: + if user is not None: + user = pwd.getpwnam(user) + os.chown(tempname, user.pw_uid, user.pw_gid) + os.chmod(tempname, 0600) + sock.listen(backlog) + try: + os.rename(tempname, path) + except: + os.rename(backname, path) + backname = None + raise + tempname = None + return sock + finally: + if tempname is not None: + unlink(tempname) + finally: + if backname is not None: + unlink(backname) + +class Tweetcast(object): - def __init__(self, port): + def __init__(self): print "Starting server" self.data = [] self.lastid = 0L self.session = Session() - self.refresh() - WSGIServer(('', port), self.webserver).serve_forever() + self.refresh() def refresh(self): print "refreshing" @@ -145,6 +181,15 @@ else: start_response('404 Not Found', [('Content-Type', 'text/html')]) return ['