--- a/tweetcast/server-gevent/server_setup.py.tmpl Tue Dec 20 09:57:29 2011 +0100
+++ b/tweetcast/server-gevent/server_setup.py.tmpl Tue Dec 20 15:03:38 2011 +0100
@@ -1,2 +1,5 @@
SQL_CONNECT = 'postgresql://user:pass@hostname/database'
-WEB_PORT = 8888
\ No newline at end of file
+
+#LISTENER can be a couple (<ACCEPT IP>,<SERVER PORT>) or a path to a unix socket. <ACCEPT IP> can be '' to accept all
+LISTENER = ('',8888)
+
--- 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 ['<h1>Not Found</h1>']
+
+ def startserver(listener):
+
+ if isinstance(listener, str):
+ listener = bind_unix_listener(listener)
+
+ WSGIServer(listener, self.webserver).serve_forever()
if __name__ == "__main__":
- Tweetcast(WEB_PORT)
\ No newline at end of file
+ tc = Tweetcast()
+
+ ts.startserver(LISTENER)