Esempio n. 1
0
    def SvcDoRun(self):
        import servicemanager

        # log a service started message
        servicemanager.LogMsg(
            servicemanager.EVENTLOG_INFORMATION_TYPE,
            servicemanager.PYS_SERVICE_STARTED,
            (self._svc_name_, ' (%s)' % self._svc_display_name_))
        try:
            # Spawn off web server
            self.thread_event = Event()
            self.thread_event.set()
            log.info('Before try block to spawn thread')
            try:
                if self._svc_thread_class:
                    log.info('Thread class specified, instantiating now')
                    self.service_thread = self._svc_thread_class(self.thread_event)
                    log.info('Thread instantiated, starting thread')
                    self.service_thread.start()
                    log.info('Thread started')
                else:
                    log.error("No Service thread was provided", culprit=__culprit__)
                    self.SvcStop()
            except Exception, info:
                log.error('Uncaught error in thread', exc_info=True, culprit=__culprit__)
                errmsg = getTrace()
                servicemanager.LogErrorMsg(errmsg)
                self.SvcStop()

            # Start watching directories
            self.mgmt_handles = []

            self.handles = watch_directories()
            self.add_mgmt_event_handler(self.timer, self.process_timer)
            self.add_mgmt_event_handler(self.overlapped.hEvent,
                                        self.process_named_pipe)
            self.add_mgmt_event_handler(self.hWaitStop,
                                        lambda a, b, c: True)
            self.handles.extend(self.mgmt_handles)

            # Set internal timer
            # default to 2 minute period
            timer_period = get_reg_value('HKLM', APP_REG_KEY, 'timer',
                                          default=120000)
            win32event.SetWaitableTimer(self.timer, 0, timer_period, None, None,
                                        False)

            while 1:
                hr = ConnectNamedPipe(self.pipe_handle, self.overlapped)

                rc = win32event.WaitForMultipleObjects(self.handles, 0,
                    win32event.INFINITE)

                if rc == win32event.WAIT_FAILED:
                    log.error('WAIT_FAILED for unknown reason')
                    self.SvcStop()
                    break
                elif rc == win32event.WAIT_TIMEOUT:
                    log.error('WAIT_TIMEOUT: This should NEVER happen')
                    pass
                elif (rc >= win32event.WAIT_OBJECT_0) and \
                     (rc < (len(self.handles) - len(self.mgmt_handles))):
                    process_directory_changes(self.handles[rc], rc)
                else:
                    offset = rc - len(self.handles) + len(self.mgmt_handles)
                    dobreak = self.mgmt_callbacks[offset](rc, self.handles,
                                                          self.mgmt_handles)
                    if dobreak:
                        break
                continue
Esempio n. 2
0
                    log.error('WAIT_TIMEOUT: This should NEVER happen')
                    pass
                elif (rc >= win32event.WAIT_OBJECT_0) and \
                     (rc < (len(self.handles) - len(self.mgmt_handles))):
                    process_directory_changes(self.handles[rc], rc)
                else:
                    offset = rc - len(self.handles) + len(self.mgmt_handles)
                    dobreak = self.mgmt_callbacks[offset](rc, self.handles,
                                                          self.mgmt_handles)
                    if dobreak:
                        break
                continue
        except:
            log.error('Uncaught error in main event loop', exc_info=True,
                      culprit='anagogic.service')
            servicemanager.LogErrorMsg(getTrace())

        # log a service stopped message
        servicemanager.LogMsg(
            servicemanager.EVENTLOG_INFORMATION_TYPE,
            servicemanager.PYS_SERVICE_STOPPED,
            (self._svc_name_, ' (%s) ' % self._svc_display_name_))


    def process_named_pipe(self, rc, handles, mgmt_handles):
        """ Read data from the named pipe and perform the appropriate action

        """
        hr, data = ReadFile(self.pipe_handle, 256)
        if data.strip() == 'refreshdirectories':
            unwatch_directories(self.handles[:-len(mgmt_handles)])