Beispiel #1
0
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