tailor.py: préréglages pour apache et php

This commit is contained in:
Jephté Clain 2018-06-18 22:10:00 +04:00
parent d620760681
commit 775bc8eee6
1 changed files with 61 additions and 30 deletions

View File

@ -12,12 +12,6 @@ def yellowf(line, *ignored): return '\x1B[33m%s\x1B[0m' % line
def redf(line, *ignored): return '\x1B[31m%s\x1B[0m' % line def redf(line, *ignored): return '\x1B[31m%s\x1B[0m' % line
def nonef(line, *ignored): return re.sub('\x1B\[.*?m', '', line) def nonef(line, *ignored): return re.sub('\x1B\[.*?m', '', line)
DEFAULT_PATTERNS = OrderedDict([
(r'(?i)error', redf),
(r'(?i)warn(ing)?', yellowf),
(r'(?i)info', bluef),
(None, nonef),
])
FORMATS = OrderedDict([ FORMATS = OrderedDict([
('blue', bluef), ('blue', bluef),
('green', greenf), ('green', greenf),
@ -33,6 +27,29 @@ FORMAT_ALIASES = {
'': 'none', '': 'none',
} }
APACHE_PATTERNS = OrderedDict([
(r'(?i)error', redf),
(r'(?i)warn(ing)?', yellowf),
(r'(?i)info', bluef),
(None, nonef),
])
PHP_PATTERNS = OrderedDict([
(r'(?i)php notice', redf),
(r'(?i)php warning', yellowf),
(None, nonef),
])
PRESETS = {
'apache': ('/var/log/apache2/error.log', True, APACHE_PATTERNS),
'php': ('/var/log/apache2/error.log', True, PHP_PATTERNS),
}
PRESET_ALIASES = {
'a': 'apache',
'p': 'php',
}
DEFAULT_PATTERNS = APACHE_PATTERNS
def strip_nl(s): def strip_nl(s):
if s is None: return None if s is None: return None
elif s.endswith("\r\n"): s = s[:-2] elif s.endswith("\r\n"): s = s[:-2]
@ -118,37 +135,51 @@ if __name__ == '__main__':
else: else:
texts.extend(super(FancyHelpFormatter, self)._split_lines(line, width)) texts.extend(super(FancyHelpFormatter, self)._split_lines(line, width))
return texts return texts
pattern_vars = dict(formats=', '.join(FORMATS.keys()))
pattern_help = u"""\
Ajouter une spécification de pattern et le format dans lequel il doit être affiché.
Le format par défaut est red. Les formats valides sont:
>>> %(formats)s
Les lignes qui ne correspondent à aucun pattern ne sont pas affichées.""" % pattern_vars
default_patterns = [u"%s:%s" % (p or '', f.__name__[:-1]) for (p, f) in DEFAULT_PATTERNS.items()]
no_defaults_vars = dict(default_patterns='\n'.join([u">>> %s" % pattern for pattern in default_patterns]))
no_defaults_help = u"""\
Ne pas ajouter les patterns par défaut. Sans cette option, les patterns par défaut sont:
%(default_patterns)s""" % no_defaults_vars
follow_help = u"""Suivre le contenu du fichier spécifié"""
presets_help = u"""Utiliser un ensemble prédéfini de paramètres.
Si cette option est utilisée, les autres options sont ignorées sauf --pattern qui peut être utilisé pour insérer des motifs avant les motifs par défaut du préréglage.
>>>Les valeurs valides sont apache et php.
Ces deux préréglages ont en commun de suivre le fichier /var/log/apache2/error.log en mettant en surbrillance les lignes intéressantes."""
inputfile_help = u"""\
Fichier à afficher ou dont il faut suivre le contenu.
Si cet argument n'est pas spécifié, l'entrée standard est utilisée comme source"""
AP = ArgumentParser( AP = ArgumentParser(
usage=u"%(prog)s [-f] [INPUTFILE]", usage=u"%(prog)s [-f] [INPUTFILE]",
description=__doc__, description=__doc__,
formatter_class=FancyHelpFormatter, formatter_class=FancyHelpFormatter,
) )
AP.set_defaults(inputfile=None, follow=False, patterns=None, defaults=True) AP.set_defaults(inputfile=None, follow=False, patterns=None, defaults=True, presets=None)
pattern_help = u"""\ AP.add_argument('-e', '--pattern', action='append', dest='patterns', metavar='PATTERN:FORMAT', help=pattern_help)
Ajouter une spécification de pattern et le format dans lequel il doit être affiché. AP.add_argument('-z', '--no-defaults', action='store_false', dest='defaults', help=no_defaults_help)
Le format par défaut est red. Les formats valides sont: AP.add_argument('-f', '--follow', action='store_true', dest='follow', help=follow_help)
>>> %(formats)s""" % { AP.add_argument('-p', '--presets', action='store', dest='presets', help=presets_help)
'formats': ', '.join(FORMATS.keys()), AP.add_argument('inputfile', metavar='INPUTFILE', nargs='?', help=inputfile_help)
}
AP.add_argument('-e', '--pattern', action='append', dest='patterns', metavar='PATTERN:FORMAT',
help=pattern_help)
default_patterns = [u"%s:%s" % (p or '', f.__name__[:-1]) for (p, f) in DEFAULT_PATTERNS.items()]
no_defaults_help = u"""\
Ne pas ajouter les patterns par défaut. Sans cette option, les patterns par défaut sont:
%(default_patterns)s""" % {
'default_patterns': '\n'.join([u">>> %s" % pattern for pattern in default_patterns]),
}
AP.add_argument('-z', '--no-defaults', action='store_false', dest='defaults',
help=no_defaults_help)
AP.add_argument('-f', '--follow', action='store_true', dest='follow',
help=u"Suivre le contenu du fichier spécifié")
AP.add_argument('inputfile', metavar='INPUTFILE', nargs='?',
help=u"Fichier qu'il faut afficher ou dont il faut suivre le contenu")
o = AP.parse_args() o = AP.parse_args()
if o.patterns is None: if o.presets is not None:
patterns = DEFAULT_PATTERNS presets = PRESET_ALIASES.get(o.presets, o.presets)
if presets not in PRESETS:
raise ValueError("%s: argument invalide" % presets)
inputfile, follow, patterns = PRESETS.get(presets)
else: else:
inputfile, follow, patterns = o.inputfile, o.follow, o.patterns
if patterns is None:
patterns = DEFAULT_PATTERNS
elif o.patterns is not None:
patterns = OrderedDict() patterns = OrderedDict()
for pf in o.patterns: for pf in o.patterns:
mo = re.match('(.*):([a-zA-Z]*)$', pf) mo = re.match('(.*):([a-zA-Z]*)$', pf)
@ -168,4 +199,4 @@ Ne pas ajouter les patterns par défaut. Sans cette option, les patterns par dé
for p, f in DEFAULT_PATTERNS.items(): for p, f in DEFAULT_PATTERNS.items():
patterns.setdefault(p, f) patterns.setdefault(p, f)
run_tailor(o.inputfile, o.follow, patterns) run_tailor(inputfile, follow, patterns)