diff --git a/CHANGELOG.md b/CHANGELOG.md index adde174..fe361a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - ✨ — IPv4/IPv6 choice for checks, and choice for a dual-stack check (#69) - ⚡ — Mutualize check requests (#68) - ✨ — Ability to delay notification after X failures (#71) +- 🐛 — Fix bug when changing IP version not removing tasks (#72) ## 0.6.1 diff --git a/argos/server/queries.py b/argos/server/queries.py index 0e4656c..bea4bc9 100644 --- a/argos/server/queries.py +++ b/argos/server/queries.py @@ -83,13 +83,22 @@ async def count_results(db: Session): return db.query(Result).count() -async def has_config_changed(db: Session, config: schemas.Config) -> bool: +async def has_config_changed(db: Session, config: schemas.Config) -> bool: # pylint: disable-msg=too-many-statements """Check if websites config has changed by using a hashsum and a config cache""" websites_hash = sha256(str(config.websites).encode()).hexdigest() conf_caches = db.query(ConfigCache).all() same_config = True + keys = [ + "websites_hash", + "general_frequency", + "general_recheck_delay", + "general_retry_before_notification", + "general_ipv4", + "general_ipv6", + ] if conf_caches: for conf in conf_caches: + keys.remove(conf.name) match conf.name: case "websites_hash": if conf.val != websites_hash: @@ -111,9 +120,62 @@ async def has_config_changed(db: Session, config: schemas.Config) -> bool: same_config = False conf.val = str(config.general.retry_before_notification) conf.updated_at = datetime.now() + case "general_ipv4": + if conf.val != str(config.general.ipv4): + same_config = False + conf.val = str(config.general.ipv4) + conf.updated_at = datetime.now() + case "general_ipv6": + if conf.val != str(config.general.ipv6): + same_config = False + conf.val = str(config.general.ipv6) + conf.updated_at = datetime.now() + + for i in keys: + match i: + case "websites_hash": + c = ConfigCache( + name="websites_hash", + val=websites_hash, + updated_at=datetime.now(), + ) + case "general_frequency": + c = ConfigCache( + name="general_frequency", + val=str(config.general.frequency), + updated_at=datetime.now(), + ) + case "general_recheck_delay": + c = ConfigCache( + name="general_recheck_delay", + val=str(config.general.recheck_delay), + updated_at=datetime.now(), + ) + case "general_retry_before_notification": + c = ConfigCache( + name="general_retry_before_notification", + val=str(config.general.retry_before_notification), + updated_at=datetime.now(), + ) + case "general_ipv4": + c = ConfigCache( + name="general_ipv4", + val=str(config.general.ipv4), + updated_at=datetime.now(), + ) + case "general_ipv6": + c = ConfigCache( + name="general_ipv6", + val=str(config.general.ipv6), + updated_at=datetime.now(), + ) + db.add(c) db.commit() + if keys: + return True + if same_config: return False @@ -136,10 +198,22 @@ async def has_config_changed(db: Session, config: schemas.Config) -> bool: val=str(config.general.retry_before_notification), updated_at=datetime.now(), ) + gen_ipv4 = ConfigCache( + name="general_ipv4", + val=str(config.general.ipv4), + updated_at=datetime.now(), + ) + gen_ipv6 = ConfigCache( + name="general_ipv6", + val=str(config.general.ipv6), + updated_at=datetime.now(), + ) db.add(web_hash) db.add(gen_freq) db.add(gen_recheck) db.add(gen_retry_before_notif) + db.add(gen_ipv4) + db.add(gen_ipv6) db.commit() return True @@ -173,12 +247,6 @@ async def update_from_config(db: Session, config: schemas.Config): # pylint: di continue for ip_version in ["4", "6"]: - if ip_version == "4" and ipv4 is False: - continue - - if ip_version == "6" and ipv6 is False: - continue - for p in website.paths: url = urljoin(domain, str(p.path)) for check_key, expected in p.checks: @@ -194,8 +262,15 @@ async def update_from_config(db: Session, config: schemas.Config): # pylint: di ) .all() ) + + if (ip_version == "4" and ipv4 is False) or ( + ip_version == "6" and ipv6 is False + ): + continue + if existing_tasks: existing_task = existing_tasks[0] + seen_tasks.append(existing_task.id) if frequency != existing_task.frequency: