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"]) if conf.zabbix.current_fail: conf.zabbix.current_fail = 0 return events_dict except: log.warning("Get event from zabbix error") if conf.zabbix.current_fail == conf.zabbix.alert_fail_count: log.warning(f"Zabbix connection error. Count {conf.zabbix.current_fail}") else: conf.zabbix.current_fail += 1 log.warning(f"Zabbix connection error. Count {conf.zabbix.current_fail}") 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