3
0
mirror of https://github.com/jlu5/PyLink.git synced 2025-02-20 07:20:59 +01:00

servprotect: migrate to cachetools (but leave expiringdict as fallback)

Closes #445.
This commit is contained in:
James Lu 2019-05-13 16:59:57 +08:00
parent d082495297
commit ec379a6e81

View File

@ -1,16 +1,27 @@
# servprotect.py: Protects against KILL and nick collision floods # servprotect.py: Protects against KILL and nick collision floods
from expiringdict import ExpiringDict
import threading
from pylinkirc import utils, conf from pylinkirc import utils, conf
from pylinkirc.log import log from pylinkirc.log import log
try:
from cachetools import TTLCache
except ImportError:
log.warning('servprotect: expiringdict support is deprecated as of PyLink 2.1; consider installing cachetools instead')
from expiringdict import ExpiringDict as TTLCache
# check for definitions # check for definitions
servprotect_conf = conf.conf.get('servprotect', {}) servprotect_conf = conf.conf.get('servprotect', {})
length = servprotect_conf.get('length', 10) length = servprotect_conf.get('length', 10)
age = servprotect_conf.get('age', 10) age = servprotect_conf.get('age', 10)
savecache = ExpiringDict(max_len=length, max_age_seconds=age) def _new_cache_dict():
killcache = ExpiringDict(max_len=length, max_age_seconds=age) return TTLCache(length, age)
savecache = _new_cache_dict()
killcache = _new_cache_dict()
lock = threading.Lock()
def handle_kill(irc, numeric, command, args): def handle_kill(irc, numeric, command, args):
""" """
@ -19,12 +30,13 @@ def handle_kill(irc, numeric, command, args):
""" """
if (args['userdata'] and irc.is_internal_server(args['userdata'].server)) or irc.is_internal_client(args['target']): if (args['userdata'] and irc.is_internal_server(args['userdata'].server)) or irc.is_internal_client(args['target']):
if killcache.setdefault(irc.name, 1) >= length: with lock:
log.error('(%s) servprotect: Too many kills received, aborting!', irc.name) if killcache.setdefault(irc.name, 1) >= length:
irc.disconnect() log.error('(%s) servprotect: Too many kills received, aborting!', irc.name)
irc.disconnect()
log.debug('(%s) servprotect: Incrementing killcache by 1', irc.name) log.debug('(%s) servprotect: Incrementing killcache by 1', irc.name)
killcache[irc.name] += 1 killcache[irc.name] += 1
utils.add_hook(handle_kill, 'KILL') utils.add_hook(handle_kill, 'KILL')
@ -34,11 +46,12 @@ def handle_save(irc, numeric, command, args):
automatically disconnects from the network. automatically disconnects from the network.
""" """
if irc.is_internal_client(args['target']): if irc.is_internal_client(args['target']):
if savecache.setdefault(irc.name, 0) >= length: with lock:
log.error('(%s) servprotect: Too many nick collisions, aborting!', irc.name) if savecache.setdefault(irc.name, 0) >= length:
irc.disconnect() log.error('(%s) servprotect: Too many nick collisions, aborting!', irc.name)
irc.disconnect()
log.debug('(%s) servprotect: Incrementing savecache by 1', irc.name) log.debug('(%s) servprotect: Incrementing savecache by 1', irc.name)
savecache[irc.name] += 1 savecache[irc.name] += 1
utils.add_hook(handle_save, 'SAVE') utils.add_hook(handle_save, 'SAVE')