small code reorganisation.
authorYves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
Tue, 20 Dec 2011 15:03:38 +0100
changeset 460 bc52ce9ab0c2
parent 459 392960e8be0e
child 461 d02ce497395c
small code reorganisation. allow a unix socket
tweetcast/server-gevent/server_setup.py.tmpl
tweetcast/server-gevent/tweetcast.py
--- 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)