diff --git a/ChangeLog b/ChangeLog index 82e8f119..3f260e68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,8 @@ ver. 0.9.3 (2015/XX/XXX) - wanna-be-released ----------- - Fixes: + * reload server/jail failed if database used (but was not changed) and + some jail active (gh-1072) * filter.d/dovecot.conf - also match unknown user in passwd-file. Thanks Anton Shestakov * Fix fail2ban-regex not parsing journalmatch correctly from filter config diff --git a/fail2ban/server/server.py b/fail2ban/server/server.py index 6a7a6699..c8b0fded 100644 --- a/fail2ban/server/server.py +++ b/fail2ban/server/server.py @@ -494,20 +494,24 @@ class Server: return "flushed" def setDatabase(self, filename): - if len(self.__jails) == 0: - if filename.lower() == "none": - self.__db = None - else: - if Fail2BanDb is not None: - self.__db = Fail2BanDb(filename) - self.__db.delAllJails() - else: - logSys.error( - "Unable to import fail2ban database module as sqlite " - "is not available.") - else: + # if not changed - nothing to do + if self.__db and self.__db.filename == filename: + return + if not self.__db and filename.lower() == 'none': + return + if len(self.__jails) != 0: raise RuntimeError( "Cannot change database when there are jails present") + if filename.lower() == "none": + self.__db = None + else: + if Fail2BanDb is not None: + self.__db = Fail2BanDb(filename) + self.__db.delAllJails() + else: + logSys.error( + "Unable to import fail2ban database module as sqlite " + "is not available.") def getDatabase(self): return self.__db diff --git a/fail2ban/tests/servertestcase.py b/fail2ban/tests/servertestcase.py index fd43bd24..28360e11 100644 --- a/fail2ban/tests/servertestcase.py +++ b/fail2ban/tests/servertestcase.py @@ -173,8 +173,14 @@ class Transmitter(TransmitterBase): self.setGetTestNOK("dbfile", tmpFilename) self.server.delJail(self.jailName) self.setGetTest("dbfile", tmpFilename) + # the same file name (again no jails / not changed): + self.setGetTest("dbfile", tmpFilename) self.setGetTest("dbpurgeage", "600", 600) self.setGetTestNOK("dbpurgeage", "LIZARD") + # the same file name (again with jails / not changed): + self.server.addJail(self.jailName, "auto") + self.setGetTest("dbfile", tmpFilename) + self.server.delJail(self.jailName) # Disable database self.assertEqual(self.transm.proceed( @@ -189,6 +195,11 @@ class Transmitter(TransmitterBase): self.assertEqual(self.transm.proceed( ["get", "dbpurgeage"]), (0, None)) + # the same (again with jails / not changed): + self.server.addJail(self.jailName, "auto") + self.assertEqual(self.transm.proceed( + ["set", "dbfile", "None"]), + (0, None)) os.close(tmp) os.unlink(tmpFilename)