Description: Port to python3 (generated by 2to3) Author: Daniel Schaal Origin: other Forwarded: not-needed Last-Update: 2014-09-12 --- fail2ban-0.9.0+git48-gabcab00.orig/bin/fail2ban-client +++ fail2ban-0.9.0+git48-gabcab00/bin/fail2ban-client @@ -57,51 +57,51 @@ class Fail2banClient: self.__conf["pidfile"] = None def dispVersion(self): - print "Fail2Ban v" + version - print - print "Copyright (c) 2004-2008 Cyril Jaquier, 2008- Fail2Ban Contributors" - print "Copyright of modifications held by their respective authors." - print "Licensed under the GNU General Public License v2 (GPL)." - print - print "Written by Cyril Jaquier ." - print "Many contributions by Yaroslav O. Halchenko ." + print("Fail2Ban v" + version) + print() + print("Copyright (c) 2004-2008 Cyril Jaquier, 2008- Fail2Ban Contributors") + print("Copyright of modifications held by their respective authors.") + print("Licensed under the GNU General Public License v2 (GPL).") + print() + print("Written by Cyril Jaquier .") + print("Many contributions by Yaroslav O. Halchenko .") def dispUsage(self): """ Prints Fail2Ban command line options and exits """ - print "Usage: "+self.__argv[0]+" [OPTIONS] " - print - print "Fail2Ban v" + version + " reads log file that contains password failure report" - print "and bans the corresponding IP addresses using firewall rules." - print - print "Options:" - print " -c configuration directory" - print " -s socket path" - print " -p pidfile path" - print " -d dump configuration. For debugging" - print " -i interactive mode" - print " -v increase verbosity" - print " -q decrease verbosity" - print " -x force execution of the server (remove socket file)" - print " -h, --help display this help message" - print " -V, --version print the version" - print - print "Command:" + print("Usage: "+self.__argv[0]+" [OPTIONS] ") + print() + print("Fail2Ban v" + version + " reads log file that contains password failure report") + print("and bans the corresponding IP addresses using firewall rules.") + print() + print("Options:") + print(" -c configuration directory") + print(" -s socket path") + print(" -p pidfile path") + print(" -d dump configuration. For debugging") + print(" -i interactive mode") + print(" -v increase verbosity") + print(" -q decrease verbosity") + print(" -x force execution of the server (remove socket file)") + print(" -h, --help display this help message") + print(" -V, --version print the version") + print() + print("Command:") # Prints the protocol printFormatted() - print - print "Report bugs to https://github.com/fail2ban/fail2ban/issues" + print() + print("Report bugs to https://github.com/fail2ban/fail2ban/issues") def dispInteractive(self): - print "Fail2Ban v" + version + " reads log file that contains password failure report" - print "and bans the corresponding IP addresses using firewall rules." - print + print("Fail2Ban v" + version + " reads log file that contains password failure report") + print("and bans the corresponding IP addresses using firewall rules.") + print() def __sigTERMhandler(self, signum, frame): # Print a new line because we probably come from wait - print + print() logSys.warning("Caught signal %d. Exiting" % signum) sys.exit(-1) @@ -144,19 +144,19 @@ class Fail2banClient: client = CSocket(self.__conf["socket"]) ret = client.send(c) if ret[0] == 0: - logSys.debug("OK : " + `ret[1]`) + logSys.debug("OK : " + repr(ret[1])) if showRet: - print beautifier.beautify(ret[1]) + print(beautifier.beautify(ret[1])) else: - logSys.error("NOK: " + `ret[1].args`) + logSys.error("NOK: " + repr(ret[1].args)) if showRet: - print beautifier.beautifyError(ret[1]) + print(beautifier.beautifyError(ret[1])) streamRet = False except socket.error: if showRet: logSys.error("Unable to contact server. Is it running?") return False - except Exception, e: + except Exception as e: if showRet: logSys.error(e) return False @@ -370,7 +370,7 @@ class Fail2banClient: readline.parse_and_bind("tab: complete") self.dispInteractive() while True: - cmd = raw_input(self.PROMPT) + cmd = input(self.PROMPT) if cmd == "exit" or cmd == "quit": # Exit return True @@ -379,10 +379,10 @@ class Fail2banClient: elif not cmd == "": try: self.__processCommand(shlex.split(cmd)) - except Exception, e: + except Exception as e: logSys.error(e) except (EOFError, KeyboardInterrupt): - print + print() return True # Single command mode else: @@ -400,7 +400,7 @@ class Fail2banClient: ret = self.__configurator.getOptions(jail) self.__configurator.convertToProtocol() self.__stream = self.__configurator.getConfigStream() - except Exception, e: + except Exception as e: logSys.error("Failed during configuration: %s" % e) ret = False return ret @@ -408,7 +408,7 @@ class Fail2banClient: #@staticmethod def dumpConfig(cmd): for c in cmd: - print c + print(c) return True dumpConfig = staticmethod(dumpConfig) --- fail2ban-0.9.0+git48-gabcab00.orig/bin/fail2ban-regex +++ fail2ban-0.9.0+git48-gabcab00/bin/fail2ban-regex @@ -29,10 +29,10 @@ __author__ = "Cyril Jaquier, Yaroslav Ha __copyright__ = "Copyright (c) 2004-2008 Cyril Jaquier, 2012-2013 Yaroslav Halchenko" __license__ = "GPL" -import getopt, sys, time, logging, os, locale, shlex, urllib +import getopt, sys, time, logging, os, locale, shlex, urllib.request, urllib.parse, urllib.error from optparse import OptionParser, Option -from ConfigParser import NoOptionError, NoSectionError, MissingSectionHeaderError +from configparser import NoOptionError, NoSectionError, MissingSectionHeaderError try: from systemd import journal @@ -50,7 +50,7 @@ from fail2ban.tests.utils import Formatt logSys = logging.getLogger("fail2ban") def debuggexURL(sample, regex): - q = urllib.urlencode({ 're': regex.replace('', '(?&.ipv4)'), + q = urllib.parse.urlencode({ 're': regex.replace('', '(?&.ipv4)'), 'str': sample, 'flavor': 'python' }) return 'http://www.debuggex.com/?' + q @@ -69,7 +69,7 @@ def pprint_list(l, header=None): s = "|- %s\n" % header else: s = '' - print s + "| " + "\n| ".join(l) + '\n`-' + print(s + "| " + "\n| ".join(l) + '\n`-') def file_lines_gen(hdlr): for line in hdlr: @@ -243,14 +243,14 @@ class Fail2banRegex(object): self._filter.setDatePattern(pattern) self._datepattern_set = True if pattern is not None: - print "Use datepattern : %s" % ( - self._filter.getDatePattern()[1], ) + print("Use datepattern : %s" % ( + self._filter.getDatePattern()[1], )) def setMaxLines(self, v): if not self._maxlines_set: self._filter.setMaxLines(int(v)) self._maxlines_set = True - print "Use maxlines : %d" % self._filter.getMaxLines() + print("Use maxlines : %d" % self._filter.getMaxLines()) def setJournalMatch(self, v): if self._journalmatch is None: @@ -260,7 +260,7 @@ class Fail2banRegex(object): assert(regextype in ('fail', 'ignore')) regex = regextype + 'regex' if os.path.isfile(value): - print "Use %11s file : %s" % (regex, value) + print("Use %11s file : %s" % (regex, value)) reader = FilterReader(value, 'fail2ban-regex-jail', {}) reader.setBaseDir(None) @@ -269,9 +269,7 @@ class Fail2banRegex(object): readercommands = reader.convert() regex_values = [ RegexStat(m[3]) - for m in filter( - lambda x: x[0] == 'set' and x[2] == "add%sregex" % regextype, - readercommands)] + for m in [x for x in readercommands if x[0] == 'set' and x[2] == "add%sregex" % regextype]] # Read out and set possible value of maxlines for command in readercommands: if command[2] == "maxlines": @@ -279,8 +277,8 @@ class Fail2banRegex(object): try: self.setMaxLines(maxlines) except ValueError: - print "ERROR: Invalid value for maxlines (%(maxlines)r) " \ - "read from %(value)s" % locals() + print("ERROR: Invalid value for maxlines (%(maxlines)r) " \ + "read from %(value)s" % locals()) return False elif command[2] == 'addjournalmatch': journalmatch = command[3] @@ -289,10 +287,10 @@ class Fail2banRegex(object): datepattern = command[3] self.setDatePattern(datepattern) else: - print "ERROR: failed to read %s" % value + print("ERROR: failed to read %s" % value) return False else: - print "Use %11s line : %s" % (regex, shortstr(value)) + print("Use %11s line : %s" % (regex, shortstr(value))) regex_values = [RegexStat(value)] setattr(self, "_" + regex, regex_values) @@ -309,8 +307,8 @@ class Fail2banRegex(object): if ret is not None: found = True regex = self._ignoreregex[ret].inc() - except RegexException, e: - print e + except RegexException as e: + print(e) return False return found @@ -326,11 +324,11 @@ class Fail2banRegex(object): regex = self._failregex[match[0]] regex.inc() regex.appendIP(match) - except RegexException, e: - print e + except RegexException as e: + print(e) return False except IndexError: - print "Sorry, but no found in regex" + print("Sorry, but no found in regex") return False for bufLine in orgLineBuffer[int(fullBuffer):]: if bufLine not in self._filter._Filter__lineBuffer: @@ -402,21 +400,21 @@ 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() + ' | ' + debuggexURL(a[0], a[1].getFailRegex()), ans) + b = [a[0] + ' | ' + a[1].getFailRegex() + ' | ' + debuggexURL(a[0], a[1].getFailRegex()) for a in ans] pprint_list([x.rstrip() for x in b], header) else: - print "%s too many to print. Use --print-all-%s " \ - "to print all %d lines" % (header, ltype, lines) + print("%s too many to print. Use --print-all-%s " \ + "to print all %d lines" % (header, ltype, lines)) elif lines < self._maxlines or getattr(self, '_print_all_' + ltype): pprint_list([x.rstrip() for x in l], header) else: - print "%s too many to print. Use --print-all-%s " \ - "to print all %d lines" % (header, ltype, lines) + print("%s too many to print. Use --print-all-%s " \ + "to print all %d lines" % (header, ltype, lines)) def printStats(self): - print - print "Results" - print "=======" + print() + print("Results") + print("=======") def print_failregexes(title, failregexes): # Print title @@ -437,7 +435,7 @@ class Fail2banRegex(object): timeString, ip[-1] and " (multiple regex matched)" or "")) - print "\n%s: %d total" % (title, total) + print("\n%s: %d total" % (title, total)) pprint_list(out, " #) [# of hits] regular expression") return total @@ -447,7 +445,7 @@ class Fail2banRegex(object): if self._filter.dateDetector is not None: - print "\nDate template hits:" + print("\nDate template hits:") out = [] for template in self._filter.dateDetector.templates: if self._verbose or template.hits: @@ -455,7 +453,7 @@ class Fail2banRegex(object): template.hits, template.name)) pprint_list(out, "[# of hits] date format") - print "\nLines: %s" % self._line_stats + print("\nLines: %s" % self._line_stats) if self._print_all_matched: self.printLines('matched') @@ -480,10 +478,10 @@ if __name__ == "__main__": parser.print_help() sys.exit(-1) - print - print "Running tests" - print "=============" - print + print() + print("Running tests") + print("=============") + print() fail2banRegex = Fail2banRegex(opts) @@ -532,15 +530,15 @@ if __name__ == "__main__": if os.path.isfile(cmd_log): try: hdlr = open(cmd_log, 'rb') - print "Use log file : %s" % cmd_log - print "Use encoding : %s" % fail2banRegex.encoding + print("Use log file : %s" % cmd_log) + print("Use encoding : %s" % fail2banRegex.encoding) test_lines = file_lines_gen(hdlr) - except IOError, e: - print e + except IOError as e: + print(e) sys.exit(-1) elif cmd_log == "systemd-journal": if not journal: - print "Error: systemd library not found. Exiting..." + print("Error: systemd library not found. Exiting...") sys.exit(-1) myjournal = journal.Reader(converters={'__CURSOR': lambda x: x}) journalmatch = fail2banRegex._journalmatch @@ -553,14 +551,14 @@ if __name__ == "__main__": else: myjournal.add_match(element) except ValueError: - print "Error: Invalid journalmatch: %s" % shortstr(" ".join(journalmatch)) + print("Error: Invalid journalmatch: %s" % shortstr(" ".join(journalmatch))) sys.exit(-1) - print "Use journal match : %s" % " ".join(journalmatch) + print("Use journal match : %s" % " ".join(journalmatch)) test_lines = journal_lines_gen(myjournal) else: - print "Use single line : %s" % shortstr(cmd_log) + print("Use single line : %s" % shortstr(cmd_log)) test_lines = [ cmd_log ] - print + print() fail2banRegex.process(test_lines) --- fail2ban-0.9.0+git48-gabcab00.orig/bin/fail2ban-server +++ fail2ban-0.9.0+git48-gabcab00/bin/fail2ban-server @@ -50,37 +50,37 @@ class Fail2banServer: self.__conf["pidfile"] = "/var/run/fail2ban/fail2ban.pid" def dispVersion(self): - print "Fail2Ban v" + version - print - print "Copyright (c) 2004-2008 Cyril Jaquier, 2008- Fail2Ban Contributors" - print "Copyright of modifications held by their respective authors." - print "Licensed under the GNU General Public License v2 (GPL)." - print - print "Written by Cyril Jaquier ." - print "Many contributions by Yaroslav O. Halchenko ." + print("Fail2Ban v" + version) + print() + print("Copyright (c) 2004-2008 Cyril Jaquier, 2008- Fail2Ban Contributors") + print("Copyright of modifications held by their respective authors.") + print("Licensed under the GNU General Public License v2 (GPL).") + print() + print("Written by Cyril Jaquier .") + print("Many contributions by Yaroslav O. Halchenko .") def dispUsage(self): """ Prints Fail2Ban command line options and exits """ - print "Usage: "+self.__argv[0]+" [OPTIONS]" - print - print "Fail2Ban v" + version + " reads log file that contains password failure report" - print "and bans the corresponding IP addresses using firewall rules." - print - print "Only use this command for debugging purpose. Start the server with" - print "fail2ban-client instead. The default behaviour is to start the server" - print "in background." - print - print "Options:" - print " -b start in background" - print " -f start in foreground" - print " -s socket path" - print " -p pidfile path" - print " -x force execution of the server (remove socket file)" - print " -h, --help display this help message" - print " -V, --version print the version" - print - print "Report bugs to https://github.com/fail2ban/fail2ban/issues" + print("Usage: "+self.__argv[0]+" [OPTIONS]") + print() + print("Fail2Ban v" + version + " reads log file that contains password failure report") + print("and bans the corresponding IP addresses using firewall rules.") + print() + print("Only use this command for debugging purpose. Start the server with") + print("fail2ban-client instead. The default behaviour is to start the server") + print("in background.") + print() + print("Options:") + print(" -b start in background") + print(" -f start in foreground") + print(" -s socket path") + print(" -p pidfile path") + print(" -x force execution of the server (remove socket file)") + print(" -h, --help display this help message") + print(" -V, --version print the version") + print() + print("Report bugs to https://github.com/fail2ban/fail2ban/issues") def __getCmdLineOptions(self, optList): """ Gets the command line options @@ -124,7 +124,7 @@ class Fail2banServer: self.__conf["pidfile"], self.__conf["force"]) return True - except Exception, e: + except Exception as e: logSys.exception(e) self.__server.quit() return False --- fail2ban-0.9.0+git48-gabcab00.orig/bin/fail2ban-testcases +++ fail2ban-0.9.0+git48-gabcab00/bin/fail2ban-testcases @@ -113,8 +113,8 @@ logSys.addHandler(stdout) # Let know the version # if not opts.log_level or opts.log_level != 'critical': # pragma: no cover - 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', '')))) tests = gatherTests(regexps, opts.no_network) # --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/client/beautifier.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/client/beautifier.py @@ -46,7 +46,7 @@ class Beautifier: return self.__inputCmd def beautify(self, response): - logSys.debug("Beautify " + `response` + " with " + `self.__inputCmd`) + logSys.debug("Beautify " + repr(response) + " with " + repr(self.__inputCmd)) inC = self.__inputCmd msg = response try: @@ -98,7 +98,7 @@ class Beautifier: elif response == 4: msg = msg + "DEBUG" else: - msg = msg + `response` + msg = msg + repr(response) elif inC[1] == "dbfile": if response is None: msg = "Database currently disabled" @@ -179,13 +179,13 @@ class Beautifier: msg += ", ".join(response) except Exception: logSys.warning("Beautifier error. Please report the error") - logSys.error("Beautify " + `response` + " with " + `self.__inputCmd` + + logSys.error("Beautify " + repr(response) + " with " + repr(self.__inputCmd) + " failed") - msg = msg + `response` + msg = msg + repr(response) return msg def beautifyError(self, response): - logSys.debug("Beautify (error) " + `response` + " with " + `self.__inputCmd`) + logSys.debug("Beautify (error) " + repr(response) + " with " + repr(self.__inputCmd)) msg = response if isinstance(response, UnknownJailException): msg = "Sorry but the jail '" + response[0] + "' does not exist" --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/client/configparserinc.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/client/configparserinc.py @@ -57,7 +57,7 @@ if sys.version_info >= (3,2): # pragma: parser, option, accum, rest, section, map, depth) else: # pragma: no cover - from ConfigParser import SafeConfigParser + from configparser import SafeConfigParser # Gets the instance of the logger. logSys = logging.getLogger(__name__) @@ -121,7 +121,7 @@ after = 1.conf parser.read(resource, encoding='utf-8') else: parser.read(resource) - except UnicodeDecodeError, e: + except UnicodeDecodeError as e: logSys.error("Error decoding config file '%s': %s" % (resource, e)) return [] --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/client/configreader.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/client/configreader.py @@ -25,7 +25,7 @@ __copyright__ = "Copyright (c) 2004 Cyri __license__ = "GPL" import glob, logging, os -from ConfigParser import NoOptionError, NoSectionError +from configparser import NoOptionError, NoSectionError from .configparserinc import SafeConfigParserWithIncludes @@ -66,7 +66,7 @@ class ConfigReader(SafeConfigParserWithI 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 @@ -110,7 +110,7 @@ class ConfigReader(SafeConfigParserWithI if not pOptions is None and option[1] in pOptions: continue values[option[1]] = v - except NoSectionError, e: + except NoSectionError as e: # No "Definition" section or wrong basedir logSys.error(e) values[option[1]] = option[2] @@ -122,7 +122,7 @@ class ConfigReader(SafeConfigParserWithI values[option[1]] = option[2] except ValueError: logSys.warning("Wrong value for '" + option[1] + "' in '" + sec + - "'. Using default one: '" + `option[2]` + "'") + "'. Using default one: '" + repr(option[2]) + "'") values[option[1]] = option[2] return values @@ -169,7 +169,7 @@ class DefinitionInitConfigReader(ConfigR if self.has_section("Init"): for opt in self.options("Init"): - if not self._initOpts.has_key(opt): + if opt not in self._initOpts: self._initOpts[opt] = self.get("Init", opt) def convert(self): --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/client/csocket.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/client/csocket.py @@ -63,7 +63,7 @@ class CSocket: while msg.rfind(CSocket.END_STRING) == -1: chunk = sock.recv(6) if chunk == '': - raise RuntimeError, "socket connection broken" + raise RuntimeError("socket connection broken") msg = msg + chunk return loads(msg) receive = staticmethod(receive) --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/client/filterreader.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/client/filterreader.py @@ -48,7 +48,7 @@ class FilterReader(DefinitionInitConfigR opts = CommandAction.substituteRecursiveTags(combinedopts) if not opts: raise ValueError('recursive tag definitions unable to be resolved') - for opt, value in opts.iteritems(): + for opt, value in opts.items(): if opt == "failregex": for regex in value.split('\n'): # Do not send a command if the rule is empty. --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/client/jailreader.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/client/jailreader.py @@ -146,7 +146,7 @@ class JailReader(ConfigReader): self.__actions.append(action) else: raise AttributeError("Unable to read action") - except Exception, e: + except Exception as e: logSys.error("Error in action definition " + act) logSys.debug("Caught exception: %s" % (e,)) return False --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/protocol.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/protocol.py @@ -127,7 +127,7 @@ def printFormatted(): firstHeading = False for m in protocol: if m[0] == '' and firstHeading: - print + print() firstHeading = True first = True if len(m[0]) >= MARGIN: @@ -138,7 +138,7 @@ def printFormatted(): first = False else: line = ' ' * (INDENT + MARGIN) + n.strip() - print line + print(line) ## # Prints the protocol in a "mediawiki" format. @@ -148,19 +148,19 @@ def printWiki(): for m in protocol: if m[0] == '': if firstHeading: - print "|}" + print("|}") __printWikiHeader(m[1], m[2]) firstHeading = True else: - print "|-" - print "| " + m[0] + " || || " + m[1] - print "|}" + print("|-") + print("| " + m[0] + " || || " + m[1]) + print("|}") def __printWikiHeader(section, desc): - print - print "=== " + section + " ===" - print - print desc - print - print "{|" - print "| '''Command''' || || '''Description'''" + print() + print("=== " + section + " ===") + print() + print(desc) + print() + print("{|") + print("| '''Command''' || || '''Description'''") --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/action.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/action.py @@ -25,6 +25,7 @@ import logging, os, subprocess, time, si import threading, re from abc import ABCMeta from collections import MutableMapping +import collections #from subprocess import call # Gets the instance of the logger. @@ -46,7 +47,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 CallingMap(MutableMapping): """A Mapping type which returns the result of callable values. @@ -72,7 +73,7 @@ class CallingMap(MutableMapping): def __getitem__(self, key): value = self.data[key] - if callable(value): + if isinstance(value, collections.Callable): return value() else: return value @@ -89,7 +90,7 @@ class CallingMap(MutableMapping): def __len__(self): return len(self.data) -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 @@ -119,7 +120,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): @@ -130,7 +130,7 @@ class ActionBase(object): "unban", ) for method in required: - if not callable(getattr(C, method, None)): + if not isinstance(getattr(C, method, None), collections.Callable): return False return True @@ -236,7 +236,7 @@ class CommandAction(ActionBase): return dict( (key, getattr(self, key)) for key in dir(self) - if not key.startswith("_") and not callable(getattr(self, key))) + if not key.startswith("_") and not isinstance(getattr(self, key), collections.Callable)) @property def actionstart(self): @@ -373,7 +373,7 @@ class CommandAction(ActionBase): within the values recursively replaced. """ t = re.compile(r'<([^ >]+)>') - for tag, value in tags.iteritems(): + for tag, value in tags.items(): value = str(value) m = t.search(value) done = [] @@ -386,7 +386,7 @@ class CommandAction(ActionBase): #logSys.log(5, 'recursion fail tag: %s value: %s' % (tag, value) ) return False else: - if tags.has_key(found_tag): + if found_tag in tags: value = value.replace('<%s>' % found_tag , tags[found_tag]) #logSys.log(5, 'value now: %s' % value) done.append(found_tag) @@ -550,7 +550,7 @@ class CommandAction(ActionBase): os.kill(popen.pid, signal.SIGKILL) # Kill the process time.sleep(0.1) retcode = popen.poll() - except OSError, e: + except OSError as e: logSys.error("%s -- failed with %s" % (realCmd, e)) finally: _cmd_lock.release() --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/actions.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/actions.py @@ -210,7 +210,7 @@ class Actions(JailThread, Mapping): bool True when the thread exits nicely. """ - for name, action in self._actions.iteritems(): + for name, action in self._actions.items(): try: action.start() except Exception as e: @@ -227,7 +227,7 @@ class Actions(JailThread, Mapping): time.sleep(self.sleeptime) self.__flushBan() - actions = self._actions.items() + actions = list(self._actions.items()) actions.reverse() for name, action in actions: try: @@ -272,7 +272,7 @@ class Actions(JailThread, Mapping): ip=bTicket.getIP(), jail=self._jail).getAttempt()) if self.__banManager.addBanTicket(bTicket): logSys.notice("[%s] Ban %s" % (self._jail.name, aInfo["ip"])) - for name, action in self._actions.iteritems(): + for name, action in self._actions.items(): try: action.ban(aInfo) except Exception as e: @@ -319,7 +319,7 @@ class Actions(JailThread, Mapping): aInfo["time"] = ticket.getTime() aInfo["matches"] = "".join(ticket.getMatches()) logSys.notice("[%s] Unban %s" % (self._jail.name, aInfo["ip"])) - for name, action in self._actions.iteritems(): + for name, action in self._actions.items(): try: action.unban(aInfo) except Exception as e: --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/database.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/database.py @@ -134,7 +134,7 @@ class Fail2BanDb(object): logSys.info( "Connected to fail2ban persistent database '%s'", filename) - except sqlite3.OperationalError, e: + except sqlite3.OperationalError as e: logSys.error( "Error connecting to fail2ban persistent database '%s': %s", filename, e.args[0]) --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/datetemplate.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/datetemplate.py @@ -168,7 +168,7 @@ class DatePatternRegex(DateTemplate): regex pattern """ - _patternRE = r"%%(%%|[%s])" % "".join(timeRE.keys()) + _patternRE = r"%%(%%|[%s])" % "".join(list(timeRE.keys())) _patternName = { 'a': "DAY", 'A': "DAYNAME", 'b': "MON", 'B': "MONTH", 'd': "Day", 'H': "24hour", 'I': "12hour", 'j': "Yearday", 'm': "Month", @@ -232,7 +232,7 @@ class DatePatternRegex(DateTemplate): if dateMatch: groupdict = dict( (key, value) - for key, value in dateMatch.groupdict().iteritems() + for key, value in dateMatch.groupdict().items() if value is not None) return reGroupDictStrptime(groupdict), dateMatch --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/failmanager.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/failmanager.py @@ -90,7 +90,7 @@ class FailManager: ip = ticket.getIP() unixTime = ticket.getTime() matches = ticket.getMatches() - if self.__failList.has_key(ip): + if ip in self.__failList: fData = self.__failList[ip] if fData.getLastReset() < unixTime - self.__maxTime: fData.setLastReset(unixTime) @@ -111,7 +111,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.debug("Total # of detected failures: %d. Current failures from %d IPs (IP:count): %s" % (self.__failTotal, len(self.__failList), failures_summary)) finally: @@ -135,7 +135,7 @@ class FailManager: self.__lock.release() def __delFailure(self, ip): - if self.__failList.has_key(ip): + if ip in self.__failList: del self.__failList[ip] def toBan(self): --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/filter.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/filter.py @@ -99,7 +99,7 @@ class Filter(JailThread): logSys.warning( "Mutliline regex set for jail '%s' " "but maxlines not greater than 1") - except RegexException, e: + except RegexException as e: logSys.error(e) raise e @@ -133,7 +133,7 @@ class Filter(JailThread): try: regex = Regex(value) self.__ignoreRegex.append(regex) - except RegexException, e: + except RegexException as e: logSys.error(e) raise e @@ -309,7 +309,7 @@ class Filter(JailThread): logSys.warning('Requested to manually ban an ignored IP %s. User knows best. Proceeding to ban it.' % ip) unixTime = MyTime.time() - for i in xrange(self.failManager.getMaxRetry()): + for i in range(self.failManager.getMaxRetry()): self.failManager.addFailure(FailTicket(ip, unixTime)) # Perform the banning of the IP now. @@ -360,7 +360,7 @@ class Filter(JailThread): elif "." in s[1]: # 255.255.255.0 style mask s[1] = len(re.search( "(?<=b)1+", bin(DNSUtils.addr2bin(s[1]))).group()) - s[1] = long(s[1]) + s[1] = int(s[1]) try: a = DNSUtils.cidr(s[0], s[1]) b = DNSUtils.cidr(ip, s[1]) @@ -524,7 +524,7 @@ class Filter(JailThread): failRegex.getMatchedLines()]) if not checkAllRegex: break - except RegexException, e: # pragma: no cover - unsure if reachable + except RegexException as e: # pragma: no cover - unsure if reachable logSys.error(e) return failList @@ -655,15 +655,15 @@ class FileFilter(Filter): try: has_content = container.open() # see http://python.org/dev/peps/pep-3151/ - except IOError, e: + except IOError as e: logSys.error("Unable to open %s" % filename) logSys.exception(e) return False - except OSError, e: # pragma: no cover - requires race condition to tigger this + except OSError as e: # pragma: no cover - requires race condition to tigger this logSys.error("Error opening %s" % filename) logSys.exception(e) return False - except OSError, e: # pragma: no cover - Requires implemention error in FileContainer to generate + except OSError as e: # pragma: no cover - Requires implemention error in FileContainer to generate logSys.error("Internal errror in FileContainer open method - please report as a bug to https://github.com/fail2ban/fail2ban/issues") logSys.exception(e) return False @@ -791,7 +791,7 @@ class FileContainer: line = line.decode(self.getEncoding(), 'strict') except UnicodeDecodeError: logSys.warning("Error decoding line from '%s' with '%s': %s" % - (self.getFileName(), self.getEncoding(), `line`)) + (self.getFileName(), self.getEncoding(), repr(line))) if sys.version_info >= (3,): # In python3, must be decoded line = line.decode(self.getEncoding(), 'ignore') return line @@ -842,11 +842,11 @@ class DNSUtils: """ try: return set(socket.gethostbyname_ex(dns)[2]) - except socket.error, e: + except socket.error as e: logSys.warning("Unable to find a corresponding IP address for %s: %s" % (dns, e)) return list() - except socket.error, e: + except socket.error as e: logSys.warning("Socket error raised trying to resolve hostname %s: %s" % (dns, e)) return list() @@ -906,7 +906,7 @@ class DNSUtils: integer. """ # 32-bit IPv4 address mask - MASK = 0xFFFFFFFFL + MASK = 0xFFFFFFFF return ~(MASK >> n) & MASK & DNSUtils.addr2bin(i) cidr = staticmethod(cidr) --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/filtergamin.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/filtergamin.py @@ -61,7 +61,7 @@ class FilterGamin(FileFilter): def callback(self, path, event): - logSys.debug("Got event: " + `event` + " for " + path) + logSys.debug("Got event: " + repr(event) + " for " + path) if event in (gamin.GAMCreated, gamin.GAMChanged, gamin.GAMExists): logSys.debug("File changed: " + path) self.__modified = True --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/filterpoll.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/filterpoll.py @@ -135,7 +135,7 @@ class FilterPoll(FileFilter): logSys.debug("%s has been modified", filename) self.__prevStats[filename] = stats return True - except OSError, e: + except OSError as e: logSys.error("Unable to get stat on %s because of: %s" % (filename, e)) self.__file404Cnt[filename] += 1 --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/filterpyinotify.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/filterpyinotify.py @@ -43,7 +43,7 @@ if not hasattr(pyinotify, '__version__') try: manager = pyinotify.WatchManager() del manager -except Exception, e: +except Exception as e: raise ImportError("Pyinotify is probably not functional on this system: %s" % str(e)) --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/filtersystemd.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/filtersystemd.py @@ -187,7 +187,7 @@ class FilterSystemd(JournalFilter): # pr logelements.append(logentry.get('MESSAGE', '')) try: - logline = u" ".join(logelements) + logline = " ".join(logelements) except UnicodeDecodeError: # Python 2, so treat as string logline = " ".join([str(logline) for logline in logelements]) --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/jail.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/jail.py @@ -23,7 +23,7 @@ __author__ = "Cyril Jaquier, Lee Clemens __copyright__ = "Copyright (c) 2004 Cyril Jaquier, 2011-2012 Lee Clemens, 2012 Yaroslav Halchenko" __license__ = "GPL" -import Queue, logging +import queue, logging from .actions import Actions @@ -70,7 +70,7 @@ class Jail: "might not function correctly. Please shorten" % name) self.__name = name - self.__queue = Queue.Queue() + self.__queue = queue.Queue() self.__filter = None logSys.info("Creating new jail '%s'" % self.name) self._setBackend(backend) @@ -103,7 +103,7 @@ class Jail: logSys.info("Initiated %r backend" % b) self.__actions = Actions(self) return # we are done - except ImportError, e: + except ImportError as e: logSys.debug( "Backend %r failed to initialize due to %s" % (b, e)) # log error since runtime error message isn't printed, INVALID COMMAND @@ -114,25 +114,25 @@ class Jail: def _initPolling(self): - from filterpoll import FilterPoll + from .filterpoll import FilterPoll logSys.info("Jail '%s' uses poller" % self.name) self.__filter = FilterPoll(self) def _initGamin(self): # Try to import gamin - from filtergamin import FilterGamin + from .filtergamin import FilterGamin logSys.info("Jail '%s' uses Gamin" % self.name) self.__filter = FilterGamin(self) def _initPyinotify(self): # Try to import pyinotify - from filterpyinotify import FilterPyinotify + from .filterpyinotify import FilterPyinotify logSys.info("Jail '%s' uses pyinotify" % self.name) self.__filter = FilterPyinotify(self) def _initSystemd(self): # pragma: systemd no cover # Try to import systemd - from filtersystemd import FilterSystemd + from .filtersystemd import FilterSystemd logSys.info("Jail '%s' uses systemd" % self.name) self.__filter = FilterSystemd(self) @@ -196,7 +196,7 @@ class Jail: """ try: return self.__queue.get(False) - except Queue.Empty: + except queue.Empty: return False def start(self): --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/server.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/server.py @@ -70,7 +70,7 @@ class Server: signal.signal(signal.SIGINT, self.__sigTERMhandler) # First set the mask to only allow access to owner - os.umask(0077) + os.umask(0o077) if self.__daemon: # pragma: no cover logSys.info("Starting in daemon mode") ret = self.__createDaemon() @@ -86,20 +86,20 @@ class Server: pidFile = open(pidfile, 'w') pidFile.write("%s\n" % os.getpid()) pidFile.close() - except IOError, e: + except IOError as e: logSys.error("Unable to create PID file: %s" % e) # Start the communication logSys.debug("Starting communication") try: self.__asyncServer.start(sock, force) - except AsyncServerException, e: + except AsyncServerException as e: logSys.error("Could not start server: %s", e) # Removes the PID file. try: logSys.debug("Remove PID file %s" % pidfile) os.remove(pidfile) - except OSError, e: + except OSError as e: logSys.error("Unable to remove PID file: %s" % e) logSys.info("Exiting Fail2ban") @@ -155,7 +155,7 @@ class Server: logSys.info("Stopping all jails") try: self.__lock.acquire() - for jail in self.__jails.keys(): + for jail in list(self.__jails.keys()): self.stopJail(jail) finally: self.__lock.release() @@ -482,7 +482,7 @@ class Server: # the child gets a new PID, making it impossible for its PID to equal its # PGID. pid = os.fork() - except OSError, e: + except OSError as e: return((e.errno, e.strerror)) # ERROR (return a tuple) if pid == 0: # The first child. @@ -503,7 +503,7 @@ class Server: # fork guarantees that the child is no longer a session leader, thus # preventing the daemon from ever acquiring a controlling terminal. pid = os.fork() # Fork a second child. - except OSError, e: + except OSError as e: return((e.errno, e.strerror)) # ERROR (return a tuple) if (pid == 0): # The second child. --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/strptime.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/strptime.py @@ -57,7 +57,7 @@ def reGroupDictStrptime(found_dict): # weekday and julian defaulted to -1 so as to signal need to calculate # values weekday = julian = -1 - for group_key in found_dict.keys(): + for group_key in list(found_dict.keys()): # Directives not explicitly handled below: # c, x, X # handled by making out of other directives --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/ticket.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/ticket.py @@ -62,7 +62,7 @@ class Ticket: return False def setIP(self, value): - if isinstance(value, basestring): + if isinstance(value, str): # guarantee using regular str instead of unicode for the IP value = str(value) self.__ip = value --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/server/transmitter.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/server/transmitter.py @@ -26,6 +26,7 @@ __license__ = "GPL" import logging, time import json +import collections # Gets the instance of the logger. logSys = logging.getLogger(__name__) @@ -48,11 +49,11 @@ class Transmitter: def proceed(self, command): # Deserialize object - logSys.debug("Command: " + `command`) + logSys.debug("Command: " + repr(command)) try: ret = self.__commandHandler(command) ack = 0, ret - except Exception, e: + except Exception as e: logSys.warning("Command %r has failed. Received %r" % (command, e)) ack = 1, e @@ -243,7 +244,7 @@ class Transmitter: actionname = command[2] actionkey = command[3] action = self.__server.getAction(name, actionname) - if callable(getattr(action, actionkey, None)): + if isinstance(getattr(action, actionkey, None), collections.Callable): actionvalue = json.loads(command[4]) if len(command)>4 else {} return getattr(action, actionkey)(**actionvalue) else: @@ -301,7 +302,7 @@ class Transmitter: elif command[1] == "bantime": return self.__server.getBanTime(name) 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] @@ -313,13 +314,13 @@ class Transmitter: return [ key for key in dir(action) if not key.startswith("_") and - not callable(getattr(action, key))] + not isinstance(getattr(action, key), collections.Callable)] elif command[1] == "actionmethods": actionname = command[2] action = self.__server.getAction(name, actionname) return [ key for key in dir(action) - if not key.startswith("_") and callable(getattr(action, key))] + if not key.startswith("_") and isinstance(getattr(action, key), collections.Callable)] raise Exception("Invalid command (no get action or not yet implemented)") def status(self, command): --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/tests/databasetestcase.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/tests/databasetestcase.py @@ -92,7 +92,7 @@ class DatabaseTest(unittest.TestCase): 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__) --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/tests/datedetectortestcase.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/tests/datedetectortestcase.py @@ -139,7 +139,7 @@ class DateDetectorTest(unittest.TestCase self.assertEqual(logMatch.group(), '2012/10/11 02:37:17') self.__datedetector.sortTemplate() # 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(), '11/10/2012 02:37:17') --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/tests/failmanagertestcase.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/tests/failmanagertestcase.py @@ -33,11 +33,11 @@ class AddFailure(unittest.TestCase): def setUp(self): """Call before every test case.""" - 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], --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/tests/files/config/apache-auth/digest.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/tests/files/config/apache-auth/digest.py @@ -33,13 +33,13 @@ 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) def preauth(): r = requests.get(host + url) - print r + print(r) r.headers['www-authenticate'].split(', ') return dict([ a.split('=',1) for a in r.headers['www-authenticate'].split(', ') ]) @@ -51,7 +51,7 @@ v = preauth() username="username" password = "password" -print v +print(v) realm = 'so far away' r = auth(v) @@ -67,18 +67,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/ @@ -86,7 +86,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 @@ -98,7 +98,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 @@ -128,7 +128,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])) @@ -143,17 +143,17 @@ s.update(timepac) v['nonce'] = v['nonce'][0] + timepac + s.hexdigest() + v['nonce'][-1] -print v +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) --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/tests/filtertestcase.py +++ fail2ban-0.9.0+git48-gabcab00/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 sys @@ -132,7 +132,7 @@ def _copy_lines_between_files(in_, fout, else: fin = in_ # Skip - for i in xrange(skip): + for i in range(skip): fin.readline() # Read i = 0 @@ -169,7 +169,7 @@ def _copy_lines_to_journal(in_, fields={ "PRIORITY": "7", }) # Skip - for i in xrange(skip): + for i in range(skip): fin.readline() # Read/Write i = 0 @@ -795,7 +795,7 @@ class GetFailures(unittest.TestCase): # so that they could be reused by other tests FAILURES_01 = ('193.168.0.128', 3, 1124017199.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.""" @@ -845,8 +845,8 @@ class GetFailures(unittest.TestCase): def testGetFailures02(self): output = ('141.3.81.106', 4, 1124017139.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) self.filter.addFailRegex("Failed .* from ") @@ -878,11 +878,11 @@ class GetFailures(unittest.TestCase): def testGetFailuresUseDNS(self): # We should still catch failures with usedns = no ;-) output_yes = ('93.184.216.119', 2, 1124017139.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.119 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.119 port 51332 ssh2']) output_no = ('93.184.216.119', 1, 1124017139.0, - [u'Aug 14 11:58:59 i60p295 sshd[12365]: Failed publickey for roehl from ::ffff:93.184.216.119 port 51332 ssh2']) + ['Aug 14 11:58:59 i60p295 sshd[12365]: Failed publickey for roehl from ::ffff:93.184.216.119 port 51332 ssh2']) # Actually no exception would be raised -- it will be just set to 'no' #self.assertRaises(ValueError, --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/tests/misctestcase.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/tests/misctestcase.py @@ -30,7 +30,7 @@ import shutil import fnmatch import datetime from glob import glob -from StringIO import StringIO +from io import StringIO from .utils import mbasename, TraceBack, FormatterWithTraceBack from ..helpers import formatExceptionInfo @@ -139,7 +139,7 @@ class TestsUtilsTest(unittest.TestCase): else: func_raise() try: - print deep_function(3) + print(deep_function(3)) except ValueError: s = tb() --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/tests/samplestestcase.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/tests/samplestestcase.py @@ -28,7 +28,7 @@ if sys.version_info >= (2, 6): import json else: import simplejson as json - next = lambda x: x.next() + next = lambda x: x.__next__() from ..server.filter import Filter from ..client.filterreader import FilterReader @@ -94,7 +94,7 @@ def testSampleRegexsFactory(name): if jsonREMatch: try: faildata = json.loads(jsonREMatch.group(1)) - except ValueError, e: + except ValueError as e: raise ValueError("%s: %s:%i" % (e, logFile.filename(), logFile.filelineno())) line = next(logFile) @@ -116,7 +116,7 @@ def testSampleRegexsFactory(name): "Line matched when shouldn't have: %s:%i %r" % (logFile.filename(), logFile.filelineno(), line)) self.assertEqual(len(ret), 1, "Multiple regexs matched %r - %s:%i" % - (map(lambda x: x[0], ret),logFile.filename(), logFile.filelineno())) + ([x[0] for x in ret],logFile.filename(), logFile.filelineno())) # Verify timestamp and host as expected failregex, host, fail2banTime, lines = ret[0] @@ -149,7 +149,7 @@ def testSampleRegexsFactory(name): return testFilter -for filter_ in filter(lambda x: not x.endswith('common.conf'), os.listdir(os.path.join(CONFIG_DIR, "filter.d"))): +for filter_ in [x for x in os.listdir(os.path.join(CONFIG_DIR, "filter.d")) if not x.endswith('common.conf')]: filterName = filter_.rpartition(".")[0] if not filterName.startswith('.'): setattr( --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/tests/servertestcase.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/tests/servertestcase.py @@ -661,7 +661,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]) @@ -714,26 +714,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) --- fail2ban-0.9.0+git48-gabcab00.orig/fail2ban/tests/utils.py +++ fail2ban-0.9.0+git48-gabcab00/fail2ban/tests/utils.py @@ -24,7 +24,7 @@ __license__ = "GPL" import logging, os, re, traceback, time, unittest from os.path import basename, dirname -from StringIO import StringIO +from io import StringIO from ..server.mytime import MyTime @@ -228,13 +228,13 @@ def gatherTests(regexps=None, no_network try: from ..server.filtergamin import FilterGamin filters.append(FilterGamin) - except Exception, e: # pragma: no cover + except Exception as e: # pragma: no cover logSys.warning("Skipping gamin backend testing. Got exception '%s'" % e) try: from ..server.filterpyinotify import FilterPyinotify filters.append(FilterPyinotify) - except Exception, e: # pragma: no cover + except Exception as e: # pragma: no cover logSys.warning("I: Skipping pyinotify backend testing. Got exception '%s'" % e) for Filter_ in filters: @@ -243,7 +243,7 @@ def gatherTests(regexps=None, no_network try: # pragma: systemd no cover from ..server.filtersystemd import FilterSystemd tests.addTest(unittest.makeSuite(filtertestcase.get_monitor_failures_journal_testcase(FilterSystemd))) - except Exception, e: # pragma: no cover + except Exception as e: # pragma: no cover logSys.warning("I: Skipping systemd backend testing. Got exception '%s'" % e) @@ -280,4 +280,4 @@ class LogCaptureTestCase(unittest.TestCa return s in self._log.getvalue() def printLog(self): - print(self._log.getvalue()) + print((self._log.getvalue()))