From b559fd6a8427393c523ff01789089b57a4b120d8 Mon Sep 17 00:00:00 2001 From: Lorenzo Venerandi Date: Sun, 22 Feb 2026 18:41:50 +0100 Subject: [PATCH] feat: add task to flag stale IPs for reevaluation --- src/database.py | 41 +++++++++++++++++++++++++++++++++++++ src/tasks/flag_stale_ips.py | 33 +++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/tasks/flag_stale_ips.py diff --git a/src/database.py b/src/database.py index 5f0c056..9daca49 100644 --- a/src/database.py +++ b/src/database.py @@ -812,6 +812,47 @@ class DatabaseManager: finally: self.close_session() + def flag_stale_ips_for_reevaluation(self) -> int: + """ + Flag IPs for reevaluation where: + - last_seen is between 15 and 30 days ago + - last_analysis is more than 10 days ago (or never analyzed) + + Returns: + Number of IPs flagged for reevaluation + """ + session = self.session + try: + now = datetime.now() + last_seen_lower = now - timedelta(days=30) + last_seen_upper = now - timedelta(days=15) + last_analysis_cutoff = now - timedelta(days=10) + + count = ( + session.query(IpStats) + .filter( + IpStats.last_seen >= last_seen_lower, + IpStats.last_seen <= last_seen_upper, + or_( + IpStats.last_analysis <= last_analysis_cutoff, + IpStats.last_analysis.is_(None), + ), + IpStats.need_reevaluation == False, + IpStats.manual_category == False, + ) + .update( + {IpStats.need_reevaluation: True}, + synchronize_session=False, + ) + ) + session.commit() + return count + except Exception as e: + session.rollback() + raise + finally: + self.close_session() + def get_access_logs( self, limit: int = 100, diff --git a/src/tasks/flag_stale_ips.py b/src/tasks/flag_stale_ips.py new file mode 100644 index 0000000..a9e8e01 --- /dev/null +++ b/src/tasks/flag_stale_ips.py @@ -0,0 +1,33 @@ +from database import get_database +from logger import get_app_logger + +# ---------------------- +# TASK CONFIG +# ---------------------- + +TASK_CONFIG = { + "name": "flag-stale-ips", + "cron": "0 2 * * *", # Run daily at 2 AM + "enabled": True, + "run_when_loaded": False, +} + + +def main(): + app_logger = get_app_logger() + db = get_database() + + try: + count = db.flag_stale_ips_for_reevaluation() + if count > 0: + app_logger.info( + f"[Background Task] flag-stale-ips: Flagged {count} stale IPs for reevaluation" + ) + else: + app_logger.debug( + "[Background Task] flag-stale-ips: No stale IPs found to flag" + ) + except Exception as e: + app_logger.error( + f"[Background Task] flag-stale-ips: Error flagging stale IPs: {e}" + )