""" |
A windows service wrapper for the py.execnet socketserver. |
|
To use, run: |
python socketserverservice.py register |
net start ExecNetSocketServer |
""" |
|
import sys |
import os |
import time |
import win32serviceutil |
import win32service |
import win32event |
import win32evtlogutil |
import servicemanager |
import threading |
import socketserver |
|
|
appname = 'ExecNetSocketServer' |
|
|
class SocketServerService(win32serviceutil.ServiceFramework): |
_svc_name_ = appname |
_svc_display_name_ = "%s" % appname |
_svc_deps_ = ["EventLog"] |
def __init__(self, args): |
|
|
|
|
|
|
|
|
win32evtlogutil.AddSourceToRegistry(self._svc_display_name_, |
servicemanager.__file__, |
"Application") |
win32serviceutil.ServiceFramework.__init__(self, args) |
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) |
self.WAIT_TIME = 1000 |
|
|
def SvcStop(self): |
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) |
win32event.SetEvent(self.hWaitStop) |
|
|
def SvcDoRun(self): |
|
|
|
sys.stdout = sys.stderr = open('nul', 'w') |
|
|
win32evtlogutil.ReportEvent(self._svc_display_name_, |
servicemanager.PYS_SERVICE_STARTED, |
0, |
servicemanager.EVENTLOG_INFORMATION_TYPE, |
(self._svc_name_, '')) |
print "Begin: %s" % (self._svc_display_name_) |
|
hostport = ':8888' |
print 'Starting py.execnet SocketServer on %s' % hostport |
serversock = socketserver.bind_and_listen(hostport) |
thread = threading.Thread(target=socketserver.startserver, |
args=(serversock,), |
kwargs={'loop':True}) |
thread.setDaemon(True) |
thread.start() |
|
|
while True: |
result = win32event.WaitForSingleObject(self.hWaitStop, |
self.WAIT_TIME) |
if result == win32event.WAIT_OBJECT_0: |
break |
|
|
win32evtlogutil.ReportEvent(self._svc_display_name_, |
servicemanager.PYS_SERVICE_STOPPED, |
0, |
servicemanager.EVENTLOG_INFORMATION_TYPE, |
(self._svc_name_, '')) |
print "End: %s" % appname |
|
|
if __name__ == '__main__': |
|
win32serviceutil.HandleCommandLine(SocketServerService) |
|