diff --git a/client/jailreader.py b/client/jailreader.py index ec73ce46..ad69bfa0 100644 --- a/client/jailreader.py +++ b/client/jailreader.py @@ -40,10 +40,11 @@ class JailReader(ConfigReader): actionCRE = re.compile("^((?:\w|-|_|\.)+)(?:\[(.*)\])?$") - def __init__(self, name, **kwargs): + def __init__(self, name, force_enable=False, **kwargs): ConfigReader.__init__(self, **kwargs) self.__name = name self.__filter = None + self.__force_enable = force_enable self.__actions = list() def setName(self, value): @@ -56,7 +57,7 @@ class JailReader(ConfigReader): return ConfigReader.read(self, "jail") def isEnabled(self): - return self.__opts["enabled"] + return self.__force_enable or self.__opts["enabled"] def getOptions(self): opts = [["bool", "enabled", "false"], @@ -87,6 +88,8 @@ class JailReader(ConfigReader): # Read action for act in self.__opts["action"].split('\n'): try: + if not act: # skip empty actions + continue splitAct = JailReader.splitAction(act) action = ActionReader(splitAct, self.__name, basedir=self.getBaseDir()) ret = action.read() @@ -97,8 +100,10 @@ class JailReader(ConfigReader): raise AttributeError("Unable to read action") except Exception, e: logSys.error("Error in action definition " + act) - logSys.debug(e) + logSys.debug("Caught exception: %s" % (e,)) return False + if not len(self.__actions): + logSys.warn("No actions were defined for %s" % self.__name) return True def convert(self): @@ -143,12 +148,20 @@ class JailReader(ConfigReader): def splitAction(action): m = JailReader.actionCRE.match(action) d = dict() - if not m.group(2) == None: + mgroups = m.groups() + if len(mgroups) == 2: + action_name, action_opts = mgroups + elif len(mgroups) == 1: + action_name, action_opts = mgroups[0], None + else: + raise ValueError("While reading action %s we should have got up to " + "2 groups. Got: %r" % (action, mgroups)) + if not action_opts is None: # Huge bad hack :( This method really sucks. TODO Reimplement it. actions = "" escapeChar = None allowComma = False - for c in m.group(2): + for c in action_opts: if c in ('"', "'") and not allowComma: # Start escapeChar = c @@ -173,6 +186,6 @@ class JailReader(ConfigReader): try: d[p[0].strip()] = p[1].strip() except IndexError: - logSys.error("Invalid argument %s in '%s'" % (p, m.group(2))) - return [m.group(1), d] + logSys.error("Invalid argument %s in '%s'" % (p, action_opts)) + return [action_name, d] splitAction = staticmethod(splitAction) diff --git a/client/jailsreader.py b/client/jailsreader.py index e1b8efa3..91e178d6 100644 --- a/client/jailsreader.py +++ b/client/jailsreader.py @@ -36,9 +36,17 @@ logSys = logging.getLogger("fail2ban.client.config") class JailsReader(ConfigReader): - def __init__(self, **kwargs): + def __init__(self, force_enable=False, **kwargs): + """ + Parameters + ---------- + force_enable : bool, optional + Passed to JailReader to force enable the jails. + It is for internal use + """ ConfigReader.__init__(self, **kwargs) self.__jails = list() + self.__force_enable = force_enable def read(self): return ConfigReader.read(self, "jail") @@ -49,7 +57,7 @@ class JailsReader(ConfigReader): if section: # Get the options of a specific jail. - jail = JailReader(section, basedir=self.getBaseDir()) + jail = JailReader(section, basedir=self.getBaseDir(), force_enable=self.__force_enable) jail.read() ret = jail.getOptions() if ret: @@ -62,7 +70,7 @@ class JailsReader(ConfigReader): else: # Get the options of all jails. for sec in self.sections(): - jail = JailReader(sec, basedir=self.getBaseDir()) + jail = JailReader(sec, basedir=self.getBaseDir(), force_enable=self.__force_enable) jail.read() ret = jail.getOptions() if ret: