Package Products :: Package ZenHub :: Module XmlRpcService |
[hide private]
[frames] | no frames]

# Source Code for Module Products.ZenHub.XmlRpcService

      1  ###########################################################################
      2  #
      3  # This program is part of Zenoss Core, an open source monitoring platform.
      4  # Copyright (C) 2007, Zenoss Inc.
      5  #
      6  # This program is free software; you can redistribute it and/or modify it
      7  # under the terms of the GNU General Public License version 2 as published by
      8  # the Free Software Foundation.
      9  #
     10  # For complete information please visit: http://www.zenoss.com/oss/
     11  #
     12  ###########################################################################
     13
     14  # Hide a SyntaxWarning that is raised in twisted.web.microdom under Python>=2.5
     15  # TODO in 3.1: Remove when twisted is upgraded
     16  import warnings
     17  warnings.filterwarnings('ignore', 'assertion is always true', SyntaxWarning)
     18
     19  from twisted.web import xmlrpc
     20
     21  import types
     22
     23  import DateTime
     24
     25  from Products.ZenHub.services.RRDImpl import RRDImpl
     26  from Products.DataCollector.ApplyDataMap import ApplyDataMap
     27
     28  from Products.ZenUtils.ZenTales import talesEval
     29
     30 -class XmlRpcService(xmlrpc.XMLRPC):
     31      # serializable types
     32      PRIMITIVES = [types.IntType, types.StringType, types.BooleanType,
     33                    types.DictType, types.FloatType, types.LongType,
     34                    types.NoneType]
     35
     36 -    def __init__(self, dmd):
     37          xmlrpc.XMLRPC.__init__(self)
     38          self.dmd = dmd
     39          self.zem = dmd.ZenEventManager
     40          self.impl = RRDImpl(dmd)
     41
     42
     43 -    def xmlrpc_sendEvent(self, data):
     44          'XMLRPC requests are processed asynchronously in a thread'
     45          result = self.zem.sendEvent(data)
     46          if result is None:
     47              result = "none"
     48          return result
     49
     50 -    def xmlrpc_sendEvents(self, data):
     51          return self.zem.sendEvents(data)
     52
     53 -    def xmlrpc_getDevicePingIssues(self, *unused):
     54          return self.zem.getDevicePingIssues()
     55
     56 -    def xmlrpc_getDeviceWinInfo(self, *args):
     57          return self.dmd.Devices.Server.Windows.getDeviceWinInfo(*args)
     58
     59 -    def xmlrpc_getWinServices(self, *args):
     60          return self.dmd.Devices.Server.Windows.getWinServices(*args)
     61
     62 -    def xmlrpc_applyDataMap(self, devName, datamap,
     63                              relname="", compname="", modname=""):
     64          """Apply a datamap passed as a list of dicts through XML-RPC.
     65          """
     66          dev = self.dmd.findDevice(devName)
     67          adm = ApplyDataMap()
     68          adm.applyDataMap(dev, datamap, relname=relname,
     69                           compname=compname, modname=modname)
     70
     71
     72 -    def xmlrpc_getConfigs(self, monitor, dstype):
     73          '''Return the performance configurations for the monitor name and data
     74          source provided. '''
     75
     76          def toDict(device, ds, dps=[]):
     77              '''marshall the fields from the datasource into a dictionary and
     78              ignore everything that is not a primitive'''
     79
     80              vals = {}
     81              vals['dps'] = []
     82              vals['dptypes'] = []
     83              for key, val in ds.__dict__.items():
     84                  if type(val) in XmlRpcService.PRIMITIVES:
     85                      if (type(val) == types.StringType) and (val.find('$') >= 0):
     86                          val = talesEval('string:%s' % (val, ), device)
     87                      vals[key] = val
     88
     89              for dp in dps:
     90                  vals['dps'].append(dp.id)
     91                  vals['dptypes'].append(dp.rrdtype)
     92
     93              # add zproperties
     94              for propertyId in device.propertyIds():
     95                  value = device.getProperty(propertyId)
     96
     97                  # _millis can't be serialized because it is long, so
     98                  # we skip it to avoid an XML-RPC serialization error
     99                  if isinstance(value, DateTime.DateTime):
    100                      continue
    101
    102                  vals[propertyId] = value
    103
    104              vals['device'] = device.id
    105              vals['manageIp'] = device.manageIp
    106
    107              return vals
    108
    109
    110          result = []
    111
    112          # get the performance conf (if it exists)
    113          conf = getattr(self.dmd.Monitors.Performance, monitor, None)
    114          if conf is None:
    115              return result
    116
    117          # loop over devices that use the performance monitor
    118          for device in conf.devices():
    119              device = device.primaryAq()
    120              for template in device.getRRDTemplates():
    121                  for ds in template.getRRDDataSources():
    122                      if ds.sourcetype == dstype:
    123                          result.append(toDict(device, ds, ds.datapoints()))
    124
    125          return result
    126
    127
    128 -    def xmlrpc_writeRRD(self, devId, compType, compId, dpName, value):
    129          self.impl.writeRRD(devId, compType, compId, dpName, value)
    130
    131          # return something for compliance with the XML-RPC specification
    132          return ""
    133
    134
    135 -    def xmlrpc_getPerformanceConfig(self, monitor):
    136          ''' returns the performance configuration for the monitor provided, or
    137          {} if no collector with the name provided is located.'''
    138
    139          result = {}
    140          fields = ['configCycleInterval', 'statusCycleInterval',
    141                    'processCycleInterval', 'perfsnmpCycleInterval',
    142                    'eventlogCycleInterval', 'renderurl', 'renderpass',
    143                    'renderuser', 'winCycleInterval']
    144
    145          # get the performance conf (if it exists)
    146          conf = getattr(self.dmd.Monitors.Performance, monitor, None)
    147          if conf is None:
    148              return result
    149
    150          for field in fields:
    151              result[field] = getattr(conf, field, None)
    152
    153          return result
    154