bake_in_configs.py revision 0de6073388f4e2780db8536178b129cd8f6ab386
10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#!/usr/bin/env python
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# Copyright 2014 The Chromium Authors. All rights reserved.
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# Use of this source code is governed by a BSD-style license that can be
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# found in the LICENSE file.
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch"""Takes the JSON files in components/domain_reliability/baked_in_configs and
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochencodes their contents as an array of C strings that gets compiled in to Chrome
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochand loaded at runtime."""
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport json
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport os
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport sys
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# A whitelist of domains that the script will accept when baking configs in to
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# Chrome, to ensure incorrect ones are not added accidentally. Subdomains of
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# whitelist entries are also allowed (e.g. maps.google.com, ssl.gstatic.com).
200529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochDOMAIN_WHITELIST = ('google.com', 'gstatic.com', 'youtube.com')
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
230529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochCC_HEADER = """// Copyright (C) 2014 The Chromium Authors. All rights reserved.
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// AUTOGENERATED FILE. DO NOT EDIT.
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch//
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// (Update configs in components/domain_reliability/baked_in_configs and list
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// configs in components/domain_reliability.gypi instead.)
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/domain_reliability/baked_in_configs.h"
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <stdlib.h>
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace domain_reliability {
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char* const kBakedInJsonConfigs[] = {
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch"""
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
420529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochCC_FOOTER = """  NULL
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace domain_reliability
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch"""
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochdef domain_is_whitelisted(domain):
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return any(domain == e or domain.endswith('.' + e)  for e in DOMAIN_WHITELIST)
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochdef quote_and_wrap_text(text, width=79, prefix='  "', suffix='"'):
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  max_length = width - len(prefix) - len(suffix)
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  output = prefix
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  line_length = 0
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for c in text:
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if c == "\"":
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      c = "\\\""
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    elif c == "\n":
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      c = "\\n"
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    elif c == "\\":
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      c = "\\\\"
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if line_length + len(c) > max_length:
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      output += suffix + "\n" + prefix
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      line_length = 0
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    output += c
680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    line_length += len(c)
690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  output += suffix
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return output
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochdef main():
740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if len(sys.argv) < 3:
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    print >> sys.stderr, ('Usage: %s <JSON files...> <output C++ file>' %
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                          sys.argv[0])
770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    print >> sys.stderr, sys.modules[__name__].__doc__
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return 1
790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  cpp_code = CC_HEADER
810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for json_file in sys.argv[1:-1]:
820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    with open(json_file, 'r') as f:
830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      json_text = f.read()
840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    config = json.loads(json_text)
850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if 'monitored_domain' not in config:
860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      print >> sys.stderr ('%s: no monitored_domain found' % json_file)
870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return 1
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    domain = config['monitored_domain']
890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if not domain_is_whitelisted(domain):
900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      print >> sys.stderr ('%s: monitored_domain "%s" not in whitelist' %
910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           (json_file, domain))
920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return 1
930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    cpp_code += "  // " + json_file + ":\n"
940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    cpp_code += quote_and_wrap_text(json_text) + ",\n"
950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    cpp_code += "\n"
960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  cpp_code += CC_FOOTER
970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
980de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  with open(sys.argv[-1], 'wb') as f:
990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    f.write(cpp_code)
1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return 0
1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochif __name__ == '__main__':
1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  sys.exit(main())
106