#!/usr/bin/python
# 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="""
8960 in test cell %(cell)s
8960 screen should go here.
"""
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()