- Added more comments

git-svn-id: https://fail2ban.svn.sourceforge.net/svnroot/fail2ban/trunk@556 a942ae1a-1317-0410-a47c-b1dcaea8d605
0.x
Cyril Jaquier 2007-03-07 20:54:32 +00:00
parent 9cb7831758
commit bde70ebc00
3 changed files with 137 additions and 0 deletions

View File

@ -54,18 +54,48 @@ class Action:
self.__actionStop = '' self.__actionStop = ''
logSys.debug("Created Action") logSys.debug("Created Action")
##
# Sets the action name.
#
# @param name the name of the action
def setName(self, name): def setName(self, name):
self.__name = name self.__name = name
##
# Returns the action name.
#
# @return the name of the action
def getName(self): def getName(self):
return self.__name return self.__name
##
# Sets a "CInfo".
#
# CInfo are statically defined properties. They can be definied by
# the user and are used to set e-mail addresses, port, host or
# anything that should not change during the life of the server.
#
# @param key the property name
# @param value the property value
def setCInfo(self, key, value): def setCInfo(self, key, value):
self.__cInfo[key] = value self.__cInfo[key] = value
##
# Returns a "CInfo".
#
# @param key the property name
def getCInfo(self, key): def getCInfo(self, key):
return self.__cInfo[key] return self.__cInfo[key]
##
# Removes a "CInfo".
#
# @param key the property name
def delCInfo(self, key): def delCInfo(self, key):
del self.__cInfo[key] del self.__cInfo[key]
@ -86,6 +116,14 @@ class Action:
def getActionStart(self): def getActionStart(self):
return self.__actionStart return self.__actionStart
##
# Executes the action "start" command.
#
# Replaces the tags in the action command with value of "cInfo"
# and executes the resulting command.
#
# @return True if the command succeeded
def execActionStart(self): def execActionStart(self):
startCmd = Action.replaceTag(self.__actionStart, self.__cInfo) startCmd = Action.replaceTag(self.__actionStart, self.__cInfo)
return Action.executeCmd(startCmd) return Action.executeCmd(startCmd)
@ -107,6 +145,11 @@ class Action:
def getActionBan(self): def getActionBan(self):
return self.__actionBan return self.__actionBan
##
# Executes the action "ban" command.
#
# @return True if the command succeeded
def execActionBan(self, aInfo): def execActionBan(self, aInfo):
return self.__processCmd(self.__actionBan, aInfo) return self.__processCmd(self.__actionBan, aInfo)
@ -127,6 +170,11 @@ class Action:
def getActionUnban(self): def getActionUnban(self):
return self.__actionUnban return self.__actionUnban
##
# Executes the action "unban" command.
#
# @return True if the command succeeded
def execActionUnban(self, aInfo): def execActionUnban(self, aInfo):
return self.__processCmd(self.__actionUnban, aInfo) return self.__processCmd(self.__actionUnban, aInfo)
@ -164,10 +212,25 @@ class Action:
def getActionStop(self): def getActionStop(self):
return self.__actionStop return self.__actionStop
##
# Executes the action "stop" command.
#
# Replaces the tags in the action command with value of "cInfo"
# and executes the resulting command.
#
# @return True if the command succeeded
def execActionStop(self): def execActionStop(self):
stopCmd = Action.replaceTag(self.__actionStop, self.__cInfo) stopCmd = Action.replaceTag(self.__actionStop, self.__cInfo)
return Action.executeCmd(stopCmd) return Action.executeCmd(stopCmd)
##
# Replaces tags in query with property values in aInfo.
#
# @param query the query string with tags
# @param aInfo the properties
# @return a string
@staticmethod @staticmethod
def replaceTag(query, aInfo): def replaceTag(query, aInfo):
""" Replace tags in query """ Replace tags in query
@ -179,6 +242,19 @@ class Action:
string = string.replace("<br>", '\n') string = string.replace("<br>", '\n')
return string return string
##
# Executes a command with preliminary checks and substitutions.
#
# Before executing any commands, executes the "check" command first
# in order to check if prerequirements are met. If this check fails,
# it tries to restore a sane environnement before executing the real
# command.
# Replaces "aInfo" and "cInfo" in the query too.
#
# @param cmd The command to execute
# @param aInfo Dynamic properties
# @return True if the command succeeded
def __processCmd(self, cmd, aInfo = None): def __processCmd(self, cmd, aInfo = None):
""" Executes an OS command. """ Executes an OS command.
""" """
@ -209,6 +285,18 @@ class Action:
return Action.executeCmd(realCmd) return Action.executeCmd(realCmd)
##
# Executes a command.
#
# We need a shell here because commands are mainly shell script. They
# contain pipe, redirection, etc.
#
# @todo Force the use of bash!?
# @todo Kill the command after a given timeout
#
# @param realCmd the command to execute
# @return True if the command succeeded
@staticmethod @staticmethod
def executeCmd(realCmd): def executeCmd(realCmd):
logSys.debug(realCmd) logSys.debug(realCmd)

View File

@ -56,22 +56,45 @@ class Actions(JailThread):
## The ban manager. ## The ban manager.
self.__banManager = BanManager() self.__banManager = BanManager()
##
# Adds an action.
#
# @param name The action name
def addAction(self, name): def addAction(self, name):
action = Action(name) action = Action(name)
self.__actions.append(action) self.__actions.append(action)
##
# Removes an action.
#
# @param name The action name
def delAction(self, name): def delAction(self, name):
for action in self.__actions: for action in self.__actions:
if action.getName() == name: if action.getName() == name:
self.__actions.remove(action) self.__actions.remove(action)
break break
##
# Returns an action.
#
# Raises a KeyError exception if the action does not exist.
#
# @param name the action name
# @return the action
def getAction(self, name): def getAction(self, name):
for action in self.__actions: for action in self.__actions:
if action.getName() == name: if action.getName() == name:
return action return action
raise KeyError raise KeyError
##
# Returns the last defined action.
#
# @return The last defined action.
def getLastAction(self): def getLastAction(self):
action = self.__actions.pop() action = self.__actions.pop()
self.__actions.append(action) self.__actions.append(action)

View File

@ -26,14 +26,35 @@ __license__ = "GPL"
import time import time
##
# MyTime class.
#
# This class is a wrapper around time.time() and time.gmtime(). When
# performing unit test, it is very useful to get a fixed value from these
# functions.
# Thus, time.time() and time.gmtime() should never be called directly.
# This wrapper should be called instead. The API are equivalent.
class MyTime: class MyTime:
myTime = None myTime = None
##
# Sets the current time.
#
# Use None in order to always get the real current time.
#
# @param t the time to set or None
@staticmethod @staticmethod
def setTime(t): def setTime(t):
MyTime.myTime = t MyTime.myTime = t
##
# Equivalent to time.time()
#
# @return time.time() if setTime was called with None
@staticmethod @staticmethod
def time(): def time():
if MyTime.myTime == None: if MyTime.myTime == None:
@ -41,6 +62,11 @@ class MyTime:
else: else:
return MyTime.myTime return MyTime.myTime
##
# Equivalent to time.gmtime()
#
# @return time.gmtime() if setTime was called with None
@staticmethod @staticmethod
def gmtime(): def gmtime():
if MyTime.myTime == None: if MyTime.myTime == None: