mirror of https://github.com/fail2ban/fail2ban
Normalize zone2offset (usable within reGroupDictStrptime), tests simplified and extended with more cases (covers precedence of input-zone over default, etc.)
parent
8cb4ae0242
commit
9f41d1e381
|
@ -27,7 +27,7 @@ from .mytime import MyTime
|
||||||
|
|
||||||
locale_time = LocaleTime()
|
locale_time = LocaleTime()
|
||||||
timeRE = TimeRE()
|
timeRE = TimeRE()
|
||||||
FIXED_OFFSET_TZ_RE = re.compile(r'(?:Z|UTC|GMT)?([+-]\d{2}(?:\d{2}))?$')
|
FIXED_OFFSET_TZ_RE = re.compile(r'(?:Z|UTC|GMT)?([+-]\d{2}(?::?\d{2})?)?$')
|
||||||
|
|
||||||
def _getYearCentRE(cent=(0,3), distance=3, now=(MyTime.now(), MyTime.alternateNow)):
|
def _getYearCentRE(cent=(0,3), distance=3, now=(MyTime.now(), MyTime.alternateNow)):
|
||||||
""" Build century regex for last year and the next years (distance).
|
""" Build century regex for last year and the next years (distance).
|
||||||
|
@ -108,8 +108,15 @@ def zone2offset(tz, dt):
|
||||||
dt: datetime instance for offset computation
|
dt: datetime instance for offset computation
|
||||||
"""
|
"""
|
||||||
if isinstance(tz, basestring):
|
if isinstance(tz, basestring):
|
||||||
# [+-]1 * (hh*60 + mm)
|
if len(tz) <= 3: # short tz (hh only)
|
||||||
return int(tz[0]+'1') * (int(tz[1:3])*60 + int(tz[3:5]))
|
# [+-]hh --> [+-]hh*60
|
||||||
|
return int(tz)*60
|
||||||
|
if tz[3] != ':':
|
||||||
|
# [+-]hhmm --> [+-]1 * (hh*60 + mm)
|
||||||
|
return int(tz[0]+'1') * (int(tz[1:3])*60 + int(tz[3:5]))
|
||||||
|
else:
|
||||||
|
# [+-]hh:mm --> [+-]1 * (hh*60 + mm)
|
||||||
|
return int(tz[0]+'1') * (int(tz[1:3])*60 + int(tz[4:6]))
|
||||||
return tz
|
return tz
|
||||||
|
|
||||||
def reGroupDictStrptime(found_dict, msec=False, default_tz=None):
|
def reGroupDictStrptime(found_dict, msec=False, default_tz=None):
|
||||||
|
@ -202,11 +209,7 @@ def reGroupDictStrptime(found_dict, msec=False, default_tz=None):
|
||||||
if z in ("Z", "UTC", "GMT"):
|
if z in ("Z", "UTC", "GMT"):
|
||||||
tzoffset = 0
|
tzoffset = 0
|
||||||
else:
|
else:
|
||||||
tzoffset = int(z[1:3]) * 60 # Hours...
|
tzoffset = zone2offset(z, 0); # currently offset-based only
|
||||||
if len(z)>3:
|
|
||||||
tzoffset += int(z[-2:]) # ...and minutes
|
|
||||||
if z.startswith("-"):
|
|
||||||
tzoffset = -tzoffset
|
|
||||||
elif key == 'Z':
|
elif key == 'Z':
|
||||||
z = val
|
z = val
|
||||||
if z in ("UTC", "GMT"):
|
if z in ("UTC", "GMT"):
|
||||||
|
|
|
@ -90,21 +90,31 @@ class DateDetectorTest(LogCaptureTestCase):
|
||||||
self.assertEqual(matchlog.group(1), 'Jan 23 21:59:59')
|
self.assertEqual(matchlog.group(1), 'Jan 23 21:59:59')
|
||||||
|
|
||||||
def testDefaultTimeZone(self):
|
def testDefaultTimeZone(self):
|
||||||
log = "2017-01-23 15:00:00"
|
|
||||||
dd = self.datedetector
|
dd = self.datedetector
|
||||||
dd.default_tz='UTC+0300'; datelog, _ = dd.getTime(log)
|
dt = datetime.datetime
|
||||||
# so in UTC, it was noon
|
logdt = "2017-01-23 15:00:00"
|
||||||
self.assertEqual(datetime.datetime.utcfromtimestamp(datelog),
|
dtUTC = dt(2017, 1, 23, 15, 0)
|
||||||
datetime.datetime(2017, 1, 23, 12, 0, 0))
|
for tz, log, desired in (
|
||||||
|
('UTC+0300', logdt, dt(2017, 1, 23, 12, 0)), # so in UTC, it was noon
|
||||||
dd.default_tz='UTC'; datelog, _ = dd.getTime(log)
|
('UTC', logdt, dtUTC), # UTC
|
||||||
self.assertEqual(datetime.datetime.utcfromtimestamp(datelog),
|
('UTC-0430', logdt, dt(2017, 1, 23, 19, 30)),
|
||||||
datetime.datetime(2017, 1, 23, 15, 0, 0))
|
('GMT+12', logdt, dt(2017, 1, 23, 3, 0)),
|
||||||
self.assertEqual(dd.default_tz, 0); # utc == 0
|
(None, logdt, dt(2017, 1, 23, 14, 0)), # default CET in our test-framework
|
||||||
|
('UTC+0300', logdt+' GMT', dtUTC), # GMT wins
|
||||||
dd.default_tz='UTC-0430'; datelog, _ = dd.getTime(log)
|
('UTC', logdt+' GMT', dtUTC), # GMT wins
|
||||||
self.assertEqual(datetime.datetime.utcfromtimestamp(datelog),
|
('UTC-0430', logdt+' GMT', dtUTC), # GMT wins
|
||||||
datetime.datetime(2017, 1, 23, 19, 30, 0))
|
(None, logdt+' GMT', dtUTC), # GMT wins
|
||||||
|
('UTC', logdt+' -1045', dt(2017, 1, 24, 1, 45)), # -1045 wins
|
||||||
|
(None, logdt+' -10:45', dt(2017, 1, 24, 1, 45)), # -1045 wins
|
||||||
|
('UTC', logdt+' +0945', dt(2017, 1, 23, 5, 15)), # +0945 wins
|
||||||
|
(None, logdt+' +09:45', dt(2017, 1, 23, 5, 15)), # +0945 wins
|
||||||
|
(None, logdt+' Z', dtUTC), # Z wins (UTC)
|
||||||
|
):
|
||||||
|
logSys.debug('== test %r with TZ %r', log, tz)
|
||||||
|
dd.default_tz=tz; datelog, _ = dd.getTime(log)
|
||||||
|
val = dt.utcfromtimestamp(datelog)
|
||||||
|
self.assertEqual(val, desired,
|
||||||
|
"wrong offset %r != %r by %r with TZ %r (%r)" % (val, desired, log, tz, dd.default_tz))
|
||||||
|
|
||||||
self.assertRaises(ValueError, setattr, dd, 'default_tz', 'WRONG-TZ')
|
self.assertRaises(ValueError, setattr, dd, 'default_tz', 'WRONG-TZ')
|
||||||
dd.default_tz = None
|
dd.default_tz = None
|
||||||
|
|
Loading…
Reference in New Issue