Guest User

Untitled

a guest
Jul 16th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.69 KB | None | 0 0
  1. import logging
  2. import os
  3.  
  4. from eventlet import wsgi, api
  5. from paste import urlmap
  6. from paste.fileapp import DirectoryApp
  7. from rtjpprotocol import RTJPFrame
  8.  
  9. from csp.eventlet import Listener
  10.  
  11. class DebugLogger(object):
  12.  
  13. def __init__(self):
  14. self.log = logging.getLogger(__name__)
  15. self.log.addHandler(logging.StreamHandler())
  16. self.write = self.log.debug
  17.  
  18. # this is very nearly the hookbox server - thanks, mcarter
  19. class WSGICSPServer(object):
  20.  
  21. def __init__(self, interface, port):
  22. self.interface = interface
  23. self.port = port
  24.  
  25. self.app = urlmap.URLMap()
  26. self.controllers = []
  27.  
  28. def run(self):
  29. api.spawn(wsgi.server,
  30. api.tcp_listener((self.interface, self.port)),
  31. self.app, log=DebugLogger())
  32. for app, controller in self.controllers:
  33. api.spawn(self._run_app, app, controller)
  34.  
  35. def __call__(self, environ, start_response):
  36. return self.app(environ, start_response)
  37.  
  38. def _add_app(self, prefix, app):
  39. self.app[prefix] = app
  40.  
  41. def add_wsgi_app(self, prefix, app):
  42. self._add_app(prefix, app)
  43.  
  44. def add_csp_app(self, prefix, csp_controller):
  45. app = Listener()
  46. self._add_app(prefix, app)
  47. self.controllers.append((app, csp_controller))
  48.  
  49. def _run_app(self, app, csp_controller):
  50. while True:
  51. try:
  52. sock, addr_info = p.accept()
  53. csp_controller(sock)
  54. except:
  55. raise
  56. break
  57.  
  58. class Announcer(object):
  59.  
  60. def __init__(self, sock):
  61. self.sock = sock
  62. self._frame_id = 1
  63. api.spawn(self._announce_start)
  64. def send_data(self, data):
  65. data = dict(announcement=data)
  66. frame = RTJPFrame(self._frame_id, 'data', data)
  67. self._frame_id += 1
  68. self.sock.send(frame.as_json())
  69.  
  70. def _announce_start(self):
  71. self.send_data("now announcing<br/>")
  72. n = 1
  73. while True:
  74. self._make_announcement(n)
  75. api.sleep(3)
  76. n += 1
  77.  
  78. def _make_announcement(self, n):
  79. announcement = 'announcement: %s' % n
  80. print "sending: %r" % announcement
  81. self.send_data(announcement)
  82.  
  83. class AnnounceServer(WSGICSPServer):
  84.  
  85. def __init__(self, *args, **kwargs):
  86. super(AnnounceServer, self).__init__(*args, **kwargs)
  87.  
  88. self.add_csp_app('/csp', Announcer)
  89. self.add_wsgi_app('/static', DirectoryApp('static'))
  90.  
  91. if __name__ == "__main__":
  92. server = AnnounceServer('0.0.0.0', 8989)
  93. server.run()
  94. while True:
  95. try:
  96. api.sleep(10)
  97. except KeyboardInterrupt:
  98. print "Ctr+C pressed; Exiting."
  99. break
Add Comment
Please, Sign In to add comment