#!/usr/bin/python """ Check UCR templates for Python errors """ from __future__ import print_function from os import walk from os.path import join from sys import argv, stderr from errno import ENOENT from subprocess import Popen, PIPE from logging import StreamHandler, Formatter, getLogger, INFO try: import colorlog except ImportError: colorlog = None import re EXECUTE_TOKEN = re.compile('@!@(.+?)@!@', re.MULTILINE | re.DOTALL) HEADER = '''\ # -*- coding: utf-8 -*- import univention.config_registry configRegistry = univention.config_registry.ConfigRegistry() configRegistry.load() # for compatibility baseConfig = configRegistry ''' if colorlog: handler = colorlog.StreamHandler(stderr) handler.setFormatter(colorlog.ColoredFormatter('%(log_color)s%(levelname)s:%(message)s')) else: handler = StreamHandler(stderr) handler.setFormatter(Formatter('%(levelname)s:%(message)s')) log = getLogger(__name__) log.addHandler(handler) log.setLevel(INFO) try: root, = argv[1:] except ValueError: root = '.' for (dirpath, dirnames, filenames) in walk(root): if 'conffiles' not in dirpath: continue for filename in filenames: pathname = join(dirpath, filename) log.debug('Processing %s ...', pathname) try: with open(pathname, 'r') as stream: text = stream.read() except EnvironmentError as ex: if ex.errno == ENOENT: log.warn('ERROR: %s: %s', pathname, ex) else: log.fatal('ERROR: %s: %s', pathname, ex) continue for match in EXECUTE_TOKEN.findall(text): log.debug('Found match') proc = Popen(('pyflakes',), stdin=PIPE) proc.stdin.write(HEADER) proc.stdin.write(match) proc.stdin.close() rv = proc.wait() if rv: log.fatal('FAIL: %s', pathname) else: log.info('OK: %s', pathname)