普通文本  |  95行  |  2.72 KB

#!/usr/bin/env python
#
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import json
import sys
from string import Template


_HTML_TEMPLATE = """<!DOCTYPE html>
<script src="https://www.google.com/jsapi"></script>
<script>
var all_data = $ALL_DATA;
google.load('visualization', '1', {packages:['corechart', 'table']});
google.setOnLoadCallback(drawVisualization);
function drawVisualization() {
  // Apply policy 'l2' by default.
  var default_policy = 'l2';
  document.getElementById(default_policy).style.fontWeight = 'bold';
  turnOn(default_policy);
}

function turnOn(policy) {
  var data = google.visualization.arrayToDataTable(all_data[policy]);
  var charOptions = {
    title: 'DMP Graph (Policy: ' + policy + ')',
    hAxis: {title: 'Timestamp',  titleTextStyle: {color: 'red'}},
    isStacked : true
  };
  var chart = new google.visualization.AreaChart(
      document.getElementById('chart_div'));
  chart.draw(data, charOptions);
  var table = new google.visualization.Table(
      document.getElementById('table_div'));
  table.draw(data);
}

window.onload = function() {
  var ul = document.getElementById('policies');
  for (var i = 0; i < ul.children.length; ++i) {
    var li = ul.children[i];
    li.onclick = function() {
      for (var j = 0; j < ul.children.length; ++j) {
        var my_li = ul.children[j];
        my_li.style.fontWeight = 'normal';
      }
      this.style.fontWeight = 'bold';
      turnOn(this.id);
    }
  }
};
</script>
<style>
#policies li {
  display: inline-block;
  padding: 5px 10px;
}
</style>
Click to change an applied policy.
<ul id="policies">$POLICIES</ul>
<div id="chart_div" style="width: 1024px; height: 640px;"></div>
<div id="table_div" style="width: 1024px; height: 640px;"></div>
"""

def _GenerateGraph(json_data):
  policies = list(json_data['policies'])
  policies = "".join(map(lambda x: '<li id="'+x+'">'+x+'</li>', policies))

  all_data = {}
  for policy in json_data['policies']:
    legends = list(json_data['policies'][policy]['legends'])
    legends = ['second'] + legends[legends.index('FROM_HERE_FOR_TOTAL') + 1:
                                     legends.index('UNTIL_HERE_FOR_TOTAL')]
    data = []
    for snapshot in json_data['policies'][policy]['snapshots']:
      data.append([0] * len(legends))
      for k, v in snapshot.iteritems():
        if k in legends:
          data[-1][legends.index(k)] = v
    all_data[policy] = [legends] + data

  print Template(_HTML_TEMPLATE).safe_substitute(
      {'POLICIES': policies,
       'ALL_DATA': json.dumps(all_data)})


def main(argv):
  _GenerateGraph(json.load(file(argv[1], 'r')))


if __name__ == '__main__':
  sys.exit(main(sys.argv))