|
10 | 10 | sys.stderr.write("** Please install libxml2 and lxml to permit validation!\n") |
11 | 11 | sys.exit(0) |
12 | 12 |
|
13 | | -longargs, args = getopt.gnu_getopt(sys.argv[1:], "", ["ignoredups=", "dupdir="]) |
| 13 | +longargs, args = getopt.gnu_getopt(sys.argv[1:], "", ["ignoredups=", "quiet", "dupdir="]) |
14 | 14 |
|
15 | 15 | ignoredups = [re.compile(val) for opt, val in longargs if opt == "--ignoredups"] |
16 | 16 | dupdir = [val for opt, val in longargs if opt == "--dupdir"] |
| 17 | +quiet = any(opt == "--quiet" for opt, val in longargs) |
| 18 | + |
| 19 | +def warn(s): |
| 20 | + if not quiet: sys.stdout.write("warning: %s\n" % s) |
| 21 | + |
| 22 | +def fail(s): |
| 23 | + sys.stdout.write("failure: %s\n" % s) |
17 | 24 |
|
18 | 25 | def test_not_anchored(tree): |
19 | 26 | # Rules not anchored to the beginning of a line. |
@@ -43,8 +50,8 @@ def test_missing_to(tree): |
43 | 50 | """Rule is missing a 'to' value.""" |
44 | 51 | for rule in tree.xpath("/ruleset/rule"): |
45 | 52 | if not rule.get("to"): |
46 | | - sys.stdout.write("warning: 'to' attribute missing in %s. " %fi) |
47 | | - sys.stdout.write("Misplaced end or misnamed element?\n") |
| 53 | + warn("'to' attribute missing in %s. " %fi) |
| 54 | + warn("Misplaced end or misnamed element?") |
48 | 55 | return False |
49 | 56 | return True |
50 | 57 |
|
@@ -93,11 +100,9 @@ def test_unencrypted_to(tree): |
93 | 100 | if to[:6] != "https:" and to[:5] != "http:": |
94 | 101 | return False |
95 | 102 | elif to[:5] == "http:" and downgrade: |
96 | | - sys.stdout.write("warning: downgrade rule in %s redirects " % fi) |
97 | | - sys.stdout.write("to http.\n") |
| 103 | + warn("downgrade rule in %s redirects to http." % fi) |
98 | 104 | elif to[:5] == "http:": |
99 | | - sys.stdout.write("error: rule in %s redirects to http and " % fi) |
100 | | - sys.stdout.write("downgrade attribute not specified.\n") |
| 105 | + fail("non-downgrade rule in %s redirects to http." % fi) |
101 | 106 | return False |
102 | 107 | return True |
103 | 108 |
|
@@ -202,35 +207,35 @@ def nomes_all(where=sys.argv[1:]): |
202 | 207 | tree = etree.parse(fi) |
203 | 208 | if fi[-4:] != ".xml": |
204 | 209 | if tree.xpath("/ruleset"): |
205 | | - sys.stdout.write("warning: ruleset in file without .xml extension: %s\n" % fi) |
| 210 | + warn("ruleset in file without .xml extension: %s" % fi) |
206 | 211 | else: |
207 | 212 | continue |
208 | 213 | seen_file = True |
209 | 214 | except Exception as oops: |
210 | 215 | if fi[-4:] != ".xml": |
211 | 216 | continue |
212 | 217 | failure = 1 |
213 | | - sys.stdout.write("%s failed XML validity: %s\n" % (fi, oops)) |
| 218 | + fail("%s failed XML validity: %s\n" % (fi, oops)) |
214 | 219 | if failure or not tree.xpath("/ruleset"): |
215 | 220 | continue |
216 | 221 | if not test_ruleset_name(tree): |
217 | 222 | failure = 1 |
218 | | - sys.stdout.write("failure: unnamed ruleset: %s\n" % fi) |
| 223 | + fail("unnamed ruleset: %s" % fi) |
219 | 224 | continue |
220 | 225 | ruleset_name = tree.xpath("/ruleset/@name")[0] |
221 | 226 | if ruleset_name in all_names: |
222 | 227 | failure = 1 |
223 | | - sys.stdout.write("failure: duplicate ruleset name %s\n" % ruleset_name) |
| 228 | + fail("duplicate ruleset name %s" % ruleset_name) |
224 | 229 | all_names.add(ruleset_name) |
225 | 230 | for test in tests: |
226 | 231 | if not test(tree): |
227 | 232 | failure = 1 |
228 | | - sys.stdout.write("failure: %s failed test: %s\n" % (fi, test.__doc__)) |
| 233 | + fail("%s failed test: %s" % (fi, test.__doc__)) |
229 | 234 | for target in tree.xpath("/ruleset/target/@host"): |
230 | 235 | if target in all_targets and not any(ign.search(target) for ign in ignoredups): |
231 | 236 | # suppress warning about duplicate targets if an --ignoredups |
232 | 237 | # pattern matches target |
233 | | - sys.stdout.write("warning: %s has duplicate target: %s\n" % (fi, target)) |
| 238 | + warn("%s has duplicate target: %s" % (fi, target)) |
234 | 239 | all_targets.add(target) |
235 | 240 |
|
236 | 241 | if not seen_file: |
|
0 commit comments