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