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