diff --git a/bin/nova-spicehtml5proxy b/bin/nova-spicehtml5proxy
new file mode 100755
index 000000000000..b1882bbea60d
--- /dev/null
+++ b/bin/nova-spicehtml5proxy
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright (c) 2012 OpenStack, LLC.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+'''
+Websocket proxy that is compatible with OpenStack Nova
+SPICE HTML5 consoles. Leverages websockify.py by Joel Martin
+'''
+
+import os
+import sys
+
+from nova import config
+from nova.console import websocketproxy as ws
+from nova.openstack.common import cfg
+
+
+opts = [
+ cfg.BoolOpt('record',
+ default=False,
+ help='Record sessions to FILE.[session_number]'),
+ cfg.BoolOpt('daemon',
+ default=False,
+ help='Become a daemon (background process)'),
+ cfg.BoolOpt('ssl_only',
+ default=False,
+ help='Disallow non-encrypted connections'),
+ cfg.BoolOpt('source_is_ipv6',
+ default=False,
+ help='Source is ipv6'),
+ cfg.StrOpt('cert',
+ default='self.pem',
+ help='SSL certificate file'),
+ cfg.StrOpt('key',
+ default=None,
+ help='SSL key file (if separate from cert)'),
+ cfg.StrOpt('web',
+ default='/usr/share/spice-html5',
+ help='Run webserver on same port. Serve files from DIR.'),
+ cfg.StrOpt('spicehtml5proxy_host',
+ default='0.0.0.0',
+ help='Host on which to listen for incoming requests'),
+ cfg.IntOpt('spicehtml5proxy_port',
+ default=6082,
+ help='Port on which to listen for incoming requests'),
+ ]
+
+CONF = cfg.CONF
+CONF.register_cli_opts(opts)
+
+
+if __name__ == '__main__':
+ if CONF.ssl_only and not os.path.exists(CONF.cert):
+ parser.error("SSL only and %s not found" % CONF.cert)
+
+ # Setup flags
+ config.parse_args(sys.argv)
+
+ # Check to see if spice html/js/css files are present
+ if not os.path.exists(CONF.web):
+ print "Can not find spice html/js/css files at %s." % CONF.web
+ sys.exit(-1)
+
+ # Create and start the NovaWebSockets proxy
+ server = ws.NovaWebSocketProxy(listen_host=CONF.spicehtml5proxy_host,
+ listen_port=CONF.spicehtml5proxy_port,
+ source_is_ipv6=CONF.source_is_ipv6,
+ verbose=CONF.verbose,
+ cert=CONF.cert,
+ key=CONF.key,
+ ssl_only=CONF.ssl_only,
+ daemon=CONF.daemon,
+ record=CONF.record,
+ web=CONF.web,
+ target_host='ignore',
+ target_port='ignore',
+ wrap_mode='exit',
+ wrap_cmd=None)
+ server.start_server()
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 804080e79d2f..0bdaeb08e5e0 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -145,6 +145,8 @@ man_pages = [
[u'OpenStack'], 1),
('man/nova-novncproxy', 'nova-novncproxy', u'Cloud controller fabric',
[u'OpenStack'], 1),
+ ('man/nova-spicehtml5proxy', 'nova-spicehtml5proxy', u'Cloud controller fabric',
+ [u'OpenStack'], 1),
('man/nova-objectstore', 'nova-objectstore', u'Cloud controller fabric',
[u'OpenStack'], 1),
('man/nova-rootwrap', 'nova-rootwrap', u'Cloud controller fabric',
diff --git a/doc/source/man/nova-spicehtml5proxy.rst b/doc/source/man/nova-spicehtml5proxy.rst
new file mode 100644
index 000000000000..4d0aaa202d93
--- /dev/null
+++ b/doc/source/man/nova-spicehtml5proxy.rst
@@ -0,0 +1,48 @@
+====================
+nova-spicehtml5proxy
+====================
+
+--------------------------------------------------------
+Websocket Proxy for OpenStack Nova SPICE HTML5 consoles.
+--------------------------------------------------------
+
+:Author: openstack@lists.launchpad.net
+:Date: 2012-09-27
+:Copyright: OpenStack LLC
+:Version: 2012.1
+:Manual section: 1
+:Manual group: cloud computing
+
+SYNOPSIS
+========
+
+ nova-spicehtml5proxy [options]
+
+DESCRIPTION
+===========
+
+Websocket proxy that is compatible with OpenStack Nova
+SPICE HTML5 consoles.
+
+OPTIONS
+=======
+
+ **General options**
+
+FILES
+========
+
+* /etc/nova/nova.conf
+* /etc/nova/policy.json
+* /etc/nova/rootwrap.conf
+* /etc/nova/rootwrap.d/
+
+SEE ALSO
+========
+
+* `OpenStack Nova `__
+
+BUGS
+====
+
+* Nova is sourced in Launchpad so you can view current bugs at `OpenStack Nova `__
diff --git a/setup.py b/setup.py
index 12de5c4d6816..78c9062c24a5 100644
--- a/setup.py
+++ b/setup.py
@@ -66,6 +66,7 @@ setuptools.setup(name='nova',
'bin/nova-objectstore',
'bin/nova-rootwrap',
'bin/nova-scheduler',
+ 'bin/nova-spicehtml5proxy',
'bin/nova-xvpvncproxy',
],
py_modules=[])