diff --git a/conf.py b/conf.py index db768f6..49f2dd7 100644 --- a/conf.py +++ b/conf.py @@ -86,6 +86,7 @@ def validateConf(conf, logger=None): if newlogins: validate(conf.get('permissions'), "New-style accounts enabled but no permissions block was found. You will not be able to administrate your PyLink instance!") + return conf diff --git a/example-conf.yml b/example-conf.yml index 1d964b3..9323ec5 100644 --- a/example-conf.yml +++ b/example-conf.yml @@ -382,6 +382,10 @@ plugins: # Servermaps plugin: displays network /map's from the PyLink server's perspective. #- servermaps + # Servprotect plugin: disconnects from network if a certain limit + # of kills/saves per X seconds is met. + #- servprotect + logging: # This configuration block defines targets that PyLink should log commands, # errors, etc., to. @@ -566,6 +570,20 @@ relay: # #clientbot_modesync: none +#servprotect: + # This block configures the servprotect plugin. + # You don't need this if you aren't using it. + + # length: How many KILL/SAVE's before a disconnect + + #length: 5 + + # time: Determines how much time should pass before + # the servprotect cache is reset. + + #max_age: 10 + + automode: # The following options in this block are common to all plugins that spawn service bots (games, # automode, etc.): diff --git a/plugins/servprotect.py b/plugins/servprotect.py index 5a1ae04..1700b68 100644 --- a/plugins/servprotect.py +++ b/plugins/servprotect.py @@ -1,19 +1,23 @@ # servprotect.py: Protects against KILL and nick collision floods from expiringdict import ExpiringDict -from pylinkirc import utils +from pylinkirc import utils, conf from pylinkirc.log import log -# TODO: make length and time configurable -savecache = ExpiringDict(max_len=5, max_age_seconds=10) -killcache = ExpiringDict(max_len=5, max_age_seconds=10) +# check for definitions +servprotect_conf = conf.conf.get('servprotect', {}) +length = servprotect_conf.get('length,' 5) +age = servprotect_conf.get('age', 10) + +savecache = ExpiringDict(max_len=length, max_age_seconds=age) +killcache = ExpiringDict(max_len=length, max_age_seconds=age) def handle_kill(irc, numeric, command, args): """ Tracks kills against PyLink clients. If too many are received, automatically disconnects from the network. """ - if killcache.setdefault(irc.name, 1) >= 5: + if killcache.setdefault(irc.name, 1) >= length: log.error('(%s) servprotect: Too many kills received, aborting!', irc.name) irc.disconnect() @@ -27,7 +31,7 @@ def handle_save(irc, numeric, command, args): Tracks SAVEs (nick collision) against PyLink clients. If too many are received, automatically disconnects from the network. """ - if savecache.setdefault(irc.name, 0) >= 5: + if savecache.setdefault(irc.name, 0) >= length: log.error('(%s) servprotect: Too many nick collisions, aborting!', irc.name) irc.disconnect()