1
2
3
4
5
6
7
8
9
10
11
12
13
14 from pysamba.twisted.reactor import eventContext
15 from pysamba.wbem.Query import Query
16 from Products.ZenUtils.Driver import drive
17
18 import logging
19 log = logging.getLogger("zen.Watcher")
20
22
24 self.wmi = Query()
25 self.device = device
26 self.queryString = query
27 self.enum = None
28 self.busy = False
29 self.closeRequested = False
30 log.debug("Starting watcher on %s", device.id)
31
33 self.busy = True
34
35 def finished(result):
36 self.busy = False
37 if self.closeRequested:
38 self.close()
39 return result
40
41 def inner(driver):
42 log.debug("connecting to %s", self.device.id)
43 d = self.device
44
45 yield self.wmi.connect(eventContext,
46 d.id,
47 d.manageIp,
48 "%s%%%s" % (d.zWinUser, d.zWinPassword))
49 driver.next()
50
51 log.debug("connected to %s sending query", self.device.id)
52 log.debug("%s" % self.queryString)
53 yield self.wmi.notificationQuery(self.queryString)
54
55 self.enum = driver.next()
56 log.debug("got query response from %s", self.device.id)
57
58 return drive(inner).addBoth(finished)
59
60 - def getEvents(self, timeout=0, chunkSize=10):
61 assert self.enum
62 self.busy = True
63 log.debug("Fetching events for %s", self.device.id)
64
65 def fetched(result):
66 log.debug("Events fetched for %s", self.device.id)
67 return result
68
69 def finished(result):
70 self.busy = False
71 if self.closeRequested:
72 self.close()
73 return result
74
75 result = self.enum.fetchSome(timeoutMs=timeout, chunkSize=chunkSize)
76 result.addBoth(finished)
77 result.addCallback(fetched)
78 return result
79
81 if self.busy:
82 log.debug("close requested on busy WMI Query for %s; deferring",
83 self.device.id)
84 self.closeRequested = True
85 elif self.wmi:
86 log.debug("closing WMI Query for %s", self.device.id)
87 self.wmi.close()
88 self.wmi = None
89
91 log.debug("Watcher.__del__ called for %s, busy=%r closeRequested=%r",
92 self.device.id, self.busy, self.closeRequested)
93 self.close()
94