| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| import time |
| from os.path import splitext, abspath |
| from sys import modules |
| |
| import servicemanager |
| import win32api |
| import win32event |
| import win32service |
| import win32serviceutil |
| |
| |
| 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): |
| 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) |
| |
| def sleep(self, sec): |
| time.sleep(sec) |
| |
| def start(self): |
| self.run() |
| self.runflag = True |
| while self.runflag: |
| self.sleep(1) |
| |
| def stop(self): |
| self.runflag = False |
| |
| |
| def installService(cls, name, display_name=None, stay_alive=True): |
| 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 'Installing service %s... done' % name |
| win32serviceutil.StartService( |
| cls._svc_name_ |
| ) |
| print 'Starting service %s... done' % name |
| print '\nAll done!' |
| |
| except Exception, x: |
| print str(x) |