1
2
3
4
5
6
7
8
9
10
11
12
13
14 from pysamba.twisted.callback import WMIFailure
15 from pysamba.twisted.reactor import eventContext
16 from pysamba.wbem.Query import Query
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
43
46
48
50
51 - def __init__(self, device, datacollector=None, plugins=[]):
67
68
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.device.id, self.host, creds)
79
80
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 more = None
97 yield result.fetchSome()
98 try:
99 more = driver.next()
100 except WMIFailure, ex:
101 msg = 'Received %s from query: %s'
102
103
104
105 if str(ex) in (
106 "NT code 0x80041010",
107 "WBEM_E_INVALID_CLASS",
108 ):
109 log.debug(msg % (ex, query))
110 else:
111 log.error(msg % (ex, query))
112 raise
113 if not more:
114 break
115 queryResult[tableName].extend(more)
116 yield defer.succeed(queryResult)
117 driver.next()
118 except Exception, ex:
119 log.debug("Exception collecting query: %s", str(ex))
120 raise
121 return drive(inner)
122
143 d = drive(inner)
144 def finish(result):
145 if self.datacollector:
146 self.datacollector.clientFinished(self)
147 d.addBoth(finish)
148 return d
149
150
152 """Return data for this client
153 """
154 return self.results
155