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)