diff --git a/README.rst b/README.rst index a48bdcb..5d5e0d6 100644 --- a/README.rst +++ b/README.rst @@ -110,6 +110,7 @@ Nginx configuration # Finally, send all non-media requests to the Pyramid server. location / { + proxy_buffering off uwsgi_pass zimit_upstream; include /var/ideascube/uwsgi_params; } diff --git a/named.py b/named.py new file mode 100644 index 0000000..a5e4bc3 --- /dev/null +++ b/named.py @@ -0,0 +1,13 @@ +import os +import shlex +import subprocess + + +def spawn(cmd): + os.mkfifo("toto") + with open("toto", "w") as f: + process = subprocess.Popen(shlex.split(cmd), stdout=f) + process.wait() + os.unlink("toto") + +spawn("stdbuf -o0 python test.py") diff --git a/readpipe.py b/readpipe.py new file mode 100644 index 0000000..cf30353 --- /dev/null +++ b/readpipe.py @@ -0,0 +1,11 @@ +from __future__ import print_function +import os +import os.path + + +def read_fifo(filename): + with open(filename) as fifo: + while os.path.exists(filename): + print(fifo.readline(), end='') + +read_fifo("toto") diff --git a/test.py b/test.py new file mode 100644 index 0000000..fb7d929 --- /dev/null +++ b/test.py @@ -0,0 +1,6 @@ +#! /use/bin/python +import time + +for i in range(100): + time.sleep(0.2) + print i diff --git a/zimit.ini b/zimit.ini index 5e0089a..44028b1 100644 --- a/zimit.ini +++ b/zimit.ini @@ -14,9 +14,11 @@ pyramid.includes = pyramid_mailer [server:main] -use = egg:waitress#main +use = egg:gunicorn#main host = 0.0.0.0 port = 6543 +send_bytes=1 +worker_class = socketio.sgunicorn.GeventSocketIOWorker # Begin logging configuration diff --git a/zimit/utils.py b/zimit/utils.py index 0b9f39d..2e765c6 100644 --- a/zimit/utils.py +++ b/zimit/utils.py @@ -1,4 +1,5 @@ import os +import os.path import shlex import subprocess @@ -13,3 +14,9 @@ def ensure_paths_exists(*paths): if not os.path.exists(path): msg = '%s does not exist.' % path raise OSError(msg) + + +def read_fifo(filename): + with open(filename) as fifo: + while os.path.exists(filename): + yield fifo.readline() diff --git a/zimit/views.py b/zimit/views.py index 06e0655..ee93ad0 100644 --- a/zimit/views.py +++ b/zimit/views.py @@ -1,8 +1,12 @@ from cornice import Service from colander import MappingSchema, SchemaNode, String +from pyramid.response import Response + +from zimit import utils -webpage = Service(name='website', path='/website') home = Service(name='home', path='/') +webpage = Service(name='website', path='/website') +logs = Service(name='home', path='/logs') @home.get() @@ -34,4 +38,18 @@ def crawl_new_website(request): request.validated, timeout=1800) request.response.status_code = 201 - return {'success': True} + return { + 'success': True + } + + +@logs.get() +def get_logs(request): + stream_headers = [ + ('Content-Type', 'text/event-stream'), + ('Cache-Control', 'no-cache') + ] + return Response( + headerlist=stream_headers, + app_iter=utils.read_fifo("toto") + ) diff --git a/zimit/websocket.py b/zimit/websocket.py new file mode 100644 index 0000000..a53fcf2 --- /dev/null +++ b/zimit/websocket.py @@ -0,0 +1,12 @@ +from socketio import namespace, socketio_manage + + +class LogsNamespace(namespace.BaseNamespace): + def on_read(self, filename): + self.emit('chat', "yeah") + + +def socketio_service(request): + socketio_manage(request.environ, {'/logs': LogsNamespace}, + request) + return "out"