summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJimmy Bergman <jimmy@sigint.se>2011-06-23 13:34:01 +0200
committerJimmy Bergman <jimmy@sigint.se>2011-06-23 13:34:01 +0200
commit3d1c8463d80932ddbe677ea1b8aee357642018a8 (patch)
tree15948de511002332e24128573db7b09f0b1b52ba
parent51c20f6f85d76bc14f394221a8836d2aac9a1aea (diff)
downloadnova-3d1c8463d80932ddbe677ea1b8aee357642018a8.tar.gz
nova-3d1c8463d80932ddbe677ea1b8aee357642018a8.tar.xz
nova-3d1c8463d80932ddbe677ea1b8aee357642018a8.zip
Change so that the flash socket policy server is using eventlet instead of twisted and is running in the same process as the main vnx proxy
-rwxr-xr-xbin/nova-vncproxy32
-rw-r--r--nova/wsgi.py18
2 files changed, 31 insertions, 19 deletions
diff --git a/bin/nova-vncproxy b/bin/nova-vncproxy
index 467d1eba3..60e01e7f8 100755
--- a/bin/nova-vncproxy
+++ b/bin/nova-vncproxy
@@ -39,8 +39,6 @@ from nova import wsgi
from nova import version
from nova.vnc import auth
from nova.vnc import proxy
-from twisted.internet import protocol, reactor
-from twisted.protocols import basic
LOG = logging.getLogger('nova.vnc-proxy')
@@ -64,16 +62,16 @@ flags.DEFINE_flag(flags.HelpFlag())
flags.DEFINE_flag(flags.HelpshortFlag())
flags.DEFINE_flag(flags.HelpXMLFlag())
-class FlashSocketPolicyProtocol(basic.LineReceiver):
- delimiter = "\0"
+def handle_flash_socket_policy(socket):
+ LOG.info(_("Received connection on flash socket policy port"))
- def lineReceived(self, request):
- if '<policy-file-request/>' in request:
- self.transport.write('<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="%d" /></cross-domain-policy>' % (FLAGS.vncproxy_port))
- self.transport.loseConnection()
-
-class FlashSocketPolicyFactory(protocol.ServerFactory):
- protocol = FlashSocketPolicyProtocol
+ fd = socket.makefile('rw')
+ expected_command = "<policy-file-request/>"
+ if expected_command in fd.read(len(expected_command)+1):
+ LOG.info(_("Received valid flash socket policy request"))
+ fd.write('<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="%d" /></cross-domain-policy>' % (FLAGS.vncproxy_port))
+ fd.flush()
+ socket.close()
if __name__ == "__main__":
utils.default_flagfile()
@@ -108,11 +106,7 @@ if __name__ == "__main__":
service.serve()
- flash_socket_policy_pid = os.fork()
- if flash_socket_policy_pid == 0:
- reactor.listenTCP(843, FlashSocketPolicyFactory())
- reactor.run()
- else:
- server = wsgi.Server()
- server.start(with_auth, FLAGS.vncproxy_port, host=FLAGS.vncproxy_host)
- server.wait()
+ server = wsgi.Server()
+ server.start(with_auth, FLAGS.vncproxy_port, host=FLAGS.vncproxy_host)
+ server.start_tcp(handle_flash_socket_policy, 843, host=FLAGS.vncproxy_host)
+ server.wait()
diff --git a/nova/wsgi.py b/nova/wsgi.py
index 33ba852bc..700142f42 100644
--- a/nova/wsgi.py
+++ b/nova/wsgi.py
@@ -70,6 +70,15 @@ class Server(object):
if key:
self.socket_info[key] = socket.getsockname()
+ def start_tcp(self, listener, port, host='0.0.0.0', key=None, backlog=128):
+ """Run a raw TCP server with the given application."""
+ arg0 = sys.argv[0]
+ logging.audit(_('Starting TCP server %(arg0)s on %(host)s:%(port)s') % locals())
+ socket = eventlet.listen((host, port), backlog=backlog)
+ self.pool.spawn_n(self._run_tcp, listener, socket)
+ if key:
+ self.socket_info[key] = socket.getsockname()
+
def wait(self):
"""Wait until all servers have completed running."""
try:
@@ -83,6 +92,15 @@ class Server(object):
eventlet.wsgi.server(socket, application, custom_pool=self.pool,
log=WritableLogger(logger))
+ def _run_tcp(self, listener, socket):
+ """Start a raw TCP server in a new green thread."""
+ while True:
+ try:
+ new_sock, address = socket.accept()
+ self.pool.spawn_n(listener, new_sock)
+ except (SystemExit, KeyboardInterrupt):
+ pass
+
class Request(webob.Request):
pass