mirror of https://github.com/fail2ban/fail2ban
better reorder templates handling, code coverage increase (a small part of _reorderTemplate was not covered at all)
parent
5d5ab27435
commit
39c343bd06
|
@ -92,7 +92,7 @@ class DateDetectorCache(object):
|
||||||
if self.__templates:
|
if self.__templates:
|
||||||
return self.__templates
|
return self.__templates
|
||||||
with self.__lock:
|
with self.__lock:
|
||||||
if self.__templates:
|
if self.__templates: # pragma: no cover - race-condition + multi-threaded environment only
|
||||||
return self.__templates
|
return self.__templates
|
||||||
self._addDefaultTemplate()
|
self._addDefaultTemplate()
|
||||||
return self.__templates
|
return self.__templates
|
||||||
|
@ -324,7 +324,7 @@ class DateDetector(object):
|
||||||
ddtempl = self.__templates[i]
|
ddtempl = self.__templates[i]
|
||||||
template = ddtempl.template
|
template = ddtempl.template
|
||||||
if template.flags & (DateTemplate.LINE_BEGIN|DateTemplate.LINE_END):
|
if template.flags & (DateTemplate.LINE_BEGIN|DateTemplate.LINE_END):
|
||||||
if logSys.getEffectiveLevel() <= logLevel-1:
|
if logSys.getEffectiveLevel() <= logLevel-1: # pragma: no cover - very-heavy debug
|
||||||
logSys.log(logLevel-1, " try to match last anchored template #%02i ...", i)
|
logSys.log(logLevel-1, " try to match last anchored template #%02i ...", i)
|
||||||
match = template.matchDate(line)
|
match = template.matchDate(line)
|
||||||
ignoreBySearch = i
|
ignoreBySearch = i
|
||||||
|
@ -452,7 +452,7 @@ class DateDetector(object):
|
||||||
try:
|
try:
|
||||||
date = template.getDate(line, timeMatch[0])
|
date = template.getDate(line, timeMatch[0])
|
||||||
if date is not None:
|
if date is not None:
|
||||||
if logSys.getEffectiveLevel() <= logLevel:
|
if logSys.getEffectiveLevel() <= logLevel: # pragma: no cover - heavy debug
|
||||||
logSys.log(logLevel, " got time %f for %r using template %s",
|
logSys.log(logLevel, " got time %f for %r using template %s",
|
||||||
date[0], date[1].group(1), template.name)
|
date[0], date[1].group(1), template.name)
|
||||||
return date
|
return date
|
||||||
|
@ -478,23 +478,25 @@ class DateDetector(object):
|
||||||
weight = ddtempl.weight
|
weight = ddtempl.weight
|
||||||
## try to move faster (first if unused available, or half of part to current template position):
|
## try to move faster (first if unused available, or half of part to current template position):
|
||||||
pos = self.__firstUnused if self.__firstUnused < num else num // 2
|
pos = self.__firstUnused if self.__firstUnused < num else num // 2
|
||||||
pweight = templates[pos].weight
|
|
||||||
## don't move too often (multiline logs resp. log's with different date patterns),
|
## don't move too often (multiline logs resp. log's with different date patterns),
|
||||||
## if template not used too long, replace it also :
|
## if template not used too long, replace it also :
|
||||||
if logSys.getEffectiveLevel() <= logLevel:
|
def _moveable():
|
||||||
logSys.log(logLevel, " -> compare template #%02i & #%02i, weight %.3f > %.3f, hits %r > %r",
|
|
||||||
num, pos, weight, pweight, ddtempl.hits, templates[pos].hits)
|
|
||||||
if not pweight or weight > pweight or templates[pos].lastUsed < untime:
|
|
||||||
## if not larger (and target position recently used) - move slow (exact 1 position):
|
|
||||||
if weight <= pweight and templates[pos].lastUsed > untime:
|
|
||||||
pos = num-1
|
|
||||||
## if still smaller and template at position used, don't move:
|
|
||||||
pweight = templates[pos].weight
|
pweight = templates[pos].weight
|
||||||
if logSys.getEffectiveLevel() <= logLevel:
|
if logSys.getEffectiveLevel() <= logLevel:
|
||||||
logSys.log(logLevel, " -> compare template #%02i & #%02i, weight %.3f > %.3f, hits %r > %r",
|
logSys.log(logLevel, " -> compare template #%02i & #%02i, weight %.3f > %.3f, hits %r > %r",
|
||||||
num, pos, weight, pweight, ddtempl.hits, templates[pos].hits)
|
num, pos, weight, pweight, ddtempl.hits, templates[pos].hits)
|
||||||
if weight < pweight and templates[pos].lastUsed > untime:
|
return weight > pweight or untime > templates[pos].lastUsed
|
||||||
return
|
##
|
||||||
|
## if not moveable (smaller weight or target position recently used):
|
||||||
|
if not _moveable():
|
||||||
|
## try to move slow (exact 1 position):
|
||||||
|
if pos == num-1:
|
||||||
|
return num
|
||||||
|
pos = num-1
|
||||||
|
## if still smaller and template at position used, don't move:
|
||||||
|
if not _moveable():
|
||||||
|
return num
|
||||||
|
## move:
|
||||||
del templates[num]
|
del templates[num]
|
||||||
templates[pos:0] = [ddtempl]
|
templates[pos:0] = [ddtempl]
|
||||||
## correct first unused:
|
## correct first unused:
|
||||||
|
|
|
@ -250,12 +250,12 @@ class DateDetectorTest(LogCaptureTestCase):
|
||||||
("030324 0:04:00", "server mysqld[1000]: 030324 0:04:00 [Warning] Access denied ..."
|
("030324 0:04:00", "server mysqld[1000]: 030324 0:04:00 [Warning] Access denied ..."
|
||||||
" foreign-input just some free text 2003-03-07 17:05:01 test", 10),
|
" foreign-input just some free text 2003-03-07 17:05:01 test", 10),
|
||||||
# distance collision detection (first date should be found):
|
# distance collision detection (first date should be found):
|
||||||
("Sep 16 21:30:26", "server mysqld[1020]: Sep 16 21:30:26 server mysqld: 030916 21:30:26 [Warning] Access denied", 10),
|
("Sep 16 21:30:26", "server mysqld[1020]: Sep 16 21:30:26 server mysqld: 030916 21:30:26 [Warning] Access denied", 15),
|
||||||
# just to test sorting:
|
# just to test sorting:
|
||||||
("2005-10-07 06:09:42", "server mysqld[5906]: 2005-10-07 06:09:42 5907 [Warning] Access denied", 20),
|
("2005-10-07 06:09:42", "server mysqld[5906]: 2005-10-07 06:09:42 5907 [Warning] Access denied", 20),
|
||||||
("2005-10-08T15:26:18.237955", "server mysqld[5906]: 2005-10-08T15:26:18.237955 6 [Note] Access denied", 20),
|
("2005-10-08T15:26:18.237955", "server mysqld[5906]: 2005-10-08T15:26:18.237955 6 [Note] Access denied", 20),
|
||||||
# date format changed again:
|
# date format changed again:
|
||||||
("051009 10:05:30", "server mysqld[1000]: 051009 10:05:30 [Warning] Access denied ...", 20),
|
("051009 10:05:30", "server mysqld[1000]: 051009 10:05:30 [Warning] Access denied ...", 50),
|
||||||
):
|
):
|
||||||
logSys.debug('== test: %r', (debit, line, cnt))
|
logSys.debug('== test: %r', (debit, line, cnt))
|
||||||
for i in range(cnt):
|
for i in range(cnt):
|
||||||
|
|
Loading…
Reference in New Issue