summaryrefslogtreecommitdiff
path: root/fail2ban/server
diff options
context:
space:
mode:
Diffstat (limited to 'fail2ban/server')
-rw-r--r--fail2ban/server/action.py50
-rw-r--r--fail2ban/server/datedetector.py13
-rw-r--r--fail2ban/server/datetemplate.py2
-rw-r--r--fail2ban/server/failregex.py8
-rw-r--r--fail2ban/server/filter.py18
-rw-r--r--fail2ban/server/filterpyinotify.py4
-rw-r--r--fail2ban/server/mytime.py12
-rw-r--r--fail2ban/server/server.py2
8 files changed, 56 insertions, 53 deletions
diff --git a/fail2ban/server/action.py b/fail2ban/server/action.py
index b8356799..baccca08 100644
--- a/fail2ban/server/action.py
+++ b/fail2ban/server/action.py
@@ -17,18 +17,12 @@
# along with Fail2Ban; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# Author: Cyril Jaquier
-#
-# $Revision$
-
-__author__ = "Cyril Jaquier"
-__version__ = "$Revision$"
-__date__ = "$Date$"
-__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
+__author__ = "Cyril Jaquier and Fail2Ban Contributors"
+__copyright__ = "Copyright (c) 2004 Cyril Jaquier, 2011-2012 Yaroslav Halchenko"
__license__ = "GPL"
import logging, os
-import threading
+import threading, re
#from subprocess import call
# Gets the instance of the logger.
@@ -143,6 +137,10 @@ class Action:
# @return True if the command succeeded
def execActionStart(self):
+ if self.__cInfo:
+ if not Action.substituteRecursiveTags(self.__cInfo):
+ logSys.error("Cinfo/definitions contain self referencing definitions and cannot be resolved")
+ return False
startCmd = Action.replaceTag(self.__actionStart, self.__cInfo)
return Action.executeCmd(startCmd)
@@ -242,6 +240,38 @@ class Action:
stopCmd = Action.replaceTag(self.__actionStop, self.__cInfo)
return Action.executeCmd(stopCmd)
+ ##
+ # Sort out tag definitions within other tags
+ #
+ # so: becomes:
+ # a = 3 a = 3
+ # b = <a>_3 b = 3_3
+ # @param tags, a dictionary
+ # @returns tags altered or False if there is a recursive definition
+ #@staticmethod
+ def substituteRecursiveTags(tags):
+ t = re.compile(r'<([^ >]+)>')
+ for tag, value in tags.iteritems():
+ value = str(value)
+ m = t.search(value)
+ while m:
+ if m.group(1) == tag:
+ # recursive definitions are bad
+ return False
+ else:
+ if tags.has_key(m.group(1)):
+ value = value[0:m.start()] + tags[m.group(1)] + value[m.end():]
+ m = t.search(value, m.start())
+ else:
+ # Missing tags are ok so we just continue on searching.
+ # cInfo can contain aInfo elements like <HOST> and valid shell
+ # constructs like <STDIN>.
+ m = t.search(value, m.start() + 1)
+ tags[tag] = value
+ return tags
+ substituteRecursiveTags = staticmethod(substituteRecursiveTags)
+
+ #@staticmethod
def escapeTag(tag):
for c in '\\#&;`|*?~<>^()[]{}$\n\'"':
if c in tag:
@@ -304,7 +334,7 @@ class Action:
return False
# Replace tags
- if not aInfo == None:
+ if not aInfo is None:
realCmd = Action.replaceTag(cmd, aInfo)
else:
realCmd = cmd
diff --git a/fail2ban/server/datedetector.py b/fail2ban/server/datedetector.py
index a29c9757..6b66253b 100644
--- a/fail2ban/server/datedetector.py
+++ b/fail2ban/server/datedetector.py
@@ -17,13 +17,7 @@
# along with Fail2Ban; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# Author: Cyril Jaquier
-#
-# $Revision$
-
-__author__ = "Cyril Jaquier"
-__version__ = "$Revision$"
-__date__ = "$Date$"
+__author__ = "Cyril Jaquier and Fail2Ban Contributors"
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
__license__ = "GPL"
@@ -203,10 +197,7 @@ class DateDetector:
def getUnixTime(self, line):
date = self.getTime(line)
- if date == None:
- return None
- else:
- return time.mktime(tuple(date))
+ return date and time.mktime(tuple(date))
##
# Sort the template lists using the hits score. This method is not called
diff --git a/fail2ban/server/datetemplate.py b/fail2ban/server/datetemplate.py
index f77f00c9..94523fba 100644
--- a/fail2ban/server/datetemplate.py
+++ b/fail2ban/server/datetemplate.py
@@ -65,7 +65,7 @@ class DateTemplate:
def matchDate(self, line):
dateMatch = self.__cRegex.search(line)
- if not dateMatch == None:
+ if not dateMatch is None:
self.__hits += 1
return dateMatch
diff --git a/fail2ban/server/failregex.py b/fail2ban/server/failregex.py
index 890cd364..3d05ad55 100644
--- a/fail2ban/server/failregex.py
+++ b/fail2ban/server/failregex.py
@@ -17,13 +17,7 @@
# along with Fail2Ban; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# Author: Cyril Jaquier
-#
-# $Revision$
-
__author__ = "Cyril Jaquier"
-__version__ = "$Revision$"
-__date__ = "$Date$"
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
__license__ = "GPL"
@@ -191,7 +185,7 @@ class FailRegex(Regex):
def getHost(self):
host = self._matchCache.group("host")
- if host == None:
+ if host is None:
# Gets a few information.
s = self._matchCache.string
r = self._matchCache.re
diff --git a/fail2ban/server/filter.py b/fail2ban/server/filter.py
index d4108dc2..1e71c55f 100644
--- a/fail2ban/server/filter.py
+++ b/fail2ban/server/filter.py
@@ -17,14 +17,8 @@
# along with Fail2Ban; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# Author: Cyril Jaquier
-#
-# $Revision$
-
-__author__ = "Cyril Jaquier"
-__version__ = "$Revision$"
-__date__ = "$Date$"
-__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
+__author__ = "Cyril Jaquier and Fail2Ban Contributors"
+__copyright__ = "Copyright (c) 2004 Cyril Jaquier, 2011-2013 Yaroslav Halchenko"
__license__ = "GPL"
from failmanager import FailManagerEmpty
@@ -384,7 +378,7 @@ class Filter(JailThread):
continue
# The failregex matched.
date = self.dateDetector.getUnixTime(timeLine)
- if date == None:
+ if date is None:
logSys.debug("Found a match for %r but no valid date/time "
"found for %r. Please file a detailed issue on"
" https://github.com/fail2ban/fail2ban/issues "
@@ -521,7 +515,7 @@ class FileFilter(Filter):
def getFailures(self, filename):
container = self.getFileContainer(filename)
- if container == None:
+ if container is None:
logSys.error("Unable to get failures in " + filename)
return False
# Try to open log file.
@@ -626,7 +620,7 @@ class FileContainer:
self.__handler.seek(self.__pos)
def readline(self):
- if self.__handler == None:
+ if self.__handler is None:
return ""
line = self.__handler.readline()
try:
@@ -639,7 +633,7 @@ class FileContainer:
return line
def close(self):
- if not self.__handler == None:
+ if not self.__handler is None:
# Saves the last position.
self.__pos = self.__handler.tell()
# Closes the file.
diff --git a/fail2ban/server/filterpyinotify.py b/fail2ban/server/filterpyinotify.py
index 786c6dfa..03623ddb 100644
--- a/fail2ban/server/filterpyinotify.py
+++ b/fail2ban/server/filterpyinotify.py
@@ -66,7 +66,7 @@ class FilterPyinotify(FileFilter):
def callback(self, event, origin=''):
logSys.debug("%sCallback for Event: %s", origin, event)
path = event.pathname
- if event.mask & pyinotify.IN_CREATE:
+ if event.mask & ( pyinotify.IN_CREATE | pyinotify.IN_MOVED_TO ):
# skip directories altogether
if event.mask & pyinotify.IN_ISDIR:
logSys.debug("Ignoring creation of directory %s", path)
@@ -130,7 +130,7 @@ class FilterPyinotify(FileFilter):
if not (path_dir in self.__watches):
# we need to watch also the directory for IN_CREATE
self.__watches.update(
- self.__monitor.add_watch(path_dir, pyinotify.IN_CREATE))
+ self.__monitor.add_watch(path_dir, pyinotify.IN_CREATE | pyinotify.IN_MOVED_TO))
logSys.debug("Added monitor for the parent directory %s", path_dir)
self._addFileWatcher(path)
diff --git a/fail2ban/server/mytime.py b/fail2ban/server/mytime.py
index 286f3d2c..8ae85184 100644
--- a/fail2ban/server/mytime.py
+++ b/fail2ban/server/mytime.py
@@ -17,13 +17,7 @@
# along with Fail2Ban; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# Author: Cyril Jaquier
-#
-# $Revision$
-
__author__ = "Cyril Jaquier"
-__version__ = "$Revision$"
-__date__ = "$Date$"
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
__license__ = "GPL"
@@ -61,7 +55,7 @@ class MyTime:
#@staticmethod
def time():
- if MyTime.myTime == None:
+ if MyTime.myTime is None:
return time.time()
else:
return MyTime.myTime
@@ -74,14 +68,14 @@ class MyTime:
#@staticmethod
def gmtime():
- if MyTime.myTime == None:
+ if MyTime.myTime is None:
return time.gmtime()
else:
return time.gmtime(MyTime.myTime)
gmtime = staticmethod(gmtime)
def localtime(x=None):
- if MyTime.myTime == None or x is not None:
+ if MyTime.myTime is None or x is not None:
return time.localtime(x)
else:
return time.localtime(MyTime.myTime)
diff --git a/fail2ban/server/server.py b/fail2ban/server/server.py
index 092867bf..f194b3a1 100644
--- a/fail2ban/server/server.py
+++ b/fail2ban/server/server.py
@@ -402,7 +402,7 @@ class Server:
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
# Does not display this message at startup.
- if not self.__logTarget == None:
+ if not self.__logTarget is None:
logSys.info("Changed logging target to %s for Fail2ban v%s" %
(target, version.version))
# Sets the logging target.