| From abaa20435bac7decffa69e6f965aac9ce29aff6a Mon Sep 17 00:00:00 2001 |
| From: Armin Kuster <akuster808@gmail.com> |
| Date: Wed, 12 Feb 2020 17:19:15 +0000 |
| Subject: [PATCH] python3-fail2ban: 2-3 conversion |
| |
| Upstream-Status: OE specific. |
| |
| fail2ban handles py3 via a 2-3 conversion utility. |
| |
| Signed-off-by: Armin Kuster <akuster808@gmail.com> |
| --- |
| fail2ban/client/actionreader.py | 4 +- |
| fail2ban/client/configparserinc.py | 10 +- |
| fail2ban/client/configreader.py | 4 +- |
| fail2ban/client/csocket.py | 4 +- |
| fail2ban/client/fail2banclient.py | 4 +- |
| fail2ban/client/fail2banregex.py | 20 +- |
| fail2ban/client/filterreader.py | 2 +- |
| fail2ban/client/jailreader.py | 4 +- |
| fail2ban/helpers.py | 15 +- |
| fail2ban/server/action.py | 19 +- |
| fail2ban/server/actions.py | 24 +- |
| fail2ban/server/asyncserver.py | 4 +- |
| fail2ban/server/banmanager.py | 18 +- |
| fail2ban/server/database.py | 6 +- |
| fail2ban/server/failmanager.py | 8 +- |
| fail2ban/server/failregex.py | 9 +- |
| fail2ban/server/filter.py | 12 +- |
| fail2ban/server/filterpoll.py | 2 +- |
| fail2ban/server/filterpyinotify.py | 6 +- |
| fail2ban/server/ipdns.py | 16 +- |
| fail2ban/server/jail.py | 14 +- |
| fail2ban/server/mytime.py | 2 +- |
| fail2ban/server/server.py | 18 +- |
| fail2ban/server/strptime.py | 6 +- |
| fail2ban/server/ticket.py | 14 +- |
| fail2ban/server/transmitter.py | 2 +- |
| fail2ban/server/utils.py | 6 +- |
| fail2ban/tests/action_d/test_badips.py | 2 +- |
| fail2ban/tests/actiontestcase.py | 4 +- |
| fail2ban/tests/clientreadertestcase.py | 4 +- |
| fail2ban/tests/databasetestcase.py | 16 +- |
| fail2ban/tests/datedetectortestcase.py | 6 +- |
| fail2ban/tests/fail2banclienttestcase.py | 8 +- |
| fail2ban/tests/failmanagertestcase.py | 10 +- |
| .../tests/files/config/apache-auth/digest.py | 20 +- |
| fail2ban/tests/filtertestcase.py | 92 ++--- |
| fail2ban/tests/misctestcase.py | 22 +- |
| fail2ban/tests/observertestcase.py | 34 +- |
| fail2ban/tests/samplestestcase.py | 8 +- |
| fail2ban/tests/servertestcase.py | 28 +- |
| fail2ban/tests/sockettestcase.py | 2 +- |
| fail2ban/tests/utils.py | 22 +- |
| setup.py | 326 ------------------ |
| 43 files changed, 264 insertions(+), 593 deletions(-) |
| delete mode 100755 setup.py |
| |
| diff --git a/fail2ban/client/actionreader.py b/fail2ban/client/actionreader.py |
| index 80617a50..ecf323c5 100644 |
| --- a/fail2ban/client/actionreader.py |
| +++ b/fail2ban/client/actionreader.py |
| @@ -90,11 +90,11 @@ class ActionReader(DefinitionInitConfigReader): |
| stream = list() |
| stream.append(head + ["addaction", self._name]) |
| multi = [] |
| - for opt, optval in opts.iteritems(): |
| + for opt, optval in opts.items(): |
| if opt in self._configOpts and not opt.startswith('known/'): |
| multi.append([opt, optval]) |
| if self._initOpts: |
| - for opt, optval in self._initOpts.iteritems(): |
| + for opt, optval in self._initOpts.items(): |
| if opt not in self._configOpts and not opt.startswith('known/'): |
| multi.append([opt, optval]) |
| if len(multi) > 1: |
| diff --git a/fail2ban/client/configparserinc.py b/fail2ban/client/configparserinc.py |
| index e0f39579..45c77437 100644 |
| --- a/fail2ban/client/configparserinc.py |
| +++ b/fail2ban/client/configparserinc.py |
| @@ -62,7 +62,7 @@ if sys.version_info >= (3,2): |
| parser, option, accum, rest, section, map, *args, **kwargs) |
| |
| else: # pragma: no cover |
| - from ConfigParser import SafeConfigParser, \ |
| + from configparser import SafeConfigParser, \ |
| InterpolationMissingOptionError, NoOptionError, NoSectionError |
| |
| # Interpolate missing known/option as option from default section |
| @@ -327,7 +327,7 @@ after = 1.conf |
| # mix it with defaults: |
| return set(opts.keys()) | set(self._defaults) |
| # only own option names: |
| - return opts.keys() |
| + return list(opts.keys()) |
| |
| def read(self, filenames, get_includes=True): |
| if not isinstance(filenames, list): |
| @@ -356,7 +356,7 @@ after = 1.conf |
| ret += i |
| # merge defaults and all sections to self: |
| alld.update(cfg.get_defaults()) |
| - for n, s in cfg.get_sections().iteritems(): |
| + for n, s in cfg.get_sections().items(): |
| # conditional sections |
| cond = SafeConfigParserWithIncludes.CONDITIONAL_RE.match(n) |
| if cond: |
| @@ -366,7 +366,7 @@ after = 1.conf |
| del(s['__name__']) |
| except KeyError: |
| pass |
| - for k in s.keys(): |
| + for k in list(s.keys()): |
| v = s.pop(k) |
| s[k + cond] = v |
| s2 = alls.get(n) |
| @@ -399,7 +399,7 @@ after = 1.conf |
| sec.update(options) |
| return |
| sk = {} |
| - for k, v in options.iteritems(): |
| + for k, v in options.items(): |
| if not k.startswith(pref) and k != '__name__': |
| sk[pref+k] = v |
| sec.update(sk) |
| diff --git a/fail2ban/client/configreader.py b/fail2ban/client/configreader.py |
| index 20709b72..b5167409 100644 |
| --- a/fail2ban/client/configreader.py |
| +++ b/fail2ban/client/configreader.py |
| @@ -26,7 +26,7 @@ __license__ = "GPL" |
| |
| import glob |
| import os |
| -from ConfigParser import NoOptionError, NoSectionError |
| +from configparser import NoOptionError, NoSectionError |
| |
| from .configparserinc import sys, SafeConfigParserWithIncludes, logLevel |
| from ..helpers import getLogger, _as_bool, _merge_dicts, substituteRecursiveTags |
| @@ -197,7 +197,7 @@ class ConfigReaderUnshared(SafeConfigParserWithIncludes): |
| config_files += sorted(glob.glob('%s/*.local' % config_dir)) |
| |
| # choose only existing ones |
| - config_files = filter(os.path.exists, config_files) |
| + config_files = list(filter(os.path.exists, config_files)) |
| |
| if len(config_files): |
| # at least one config exists and accessible |
| diff --git a/fail2ban/client/csocket.py b/fail2ban/client/csocket.py |
| index ab3e294b..9417cde9 100644 |
| --- a/fail2ban/client/csocket.py |
| +++ b/fail2ban/client/csocket.py |
| @@ -47,7 +47,7 @@ class CSocket: |
| |
| def send(self, msg, nonblocking=False, timeout=None): |
| # Convert every list member to string |
| - obj = dumps(map(CSocket.convert, msg), HIGHEST_PROTOCOL) |
| + obj = dumps(list(map(CSocket.convert, msg)), HIGHEST_PROTOCOL) |
| self.__csock.send(obj + CSPROTO.END) |
| return self.receive(self.__csock, nonblocking, timeout) |
| |
| @@ -71,7 +71,7 @@ class CSocket: |
| @staticmethod |
| def convert(m): |
| """Convert every "unexpected" member of message to string""" |
| - if isinstance(m, (basestring, bool, int, float, list, dict, set)): |
| + if isinstance(m, (str, bool, int, float, list, dict, set)): |
| return m |
| else: # pragma: no cover |
| return str(m) |
| diff --git a/fail2ban/client/fail2banclient.py b/fail2ban/client/fail2banclient.py |
| index 7c90ca40..7eb11684 100755 |
| --- a/fail2ban/client/fail2banclient.py |
| +++ b/fail2ban/client/fail2banclient.py |
| @@ -45,7 +45,7 @@ def _thread_name(): |
| return threading.current_thread().__class__.__name__ |
| |
| def input_command(): # pragma: no cover |
| - return raw_input(PROMPT) |
| + return input(PROMPT) |
| |
| ## |
| # |
| @@ -444,7 +444,7 @@ class Fail2banClient(Fail2banCmdLine, Thread): |
| return False |
| finally: |
| self._alive = False |
| - for s, sh in _prev_signals.iteritems(): |
| + for s, sh in _prev_signals.items(): |
| signal.signal(s, sh) |
| |
| |
| diff --git a/fail2ban/client/fail2banregex.py b/fail2ban/client/fail2banregex.py |
| index 513b765d..4a71b3c0 100644 |
| --- a/fail2ban/client/fail2banregex.py |
| +++ b/fail2ban/client/fail2banregex.py |
| @@ -41,10 +41,10 @@ import shlex |
| import sys |
| import time |
| import time |
| -import urllib |
| +import urllib.request, urllib.parse, urllib.error |
| from optparse import OptionParser, Option |
| |
| -from ConfigParser import NoOptionError, NoSectionError, MissingSectionHeaderError |
| +from configparser import NoOptionError, NoSectionError, MissingSectionHeaderError |
| |
| try: # pragma: no cover |
| from ..server.filtersystemd import FilterSystemd |
| @@ -68,7 +68,7 @@ def debuggexURL(sample, regex, multiline=False, useDns="yes"): |
| 'flavor': 'python' |
| } |
| if multiline: args['flags'] = 'm' |
| - return 'https://www.debuggex.com/?' + urllib.urlencode(args) |
| + return 'https://www.debuggex.com/?' + urllib.parse.urlencode(args) |
| |
| def output(args): # pragma: no cover (overriden in test-cases) |
| print(args) |
| @@ -244,7 +244,7 @@ class Fail2banRegex(object): |
| |
| def __init__(self, opts): |
| # set local protected members from given options: |
| - self.__dict__.update(dict(('_'+o,v) for o,v in opts.__dict__.iteritems())) |
| + self.__dict__.update(dict(('_'+o,v) for o,v in opts.__dict__.items())) |
| self._opts = opts |
| self._maxlines_set = False # so we allow to override maxlines in cmdline |
| self._datepattern_set = False |
| @@ -304,7 +304,7 @@ class Fail2banRegex(object): |
| realopts = {} |
| combopts = reader.getCombined() |
| # output all options that are specified in filter-argument as well as some special (mostly interested): |
| - for k in ['logtype', 'datepattern'] + fltOpt.keys(): |
| + for k in ['logtype', 'datepattern'] + list(fltOpt.keys()): |
| # combined options win, but they contain only a sub-set in filter expected keys, |
| # so get the rest from definition section: |
| try: |
| @@ -424,7 +424,7 @@ class Fail2banRegex(object): |
| self.output( "Use %11s line : %s" % (regex, shortstr(value)) ) |
| regex_values = {regextype: [RegexStat(value)]} |
| |
| - for regextype, regex_values in regex_values.iteritems(): |
| + for regextype, regex_values in regex_values.items(): |
| regex = regextype + 'regex' |
| setattr(self, "_" + regex, regex_values) |
| for regex in regex_values: |
| @@ -523,10 +523,10 @@ class Fail2banRegex(object): |
| output(ret[1]) |
| elif self._opts.out == 'msg': |
| for ret in ret: |
| - output('\n'.join(map(lambda v:''.join(v for v in v), ret[3].get('matches')))) |
| + output('\n'.join([''.join(v for v in v) for v in ret[3].get('matches')])) |
| elif self._opts.out == 'row': |
| for ret in ret: |
| - output('[%r,\t%r,\t%r],' % (ret[1],ret[2],dict((k,v) for k, v in ret[3].iteritems() if k != 'matches'))) |
| + output('[%r,\t%r,\t%r],' % (ret[1],ret[2],dict((k,v) for k, v in ret[3].items() if k != 'matches'))) |
| else: |
| for ret in ret: |
| output(ret[3].get(self._opts.out)) |
| @@ -565,9 +565,9 @@ class Fail2banRegex(object): |
| ans = [[]] |
| for arg in [l, regexlist]: |
| ans = [ x + [y] for x in ans for y in arg ] |
| - b = map(lambda a: a[0] + ' | ' + a[1].getFailRegex() + ' | ' + |
| + b = [a[0] + ' | ' + a[1].getFailRegex() + ' | ' + |
| debuggexURL(self.encode_line(a[0]), a[1].getFailRegex(), |
| - multiline, self._opts.usedns), ans) |
| + multiline, self._opts.usedns) for a in ans] |
| pprint_list([x.rstrip() for x in b], header) |
| else: |
| output( "%s too many to print. Use --print-all-%s " \ |
| diff --git a/fail2ban/client/filterreader.py b/fail2ban/client/filterreader.py |
| index 413f125e..4f0cc4cf 100644 |
| --- a/fail2ban/client/filterreader.py |
| +++ b/fail2ban/client/filterreader.py |
| @@ -71,7 +71,7 @@ class FilterReader(DefinitionInitConfigReader): |
| @staticmethod |
| def _fillStream(stream, opts, jailName): |
| prio0idx = 0 |
| - for opt, value in opts.iteritems(): |
| + for opt, value in opts.items(): |
| if opt in ("failregex", "ignoreregex"): |
| if value is None: continue |
| multi = [] |
| diff --git a/fail2ban/client/jailreader.py b/fail2ban/client/jailreader.py |
| index 50c1d047..969d0bc0 100644 |
| --- a/fail2ban/client/jailreader.py |
| +++ b/fail2ban/client/jailreader.py |
| @@ -117,7 +117,7 @@ class JailReader(ConfigReader): |
| } |
| _configOpts.update(FilterReader._configOpts) |
| |
| - _ignoreOpts = set(['action', 'filter', 'enabled'] + FilterReader._configOpts.keys()) |
| + _ignoreOpts = set(['action', 'filter', 'enabled'] + list(FilterReader._configOpts.keys())) |
| |
| def getOptions(self): |
| |
| @@ -236,7 +236,7 @@ class JailReader(ConfigReader): |
| stream.extend(self.__filter.convert()) |
| # and using options from jail: |
| FilterReader._fillStream(stream, self.__opts, self.__name) |
| - for opt, value in self.__opts.iteritems(): |
| + for opt, value in self.__opts.items(): |
| if opt == "logpath": |
| if self.__opts.get('backend', '').startswith("systemd"): continue |
| found_files = 0 |
| diff --git a/fail2ban/helpers.py b/fail2ban/helpers.py |
| index 6f2bcdd7..7e563696 100644 |
| --- a/fail2ban/helpers.py |
| +++ b/fail2ban/helpers.py |
| @@ -31,6 +31,7 @@ import traceback |
| from threading import Lock |
| |
| from .server.mytime import MyTime |
| +import importlib |
| |
| try: |
| import ctypes |
| @@ -63,7 +64,7 @@ if sys.version_info < (3,): # pragma: 3.x no cover |
| from imp import load_dynamic as __ldm |
| _sys = __ldm('_sys', 'sys') |
| except ImportError: # pragma: no cover - only if load_dynamic fails |
| - reload(sys) |
| + importlib.reload(sys) |
| _sys = sys |
| if hasattr(_sys, "setdefaultencoding"): |
| _sys.setdefaultencoding(encoding) |
| @@ -101,7 +102,7 @@ if sys.version_info >= (3,): # pragma: 2.x no cover |
| else: # pragma: 3.x no cover |
| def uni_decode(x, enc=PREFER_ENC, errors='strict'): |
| try: |
| - if isinstance(x, unicode): |
| + if isinstance(x, str): |
| return x.encode(enc, errors) |
| return x |
| except (UnicodeDecodeError, UnicodeEncodeError): # pragma: no cover - unsure if reachable |
| @@ -110,7 +111,7 @@ else: # pragma: 3.x no cover |
| return x.encode(enc, 'replace') |
| if sys.getdefaultencoding().upper() != 'UTF-8': # pragma: no cover - utf-8 is default encoding now |
| def uni_string(x): |
| - if not isinstance(x, unicode): |
| + if not isinstance(x, str): |
| return str(x) |
| return x.encode(PREFER_ENC, 'replace') |
| else: |
| @@ -118,7 +119,7 @@ else: # pragma: 3.x no cover |
| |
| |
| def _as_bool(val): |
| - return bool(val) if not isinstance(val, basestring) \ |
| + return bool(val) if not isinstance(val, str) \ |
| else val.lower() in ('1', 'on', 'true', 'yes') |
| |
| |
| @@ -326,7 +327,7 @@ def splitwords(s): |
| """ |
| if not s: |
| return [] |
| - return filter(bool, map(lambda v: v.strip(), re.split('[ ,\n]+', s))) |
| + return list(filter(bool, [v.strip() for v in re.split('[ ,\n]+', s)])) |
| |
| if sys.version_info >= (3,5): |
| eval(compile(r'''if 1: |
| @@ -436,7 +437,7 @@ def substituteRecursiveTags(inptags, conditional='', |
| while True: |
| repFlag = False |
| # substitute each value: |
| - for tag in tags.iterkeys(): |
| + for tag in tags.keys(): |
| # ignore escaped or already done (or in ignore list): |
| if tag in ignore or tag in done: continue |
| # ignore replacing callable items from calling map - should be converted on demand only (by get): |
| @@ -476,7 +477,7 @@ def substituteRecursiveTags(inptags, conditional='', |
| m = tre_search(value, m.end()) |
| continue |
| # if calling map - be sure we've string: |
| - if not isinstance(repl, basestring): repl = uni_string(repl) |
| + if not isinstance(repl, str): repl = uni_string(repl) |
| value = value.replace('<%s>' % rtag, repl) |
| #logSys.log(5, 'value now: %s' % value) |
| # increment reference count: |
| diff --git a/fail2ban/server/action.py b/fail2ban/server/action.py |
| index 5c817fc0..81d50689 100644 |
| --- a/fail2ban/server/action.py |
| +++ b/fail2ban/server/action.py |
| @@ -111,9 +111,9 @@ class CallingMap(MutableMapping, object): |
| def _asdict(self, calculated=False, checker=None): |
| d = dict(self.data, **self.storage) |
| if not calculated: |
| - return dict((n,v) for n,v in d.iteritems() \ |
| + return dict((n,v) for n,v in d.items() \ |
| if not callable(v) or n in self.CM_REPR_ITEMS) |
| - for n,v in d.items(): |
| + for n,v in list(d.items()): |
| if callable(v): |
| try: |
| # calculate: |
| @@ -179,7 +179,7 @@ class CallingMap(MutableMapping, object): |
| return self.__class__(_merge_copy_dicts(self.data, self.storage)) |
| |
| |
| -class ActionBase(object): |
| +class ActionBase(object, metaclass=ABCMeta): |
| """An abstract base class for actions in Fail2Ban. |
| |
| Action Base is a base definition of what methods need to be in |
| @@ -209,7 +209,6 @@ class ActionBase(object): |
| Any additional arguments specified in `jail.conf` or passed |
| via `fail2ban-client` will be passed as keyword arguments. |
| """ |
| - __metaclass__ = ABCMeta |
| |
| @classmethod |
| def __subclasshook__(cls, C): |
| @@ -420,7 +419,7 @@ class CommandAction(ActionBase): |
| if not callable(family): # pragma: no cover |
| return self.__substCache.get(key, {}).get(family) |
| # family as expression - use it to filter values: |
| - return [v for f, v in self.__substCache.get(key, {}).iteritems() if family(f)] |
| + return [v for f, v in self.__substCache.get(key, {}).items() if family(f)] |
| cmd = args[0] |
| if cmd: # set: |
| try: |
| @@ -432,7 +431,7 @@ class CommandAction(ActionBase): |
| try: |
| famd = self.__substCache[key] |
| cmd = famd.pop(family) |
| - for family, v in famd.items(): |
| + for family, v in list(famd.items()): |
| if v == cmd: |
| del famd[family] |
| except KeyError: # pragma: no cover |
| @@ -448,7 +447,7 @@ class CommandAction(ActionBase): |
| res = True |
| err = 'Script error' |
| if not family: # all started: |
| - family = [famoper for (famoper,v) in self.__started.iteritems() if v] |
| + family = [famoper for (famoper,v) in self.__started.items() if v] |
| for famoper in family: |
| try: |
| cmd = self._getOperation(tag, famoper) |
| @@ -617,7 +616,7 @@ class CommandAction(ActionBase): |
| and executes the resulting command. |
| """ |
| # collect started families, may be started on demand (conditional): |
| - family = [f for (f,v) in self.__started.iteritems() if v & 3 == 3]; # started and contains items |
| + family = [f for (f,v) in self.__started.items() if v & 3 == 3]; # started and contains items |
| # if nothing contains items: |
| if not family: return True |
| # flush: |
| @@ -642,7 +641,7 @@ class CommandAction(ActionBase): |
| """ |
| # collect started families, if started on demand (conditional): |
| if family is None: |
| - family = [f for (f,v) in self.__started.iteritems() if v] |
| + family = [f for (f,v) in self.__started.items() if v] |
| # if no started (on demand) actions: |
| if not family: return True |
| self.__started = {} |
| @@ -676,7 +675,7 @@ class CommandAction(ActionBase): |
| ret = True |
| # for each started family: |
| if self.actioncheck: |
| - for (family, started) in self.__started.items(): |
| + for (family, started) in list(self.__started.items()): |
| if started and not self._invariantCheck(family, beforeRepair): |
| # reset started flag and command of executed operation: |
| self.__started[family] = 0 |
| diff --git a/fail2ban/server/actions.py b/fail2ban/server/actions.py |
| index 24fea838..94b9c3ed 100644 |
| --- a/fail2ban/server/actions.py |
| +++ b/fail2ban/server/actions.py |
| @@ -156,11 +156,11 @@ class Actions(JailThread, Mapping): |
| else: |
| if hasattr(self, '_reload_actions'): |
| # reload actions after all parameters set via stream: |
| - for name, initOpts in self._reload_actions.iteritems(): |
| + for name, initOpts in self._reload_actions.items(): |
| if name in self._actions: |
| self._actions[name].reload(**(initOpts if initOpts else {})) |
| # remove obsolete actions (untouched by reload process): |
| - delacts = OrderedDict((name, action) for name, action in self._actions.iteritems() |
| + delacts = OrderedDict((name, action) for name, action in self._actions.items() |
| if name not in self._reload_actions) |
| if len(delacts): |
| # unban all tickets using removed actions only: |
| @@ -289,7 +289,7 @@ class Actions(JailThread, Mapping): |
| """ |
| if actions is None: |
| actions = self._actions |
| - revactions = actions.items() |
| + revactions = list(actions.items()) |
| revactions.reverse() |
| for name, action in revactions: |
| try: |
| @@ -314,7 +314,7 @@ class Actions(JailThread, Mapping): |
| True when the thread exits nicely. |
| """ |
| cnt = 0 |
| - for name, action in self._actions.iteritems(): |
| + for name, action in self._actions.items(): |
| try: |
| action.start() |
| except Exception as e: |
| @@ -474,7 +474,7 @@ class Actions(JailThread, Mapping): |
| Observers.Main.add('banFound', bTicket, self._jail, btime) |
| logSys.notice("[%s] %sBan %s", self._jail.name, ('' if not bTicket.restored else 'Restore '), ip) |
| # do actions : |
| - for name, action in self._actions.iteritems(): |
| + for name, action in self._actions.items(): |
| try: |
| if ticket.restored and getattr(action, 'norestored', False): |
| continue |
| @@ -511,13 +511,13 @@ class Actions(JailThread, Mapping): |
| if bTicket.banEpoch == self.banEpoch and diftm > 3: |
| # avoid too often checks: |
| if not rebanacts and MyTime.time() > self.__lastConsistencyCheckTM + 3: |
| - for action in self._actions.itervalues(): |
| + for action in self._actions.values(): |
| action.consistencyCheck() |
| self.__lastConsistencyCheckTM = MyTime.time() |
| # check epoch in order to reban it: |
| if bTicket.banEpoch < self.banEpoch: |
| if not rebanacts: rebanacts = dict( |
| - (name, action) for name, action in self._actions.iteritems() |
| + (name, action) for name, action in self._actions.items() |
| if action.banEpoch > bTicket.banEpoch) |
| cnt += self.__reBan(bTicket, actions=rebanacts) |
| else: # pragma: no cover - unexpected: ticket is not banned for some reasons - reban using all actions: |
| @@ -542,8 +542,8 @@ class Actions(JailThread, Mapping): |
| ip = ticket.getIP() |
| aInfo = self.__getActionInfo(ticket) |
| if log: |
| - logSys.notice("[%s] Reban %s%s", self._jail.name, aInfo["ip"], (', action %r' % actions.keys()[0] if len(actions) == 1 else '')) |
| - for name, action in actions.iteritems(): |
| + logSys.notice("[%s] Reban %s%s", self._jail.name, aInfo["ip"], (', action %r' % list(actions.keys())[0] if len(actions) == 1 else '')) |
| + for name, action in actions.items(): |
| try: |
| logSys.debug("[%s] action %r: reban %s", self._jail.name, name, ip) |
| if not aInfo.immutable: aInfo.reset() |
| @@ -567,7 +567,7 @@ class Actions(JailThread, Mapping): |
| if not self.__banManager._inBanList(ticket): return |
| # do actions : |
| aInfo = None |
| - for name, action in self._actions.iteritems(): |
| + for name, action in self._actions.items(): |
| try: |
| if ticket.restored and getattr(action, 'norestored', False): |
| continue |
| @@ -616,7 +616,7 @@ class Actions(JailThread, Mapping): |
| cnt = 0 |
| # first we'll execute flush for actions supporting this operation: |
| unbactions = {} |
| - for name, action in (actions if actions is not None else self._actions).iteritems(): |
| + for name, action in (actions if actions is not None else self._actions).items(): |
| try: |
| if hasattr(action, 'flush') and (not isinstance(action, CommandAction) or action.actionflush): |
| logSys.notice("[%s] Flush ticket(s) with %s", self._jail.name, name) |
| @@ -671,7 +671,7 @@ class Actions(JailThread, Mapping): |
| aInfo = self.__getActionInfo(ticket) |
| if log: |
| logSys.notice("[%s] Unban %s", self._jail.name, aInfo["ip"]) |
| - for name, action in unbactions.iteritems(): |
| + for name, action in unbactions.items(): |
| try: |
| logSys.debug("[%s] action %r: unban %s", self._jail.name, name, ip) |
| if not aInfo.immutable: aInfo.reset() |
| diff --git a/fail2ban/server/asyncserver.py b/fail2ban/server/asyncserver.py |
| index e3400737..f5f9740b 100644 |
| --- a/fail2ban/server/asyncserver.py |
| +++ b/fail2ban/server/asyncserver.py |
| @@ -178,7 +178,7 @@ def loop(active, timeout=None, use_poll=False, err_count=None): |
| elif err_count['listen'] > 100: # pragma: no cover - normally unreachable |
| if ( |
| e.args[0] == errno.EMFILE # [Errno 24] Too many open files |
| - or sum(err_count.itervalues()) > 1000 |
| + or sum(err_count.values()) > 1000 |
| ): |
| logSys.critical("Too many errors - critical count reached %r", err_count) |
| break |
| @@ -220,7 +220,7 @@ class AsyncServer(asyncore.dispatcher): |
| elif self.__errCount['accept'] > 100: |
| if ( |
| (isinstance(e, socket.error) and e.args[0] == errno.EMFILE) # [Errno 24] Too many open files |
| - or sum(self.__errCount.itervalues()) > 1000 |
| + or sum(self.__errCount.values()) > 1000 |
| ): |
| logSys.critical("Too many errors - critical count reached %r", self.__errCount) |
| self.stop() |
| diff --git a/fail2ban/server/banmanager.py b/fail2ban/server/banmanager.py |
| index 5770bfd7..9bb44971 100644 |
| --- a/fail2ban/server/banmanager.py |
| +++ b/fail2ban/server/banmanager.py |
| @@ -105,9 +105,9 @@ class BanManager: |
| def getBanList(self, ordered=False, withTime=False): |
| with self.__lock: |
| if not ordered: |
| - return self.__banList.keys() |
| + return list(self.__banList.keys()) |
| lst = [] |
| - for ticket in self.__banList.itervalues(): |
| + for ticket in self.__banList.values(): |
| eob = ticket.getEndOfBanTime(self.__banTime) |
| lst.append((ticket,eob)) |
| lst.sort(key=lambda t: t[1]) |
| @@ -126,7 +126,7 @@ class BanManager: |
| |
| def __iter__(self): |
| with self.__lock: |
| - return self.__banList.itervalues() |
| + return iter(self.__banList.values()) |
| |
| ## |
| # Returns normalized value |
| @@ -165,7 +165,7 @@ class BanManager: |
| return return_dict |
| # get ips in lock: |
| with self.__lock: |
| - banIPs = [banData.getIP() for banData in self.__banList.values()] |
| + banIPs = [banData.getIP() for banData in list(self.__banList.values())] |
| # get cymru info: |
| try: |
| for ip in banIPs: |
| @@ -341,7 +341,7 @@ class BanManager: |
| # Gets the list of ticket to remove (thereby correct next unban time). |
| unBanList = {} |
| nextUnbanTime = BanTicket.MAX_TIME |
| - for fid,ticket in self.__banList.iteritems(): |
| + for fid,ticket in self.__banList.items(): |
| # current time greater as end of ban - timed out: |
| eob = ticket.getEndOfBanTime(self.__banTime) |
| if time > eob: |
| @@ -357,15 +357,15 @@ class BanManager: |
| if len(unBanList): |
| if len(unBanList) / 2.0 <= len(self.__banList) / 3.0: |
| # few as 2/3 should be removed - remove particular items: |
| - for fid in unBanList.iterkeys(): |
| + for fid in unBanList.keys(): |
| del self.__banList[fid] |
| else: |
| # create new dictionary without items to be deleted: |
| - self.__banList = dict((fid,ticket) for fid,ticket in self.__banList.iteritems() \ |
| + self.__banList = dict((fid,ticket) for fid,ticket in self.__banList.items() \ |
| if fid not in unBanList) |
| |
| # return list of tickets: |
| - return unBanList.values() |
| + return list(unBanList.values()) |
| |
| ## |
| # Flush the ban list. |
| @@ -375,7 +375,7 @@ class BanManager: |
| |
| def flushBanList(self): |
| with self.__lock: |
| - uBList = self.__banList.values() |
| + uBList = list(self.__banList.values()) |
| self.__banList = dict() |
| return uBList |
| |
| diff --git a/fail2ban/server/database.py b/fail2ban/server/database.py |
| index ed736a7a..0e8c9aec 100644 |
| --- a/fail2ban/server/database.py |
| +++ b/fail2ban/server/database.py |
| @@ -67,13 +67,13 @@ if sys.version_info >= (3,): # pragma: 2.x no cover |
| else: # pragma: 3.x no cover |
| def _normalize(x): |
| if isinstance(x, dict): |
| - return dict((_normalize(k), _normalize(v)) for k, v in x.iteritems()) |
| + return dict((_normalize(k), _normalize(v)) for k, v in x.items()) |
| elif isinstance(x, (list, set)): |
| return [_normalize(element) for element in x] |
| - elif isinstance(x, unicode): |
| + elif isinstance(x, str): |
| # in 2.x default text_factory is unicode - so return proper unicode here: |
| return x.encode(PREFER_ENC, 'replace').decode(PREFER_ENC) |
| - elif isinstance(x, basestring): |
| + elif isinstance(x, str): |
| return x.decode(PREFER_ENC, 'replace') |
| return x |
| |
| diff --git a/fail2ban/server/failmanager.py b/fail2ban/server/failmanager.py |
| index 93c028fb..a9c6b5f6 100644 |
| --- a/fail2ban/server/failmanager.py |
| +++ b/fail2ban/server/failmanager.py |
| @@ -57,7 +57,7 @@ class FailManager: |
| def getFailCount(self): |
| # may be slow on large list of failures, should be used for test purposes only... |
| with self.__lock: |
| - return len(self.__failList), sum([f.getRetry() for f in self.__failList.values()]) |
| + return len(self.__failList), sum([f.getRetry() for f in list(self.__failList.values())]) |
| |
| def getFailTotal(self): |
| with self.__lock: |
| @@ -125,7 +125,7 @@ class FailManager: |
| # in case of having many active failures, it should be ran only |
| # if debug level is "low" enough |
| failures_summary = ', '.join(['%s:%d' % (k, v.getRetry()) |
| - for k,v in self.__failList.iteritems()]) |
| + for k,v in self.__failList.items()]) |
| logSys.log(logLevel, "Total # of detected failures: %d. Current failures from %d IPs (IP:count): %s" |
| % (self.__failTotal, len(self.__failList), failures_summary)) |
| |
| @@ -138,7 +138,7 @@ class FailManager: |
| |
| def cleanup(self, time): |
| with self.__lock: |
| - todelete = [fid for fid,item in self.__failList.iteritems() \ |
| + todelete = [fid for fid,item in self.__failList.items() \ |
| if item.getLastTime() + self.__maxTime <= time] |
| if len(todelete) == len(self.__failList): |
| # remove all: |
| @@ -152,7 +152,7 @@ class FailManager: |
| del self.__failList[fid] |
| else: |
| # create new dictionary without items to be deleted: |
| - self.__failList = dict((fid,item) for fid,item in self.__failList.iteritems() \ |
| + self.__failList = dict((fid,item) for fid,item in self.__failList.items() \ |
| if item.getLastTime() + self.__maxTime > time) |
| self.__bgSvc.service() |
| |
| diff --git a/fail2ban/server/failregex.py b/fail2ban/server/failregex.py |
| index f7dafbef..fb75187d 100644 |
| --- a/fail2ban/server/failregex.py |
| +++ b/fail2ban/server/failregex.py |
| @@ -128,10 +128,7 @@ class Regex: |
| self._regexObj = re.compile(regex, re.MULTILINE if multiline else 0) |
| self._regex = regex |
| self._altValues = {} |
| - for k in filter( |
| - lambda k: len(k) > len(ALTNAME_PRE) and k.startswith(ALTNAME_PRE), |
| - self._regexObj.groupindex |
| - ): |
| + for k in [k for k in self._regexObj.groupindex if len(k) > len(ALTNAME_PRE) and k.startswith(ALTNAME_PRE)]: |
| n = ALTNAME_CRE.match(k).group(1) |
| self._altValues[k] = n |
| self._altValues = list(self._altValues.items()) if len(self._altValues) else None |
| @@ -211,7 +208,7 @@ class Regex: |
| # |
| @staticmethod |
| def _tupleLinesBuf(tupleLines): |
| - return "\n".join(map(lambda v: "".join(v[::2]), tupleLines)) + "\n" |
| + return "\n".join(["".join(v[::2]) for v in tupleLines]) + "\n" |
| |
| ## |
| # Searches the regular expression. |
| @@ -223,7 +220,7 @@ class Regex: |
| |
| def search(self, tupleLines, orgLines=None): |
| buf = tupleLines |
| - if not isinstance(tupleLines, basestring): |
| + if not isinstance(tupleLines, str): |
| buf = Regex._tupleLinesBuf(tupleLines) |
| self._matchCache = self._regexObj.search(buf) |
| if self._matchCache: |
| diff --git a/fail2ban/server/filter.py b/fail2ban/server/filter.py |
| index 998fe298..d181fd38 100644 |
| --- a/fail2ban/server/filter.py |
| +++ b/fail2ban/server/filter.py |
| @@ -292,7 +292,7 @@ class Filter(JailThread): |
| dd = DateDetector() |
| dd.default_tz = self.__logtimezone |
| if not isinstance(pattern, (list, tuple)): |
| - pattern = filter(bool, map(str.strip, re.split('\n+', pattern))) |
| + pattern = list(filter(bool, list(map(str.strip, re.split('\n+', pattern))))) |
| for pattern in pattern: |
| dd.appendTemplate(pattern) |
| self.dateDetector = dd |
| @@ -987,7 +987,7 @@ class FileFilter(Filter): |
| # @return log paths |
| |
| def getLogPaths(self): |
| - return self.__logs.keys() |
| + return list(self.__logs.keys()) |
| |
| ## |
| # Get the log containers |
| @@ -995,7 +995,7 @@ class FileFilter(Filter): |
| # @return log containers |
| |
| def getLogs(self): |
| - return self.__logs.values() |
| + return list(self.__logs.values()) |
| |
| ## |
| # Get the count of log containers |
| @@ -1021,7 +1021,7 @@ class FileFilter(Filter): |
| |
| def setLogEncoding(self, encoding): |
| encoding = super(FileFilter, self).setLogEncoding(encoding) |
| - for log in self.__logs.itervalues(): |
| + for log in self.__logs.values(): |
| log.setEncoding(encoding) |
| |
| def getLog(self, path): |
| @@ -1183,7 +1183,7 @@ class FileFilter(Filter): |
| """Status of Filter plus files being monitored. |
| """ |
| ret = super(FileFilter, self).status(flavor=flavor) |
| - path = self.__logs.keys() |
| + path = list(self.__logs.keys()) |
| ret.append(("File list", path)) |
| return ret |
| |
| @@ -1191,7 +1191,7 @@ class FileFilter(Filter): |
| """Stop monitoring of log-file(s) |
| """ |
| # stop files monitoring: |
| - for path in self.__logs.keys(): |
| + for path in list(self.__logs.keys()): |
| self.delLogPath(path) |
| # stop thread: |
| super(Filter, self).stop() |
| diff --git a/fail2ban/server/filterpoll.py b/fail2ban/server/filterpoll.py |
| index 228a2c8b..d49315cc 100644 |
| --- a/fail2ban/server/filterpoll.py |
| +++ b/fail2ban/server/filterpoll.py |
| @@ -176,4 +176,4 @@ class FilterPoll(FileFilter): |
| return False |
| |
| def getPendingPaths(self): |
| - return self.__file404Cnt.keys() |
| + return list(self.__file404Cnt.keys()) |
| diff --git a/fail2ban/server/filterpyinotify.py b/fail2ban/server/filterpyinotify.py |
| index ca6b253f..b683b860 100644 |
| --- a/fail2ban/server/filterpyinotify.py |
| +++ b/fail2ban/server/filterpyinotify.py |
| @@ -158,7 +158,7 @@ class FilterPyinotify(FileFilter): |
| except KeyError: pass |
| |
| def getPendingPaths(self): |
| - return self.__pending.keys() |
| + return list(self.__pending.keys()) |
| |
| def _checkPending(self): |
| if not self.__pending: |
| @@ -168,7 +168,7 @@ class FilterPyinotify(FileFilter): |
| return |
| found = {} |
| minTime = 60 |
| - for path, (retardTM, isDir) in self.__pending.iteritems(): |
| + for path, (retardTM, isDir) in self.__pending.items(): |
| if ntm - self.__pendingChkTime < retardTM: |
| if minTime > retardTM: minTime = retardTM |
| continue |
| @@ -184,7 +184,7 @@ class FilterPyinotify(FileFilter): |
| self.__pendingChkTime = time.time() |
| self.__pendingMinTime = minTime |
| # process now because we've missed it in monitoring: |
| - for path, isDir in found.iteritems(): |
| + for path, isDir in found.items(): |
| self._delPending(path) |
| # refresh monitoring of this: |
| self._refreshWatcher(path, isDir=isDir) |
| diff --git a/fail2ban/server/ipdns.py b/fail2ban/server/ipdns.py |
| index 6648dac6..fe8f8db8 100644 |
| --- a/fail2ban/server/ipdns.py |
| +++ b/fail2ban/server/ipdns.py |
| @@ -275,7 +275,7 @@ class IPAddr(object): |
| raise ValueError("invalid ipstr %r, too many plen representation" % (ipstr,)) |
| if "." in s[1] or ":" in s[1]: # 255.255.255.0 resp. ffff:: style mask |
| s[1] = IPAddr.masktoplen(s[1]) |
| - s[1] = long(s[1]) |
| + s[1] = int(s[1]) |
| return s |
| |
| def __init(self, ipstr, cidr=CIDR_UNSPEC): |
| @@ -309,7 +309,7 @@ class IPAddr(object): |
| |
| # mask out host portion if prefix length is supplied |
| if cidr is not None and cidr >= 0: |
| - mask = ~(0xFFFFFFFFL >> cidr) |
| + mask = ~(0xFFFFFFFF >> cidr) |
| self._addr &= mask |
| self._plen = cidr |
| |
| @@ -321,13 +321,13 @@ class IPAddr(object): |
| |
| # mask out host portion if prefix length is supplied |
| if cidr is not None and cidr >= 0: |
| - mask = ~(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFL >> cidr) |
| + mask = ~(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF >> cidr) |
| self._addr &= mask |
| self._plen = cidr |
| |
| # if IPv6 address is a IPv4-compatible, make instance a IPv4 |
| elif self.isInNet(IPAddr.IP6_4COMPAT): |
| - self._addr = lo & 0xFFFFFFFFL |
| + self._addr = lo & 0xFFFFFFFF |
| self._family = socket.AF_INET |
| self._plen = 32 |
| else: |
| @@ -445,7 +445,7 @@ class IPAddr(object): |
| elif self.isIPv6: |
| # convert network to host byte order |
| hi = self._addr >> 64 |
| - lo = self._addr & 0xFFFFFFFFFFFFFFFFL |
| + lo = self._addr & 0xFFFFFFFFFFFFFFFF |
| binary = struct.pack("!QQ", hi, lo) |
| if self._plen and self._plen < 128: |
| add = "/%d" % self._plen |
| @@ -503,9 +503,9 @@ class IPAddr(object): |
| if self.family != net.family: |
| return False |
| if self.isIPv4: |
| - mask = ~(0xFFFFFFFFL >> net.plen) |
| + mask = ~(0xFFFFFFFF >> net.plen) |
| elif self.isIPv6: |
| - mask = ~(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFL >> net.plen) |
| + mask = ~(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF >> net.plen) |
| else: |
| return False |
| |
| @@ -517,7 +517,7 @@ class IPAddr(object): |
| m4 = (1 << 32)-1 |
| mmap = {m6: 128, m4: 32, 0: 0} |
| m = 0 |
| - for i in xrange(0, 128): |
| + for i in range(0, 128): |
| m |= 1 << i |
| if i < 32: |
| mmap[m ^ m4] = 32-1-i |
| diff --git a/fail2ban/server/jail.py b/fail2ban/server/jail.py |
| index ce9968a8..5fa5ef10 100644 |
| --- a/fail2ban/server/jail.py |
| +++ b/fail2ban/server/jail.py |
| @@ -26,7 +26,7 @@ __license__ = "GPL" |
| import logging |
| import math |
| import random |
| -import Queue |
| +import queue |
| |
| from .actions import Actions |
| from ..helpers import getLogger, _as_bool, extractOptions, MyTime |
| @@ -76,7 +76,7 @@ class Jail(object): |
| "might not function correctly. Please shorten" |
| % name) |
| self.__name = name |
| - self.__queue = Queue.Queue() |
| + self.__queue = queue.Queue() |
| self.__filter = None |
| # Extra parameters for increase ban time |
| self._banExtra = {}; |
| @@ -127,25 +127,25 @@ class Jail(object): |
| "Failed to initialize any backend for Jail %r" % self.name) |
| |
| def _initPolling(self, **kwargs): |
| - from filterpoll import FilterPoll |
| + from .filterpoll import FilterPoll |
| logSys.info("Jail '%s' uses poller %r" % (self.name, kwargs)) |
| self.__filter = FilterPoll(self, **kwargs) |
| |
| def _initGamin(self, **kwargs): |
| # Try to import gamin |
| - from filtergamin import FilterGamin |
| + from .filtergamin import FilterGamin |
| logSys.info("Jail '%s' uses Gamin %r" % (self.name, kwargs)) |
| self.__filter = FilterGamin(self, **kwargs) |
| |
| def _initPyinotify(self, **kwargs): |
| # Try to import pyinotify |
| - from filterpyinotify import FilterPyinotify |
| + from .filterpyinotify import FilterPyinotify |
| logSys.info("Jail '%s' uses pyinotify %r" % (self.name, kwargs)) |
| self.__filter = FilterPyinotify(self, **kwargs) |
| |
| def _initSystemd(self, **kwargs): # pragma: systemd no cover |
| # Try to import systemd |
| - from filtersystemd import FilterSystemd |
| + from .filtersystemd import FilterSystemd |
| logSys.info("Jail '%s' uses systemd %r" % (self.name, kwargs)) |
| self.__filter = FilterSystemd(self, **kwargs) |
| |
| @@ -213,7 +213,7 @@ class Jail(object): |
| try: |
| ticket = self.__queue.get(False) |
| return ticket |
| - except Queue.Empty: |
| + except queue.Empty: |
| return False |
| |
| def setBanTimeExtra(self, opt, value): |
| diff --git a/fail2ban/server/mytime.py b/fail2ban/server/mytime.py |
| index 98b69bd4..24bba5cf 100644 |
| --- a/fail2ban/server/mytime.py |
| +++ b/fail2ban/server/mytime.py |
| @@ -162,7 +162,7 @@ class MyTime: |
| |
| @returns number (calculated seconds from expression "val") |
| """ |
| - if isinstance(val, (int, long, float, complex)): |
| + if isinstance(val, (int, float, complex)): |
| return val |
| # replace together standing abbreviations, example '1d12h' -> '1d 12h': |
| val = MyTime._str2sec_prep.sub(r" \1", val) |
| diff --git a/fail2ban/server/server.py b/fail2ban/server/server.py |
| index 159f6506..fc948e8c 100644 |
| --- a/fail2ban/server/server.py |
| +++ b/fail2ban/server/server.py |
| @@ -97,7 +97,7 @@ class Server: |
| |
| def start(self, sock, pidfile, force=False, observer=True, conf={}): |
| # First set the mask to only allow access to owner |
| - os.umask(0077) |
| + os.umask(0o077) |
| # Second daemonize before logging etc, because it will close all handles: |
| if self.__daemon: # pragma: no cover |
| logSys.info("Starting in daemon mode") |
| @@ -190,7 +190,7 @@ class Server: |
| |
| # Restore default signal handlers: |
| if _thread_name() == '_MainThread': |
| - for s, sh in self.__prev_signals.iteritems(): |
| + for s, sh in self.__prev_signals.items(): |
| signal.signal(s, sh) |
| |
| # Give observer a small chance to complete its work before exit |
| @@ -268,10 +268,10 @@ class Server: |
| logSys.info("Stopping all jails") |
| with self.__lock: |
| # 1st stop all jails (signal and stop actions/filter thread): |
| - for name in self.__jails.keys(): |
| + for name in list(self.__jails.keys()): |
| self.delJail(name, stop=True, join=False) |
| # 2nd wait for end and delete jails: |
| - for name in self.__jails.keys(): |
| + for name in list(self.__jails.keys()): |
| self.delJail(name, stop=False, join=True) |
| |
| def reloadJails(self, name, opts, begin): |
| @@ -302,7 +302,7 @@ class Server: |
| if "--restart" in opts: |
| self.stopAllJail() |
| # first set all affected jail(s) to idle and reset filter regex and other lists/dicts: |
| - for jn, jail in self.__jails.iteritems(): |
| + for jn, jail in self.__jails.items(): |
| if name == '--all' or jn == name: |
| jail.idle = True |
| self.__reload_state[jn] = jail |
| @@ -313,7 +313,7 @@ class Server: |
| # end reload, all affected (or new) jails have already all new parameters (via stream) and (re)started: |
| with self.__lock: |
| deljails = [] |
| - for jn, jail in self.__jails.iteritems(): |
| + for jn, jail in self.__jails.items(): |
| # still in reload state: |
| if jn in self.__reload_state: |
| # remove jails that are not reloaded (untouched, so not in new configuration) |
| @@ -513,7 +513,7 @@ class Server: |
| jails = [self.__jails[name]] |
| else: |
| # in all jails: |
| - jails = self.__jails.values() |
| + jails = list(self.__jails.values()) |
| # unban given or all (if value is None): |
| cnt = 0 |
| ifexists |= (name is None) |
| @@ -551,7 +551,7 @@ class Server: |
| def isAlive(self, jailnum=None): |
| if jailnum is not None and len(self.__jails) != jailnum: |
| return 0 |
| - for jail in self.__jails.values(): |
| + for jail in list(self.__jails.values()): |
| if not jail.isAlive(): |
| return 0 |
| return 1 |
| @@ -759,7 +759,7 @@ class Server: |
| return "flushed" |
| |
| def setThreadOptions(self, value): |
| - for o, v in value.iteritems(): |
| + for o, v in value.items(): |
| if o == 'stacksize': |
| threading.stack_size(int(v)*1024) |
| else: # pragma: no cover |
| diff --git a/fail2ban/server/strptime.py b/fail2ban/server/strptime.py |
| index 498d284b..a5579fdc 100644 |
| --- a/fail2ban/server/strptime.py |
| +++ b/fail2ban/server/strptime.py |
| @@ -79,7 +79,7 @@ timeRE['ExY'] = r"(?P<Y>%s\d)" % _getYearCentRE(cent=(0,3), distance=3) |
| timeRE['Exy'] = r"(?P<y>%s\d)" % _getYearCentRE(cent=(2,3), distance=3) |
| |
| def getTimePatternRE(): |
| - keys = timeRE.keys() |
| + keys = list(timeRE.keys()) |
| patt = (r"%%(%%|%s|[%s])" % ( |
| "|".join([k for k in keys if len(k) > 1]), |
| "".join([k for k in keys if len(k) == 1]), |
| @@ -134,7 +134,7 @@ def zone2offset(tz, dt): |
| """ |
| if isinstance(tz, int): |
| return tz |
| - if isinstance(tz, basestring): |
| + if isinstance(tz, str): |
| return validateTimeZone(tz) |
| tz, tzo = tz |
| if tzo is None or tzo == '': # without offset |
| @@ -171,7 +171,7 @@ def reGroupDictStrptime(found_dict, msec=False, default_tz=None): |
| year = month = day = hour = minute = tzoffset = \ |
| weekday = julian = week_of_year = None |
| second = fraction = 0 |
| - for key, val in found_dict.iteritems(): |
| + for key, val in found_dict.items(): |
| if val is None: continue |
| # Directives not explicitly handled below: |
| # c, x, X |
| diff --git a/fail2ban/server/ticket.py b/fail2ban/server/ticket.py |
| index f67e0d23..f0b727c2 100644 |
| --- a/fail2ban/server/ticket.py |
| +++ b/fail2ban/server/ticket.py |
| @@ -55,7 +55,7 @@ class Ticket(object): |
| self._time = time if time is not None else MyTime.time() |
| self._data = {'matches': matches or [], 'failures': 0} |
| if data is not None: |
| - for k,v in data.iteritems(): |
| + for k,v in data.items(): |
| if v is not None: |
| self._data[k] = v |
| if ticket: |
| @@ -89,7 +89,7 @@ class Ticket(object): |
| |
| def setIP(self, value): |
| # guarantee using IPAddr instead of unicode, str for the IP |
| - if isinstance(value, basestring): |
| + if isinstance(value, str): |
| value = IPAddr(value) |
| self._ip = value |
| |
| @@ -181,7 +181,7 @@ class Ticket(object): |
| if len(args) == 1: |
| # todo: if support >= 2.7 only: |
| # self._data = {k:v for k,v in args[0].iteritems() if v is not None} |
| - self._data = dict([(k,v) for k,v in args[0].iteritems() if v is not None]) |
| + self._data = dict([(k,v) for k,v in args[0].items() if v is not None]) |
| # add k,v list or dict (merge): |
| elif len(args) == 2: |
| self._data.update((args,)) |
| @@ -192,7 +192,7 @@ class Ticket(object): |
| # filter (delete) None values: |
| # todo: if support >= 2.7 only: |
| # self._data = {k:v for k,v in self._data.iteritems() if v is not None} |
| - self._data = dict([(k,v) for k,v in self._data.iteritems() if v is not None]) |
| + self._data = dict([(k,v) for k,v in self._data.items() if v is not None]) |
| |
| def getData(self, key=None, default=None): |
| # return whole data dict: |
| @@ -201,17 +201,17 @@ class Ticket(object): |
| # return default if not exists: |
| if not self._data: |
| return default |
| - if not isinstance(key,(str,unicode,type(None),int,float,bool,complex)): |
| + if not isinstance(key,(str,type(None),int,float,bool,complex)): |
| # return filtered by lambda/function: |
| if callable(key): |
| # todo: if support >= 2.7 only: |
| # return {k:v for k,v in self._data.iteritems() if key(k)} |
| - return dict([(k,v) for k,v in self._data.iteritems() if key(k)]) |
| + return dict([(k,v) for k,v in self._data.items() if key(k)]) |
| # return filtered by keys: |
| if hasattr(key, '__iter__'): |
| # todo: if support >= 2.7 only: |
| # return {k:v for k,v in self._data.iteritems() if k in key} |
| - return dict([(k,v) for k,v in self._data.iteritems() if k in key]) |
| + return dict([(k,v) for k,v in self._data.items() if k in key]) |
| # return single value of data: |
| return self._data.get(key, default) |
| |
| diff --git a/fail2ban/server/transmitter.py b/fail2ban/server/transmitter.py |
| index f83e9d5f..80726cb4 100644 |
| --- a/fail2ban/server/transmitter.py |
| +++ b/fail2ban/server/transmitter.py |
| @@ -475,7 +475,7 @@ class Transmitter: |
| opt = command[1][len("bantime."):] |
| return self.__server.getBanTimeExtra(name, opt) |
| elif command[1] == "actions": |
| - return self.__server.getActions(name).keys() |
| + return list(self.__server.getActions(name).keys()) |
| elif command[1] == "action": |
| actionname = command[2] |
| actionvalue = command[3] |
| diff --git a/fail2ban/server/utils.py b/fail2ban/server/utils.py |
| index d4461a7d..13c24e76 100644 |
| --- a/fail2ban/server/utils.py |
| +++ b/fail2ban/server/utils.py |
| @@ -57,7 +57,7 @@ _RETCODE_HINTS = { |
| |
| # Dictionary to lookup signal name from number |
| signame = dict((num, name) |
| - for name, num in signal.__dict__.iteritems() if name.startswith("SIG")) |
| + for name, num in signal.__dict__.items() if name.startswith("SIG")) |
| |
| class Utils(): |
| """Utilities provide diverse static methods like executes OS shell commands, etc. |
| @@ -109,7 +109,7 @@ class Utils(): |
| break |
| else: # pragma: 3.x no cover (dict is in 2.6 only) |
| remlst = [] |
| - for (ck, cv) in cache.iteritems(): |
| + for (ck, cv) in cache.items(): |
| # if expired: |
| if cv[1] <= t: |
| remlst.append(ck) |
| @@ -152,7 +152,7 @@ class Utils(): |
| if not isinstance(realCmd, list): |
| realCmd = [realCmd] |
| i = len(realCmd)-1 |
| - for k, v in varsDict.iteritems(): |
| + for k, v in varsDict.items(): |
| varsStat += "%s=$%s " % (k, i) |
| realCmd.append(v) |
| i += 1 |
| diff --git a/fail2ban/tests/action_d/test_badips.py b/fail2ban/tests/action_d/test_badips.py |
| index 013c0fdb..3c35e4d7 100644 |
| --- a/fail2ban/tests/action_d/test_badips.py |
| +++ b/fail2ban/tests/action_d/test_badips.py |
| @@ -32,7 +32,7 @@ from ..utils import LogCaptureTestCase, CONFIG_DIR |
| if sys.version_info >= (3, ): # pragma: 2.x no cover |
| from urllib.error import HTTPError, URLError |
| else: # pragma: 3.x no cover |
| - from urllib2 import HTTPError, URLError |
| + from urllib.error import HTTPError, URLError |
| |
| def skip_if_not_available(f): |
| """Helper to decorate tests to skip in case of timeout/http-errors like "502 bad gateway". |
| diff --git a/fail2ban/tests/actiontestcase.py b/fail2ban/tests/actiontestcase.py |
| index 1a00c040..ecd09246 100644 |
| --- a/fail2ban/tests/actiontestcase.py |
| +++ b/fail2ban/tests/actiontestcase.py |
| @@ -244,14 +244,14 @@ class CommandActionTest(LogCaptureTestCase): |
| setattr(self.__action, 'ab', "<ac>") |
| setattr(self.__action, 'x?family=inet6', "") |
| # produce self-referencing properties except: |
| - self.assertRaisesRegexp(ValueError, r"properties contain self referencing definitions", |
| + self.assertRaisesRegex(ValueError, r"properties contain self referencing definitions", |
| lambda: self.__action.replaceTag("<a><b>", |
| self.__action._properties, conditional="family=inet4") |
| ) |
| # remore self-referencing in props: |
| delattr(self.__action, 'ac') |
| # produce self-referencing query except: |
| - self.assertRaisesRegexp(ValueError, r"possible self referencing definitions in query", |
| + self.assertRaisesRegex(ValueError, r"possible self referencing definitions in query", |
| lambda: self.__action.replaceTag("<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x>>>>>>>>>>>>>>>>>>>>>", |
| self.__action._properties, conditional="family=inet6") |
| ) |
| diff --git a/fail2ban/tests/clientreadertestcase.py b/fail2ban/tests/clientreadertestcase.py |
| index 2c1d0a0e..aa7908c4 100644 |
| --- a/fail2ban/tests/clientreadertestcase.py |
| +++ b/fail2ban/tests/clientreadertestcase.py |
| @@ -390,7 +390,7 @@ class JailReaderTest(LogCaptureTestCase): |
| # And multiple groups (`][` instead of `,`) |
| result = extractOptions(option.replace(',', '][')) |
| expected2 = (expected[0], |
| - dict((k, v.replace(',', '][')) for k, v in expected[1].iteritems()) |
| + dict((k, v.replace(',', '][')) for k, v in expected[1].items()) |
| ) |
| self.assertEqual(expected2, result) |
| |
| @@ -975,7 +975,7 @@ filter = testfilter1 |
| self.assertEqual(add_actions[-1][-1], "{}") |
| |
| def testLogPathFileFilterBackend(self): |
| - self.assertRaisesRegexp(ValueError, r"Have not found any log file for .* jail", |
| + self.assertRaisesRegex(ValueError, r"Have not found any log file for .* jail", |
| self._testLogPath, backend='polling') |
| |
| def testLogPathSystemdBackend(self): |
| diff --git a/fail2ban/tests/databasetestcase.py b/fail2ban/tests/databasetestcase.py |
| index 9a5e9fa1..562461a6 100644 |
| --- a/fail2ban/tests/databasetestcase.py |
| +++ b/fail2ban/tests/databasetestcase.py |
| @@ -67,7 +67,7 @@ class DatabaseTest(LogCaptureTestCase): |
| |
| @property |
| def db(self): |
| - if isinstance(self._db, basestring) and self._db == ':auto-create-in-memory:': |
| + if isinstance(self._db, str) and self._db == ':auto-create-in-memory:': |
| self._db = getFail2BanDb(self.dbFilename) |
| return self._db |
| @db.setter |
| @@ -159,7 +159,7 @@ class DatabaseTest(LogCaptureTestCase): |
| self.db = Fail2BanDb(self.dbFilename) |
| self.assertEqual(self.db.getJailNames(), set(['DummyJail #29162448 with 0 tickets'])) |
| self.assertEqual(self.db.getLogPaths(), set(['/tmp/Fail2BanDb_pUlZJh.log'])) |
| - ticket = FailTicket("127.0.0.1", 1388009242.26, [u"abc\n"]) |
| + ticket = FailTicket("127.0.0.1", 1388009242.26, ["abc\n"]) |
| self.assertEqual(self.db.getBans()[0], ticket) |
| |
| self.assertEqual(self.db.updateDb(Fail2BanDb.__version__), Fail2BanDb.__version__) |
| @@ -185,9 +185,9 @@ class DatabaseTest(LogCaptureTestCase): |
| self.assertEqual(len(bans), 2) |
| # compare first ticket completely: |
| ticket = FailTicket("1.2.3.7", 1417595494, [ |
| - u'Dec 3 09:31:08 f2btest test:auth[27658]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7', |
| - u'Dec 3 09:31:32 f2btest test:auth[27671]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7', |
| - u'Dec 3 09:31:34 f2btest test:auth[27673]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7' |
| + 'Dec 3 09:31:08 f2btest test:auth[27658]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7', |
| + 'Dec 3 09:31:32 f2btest test:auth[27671]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7', |
| + 'Dec 3 09:31:34 f2btest test:auth[27673]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7' |
| ]) |
| ticket.setAttempt(3) |
| self.assertEqual(bans[0], ticket) |
| @@ -286,11 +286,11 @@ class DatabaseTest(LogCaptureTestCase): |
| # invalid + valid, invalid + valid unicode, invalid + valid dual converted (like in filter:readline by fallback) ... |
| tickets = [ |
| FailTicket("127.0.0.1", 0, ['user "test"', 'user "\xd1\xe2\xe5\xf2\xe0"', 'user "\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f"']), |
| - FailTicket("127.0.0.2", 0, ['user "test"', u'user "\xd1\xe2\xe5\xf2\xe0"', u'user "\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f"']), |
| + FailTicket("127.0.0.2", 0, ['user "test"', 'user "\xd1\xe2\xe5\xf2\xe0"', 'user "\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f"']), |
| FailTicket("127.0.0.3", 0, ['user "test"', b'user "\xd1\xe2\xe5\xf2\xe0"', b'user "\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f"']), |
| - FailTicket("127.0.0.4", 0, ['user "test"', 'user "\xd1\xe2\xe5\xf2\xe0"', u'user "\xe4\xf6\xfc\xdf"']), |
| + FailTicket("127.0.0.4", 0, ['user "test"', 'user "\xd1\xe2\xe5\xf2\xe0"', 'user "\xe4\xf6\xfc\xdf"']), |
| FailTicket("127.0.0.5", 0, ['user "test"', 'unterminated \xcf']), |
| - FailTicket("127.0.0.6", 0, ['user "test"', u'unterminated \xcf']), |
| + FailTicket("127.0.0.6", 0, ['user "test"', 'unterminated \xcf']), |
| FailTicket("127.0.0.7", 0, ['user "test"', b'unterminated \xcf']) |
| ] |
| for ticket in tickets: |
| diff --git a/fail2ban/tests/datedetectortestcase.py b/fail2ban/tests/datedetectortestcase.py |
| index 458f76ef..49ada60d 100644 |
| --- a/fail2ban/tests/datedetectortestcase.py |
| +++ b/fail2ban/tests/datedetectortestcase.py |
| @@ -279,7 +279,7 @@ class DateDetectorTest(LogCaptureTestCase): |
| self.assertEqual(logTime, mu) |
| self.assertEqual(logMatch.group(1), '2012/10/11 02:37:17') |
| # confuse it with year being at the end |
| - for i in xrange(10): |
| + for i in range(10): |
| ( logTime, logMatch ) = self.datedetector.getTime('11/10/2012 02:37:17 [error] 18434#0') |
| self.assertEqual(logTime, mu) |
| self.assertEqual(logMatch.group(1), '11/10/2012 02:37:17') |
| @@ -505,7 +505,7 @@ class CustomDateFormatsTest(unittest.TestCase): |
| date = dd.getTime(line) |
| if matched: |
| self.assertTrue(date) |
| - if isinstance(matched, basestring): |
| + if isinstance(matched, str): |
| self.assertEqual(matched, date[1].group(1)) |
| else: |
| self.assertEqual(matched, date[0]) |
| @@ -537,7 +537,7 @@ class CustomDateFormatsTest(unittest.TestCase): |
| date = dd.getTime(line) |
| if matched: |
| self.assertTrue(date) |
| - if isinstance(matched, basestring): # pragma: no cover |
| + if isinstance(matched, str): # pragma: no cover |
| self.assertEqual(matched, date[1].group(1)) |
| else: |
| self.assertEqual(matched, date[0]) |
| diff --git a/fail2ban/tests/fail2banclienttestcase.py b/fail2ban/tests/fail2banclienttestcase.py |
| index 95f73ed3..bba354fa 100644 |
| --- a/fail2ban/tests/fail2banclienttestcase.py |
| +++ b/fail2ban/tests/fail2banclienttestcase.py |
| @@ -367,10 +367,10 @@ def with_foreground_server_thread(startextra={}): |
| # several commands to server in body of decorated function: |
| return f(self, tmp, startparams, *args, **kwargs) |
| except Exception as e: # pragma: no cover |
| - print('=== Catch an exception: %s' % e) |
| + print(('=== Catch an exception: %s' % e)) |
| log = self.getLog() |
| if log: |
| - print('=== Error of server, log: ===\n%s===' % log) |
| + print(('=== Error of server, log: ===\n%s===' % log)) |
| self.pruneLog() |
| raise |
| finally: |
| @@ -440,7 +440,7 @@ class Fail2banClientServerBase(LogCaptureTestCase): |
| ) |
| except: # pragma: no cover |
| if _inherited_log(startparams): |
| - print('=== Error by wait fot server, log: ===\n%s===' % self.getLog()) |
| + print(('=== Error by wait fot server, log: ===\n%s===' % self.getLog())) |
| self.pruneLog() |
| log = pjoin(tmp, "f2b.log") |
| if isfile(log): |
| @@ -1610,6 +1610,6 @@ class Fail2banServerTest(Fail2banClientServerBase): |
| self.stopAndWaitForServerEnd(SUCCESS) |
| |
| def testServerStartStop(self): |
| - for i in xrange(2000): |
| + for i in range(2000): |
| self._testServerStartStop() |
| |
| diff --git a/fail2ban/tests/failmanagertestcase.py b/fail2ban/tests/failmanagertestcase.py |
| index a5425286..2a94cc82 100644 |
| --- a/fail2ban/tests/failmanagertestcase.py |
| +++ b/fail2ban/tests/failmanagertestcase.py |
| @@ -45,11 +45,11 @@ class AddFailure(unittest.TestCase): |
| super(AddFailure, self).tearDown() |
| |
| def _addDefItems(self): |
| - self.__items = [[u'193.168.0.128', 1167605999.0], |
| - [u'193.168.0.128', 1167605999.0], |
| - [u'193.168.0.128', 1167605999.0], |
| - [u'193.168.0.128', 1167605999.0], |
| - [u'193.168.0.128', 1167605999.0], |
| + self.__items = [['193.168.0.128', 1167605999.0], |
| + ['193.168.0.128', 1167605999.0], |
| + ['193.168.0.128', 1167605999.0], |
| + ['193.168.0.128', 1167605999.0], |
| + ['193.168.0.128', 1167605999.0], |
| ['87.142.124.10', 1167605999.0], |
| ['87.142.124.10', 1167605999.0], |
| ['87.142.124.10', 1167605999.0], |
| diff --git a/fail2ban/tests/files/config/apache-auth/digest.py b/fail2ban/tests/files/config/apache-auth/digest.py |
| index 03588594..e2297ab3 100755 |
| --- a/fail2ban/tests/files/config/apache-auth/digest.py |
| +++ b/fail2ban/tests/files/config/apache-auth/digest.py |
| @@ -41,7 +41,7 @@ def auth(v): |
| response="%s" |
| """ % ( username, algorithm, realm, url, nonce, qop, response ) |
| # opaque="%s", |
| - print(p.method, p.url, p.headers) |
| + print((p.method, p.url, p.headers)) |
| s = requests.Session() |
| return s.send(p) |
| |
| @@ -76,18 +76,18 @@ r = auth(v) |
| |
| # [Sun Jul 28 21:41:20 2013] [error] [client 127.0.0.1] Digest: unknown algorithm `super funky chicken' received: /digest/ |
| |
| -print(r.status_code,r.headers, r.text) |
| +print((r.status_code,r.headers, r.text)) |
| v['algorithm'] = algorithm |
| |
| |
| r = auth(v) |
| -print(r.status_code,r.headers, r.text) |
| +print((r.status_code,r.headers, r.text)) |
| |
| nonce = v['nonce'] |
| v['nonce']=v['nonce'][5:-5] |
| |
| r = auth(v) |
| -print(r.status_code,r.headers, r.text) |
| +print((r.status_code,r.headers, r.text)) |
| |
| # [Sun Jul 28 21:05:31.178340 2013] [auth_digest:error] [pid 24224:tid 139895539455744] [client 127.0.0.1:56906] AH01793: invalid qop `auth' received: /digest/qop_none/ |
| |
| @@ -95,7 +95,7 @@ print(r.status_code,r.headers, r.text) |
| v['nonce']=nonce[0:11] + 'ZZZ' + nonce[14:] |
| |
| r = auth(v) |
| -print(r.status_code,r.headers, r.text) |
| +print((r.status_code,r.headers, r.text)) |
| |
| #[Sun Jul 28 21:18:11.769228 2013] [auth_digest:error] [pid 24752:tid 139895505884928] [client 127.0.0.1:56964] AH01776: invalid nonce b9YAiJDiBAZZZ1b1abe02d20063ea3b16b544ea1b0d981c1bafe received - hash is not d42d824dee7aaf50c3ba0a7c6290bd453e3dd35b |
| |
| @@ -107,7 +107,7 @@ import time |
| time.sleep(1) |
| |
| r = auth(v) |
| -print(r.status_code,r.headers, r.text) |
| +print((r.status_code,r.headers, r.text)) |
| |
| # Obtained by putting the following code in modules/aaa/mod_auth_digest.c |
| # in the function initialize_secret |
| @@ -137,7 +137,7 @@ s = sha.sha(apachesecret) |
| |
| v=preauth() |
| |
| -print(v['nonce']) |
| +print((v['nonce'])) |
| realm = v['Digest realm'][1:-1] |
| |
| (t,) = struct.unpack('l',base64.b64decode(v['nonce'][1:13])) |
| @@ -156,13 +156,13 @@ print(v) |
| |
| r = auth(v) |
| #[Mon Jul 29 02:12:55.539813 2013] [auth_digest:error] [pid 9647:tid 139895522670336] [client 127.0.0.1:58474] AH01777: invalid nonce 59QJppTiBAA=b08983fd166ade9840407df1b0f75b9e6e07d88d received - user attempted time travel |
| -print(r.status_code,r.headers, r.text) |
| +print((r.status_code,r.headers, r.text)) |
| |
| url='/digest_onetime/' |
| v=preauth() |
| |
| # Need opaque header handling in auth |
| r = auth(v) |
| -print(r.status_code,r.headers, r.text) |
| +print((r.status_code,r.headers, r.text)) |
| r = auth(v) |
| -print(r.status_code,r.headers, r.text) |
| +print((r.status_code,r.headers, r.text)) |
| diff --git a/fail2ban/tests/filtertestcase.py b/fail2ban/tests/filtertestcase.py |
| index 35785a58..8eeb6902 100644 |
| --- a/fail2ban/tests/filtertestcase.py |
| +++ b/fail2ban/tests/filtertestcase.py |
| @@ -22,7 +22,7 @@ |
| __copyright__ = "Copyright (c) 2004 Cyril Jaquier; 2012 Yaroslav Halchenko" |
| __license__ = "GPL" |
| |
| -from __builtin__ import open as fopen |
| +from builtins import open as fopen |
| import unittest |
| import os |
| import re |
| @@ -204,7 +204,7 @@ def _copy_lines_between_files(in_, fout, n=None, skip=0, mode='a', terminal_line |
| else: |
| fin = in_ |
| # Skip |
| - for i in xrange(skip): |
| + for i in range(skip): |
| fin.readline() |
| # Read |
| i = 0 |
| @@ -244,7 +244,7 @@ def _copy_lines_to_journal(in_, fields={},n=None, skip=0, terminal_line=""): # p |
| # Required for filtering |
| fields.update(TEST_JOURNAL_FIELDS) |
| # Skip |
| - for i in xrange(skip): |
| + for i in range(skip): |
| fin.readline() |
| # Read/Write |
| i = 0 |
| @@ -306,18 +306,18 @@ class BasicFilter(unittest.TestCase): |
| def testTest_tm(self): |
| unittest.F2B.SkipIfFast() |
| ## test function "_tm" works correct (returns the same as slow strftime): |
| - for i in xrange(1417512352, (1417512352 // 3600 + 3) * 3600): |
| + for i in range(1417512352, (1417512352 // 3600 + 3) * 3600): |
| tm = MyTime.time2str(i) |
| if _tm(i) != tm: # pragma: no cover - never reachable |
| self.assertEqual((_tm(i), i), (tm, i)) |
| |
| def testWrongCharInTupleLine(self): |
| ## line tuple has different types (ascii after ascii / unicode): |
| - for a1 in ('', u'', b''): |
| - for a2 in ('2016-09-05T20:18:56', u'2016-09-05T20:18:56', b'2016-09-05T20:18:56'): |
| + for a1 in ('', '', b''): |
| + for a2 in ('2016-09-05T20:18:56', '2016-09-05T20:18:56', b'2016-09-05T20:18:56'): |
| for a3 in ( |
| 'Fail for "g\xc3\xb6ran" from 192.0.2.1', |
| - u'Fail for "g\xc3\xb6ran" from 192.0.2.1', |
| + 'Fail for "g\xc3\xb6ran" from 192.0.2.1', |
| b'Fail for "g\xc3\xb6ran" from 192.0.2.1' |
| ): |
| # join should work if all arguments have the same type: |
| @@ -435,7 +435,7 @@ class IgnoreIP(LogCaptureTestCase): |
| |
| def testAddAttempt(self): |
| self.filter.setMaxRetry(3) |
| - for i in xrange(1, 1+3): |
| + for i in range(1, 1+3): |
| self.filter.addAttempt('192.0.2.1') |
| self.assertLogged('Attempt 192.0.2.1', '192.0.2.1:%d' % i, all=True, wait=True) |
| self.jail.actions._Actions__checkBan() |
| @@ -472,7 +472,7 @@ class IgnoreIP(LogCaptureTestCase): |
| # like both test-cases above, just cached (so once per key)... |
| self.filter.ignoreCache = {"key":"<ip>"} |
| self.filter.ignoreCommand = 'if [ "<ip>" = "10.0.0.1" ]; then exit 0; fi; exit 1' |
| - for i in xrange(5): |
| + for i in range(5): |
| self.pruneLog() |
| self.assertTrue(self.filter.inIgnoreIPList("10.0.0.1")) |
| self.assertFalse(self.filter.inIgnoreIPList("10.0.0.0")) |
| @@ -483,7 +483,7 @@ class IgnoreIP(LogCaptureTestCase): |
| # by host of IP: |
| self.filter.ignoreCache = {"key":"<ip-host>"} |
| self.filter.ignoreCommand = 'if [ "<ip-host>" = "test-host" ]; then exit 0; fi; exit 1' |
| - for i in xrange(5): |
| + for i in range(5): |
| self.pruneLog() |
| self.assertTrue(self.filter.inIgnoreIPList(FailTicket("2001:db8::1"))) |
| self.assertFalse(self.filter.inIgnoreIPList(FailTicket("2001:db8::ffff"))) |
| @@ -495,7 +495,7 @@ class IgnoreIP(LogCaptureTestCase): |
| self.filter.ignoreCache = {"key":"<F-USER>", "max-count":"10", "max-time":"1h"} |
| self.assertEqual(self.filter.ignoreCache, ["<F-USER>", 10, 60*60]) |
| self.filter.ignoreCommand = 'if [ "<F-USER>" = "tester" ]; then exit 0; fi; exit 1' |
| - for i in xrange(5): |
| + for i in range(5): |
| self.pruneLog() |
| self.assertTrue(self.filter.inIgnoreIPList(FailTicket("tester", data={'user': 'tester'}))) |
| self.assertFalse(self.filter.inIgnoreIPList(FailTicket("root", data={'user': 'root'}))) |
| @@ -644,7 +644,7 @@ class LogFileFilterPoll(unittest.TestCase): |
| fc = FileContainer(fname, self.filter.getLogEncoding()) |
| fc.open() |
| # no time - nothing should be found : |
| - for i in xrange(10): |
| + for i in range(10): |
| f.write("[sshd] error: PAM: failure len 1\n") |
| f.flush() |
| fc.setPos(0); self.filter.seekToTime(fc, time) |
| @@ -718,14 +718,14 @@ class LogFileFilterPoll(unittest.TestCase): |
| # variable length of file (ca 45K or 450K before and hereafter): |
| # write lines with smaller as search time: |
| t = time - count - 1 |
| - for i in xrange(count): |
| + for i in range(count): |
| f.write("%s [sshd] error: PAM: failure\n" % _tm(t)) |
| t += 1 |
| f.flush() |
| fc.setPos(0); self.filter.seekToTime(fc, time) |
| self.assertEqual(fc.getPos(), 47*count) |
| # write lines with exact search time: |
| - for i in xrange(10): |
| + for i in range(10): |
| f.write("%s [sshd] error: PAM: failure\n" % _tm(time)) |
| f.flush() |
| fc.setPos(0); self.filter.seekToTime(fc, time) |
| @@ -734,8 +734,8 @@ class LogFileFilterPoll(unittest.TestCase): |
| self.assertEqual(fc.getPos(), 47*count) |
| # write lines with greater as search time: |
| t = time+1 |
| - for i in xrange(count//500): |
| - for j in xrange(500): |
| + for i in range(count//500): |
| + for j in range(500): |
| f.write("%s [sshd] error: PAM: failure\n" % _tm(t)) |
| t += 1 |
| f.flush() |
| @@ -1488,10 +1488,10 @@ def get_monitor_failures_journal_testcase(Filter_): # pragma: systemd no cover |
| # Add direct utf, unicode, blob: |
| for l in ( |
| "error: PAM: Authentication failure for \xe4\xf6\xfc\xdf from 192.0.2.1", |
| - u"error: PAM: Authentication failure for \xe4\xf6\xfc\xdf from 192.0.2.1", |
| + "error: PAM: Authentication failure for \xe4\xf6\xfc\xdf from 192.0.2.1", |
| b"error: PAM: Authentication failure for \xe4\xf6\xfc\xdf from 192.0.2.1".decode('utf-8', 'replace'), |
| "error: PAM: Authentication failure for \xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f from 192.0.2.2", |
| - u"error: PAM: Authentication failure for \xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f from 192.0.2.2", |
| + "error: PAM: Authentication failure for \xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f from 192.0.2.2", |
| b"error: PAM: Authentication failure for \xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f from 192.0.2.2".decode('utf-8', 'replace') |
| ): |
| fields = self.journal_fields |
| @@ -1520,7 +1520,7 @@ class GetFailures(LogCaptureTestCase): |
| |
| # so that they could be reused by other tests |
| FAILURES_01 = ('193.168.0.128', 3, 1124013599.0, |
| - [u'Aug 14 11:59:59 [sshd] error: PAM: Authentication failure for kevin from 193.168.0.128']*3) |
| + ['Aug 14 11:59:59 [sshd] error: PAM: Authentication failure for kevin from 193.168.0.128']*3) |
| |
| def setUp(self): |
| """Call before every test case.""" |
| @@ -1595,8 +1595,8 @@ class GetFailures(LogCaptureTestCase): |
| |
| def testGetFailures02(self): |
| output = ('141.3.81.106', 4, 1124013539.0, |
| - [u'Aug 14 11:%d:59 i60p295 sshd[12365]: Failed publickey for roehl from ::ffff:141.3.81.106 port 51332 ssh2' |
| - % m for m in 53, 54, 57, 58]) |
| + ['Aug 14 11:%d:59 i60p295 sshd[12365]: Failed publickey for roehl from ::ffff:141.3.81.106 port 51332 ssh2' |
| + % m for m in (53, 54, 57, 58)]) |
| |
| self.filter.addLogPath(GetFailures.FILENAME_02, autoSeek=0) |
| self.filter.addFailRegex(r"Failed .* from <HOST>") |
| @@ -1691,17 +1691,17 @@ class GetFailures(LogCaptureTestCase): |
| # We should still catch failures with usedns = no ;-) |
| output_yes = ( |
| ('93.184.216.34', 2, 1124013539.0, |
| - [u'Aug 14 11:54:59 i60p295 sshd[12365]: Failed publickey for roehl from example.com port 51332 ssh2', |
| - u'Aug 14 11:58:59 i60p295 sshd[12365]: Failed publickey for roehl from ::ffff:93.184.216.34 port 51332 ssh2'] |
| + ['Aug 14 11:54:59 i60p295 sshd[12365]: Failed publickey for roehl from example.com port 51332 ssh2', |
| + 'Aug 14 11:58:59 i60p295 sshd[12365]: Failed publickey for roehl from ::ffff:93.184.216.34 port 51332 ssh2'] |
| ), |
| ('2606:2800:220:1:248:1893:25c8:1946', 1, 1124013299.0, |
| - [u'Aug 14 11:54:59 i60p295 sshd[12365]: Failed publickey for roehl from example.com port 51332 ssh2'] |
| + ['Aug 14 11:54:59 i60p295 sshd[12365]: Failed publickey for roehl from example.com port 51332 ssh2'] |
| ), |
| ) |
| |
| output_no = ( |
| ('93.184.216.34', 1, 1124013539.0, |
| - [u'Aug 14 11:58:59 i60p295 sshd[12365]: Failed publickey for roehl from ::ffff:93.184.216.34 port 51332 ssh2'] |
| + ['Aug 14 11:58:59 i60p295 sshd[12365]: Failed publickey for roehl from ::ffff:93.184.216.34 port 51332 ssh2'] |
| ) |
| ) |
| |
| @@ -1807,9 +1807,9 @@ class DNSUtilsTests(unittest.TestCase): |
| self.assertTrue(c.get('a') is None) |
| self.assertEqual(c.get('a', 'test'), 'test') |
| # exact 5 elements : |
| - for i in xrange(5): |
| + for i in range(5): |
| c.set(i, i) |
| - for i in xrange(5): |
| + for i in range(5): |
| self.assertEqual(c.get(i), i) |
| # remove unavailable key: |
| c.unset('a'); c.unset('a') |
| @@ -1817,30 +1817,30 @@ class DNSUtilsTests(unittest.TestCase): |
| def testCacheMaxSize(self): |
| c = Utils.Cache(maxCount=5, maxTime=60) |
| # exact 5 elements : |
| - for i in xrange(5): |
| + for i in range(5): |
| c.set(i, i) |
| - self.assertEqual([c.get(i) for i in xrange(5)], [i for i in xrange(5)]) |
| - self.assertNotIn(-1, (c.get(i, -1) for i in xrange(5))) |
| + self.assertEqual([c.get(i) for i in range(5)], [i for i in range(5)]) |
| + self.assertNotIn(-1, (c.get(i, -1) for i in range(5))) |
| # add one - too many: |
| c.set(10, i) |
| # one element should be removed : |
| - self.assertIn(-1, (c.get(i, -1) for i in xrange(5))) |
| + self.assertIn(-1, (c.get(i, -1) for i in range(5))) |
| # test max size (not expired): |
| - for i in xrange(10): |
| + for i in range(10): |
| c.set(i, 1) |
| self.assertEqual(len(c), 5) |
| |
| def testCacheMaxTime(self): |
| # test max time (expired, timeout reached) : |
| c = Utils.Cache(maxCount=5, maxTime=0.0005) |
| - for i in xrange(10): |
| + for i in range(10): |
| c.set(i, 1) |
| st = time.time() |
| self.assertTrue(Utils.wait_for(lambda: time.time() >= st + 0.0005, 1)) |
| # we have still 5 elements (or fewer if too slow test mashine): |
| self.assertTrue(len(c) <= 5) |
| # but all that are expiered also: |
| - for i in xrange(10): |
| + for i in range(10): |
| self.assertTrue(c.get(i) is None) |
| # here the whole cache should be empty: |
| self.assertEqual(len(c), 0) |
| @@ -1861,7 +1861,7 @@ class DNSUtilsTests(unittest.TestCase): |
| c = count |
| while c: |
| c -= 1 |
| - s = xrange(0, 256, 1) if forw else xrange(255, -1, -1) |
| + s = range(0, 256, 1) if forw else range(255, -1, -1) |
| if random: shuffle([i for i in s]) |
| for i in s: |
| IPAddr('192.0.2.'+str(i), IPAddr.FAM_IPv4) |
| @@ -1983,15 +1983,15 @@ class DNSUtilsNetworkTests(unittest.TestCase): |
| |
| def testAddr2bin(self): |
| res = IPAddr('10.0.0.0') |
| - self.assertEqual(res.addr, 167772160L) |
| + self.assertEqual(res.addr, 167772160) |
| res = IPAddr('10.0.0.0', cidr=None) |
| - self.assertEqual(res.addr, 167772160L) |
| - res = IPAddr('10.0.0.0', cidr=32L) |
| - self.assertEqual(res.addr, 167772160L) |
| - res = IPAddr('10.0.0.1', cidr=32L) |
| - self.assertEqual(res.addr, 167772161L) |
| - res = IPAddr('10.0.0.1', cidr=31L) |
| - self.assertEqual(res.addr, 167772160L) |
| + self.assertEqual(res.addr, 167772160) |
| + res = IPAddr('10.0.0.0', cidr=32) |
| + self.assertEqual(res.addr, 167772160) |
| + res = IPAddr('10.0.0.1', cidr=32) |
| + self.assertEqual(res.addr, 167772161) |
| + res = IPAddr('10.0.0.1', cidr=31) |
| + self.assertEqual(res.addr, 167772160) |
| |
| self.assertEqual(IPAddr('10.0.0.0').hexdump, '0a000000') |
| self.assertEqual(IPAddr('1::2').hexdump, '00010000000000000000000000000002') |
| @@ -2067,9 +2067,9 @@ class DNSUtilsNetworkTests(unittest.TestCase): |
| '93.184.216.34': 'ip4-test', |
| '2606:2800:220:1:248:1893:25c8:1946': 'ip6-test' |
| } |
| - d2 = dict([(IPAddr(k), v) for k, v in d.iteritems()]) |
| - self.assertTrue(isinstance(d.keys()[0], basestring)) |
| - self.assertTrue(isinstance(d2.keys()[0], IPAddr)) |
| + d2 = dict([(IPAddr(k), v) for k, v in d.items()]) |
| + self.assertTrue(isinstance(list(d.keys())[0], str)) |
| + self.assertTrue(isinstance(list(d2.keys())[0], IPAddr)) |
| self.assertEqual(d.get(ip4[2], ''), 'ip4-test') |
| self.assertEqual(d.get(ip6[2], ''), 'ip6-test') |
| self.assertEqual(d2.get(str(ip4[2]), ''), 'ip4-test') |
| diff --git a/fail2ban/tests/misctestcase.py b/fail2ban/tests/misctestcase.py |
| index 9b986f53..94f7a8de 100644 |
| --- a/fail2ban/tests/misctestcase.py |
| +++ b/fail2ban/tests/misctestcase.py |
| @@ -29,9 +29,9 @@ import tempfile |
| import shutil |
| import fnmatch |
| from glob import glob |
| -from StringIO import StringIO |
| +from io import StringIO |
| |
| -from utils import LogCaptureTestCase, logSys as DefLogSys |
| +from .utils import LogCaptureTestCase, logSys as DefLogSys |
| |
| from ..helpers import formatExceptionInfo, mbasename, TraceBack, FormatterWithTraceBack, getLogger, \ |
| splitwords, uni_decode, uni_string |
| @@ -67,7 +67,7 @@ class HelpersTest(unittest.TestCase): |
| self.assertEqual(splitwords(' 1\n 2'), ['1', '2']) |
| self.assertEqual(splitwords(' 1\n 2, 3'), ['1', '2', '3']) |
| # string as unicode: |
| - self.assertEqual(splitwords(u' 1\n 2, 3'), ['1', '2', '3']) |
| + self.assertEqual(splitwords(' 1\n 2, 3'), ['1', '2', '3']) |
| |
| |
| if sys.version_info >= (2,7): |
| @@ -197,11 +197,11 @@ class TestsUtilsTest(LogCaptureTestCase): |
| |
| def testUniConverters(self): |
| self.assertRaises(Exception, uni_decode, |
| - (b'test' if sys.version_info >= (3,) else u'test'), 'f2b-test::non-existing-encoding') |
| - uni_decode((b'test\xcf' if sys.version_info >= (3,) else u'test\xcf')) |
| + (b'test' if sys.version_info >= (3,) else 'test'), 'f2b-test::non-existing-encoding') |
| + uni_decode((b'test\xcf' if sys.version_info >= (3,) else 'test\xcf')) |
| uni_string(b'test\xcf') |
| uni_string('test\xcf') |
| - uni_string(u'test\xcf') |
| + uni_string('test\xcf') |
| |
| def testSafeLogging(self): |
| # logging should be exception-safe, to avoid possible errors (concat, str. conversion, representation failures, etc) |
| @@ -213,7 +213,7 @@ class TestsUtilsTest(LogCaptureTestCase): |
| if self.err: |
| raise Exception('no represenation for test!') |
| else: |
| - return u'conv-error (\xf2\xf0\xe5\xf2\xe8\xe9), unterminated utf \xcf' |
| + return 'conv-error (\xf2\xf0\xe5\xf2\xe8\xe9), unterminated utf \xcf' |
| test = Test() |
| logSys.log(logging.NOTICE, "test 1a: %r", test) |
| self.assertLogged("Traceback", "no represenation for test!") |
| @@ -261,7 +261,7 @@ class TestsUtilsTest(LogCaptureTestCase): |
| func_raise() |
| |
| try: |
| - print deep_function(3) |
| + print(deep_function(3)) |
| except ValueError: |
| s = tb() |
| |
| @@ -278,7 +278,7 @@ class TestsUtilsTest(LogCaptureTestCase): |
| self.assertIn(':', s) |
| |
| def _testAssertionErrorRE(self, regexp, fun, *args, **kwargs): |
| - self.assertRaisesRegexp(AssertionError, regexp, fun, *args, **kwargs) |
| + self.assertRaisesRegex(AssertionError, regexp, fun, *args, **kwargs) |
| |
| def testExtendedAssertRaisesRE(self): |
| ## test _testAssertionErrorRE several fail cases: |
| @@ -316,13 +316,13 @@ class TestsUtilsTest(LogCaptureTestCase): |
| self._testAssertionErrorRE(r"'a' unexpectedly found in 'cba'", |
| self.assertNotIn, 'a', 'cba') |
| self._testAssertionErrorRE(r"1 unexpectedly found in \[0, 1, 2\]", |
| - self.assertNotIn, 1, xrange(3)) |
| + self.assertNotIn, 1, range(3)) |
| self._testAssertionErrorRE(r"'A' unexpectedly found in \['C', 'A'\]", |
| self.assertNotIn, 'A', (c.upper() for c in 'cba' if c != 'b')) |
| self._testAssertionErrorRE(r"'a' was not found in 'xyz'", |
| self.assertIn, 'a', 'xyz') |
| self._testAssertionErrorRE(r"5 was not found in \[0, 1, 2\]", |
| - self.assertIn, 5, xrange(3)) |
| + self.assertIn, 5, range(3)) |
| self._testAssertionErrorRE(r"'A' was not found in \['C', 'B'\]", |
| self.assertIn, 'A', (c.upper() for c in 'cba' if c != 'a')) |
| ## assertLogged, assertNotLogged positive case: |
| diff --git a/fail2ban/tests/observertestcase.py b/fail2ban/tests/observertestcase.py |
| index 8e944454..ed520286 100644 |
| --- a/fail2ban/tests/observertestcase.py |
| +++ b/fail2ban/tests/observertestcase.py |
| @@ -69,7 +69,7 @@ class BanTimeIncr(LogCaptureTestCase): |
| a.setBanTimeExtra('multipliers', multipliers) |
| # test algorithm and max time 24 hours : |
| self.assertEqual( |
| - [a.calcBanTime(600, i) for i in xrange(1, 11)], |
| + [a.calcBanTime(600, i) for i in range(1, 11)], |
| [1200, 2400, 4800, 9600, 19200, 38400, 76800, 86400, 86400, 86400] |
| ) |
| # with extra large max time (30 days): |
| @@ -81,38 +81,38 @@ class BanTimeIncr(LogCaptureTestCase): |
| if multcnt < 11: |
| arr = arr[0:multcnt-1] + ([arr[multcnt-2]] * (11-multcnt)) |
| self.assertEqual( |
| - [a.calcBanTime(600, i) for i in xrange(1, 11)], |
| + [a.calcBanTime(600, i) for i in range(1, 11)], |
| arr |
| ) |
| a.setBanTimeExtra('maxtime', '1d') |
| # change factor : |
| a.setBanTimeExtra('factor', '2'); |
| self.assertEqual( |
| - [a.calcBanTime(600, i) for i in xrange(1, 11)], |
| + [a.calcBanTime(600, i) for i in range(1, 11)], |
| [2400, 4800, 9600, 19200, 38400, 76800, 86400, 86400, 86400, 86400] |
| ) |
| # factor is float : |
| a.setBanTimeExtra('factor', '1.33'); |
| self.assertEqual( |
| - [int(a.calcBanTime(600, i)) for i in xrange(1, 11)], |
| + [int(a.calcBanTime(600, i)) for i in range(1, 11)], |
| [1596, 3192, 6384, 12768, 25536, 51072, 86400, 86400, 86400, 86400] |
| ) |
| a.setBanTimeExtra('factor', None); |
| # change max time : |
| a.setBanTimeExtra('maxtime', '12h') |
| self.assertEqual( |
| - [a.calcBanTime(600, i) for i in xrange(1, 11)], |
| + [a.calcBanTime(600, i) for i in range(1, 11)], |
| [1200, 2400, 4800, 9600, 19200, 38400, 43200, 43200, 43200, 43200] |
| ) |
| a.setBanTimeExtra('maxtime', '24h') |
| ## test randomization - not possibe all 10 times we have random = 0: |
| a.setBanTimeExtra('rndtime', '5m') |
| self.assertTrue( |
| - False in [1200 in [a.calcBanTime(600, 1) for i in xrange(10)] for c in xrange(10)] |
| + False in [1200 in [a.calcBanTime(600, 1) for i in range(10)] for c in range(10)] |
| ) |
| a.setBanTimeExtra('rndtime', None) |
| self.assertFalse( |
| - False in [1200 in [a.calcBanTime(600, 1) for i in xrange(10)] for c in xrange(10)] |
| + False in [1200 in [a.calcBanTime(600, 1) for i in range(10)] for c in range(10)] |
| ) |
| # restore default: |
| a.setBanTimeExtra('multipliers', None) |
| @@ -124,7 +124,7 @@ class BanTimeIncr(LogCaptureTestCase): |
| # this multipliers has the same values as default formula, we test stop growing after count 9: |
| self.testDefault('1 2 4 8 16 32 64 128 256') |
| # this multipliers has exactly the same values as default formula, test endless growing (stops by count 31 only): |
| - self.testDefault(' '.join([str(1<<i) for i in xrange(31)])) |
| + self.testDefault(' '.join([str(1<<i) for i in range(31)])) |
| |
| def testFormula(self): |
| a = self.__jail; |
| @@ -136,38 +136,38 @@ class BanTimeIncr(LogCaptureTestCase): |
| a.setBanTimeExtra('multipliers', None) |
| # test algorithm and max time 24 hours : |
| self.assertEqual( |
| - [int(a.calcBanTime(600, i)) for i in xrange(1, 11)], |
| + [int(a.calcBanTime(600, i)) for i in range(1, 11)], |
| [1200, 2400, 4800, 9600, 19200, 38400, 76800, 86400, 86400, 86400] |
| ) |
| # with extra large max time (30 days): |
| a.setBanTimeExtra('maxtime', '30d') |
| self.assertEqual( |
| - [int(a.calcBanTime(600, i)) for i in xrange(1, 11)], |
| + [int(a.calcBanTime(600, i)) for i in range(1, 11)], |
| [1200, 2400, 4800, 9600, 19200, 38400, 76800, 153601, 307203, 614407] |
| ) |
| a.setBanTimeExtra('maxtime', '24h') |
| # change factor : |
| a.setBanTimeExtra('factor', '1'); |
| self.assertEqual( |
| - [int(a.calcBanTime(600, i)) for i in xrange(1, 11)], |
| + [int(a.calcBanTime(600, i)) for i in range(1, 11)], |
| [1630, 4433, 12051, 32758, 86400, 86400, 86400, 86400, 86400, 86400] |
| ) |
| a.setBanTimeExtra('factor', '2.0 / 2.885385') |
| # change max time : |
| a.setBanTimeExtra('maxtime', '12h') |
| self.assertEqual( |
| - [int(a.calcBanTime(600, i)) for i in xrange(1, 11)], |
| + [int(a.calcBanTime(600, i)) for i in range(1, 11)], |
| [1200, 2400, 4800, 9600, 19200, 38400, 43200, 43200, 43200, 43200] |
| ) |
| a.setBanTimeExtra('maxtime', '24h') |
| ## test randomization - not possibe all 10 times we have random = 0: |
| a.setBanTimeExtra('rndtime', '5m') |
| self.assertTrue( |
| - False in [1200 in [int(a.calcBanTime(600, 1)) for i in xrange(10)] for c in xrange(10)] |
| + False in [1200 in [int(a.calcBanTime(600, 1)) for i in range(10)] for c in range(10)] |
| ) |
| a.setBanTimeExtra('rndtime', None) |
| self.assertFalse( |
| - False in [1200 in [int(a.calcBanTime(600, 1)) for i in xrange(10)] for c in xrange(10)] |
| + False in [1200 in [int(a.calcBanTime(600, 1)) for i in range(10)] for c in range(10)] |
| ) |
| # restore default: |
| a.setBanTimeExtra('factor', None); |
| @@ -230,7 +230,7 @@ class BanTimeIncrDB(LogCaptureTestCase): |
| ticket = FailTicket(ip, stime, []) |
| # test ticket not yet found |
| self.assertEqual( |
| - [self.incrBanTime(ticket, 10) for i in xrange(3)], |
| + [self.incrBanTime(ticket, 10) for i in range(3)], |
| [10, 10, 10] |
| ) |
| # add a ticket banned |
| @@ -285,7 +285,7 @@ class BanTimeIncrDB(LogCaptureTestCase): |
| ) |
| # increase ban multiple times: |
| lastBanTime = 20 |
| - for i in xrange(10): |
| + for i in range(10): |
| ticket.setTime(stime + lastBanTime + 5) |
| banTime = self.incrBanTime(ticket, 10) |
| self.assertEqual(banTime, lastBanTime * 2) |
| @@ -481,7 +481,7 @@ class BanTimeIncrDB(LogCaptureTestCase): |
| ticket = FailTicket(ip, stime-120, []) |
| failManager = FailManager() |
| failManager.setMaxRetry(3) |
| - for i in xrange(3): |
| + for i in range(3): |
| failManager.addFailure(ticket) |
| obs.add('failureFound', failManager, jail, ticket) |
| obs.wait_empty(5) |
| diff --git a/fail2ban/tests/samplestestcase.py b/fail2ban/tests/samplestestcase.py |
| index 0bbd05f5..479b564a 100644 |
| --- a/fail2ban/tests/samplestestcase.py |
| +++ b/fail2ban/tests/samplestestcase.py |
| @@ -138,7 +138,7 @@ class FilterSamplesRegex(unittest.TestCase): |
| |
| @staticmethod |
| def _filterOptions(opts): |
| - return dict((k, v) for k, v in opts.iteritems() if not k.startswith('test.')) |
| + return dict((k, v) for k, v in opts.items() if not k.startswith('test.')) |
| |
| def testSampleRegexsFactory(name, basedir): |
| def testFilter(self): |
| @@ -249,10 +249,10 @@ def testSampleRegexsFactory(name, basedir): |
| self.assertTrue(faildata.get('match', False), |
| "Line matched when shouldn't have") |
| self.assertEqual(len(ret), 1, |
| - "Multiple regexs matched %r" % (map(lambda x: x[0], ret))) |
| + "Multiple regexs matched %r" % ([x[0] for x in ret])) |
| |
| # Verify match captures (at least fid/host) and timestamp as expected |
| - for k, v in faildata.iteritems(): |
| + for k, v in faildata.items(): |
| if k not in ("time", "match", "desc", "filter"): |
| fv = fail.get(k, None) |
| if fv is None: |
| @@ -294,7 +294,7 @@ def testSampleRegexsFactory(name, basedir): |
| '\n'.join(pprint.pformat(fail).splitlines()))) |
| |
| # check missing samples for regex using each filter-options combination: |
| - for fltName, flt in self._filters.iteritems(): |
| + for fltName, flt in self._filters.items(): |
| flt, regexsUsedIdx = flt |
| regexList = flt.getFailRegex() |
| for failRegexIndex, failRegex in enumerate(regexList): |
| diff --git a/fail2ban/tests/servertestcase.py b/fail2ban/tests/servertestcase.py |
| index 55e72455..7925ab1e 100644 |
| --- a/fail2ban/tests/servertestcase.py |
| +++ b/fail2ban/tests/servertestcase.py |
| @@ -124,14 +124,14 @@ class TransmitterBase(LogCaptureTestCase): |
| self.transm.proceed(["get", jail, cmd]), (0, [])) |
| for n, value in enumerate(values): |
| ret = self.transm.proceed(["set", jail, cmdAdd, value]) |
| - self.assertSortedEqual((ret[0], map(str, ret[1])), (0, map(str, values[:n+1])), level=2) |
| + self.assertSortedEqual((ret[0], list(map(str, ret[1]))), (0, list(map(str, values[:n+1]))), level=2) |
| ret = self.transm.proceed(["get", jail, cmd]) |
| - self.assertSortedEqual((ret[0], map(str, ret[1])), (0, map(str, values[:n+1])), level=2) |
| + self.assertSortedEqual((ret[0], list(map(str, ret[1]))), (0, list(map(str, values[:n+1]))), level=2) |
| for n, value in enumerate(values): |
| ret = self.transm.proceed(["set", jail, cmdDel, value]) |
| - self.assertSortedEqual((ret[0], map(str, ret[1])), (0, map(str, values[n+1:])), level=2) |
| + self.assertSortedEqual((ret[0], list(map(str, ret[1]))), (0, list(map(str, values[n+1:]))), level=2) |
| ret = self.transm.proceed(["get", jail, cmd]) |
| - self.assertSortedEqual((ret[0], map(str, ret[1])), (0, map(str, values[n+1:])), level=2) |
| + self.assertSortedEqual((ret[0], list(map(str, ret[1]))), (0, list(map(str, values[n+1:]))), level=2) |
| |
| def jailAddDelRegexTest(self, cmd, inValues, outValues, jail): |
| cmdAdd = "add" + cmd |
| @@ -930,7 +930,7 @@ class TransmitterLogging(TransmitterBase): |
| |
| def testLogTarget(self): |
| logTargets = [] |
| - for _ in xrange(3): |
| + for _ in range(3): |
| tmpFile = tempfile.mkstemp("fail2ban", "transmitter") |
| logTargets.append(tmpFile[1]) |
| os.close(tmpFile[0]) |
| @@ -1003,26 +1003,26 @@ class TransmitterLogging(TransmitterBase): |
| self.assertEqual(self.transm.proceed(["flushlogs"]), (0, "rolled over")) |
| l.warning("After flushlogs") |
| with open(fn2,'r') as f: |
| - line1 = f.next() |
| + line1 = next(f) |
| if line1.find('Changed logging target to') >= 0: |
| - line1 = f.next() |
| + line1 = next(f) |
| self.assertTrue(line1.endswith("Before file moved\n")) |
| - line2 = f.next() |
| + line2 = next(f) |
| self.assertTrue(line2.endswith("After file moved\n")) |
| try: |
| - n = f.next() |
| + n = next(f) |
| if n.find("Command: ['flushlogs']") >=0: |
| - self.assertRaises(StopIteration, f.next) |
| + self.assertRaises(StopIteration, f.__next__) |
| else: |
| self.fail("Exception StopIteration or Command: ['flushlogs'] expected. Got: %s" % n) |
| except StopIteration: |
| pass # on higher debugging levels this is expected |
| with open(fn,'r') as f: |
| - line1 = f.next() |
| + line1 = next(f) |
| if line1.find('rollover performed on') >= 0: |
| - line1 = f.next() |
| + line1 = next(f) |
| self.assertTrue(line1.endswith("After flushlogs\n")) |
| - self.assertRaises(StopIteration, f.next) |
| + self.assertRaises(StopIteration, f.__next__) |
| f.close() |
| finally: |
| os.remove(fn2) |
| @@ -1185,7 +1185,7 @@ class LoggingTests(LogCaptureTestCase): |
| os.remove(f) |
| |
| |
| -from clientreadertestcase import ActionReader, JailsReader, CONFIG_DIR |
| +from .clientreadertestcase import ActionReader, JailsReader, CONFIG_DIR |
| |
| class ServerConfigReaderTests(LogCaptureTestCase): |
| |
| diff --git a/fail2ban/tests/sockettestcase.py b/fail2ban/tests/sockettestcase.py |
| index 69bf8d8b..60f49e57 100644 |
| --- a/fail2ban/tests/sockettestcase.py |
| +++ b/fail2ban/tests/sockettestcase.py |
| @@ -153,7 +153,7 @@ class Socket(LogCaptureTestCase): |
| org_handler = RequestHandler.found_terminator |
| try: |
| RequestHandler.found_terminator = lambda self: self.close() |
| - self.assertRaisesRegexp(RuntimeError, r"socket connection broken", |
| + self.assertRaisesRegex(RuntimeError, r"socket connection broken", |
| lambda: client.send(testMessage, timeout=unittest.F2B.maxWaitTime(10))) |
| finally: |
| RequestHandler.found_terminator = org_handler |
| diff --git a/fail2ban/tests/utils.py b/fail2ban/tests/utils.py |
| index fcfddba7..cb234e0d 100644 |
| --- a/fail2ban/tests/utils.py |
| +++ b/fail2ban/tests/utils.py |
| @@ -35,7 +35,7 @@ import time |
| import threading |
| import unittest |
| |
| -from cStringIO import StringIO |
| +from io import StringIO |
| from functools import wraps |
| |
| from ..helpers import getLogger, str2LogLevel, getVerbosityFormat, uni_decode |
| @@ -174,8 +174,8 @@ def initProcess(opts): |
| |
| # Let know the version |
| if opts.verbosity != 0: |
| - print("Fail2ban %s test suite. Python %s. Please wait..." \ |
| - % (version, str(sys.version).replace('\n', ''))) |
| + print(("Fail2ban %s test suite. Python %s. Please wait..." \ |
| + % (version, str(sys.version).replace('\n', '')))) |
| |
| return opts; |
| |
| @@ -322,7 +322,7 @@ def initTests(opts): |
| c = DNSUtils.CACHE_ipToName |
| # increase max count and max time (too many entries, long time testing): |
| c.setOptions(maxCount=10000, maxTime=5*60) |
| - for i in xrange(256): |
| + for i in range(256): |
| c.set('192.0.2.%s' % i, None) |
| c.set('198.51.100.%s' % i, None) |
| c.set('203.0.113.%s' % i, None) |
| @@ -541,8 +541,8 @@ def gatherTests(regexps=None, opts=None): |
| import difflib, pprint |
| if not hasattr(unittest.TestCase, 'assertDictEqual'): |
| def assertDictEqual(self, d1, d2, msg=None): |
| - self.assert_(isinstance(d1, dict), 'First argument is not a dictionary') |
| - self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary') |
| + self.assertTrue(isinstance(d1, dict), 'First argument is not a dictionary') |
| + self.assertTrue(isinstance(d2, dict), 'Second argument is not a dictionary') |
| if d1 != d2: |
| standardMsg = '%r != %r' % (d1, d2) |
| diff = ('\n' + '\n'.join(difflib.ndiff( |
| @@ -560,7 +560,7 @@ def assertSortedEqual(self, a, b, level=1, nestedOnly=True, key=repr, msg=None): |
| # used to recognize having element as nested dict, list or tuple: |
| def _is_nested(v): |
| if isinstance(v, dict): |
| - return any(isinstance(v, (dict, list, tuple)) for v in v.itervalues()) |
| + return any(isinstance(v, (dict, list, tuple)) for v in v.values()) |
| return any(isinstance(v, (dict, list, tuple)) for v in v) |
| # level comparison routine: |
| def _assertSortedEqual(a, b, level, nestedOnly, key): |
| @@ -573,7 +573,7 @@ def assertSortedEqual(self, a, b, level=1, nestedOnly=True, key=repr, msg=None): |
| return |
| raise ValueError('%r != %r' % (a, b)) |
| if isinstance(a, dict) and isinstance(b, dict): # compare dict's: |
| - for k, v1 in a.iteritems(): |
| + for k, v1 in a.items(): |
| v2 = b[k] |
| if isinstance(v1, (dict, list, tuple)) and isinstance(v2, (dict, list, tuple)): |
| _assertSortedEqual(v1, v2, level-1 if level != 0 else 0, nestedOnly, key) |
| @@ -608,14 +608,14 @@ if not hasattr(unittest.TestCase, 'assertRaisesRegexp'): |
| self.fail('\"%s\" does not match \"%s\"' % (regexp, e)) |
| else: |
| self.fail('%s not raised' % getattr(exccls, '__name__')) |
| - unittest.TestCase.assertRaisesRegexp = assertRaisesRegexp |
| + unittest.TestCase.assertRaisesRegex = assertRaisesRegexp |
| |
| # always custom following methods, because we use atm better version of both (support generators) |
| if True: ## if not hasattr(unittest.TestCase, 'assertIn'): |
| def assertIn(self, a, b, msg=None): |
| bb = b |
| wrap = False |
| - if msg is None and hasattr(b, '__iter__') and not isinstance(b, basestring): |
| + if msg is None and hasattr(b, '__iter__') and not isinstance(b, str): |
| b, bb = itertools.tee(b) |
| wrap = True |
| if a not in b: |
| @@ -626,7 +626,7 @@ if True: ## if not hasattr(unittest.TestCase, 'assertIn'): |
| def assertNotIn(self, a, b, msg=None): |
| bb = b |
| wrap = False |
| - if msg is None and hasattr(b, '__iter__') and not isinstance(b, basestring): |
| + if msg is None and hasattr(b, '__iter__') and not isinstance(b, str): |
| b, bb = itertools.tee(b) |
| wrap = True |
| if a in b: |
| diff --git a/setup.py b/setup.py |
| deleted file mode 100755 |
| index ce1eedf6..00000000 |
| --- a/setup.py |
| +++ /dev/null |
| @@ -1,326 +0,0 @@ |
| -#!/usr/bin/env python |
| -# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: t -*- |
| -# vi: set ft=python sts=4 ts=4 sw=4 noet : |
| - |
| -# This file is part of Fail2Ban. |
| -# |
| -# Fail2Ban is free software; you can redistribute it and/or modify |
| -# it under the terms of the GNU General Public License as published by |
| -# the Free Software Foundation; either version 2 of the License, or |
| -# (at your option) any later version. |
| -# |
| -# Fail2Ban is distributed in the hope that it will be useful, |
| -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
| -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| -# GNU General Public License for more details. |
| -# |
| -# You should have received a copy of the GNU General Public License |
| -# along with Fail2Ban; if not, write to the Free Software |
| -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| - |
| -__author__ = "Cyril Jaquier, Steven Hiscocks, Yaroslav Halchenko" |
| -__copyright__ = "Copyright (c) 2004 Cyril Jaquier, 2008-2016 Fail2Ban Contributors" |
| -__license__ = "GPL" |
| - |
| -import platform |
| - |
| -try: |
| - import setuptools |
| - from setuptools import setup |
| - from setuptools.command.install import install |
| - from setuptools.command.install_scripts import install_scripts |
| -except ImportError: |
| - setuptools = None |
| - from distutils.core import setup |
| - |
| -# all versions |
| -from distutils.command.build_py import build_py |
| -from distutils.command.build_scripts import build_scripts |
| -if setuptools is None: |
| - from distutils.command.install import install |
| - from distutils.command.install_scripts import install_scripts |
| -try: |
| - # python 3.x |
| - from distutils.command.build_py import build_py_2to3 |
| - from distutils.command.build_scripts import build_scripts_2to3 |
| - _2to3 = True |
| -except ImportError: |
| - # python 2.x |
| - _2to3 = False |
| - |
| -import os |
| -from os.path import isfile, join, isdir, realpath |
| -import re |
| -import sys |
| -import warnings |
| -from glob import glob |
| - |
| -from fail2ban.setup import updatePyExec |
| - |
| - |
| -source_dir = os.path.realpath(os.path.dirname( |
| - # __file__ seems to be overwritten sometimes on some python versions (e.g. bug of 2.6 by running under cProfile, etc.): |
| - sys.argv[0] if os.path.basename(sys.argv[0]) == 'setup.py' else __file__ |
| -)) |
| - |
| -# Wrapper to install python binding (to current python version): |
| -class install_scripts_f2b(install_scripts): |
| - |
| - def get_outputs(self): |
| - outputs = install_scripts.get_outputs(self) |
| - # setup.py --dry-run install: |
| - dry_run = not outputs |
| - self.update_scripts(dry_run) |
| - if dry_run: |
| - #bindir = self.install_dir |
| - bindir = self.build_dir |
| - print('creating fail2ban-python binding -> %s (dry-run, real path can be different)' % (bindir,)) |
| - print('Copying content of %s to %s' % (self.build_dir, self.install_dir)); |
| - return outputs |
| - fn = None |
| - for fn in outputs: |
| - if os.path.basename(fn) == 'fail2ban-server': |
| - break |
| - bindir = os.path.dirname(fn) |
| - print('creating fail2ban-python binding -> %s' % (bindir,)) |
| - updatePyExec(bindir) |
| - return outputs |
| - |
| - def update_scripts(self, dry_run=False): |
| - buildroot = os.path.dirname(self.build_dir) |
| - install_dir = self.install_dir |
| - try: |
| - # remove root-base from install scripts path: |
| - root = self.distribution.command_options['install']['root'][1] |
| - if install_dir.startswith(root): |
| - install_dir = install_dir[len(root):] |
| - except: # pragma: no cover |
| - print('WARNING: Cannot find root-base option, check the bin-path to fail2ban-scripts in "fail2ban.service".') |
| - print('Creating %s/fail2ban.service (from fail2ban.service.in): @BINDIR@ -> %s' % (buildroot, install_dir)) |
| - with open(os.path.join(source_dir, 'files/fail2ban.service.in'), 'r') as fn: |
| - lines = fn.readlines() |
| - fn = None |
| - if not dry_run: |
| - fn = open(os.path.join(buildroot, 'fail2ban.service'), 'w') |
| - try: |
| - for ln in lines: |
| - ln = re.sub(r'@BINDIR@', lambda v: install_dir, ln) |
| - if dry_run: |
| - sys.stdout.write(' | ' + ln) |
| - continue |
| - fn.write(ln) |
| - finally: |
| - if fn: fn.close() |
| - if dry_run: |
| - print(' `') |
| - |
| - |
| -# Wrapper to specify fail2ban own options: |
| -class install_command_f2b(install): |
| - user_options = install.user_options + [ |
| - ('disable-2to3', None, 'Specify to deactivate 2to3, e.g. if the install runs from fail2ban test-cases.'), |
| - ('without-tests', None, 'without tests files installation'), |
| - ] |
| - def initialize_options(self): |
| - self.disable_2to3 = None |
| - self.without_tests = None |
| - install.initialize_options(self) |
| - def finalize_options(self): |
| - global _2to3 |
| - ## in the test cases 2to3 should be already done (fail2ban-2to3): |
| - if self.disable_2to3: |
| - _2to3 = False |
| - if _2to3: |
| - cmdclass = self.distribution.cmdclass |
| - cmdclass['build_py'] = build_py_2to3 |
| - cmdclass['build_scripts'] = build_scripts_2to3 |
| - if self.without_tests: |
| - self.distribution.scripts.remove('bin/fail2ban-testcases') |
| - |
| - self.distribution.packages.remove('fail2ban.tests') |
| - self.distribution.packages.remove('fail2ban.tests.action_d') |
| - |
| - del self.distribution.package_data['fail2ban.tests'] |
| - install.finalize_options(self) |
| - def run(self): |
| - install.run(self) |
| - |
| - |
| -# Update fail2ban-python env to current python version (where f2b-modules located/installed) |
| -updatePyExec(os.path.join(source_dir, 'bin')) |
| - |
| -if setuptools and "test" in sys.argv: |
| - import logging |
| - logSys = logging.getLogger("fail2ban") |
| - hdlr = logging.StreamHandler(sys.stdout) |
| - fmt = logging.Formatter("%(asctime)-15s %(message)s") |
| - hdlr.setFormatter(fmt) |
| - logSys.addHandler(hdlr) |
| - if set(["-q", "--quiet"]) & set(sys.argv): |
| - logSys.setLevel(logging.CRITICAL) |
| - warnings.simplefilter("ignore") |
| - sys.warnoptions.append("ignore") |
| - elif set(["-v", "--verbose"]) & set(sys.argv): |
| - logSys.setLevel(logging.DEBUG) |
| - else: |
| - logSys.setLevel(logging.INFO) |
| -elif "test" in sys.argv: |
| - print("python distribute required to execute fail2ban tests") |
| - print("") |
| - |
| -longdesc = ''' |
| -Fail2Ban scans log files like /var/log/pwdfail or |
| -/var/log/apache/error_log and bans IP that makes |
| -too many password failures. It updates firewall rules |
| -to reject the IP address or executes user defined |
| -commands.''' |
| - |
| -if setuptools: |
| - setup_extra = { |
| - 'test_suite': "fail2ban.tests.utils.gatherTests", |
| - 'use_2to3': True, |
| - } |
| -else: |
| - setup_extra = {} |
| - |
| -data_files_extra = [] |
| -if os.path.exists('/var/run'): |
| - # if we are on the system with /var/run -- we are to use it for having fail2ban/ |
| - # directory there for socket file etc. |
| - # realpath is used to possibly resolve /var/run -> /run symlink |
| - data_files_extra += [(realpath('/var/run/fail2ban'), '')] |
| - |
| -# Installing documentation files only under Linux or other GNU/ systems |
| -# (e.g. GNU/kFreeBSD), since others might have protective mechanisms forbidding |
| -# installation there (see e.g. #1233) |
| -platform_system = platform.system().lower() |
| -doc_files = ['README.md', 'DEVELOP', 'FILTERS', 'doc/run-rootless.txt'] |
| -if platform_system in ('solaris', 'sunos'): |
| - doc_files.append('README.Solaris') |
| -if platform_system in ('linux', 'solaris', 'sunos') or platform_system.startswith('gnu'): |
| - data_files_extra.append( |
| - ('/usr/share/doc/fail2ban', doc_files) |
| - ) |
| - |
| -# Get version number, avoiding importing fail2ban. |
| -# This is due to tests not functioning for python3 as 2to3 takes place later |
| -exec(open(join("fail2ban", "version.py")).read()) |
| - |
| -setup( |
| - name = "fail2ban", |
| - version = version, |
| - description = "Ban IPs that make too many password failures", |
| - long_description = longdesc, |
| - author = "Cyril Jaquier & Fail2Ban Contributors", |
| - author_email = "cyril.jaquier@fail2ban.org", |
| - url = "http://www.fail2ban.org", |
| - license = "GPL", |
| - platforms = "Posix", |
| - cmdclass = { |
| - 'build_py': build_py, 'build_scripts': build_scripts, |
| - 'install_scripts': install_scripts_f2b, 'install': install_command_f2b |
| - }, |
| - scripts = [ |
| - 'bin/fail2ban-client', |
| - 'bin/fail2ban-server', |
| - 'bin/fail2ban-regex', |
| - 'bin/fail2ban-testcases', |
| - # 'bin/fail2ban-python', -- link (binary), will be installed via install_scripts_f2b wrapper |
| - ], |
| - packages = [ |
| - 'fail2ban', |
| - 'fail2ban.client', |
| - 'fail2ban.server', |
| - 'fail2ban.tests', |
| - 'fail2ban.tests.action_d', |
| - ], |
| - package_data = { |
| - 'fail2ban.tests': |
| - [ join(w[0], f).replace("fail2ban/tests/", "", 1) |
| - for w in os.walk('fail2ban/tests/files') |
| - for f in w[2]] + |
| - [ join(w[0], f).replace("fail2ban/tests/", "", 1) |
| - for w in os.walk('fail2ban/tests/config') |
| - for f in w[2]] + |
| - [ join(w[0], f).replace("fail2ban/tests/", "", 1) |
| - for w in os.walk('fail2ban/tests/action_d') |
| - for f in w[2]] |
| - }, |
| - data_files = [ |
| - ('/etc/fail2ban', |
| - glob("config/*.conf") |
| - ), |
| - ('/etc/fail2ban/filter.d', |
| - glob("config/filter.d/*.conf") |
| - ), |
| - ('/etc/fail2ban/filter.d/ignorecommands', |
| - [p for p in glob("config/filter.d/ignorecommands/*") if isfile(p)] |
| - ), |
| - ('/etc/fail2ban/action.d', |
| - glob("config/action.d/*.conf") + |
| - glob("config/action.d/*.py") |
| - ), |
| - ('/etc/fail2ban/fail2ban.d', |
| - '' |
| - ), |
| - ('/etc/fail2ban/jail.d', |
| - '' |
| - ), |
| - ('/var/lib/fail2ban', |
| - '' |
| - ), |
| - ] + data_files_extra, |
| - **setup_extra |
| -) |
| - |
| -# Do some checks after installation |
| -# Search for obsolete files. |
| -obsoleteFiles = [] |
| -elements = { |
| - "/etc/": |
| - [ |
| - "fail2ban.conf" |
| - ], |
| - "/usr/bin/": |
| - [ |
| - "fail2ban.py" |
| - ], |
| - "/usr/lib/fail2ban/": |
| - [ |
| - "version.py", |
| - "protocol.py" |
| - ] |
| -} |
| - |
| -for directory in elements: |
| - for f in elements[directory]: |
| - path = join(directory, f) |
| - if isfile(path): |
| - obsoleteFiles.append(path) |
| - |
| -if obsoleteFiles: |
| - print("") |
| - print("Obsolete files from previous Fail2Ban versions were found on " |
| - "your system.") |
| - print("Please delete them:") |
| - print("") |
| - for f in obsoleteFiles: |
| - print("\t" + f) |
| - print("") |
| - |
| -if isdir("/usr/lib/fail2ban"): |
| - print("") |
| - print("Fail2ban is not installed under /usr/lib anymore. The new " |
| - "location is under /usr/share. Please remove the directory " |
| - "/usr/lib/fail2ban and everything under this directory.") |
| - print("") |
| - |
| -# Update config file |
| -if sys.argv[1] == "install": |
| - print("") |
| - print("Please do not forget to update your configuration files.") |
| - print("They are in \"/etc/fail2ban/\".") |
| - print("") |
| - print("You can also install systemd service-unit file from \"build/fail2ban.service\"") |
| - print("resp. corresponding init script from \"files/*-initd\".") |
| - print("") |
| -- |
| 2.17.1 |
| |