115 lines
3.0 KiB
Python
Executable File
115 lines
3.0 KiB
Python
Executable File
#!/usr/bin/python2
|
|
|
|
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
# A local web server that sets up SSH port-forwarding to display the
|
|
# front-panel display of an 8960
|
|
|
|
import BaseHTTPServer
|
|
import subprocess
|
|
import sys
|
|
|
|
import labconfig
|
|
|
|
DOCUMENTATION="""
|
|
This will start up an SSH to port-forward connections to the 8960.
|
|
and then a web server to offer a simple UI to fetch images of the
|
|
8960 front panel display. It will print a localhost URL to visit.
|
|
When you visit that URL, you'll see the front-panel display from
|
|
the instrument. If the image is stale, the display greys out.
|
|
"""
|
|
|
|
PAGE="""
|
|
<html>
|
|
<head>
|
|
</head>
|
|
<script type="text/javascript">
|
|
var port = %(ssh_tunnel_port)s;
|
|
var lastTimestamp = 0;
|
|
function onTimer() {
|
|
var imageSpan = document.getElementById('image_span');
|
|
var newImage = document.createElement('image');
|
|
var tag = new Date().getTime();
|
|
|
|
if (tag - lastTimestamp > 3000) {
|
|
imageSpan.style.opacity=0.3;
|
|
}
|
|
|
|
newImage.src = 'http://localhost:' + port + '/screen.gif?' + tag;
|
|
newImage.onload = function () {
|
|
imageSpan.replaceChild(newImage, imageSpan.children[0]);
|
|
lastTimestamp = tag;
|
|
imageSpan.style.opacity=1;
|
|
}
|
|
t = setTimeout("onTimer()", 1000);
|
|
}
|
|
|
|
setTimeout("onTimer()", 0);
|
|
</script>
|
|
|
|
<body>
|
|
<div>8960 in test cell <strong>%(cell)s</strong></div>
|
|
<span id="image_span">
|
|
<span>
|
|
<!-- Placeholder -->
|
|
8960 screen should go here. <br>
|
|
</span>
|
|
</span>
|
|
</body>
|
|
</html>
|
|
"""
|
|
|
|
|
|
try:
|
|
[cell] = sys.argv[1:]
|
|
except ValueError:
|
|
print 'Usage: %s [cell-name]' % sys.argv[0]
|
|
print DOCUMENTATION
|
|
exit(1)
|
|
|
|
ssh_tunnel_port = 1839
|
|
http_server_port = 8192
|
|
|
|
c = labconfig.Configuration(['--cell=%s' % (cell)])
|
|
|
|
basestation_ip = c.cell['basestations'][0]['bs_addresses'][0]
|
|
bastion_ip = c.cell['perfserver']['address']
|
|
|
|
ssh_forwarding_configuration = 'localhost:%s:%s:80' % (
|
|
ssh_tunnel_port, basestation_ip)
|
|
|
|
|
|
class PopenContext(object):
|
|
def __init__(self, *args, **kwargs):
|
|
self.args = args
|
|
self.kwargs = kwargs
|
|
|
|
def __enter__(self):
|
|
self.process = subprocess.Popen(*self.args, **self.kwargs)
|
|
return self.process
|
|
|
|
def __exit__(self, exception, value, traceback):
|
|
self.process.kill()
|
|
|
|
|
|
class PageHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
|
def do_GET(self):
|
|
self.send_response(200)
|
|
self.end_headers()
|
|
self.wfile.write(PAGE % {'ssh_tunnel_port': ssh_tunnel_port,
|
|
'cell': cell})
|
|
|
|
with PopenContext(
|
|
['/usr/bin/ssh',
|
|
'-N', # Forward ports only
|
|
'-l','root',
|
|
'-L', ssh_forwarding_configuration,
|
|
bastion_ip,]) as ssh:
|
|
|
|
httpd = BaseHTTPServer.HTTPServer(('', http_server_port), PageHandler)
|
|
print DOCUMENTATION
|
|
print 'http://localhost:%s/8960.html' % http_server_port
|
|
httpd.serve_forever()
|