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