- Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathIGPythonService.py
More file actions
Latest commit
96 lines (86 loc) · 3.93 KB
/
Copy pathIGPythonService.py
File metadata and controls
96 lines (86 loc) · 3.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# HTTP 2 COM Service
# Copyright 2013 IGpython UK
# All Rights Reserved.
# Developer: Dairon Medina <dairon.medina AT gmail DOT com>
fromwin32apiimportCloseHandle, GetLastError, SetConsoleCtrlHandler
importwin32serviceutil
importwin32service
importwin32event
importservicemanager
importtraceback
importlogging
importtime
importos, sys
importinspect
importConfigParser, codecs
importserial
importsocket
importeventlet
importeventlet.wsgi
importjson
importhttplib
importftplib
importurllib
importSocketServer
importBaseHTTPServer
ROOT=os.path.dirname(sys.executable)
path=lambda*a: os.path.join(ROOT, *a)
settings=ConfigParser.ConfigParser()
settings.read(path('config/settings.conf'))
defbridge(env, start_response):
"""
The main SERVER
"""
port=settings.get('SERIAL', 'PORT')
ser=serial.Serial(port=port, baudrate=settings.getint('SERIAL', 'BAUDRATE'), parity=settings.get('SERIAL', 'PARITY'), stopbits=settings.getint('SERIAL', 'STOPBITS'),bytesize=settings.getint('SERIAL', 'BYTESIZE'), timeout=30)
headers= [('Content-Type', 'application/json'), ('Access-Control-Allow-Origin', '*'), ('Access-Control-Allow-Methods', '*'), ('Access-Control-Max-Age', '3628800')]
ifserisnotNone:
data=env['PATH_INFO'][1:]
ifsettings.getboolean('SERIAL', 'ADDENDLINE'):
data=str(data) +'\n\r'
#print data
ser.write(data)
raw=ser.readline()
start_response('200 OK', headers)
response= {'status': 'ok', 'content': str(raw)}
returnjson.dumps(response)
else:
start_response('200 OK', headers)
response= {'status': 'error', 'content': 'Serial port dont return any response or there is no device connected to it.'}
returnjson.dumps(response)
classIGPythonService(win32serviceutil.ServiceFramework):
_svc_name_='IGpython HTTP2CCOM Service'
_svc_description_='IGpython HTTP2COM Service. Takes requests on HTTP port and relays to COM serial.'
_scv_display_name_='TCP to COM - WSGI Server'
def__init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
# create an event that SvcDoRun can wait on and SvcStop
# can set.
# self.stop_event = win32event.CreateEvent(None, 0, 0, None)
self._server=None
self._protocol=eventlet.wsgi.HttpProtocol
bind_addr= ('', settings.getint('WEBSERVER', 'PORT'))
self._socket=eventlet.listen(bind_addr)
SetConsoleCtrlHandler(lambdax: True, True)
self.hWaitStop=win32event.CreateEvent(None,0,0,None)
defSvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
ifself._serverisnotNone:
self._socket.close()
self._server=None
win32event.SetEvent(self.hWaitStop)
self.ReportServiceStatus(win32service.SERVICE_STOPPED)
self.run=False
defSvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,''))
self.run=True
try:
self._server=eventlet.wsgi.server(self._socket, bridge, keepalive=False, debug=False, log_output=False)
except:
servicemanager.LogErrorMsg(traceback.format_exc()) # if error print it to event log
os._exit(-1)#return some value other than 0 to os so that service knows to restart
if__name__=='__main__':
win32serviceutil.HandleCommandLine(IGPythonService)