class Zabbix: def __init__(self, server, user, password, verify=True): """ Init zabbix class for further needs :param user: string :param password: string :return: pyzabbix object """ self.server = server self.user = user self.password = password # Enable HTTP auth s = requests.Session() s.auth = (user, password) self.zapi = ZabbixAPI(server, s) self.zapi.session.verify = verify self.zapi.login(user, password) self.version = self.get_version() @pyzabbix_safe() def get_version(self): """ Get Zabbix API version :return: str """ version = self.zapi.apiinfo.version() return version @pyzabbix_safe({}) def get_trigger(self, triggerid): """ Get trigger information @param triggerid: string @return: dict of data """ trigger = self.zapi.trigger.get( expandComment='true', expandDescription='true', triggerids=triggerid) return trigger[0] @pyzabbix_safe({}) def get_event(self, triggerid): """ Get event information based on triggerid @param triggerid: string @return: dict of data """ zbx_event = self.zapi.event.get( select_acknowledges='extend', expandDescription='true', object=0, value=1, objectids=triggerid) if len(zbx_event) >= 1: return zbx_event[-1] return zbx_event @pyzabbix_safe([]) def get_itservices(self, root=None): """ Return tree of Zabbix IT Services root (hidden) - service1 (Cachet componentgroup) - child_service1 (Cachet component) - child_service2 (Cachet component) - service2 (Cachet componentgroup) - child_service3 (Cachet component) :param root: Name of service that will be root of tree. Actually it will not be present in return tree. It's using just as a start point , string :return: Tree of Zabbix IT Services :rtype: list """ if root: root_service = self.zapi.service.get( selectDependencies='extend', filter={'name': root}) try: root_service = root_service[0] except IndexError: logging.error('Can not find "{}" service in Zabbix'.format(root)) sys.exit(1) service_ids = [] for dependency in root_service['dependencies']: service_ids.append(dependency['serviceid']) services = self.zapi.service.get( selectDependencies='extend', serviceids=service_ids) else: services = self.zapi.service.get( selectDependencies='extend', output='extend') if not services: logging.error('Can not find any child service for "{}"'.format(root)) return [] # Create a tree of services known_ids = [] # At first proceed services with dependencies as groups service_tree = [i for i in services if i['dependencies']] for idx, service in enumerate(service_tree): child_services_ids = [] for dependency in service['dependencies']: child_services_ids.append(dependency['serviceid']) child_services = self.zapi.service.get( selectDependencies='extend', serviceids=child_services_ids) service_tree[idx]['dependencies'] = child_services # Save ids to filter them later known_ids = known_ids + child_services_ids known_ids.append(service['serviceid']) # At proceed services without dependencies as singers singers_services = [i for i in services if i['serviceid'] not in known_ids] if singers_services: service_tree = service_tree + singers_services return service_tree