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
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)])