diff --git a/fail2ban/server/strptime.py b/fail2ban/server/strptime.py index cdfe0e0e..d98b2e1b 100644 --- a/fail2ban/server/strptime.py +++ b/fail2ban/server/strptime.py @@ -95,18 +95,10 @@ def reGroupDictStrptime(found_dict, msec=False): Unix time stamp. """ - now = MyTime.now() - year = month = day = hour = minute = None - hour = minute = None + now = \ + year = month = day = hour = minute = tzoffset = \ + weekday = julian = week_of_year = None second = fraction = 0 - tzoffset = None - # Default to -1 to signify that values not known; not critical to have, - # though - week_of_year = -1 - week_of_year_start = -1 - # weekday and julian defaulted to -1 so as to signal need to calculate - # values - weekday = julian = -1 for key, val in found_dict.iteritems(): if val is None: continue # Directives not explicitly handled below: @@ -199,31 +191,28 @@ def reGroupDictStrptime(found_dict, msec=False): # Fail2Ban will assume it's this year assume_year = False if year is None: + if not now: now = MyTime.now() year = now.year assume_year = True - # If we know the week of the year and what day of that week, we can figure - # out the Julian day of the year. - if julian == -1 and week_of_year != -1 and weekday != -1: - week_starts_Mon = True if week_of_year_start == 0 else False - julian = _calc_julian_from_U_or_W(year, week_of_year, weekday, - week_starts_Mon) - # Cannot pre-calculate datetime.datetime() since can change in Julian - # calculation and thus could have different value for the day of the week - # calculation. - if julian != -1 and (month is None or day is None): - datetime_result = datetime.datetime.fromordinal((julian - 1) + datetime.datetime(year, 1, 1).toordinal()) - year = datetime_result.year - month = datetime_result.month - day = datetime_result.day - # Add timezone info - if tzoffset is not None: - gmtoff = tzoffset * 60 - else: - gmtoff = None + if month is None or day is None: + # If we know the week of the year and what day of that week, we can figure + # out the Julian day of the year. + if julian is None and week_of_year is not None and weekday is not None: + julian = _calc_julian_from_U_or_W(year, week_of_year, weekday, + (week_of_year_start == 0)) + # Cannot pre-calculate datetime.datetime() since can change in Julian + # calculation and thus could have different value for the day of the week + # calculation. + if julian is not None: + datetime_result = datetime.datetime.fromordinal((julian - 1) + datetime.datetime(year, 1, 1).toordinal()) + year = datetime_result.year + month = datetime_result.month + day = datetime_result.day # Fail2Ban assume today assume_today = False if month is None and day is None: + if not now: now = MyTime.now() month = now.month day = now.day assume_today = True @@ -231,19 +220,25 @@ def reGroupDictStrptime(found_dict, msec=False): # Actully create date date_result = datetime.datetime( year, month, day, hour, minute, second, fraction) - if gmtoff is not None: - date_result = date_result - datetime.timedelta(seconds=gmtoff) - - if date_result > now and assume_today: - # Rollover at midnight, could mean it's yesterday... - date_result = date_result - datetime.timedelta(days=1) - if date_result > now and assume_year: - # Could be last year? - # also reset month and day as it's not yesterday... - date_result = date_result.replace( - year=year-1, month=month, day=day) - - if gmtoff is not None: + # Add timezone info + if tzoffset is not None: + date_result -= datetime.timedelta(seconds=tzoffset * 60) + + if assume_today: + if not now: now = MyTime.now() + if date_result > now: + # Rollover at midnight, could mean it's yesterday... + date_result -= datetime.timedelta(days=1) + if assume_year: + if not now: now = MyTime.now() + if date_result > now: + # Could be last year? + # also reset month and day as it's not yesterday... + date_result = date_result.replace( + year=year-1, month=month, day=day) + + # make time: + if tzoffset is not None: tm = calendar.timegm(date_result.utctimetuple()) else: tm = time.mktime(date_result.timetuple())