- Removed Python 2.4 code. Need more testing

git-svn-id: https://fail2ban.svn.sourceforge.net/svnroot/fail2ban/trunk@583 a942ae1a-1317-0410-a47c-b1dcaea8d605
0.x
Cyril Jaquier 2007-05-20 21:46:23 +00:00
parent e39d79b013
commit c1f5c4d189
17 changed files with 80 additions and 43 deletions

View File

@ -4,9 +4,13 @@
|_| \__,_|_|_/___|_.__/\__,_|_||_| |_| \__,_|_|_/___|_.__/\__,_|_||_|
============================================================= =============================================================
Fail2Ban (version 0.8.0) 2007/05/03 Fail2Ban (version 0.9.0) 2007/??/??
============================================================= =============================================================
ver. 0.9.0 (2007/??/??) - alpha
----------
- Removed Python 2.4 code. Need more testing
ver. 0.8.0 (2007/05/03) - stable ver. 0.8.0 (2007/05/03) - stable
---------- ----------
- Fixed RedHat init script. Thanks to Jonathan Underwood - Fixed RedHat init script. Thanks to Jonathan Underwood

View File

@ -39,14 +39,16 @@ class ConfigReader(SafeConfigParser):
SafeConfigParser.__init__(self) SafeConfigParser.__init__(self)
self.__opts = None self.__opts = None
@staticmethod #@staticmethod
def setBaseDir(folderName): def setBaseDir(folderName):
path = folderName.rstrip('/') path = folderName.rstrip('/')
ConfigReader.BASE_DIRECTORY = path + '/' ConfigReader.BASE_DIRECTORY = path + '/'
setBaseDir = staticmethod(setBaseDir)
@staticmethod #@staticmethod
def getBaseDir(): def getBaseDir():
return ConfigReader.BASE_DIRECTORY return ConfigReader.BASE_DIRECTORY
getBaseDir = staticmethod(getBaseDir)
def read(self, filename): def read(self, filename):
basename = ConfigReader.BASE_DIRECTORY + filename basename = ConfigReader.BASE_DIRECTORY + filename

View File

@ -40,13 +40,15 @@ class Configurator:
self.__fail2ban = Fail2banReader() self.__fail2ban = Fail2banReader()
self.__jails = JailsReader() self.__jails = JailsReader()
@staticmethod #@staticmethod
def setBaseDir(folderName): def setBaseDir(folderName):
ConfigReader.setBaseDir(folderName) ConfigReader.setBaseDir(folderName)
setBaseDir = staticmethod(setBaseDir)
@staticmethod #@staticmethod
def getBaseDir(): def getBaseDir():
return ConfigReader.getBaseDir() return ConfigReader.getBaseDir()
getBaseDir = staticmethod(getBaseDir)
def readEarly(self): def readEarly(self):
self.__fail2ban.read() self.__fail2ban.read()

View File

@ -47,7 +47,7 @@ class CSocket:
self.__csock.close() self.__csock.close()
return ret return ret
@staticmethod #@staticmethod
def receive(sock): def receive(sock):
msg = '' msg = ''
while msg.rfind(CSocket.END_STRING) == -1: while msg.rfind(CSocket.END_STRING) == -1:
@ -56,3 +56,4 @@ class CSocket:
raise RuntimeError, "socket connection broken" raise RuntimeError, "socket connection broken"
msg = msg + chunk msg = msg + chunk
return loads(msg) return loads(msg)
receive = staticmethod(receive)

View File

@ -129,7 +129,7 @@ class JailReader(ConfigReader):
stream.insert(0, ["add", self.__name, backend]) stream.insert(0, ["add", self.__name, backend])
return stream return stream
@staticmethod #@staticmethod
def splitAction(action): def splitAction(action):
m = JailReader.actionCRE.match(action) m = JailReader.actionCRE.match(action)
d = dict() d = dict()
@ -165,3 +165,4 @@ class JailReader(ConfigReader):
except IndexError: except IndexError:
logSys.error("Invalid argument %s in '%s'" % (p, m.group(2))) logSys.error("Invalid argument %s in '%s'" % (p, m.group(2)))
return [m.group(1), d] return [m.group(1), d]
splitAction = staticmethod(splitAction)

View File

@ -26,7 +26,8 @@ __copyright__ = "Copyright (c) 2004 Cyril Jaquier"
__license__ = "GPL" __license__ = "GPL"
import sys, string, os, pickle, re, logging, signal import sys, string, os, pickle, re, logging, signal
import getopt, time, readline, shlex, socket import getopt, time, shlex, socket
#import readline
# Inserts our own modules path first in the list # Inserts our own modules path first in the list
# fix for bug #343821 # fix for bug #343821
@ -325,6 +326,11 @@ class Fail2banClient:
# Interactive mode # Interactive mode
if self.__conf["interactive"]: if self.__conf["interactive"]:
try:
import readline
except ImportError:
logSys.error("Readline not available")
return False
try: try:
ret = True ret = True
if len(args) > 0: if len(args) > 0:
@ -357,11 +363,12 @@ class Fail2banClient:
self.__stream = self.__configurator.getConfigStream() self.__stream = self.__configurator.getConfigStream()
return ret return ret
@staticmethod #@staticmethod
def dumpConfig(cmd): def dumpConfig(cmd):
for c in cmd: for c in cmd:
print c print c
return True return True
dumpConfig = staticmethod(dumpConfig)
class ServerExecutionException(Exception): class ServerExecutionException(Exception):

View File

@ -79,7 +79,7 @@ class Fail2banRegex:
logging.getLogger("fail2ban").addHandler(self.__hdlr) logging.getLogger("fail2ban").addHandler(self.__hdlr)
logging.getLogger("fail2ban").setLevel(logging.ERROR) logging.getLogger("fail2ban").setLevel(logging.ERROR)
@staticmethod #@staticmethod
def dispVersion(): def dispVersion():
print "Fail2Ban v" + version print "Fail2Ban v" + version
print print
@ -89,8 +89,9 @@ class Fail2banRegex:
print print
print "Written by Cyril Jaquier <lostcontrol@users.sourceforge.net>." print "Written by Cyril Jaquier <lostcontrol@users.sourceforge.net>."
print "Many contributions by Yaroslav O. Halchenko <debian@onerussian.com>." print "Many contributions by Yaroslav O. Halchenko <debian@onerussian.com>."
dispVersion = staticmethod(dispVersion)
@staticmethod #@staticmethod
def dispUsage(): def dispUsage():
print "Usage: "+sys.argv[0]+" [OPTIONS] <LOG> <REGEX>" print "Usage: "+sys.argv[0]+" [OPTIONS] <LOG> <REGEX>"
print print
@ -112,6 +113,7 @@ class Fail2banRegex:
print " filename path to a filter file (filter.d/sshd.conf)" print " filename path to a filter file (filter.d/sshd.conf)"
print print
print "Report bugs to <lostcontrol@users.sourceforge.net>" print "Report bugs to <lostcontrol@users.sourceforge.net>"
dispUsage = staticmethod(dispUsage)
def getCmdLineOptions(self, optList): def getCmdLineOptions(self, optList):
""" Gets the command line options """ Gets the command line options
@ -124,9 +126,10 @@ class Fail2banRegex:
self.dispVersion() self.dispVersion()
sys.exit(0) sys.exit(0)
@staticmethod #@staticmethod
def logIsFile(value): def logIsFile(value):
return os.path.isfile(value) return os.path.isfile(value)
logIsFile = staticmethod(logIsFile)
def readRegex(self, value): def readRegex(self, value):
if os.path.isfile(value): if os.path.isfile(value):

View File

@ -231,7 +231,7 @@ class Action:
# @param aInfo the properties # @param aInfo the properties
# @return a string # @return a string
@staticmethod #@staticmethod
def replaceTag(query, aInfo): def replaceTag(query, aInfo):
""" Replace tags in query """ Replace tags in query
""" """
@ -241,6 +241,7 @@ class Action:
# New line # New line
string = string.replace("<br>", '\n') string = string.replace("<br>", '\n')
return string return string
replaceTag = staticmethod(replaceTag)
## ##
# Executes a command with preliminary checks and substitutions. # Executes a command with preliminary checks and substitutions.
@ -297,7 +298,7 @@ class Action:
# @param realCmd the command to execute # @param realCmd the command to execute
# @return True if the command succeeded # @return True if the command succeeded
@staticmethod #@staticmethod
def executeCmd(realCmd): def executeCmd(realCmd):
logSys.debug(realCmd) logSys.debug(realCmd)
try: try:
@ -312,3 +313,4 @@ class Action:
except OSError, e: except OSError, e:
logSys.error("%s failed with %s" % (realCmd, e)) logSys.error("%s failed with %s" % (realCmd, e))
return False return False
executeCmd = staticmethod(executeCmd)

View File

@ -125,7 +125,7 @@ class BanManager:
# @param ticket the FailTicket # @param ticket the FailTicket
# @return a BanTicket # @return a BanTicket
@staticmethod #@staticmethod
def createBanTicket(ticket): def createBanTicket(ticket):
ip = ticket.getIP() ip = ticket.getIP()
#lastTime = ticket.getTime() #lastTime = ticket.getTime()
@ -133,6 +133,7 @@ class BanManager:
banTicket = BanTicket(ip, lastTime) banTicket = BanTicket(ip, lastTime)
banTicket.setAttempt(ticket.getAttempt()) banTicket.setAttempt(ticket.getAttempt())
return banTicket return banTicket
createBanTicket = staticmethod(createBanTicket)
## ##
# Add a ban ticket. # Add a ban ticket.

View File

@ -158,8 +158,7 @@ class DateDetector:
try: try:
self.__lock.acquire() self.__lock.acquire()
logSys.debug("Sorting the template list") logSys.debug("Sorting the template list")
self.__templates.sort(cmp = lambda x, y: self.__templates.sort(lambda x, y: cmp(x.getHits(), y.getHits()))
cmp(x.getHits(), y.getHits()), self.__templates.reverse()
reverse = True)
finally: finally:
self.__lock.release() self.__lock.release()

View File

@ -54,13 +54,14 @@ class DateStrptime(DateTemplate):
def __init__(self): def __init__(self):
DateTemplate.__init__(self) DateTemplate.__init__(self)
@staticmethod #@staticmethod
def convertLocale(date): def convertLocale(date):
for t in DateStrptime.TABLE: for t in DateStrptime.TABLE:
for m in DateStrptime.TABLE[t]: for m in DateStrptime.TABLE[t]:
if date.find(m) >= 0: if date.find(m) >= 0:
return date.replace(m, t) return date.replace(m, t)
return date return date
convertLocale = staticmethod(convertLocale)
def getDate(self, line): def getDate(self, line):
date = None date = None

View File

@ -477,10 +477,11 @@ import socket, struct
class DNSUtils: class DNSUtils:
DNS_CRE = re.compile("(?:(?:\w|-)+\.){2,}\w+") #DNS_CRE = re.compile("(?:(?:\w|-)+\.){2,}\w+")
DNS_CRE = re.compile("\S+")
IP_CRE = re.compile("(?:\d{1,3}\.){3}\d{1,3}") IP_CRE = re.compile("(?:\d{1,3}\.){3}\d{1,3}")
@staticmethod #@staticmethod
def dnsToIp(dns): def dnsToIp(dns):
""" Convert a DNS into an IP address using the Python socket module. """ Convert a DNS into an IP address using the Python socket module.
Thanks to Kevin Drapel. Thanks to Kevin Drapel.
@ -491,8 +492,9 @@ class DNSUtils:
logSys.warn("Unable to find a corresponding IP address for %s" logSys.warn("Unable to find a corresponding IP address for %s"
% dns) % dns)
return list() return list()
dnsToIp = staticmethod(dnsToIp)
@staticmethod #@staticmethod
def textToDns(text): def textToDns(text):
""" Search for possible DNS in an arbitrary text. """ Search for possible DNS in an arbitrary text.
Thanks to Tom Pike. Thanks to Tom Pike.
@ -502,8 +504,9 @@ class DNSUtils:
return match return match
else: else:
return None return None
textToDns = staticmethod(textToDns)
@staticmethod #@staticmethod
def searchIP(text): def searchIP(text):
""" Search if an IP address if directly available and return """ Search if an IP address if directly available and return
it. it.
@ -513,8 +516,9 @@ class DNSUtils:
return match return match
else: else:
return None return None
searchIP = staticmethod(searchIP)
@staticmethod #@staticmethod
def isValidIP(string): def isValidIP(string):
""" Return true if str is a valid IP """ Return true if str is a valid IP
""" """
@ -524,8 +528,9 @@ class DNSUtils:
return True return True
except socket.error: except socket.error:
return False return False
isValidIP = staticmethod(isValidIP)
@staticmethod #@staticmethod
def textToIp(text): def textToIp(text):
""" Return the IP of DNS found in a given text. """ Return the IP of DNS found in a given text.
""" """
@ -544,8 +549,9 @@ class DNSUtils:
for e in ip: for e in ip:
ipList.append(e) ipList.append(e)
return ipList return ipList
textToIp = staticmethod(textToIp)
@staticmethod #@staticmethod
def cidr(i, n): def cidr(i, n):
""" Convert an IP address string with a CIDR mask into a 32-bit """ Convert an IP address string with a CIDR mask into a 32-bit
integer. integer.
@ -553,15 +559,18 @@ class DNSUtils:
# 32-bit IPv4 address mask # 32-bit IPv4 address mask
MASK = 0xFFFFFFFFL MASK = 0xFFFFFFFFL
return ~(MASK >> n) & MASK & DNSUtils.addr2bin(i) return ~(MASK >> n) & MASK & DNSUtils.addr2bin(i)
cidr = staticmethod(cidr)
@staticmethod #@staticmethod
def addr2bin(string): def addr2bin(string):
""" Convert a string IPv4 address into an unsigned integer. """ Convert a string IPv4 address into an unsigned integer.
""" """
return struct.unpack("!L", socket.inet_aton(string))[0] return struct.unpack("!L", socket.inet_aton(string))[0]
addr2bin = staticmethod(addr2bin)
@staticmethod #@staticmethod
def bin2addr(addr): def bin2addr(addr):
""" Convert a numeric IPv4 address into string n.n.n.n form. """ Convert a numeric IPv4 address into string n.n.n.n form.
""" """
return socket.inet_ntoa(struct.pack("!L", addr)) return socket.inet_ntoa(struct.pack("!L", addr))
bin2addr = staticmethod(bin2addr)

View File

@ -46,31 +46,34 @@ class MyTime:
# #
# @param t the time to set or None # @param t the time to set or None
@staticmethod #@staticmethod
def setTime(t): def setTime(t):
MyTime.myTime = t MyTime.myTime = t
setTime = staticmethod(setTime)
## ##
# Equivalent to time.time() # Equivalent to time.time()
# #
# @return time.time() if setTime was called with None # @return time.time() if setTime was called with None
@staticmethod #@staticmethod
def time(): def time():
if MyTime.myTime == None: if MyTime.myTime == None:
return time.time() return time.time()
else: else:
return MyTime.myTime return MyTime.myTime
time = staticmethod(time)
## ##
# Equivalent to time.gmtime() # Equivalent to time.gmtime()
# #
# @return time.gmtime() if setTime was called with None # @return time.gmtime() if setTime was called with None
@staticmethod #@staticmethod
def gmtime(): def gmtime():
if MyTime.myTime == None: if MyTime.myTime == None:
return time.gmtime() return time.gmtime()
else: else:
return time.gmtime(MyTime.myTime) return time.gmtime(MyTime.myTime)
gmtime = staticmethod(gmtime)

View File

@ -116,12 +116,13 @@ class SocketWorker(Thread):
self.__csock.close() self.__csock.close()
logSys.debug("Connection closed") logSys.debug("Connection closed")
@staticmethod #@staticmethod
def __send(sock, msg): def __send(sock, msg):
obj = dumps(msg, HIGHEST_PROTOCOL) obj = dumps(msg, HIGHEST_PROTOCOL)
sock.send(obj + SSocket.END_STRING) sock.send(obj + SSocket.END_STRING)
__send = staticmethod(__send)
@staticmethod #@staticmethod
def __receive(sock): def __receive(sock):
msg = '' msg = ''
while msg.rfind(SSocket.END_STRING) == -1: while msg.rfind(SSocket.END_STRING) == -1:
@ -130,6 +131,7 @@ class SocketWorker(Thread):
raise RuntimeError, "socket connection broken" raise RuntimeError, "socket connection broken"
msg = msg + chunk msg = msg + chunk
return loads(msg) return loads(msg)
__receive = staticmethod(__receive)
class SSocketErrorException(Exception): class SSocketErrorException(Exception):

View File

@ -43,5 +43,5 @@ class ExecuteAction(unittest.TestCase):
self.__action.setActionBan("echo -n") self.__action.setActionBan("echo -n")
self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]") self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]")
self.assertTrue(self.__action.execActionBan(None)) self.failUnless(self.__action.execActionBan(None))

View File

@ -34,7 +34,7 @@ class AddFailure(unittest.TestCase):
"""Call before every test case.""" """Call before every test case."""
self.__ticket = BanTicket('193.168.0.128', 1167605999.0) self.__ticket = BanTicket('193.168.0.128', 1167605999.0)
self.__banManager = BanManager() self.__banManager = BanManager()
self.assertTrue(self.__banManager.addBanTicket(self.__ticket)) self.failUnless(self.__banManager.addBanTicket(self.__ticket))
def tearDown(self): def tearDown(self):
"""Call after every test case.""" """Call after every test case."""
@ -43,14 +43,14 @@ class AddFailure(unittest.TestCase):
self.assertEqual(self.__banManager.size(), 1) self.assertEqual(self.__banManager.size(), 1)
def testAddDuplicate(self): def testAddDuplicate(self):
self.assertFalse(self.__banManager.addBanTicket(self.__ticket)) self.failIf(self.__banManager.addBanTicket(self.__ticket))
self.assertEqual(self.__banManager.size(), 1) self.assertEqual(self.__banManager.size(), 1)
def _testInListOK(self): def _testInListOK(self):
ticket = BanTicket('193.168.0.128', 1167605999.0) ticket = BanTicket('193.168.0.128', 1167605999.0)
self.assertTrue(self.__banManager.inBanList(ticket)) self.failUnless(self.__banManager.inBanList(ticket))
def _testInListNOK(self): def _testInListNOK(self):
ticket = BanTicket('111.111.1.111', 1167605999.0) ticket = BanTicket('111.111.1.111', 1167605999.0)
self.assertFalse(self.__banManager.inBanList(ticket)) self.failIf(self.__banManager.inBanList(ticket))

View File

@ -43,19 +43,19 @@ class IgnoreIP(unittest.TestCase):
ipList = "127.0.0.1", "192.168.0.1", "255.255.255.255", "99.99.99.99" ipList = "127.0.0.1", "192.168.0.1", "255.255.255.255", "99.99.99.99"
for ip in ipList: for ip in ipList:
self.__filter.addIgnoreIP(ip) self.__filter.addIgnoreIP(ip)
self.assertTrue(self.__filter.inIgnoreIPList(ip)) self.failUnless(self.__filter.inIgnoreIPList(ip))
# Test DNS # Test DNS
self.__filter.addIgnoreIP("www.epfl.ch") self.__filter.addIgnoreIP("www.epfl.ch")
self.assertTrue(self.__filter.inIgnoreIPList("128.178.50.12")) self.failUnless(self.__filter.inIgnoreIPList("128.178.50.12"))
def testIgnoreIPNOK(self): def testIgnoreIPNOK(self):
ipList = "", "999.999.999.999", "abcdef", "192.168.0." ipList = "", "999.999.999.999", "abcdef", "192.168.0."
for ip in ipList: for ip in ipList:
self.__filter.addIgnoreIP(ip) self.__filter.addIgnoreIP(ip)
self.assertFalse(self.__filter.inIgnoreIPList(ip)) self.failIf(self.__filter.inIgnoreIPList(ip))
# Test DNS # Test DNS
self.__filter.addIgnoreIP("www.epfl.ch") self.__filter.addIgnoreIP("www.epfl.ch")
self.assertFalse(self.__filter.inIgnoreIPList("127.177.50.10")) self.failIf(self.__filter.inIgnoreIPList("127.177.50.10"))
class LogFile(unittest.TestCase): class LogFile(unittest.TestCase):
@ -74,7 +74,7 @@ class LogFile(unittest.TestCase):
# self.__filter.openLogFile(LogFile.FILENAME) # self.__filter.openLogFile(LogFile.FILENAME)
def testIsModified(self): def testIsModified(self):
self.assertTrue(self.__filter.isModified(LogFile.FILENAME)) self.failUnless(self.__filter.isModified(LogFile.FILENAME))
class GetFailures(unittest.TestCase): class GetFailures(unittest.TestCase):