| Trees | Indices | Help |
|
|---|
|
|
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.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
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
46
48
50
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
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
84
85
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 # Look for specific errors that should be equated
104 # to an empty result set.
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
124 def inner(driver):
125 try:
126 yield self.connect()
127 driver.next()
128 for plugin in self.plugins:
129 pluginName = plugin.name()
130 log.debug("Sending queries for plugin: %s", pluginName)
131 log.debug("Queries: %s" % str(plugin.queries().values()))
132 try:
133 yield self.query(plugin.queries())
134 self.results.append((plugin, driver.next()))
135 except Exception, ex:
136 self.results.append((plugin, ex))
137 self.close()
138 except Exception, ex:
139 self.close()
140 raise
141 d = drive(inner)
142 def finish(result):
143 if self.datacollector:
144 self.datacollector.clientFinished(self)
145 d.addBoth(finish)
146 return d
147
148
153
| Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0beta1 on Mon Oct 19 14:44:23 2009 | http://epydoc.sourceforge.net |