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()
 |