class EventCompatInfo(object):
    """
    Takes a zep event and maps it to the format that the UI expects
    """
    implements(IMarshallable)

    def __init__(self, dmd, event_summary):
        self._dmd = dmd
        self._event_summary = event_summary
        self._eventOccurrence = event_summary['occurrence'][0]
        self._eventActor = self._eventOccurrence['actor']
        self._eventDetails = self._findDetails(self._eventOccurrence)
        self._catalog = ICatalogTool(dmd)
        self._manager = IGUIDManager(dmd)

    @property
    def id(self):
        return self._event_summary['uuid']

    @property
    def evid(self):
        return self.id

    @property
    def dedupid(self):
        return self._eventOccurrence.get('fingerprint')

    @property
    def eventState(self):
        return EventStatus.getPrettyName(self._event_summary['status'])

    @property
    def severity(self):
        return self._eventOccurrence['severity']

    @property
    def component(self):
        return {
            'text': self._eventActor.get('element_sub_title'),
            'uid': self._getPathFromUuid(self._eventActor.get('element_sub_uuid')),
            'url' : self._uuidUrl(self._eventActor.get('element_sub_uuid')),
            'uuid' : self._eventActor.get('element_sub_uuid')
            }

    @property
    def eventClass(self):
        eventClass = self._eventOccurrence['event_class']
        return {"text": eventClass, "uid": "/zport/dmd/Events%s" % eventClass}

    @property
    def summary(self):
        return self._eventOccurrence['summary']

    @property
    def firstTime(self):
        return isoDateTimeFromMilli(self._event_summary['first_seen_time'])

    @property
    def lastTime(self):
        return isoDateTimeFromMilli(self._event_summary['last_seen_time'])

    @property
    def count(self):
        return self._event_summary['count']

    @property
    def stateChange(self):
        return isoDateTimeFromMilli(self._event_summary['status_change_time'])

    @property
    def eventClassKey(self):
        return self._eventOccurrence.get('event_class_key')

    @property
    def eventGroup(self):
        return self._eventOccurrence.get('event_group')

    @property
    def eventKey(self):
        return self._eventOccurrence.get('event_key')

    @property
    def agent(self):
        return self._eventOccurrence.get('agent')

    @property
    def monitor(self):
        return self._eventOccurrence.get('monitor')

    @property
    def ownerid(self):
        return self._event_summary.get('current_user_name')

    @property
    def facility(self):
        return self._eventOccurrence.get('syslog_facility')

    @property
    def priority(self):
        return self._eventOccurrence.get('syslog_priority')

    @property
    def eventClassMapping(self):
        return self._lookupEventClassMapping(self._eventOccurrence.get('event_class_mapping_uuid'))

    @property
    def clearid(self):
        return self._event_summary.get('cleared_by_event_uuid')

    @property
    def ntevid(self):
        return self._eventOccurrence.get('nt_event_code')

    @property
    def ipAddress(self):
        return self._eventDetails.get('zenoss.device.ip_address', '')

    @property
    def message(self):
        return self._eventOccurrence.get('message', '')

    @property
    def Location(self):
        return self._lookupDetailPath('/zport/dmd/Locations', self._eventDetails.get(EventProxy.DEVICE_LOCATION_DETAIL_KEY))

    @property
    def DeviceGroups(self):
        return self._lookupDetailPath('/zport/dmd/Groups', self._eventDetails.get(EventProxy.DEVICE_GROUPS_DETAIL_KEY))

    @property
    def Systems(self):
        return self._lookupDetailPath('/zport/dmd/Systems', self._eventDetails.get(EventProxy.DEVICE_SYSTEMS_DETAIL_KEY))

    @property
    def DeviceClass(self):
        return self._lookupDetailPath('/zport/dmd/Devices', self._eventDetails.get(EventProxy.DEVICE_CLASS_DETAIL_KEY))

    @property
    def device(self):
        device_url = self._get_device_url(self._eventDetails)
        if device_url is None:
            return  dict(text=self._eventActor.get('element_title'),
                         uid=self._getPathFromUuid(self._eventActor.get('element_uuid')),
                         url=self._uuidUrl(self._eventActor.get('element_uuid')),
                         uuid=self._eventActor.get('element_uuid'))
        else:
            return dict(text=self._eventActor.get('element_title'),
                        url=device_url)

    @property
    def prodState(self):
        prodState = self._singleDetail(self._eventDetails.get('zenoss.device.production_state'))
        if prodState is not None:
            return self._dmd.convertProdState(prodState)

    @property
    def DevicePriority(self):
        DevicePriority = self._singleDetail(self._eventDetails.get('zenoss.device.priority'))
        if DevicePriority is not None:
            return self._dmd.convertPriority(DevicePriority)

    @property
    def details(self):
        return self._eventDetails

    def __getattr__(self, name):
        if self._eventDetails.get(name):
            return self._eventDetails.get(name)
        raise AttributeError(name)

    def _uuidUrl(self, uuid):
        if uuid:
            return '/zport/dmd/goto?guid=%s' % uuid


    def _get_device_url(self, eventDetails):
        url_and_path = [self._singleDetail(eventDetails.get(k)) for k in 'zenoss.device.url', 'zenoss.device.path']
        if len(url_and_path) != 2:
            return None
        url, path = url_and_path
        try:
            self._dmd.findChild(path)
        except:
            return None
        return url

    def _singleDetail(self, value):
        """
        A convenience method for fetching a single detail from a property which
        correlates to a repeated field on the protobuf.
        """
        if isinstance(value, (tuple, list, set)) and value:
            return value[0]

    def _findDetails(self, event):
        """
        Event details are created as a dictionary like the following:
            detail = {
                'name': 'zenoss.foo.bar',
                'value': 'baz'
            }
        This method maps these detail items to a flat dictionary to facilitate
        looking up details by key easier.

        @rtype dict
        """
        details = {}
        if 'details' in event:
            for d in event['details']:
                details[d['name']] = d.get('value', ())
        return details

    def _lookupDetailPath(self, prefix, values):
        if not values:
            return ()
        paths = []
        for value in values:
            paths.append({'uid': prefix + value, 'name': value})
        return paths

    def _getPathFromUuid(self, uuid):
        if uuid:
            path = self._manager.getPath(uuid)
            if path:
                return urllib.unquote(path)

    def _lookupEventClassMapping(self, mappingUuid):
        if not mappingUuid:
            return ""

        return {'uuid': mappingUuid, 'name': self._getNameFromUuid(mappingUuid)}

    def _getNameFromUuid(self, uuid):
        """
        Given a uuid this returns the objects name
        from the catalog, it does not wake the object up
        """
        if uuid:
            path = self._getPathFromUuid(uuid)
            if path:
                brain = self._catalog.getBrain(path)
                if brain:
                    return brain.name
Exemple #2
0
class EventCompatInfo(object):
    """
    Takes a zep event and maps it to the format that the UI expects
    """
    implements(IMarshallable)

    def __init__(self, dmd, event_summary):
        self._dmd = dmd
        self._event_summary = event_summary
        self._eventOccurrence = event_summary['occurrence'][0]
        self._eventActor = self._eventOccurrence['actor']
        self._eventDetails = self._findDetails(self._eventOccurrence)
        self._catalog = IModelCatalogTool(dmd)
        self._manager = IGUIDManager(dmd)

    @property
    def id(self):
        return self._event_summary['uuid']

    @property
    def evid(self):
        return self.id

    @property
    def dedupid(self):
        return self._eventOccurrence.get('fingerprint')

    @property
    def eventState(self):
        return EventStatus.getPrettyName(self._event_summary['status'])

    @property
    def severity(self):
        return self._eventOccurrence['severity']

    @property
    def component(self):
        return {
            'text': self._eventActor.get('element_sub_title'),
            'uid':
            self._getPathFromUuid(self._eventActor.get('element_sub_uuid')),
            'url': self._uuidUrl(self._eventActor.get('element_sub_uuid')),
            'uuid': self._eventActor.get('element_sub_uuid')
        }

    @property
    def eventClass(self):
        eventClass = self._eventOccurrence['event_class']
        return {"text": eventClass, "uid": "/zport/dmd/Events%s" % eventClass}

    @property
    def summary(self):
        return self._eventOccurrence['summary']

    @property
    def firstTime(self):
        return self._event_summary['first_seen_time'] / 1000.0

    @property
    def lastTime(self):
        return self._event_summary['last_seen_time'] / 1000.0

    @property
    def count(self):
        return self._event_summary['count']

    @property
    def stateChange(self):
        return self._event_summary['status_change_time'] / 1000.0

    @property
    def eventClassKey(self):
        return self._eventOccurrence.get('event_class_key')

    @property
    def eventGroup(self):
        return self._eventOccurrence.get('event_group')

    @property
    def eventKey(self):
        return self._eventOccurrence.get('event_key')

    @property
    def agent(self):
        return self._eventOccurrence.get('agent')

    @property
    def monitor(self):
        return self._eventOccurrence.get('monitor')

    @property
    def ownerid(self):
        return self._event_summary.get('current_user_name')

    @property
    def facility(self):
        return self._eventOccurrence.get('syslog_facility')

    @property
    def priority(self):
        return self._eventOccurrence.get('syslog_priority')

    @property
    def eventClassMapping(self):
        return self._lookupEventClassMapping(
            self._eventOccurrence.get('event_class_mapping_uuid'))

    @property
    def clearid(self):
        return self._event_summary.get('cleared_by_event_uuid')

    @property
    def ntevid(self):
        return self._eventOccurrence.get('nt_event_code')

    @property
    def ipAddress(self):
        return self._eventDetails.get('zenoss.device.ip_address', '')

    @property
    def message(self):
        return self._eventOccurrence.get('message', '')

    @property
    def Location(self):
        return self._lookupDetailPath(
            '/zport/dmd/Locations',
            self._eventDetails.get(EventProxy.DEVICE_LOCATION_DETAIL_KEY))

    @property
    def DeviceGroups(self):
        return self._lookupDetailPath(
            '/zport/dmd/Groups',
            self._eventDetails.get(EventProxy.DEVICE_GROUPS_DETAIL_KEY))

    @property
    def Systems(self):
        return self._lookupDetailPath(
            '/zport/dmd/Systems',
            self._eventDetails.get(EventProxy.DEVICE_SYSTEMS_DETAIL_KEY))

    @property
    def DeviceClass(self):
        return self._lookupDetailPath(
            '/zport/dmd/Devices',
            self._eventDetails.get(EventProxy.DEVICE_CLASS_DETAIL_KEY))

    @property
    def device(self):
        device_url = self._get_device_url(self._eventDetails)
        if device_url is None:
            return dict(text=self._eventActor.get('element_title'),
                        uid=self._getPathFromUuid(
                            self._eventActor.get('element_uuid')),
                        url=self._uuidUrl(
                            self._eventActor.get('element_uuid')),
                        uuid=self._eventActor.get('element_uuid'))
        else:
            return dict(text=self._eventActor.get('element_title'),
                        url=device_url)

    @property
    def prodState(self):
        prodState = self._singleDetail(
            self._eventDetails.get('zenoss.device.production_state'))
        if prodState is not None:
            return self._dmd.convertProdState(prodState)

    @property
    def DevicePriority(self):
        DevicePriority = self._singleDetail(
            self._eventDetails.get('zenoss.device.priority'))
        if DevicePriority is not None:
            return self._dmd.convertPriority(DevicePriority)

    @property
    def details(self):
        return self._eventDetails

    def __getattr__(self, name):
        if self._eventDetails.get(name):
            return self._eventDetails.get(name)
        raise AttributeError(name)

    def _uuidUrl(self, uuid):
        if uuid:
            return '/zport/dmd/goto?guid=%s' % uuid

    def _get_device_url(self, eventDetails):
        url_and_path = [
            self._singleDetail(eventDetails.get(k))
            for k in ('zenoss.device.url', 'zenoss.device.path')
        ]
        if len(url_and_path) != 2:
            return None
        url, path = url_and_path
        try:
            self._dmd.findChild(path)
        except Exception:
            return None
        return url

    def _singleDetail(self, value):
        """
        A convenience method for fetching a single detail from a property which
        correlates to a repeated field on the protobuf.
        """
        if isinstance(value, (tuple, list, set)) and value:
            return value[0]

    def _findDetails(self, event):
        """
        Event details are created as a dictionary like the following:
            detail = {
                'name': 'zenoss.foo.bar',
                'value': 'baz'
            }
        This method maps these detail items to a flat dictionary to facilitate
        looking up details by key easier.

        @rtype dict
        """
        details = {}
        if 'details' in event:
            for d in event['details']:
                details[d['name']] = d.get('value', ())
        return details

    def _lookupDetailPath(self, prefix, values):
        if not values:
            return ()
        paths = []
        for value in values:
            paths.append({'uid': prefix + value, 'name': value})
        return paths

    def _getPathFromUuid(self, uuid):
        if uuid:
            path = self._manager.getPath(uuid)
            if path:
                return urllib.unquote(path)

    def _lookupEventClassMapping(self, mappingUuid):
        if not mappingUuid:
            return ""

        return {
            'uuid': mappingUuid,
            'name': self._getNameFromUuid(mappingUuid)
        }

    def _getNameFromUuid(self, uuid):
        """
        Given a uuid this returns the objects name
        from the catalog, it does not wake the object up
        """
        if uuid:
            path = self._getPathFromUuid(uuid)
            if path:
                brain = self._catalog.getBrain(path, fields="name")
                if brain:
                    return brain.name