Indent src/pslint.py with tabs
This commit is contained in:
parent
98aed19c3a
commit
bd70c79c18
228
src/pslint.py
228
src/pslint.py
|
@ -31,155 +31,155 @@ warnings = 0
|
||||||
errors = 0
|
errors = 0
|
||||||
|
|
||||||
def warning(msg):
|
def warning(msg):
|
||||||
global warnings, line, nline
|
global warnings, line, nline
|
||||||
print('%d: warning: %s: \'%s\'' % (nline, msg, line))
|
print('%d: warning: %s: \'%s\'' % (nline, msg, line))
|
||||||
warnings += 1
|
warnings += 1
|
||||||
|
|
||||||
def error(msg):
|
def error(msg):
|
||||||
global errors, line, nline
|
global errors, line, nline
|
||||||
print('%d: error: %s: \'%s\'' % (nline, msg, line))
|
print('%d: error: %s: \'%s\'' % (nline, msg, line))
|
||||||
errors += 1
|
errors += 1
|
||||||
|
|
||||||
def lint_psl(infile):
|
def lint_psl(infile):
|
||||||
"""Parses PSL file and extract strings and return code"""
|
"""Parses PSL file and extract strings and return code"""
|
||||||
global line, nline
|
global line, nline
|
||||||
|
|
||||||
PSL_FLAG_EXCEPTION = (1<<0)
|
PSL_FLAG_EXCEPTION = (1<<0)
|
||||||
PSL_FLAG_WILDCARD = (1<<1)
|
PSL_FLAG_WILDCARD = (1<<1)
|
||||||
PSL_FLAG_ICANN = (1<<2) # entry of ICANN section
|
PSL_FLAG_ICANN = (1<<2) # entry of ICANN section
|
||||||
PSL_FLAG_PRIVATE = (1<<3) # entry of PRIVATE section
|
PSL_FLAG_PRIVATE = (1<<3) # entry of PRIVATE section
|
||||||
PSL_FLAG_PLAIN = (1<<4) #just used for PSL syntax checking
|
PSL_FLAG_PLAIN = (1<<4) #just used for PSL syntax checking
|
||||||
|
|
||||||
psl = {}
|
psl = {}
|
||||||
section = 0
|
section = 0
|
||||||
|
|
||||||
lines = [line.strip('\r\n') for line in infile]
|
lines = [line.strip('\r\n') for line in infile]
|
||||||
|
|
||||||
for line in lines:
|
for line in lines:
|
||||||
nline += 1
|
nline += 1
|
||||||
|
|
||||||
# check for leadind/trailing whitespace
|
# check for leadind/trailing whitespace
|
||||||
stripped = line.strip()
|
stripped = line.strip()
|
||||||
if stripped != line:
|
if stripped != line:
|
||||||
warning('Leading/Trailing whitespace')
|
warning('Leading/Trailing whitespace')
|
||||||
line = stripped
|
line = stripped
|
||||||
|
|
||||||
# empty line
|
# empty line
|
||||||
if not line:
|
if not line:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# check for section begin/end
|
# check for section begin/end
|
||||||
if line[0:2] == "//":
|
if line[0:2] == "//":
|
||||||
if section == 0:
|
if section == 0:
|
||||||
if line == "// ===BEGIN ICANN DOMAINS===":
|
if line == "// ===BEGIN ICANN DOMAINS===":
|
||||||
section = PSL_FLAG_ICANN
|
section = PSL_FLAG_ICANN
|
||||||
elif line == "// ===BEGIN PRIVATE DOMAINS===":
|
elif line == "// ===BEGIN PRIVATE DOMAINS===":
|
||||||
section = PSL_FLAG_PRIVATE
|
section = PSL_FLAG_PRIVATE
|
||||||
elif line[3:8] == "===BEGIN":
|
elif line[3:8] == "===BEGIN":
|
||||||
error('Unexpected begin of unknown section')
|
error('Unexpected begin of unknown section')
|
||||||
elif line[3:6] == "===END":
|
elif line[3:6] == "===END":
|
||||||
error('End of section without previous begin')
|
error('End of section without previous begin')
|
||||||
elif section == PSL_FLAG_ICANN:
|
elif section == PSL_FLAG_ICANN:
|
||||||
if line == "// ===END ICANN DOMAINS===":
|
if line == "// ===END ICANN DOMAINS===":
|
||||||
section = 0
|
section = 0
|
||||||
elif line[3:8] == "===BEGIN":
|
elif line[3:8] == "===BEGIN":
|
||||||
error('Unexpected begin of section: ')
|
error('Unexpected begin of section: ')
|
||||||
elif line[3:6] == "===END":
|
elif line[3:6] == "===END":
|
||||||
error('Unexpected end of section')
|
error('Unexpected end of section')
|
||||||
elif section == PSL_FLAG_PRIVATE:
|
elif section == PSL_FLAG_PRIVATE:
|
||||||
if line == "// ===END ICANN DOMAINS===":
|
if line == "// ===END ICANN DOMAINS===":
|
||||||
section = 0
|
section = 0
|
||||||
elif line[3:8] == "===BEGIN":
|
elif line[3:8] == "===BEGIN":
|
||||||
error('Unexpected begin of section')
|
error('Unexpected begin of section')
|
||||||
elif line[3:6] == "===END":
|
elif line[3:6] == "===END":
|
||||||
error('Unexpected end of section')
|
error('Unexpected end of section')
|
||||||
|
|
||||||
continue # processing of comments ends here
|
continue # processing of comments ends here
|
||||||
|
|
||||||
# No rule must be outside of a section
|
# No rule must be outside of a section
|
||||||
if section == 0:
|
if section == 0:
|
||||||
error('Rule outside of section')
|
error('Rule outside of section')
|
||||||
|
|
||||||
# decode UTF-8 input into unicode, needed only for python 2.x
|
# decode UTF-8 input into unicode, needed only for python 2.x
|
||||||
if sys.version_info[0] < 3:
|
if sys.version_info[0] < 3:
|
||||||
line = line.decode('utf-8')
|
line = line.decode('utf-8')
|
||||||
|
|
||||||
# each rule must be lowercase (or more exactly: not uppercase and not titlecase)
|
# each rule must be lowercase (or more exactly: not uppercase and not titlecase)
|
||||||
if line != line.lower():
|
if line != line.lower():
|
||||||
error('Rule must be lowercase')
|
error('Rule must be lowercase')
|
||||||
|
|
||||||
# strip leading wildcards
|
# strip leading wildcards
|
||||||
flags = 0
|
flags = 0
|
||||||
# while line[0:2] == '*.':
|
# while line[0:2] == '*.':
|
||||||
if line[0:2] == '*.':
|
if line[0:2] == '*.':
|
||||||
flags = PSL_FLAG_WILDCARD | PSL_FLAG_PLAIN | section
|
flags = PSL_FLAG_WILDCARD | PSL_FLAG_PLAIN | section
|
||||||
line = line[2:]
|
line = line[2:]
|
||||||
|
|
||||||
if line[0] == '!':
|
if line[0] == '!':
|
||||||
flags = PSL_FLAG_EXCEPTION | section
|
flags = PSL_FLAG_EXCEPTION | section
|
||||||
line = line[1:]
|
line = line[1:]
|
||||||
|
|
||||||
# wildcard and exception must not combine
|
# wildcard and exception must not combine
|
||||||
if flags & PSL_FLAG_WILDCARD and flags & PSL_FLAG_EXCEPTION:
|
if flags & PSL_FLAG_WILDCARD and flags & PSL_FLAG_EXCEPTION:
|
||||||
error('Combination of wildcard and exception')
|
error('Combination of wildcard and exception')
|
||||||
|
|
||||||
labels = line.split('.')
|
labels = line.split('.')
|
||||||
|
|
||||||
for label in labels:
|
for label in labels:
|
||||||
if not label:
|
if not label:
|
||||||
error('Leading/trailing or multiple dot')
|
error('Leading/trailing or multiple dot')
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if label[0:4] == 'xn--':
|
if label[0:4] == 'xn--':
|
||||||
error('Punycode found')
|
error('Punycode found')
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if '--' in label:
|
if '--' in label:
|
||||||
error('Double minus found')
|
error('Double minus found')
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# allowed are a-z,0-9,- and unicode >= 128 (maybe that can be finetuned a bit !?)
|
# allowed are a-z,0-9,- and unicode >= 128 (maybe that can be finetuned a bit !?)
|
||||||
for c in label:
|
for c in label:
|
||||||
if not c.isalnum() and c != '-' and ord(c) < 128:
|
if not c.isalnum() and c != '-' and ord(c) < 128:
|
||||||
error('Illegal character')
|
error('Illegal character')
|
||||||
break
|
break
|
||||||
|
|
||||||
if line in psl:
|
if line in psl:
|
||||||
"""Found existing entry:
|
"""Found existing entry:
|
||||||
Combination of exception and plain rule is ambiguous
|
Combination of exception and plain rule is ambiguous
|
||||||
!foo.bar
|
!foo.bar
|
||||||
foo.bar
|
foo.bar
|
||||||
|
|
||||||
Allowed:
|
Allowed:
|
||||||
!foo.bar + *.foo.bar
|
!foo.bar + *.foo.bar
|
||||||
foo.bar + *.foo.bar
|
foo.bar + *.foo.bar
|
||||||
"""
|
"""
|
||||||
error('Found doublette/ambiguity (previous line was %d)' % psl[line])
|
error('Found doublette/ambiguity (previous line was %d)' % psl[line])
|
||||||
continue
|
continue
|
||||||
|
|
||||||
psl[line] = nline
|
psl[line] = nline
|
||||||
|
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
"""Prints the usage"""
|
"""Prints the usage"""
|
||||||
print('usage: %s PSLfile' % sys.argv[0])
|
print('usage: %s PSLfile' % sys.argv[0])
|
||||||
print('or %s - # To read PSL from STDIN' % sys.argv[0])
|
print('or %s - # To read PSL from STDIN' % sys.argv[0])
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""Check syntax of a PSL file"""
|
"""Check syntax of a PSL file"""
|
||||||
if len(sys.argv) < 2:
|
if len(sys.argv) < 2:
|
||||||
usage()
|
usage()
|
||||||
|
|
||||||
if sys.argv[-1] == '-':
|
if sys.argv[-1] == '-':
|
||||||
lint_psl(sys.stdin)
|
lint_psl(sys.stdin)
|
||||||
else:
|
else:
|
||||||
with open(sys.argv[-1], 'r') as infile:
|
with open(sys.argv[-1], 'r') as infile:
|
||||||
lint_psl(infile)
|
lint_psl(infile)
|
||||||
|
|
||||||
return errors != 0
|
return errors != 0
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
sys.exit(main())
|
sys.exit(main())
|
||||||
|
|
Loading…
Reference in New Issue