#!/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="""
<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()
