195640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org#!/usr/bin/env python 295640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org# Copyright (c) 2012 The Chromium Authors. All rights reserved. 301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# Use of this source code is governed by a BSD-style license that can be 401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# found in the LICENSE file. 501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 66fb6d62a2a05b7a7c268cc4e6bf0452e376e1990joaodasilva@chromium.orgimport json 76fb6d62a2a05b7a7c268cc4e6bf0452e376e1990joaodasilva@chromium.org 85e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.orgfrom textwrap import TextWrapper 901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit.format.policy_templates.writers import template_writer 1001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 1101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 125e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.orgTEMPLATE_HEADER="""\ 135e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org// Policy template for Linux. 145e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org// Uncomment the policies you wish to activate and change their values to 155e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org// something useful for your case. The provided values are for reference only 165e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org// and do not provide meaningful defaults! 175e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org{""" 185e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org 195e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org 205e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.orgHEADER_DELIMETER="""\ 215e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org //-------------------------------------------------------------------------""" 225e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org 235e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org 2401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgdef GetWriter(config): 2501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org '''Factory method for creating JsonWriter objects. 2601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org See the constructor of TemplateWriter for description of 2701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org arguments. 2801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org ''' 2901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org return JsonWriter(['linux'], config) 3001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 3101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 3201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgclass JsonWriter(template_writer.TemplateWriter): 3301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org '''Class for generating policy files in JSON format (for Linux). The 3401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org generated files will define all the supported policies with example values 3501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org set for them. This class is used by PolicyTemplateGenerator to write .json 3601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org files. 3701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org ''' 3801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 3901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org def PreprocessPolicies(self, policy_list): 4001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org return self.FlattenGroupsAndSortPolicies(policy_list) 4101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 4201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org def WritePolicy(self, policy): 436fb6d62a2a05b7a7c268cc4e6bf0452e376e1990joaodasilva@chromium.org if policy['type'] == 'external': 44e9f965b7a19bfc970bec100fb03e6aa269deb522joaodasilva@chromium.org # This type can only be set through cloud policy. 45e9f965b7a19bfc970bec100fb03e6aa269deb522joaodasilva@chromium.org return 466fb6d62a2a05b7a7c268cc4e6bf0452e376e1990joaodasilva@chromium.org example_value_str = json.dumps(policy['example_value'], sort_keys=True) 4701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 485e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org # Add comma to the end of the previous line. 4901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org if not self._first_written: 505e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org self._out[-2] += ',' 5101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 52740badd5e3e44434a9a47b5d16749daac1e8ea80joaodasilva@chromium.org if not self.CanBeMandatory(policy) and self.CanBeRecommended(policy): 53740badd5e3e44434a9a47b5d16749daac1e8ea80joaodasilva@chromium.org line = ' // Note: this policy is supported only in recommended mode.' 54740badd5e3e44434a9a47b5d16749daac1e8ea80joaodasilva@chromium.org self._out.append(line) 55740badd5e3e44434a9a47b5d16749daac1e8ea80joaodasilva@chromium.org line = ' // The JSON file should be placed in %srecommended.' % \ 56740badd5e3e44434a9a47b5d16749daac1e8ea80joaodasilva@chromium.org self.config['linux_policy_path'] 57740badd5e3e44434a9a47b5d16749daac1e8ea80joaodasilva@chromium.org self._out.append(line) 58740badd5e3e44434a9a47b5d16749daac1e8ea80joaodasilva@chromium.org 595e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org line = ' // %s' % policy['caption'] 605e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org self._out.append(line) 615e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org self._out.append(HEADER_DELIMETER) 625e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org description = self._text_wrapper.wrap(policy['desc']) 635e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org self._out += description; 645e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org line = ' //"%s": %s' % (policy['name'], example_value_str) 655e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org self._out.append('') 6601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org self._out.append(line) 675e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org self._out.append('') 6801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 6901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org self._first_written = False 7001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 7101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org def BeginTemplate(self): 725e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org self._out.append(TEMPLATE_HEADER) 7301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 7401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org def EndTemplate(self): 7501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org self._out.append('}') 7601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 7701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org def Init(self): 7801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org self._out = [] 7901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org # The following boolean member is true until the first policy is written. 8001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org self._first_written = True 815e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org # Create the TextWrapper object once. 825e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org self._text_wrapper = TextWrapper( 8395640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org initial_indent = ' // ', 8495640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org subsequent_indent = ' // ', 855e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org break_long_words = False, 865e9a6ad2f89446ead71549c9b528e2a05f0e4338pastarmovj@chromium.org width = 80) 8701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 8801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org def GetTemplateText(self): 8901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org return '\n'.join(self._out) 90