From 88b8c9d693c0aaf057b54e736856f7c915b0a4d9 Mon Sep 17 00:00:00 2001 From: baloan Date: Wed, 25 Jan 2012 23:10:19 +0100 Subject: [PATCH] ADD: winservice template --HG-- branch : aspn --- src/winservice.py | 105 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 src/winservice.py diff --git a/src/winservice.py b/src/winservice.py new file mode 100644 index 0000000..0367981 --- /dev/null +++ b/src/winservice.py @@ -0,0 +1,105 @@ +# winservice.py + +from os.path import splitext, abspath +from sys import modules + +import win32serviceutil +import win32service +import win32event +import win32api + +class Service(win32serviceutil.ServiceFramework): + _svc_name_ = '_unNamed' + _svc_display_name_ = '_Service Template' + def __init__(self, *args): + win32serviceutil.ServiceFramework.__init__(self, *args) + self.log('init') + self.stop_event = win32event.CreateEvent(None, 0, 0, None) + def log(self, msg): + import servicemanager + servicemanager.LogInfoMsg(str(msg)) + def sleep(self, sec): + win32api.Sleep(sec*1000, True) + def SvcDoRun(self): + self.ReportServiceStatus(win32service.SERVICE_START_PENDING) + try: + self.ReportServiceStatus(win32service.SERVICE_RUNNING) + self.log('start') + self.start() + self.log('wait') + win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE) + self.log('done') + except Exception, x: + self.log('Exception : %s' % x) + self.SvcStop() + def SvcStop(self): + self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) + self.log('stopping') + self.stop() + self.log('stopped') + win32event.SetEvent(self.stop_event) + self.ReportServiceStatus(win32service.SERVICE_STOPPED) + # to be overridden + def start(self): pass + # to be overridden + def stop(self): pass + +def instart(cls, name, display_name=None, stay_alive=True): + ''' + Install and Start (auto) a Service + + cls : the class (derived from Service) that implement the Service + name : Service name + display_name : the name displayed in the service manager + stay_alive : Service will stop on logout if False + ''' + cls._svc_name_ = name + cls._svc_display_name_ = display_name or name + try: + module_path=modules[cls.__module__].__file__ + except AttributeError: + # maybe py2exe went by + from sys import executable + module_path=executable + module_file=splitext(abspath(module_path))[0] + cls._svc_reg_class_ = '%s.%s' % (module_file, cls.__name__) + if stay_alive: win32api.SetConsoleCtrlHandler(lambda x: True, True) + try: + win32serviceutil.InstallService( + cls._svc_reg_class_, + cls._svc_name_, + cls._svc_display_name_, + startType=win32service.SERVICE_AUTO_START + ) + print 'Install ok' + win32serviceutil.StartService( + cls._svc_name_ + ) + print 'Start ok' + except Exception, x: + print str(x) + +# +# +# +# +##### TEST MODULE +# +# +# +# + +# winservice_test.py +from winservice import Service, instart + +class Test(Service): + def start(self): + self.runflag=True + while self.runflag: + self.sleep(10) + self.log("I'm alive ...") + def stop(self): + self.runflag=False + self.log("I'm done") + +instart(Test, 'aTest', 'Python Service Test')