class ZEOService(win32serviceutil.ServiceFramework): _svc_name_ = "ZEO WinService" _svc_display_name_ = "ZEO Database Service" _svc_description_ = "This runs the ZEO server as a Windows service." def __init__(self, args): win32serviceutil.ServiceFramework.__init__(self, args) self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) self._setup_logging() self.s = None self.logger.info("Initializing ZEO Windows Service...") def SvcStop(self): try: self.logger.info("Stopping ZEO Windows service...") self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) self.s.server.close() self.s.clear_socket() self.s.remove_pidfile() finally: win32event.SetEvent(self.hWaitStop) def SvcDoRun(self): self.main() def main(self): try: args = get_registry_parameters(self._svc_name_) self.logger.info("Starting ZEO service with args %s ..."%args) options = ZEOOptions() args = args.split() options.realize(args) self.s = ZEOServer(options) self.s.check_socket() self.s.clear_socket() self.s.make_pidfile() self.s.open_storages() self.s.setup_signals() self.s.create_server() self.s.server.start_thread() self.logger.info("Started ZEO server") win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) except Exception as e: self.logger.exception(str(e)) @classmethod def CustomOptionHandler(cls, opts): print zeo_doc args = raw_input("Enter command line arguments for %s: " % cls._svc_name_) try: create_registry_parameters(cls._svc_name_, args.strip()) except Exception,x: print "Error occurred when setting command line args in the registry: ",x try: cls._svc_description_ except LookupError: return key = win32api.RegCreateKey(win32con.HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\%s" % cls._svc_name_) try: win32api.RegSetValueEx(key, "Description", 0, win32con.REG_SZ, cls._svc_description_); finally: win32api.RegCloseKey(key)