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