Package ZenWin :: Module WMIClient
[hide private]
[frames] | no frames]

Source Code for Module ZenWin.WMIClient

  1  ########################################################################### 
  2  # 
  3  # This program is part of Zenoss Core, an open source monitoring platform. 
  4  # Copyright (C) 2007, 2008 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  from pysamba.twisted.reactor import eventContext 
 15  from pysamba.wbem.Query import Query 
 16  from pysamba.library import WError 
 17   
 18  from Products.ZenUtils.Utils import zenPath 
 19  from Products.ZenUtils.Driver import drive 
 20  from Products.DataCollector.BaseClient import BaseClient 
 21   
 22  from twisted.internet import defer 
 23   
 24  import os 
 25  import socket 
 26  import sys 
 27  import logging 
 28  log = logging.getLogger("zen.WMIClient") 
 29   
 30   
 31  BaseName = os.path.basename(sys.argv[0]) 
 32  MyName = None 
 33   
34 -def _myname():
35 global MyName 36 if not MyName: 37 MyName = BaseName.split('.')[0] 38 try: 39 os.mkdir(zenPath('var', _myname())) 40 except os.error: 41 pass 42 return MyName
43
44 -def _filename(device):
45 return zenPath('var', _myname(), device)
46
47 -class BadCredentials(Exception): pass
48
49 -class WMIClient(BaseClient):
50
51 - def __init__(self, device, datacollector=None, plugins=[]):
52 BaseClient.__init__(self, device, datacollector) 53 self.device = device 54 self.host = device.id 55 self._wmi = None 56 if socket.getfqdn().lower() == device.id.lower(): 57 self.host = "." 58 device.zWinUser = device.zWinPassword = "" 59 elif device.manageIp is not None: 60 self.host = device.manageIp 61 self.name = device.id 62 self.user = device.zWinUser 63 self.passwd = device.zWinPassword 64 self.datacollector = datacollector 65 self.plugins = plugins 66 self.results = []
67 68
69 - def connect(self):
70 log.debug("connect to %s, user %r", self.host, self.user) 71 if not self.user: 72 log.warning("Windows login name is unset: " 73 "please specify zWinUser and " 74 "zWinPassword zProperties before adding devices.") 75 raise BadCredentials("Username is empty") 76 self._wmi = Query() 77 creds = '%s%%%s' % (self.user, self.passwd) 78 return self._wmi.connect(eventContext, self.host, creds)
79 80
81 - def close(self):
82 if self._wmi: 83 self._wmi.close()
84 85
86 - def query(self, queries):
87 def inner(driver): 88 try: 89 queryResult = {} 90 for tableName, query in queries.items(): 91 query = query.replace ("\\", "\\\\") 92 yield self._wmi.query(query) 93 result = driver.next() 94 queryResult[tableName] = [] 95 while 1: 96 yield result.fetchSome() 97 try: 98 more = driver.next() 99 except WError, ex: 100 msg = 'Received %s from query: %s' 101 log.error(msg % (ex.why(), query)) 102 raise 103 if not more: 104 break 105 queryResult[tableName].extend(more) 106 yield defer.succeed(queryResult) 107 driver.next() 108 except Exception, ex: 109 log.debug("Exception collecting query: %s", str(ex)) 110 raise
111 return drive(inner)
112
113 - def run(self):
114 def inner(driver): 115 try: 116 yield self.connect() 117 driver.next() 118 for plugin in self.plugins: 119 pluginName = plugin.name() 120 log.debug("Sending queries for plugin: %s", pluginName) 121 log.debug("Queries: %s" % str(plugin.queries().values())) 122 try: 123 yield self.query(plugin.queries()) 124 self.results.append((plugin, driver.next())) 125 except Exception, ex: 126 self.results.append((plugin, ex)) 127 self.close() 128 except Exception, ex: 129 self.close() 130 raise
131 d = drive(inner) 132 def finish(result): 133 if self.datacollector: 134 self.datacollector.clientFinished(self) 135 d.addBoth(finish) 136 return d 137 138
139 - def getResults(self):
140 """Return data for this client 141 """ 142 return self.results
143