filter and configuration `ignoreip` extended with file:... to ignore IPs from file-ip-set (containing IP, subnet, dns/fqdn or raw strings); the file would be read lazy on demand, by first ban (and automatically reloaded by update after small latency)

pull/3955/head
sebres 2025-03-03 19:03:48 +01:00
parent d684339edd
commit 81a5b1596b
1 changed files with 13 additions and 2 deletions

View File

@ -32,7 +32,7 @@ import time
from .actions import Actions from .actions import Actions
from .failmanager import FailManagerEmpty, FailManager from .failmanager import FailManagerEmpty, FailManager
from .ipdns import DNSUtils, IPAddr from .ipdns import DNSUtils, IPAddr, FileIPAddrSet
from .observer import Observers from .observer import Observers
from .ticket import FailTicket from .ticket import FailTicket
from .jailthread import JailThread from .jailthread import JailThread
@ -510,6 +510,12 @@ class Filter(JailThread):
# An empty string is always false # An empty string is always false
if ipstr == "": if ipstr == "":
return return
# File?
ip = FileIPAddrSet.RE_FILE_IGN_IP.match(ipstr)
if ip:
ip = DNSUtils.getIPsFromFile(ip.group(1)) # FileIPAddrSet
self.__ignoreIpList.append(ip)
return
# Create IP address object # Create IP address object
ip = IPAddr(ipstr) ip = IPAddr(ipstr)
# Avoid exact duplicates # Avoid exact duplicates
@ -532,6 +538,11 @@ class Filter(JailThread):
return return
# delete by ip: # delete by ip:
logSys.debug(" Remove %r from ignore list", ip) logSys.debug(" Remove %r from ignore list", ip)
# File?
if FileIPAddrSet.RE_FILE_IGN_IP.match(ip):
self.__ignoreIpList.remove(ip)
return
# IP / DNS
if ip in self.__ignoreIpSet: if ip in self.__ignoreIpSet:
self.__ignoreIpSet.remove(ip) self.__ignoreIpSet.remove(ip)
else: else:
@ -588,7 +599,7 @@ class Filter(JailThread):
return True return True
for net in self.__ignoreIpList: for net in self.__ignoreIpList:
if ip.isInNet(net): if ip.isInNet(net):
self.logIgnoreIp(ip, log_ignore, ignore_source=("ip" if net.isValid else "dns")) self.logIgnoreIp(ip, log_ignore, ignore_source=(net.instanceType))
if self.__ignoreCache: c.set(key, True) if self.__ignoreCache: c.set(key, True)
return True return True