def load_device(self, dmd, access_id, secret,
                 path='', windowspath=''):
     getFacade('aws', dmd).configure(
                 access_id, secret, path, windowspath)
     commit()
     mgrPath = '/zport/dmd/Devices/AWS/EC2/devices/EC2Manager'
     mgr = dmd.restrictedTraverse(mgrPath)
     mgr.collectDevice()
示例#2
0
 def __init__(self, *args, **kwargs):
     super(supportPoller, self).__init__(*args, **kwargs)
     self.deviceFacade = getFacade('device', self.dmd)
     self.zport = self.dmd.zport
     self.sync = self.zport._p_jar.sync
     self.log = logging.getLogger("zen.GoVanguard.Support.Poller")
     self.cycleNumber = 0
示例#3
0
    def load(self, configData):
        """
        configData is a JSON dict that contains a key of the same
        name as specified in this class (ie self.key).

        The value from this key is expected to be an arrary of dictionaries
        as used by the ZEP system. See the documentation in the 
        ZenModel/ZenPackTemplate/CONTENT/zep/zep.json.example file.
        """
        if configData:
            self.zep = getFacade('zep')
            items = configData.get(EventDetailItemHandler.key)
            if items is None:
                log.warn(
                    "Expected key '%s' for details is missing from the zep.json file",
                    self.key)
                return
            detailItemSet = from_dict(
                EventDetailItemSet,
                dict(
                    # An empty array in details casues ZEP to puke
                    details=items))
            try:
                self.zep.addIndexedDetails(detailItemSet)
            except Exception as ex:
                log.error(
                    "ZEP %s error adding detailItemSet data: %s\nconfigData= %s",
                    getattr(ex, 'status', 'unknown'), detailItemSet,
                    configData)
                log.error("See the ZEP logs for more information.")
def add_threshold(dmd, device_class, template, id_, cfg):
    tf = getFacade('template', dmd)
    # This is weird, the catalog is making us look up the datapoints at the
    # deviceclass level
    points = []
    allpoints = [(ds._object.name(), ds)
                 for ds in tf.getDataSources(device_class.uid)]

    # Handle a single datapoint
    if isinstance(cfg['dataPoints'], str):
        cfg['dataPoints'] = [cfg['dataPoints']]

    for dp in cfg['dataPoints']:
        for item in allpoints:
            if item[0] == dp:
                points.append(item[1].uid)
    tf.addThreshold(template.uid, cfg['type'], id_, points)
    threshold = [
        t for t in tf.getThresholds(template.uid + '/thresholds/' + id_)
    ][0]

    # Apply cfg items directly to threshold attributes.
    for k, v in cfg.items():
        if k not in ('dataPoints', 'type'):
            setattr(threshold, k, v)
def add_datapoint(dmd, datasource, id_, cfg):
    tf = getFacade('template', dmd)
    datapoint = tf.addDataPoint(datasource.uid, str(id_))

    # http://jira.zenoss.com/jira/browse/ZEN-5017
    datapoint = ZuulInfo(datapoint)

    # Handle cfg shortcuts like DERIVE_MIN_0 and GAUGE_MIN_0_MAX_100.
    if isinstance(cfg, types.StringTypes):
        if 'DERIVE' in cfg.upper():
            datapoint.rrdtype = 'DERIVE'

        min_match = re.search(r'MIN_(\d+)', cfg, re.IGNORECASE)
        if min_match:
            datapoint.rrdmin = min_match.group(1)

        max_match = re.search(r'MAX_(\d+)', cfg, re.IGNORECASE)
        if max_match:
            datapoint.rrdmax = max_match.group(1)

    else:
        # Apply cfg items directly to datasource attributes.
        for k, v in cfg.items():
            if k not in ('aliases'):
                setattr(datapoint, k, v)

        if 'aliases' in cfg:
            add_aliases(dmd, datapoint, cfg['aliases'])
示例#6
0
    def getIpAddresses(self, limit=0, start=0, sort='ipAddressAsInt', dir='DESC',
              params=None, uid=None, criteria=()):
        infos = []
        cat = ICatalogTool(self._getObject(uid))
        reverse = dir=='DESC'

        brains = cat.search("Products.ZenModel.IpAddress.IpAddress",
                            start=start, limit=limit,
                            orderby=sort, reverse=reverse)

        for brain in brains:
            infos.append(IInfo(unbrain(brain)))

        devuuids = set(info.device.uuid for info in infos if info.device)

        # get ping severities
        zep = getFacade('zep')
        pingSeverities = zep.getEventSeverities(devuuids,
                                                      severities=(),
                                                      status=(),
                                                      eventClass=Status_Ping)
        self._assignPingStatuses(infos, pingSeverities)

        # get snmp severities
        snmpSeverities = zep.getEventSeverities(devuuids,
                                                      severities=(),
                                                      status=(),
                                                      eventClass=Status_Snmp)
        self._assignSnmpStatuses(infos, snmpSeverities)

        return SearchResults(infos, brains.total, brains.hash_)
    def __init__(self):
        """
        create object and and coonect to the db
        """
        ZenScriptBase.__init__(self, connect=True)
        self.log = logging.getLogger("EventModder")
	    self.api = getFacade("event")
示例#8
0
    def getComponentTree(self, uid):
        from Products.ZenEvents.EventManagerBase import EventManagerBase
        componentTypes = {}
        uuidMap = {}

        dev = self._getObject(uid)
        for brain in dev.componentSearch():
            uuidMap[brain.getUUID] = brain.meta_type
            compType = componentTypes.setdefault(brain.meta_type, { 'count' : 0, 'severity' : 0 })
            compType['count'] += 1

        # Do one big lookup of component events and merge back in to type later
        if not uuidMap:
            return []

        zep = getFacade('zep')
        showSeverityIcon = self.context.dmd.UserInterfaceSettings.getInterfaceSettings().get('showEventSeverityIcons')
        if showSeverityIcon:
            severities = zep.getWorstSeverity(uuidMap.keys())
            for uuid, sev in severities.iteritems():
                compType = componentTypes[uuidMap[uuid]]
                compType['severity'] = max(compType['severity'], sev)

        result = []
        for name, compType in componentTypes.iteritems():
            result.append({
                'type' : name,
                'count' : compType['count'],
                'severity' : EventManagerBase.severities.get(compType['severity'], 0).lower()
            })

        return result
示例#9
0
    def getDeviceDashboard(self):
        """return device info for bad device to dashboard"""
        zep = getFacade('zep')
        manager = IGUIDManager(self.context.dmd)
        deviceSeverities = zep.getDeviceIssuesDict()
        zem = self.context.dmd.ZenEventManager

        devdata = []
        for uuid in deviceSeverities.keys():
            dev = manager.getObject(uuid)
            if dev and isinstance(dev, Device):
                if (not zem.checkRemotePerm(ZEN_VIEW, dev)
                    or dev.productionState < zem.prodStateDashboardThresh
                    or dev.priority < zem.priorityDashboardThresh):
                    continue
                alink = dev.getPrettyLink()
                try:
                    severities = deviceSeverities[uuid]
                    severities = dict((zep.getSeverityName(sev).lower(), counts) for (sev, counts) in severities.iteritems())
                    pill = getEventPillME(dev, severities=severities)
                except ServiceException:
                    continue
                evts = [alink,pill]
                devdata.append((evts, severities))
        devdata.sort(key=lambda x:(x[1]['critical'], x[1]['error'], x[1]['warning']), reverse=True)
        return [x[0] for x in devdata[:100]]
示例#10
0
    def load(self, configData):
        """
        configData is a JSON dict that contains a key of the same
        name as specified in this class (ie self.key).

        The value from this key is expected to be an arrary of dictionaries
        as used by the ZEP system. See the documentation in the 
        ZenModel/ZenPackTemplate/CONTENT/zep/zep.json.example file.
        """
        if configData:
            self.zep = getFacade('zep')
            items = configData.get(EventDetailItemHandler.key)
            if items is None:
                log.warn("Expected key '%s' for details is missing from the zep.json file",
                          self.key)
                return
            detailItemSet = from_dict(EventDetailItemSet, dict(
                # An empty array in details casues ZEP to puke
                details = items
            ))
            try:
                self.zep.addIndexedDetails(detailItemSet)
            except Exception as ex:
                log.error("ZEP %s error adding detailItemSet data: %s\nconfigData= %s",
                              getattr(ex, 'status', 'unknown'), detailItemSet, configData)
                log.error("See the ZEP logs for more information.")
示例#11
0
 def getRRDValues(self,
                  dsnames,
                  start=None,
                  end=None,
                  function="LAST",
                  format="%.2lf",
                  extraRpn="",
                  cf="AVERAGE"):
     """
     Return a dict of key value pairs where dsnames are the keys.
     """
     try:
         fac = getFacade('metric', self.dmd)
         return fac.getValues(self,
                              dsnames,
                              start=start,
                              end=end,
                              format=format,
                              extraRpn=extraRpn,
                              cf=cf)
     except Exception:
         log.exception("Unable to collect metric values for %s",
                       self.getPrimaryId())
     # couldn't get any metrics return an empty dictionary
     return {}
示例#12
0
    def getDevices(self, uid=None, start=0, limit=50, sort='name', dir='ASC',
                   params=None, hashcheck=None):
        params = params if params else {}
        # Passing a key that's not an index in the catalog will
        # cause a serious performance penalty.  Remove 'status' from
        # the 'params' parameter before passing it on.
        statuses = params.pop('status', None)
        brains = self.getDeviceBrains(uid, start, limit, sort, dir, params,
                                      hashcheck)

        # ZEN-10057 - Handle the case of empty results for a filter with no matches
        if not brains:
            return SearchResults(iter([]), 0, '0')

        devices = [ IInfo(obj) for obj in imap(unbrain, brains) if obj ]

        if statuses is not None and len(statuses) < 3:
            devices = [d for d in devices if d.status in statuses]

        uuids = set(dev.uuid for dev in devices)
        if uuids:
            zep = getFacade('zep', self._dmd)
            severities = zep.getEventSeverities(uuids)
            for device in devices:
                device.setEventSeverities(severities[device.uuid])

        return SearchResults(iter(devices), brains.total, brains.hash_)
示例#13
0
    def load_device(self,
                    dmd,
                    deviceName,
                    username,
                    api_key,
                    project_id,
                    user_domain_name,
                    project_domain_name,
                    auth_url,
                    ceilometer_url=None,
                    region_name=None,
                    collector='localhost'):

        # we accept, but do not use, the ceilometer_url parameter for backwards
        # compatability reasons.

        return getFacade('openstackinfrastructure',
                         dmd).addOpenStack(deviceName,
                                           username,
                                           api_key,
                                           project_id,
                                           user_domain_name,
                                           project_domain_name,
                                           auth_url,
                                           region_name=region_name,
                                           collector=collector)
示例#14
0
 def _verifyZepRunning(self):
     zep = getFacade('zep')
     try:
         zep.getConfig()
         return True
     except ServiceException:
         return False
示例#15
0
    def snippet(self):
        last_path_item = self.request['PATH_INFO'].split('/')[-1]
        archive = last_path_item.lower().find('history') != -1 or last_path_item.lower().find('archive') != -1

        result = ["Ext.onReady(function(){"]

        defs = column_config(self.request, archive=archive)

        reader_fields = reader_config(archive=archive)

        result.append('Zenoss.env.COLUMN_DEFINITIONS=[')
        result.append(',\n'.join(defs))
        result.append('];')

        result.append('Zenoss.env.READER_DEFINITIONS=[')
        result.append(',\n'.join(reader_fields))
        result.append('];')

        result.append('Zenoss.env.ZP_DETAILS=[')
        try:
            zepdetails = getFacade('zep').getUnmappedDetails()
            zpdetails = []
            for detail in zepdetails:
                if detail['type'] in (EventDetailItem.STRING, EventDetailItem.IP_ADDRESS, EventDetailItem.PATH):
                    rulecmp = 'Zenoss.form.rule.STRINGCOMPARISONS'
                else:
                    rulecmp = 'Zenoss.form.rule.NUMBERCOMPARISONS'
                zpdetails.append("{{ text: _t('{name}'), value: '{key}', comparisons: {cmp} }}".format(name=detail['name'], key=detail['key'], cmp=rulecmp))
            result.append(',\n'.join(zpdetails))
        except ZepConnectionError, e:
            log.error(e.message)
示例#16
0
    def getIpAddresses(self, limit=0, start=0, sort='ipAddressAsInt', dir='DESC',
              params=None, uid=None, criteria=()):
        infos = []
        cat = ICatalogTool(self._getObject(uid))
        reverse = dir=='DESC'

        brains = cat.search("Products.ZenModel.IpAddress.IpAddress",
                            start=start, limit=limit,
                            orderby=sort, reverse=reverse)

        for brain in brains:
            infos.append(IInfo(unbrain(brain)))

        devuuids = set(info.device.uuid for info in infos if info.device)

        # get ping severities
        zep = getFacade('zep')
        pingSeverities = zep.getEventSeverities(devuuids,
                                                      severities=(),
                                                      status=(),
                                                      eventClass=Status_Ping)
        self._assignPingStatuses(infos, pingSeverities)

        # get snmp severities
        snmpSeverities = zep.getEventSeverities(devuuids,
                                                      severities=(),
                                                      status=(),
                                                      eventClass=Status_Snmp)
        self._assignSnmpStatuses(infos, snmpSeverities)

        return SearchResults(infos, brains.total, brains.hash_)
示例#17
0
 def event_count(self):
     zep = getFacade('zep')
     try:
         yield "Event Count", zep.countEventsSince(time.time() -
                                                   24 * 60 * 60)
     except ZepConnectionError:
         yield "Event Count: last 24hr", "Not Available"
示例#18
0
    def snippet(self):
        last_path_item = self.request['PATH_INFO'].split('/')[-1]
        archive = last_path_item.lower().find('history') != -1 or last_path_item.lower().find('archive') != -1

        result = ["Ext.onReady(function(){"]

        defs = column_config(self.request, archive=archive)

        reader_fields = reader_config(archive=archive)

        result.append('Zenoss.env.COLUMN_DEFINITIONS=[')
        result.append(',\n'.join(defs))
        result.append('];')

        result.append('Zenoss.env.READER_DEFINITIONS=[')
        result.append(',\n'.join(reader_fields))
        result.append('];')

        result.append('Zenoss.env.ZP_DETAILS=[')
        try:
            zepdetails = getFacade('zep').getUnmappedDetails()
            zpdetails = []
            for detail in zepdetails:
                if detail['type'] in (EventDetailItem.STRING, EventDetailItem.IP_ADDRESS, EventDetailItem.PATH):
                    rulecmp = 'Zenoss.form.rule.STRINGCOMPARISONS'
                else:
                    rulecmp = 'Zenoss.form.rule.NUMBERCOMPARISONS'
                zpdetails.append("{{ text: _t('{name}'), value: '{key}', comparisons: {cmp} }}".format(name=detail['name'], key=detail['key'], cmp=rulecmp))
            result.append(',\n'.join(zpdetails))
            result.append('];')
        except ZepConnectionError, e:
            log.error(e.message)
示例#19
0
def add_datapoint(dmd, datasource, id_, cfg):
    tf = getFacade('template', dmd)
    datapoint = tf.addDataPoint(datasource.uid, str(id_))

    # http://jira.zenoss.com/jira/browse/ZEN-5017
    datapoint = ZuulInfo(datapoint)

    # Handle cfg shortcuts like DERIVE_MIN_0 and GAUGE_MIN_0_MAX_100.
    if isinstance(cfg, types.StringTypes):
        if 'DERIVE' in cfg.upper():
            datapoint.rrdtype = 'DERIVE'

        min_match = re.search(r'MIN_(\d+)', cfg, re.IGNORECASE)
        if min_match:
            datapoint.rrdmin = min_match.group(1)

        max_match = re.search(r'MAX_(\d+)', cfg, re.IGNORECASE)
        if max_match:
            datapoint.rrdmax = max_match.group(1)

    else:
        # Apply cfg items directly to datasource attributes.
        for k, v in cfg.items():
            if k not in ('aliases'):
                setattr(datapoint, k, v)

        if 'aliases' in cfg:
            add_aliases(dmd, datapoint, cfg['aliases'])
示例#20
0
    def pingDevices(self, evids):
        """Ping devices associated with evids."""
        if not evids:
            return DirectResponse.succeed(msg="No events selected.")

        # Gather unique devices.
        devices = {}

        zep = getFacade('zep')
        evt_filter = zep.createEventFilter(uuid=evids)
        evt_summaries = zep.getEventSummaries(offset=0, filter=evt_filter)
        for evt_summary in evt_summaries.get('events', []):
            device_id = evt_summary['occurrence'][0]['actor']['element_identifier']
            if device_id in devices:
                continue

            device = self.context.dmd.Devices.findDeviceByIdExact(device_id)
            if not device or not device.getManageIp():
                continue

            devices[device_id] = device

        # Run ping for each unique device.
        ping_output = {}

        for device_id, device in devices.iteritems():
            ping_output[device_id] = subprocess.check_output(
                "ping -c3 {} ; exit 0".format(device.getManageIp()),
                stderr=subprocess.STDOUT,
                shell=True)

        return DirectResponse.succeed(data=ping_output)
示例#21
0
 def event_count(self):
     zep = getFacade('zep', self.dmd)
     try:
         yield ("Event Count",
                zep.countEventsSince(time.time() - 24 * 60 * 60))
     except ZepConnectionError:
         yield "Event Count: last 24hr", "Not Available"
示例#22
0
    def getComponentTree(self, uid):
        from Products.ZenEvents.EventManagerBase import EventManagerBase
        componentTypes = {}
        uuidMap = {}

        dev = self._getObject(uid)
        for brain in dev.componentSearch():
            uuidMap[brain.getUUID] = brain.meta_type
            compType = componentTypes.setdefault(brain.meta_type, { 'count' : 0, 'severity' : 0 })
            compType['count'] += 1

        # Do one big lookup of component events and merge back in to type later
        if not uuidMap:
            return []

        zep = getFacade('zep')
        showSeverityIcon = self.context.dmd.UserInterfaceSettings.getInterfaceSettings().get('showEventSeverityIcons')
        if showSeverityIcon:
            severities = zep.getWorstSeverity(uuidMap.keys())
            for uuid, sev in severities.iteritems():
                compType = componentTypes[uuidMap[uuid]]
                compType['severity'] = max(compType['severity'], sev)

        result = []
        for name, compType in componentTypes.iteritems():
            result.append({
                'type' : name,
                'count' : compType['count'],
                'severity' : EventManagerBase.severities.get(compType['severity'], 0).lower()
            })

        return result
示例#23
0
    def pingDevices(self, evids):
        """Ping devices associated with evids."""
        if not evids:
            return DirectResponse.succeed(msg="No events selected.")

        # Gather unique devices.
        devices = {}

        zep = getFacade('zep')
        evt_filter = zep.createEventFilter(uuid=evids)
        evt_summaries = zep.getEventSummaries(offset=0, filter=evt_filter)
        for evt_summary in evt_summaries.get('events', []):
            device_id = evt_summary['occurrence'][0]['actor'][
                'element_identifier']
            if device_id in devices:
                continue

            device = self.context.dmd.Devices.findDeviceByIdExact(device_id)
            if not device or not device.getManageIp():
                continue

            devices[device_id] = device

        # Run ping for each unique device.
        ping_output = {}

        for device_id, device in devices.iteritems():
            ping_output[device_id] = subprocess.check_output(
                "ping -c3 {} ; exit 0".format(device.getManageIp()),
                stderr=subprocess.STDOUT,
                shell=True)

        return DirectResponse.succeed(data=ping_output)
    def bulkLoadMetricData(self, infos):
        """
        If the info objects have the attribute dataPointsToFetch we
        will load all the datapoints in one metric service query
        instead of one per info object
        """
        if len(infos) == 0:
            return
        datapoints = set()
        indexedInfos = dict()
        for info in infos:
            indexedInfos[info._object.getResourceKey()] = info
            if hasattr(info, "dataPointsToFetch"):
                [datapoints.add(dp) for dp in info.dataPointsToFetch]

        # in case no metrics were asked for
        if len(datapoints) == 0:
            return
        # get the metric facade
        mfacade = getFacade('metric', self._dmd)
        # metric facade expects zenmodel objects or uids
        results = mfacade.getMultiValues([i._object for i in infos],
                                         datapoints,
                                         returnSet="LAST")

        # assign the metrics to the info objects
        for resourceKey, record in results.iteritems():
            if indexedInfos.get(resourceKey) is not None:
                info = indexedInfos[resourceKey]
                for key, val in record.iteritems():
                    info.setBulkLoadProperty(key, val)
    def getComponentTree(self, uid):
        from Products.ZenEvents.EventManagerBase import EventManagerBase

        componentTypes, uuidMap = self._get_component_types_from_zcatalog(uid)

        # Do one big lookup of component events and merge back in to type later
        if not uuidMap:
            return []

        zep = getFacade('zep')
        showSeverityIcon = self.context.dmd.UserInterfaceSettings.getInterfaceSettings(
        ).get('showEventSeverityIcons')
        if showSeverityIcon:
            severities = zep.getWorstSeverity(uuidMap.keys())
            for uuid, sev in severities.iteritems():
                compType = componentTypes[uuidMap[uuid]]
                compType['severity'] = max(compType['severity'], sev)

        result = []
        for name, compType in componentTypes.iteritems():
            result.append({
                'type':
                name,
                'count':
                compType['count'],
                'severity':
                EventManagerBase.severities.get(compType['severity'],
                                                0).lower()
            })

        return result
示例#26
0
 def _loadSeverity(self):
     if self._severity is None:
         if self.uuid:
             zep = getFacade('zep')
             sev = zep.getSeverityName(zep.getWorstSeverity([self.uuid]).get(self.uuid, 0)).lower()
             self._severity = sev
     return self._severity
示例#27
0
    def bulkLoadMetricData(self, infos):
        """
        If the info objects have the attribute dataPointsToFetch we
        will load all the datapoints in one metric service query
        instead of one per info object
        """
        if len(infos) == 0:
            return
        datapoints = set()
        indexedInfos = dict()
        for info in infos:
            indexedInfos[info._object.getResourceKey()] = info
            if hasattr(info, "dataPointsToFetch"):
                [datapoints.add(dp) for dp in info.dataPointsToFetch]

        # in case no metrics were asked for
        if len(datapoints) == 0:
            return
        # get the metric facade
        mfacade = getFacade('metric', self._dmd)
        # metric facade expects zenmodel objects or uids
        results = mfacade.getMultiValues([i._object for i in infos], datapoints, returnSet="LAST")

        # assign the metrics to the info objects
        for resourceKey, record in results.iteritems():
            if indexedInfos.get(resourceKey) is not None:
                info = indexedInfos[resourceKey]
                for key, val in record.iteritems():
                    info.setBulkLoadProperty(key, val)
示例#28
0
    def getDevices(self,
                   uid=None,
                   start=0,
                   limit=50,
                   sort='name',
                   dir='ASC',
                   params=None,
                   hashcheck=None):
        params = params if params else {}
        # Passing a key that's not an index in the catalog will
        # cause a serious performance penalty.  Remove 'status' from
        # the 'params' parameter before passing it on.
        statuses = params.pop('status', None)
        brains = self.getDeviceBrains(uid, start, limit, sort, dir, params,
                                      hashcheck)

        # ZEN-10057 - Handle the case of empty results for a filter with no matches
        if not brains:
            return SearchResults(iter([]), 0, '0')

        devices = [IInfo(obj) for obj in imap(unbrain, brains) if obj]

        if statuses is not None and len(statuses) < 3:
            devices = [d for d in devices if d.status in statuses]

        uuids = set(dev.uuid for dev in devices)
        if uuids:
            zep = getFacade('zep', self._dmd)
            severities = zep.getEventSeverities(uuids)
            for device in devices:
                device.setEventSeverities(severities[device.uuid])

        return SearchResults(iter(devices), brains.total, brains.hash_)
示例#29
0
 def _verifyZepRunning(self):
     zep = getFacade('zep')
     try:
         zep.getConfig()
         return True
     except ServiceException:
         return False
示例#30
0
 def stream(self):
     data = unjson(self.request.get('data'))
     uids = data['uids']
     facade = getFacade('device', self.context)
     for deviceOrganizer in imap(facade._getObject, uids):
         deviceOrganizer.runDeviceMonitor(REQUEST=self.request,
                                          write=self.write)
示例#31
0
    def getDeviceDashboard(self):
        """return device info for bad device to dashboard"""
        zep = getFacade('zep')
        manager = IGUIDManager(self.context.dmd)
        deviceSeverities = zep.getDeviceIssuesDict()
        zem = self.context.dmd.ZenEventManager

        devdata = []
        for uuid in deviceSeverities.keys():
            dev = manager.getObject(uuid)
            if dev and isinstance(dev, Device):
                if (not zem.checkRemotePerm(ZEN_VIEW, dev)
                        or dev.productionState < zem.prodStateDashboardThresh
                        or dev.priority < zem.priorityDashboardThresh):
                    continue
                alink = dev.getPrettyLink()
                try:
                    severities = deviceSeverities[uuid]
                    severities = dict(
                        (zep.getSeverityName(sev).lower(), counts)
                        for (sev, counts) in severities.iteritems())
                    pill = getEventPillME(dev, severities=severities)
                except ServiceException:
                    continue
                evts = [alink, pill]
                devdata.append((evts, severities))
        devdata.sort(key=lambda x:
                     (x[1]['critical'], x[1]['error'], x[1]['warning']),
                     reverse=True)
        return [x[0] for x in devdata[:100]]
示例#32
0
def add_graphpoint(dmd, device_class, template, graph, id_, cfg):
    tf = getFacade('template', dmd)
    if cfg['type'] == 'Threshold':
        threshold = [
            t for t in tf.getThresholds(template.uid) if t.name == id_
        ][0]
        tf.addThresholdToGraph(graph.uid, threshold.uid)

        graphpoints = []
        for gp in tf.getGraphPoints(graph.uid):
            if isinstance(gp, ThresholdGraphPointInfo) and gp.id == id_:
                graphpoint = gp
                break

    elif cfg['type'] == 'DataPoint':
        # this is all sorts of messed up getDataSources returns datapoints if the context is a device class
        # there isnt a getDataPoints call
        # the name of a datapoint appears to be a datasource.datapoint but the id path appears better
        # We are just splitting that and probably making some sort of bad
        # assumption here.
        datapoints = [
            dp for dp in tf.getDataSources(device_class.uid)
            if dp._object.name() == cfg['dpName'] and template.uid in dp.uid
        ]
        for datapoint in datapoints:
            tf.addDataPointToGraph(datapoint.uid, graph.uid)
        # Normally we would try to find the created graphpoint by UID, but since we don't know that
        # we will find all graphpoints with the datapoint name.  If there are more than one,
        # we're in trouble.
        graphpoints = []
        for gp in tf.getGraphPoints(graph.uid):
            if isinstance(
                    gp,
                    DataPointGraphPointInfo) and gp.dpName == cfg['dpName']:
                graphpoints.append(gp)
        if len(graphpoints) != 1:
            # don't really know what to do here.. really, the only option is to delete the
            # pre-existing ones and hope there's only one in the json, but for now i'm leaving
            # that as an exercise to the user.
            print "Error: Expected to find one graphpoint, but found %d instead." % len(
                graphpoints)
            return
        graphpoint = graphpoints[0]
    else:
        print "GraphPoint of %s is not supported yet." % cfg['type']
        return

    # Apply cfg items directly to graph attributes.
    for k, v in cfg.items():
        if k not in ('type'):
            if k == 'description':
                graphpoint.setDescription(v)
            else:
                setattr(graphpoint, k, v)

    # Fix the graphpoint name/ID.  addDataPointToGraph sets it to a default value, but the
    # import file may have a different one specified.
    if graphpoint.id != id_:
        fix_id(graphpoint, id_)
示例#33
0
    def save_return_payload(self, returnPayload):
        '''
        Process and save the data returned from the callhome server. This
        always includes versioning and crypto key changes, and may include
        other data to be processed by plugins to the IReturnPayloadProcessor
        interface.
        '''
        try:
            returnPayload = zlib.decompress(
                base64.urlsafe_b64decode(returnPayload))
            returnPayload = json.loads(returnPayload)
        except:
            logger.debug('Error decoding return payload from server')
            return

        if all(x in returnPayload
               for x in ('currentPublicKey', 'revocationList')):
            # TODO: VERIFY revocation list, and apply
            newPubkey = returnPayload.get('currentPublicKey')
            if self.callHome.publicKey != newPubkey:
                self.callHome.publicKey = newPubkey

        if 'encrypted' in returnPayload:
            base64data = base64.urlsafe_b64decode(
                str(returnPayload.get('encrypted')))
            data = json.loads(decrypt(base64data, self.callHome.symmetricKey))

            if 'compliancereport' in data:
                data['compliancereport']['pdf'] = base64.urlsafe_b64decode(
                    str(data['compliancereport']['pdf']))

            if 'latestVersion' in data:
                # Save the latest version, and send a
                # message if new version available
                self.dmd.lastVersionCheck = long(time.time())
                available = Version.parse('Zenoss ' + data['latestVersion'])
                if (getattr(self.dmd, 'availableVersion', '') !=
                        available.short()):
                    self.dmd.availableVersion = available.short()
                    if self.dmd.About.getZenossVersion() < available:
                        try:
                            import socket
                            zep = getFacade('zep')
                            summary = (
                                'A new version of Zenoss (%s)' +
                                'has been released') % available.short()
                            zep.create(summary, 'Info', socket.getfqdn())
                        except ZepConnectionError:
                            logger.warning("ZEP not running - can't send " +
                                           "new version event")

            # Go through other data in the return payload, and process
            for name, utility in getUtilitiesFor(IReturnPayloadProcessor):
                if name in data:
                    utility.process(self.dmd, data[name])

        self.callHome.lastSuccess = long(time.time())
        self.chs.updateStat('lastSuccess', long(time.time()))
        return
示例#34
0
 def remote_getDeviceIssues(self, *args, **kwargs):
     zep = getFacade('zep')
     try:
         return zep.getDeviceIssues()
     except ServiceConnectionError, e:
         # ZEN-503: Don't print a traceback in this case
         log.warn("Unable to contact ZEP.")
         return None
示例#35
0
 def remote_getDeviceIssues(self, *args, **kwargs):
     zep = getFacade('zep')
     try:
         return zep.getDeviceIssues()
     except ServiceConnectionError, e:
         # ZEN-503: Don't print a traceback in this case
         log.warn("Unable to contact ZEP.")
         return None
示例#36
0
    def _deleteDevice(self, uid, deleteEvents=True):
        facade = getFacade('device')
        try:
            result = facade.deleteDevices([uid], deleteEvents=deleteEvents)
        except Exception as e:
            result = "Unable to device device {0}. {1}".format(uid, e.message)

        return result
示例#37
0
 def getEventSeverities(self):
     if self._eventSeverities is None:
         zep = getFacade('zep')
         # ZEP facade returns CRITICAL/ERROR/WARNING by default - need to include INFO for rainbow on
         # device detail page.
         severities = (SEVERITY_CRITICAL, SEVERITY_ERROR, SEVERITY_WARNING, SEVERITY_INFO)
         self.setEventSeverities(zep.getEventSeveritiesByUuid(self.uuid, severities=severities))
     return self._eventSeverities
示例#38
0
 def list(self, configData):
     if configData:
         self.zep = getFacade('zep')
         items = configData.get(EventDetailItemHandler.key, [])
         info = []
         for item in items:
             info.append("Would be adding the following detail to be indexed by ZEP: %s" % item.key)
         return info
示例#39
0
 def __init__(self, dmd, twokeydict):
     a, b = twokeydict.items()
     aid, self.abrains = a
     bid, self.bbrains = b
     self.a = dmd.unrestrictedTraverse(aid)
     self.b = dmd.unrestrictedTraverse(bid)
     self.zep = getFacade('zep', dmd)
     self.idmgr = Manager(dmd)
示例#40
0
 def testOrganizer(self):
     devices = self.dmd.Devices
     dc = devices.createOrganizer('/Test')
     self.assert_(dc in devices.children())
     self.assert_(dc in devices.getSubOrganizers())
     self.assertEqual(devices.countChildren(), 6)
     self.assert_('Test' in devices.childIds())
     self.assert_('/Test' in devices.getOrganizerNames())
     self.assertEqual(devices.getOrganizer('/Test'), dc)
     layer = devices.createOrganizer('/Layer')
     devices.moveOrganizer('Layer',['Test'])
     self.assert_('/Layer' in devices.getOrganizerNames())
     self.assert_(dc not in devices.children())
     self.assert_(dc in devices.getSubOrganizers())
     getFacade('device', self.dmd).deleteNode('/zport/dmd/Devices/Layer')
     self.assert_(layer not in devices.children())
     self.assert_(dc not in devices.getSubOrganizers())
示例#41
0
 def testOrganizer(self):
     devices = self.dmd.Devices
     dc = devices.createOrganizer('/Test')
     self.assert_(dc in devices.children())
     self.assert_(dc in devices.getSubOrganizers())
     self.assertEqual(devices.countChildren(), 6)
     self.assert_('Test' in devices.childIds())
     self.assert_('/Test' in devices.getOrganizerNames())
     self.assertEqual(devices.getOrganizer('/Test'), dc)
     layer = devices.createOrganizer('/Layer')
     devices.moveOrganizer('Layer',['Test'])
     self.assert_('/Layer' in devices.getOrganizerNames())
     self.assert_(dc not in devices.children())
     self.assert_(dc in devices.getSubOrganizers())
     getFacade('device', self.dmd).deleteNode('/zport/dmd/Devices/Layer')
     self.assert_(layer not in devices.children())
     self.assert_(dc not in devices.getSubOrganizers())
示例#42
0
 def remote_getStatus(self):
     """Return devices with Mail problems."""
     zep = getFacade('zep')
     issues = zep.getDeviceIssues(eventClass=[Status_Mail],
                                  severity=[SEVERITY_WARNING, SEVERITY_ERROR, SEVERITY_CRITICAL])
     return [d
             for d, count, total in issues
             if getattr(self.config.devices, d, None)]
示例#43
0
 def stream(self):
     data = unjson(self.request.get('data'))
     uids = data['uids']
     facade = getFacade('device', self.context)
     for device in imap(facade._getObject, uids):
         device.collectDevice(REQUEST=self.request,
                              write=self.write,
                              debug=True)
示例#44
0
 def upgrade(self, configData):
     if configData:
         self.zep = getFacade('zep')
         items = configData.get(EventDetailItemHandler.key, [])
         for item in items:
             log.info("Upgrading the following to be indexed by ZEP: %s" % item)
             detailItem = from_dict(EventDetailItem, item)
             self.zep.updateIndexedDetailItem(detailItem)
示例#45
0
 def testOrganizer(self):
     devices = self.dmd.Devices
     dc = devices.createOrganizer("/Test")
     self.assert_(dc in devices.children())
     self.assert_(dc in devices.getSubOrganizers())
     self.assertEqual(devices.countChildren(), 6)
     self.assert_("Test" in devices.childIds())
     self.assert_("/Test" in devices.getOrganizerNames())
     self.assertEqual(devices.getOrganizer("/Test"), dc)
     layer = devices.createOrganizer("/Layer")
     devices.moveOrganizer("Layer", ["Test"])
     self.assert_("/Layer" in devices.getOrganizerNames())
     self.assert_(dc not in devices.children())
     self.assert_(dc in devices.getSubOrganizers())
     getFacade("device", self.dmd).deleteNode("/zport/dmd/Devices/Layer")
     self.assert_(layer not in devices.children())
     self.assert_(dc not in devices.getSubOrganizers())
示例#46
0
 def fetchMetrics(self, dpnames, cf, resolution, start, end="now",
                  returnSet="ALL"):
    """
    Query the server for metrics and return the response.
    """
    facade = getFacade('metric', self.dmd)
    return facade.queryServer(self, dpnames, cf=cf, start=start, end=end,
                              downsample=resolution, returnSet=returnSet)
示例#47
0
 def __init__(self, dmd, twokeydict):
     a, b = twokeydict.items()
     aid, self.abrains = a
     bid, self.bbrains = b
     self.a = dmd.unrestrictedTraverse(aid)
     self.b = dmd.unrestrictedTraverse(bid)
     self.zep = getFacade('zep', dmd)
     self.idmgr = Manager(dmd)
示例#48
0
    def test_updateToMany(self):
        from ZenPacks.zenoss.AWS.utils import updateToMany

        device_facade = getFacade('device')

        instance = self.account.getObjByPath(
            'regions/region/instances/instance')

        # Add one volume.
        updateToMany(instance.volumes,
                     instance.region().volumes, CLASS_NAME['EC2Volume'],
                     ['volume1'])

        self.assertEqual(instance.volumes.countObjects(), 1)
        self.assertEqual(instance.volumes()[0].id, 'volume1')

        instance_volumes = device_facade.getComponents(
            instance.getPrimaryUrlPath(), meta_type='EC2Volume')

        self.assertTrue('volume1' in [b.id for b in instance_volumes.results])

        # Add two volumes.
        updateToMany(instance.volumes,
                     instance.region().volumes, CLASS_NAME['EC2Volume'],
                     ['volume1', 'volume2'])

        self.assertEqual(instance.volumes.countObjects(), 2)
        self.assertEqual(set(x.id for x in instance.volumes()),
                         set(('volume1', 'volume2')))

        instance_volumes = device_facade.getComponents(
            instance.getPrimaryUrlPath(), meta_type='EC2Volume')

        self.assertEqual(instance_volumes.total, 2)

        # Remove one volume.
        updateToMany(instance.volumes,
                     instance.region().volumes, CLASS_NAME['EC2Volume'],
                     ['volume2'])

        self.assertEqual(instance.volumes.countObjects(), 1)
        self.assertEqual(instance.volumes()[0].id, 'volume2')

        instance_volumes = device_facade.getComponents(
            instance.getPrimaryUrlPath(), meta_type='EC2Volume')

        self.assertTrue('volume2' in [b.id for b in instance_volumes.results])

        # Remove all volumes.
        updateToMany(instance.volumes,
                     instance.region().volumes, CLASS_NAME['EC2Volume'], [])

        self.assertEqual(instance.volumes.countObjects(), 0)

        instance_volumes = device_facade.getComponents(
            instance.getPrimaryUrlPath(), meta_type='EC2Volume')

        self.assertEqual(instance_volumes.total, 0)
示例#49
0
    def save_return_payload(self, returnPayload):
        '''
        Process and save the data returned from the callhome server. This
        always includes versioning and crypto key changes, and may include
        other data to be processed by plugins to the IReturnPayloadProcessor
        interface.
        '''
        try:
            returnPayload = zlib.decompress(base64.urlsafe_b64decode(
                                                returnPayload))
            returnPayload = json.loads(returnPayload)
        except:
            logger.debug('Error decoding return payload from server')
            return

        if all(x in returnPayload for x in ('currentPublicKey',
                                            'revocationList')):
            # TODO: VERIFY revocation list, and apply
            newPubkey = returnPayload.get('currentPublicKey')
            if self.callHome.publicKey != newPubkey:
                self.callHome.publicKey = newPubkey

        if 'encrypted' in returnPayload:
            base64data = base64.urlsafe_b64decode(str(returnPayload.get(
                                                          'encrypted')))
            data = json.loads(decrypt(base64data, self.callHome.symmetricKey))

            if 'compliancereport' in data:
                data['compliancereport']['pdf'] = base64.urlsafe_b64decode(str(
                                              data['compliancereport']['pdf']))

            if 'latestVersion' in data:
                # Save the latest version, and send a
                # message if new version available
                self.dmd.lastVersionCheck = long(time.time())
                available = Version.parse('Zenoss ' + data['latestVersion'])
                if (getattr(self.dmd, 'availableVersion', '')
                        != available.short()):
                    self.dmd.availableVersion = available.short()
                    if self.dmd.About.getZenossVersion() < available:
                        try:
                            import socket
                            zep = getFacade('zep')
                            summary = ('A new version of Zenoss (%s)' +
                                       'has been released') % available.short()
                            zep.create(summary, 'Info', socket.getfqdn())
                        except ZepConnectionError:
                            logger.warning("ZEP not running - can't send " +
                                           "new version event")

            # Go through other data in the return payload, and process
            for name, utility in getUtilitiesFor(IReturnPayloadProcessor):
                if name in data:
                    utility.process(self.dmd, data[name])

        self.callHome.lastSuccess = long(time.time())
        self.chs.updateStat('lastSuccess', long(time.time()))
        return
示例#50
0
 def upgrade(self, configData):
     if configData:
         self.zep = getFacade('zep')
         items = configData.get(EventDetailItemHandler.key, [])
         for item in items:
             log.info("Upgrading the following to be indexed by ZEP: %s" %
                      item)
             detailItem = from_dict(EventDetailItem, item)
             self.zep.updateIndexedDetailItem(detailItem)
示例#51
0
    def load_device(self,
                    dmd,
                    accountname,
                    accesskey,
                    secretkey,
                    collector='localhost'):

        return getFacade('aws', dmd).add_ec2account(accountname, accesskey,
                                                    secretkey, collector)
    def load_device(self, dmd, deviceName, username, api_key, project_id, user_domain_name, project_domain_name, auth_url,
                    ceilometer_url=None, region_name=None, collector='localhost'):

        # we accept, but do not use, the ceilometer_url parameter for backwards
        # compatability reasons.

        return getFacade('openstackinfrastructure', dmd).addOpenStack(
            deviceName, username, api_key, project_id, user_domain_name, project_domain_name, auth_url,
            region_name=region_name, collector=collector)
 def load_device(self,
                 dmd,
                 url,
                 username,
                 domain,
                 password,
                 collector='localhost'):
     return getFacade('oVirt', dmd).add_ovirt(url, username, domain,
                                              password, collector)
示例#54
0
 def deleteDevices(self, devices=()):
     uids = []
     for id in devices:
         dev = self._dmd.Devices.findDeviceByIdExact(id)
         if dev is not None:
             uids.append(dev.getPrimaryUrlPath())
     if uids:
         devFacade = getFacade("device")
         devFacade.deleteDevices(uids, deleteEvents=True, deletePerf=True)
 def testManageOrganizer(self):
     org = self.create(self.dmd,Organizer,'org')
     org.dmdRootName = "org"
     org.manage_addOrganizer('/foo/bar')
     org.manage_addOrganizer('/test/loc')
     org.manage_addOrganizer('/number/three')
     foo = org.getOrganizer('/foo')
     test = org.getOrganizer('/test')
     number = org.getOrganizer('/number')
     self.assert_(foo in org.children())
     self.assert_(test in org.children())
     self.assert_(number in org.children())
     facade = getFacade('device', self.dmd)
     facade.deleteNode('/'.join(foo.getPhysicalPath()))
     self.assert_(foo not in org.children())
     getFacade('device', self.dmd).deleteNode('/'.join(test.getPhysicalPath()))
     getFacade('device', self.dmd).deleteNode('/'.join(number.getPhysicalPath()))
     self.assert_(org.children() == [])
    def cutover(self, dmd):
        zep_facade = getFacade('zep')
        triggers_facade = getFacade('triggers')

        zp_details = [ det.get('key') for det in zep_facade.getUnmappedDetails() if det.get('key') ]

        zp_detail_translator = {}
        for zp_detail in zp_details:
            zp_detail_translator[zp_detail] = '_'.join(zp_detail.split('.'))

        for trigger in triggers_facade.getTriggers():
            if trigger.get('rule') and trigger.get('rule').get('source'):
                source = trigger.get('rule').get('source')
                for zp_detail in zp_details:
                    if zp_detail in source:
                        new_source = self._migrate_detail_in_trigger(source, zp_detail, zp_detail_translator)
                        trigger['rule']['source'] = new_source
                        triggers_facade.updateTrigger(**trigger)
                        print "Trigger {0} updated.".format(trigger.get('name'))
    def cutover(self, dmd):
        zep_facade = getFacade("zep")
        triggers_facade = getFacade("triggers")

        zp_details = [det.get("key") for det in zep_facade.getUnmappedDetails() if det.get("key")]

        zp_detail_translator = {}
        for zp_detail in zp_details:
            zp_detail_translator[zp_detail] = "_".join(zp_detail.split("."))

        for trigger in triggers_facade.getTriggers():
            if trigger.get("rule") and trigger.get("rule").get("source"):
                source = trigger.get("rule").get("source")
                for zp_detail in zp_details:
                    if zp_detail in source:
                        new_source = self._migrate_detail_in_trigger(source, zp_detail, zp_detail_translator)
                        trigger["rule"]["source"] = new_source
                        triggers_facade.updateTrigger(**trigger)
                        print "Trigger {0} updated.".format(trigger.get("name"))
示例#58
0
def add_aliases(dmd, datapoint, aliases):
    tf = getFacade("template", dmd)
    data = []
    for id_ in aliases.keys():
        id_ = str(id_)
        if aliases[id_]["formula"] is None:
            aliases[id_]["formula"] = ""
        data.append({"id": id_, "formula": aliases[id_]["formula"]})

    tf.setInfo(datapoint.uid, {"aliases": data})
def add_aliases(dmd, datapoint, aliases):
    tf = getFacade('template', dmd)
    data = []
    for id_ in aliases.keys():
        id_ = str(id_)
        if aliases[id_]['formula'] is None:
            aliases[id_]['formula'] = ""
        data.append({'id': id_, 'formula': aliases[id_]['formula']})

    tf.setInfo(datapoint.uid, {'aliases': data})