From 2c69c0e7e5cfa6646afea032eb10278d75cab6fc Mon Sep 17 00:00:00 2001 From: sebres Date: Tue, 9 Jan 2018 12:15:56 +0100 Subject: [PATCH] flush jail in database: bulk remove of all IPs in the database (e. g. reload --unban). --- fail2ban/server/actions.py | 12 ++++++------ fail2ban/server/database.py | 24 +++++++++++++++--------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/fail2ban/server/actions.py b/fail2ban/server/actions.py index f98c66821..fd4263c3c 100644 --- a/fail2ban/server/actions.py +++ b/fail2ban/server/actions.py @@ -450,7 +450,7 @@ class Actions(JailThread, Mapping): """ log = True if actions is None: - logSys.debug("Flush ban list") + logSys.debug(" Flush ban list") lst = self.__banManager.flushBanList() else: log = False # don't log "[jail] Unban ..." if removing actions only. @@ -465,16 +465,16 @@ class Actions(JailThread, Mapping): else: unbactions[name] = action actions = unbactions + # flush the database also: + if db and self._jail.database is not None: + logSys.debug(" Flush jail in database") + self._jail.database.delBan(self._jail) # unban each ticket with non-flasheable actions: for ticket in lst: - # delete ip from database also: - if db and self._jail.database is not None: - ip = str(ticket.getIP()) - self._jail.database.delBan(self._jail, ip) # unban ip: self.__unBan(ticket, actions=actions, log=log) cnt += 1 - logSys.debug("Unbanned %s, %s ticket(s) in %r", + logSys.debug(" Unbanned %s, %s ticket(s) in %r", cnt, self.__banManager.size(), self._jail.name) return cnt diff --git a/fail2ban/server/database.py b/fail2ban/server/database.py index 5e23fedcd..d7ba12c15 100644 --- a/fail2ban/server/database.py +++ b/fail2ban/server/database.py @@ -533,20 +533,26 @@ class Fail2BanDb(object): ticket.getData())) @commitandrollback - def delBan(self, cur, jail, ip): - """Delete a ban from the database. + def delBan(self, cur, jail, *args): + """Delete a single or multiple tickets from the database. Parameters ---------- jail : Jail - Jail in which the ban has occurred. - ip : str - IP to be removed. + Jail in which the ticket(s) should be removed. + args : list of IP + IPs to be removed, if not given all tickets of jail will be removed. """ - queryArgs = (jail.name, str(ip)); - cur.execute( - "DELETE FROM bans WHERE jail = ? AND ip = ?", - queryArgs); + query = "DELETE FROM bans WHERE jail = ?" + queryArgs = [jail.name]; + if not len(args): + cur.execute(query, queryArgs); + return + query += " AND ip = ?" + queryArgs.append(''); + for ip in args: + queryArgs[1] = str(ip); + cur.execute(query, queryArgs); @commitandrollback def _getBans(self, cur, jail=None, bantime=None, ip=None):