mirror of https://github.com/fail2ban/fail2ban
provide more meaningful error-message if invalid `datepattern` set;
fail2ban-regex: catch errors/exceptions by set of parameter, more verbose output if needed (`-v` or log-level `debug` would produce output of call-stack additionally).pull/2348/head
parent
c819a18a0a
commit
5a54a44559
|
@ -694,6 +694,14 @@ def exec_command_line(*args):
|
|||
stdout.setFormatter(Formatter(getVerbosityFormat(opts.verbose, fmt)))
|
||||
logSys.addHandler(stdout)
|
||||
|
||||
fail2banRegex = Fail2banRegex(opts)
|
||||
try:
|
||||
fail2banRegex = Fail2banRegex(opts)
|
||||
except Exception as e:
|
||||
if opts.verbose or logSys.getEffectiveLevel()<=logging.DEBUG:
|
||||
logSys.critical(e, exc_info=True)
|
||||
else:
|
||||
output( 'ERROR: %s' % e )
|
||||
sys.exit(255)
|
||||
|
||||
if not fail2banRegex.start(args):
|
||||
sys.exit(255)
|
||||
|
|
|
@ -301,14 +301,17 @@ class DatePatternRegex(DateTemplate):
|
|||
if wordBegin and RE_EXLINE_BOUND_BEG.search(pattern):
|
||||
pattern = RE_EXLINE_BOUND_BEG.sub('', pattern)
|
||||
wordBegin = 'start'
|
||||
# wrap to regex:
|
||||
fmt = self._patternRE.sub(r'%(\1)s', pattern)
|
||||
self.name = fmt % self._patternName
|
||||
regex = fmt % timeRE
|
||||
# if expected add (?iu) for "ignore case" and "unicode":
|
||||
if RE_ALPHA_PATTERN.search(pattern):
|
||||
regex = r'(?iu)' + regex
|
||||
super(DatePatternRegex, self).setRegex(regex, wordBegin, wordEnd)
|
||||
try:
|
||||
# wrap to regex:
|
||||
fmt = self._patternRE.sub(r'%(\1)s', pattern)
|
||||
self.name = fmt % self._patternName
|
||||
regex = fmt % timeRE
|
||||
# if expected add (?iu) for "ignore case" and "unicode":
|
||||
if RE_ALPHA_PATTERN.search(pattern):
|
||||
regex = r'(?iu)' + regex
|
||||
super(DatePatternRegex, self).setRegex(regex, wordBegin, wordEnd)
|
||||
except Exception as e:
|
||||
raise TypeError("Failed to set datepattern '%s' (may be an invalid format or unescaped percent char): %s" % (pattern, e))
|
||||
|
||||
def getDate(self, line, dateMatch=None, default_tz=None):
|
||||
"""Method to return the date for a log line.
|
||||
|
|
|
@ -368,3 +368,16 @@ class Fail2banRegexTest(LogCaptureTestCase):
|
|||
r"Authentication failure"
|
||||
), 0)
|
||||
self.assertLogged('No failure-id group in ')
|
||||
|
||||
def testExecCmdLine_ErrorParam(self):
|
||||
# single line error:
|
||||
self.assertNotEqual(_test_exec_command_line(
|
||||
'-l', 'notice', '-d', '%:%.%-', 'LOG', 'RE'
|
||||
), 0)
|
||||
self.assertLogged('ERROR: Failed to set datepattern')
|
||||
# verbose (traceback/callstack):
|
||||
self.pruneLog()
|
||||
self.assertNotEqual(_test_exec_command_line(
|
||||
'-v', '-d', '%:%.%-', 'LOG', 'RE'
|
||||
), 0)
|
||||
self.assertLogged('Failed to set datepattern')
|
||||
|
|
Loading…
Reference in New Issue