diff --git a/.pydevproject b/.pydevproject index d71fe688..3c3130d9 100644 --- a/.pydevproject +++ b/.pydevproject @@ -2,7 +2,7 @@ -python 2.4 +python 2.3 /fail2ban-0.8/client /fail2ban-0.8/server diff --git a/CHANGELOG b/CHANGELOG index dafa7b1c..8683b41c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -25,6 +25,8 @@ ver. 0.8.2 (2007/??/??) - stable - Moved socket to /var/run/fail2ban. - Rewrote the communication server. - Refactoring. Reduced number of files. +- Removed Python 2.4. Minimum required version is now Python + 2.3. ver. 0.8.1 (2007/08/14) - stable ---------- diff --git a/README b/README index eeffa2b4..307f1a50 100644 --- a/README +++ b/README @@ -4,7 +4,7 @@ |_| \__,_|_|_/___|_.__/\__,_|_||_| ============================================================= -Fail2Ban (version 0.8.1) 2007/08/14 +Fail2Ban (version 0.8.2) 2007/??/?? ============================================================= Fail2Ban scans log files like /var/log/pwdfail and bans IP @@ -21,15 +21,15 @@ Installation: ------------- Required: - >=python-2.4 (http://www.python.org) + >=python-2.3 (http://www.python.org) Optional: >=gamin-0.0.21 (http://www.gnome.org/~veillard/gamin) To install, just do: -> tar xvfj fail2ban-0.8.1.tar.bz2 -> cd fail2ban-0.8.1 +> tar xvfj fail2ban-0.8.2.tar.bz2 +> cd fail2ban-0.8.2 > python setup.py install This will install Fail2Ban into /usr/share/fail2ban. The diff --git a/client/configparserinc.py b/client/configparserinc.py index 4e3e7575..44289c4e 100644 --- a/client/configparserinc.py +++ b/client/configparserinc.py @@ -55,7 +55,7 @@ files_after = 1.conf """ - @staticmethod + #@staticmethod def getIncludedFiles(filename, sectionName='INCLUDES', defaults={}, seen=[]): """ @@ -83,6 +83,7 @@ files_after = 1.conf filenames = newFiles[0][1] + [filename] + newFiles[1][1] #print "Includes list for " + filename + " is " + `filenames` return filenames + getIncludedFiles = staticmethod(getIncludedFiles) def read(self, filenames): diff --git a/client/configreader.py b/client/configreader.py index 355dce28..8df1db34 100644 --- a/client/configreader.py +++ b/client/configreader.py @@ -41,14 +41,16 @@ class ConfigReader(SafeConfigParserWithIncludes): ConfigReader.BASE_DIRECTORY} ) self.__opts = None - @staticmethod + #@staticmethod def setBaseDir(folderName): path = folderName.rstrip('/') ConfigReader.BASE_DIRECTORY = path + '/' + setBaseDir = staticmethod(setBaseDir) - @staticmethod + #@staticmethod def getBaseDir(): return ConfigReader.BASE_DIRECTORY + getBaseDir = staticmethod(getBaseDir) def read(self, filename): basename = ConfigReader.BASE_DIRECTORY + filename diff --git a/client/configurator.py b/client/configurator.py index 8181a889..80ff968f 100644 --- a/client/configurator.py +++ b/client/configurator.py @@ -40,13 +40,15 @@ class Configurator: self.__fail2ban = Fail2banReader() self.__jails = JailsReader() - @staticmethod + #@staticmethod def setBaseDir(folderName): ConfigReader.setBaseDir(folderName) + setBaseDir = staticmethod(setBaseDir) - @staticmethod + #@staticmethod def getBaseDir(): return ConfigReader.getBaseDir() + getBaseDir = staticmethod(getBaseDir) def readEarly(self): self.__fail2ban.read() diff --git a/client/csocket.py b/client/csocket.py index 52c8d007..13bae5f8 100644 --- a/client/csocket.py +++ b/client/csocket.py @@ -47,7 +47,7 @@ class CSocket: self.__csock.close() return ret - @staticmethod + #@staticmethod def receive(sock): msg = '' while msg.rfind(CSocket.END_STRING) == -1: @@ -56,3 +56,4 @@ class CSocket: raise RuntimeError, "socket connection broken" msg = msg + chunk return loads(msg) + receive = staticmethod(receive) diff --git a/client/jailreader.py b/client/jailreader.py index 3588daab..58e87381 100644 --- a/client/jailreader.py +++ b/client/jailreader.py @@ -129,7 +129,7 @@ class JailReader(ConfigReader): stream.insert(0, ["add", self.__name, backend]) return stream - @staticmethod + #@staticmethod def splitAction(action): m = JailReader.actionCRE.match(action) d = dict() @@ -165,3 +165,4 @@ class JailReader(ConfigReader): except IndexError: logSys.error("Invalid argument %s in '%s'" % (p, m.group(2))) return [m.group(1), d] + splitAction = staticmethod(splitAction) diff --git a/fail2ban-client b/fail2ban-client index 32064682..1cf3c7df 100755 --- a/fail2ban-client +++ b/fail2ban-client @@ -357,11 +357,12 @@ class Fail2banClient: self.__stream = self.__configurator.getConfigStream() return ret - @staticmethod + #@staticmethod def dumpConfig(cmd): for c in cmd: print c return True + dumpConfig = staticmethod(dumpConfig) class ServerExecutionException(Exception): diff --git a/fail2ban-regex b/fail2ban-regex index 294c6421..3729701d 100755 --- a/fail2ban-regex +++ b/fail2ban-regex @@ -35,7 +35,7 @@ from client.configparserinc import SafeConfigParserWithIncludes from ConfigParser import NoOptionError, NoSectionError, MissingSectionHeaderError from common.version import version from server.filter import Filter -from server.regex import RegexException +from server.failregex import RegexException # Gets the instance of the logger. logSys = logging.getLogger("fail2ban.regex") @@ -82,7 +82,7 @@ class Fail2banRegex: logging.getLogger("fail2ban").addHandler(self.__hdlr) logging.getLogger("fail2ban").setLevel(logging.ERROR) - @staticmethod + #@staticmethod def dispVersion(): print "Fail2Ban v" + version print @@ -92,8 +92,9 @@ class Fail2banRegex: print print "Written by Cyril Jaquier ." print "Many contributions by Yaroslav O. Halchenko ." + dispVersion = staticmethod(dispVersion) - @staticmethod + #@staticmethod def dispUsage(): print "Usage: "+sys.argv[0]+" [OPTIONS] [IGNOREREGEX]" print @@ -119,6 +120,7 @@ class Fail2banRegex: print " filename path to a filter file (filter.d/sshd.conf)" print print "Report bugs to " + dispUsage = staticmethod(dispUsage) def getCmdLineOptions(self, optList): """ Gets the command line options @@ -131,9 +133,10 @@ class Fail2banRegex: self.dispVersion() sys.exit(0) - @staticmethod + #@staticmethod def logIsFile(value): return os.path.isfile(value) + logIsFile = staticmethod(logIsFile) def readIgnoreRegex(self, value): if os.path.isfile(value): diff --git a/server/action.py b/server/action.py index 10dfd479..d2c3ca5c 100644 --- a/server/action.py +++ b/server/action.py @@ -231,7 +231,7 @@ class Action: # @param aInfo the properties # @return a string - @staticmethod + #@staticmethod def replaceTag(query, aInfo): """ Replace tags in query """ @@ -241,6 +241,7 @@ class Action: # New line string = string.replace("
", '\n') return string + replaceTag = staticmethod(replaceTag) ## # Executes a command with preliminary checks and substitutions. @@ -297,7 +298,7 @@ class Action: # @param realCmd the command to execute # @return True if the command succeeded - @staticmethod + #@staticmethod def executeCmd(realCmd): logSys.debug(realCmd) try: @@ -312,3 +313,5 @@ class Action: except OSError, e: logSys.error("%s failed with %s" % (realCmd, e)) return False + executeCmd = staticmethod(executeCmd) + diff --git a/server/banmanager.py b/server/banmanager.py index 254f4c61..8e068f6e 100644 --- a/server/banmanager.py +++ b/server/banmanager.py @@ -125,7 +125,7 @@ class BanManager: # @param ticket the FailTicket # @return a BanTicket - @staticmethod + #@staticmethod def createBanTicket(ticket): ip = ticket.getIP() #lastTime = ticket.getTime() @@ -133,6 +133,7 @@ class BanManager: banTicket = BanTicket(ip, lastTime) banTicket.setAttempt(ticket.getAttempt()) return banTicket + createBanTicket = staticmethod(createBanTicket) ## # Add a ban ticket. diff --git a/server/datedetector.py b/server/datedetector.py index 7e13838b..7bc8c813 100644 --- a/server/datedetector.py +++ b/server/datedetector.py @@ -164,8 +164,7 @@ class DateDetector: try: self.__lock.acquire() logSys.debug("Sorting the template list") - self.__templates.sort(cmp = lambda x, y: - cmp(x.getHits(), y.getHits()), - reverse = True) + self.__templates.sort(lambda x, y: cmp(x.getHits(), y.getHits())) + self.__templates.reverse() finally: self.__lock.release() diff --git a/server/datetemplate.py b/server/datetemplate.py index 3a7651ae..8897fbc5 100644 --- a/server/datetemplate.py +++ b/server/datetemplate.py @@ -114,13 +114,14 @@ class DateStrptime(DateTemplate): def __init__(self): DateTemplate.__init__(self) - @staticmethod + #@staticmethod def convertLocale(date): for t in DateStrptime.TABLE: for m in DateStrptime.TABLE[t]: if date.find(m) >= 0: return date.replace(m, t) return date + convertLocale = staticmethod(convertLocale) def getDate(self, line): date = None diff --git a/server/filter.py b/server/filter.py index 86b8cc57..c0de1953 100644 --- a/server/filter.py +++ b/server/filter.py @@ -498,7 +498,7 @@ class DNSUtils: DNS_CRE = re.compile("(?:(?:\w|-)+\.){2,}\w+") IP_CRE = re.compile("(?:\d{1,3}\.){3}\d{1,3}") - @staticmethod + #@staticmethod def dnsToIp(dns): """ Convert a DNS into an IP address using the Python socket module. Thanks to Kevin Drapel. @@ -509,8 +509,9 @@ class DNSUtils: logSys.warn("Unable to find a corresponding IP address for %s" % dns) return list() + dnsToIp = staticmethod(dnsToIp) - @staticmethod + #@staticmethod def searchIP(text): """ Search if an IP address if directly available and return it. @@ -520,8 +521,9 @@ class DNSUtils: return match else: return None + searchIP = staticmethod(searchIP) - @staticmethod + #@staticmethod def isValidIP(string): """ Return true if str is a valid IP """ @@ -531,8 +533,9 @@ class DNSUtils: return True except socket.error: return False + isValidIP = staticmethod(isValidIP) - @staticmethod + #@staticmethod def textToIp(text): """ Return the IP of DNS found in a given text. """ @@ -549,8 +552,9 @@ class DNSUtils: for e in ip: ipList.append(e) return ipList + textToIp = staticmethod(textToIp) - @staticmethod + #@staticmethod def cidr(i, n): """ Convert an IP address string with a CIDR mask into a 32-bit integer. @@ -558,15 +562,18 @@ class DNSUtils: # 32-bit IPv4 address mask MASK = 0xFFFFFFFFL return ~(MASK >> n) & MASK & DNSUtils.addr2bin(i) + cidr = staticmethod(cidr) - @staticmethod + #@staticmethod def addr2bin(string): """ Convert a string IPv4 address into an unsigned integer. """ return struct.unpack("!L", socket.inet_aton(string))[0] + addr2bin = staticmethod(addr2bin) - @staticmethod + #@staticmethod def bin2addr(addr): """ Convert a numeric IPv4 address into string n.n.n.n form. """ return socket.inet_ntoa(struct.pack("!L", addr)) + bin2addr = staticmethod(bin2addr) diff --git a/server/mytime.py b/server/mytime.py index 2b7dfd0a..b6762c4f 100644 --- a/server/mytime.py +++ b/server/mytime.py @@ -46,31 +46,34 @@ class MyTime: # # @param t the time to set or None - @staticmethod + #@staticmethod def setTime(t): MyTime.myTime = t + setTime = staticmethod(setTime) ## # Equivalent to time.time() # # @return time.time() if setTime was called with None - @staticmethod + #@staticmethod def time(): if MyTime.myTime == None: return time.time() else: return MyTime.myTime + time = staticmethod(time) ## # Equivalent to time.gmtime() # # @return time.gmtime() if setTime was called with None - @staticmethod + #@staticmethod def gmtime(): if MyTime.myTime == None: return time.gmtime() else: return time.gmtime(MyTime.myTime) + gmtime = staticmethod(gmtime) \ No newline at end of file