import logging as log from pyexpat.errors import messages from zabbix_utils import ZabbixAPI from config import conf from datetime import datetime, timedelta def get_active_problems() -> dict: api = ZabbixAPI(url=conf.zabbix.url, token=conf.zabbix.token) try: problems = api.problem.get( output=[ "eventid", "suppressed", "severity", ], ) event_ids = [] for problem in problems: if ( problem["suppressed"] == "0" and int(problem["severity"]) >= conf.zabbix.min_severity ): event_ids.append(problem["eventid"]) events = api.event.get( selectHosts=["host"], eventids=event_ids, output=[ "eventid", "name", "severity", ], ) events_dict = {"event_ids": []} for event in events: event["host"] = event.pop("hosts", None)[0]["host"] events_dict[event["eventid"]] = event events_dict["event_ids"].append(event["eventid"]) return events_dict except: log.warning("Get event from zabbix error") def event_acknowledge(event_id: int, mute_time: int, muted_by: str): api = ZabbixAPI(url=conf.zabbix.url, token=conf.zabbix.token) if mute_time == 0: mute_to = 0 else: mute_to = int((datetime.now() + timedelta(hours=mute_time)).timestamp()) try: response = api.event.acknowledge( eventids=event_id, action=38, suppress_until=mute_to, message=muted_by, ) if response: log.info(f"Event {event_id} acknowledged") return True except: log.warning(f"Acknowledge event {event_id} from zabbix error") return False def event_close(event_id: int, closed_by: str): api = ZabbixAPI(url=conf.zabbix.url, token=conf.zabbix.token) try: response = api.event.acknowledge( eventids=event_id, action=5, message=closed_by, ) if response: log.info(f"Event {event_id} closed") return True except: log.warning(f"Closed event {event_id} from zabbix error") return False def check_state(success: bool) -> str | None: if success: if conf.zabbix.api_state == "UP": log.info("Zabbix API is UP") conf.zabbix.change_state_count = 0 else: if conf.zabbix.change_state_count == conf.zabbix.alert_fail_count: log.warning( f"Zabbix API state changed to UP. Count {conf.zabbix.change_state_count}" ) return "UP" else: conf.zabbix.change_state_count += 1 else: if conf.zabbix.api_state == "DOWN": log.info("Zabbix API is DOWN") conf.zabbix.change_state_count = 0 else: if conf.zabbix.change_state_count == conf.zabbix.alert_fail_count: log.warning( f"Zabbix API state changed to DOWN. Count {conf.zabbix.change_state_count}" ) return "DOWN" else: conf.zabbix.change_state_count += 1