X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/275f3b26560a44099dff762776277812ef0f122f..efddd1339de9876e4f1681ee0629bb09e76ae1a1:/utils/cron_ipanalyse.py diff --git a/utils/cron_ipanalyse.py b/utils/cron_ipanalyse.py index 1ca2267f..66d122cd 100755 --- a/utils/cron_ipanalyse.py +++ b/utils/cron_ipanalyse.py @@ -223,6 +223,7 @@ class BlockList: class IPstats: def __init__(self): + self.redirected = 0 self.short_total = 0 self.short_api = 0 self.long_total = 0 @@ -232,6 +233,8 @@ class IPstats: def add_long(self, logentry): self.long_total += 1 + if logentry.retcode == 301: + return if logentry.request is not None: self.long_api += 1 if not self.bad_ua: @@ -240,6 +243,9 @@ class IPstats: def add_short(self, logentry): self.short_total += 1 + if logentry.retcode == 301: + self.redirected += 1 + return if logentry.request is not None: self.short_api += 1 self.add_long(logentry) @@ -247,15 +253,17 @@ class IPstats: def add_block(self, logentry): self.block_total += 1 - def ignores_warnings(self): - return self.block_total > 5 + def ignores_warnings(self, wasblocked): + return self.block_total > 5 or (wasblocked and self.redirected > 5) def new_state(self, was_blocked, was_bulked): if was_blocked: # deblock only if the IP has been really quiet # (properly catches the ones that simply ignore the HTTP error) return None if self.long_total < 20 else 'block' - if self.long_api > BLOCK_UPPER or self.short_api > BLOCK_UPPER / 3: + if self.long_api > BLOCK_UPPER \ + or self.short_api > BLOCK_UPPER / 3 \ + or (self.redirected > 100 and self.short_total == self.redirected): # client totally overdoing it return 'block' if was_bulked: @@ -389,6 +397,6 @@ if __name__ == '__main__': if blocked: fd.write(logstr % ('new block:', ', '.join(blocked))) for k,v in stats.items(): - if v.ignores_warnings() and k not in notlogged and ':' not in k: + if v.ignores_warnings(k in bl.prevblocks) and k not in notlogged and ':' not in k: fd.write(logstr % ('Warning ignored:', k)) fd.close()