Source code for playback

# -*- coding: utf-8 -*-
#
#       Copyright 2011 Liftoff Software Corporation
#

__doc__ = """\
playback.py - A plugin for Gate One that adds support for saving and playing
back session recordings.

.. note:: Yes this only contains one function and it is exposed to clients through a WebSocket hook.

Hooks
-----
This Python plugin file implements the following hooks::

    hooks = {
        'WebSocket': {
            'playback_save_recording': save_recording,
        }
    }

Docstrings
----------
"""

# Meta
__version__ = '1.0'
__license__ = "GNU AGPLv3 or Proprietary (see LICENSE.txt)"
__version_info__ = (1, 0)
__author__ = 'Dan McDougall <daniel.mcdougall@liftoffsoftware.com>'

# Python stdlib
import os
from utils import get_translation, json_encode

_ = get_translation()

# Globals
plugin_path = os.path.split(__file__)[0]

[docs]def save_recording(settings, tws): """ Handles uploads of session recordings and returns them to the client in a self-contained HTML file that will auto-start playback. NOTE: The real crux of the code that handles this is in the template. """ import tornado.template from gateone import COLORS_256 from datetime import datetime now = datetime.now().strftime('%Y%m%d%H%m%S') # e.g. '20120208200222' out_dict = { 'result': 'Success', 'filename': 'GateOne_recording-%s.html' % now, 'data': None, 'mimetype': 'text/html' } recording = settings["recording"] container = settings["container"] prefix = settings["prefix"] theme = settings["theme"] colors = settings["colors"] gateone_dir = tws.settings['gateone_dir'] plugins_path = os.path.join(gateone_dir, 'plugins') #playback_plugin_path = os.path.join(plugins_path, 'playback') template_path = os.path.join(gateone_dir, 'templates') colors_templates_path = os.path.join(template_path, 'term_colors') colors_css_path = os.path.join(colors_templates_path, '%s.css' % colors) with open(colors_css_path) as f: colors_file = f.read() themes_templates_path = os.path.join(template_path, 'themes') theme_css_path = os.path.join(themes_templates_path, '%s.css' % theme) with open(theme_css_path) as f: theme_file = f.read() colors = tornado.template.Template(colors_file) rendered_colors = colors.generate(container=container, prefix=prefix) theme = tornado.template.Template(theme_file) # Setup our 256-color support CSS: colors_256 = "" for i in xrange(256): fg = "#%s span.fx%s {color: #%s;}" % ( container, i, COLORS_256[i]) bg = "#%s span.bx%s {background-color: #%s;} " % ( container, i, COLORS_256[i]) colors_256 += "%s %s" % (fg, bg) colors_256 += "\n" rendered_theme = theme.generate( container=container, prefix=prefix, colors_256=colors_256, url_prefix=tws.settings['url_prefix'] ) templates_path = os.path.join(plugin_path, "templates") recording_template_path = os.path.join( templates_path, "self_contained_recording.html") with open(recording_template_path) as f: recording_template_data = f.read() recording_template = tornado.template.Template(recording_template_data) rendered_recording = recording_template.generate( recording=recording, container=container, prefix=prefix, theme=rendered_theme, colors=rendered_colors ) out_dict['data'] = rendered_recording message = {'save_file': out_dict} tws.write_message(message)
hooks = { 'WebSocket': { 'playback_save_recording': save_recording, } }