Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(377)

Side by Side Diff: tools/grit/grit/format/policy_templates/writers/adm_writer.py

Issue 6327011: Allow ADM(X) templates to manage both MACHINE and USER policies (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: tweaks Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 5
6 from grit.format.policy_templates.writers import template_writer 6 from grit.format.policy_templates.writers import template_writer
7 7
8 8
9 NEWLINE = '\r\n'
10
11
9 def GetWriter(config): 12 def GetWriter(config):
10 '''Factory method for creating AdmWriter objects. 13 '''Factory method for creating AdmWriter objects.
11 See the constructor of TemplateWriter for description of 14 See the constructor of TemplateWriter for description of
12 arguments. 15 arguments.
13 ''' 16 '''
14 return AdmWriter(['win'], config) 17 return AdmWriter(['win'], config)
15 18
16 19
17 class AdmWriter(template_writer.TemplateWriter): 20 class IndentedStringBuilder:
18 '''Class for generating policy templates in Windows ADM format. 21 '''Utility class for building text with indented lines.'''
19 It is used by PolicyTemplateGenerator to write ADM files.
20 '''
21 22
22 TYPE_TO_INPUT = { 23 def __init__(self):
23 'string': 'EDITTEXT', 24 self.lines = []
24 'int': 'NUMERIC', 25 self.indent = ''
25 'string-enum': 'DROPDOWNLIST',
26 'int-enum': 'DROPDOWNLIST',
27 'list': 'LISTBOX'}
28 NEWLINE = '\r\n'
29 26
30 def _AddGuiString(self, name, value): 27 def AddLine(self, string='', indent_diff=0):
31 # Escape newlines in the value. 28 '''Appends a string with indentation and a linebreak to |self.lines|.
32 value = value.replace('\n', '\\n')
33 line = '%s="%s"' % (name, value)
34 self.str_list.append(line)
35
36 def _PrintLine(self, string='', indent_diff=0):
37 '''Prints a string with indents and a linebreak to the output.
38 29
39 Args: 30 Args:
40 string: The string to print. 31 string: The string to print.
41 indent_diff: the difference of indentation of the printed line, 32 indent_diff: the difference of indentation of the printed line,
42 compared to the next/previous printed line. Increment occurs 33 compared to the next/previous printed line. Increment occurs
43 after printing the line, while decrement occurs before that. 34 after printing the line, while decrement occurs before that.
44 ''' 35 '''
45 indent_diff *= 2 36 indent_diff *= 2
46 if indent_diff < 0: 37 if indent_diff < 0:
47 self.indent = self.indent[(-indent_diff):] 38 self.indent = self.indent[(-indent_diff):]
48 if string != '': 39 if string != '':
49 self.policy_list.append(self.indent + string) 40 self.lines.append(self.indent + string)
50 else: 41 else:
51 self.policy_list.append('') 42 self.lines.append('')
52 if indent_diff > 0: 43 if indent_diff > 0:
53 self.indent += ''.ljust(indent_diff) 44 self.indent += ''.ljust(indent_diff)
54 45
46 def AddLines(self, other):
47 '''Appends the content of another |IndentedStringBuilder| to |self.lines|.
48 Indentation of the added lines will be the sum of |self.indent| and
49 their original indentation.
50
51 Args:
52 other: The buffer from which lines are copied.
53 '''
54 for line in other.lines:
55 self.AddLine(line)
56
57 def ToString(self):
58 '''Returns |self.lines| as text string.'''
59 return NEWLINE.join(self.lines)
60
61
62 class AdmWriter(template_writer.TemplateWriter):
63 '''Class for generating policy templates in Windows ADM format.
64 It is used by PolicyTemplateGenerator to write ADM files.
65 '''
66
67 TYPE_TO_INPUT = {
68 'string': 'EDITTEXT',
69 'int': 'NUMERIC',
70 'string-enum': 'DROPDOWNLIST',
71 'int-enum': 'DROPDOWNLIST',
72 'list': 'LISTBOX'
73 }
74
75 def _AddGuiString(self, name, value):
76 # Escape newlines in the value.
77 value = value.replace('\n', '\\n')
78 line = '%s="%s"' % (name, value)
79 self.strings.AddLine(line)
80
55 def _WriteSupported(self): 81 def _WriteSupported(self):
56 self._PrintLine('#if version >= 4', 1) 82 self.policies.AddLine('#if version >= 4', 1)
57 self._PrintLine('SUPPORTED !!SUPPORTED_WINXPSP2') 83 self.policies.AddLine('SUPPORTED !!SUPPORTED_WINXPSP2')
58 self._PrintLine('#endif', -1) 84 self.policies.AddLine('#endif', -1)
59 85
60 def _WritePart(self, policy): 86 def _WritePart(self, policy):
61 '''Writes the PART ... END PART section of a policy. 87 '''Writes the PART ... END PART section of a policy.
62 88
63 Args: 89 Args:
64 policy: The policy to write to the output. 90 policy: The policy to write to the output.
65 ''' 91 '''
66 policy_part_name = policy['name'] + '_Part' 92 policy_part_name = policy['name'] + '_Part'
67 self._AddGuiString(policy_part_name, policy['label']) 93 self._AddGuiString(policy_part_name, policy['label'])
68 94
69 # Print the PART ... END PART section: 95 # Print the PART ... END PART section:
70 self._PrintLine() 96 self.policies.AddLine()
71 adm_type = self.TYPE_TO_INPUT[policy['type']] 97 adm_type = self.TYPE_TO_INPUT[policy['type']]
72 self._PrintLine('PART !!%s %s' % (policy_part_name, adm_type), 1) 98 self.policies.AddLine('PART !!%s %s' % (policy_part_name, adm_type), 1)
73 if policy['type'] == 'list': 99 if policy['type'] == 'list':
74 # Note that the following line causes FullArmor ADMX Migrator to create 100 # Note that the following line causes FullArmor ADMX Migrator to create
75 # corrupt ADMX files. Please use admx_writer to get ADMX files. 101 # corrupt ADMX files. Please use admx_writer to get ADMX files.
76 self._PrintLine('KEYNAME "%s\\%s"' % 102 self.policies.AddLine('KEYNAME "%s\\%s"' %
77 (self.config['win_reg_key_name'], policy['name'])) 103 (self.config['win_reg_key_name'], policy['name']))
78 self._PrintLine('VALUEPREFIX ""') 104 self.policies.AddLine('VALUEPREFIX ""')
79 else: 105 else:
80 self._PrintLine('VALUENAME "%s"' % policy['name']) 106 self.policies.AddLine('VALUENAME "%s"' % policy['name'])
81 if policy['type'] in ('int-enum', 'string-enum'): 107 if policy['type'] in ('int-enum', 'string-enum'):
82 self._PrintLine('ITEMLIST', 1) 108 self.policies.AddLine('ITEMLIST', 1)
83 for item in policy['items']: 109 for item in policy['items']:
84 if policy['type'] == 'int-enum': 110 if policy['type'] == 'int-enum':
85 value_text = 'NUMERIC ' + str(item['value']) 111 value_text = 'NUMERIC ' + str(item['value'])
86 else: 112 else:
87 value_text = '"' + item['value'] + '"' 113 value_text = '"' + item['value'] + '"'
88 self._PrintLine('NAME !!%s_DropDown VALUE %s' % 114 self.policies.AddLine('NAME !!%s_DropDown VALUE %s' %
89 (item['name'], value_text)) 115 (item['name'], value_text))
90 self._AddGuiString(item['name'] + '_DropDown', item['caption']) 116 self._AddGuiString(item['name'] + '_DropDown', item['caption'])
91 self._PrintLine('END ITEMLIST', -1) 117 self.policies.AddLine('END ITEMLIST', -1)
92 self._PrintLine('END PART', -1) 118 self.policies.AddLine('END PART', -1)
93 119
94 def WritePolicy(self, policy): 120 def WritePolicy(self, policy):
95 self._AddGuiString(policy['name'] + '_Policy', policy['caption']) 121 self._AddGuiString(policy['name'] + '_Policy', policy['caption'])
96 self._PrintLine('POLICY !!%s_Policy' % policy['name'], 1) 122 self.policies.AddLine('POLICY !!%s_Policy' % policy['name'], 1)
97 self._WriteSupported() 123 self._WriteSupported()
98 policy_explain_name = policy['name'] + '_Explain' 124 policy_explain_name = policy['name'] + '_Explain'
99 self._AddGuiString(policy_explain_name, policy['desc']) 125 self._AddGuiString(policy_explain_name, policy['desc'])
100 self._PrintLine('EXPLAIN !!' + policy_explain_name) 126 self.policies.AddLine('EXPLAIN !!' + policy_explain_name)
101 127
102 if policy['type'] == 'main': 128 if policy['type'] == 'main':
103 self._PrintLine('VALUENAME "%s"' % policy['name']) 129 self.policies.AddLine('VALUENAME "%s"' % policy['name'])
104 self._PrintLine('VALUEON NUMERIC 1') 130 self.policies.AddLine('VALUEON NUMERIC 1')
105 self._PrintLine('VALUEOFF NUMERIC 0') 131 self.policies.AddLine('VALUEOFF NUMERIC 0')
106 else: 132 else:
107 self._WritePart(policy) 133 self._WritePart(policy)
108 134
109 self._PrintLine('END POLICY', -1) 135 self.policies.AddLine('END POLICY', -1)
110 self._PrintLine() 136 self.policies.AddLine()
111 137
112 def BeginPolicyGroup(self, group): 138 def BeginPolicyGroup(self, group):
113 self._open_category = len(group['policies']) > 1 139 self._open_category = len(group['policies']) > 1
114 # Open a category for the policies if there is more than one in the 140 # Open a category for the policies if there is more than one in the
115 # group. 141 # group.
116 if self._open_category: 142 if self._open_category:
117 category_name = group['name'] + '_Category' 143 category_name = group['name'] + '_Category'
118 self._AddGuiString(category_name, group['caption']) 144 self._AddGuiString(category_name, group['caption'])
119 self._PrintLine('CATEGORY !!' + category_name, 1) 145 self.policies.AddLine('CATEGORY !!' + category_name, 1)
120 146
121 def EndPolicyGroup(self): 147 def EndPolicyGroup(self):
122 if self._open_category: 148 if self._open_category:
123 self._PrintLine('END CATEGORY', -1) 149 self.policies.AddLine('END CATEGORY', -1)
150 self.policies.AddLine('')
151
152 def _CreateTemplateForClass(self, policy_class, policies):
153 '''Creates the whole ADM template except for the [Strings] section, and
154 returns it as an |IndentedStringBuilder|.
155
156 Args:
157 policy_class: USER or MACHINE
158 policies: ADM code for all the policies in an |IndentedStringBuilder|.
159 '''
160 lines = IndentedStringBuilder()
161 category_path = self.config['win_category_path']
162
163 lines.AddLine('CLASS ' + policy_class, 1)
164 if self.config['build'] == 'chrome':
165 lines.AddLine('CATEGORY !!' + category_path[0], 1)
166 lines.AddLine('CATEGORY !!' + category_path[1], 1)
167 elif self.config['build'] == 'chromium':
168 lines.AddLine('CATEGORY !!' + category_path[0], 1)
169 lines.AddLine('KEYNAME "%s"' % self.config['win_reg_key_name'])
170 lines.AddLine()
171
172 lines.AddLines(policies)
173
174 if self.config['build'] == 'chrome':
175 lines.AddLine('END CATEGORY', -1)
176 lines.AddLine('END CATEGORY', -1)
177 lines.AddLine('', -1)
178 elif self.config['build'] == 'chromium':
179 lines.AddLine('END CATEGORY', -1)
180 lines.AddLine('', -1)
181
182 return lines
124 183
125 def BeginTemplate(self): 184 def BeginTemplate(self):
126 category_path = self.config['win_category_path'] 185 category_path = self.config['win_category_path']
127 self._AddGuiString(self.config['win_supported_os'], 186 self._AddGuiString(self.config['win_supported_os'],
128 self.messages['win_supported_winxpsp2']['text']) 187 self.messages['win_supported_winxpsp2']['text'])
129 self._PrintLine(
130 'CLASS ' + self.config['win_group_policy_class'].upper(),
131 1)
132 if self.config['build'] == 'chrome': 188 if self.config['build'] == 'chrome':
133 self._AddGuiString(category_path[0], 'Google') 189 self._AddGuiString(category_path[0], 'Google')
134 self._AddGuiString(category_path[1], self.config['app_name']) 190 self._AddGuiString(category_path[1], self.config['app_name'])
135 self._PrintLine('CATEGORY !!' + category_path[0], 1)
136 self._PrintLine('CATEGORY !!' + category_path[1], 1)
137 elif self.config['build'] == 'chromium': 191 elif self.config['build'] == 'chromium':
138 self._AddGuiString(category_path[0], self.config['app_name']) 192 self._AddGuiString(category_path[0], self.config['app_name'])
139 self._PrintLine('CATEGORY !!' + category_path[0], 1) 193 # All the policies will be written into self.policies.
140 self._PrintLine('KEYNAME "%s"' % self.config['win_reg_key_name']) 194 # The final template text will be assembled into self.lines by
141 self._PrintLine() 195 # self.EndTemplate().
142 196
143 def EndTemplate(self): 197 def EndTemplate(self):
144 if self.config['build'] == 'chrome': 198 # Copy policies into self.lines.
145 self._PrintLine('END CATEGORY', -1) 199 policy_class = self.config['win_group_policy_class'].upper()
146 self._PrintLine('END CATEGORY', -1) 200 if policy_class in ('BOTH', 'MACHINE'):
147 self._PrintLine('', -1) 201 self.lines.AddLines(self._CreateTemplateForClass('MACHINE',
148 elif self.config['build'] == 'chromium': 202 self.policies))
149 self._PrintLine('END CATEGORY', -1) 203 if policy_class in ('BOTH', 'USER'):
150 self._PrintLine('', -1) 204 self.lines.AddLines(self._CreateTemplateForClass('USER',
205 self.policies))
206 # Copy user strings into self.lines.
207 self.lines.AddLine('[Strings]')
208 self.lines.AddLines(self.strings)
151 209
152 def Init(self): 210 def Init(self):
153 self.policy_list = [] 211 # String buffer for building the whole ADM file.
154 self.str_list = ['[Strings]'] 212 self.lines = IndentedStringBuilder()
155 self.indent = '' 213 # String buffer for building the strings section of the ADM file.
214 self.strings = IndentedStringBuilder()
215 # String buffer for building the policies of the ADM file.
216 self.policies = IndentedStringBuilder()
156 217
157 def GetTemplateText(self): 218 def GetTemplateText(self):
158 lines = self.policy_list + self.str_list 219 return self.lines.ToString()
159 return self.NEWLINE.join(lines)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698