def getNextEvent(self): if self._opsiclientd.is_stopping(): return None if not self._watcher: logger.info("Nothing to watch for") self._event = threading.Event() self._event.wait() return None wqlResult = None from opsiclientd.windows import importWmiAndPythoncom # pylint: disable=import-outside-toplevel (wmi, _pythoncom) = importWmiAndPythoncom() while not self._stopped: try: wqlResult = self._watcher(timeout_ms=500) break except wmi.x_wmi_timed_out: continue if wqlResult: eventInfo = {} for prop in wqlResult.properties: value = getattr(wqlResult, prop) if isinstance(value, tuple): eventInfo[prop] = [] for val in value: eventInfo[prop].append(val) else: eventInfo[prop] = value return self.createEvent(eventInfo)
def initialize(self): if self._opsiclientd.is_stopping(): return if not self._wql: return from opsiclientd.windows import importWmiAndPythoncom # pylint: disable=import-outside-toplevel (wmi, pythoncom) = importWmiAndPythoncom() pythoncom.CoInitialize() max_attempts = 10 for attempt in range(1, 100): try: logger.debug("Creating wmi object") con = wmi.WMI(privileges=["Security"]) logger.info("Watching for wql: %s", self._wql) self._watcher = con.watch_for(raw_wql=self._wql, wmi_class='') break except Exception as err: # pylint: disable=broad-except if self._stopped: return logger.warning("Failed to create wmi watcher (wql=%s): %s", self._wql, err, exc_info=True) if attempt >= max_attempts: raise for i in range(3): # pylint: disable=unused-variable if self._stopped: return time.sleep(1) logger.debug("Initialized")
def isWindowsInstallerBusy(self): if not self._ms_update_installer: from opsiclientd.windows import importWmiAndPythoncom # pylint: disable=import-outside-toplevel (_wmi, _pythoncom) = importWmiAndPythoncom(importWmi=False, importPythoncom=True) _pythoncom.CoInitialize() session = win32com.client.Dispatch("Microsoft.Update.Session") self._ms_update_installer = session.CreateUpdateInstaller() return self._ms_update_installer.isBusy
def getNextEvent(self): from opsiclientd.windows import importWmiAndPythoncom # pylint: disable=import-outside-toplevel (_wmi, pythoncom) = importWmiAndPythoncom(importWmi=False, importPythoncom=True) pythoncom.PumpMessages() logger.info( "Event generator '%s' now deactivated after %d event occurrences", self, self._eventsOccured) self.cleanup()
def initialize(self): EventGenerator.initialize(self) logger.notice("Registring ISensLogon") from opsiclientd.windows import importWmiAndPythoncom, SensLogon # pylint: disable=import-outside-toplevel (_wmi, pythoncom) = importWmiAndPythoncom(importWmi=False, importPythoncom=True) pythoncom.CoInitialize() sl = SensLogon(self.callback) sl.subscribe()
def cleanup(self): if self._lastEventOccurence and (time.time() - self._lastEventOccurence < 10): # Waiting some seconds before exit to avoid Win32 releasing # exceptions waitTime = int(10 - (time.time() - self._lastEventOccurence)) logger.info("Event generator '%s' cleaning up in %d seconds", self, waitTime) time.sleep(waitTime) from opsiclientd.windows import importWmiAndPythoncom # pylint: disable=import-outside-toplevel (_wmi, pythoncom) = importWmiAndPythoncom(importWmi=False, importPythoncom=True) pythoncom.CoUninitialize()
def cleanup(self): if self._opsiclientd.is_stopping(): return if self._lastEventOccurence and (time.time() - self._lastEventOccurence < 10): # Waiting some seconds before exit to avoid Win32 releasing exceptions waitTime = int(10 - (time.time() - self._lastEventOccurence)) logger.info("Event generator '%s' cleaning up in %d seconds", self, waitTime) time.sleep(waitTime) try: from opsiclientd.windows import importWmiAndPythoncom # pylint: disable=import-outside-toplevel (_wmi, pythoncom) = importWmiAndPythoncom() pythoncom.CoUninitialize() except ImportError: # Probably not running on Windows. pass