bake_in_configs.py revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)"""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
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and loaded at runtime."""
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import json
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A whitelist of domains that the script will accept when baking configs in to
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Chrome, to ensure incorrect ones are not added accidentally. Subdomains of
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# whitelist entries are also allowed (e.g. maps.google.com, ssl.gstatic.com).
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DOMAIN_WHITELIST = ('2mdn.net', 'admob.com', 'doubleclick.net', 'ggpht.com',
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'google.cn', 'google.co.uk', 'google.com', 'google.com.au',
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'google.de', 'google.fr', 'google.it', 'google.jp',
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'google.org', 'google.ru', 'googleadservices.com',
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'googleapis.com', 'googlesyndication.com',
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'googleusercontent.com', 'googlevideo.com', 'gstatic.com',
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'gvt1.com', 'youtube.com', 'ytimg.com')
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CC_HEADER = """// Copyright (C) 2014 The Chromium Authors. All rights reserved.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AUTOGENERATED FILE. DO NOT EDIT.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (Update configs in components/domain_reliability/baked_in_configs and list
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// configs in components/domain_reliability.gypi instead.)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/domain_reliability/baked_in_configs.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace domain_reliability {
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kBakedInJsonConfigs[] = {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCC_FOOTER = """  NULL
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace domain_reliability
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)"""
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def domain_is_whitelisted(domain):
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return any(domain == e or domain.endswith('.' + e)  for e in DOMAIN_WHITELIST)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def quote_and_wrap_text(text, width=79, prefix='  "', suffix='"'):
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  max_length = width - len(prefix) - len(suffix)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output = prefix
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  line_length = 0
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for c in text:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if c == "\"":
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = "\\\""
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elif c == "\n":
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = "\\n"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elif c == "\\":
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = "\\\\"
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if line_length + len(c) > max_length:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output += suffix + "\n" + prefix
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      line_length = 0
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    output += c
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line_length += len(c)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output += suffix
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return output
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def main():
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if len(sys.argv) < 3:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print >> sys.stderr, ('Usage: %s <JSON files...> <output C++ file>' %
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          sys.argv[0])
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print >> sys.stderr, sys.modules[__name__].__doc__
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cpp_code = CC_HEADER
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  found_invalid_config = False
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for json_file in sys.argv[1:-1]:
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    with open(json_file, 'r') as f:
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      json_text = f.read()
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    config = json.loads(json_text)
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if 'monitored_domain' not in config:
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      print >> sys.stderr, ('%s: no monitored_domain found' % json_file)
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      found_invalid_config = True
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      continue
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    domain = config['monitored_domain']
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not domain_is_whitelisted(domain):
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print >> sys.stderr, ('%s: monitored_domain "%s" not in whitelist' %
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            (json_file, domain))
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_invalid_config = True
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      continue
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    cpp_code += "  // " + json_file + ":\n"
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cpp_code += quote_and_wrap_text(json_text) + ",\n"
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cpp_code += "\n"
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cpp_code += CC_FOOTER
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if found_invalid_config:
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return 1
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  with open(sys.argv[-1], 'wb') as f:
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    f.write(cpp_code)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return 0
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sys.exit(main())
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)