actions.py
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 __author__ = "Cyril Jaquier"
00022 __version__ = "$Revision: 567 $"
00023 __date__ = "$Date: 2007-03-26 23:17:31 +0200 (Mon, 26 Mar 2007) $"
00024 __copyright__ = "Copyright (c) 2004 Cyril Jaquier"
00025 __license__ = "GPL"
00026
00027 from banmanager import BanManager
00028 from jailthread import JailThread
00029 from action import Action
00030 from mytime import MyTime
00031 import time, logging
00032
00033
00034 logSys = logging.getLogger("fail2ban.actions")
00035
00036
00037
00038
00039
00040
00041
00042
00043 class Actions(JailThread):
00044
00045
00046
00047
00048
00049
00050
00051 def __init__(self, jail):
00052 JailThread.__init__(self)
00053
00054 self.jail = jail
00055 self.__actions = list()
00056
00057 self.__banManager = BanManager()
00058
00059
00060
00061
00062
00063
00064 def addAction(self, name):
00065 action = Action(name)
00066 self.__actions.append(action)
00067
00068
00069
00070
00071
00072
00073 def delAction(self, name):
00074 for action in self.__actions:
00075 if action.getName() == name:
00076 self.__actions.remove(action)
00077 break
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 def getAction(self, name):
00088 for action in self.__actions:
00089 if action.getName() == name:
00090 return action
00091 raise KeyError
00092
00093
00094
00095
00096
00097
00098 def getLastAction(self):
00099 action = self.__actions.pop()
00100 self.__actions.append(action)
00101 return action
00102
00103
00104
00105
00106
00107
00108 def setBanTime(self, value):
00109 self.__banManager.setBanTime(value)
00110 logSys.info("Set banTime = %s" % value)
00111
00112
00113
00114
00115
00116
00117 def getBanTime(self):
00118 return self.__banManager.getBanTime()
00119
00120
00121
00122
00123
00124
00125
00126
00127 def run(self):
00128 self.setActive(True)
00129 for action in self.__actions:
00130 action.execActionStart()
00131 while self._isActive():
00132 if not self.getIdle():
00133
00134 ret = self.__checkBan()
00135 if not ret:
00136 self.__checkUnBan()
00137 time.sleep(self.getSleepTime())
00138 else:
00139 time.sleep(self.getSleepTime())
00140 self.__flushBan()
00141 for action in self.__actions:
00142 action.execActionStop()
00143 logSys.debug(self.jail.getName() + ": action terminated")
00144 return True
00145
00146
00147
00148
00149
00150
00151
00152
00153 def __checkBan(self):
00154 ticket = self.jail.getFailTicket()
00155 if ticket != False:
00156 aInfo = dict()
00157 bTicket = BanManager.createBanTicket(ticket)
00158 aInfo["ip"] = bTicket.getIP()
00159 aInfo["failures"] = bTicket.getAttempt()
00160 aInfo["time"] = bTicket.getTime()
00161 if self.__banManager.addBanTicket(bTicket):
00162 logSys.warn("[%s] Ban %s" % (self.jail.getName(), aInfo["ip"]))
00163 for action in self.__actions:
00164 action.execActionBan(aInfo)
00165 return True
00166 else:
00167 logSys.warn("[%s] %s already banned" % (self.jail.getName(),
00168 aInfo["ip"]))
00169 return False
00170
00171
00172
00173
00174
00175
00176 def __checkUnBan(self):
00177 for ticket in self.__banManager.unBanList(MyTime.time()):
00178 self.__unBan(ticket)
00179
00180
00181
00182
00183
00184
00185 def __flushBan(self):
00186 logSys.debug("Flush ban list")
00187 for ticket in self.__banManager.flushBanList():
00188 self.__unBan(ticket)
00189
00190
00191
00192
00193
00194
00195
00196 def __unBan(self, ticket):
00197 aInfo = dict()
00198 aInfo["ip"] = ticket.getIP()
00199 aInfo["failures"] = ticket.getAttempt()
00200 aInfo["time"] = ticket.getTime()
00201 logSys.warn("[%s] Unban %s" % (self.jail.getName(), aInfo["ip"]))
00202 for action in self.__actions:
00203 action.execActionUnban(aInfo)
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213 def status(self):
00214 ret = [("Currently banned", self.__banManager.size()),
00215 ("Total banned", self.__banManager.getBanTotal()),
00216 ("IP list", self.__banManager.getBanList())]
00217 return ret