From 1e7883269f6f5ba61c9fc618d418b484916aba7f Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 6 Apr 2020 11:46:37 +0200 Subject: sshban: allow using SIGUSR1 to dump current state to log --- sshban.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/sshban.py b/sshban.py index 8d160f5..926ec95 100755 --- a/sshban.py +++ b/sshban.py @@ -6,6 +6,7 @@ import logging.handlers import os import re import select +import signal import shlex import sys import subprocess @@ -59,6 +60,14 @@ class ExpiringCounter: self._data = {} self.default_timeout = default_timeout + def __str__(self): + now = self._now() + ret = '' + for key, (ts, count) in self._data.items(): + ret += '%s(%d): %gs, %gs remaining\n' % (key, count, now - ts, self.default_timeout - (now - ts)) + + return ret + def __contains__(self, key): if not key in self._data: return False @@ -143,6 +152,14 @@ class Judge: return ACT_NOTHING + def __str__(self): + ret = 'Judge:\n wl: %s\n gl: %s\n' % (str(self._whitelist), str(self._graylist)) + + for key, val in self._blacklists.items(): + ret += ' bl %s: %s\n' % (key, str(val)) + + return ret + parser = argparse.ArgumentParser('Parse logs and ban SSH abusers') parser.add_argument('-s', '--thresh-short', type = int, default = 8, @@ -186,6 +203,13 @@ sys.excepthook = excepthook judge = Judge({ ACT_BAN_SHORT : args.thresh_short, ACT_BAN_MEDIUM : args.thresh_medium, ACT_BAN_LONG : args.thresh_long }) +# use SIGUSR1 to print state +def log_state(sig, stack): + state = str(judge).splitlines() + for l in state: + logger.info(l) +signal.signal(signal.SIGUSR1, log_state) + # open FIFO read-write so poll() won't return HUP endlessly if the writer dies fifofd = os.open(args.inputfifo, os.O_RDWR | os.O_NONBLOCK) with open(fifofd) as fifo: -- cgit v1.2.3