X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/e70ff539d3e3d53c11ea80a99f82749ec0312cb4..e929399d4dd23fa1571dd77cf489ef51d716f5cc:/utils/cron_ipanalyse.py?ds=inline diff --git a/utils/cron_ipanalyse.py b/utils/cron_ipanalyse.py index 4625de70..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: @@ -374,7 +382,7 @@ if __name__ == '__main__': fd.close() # TODO write logs (need to collect some statistics) - logstr = datetime.now().strftime('%Y-%m-%d %H:%M') + ' %s %s\n' + logstr = datetime.now().strftime('%d/%b/%Y:%H:%M:%S') + ' %s %s\n' fd = open(LOGFILE, 'a') if unblocked: fd.write(logstr % ('unblocked:', ', '.join(unblocked))) @@ -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: + 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()