예제 #1
0
    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)
예제 #2
0
    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")
예제 #3
0
 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
예제 #4
0
 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()
예제 #5
0
    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()
예제 #6
0
    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()
예제 #7
0
    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