Newer
Older
:author: Vladan S
:copyright: D-Logic http://www.d-logic.net
from BaseHTTPServer import BaseHTTPRequestHandler
from BaseHTTPServer import HTTPServer
return 'App name : {0} : {1}'.format(AIS_HTTP, __program_version)
def http_request(path, post_attrib, time_out=20):
try:
req = urllib2.Request(path, post_attrib)
req.add_header("Content-type", "application/x-www-form-urlencoded")
page = urllib2.urlopen(req, timeout=time_out)
return page.read(), page.code
except urllib2.URLError, urlExc:
return '', urlExc.reason
except urllib2.HTTPError, httpExc:
return '', httpExc.code
class GetHandler(BaseHTTPRequestHandler):
global url_query
def WriteFile(self, path):
'''Write any file to client
if self.path == '/':
self.path = path
with open(os.path.join(os.sep, fname)) as t:
self.send_response(200)
self.send_header('Content-type', types_map[ext])
self.end_headers()
self.wfile.write(t.read())
try:
listdirs = os.listdir(path)
except os.error:
self.send_error(404)
f.write('<!DOCTYPE html>')
f.write("<html>\n<title>Directory listing</title>\n")
f.write("<body>\n<h2>Directory listing for {0}</h2>\n".format(path))
f.write("<hr>\n<ul>\n")
for name in listdirs:
if os.path.isdir(fullname):
displayname = name + "/"
if os.path.islink(fullname):
displayname = name + "@"
f.write('<li><a href="%s">%s</a>\n' % (urllib.quote(linkname), cgi.escape(displayname)))
f.write("</ul>\n<hr>\n</body>\n</html>\n")
self.send_response(200)
encoding = sys.getfilesystemencoding()
self.send_header("Content-type", "text/html; charset=%s" % encoding)
self.send_header("Content-Length", str(length))
self.end_headers()
def do_HEAD(self):
f = self.send_head()
def translate_path(self, path):
"""Translate a /-separated PATH to the local filename syntax.
:param path:current path to translate path
:return: translated path
path = path.split('?', 1)[0]
path = path.split('#', 1)[0]
path = posixpath.normpath(urllib.unquote(path))
words = path.split('/')
words = filter(None, words)
path = os.getcwd()
for word in words:
drive, word = os.path.splitdrive(word)
head, word = os.path.split(word)
if word in (os.curdir, os.pardir): continue
path = os.path.join(path, word)
return path
def script_name(self):
if not os.path.basename(sys.argv[0]) == AIS_HTTP:
return [HTML_OTHER_INIT_SCRIPT, HTM_OTHER_INIT_SCRIPT]
return [HTML_INIT_SCRIPT, HTM_INIT_SCRIPT]
path = self.translate_path(self.path)
index = os.path.join(os.path.join(os.getcwd(), HTML_FOLDER, index))
if os.path.exists(index):
path = index
break
return self.list_dir(path)
try:
f = open(path, 'rb')
except IOError:
self.send_error(404, 'File Not Found: %s' % self.path)
return None
fname, ext = os.path.splitext(path)
self.send_response(200)
self.send_header("Content-type", types_map[ext])
fs = os.fstat(f.fileno())
self.send_header("Content-Length", str(fs[6]))
self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
except IOError:
self.send_error(404, 'File Not Found: %s' % self.path)
try:
f = self.send_head()
if f:
shutil.copyfileobj(f, self.wfile)
f.close()
except IOError:
self.send_error(404, 'File Not Found: %s' % self.path)
global start_index, end_index
global start_time, end_time
ldev = device_list.S_DEVICE
if ctype == 'multipart/form-data':
pq = cgi.parse_multipart(self.rfile, pdict)
elif ctype == 'application/x-www-form-urlencoded':
length = int(self.headers['content-length'])
pq = cgi.parse_qs(self.rfile.read(length), keep_blank_values=1)
f = ''.join(pq[FUNCTION] if pq.get(FUNCTION) else '')
device = ''.join(pq[DEVICE] if pq.get(DEVICE) else '')
elif int(device) > len(HND_LIST):
self.wfile.write("\ndev[%s]NO DEVICE FOUND (or resource busy)\n" % device)
if pq.has_key(DEVICE_TYPE):
device_type = ''.join(pq[DEVICE_TYPE])
if pq.has_key(DEVICE_ID):
device_id = ''.join(pq[DEVICE_ID])
if pq.has_key(EDIT_LIST):
edit_list_choise = ''.join(pq[EDIT_LIST])
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
if pq.has_key(START_INDEX) and pq.has_key(END_INDEX):
start_index = (''.join(pq[START_INDEX]))
end_index = (''.join(pq[END_INDEX]))
if pq.has_key(START_TIME) or pq.has_key(END_TIME):
start_time = (''.join(pq[START_TIME]))
end_time = (''.join(pq[END_TIME]))
if pq.has_key(WHITE_LIST_WRITE):
white_list_write = ''.join(pq[WHITE_LIST_WRITE])
if pq.has_key(BLACK_LIST_WRITE):
black_list_write = ''.join(pq[BLACK_LIST_WRITE])
if pq.has_key(DEFAULT_APP_PASS):
set_def_pass = ''.join(pq[DEFAULT_APP_PASS])
if pq.has_key(NEW_PASS):
new_pass = ''.join(pq[NEW_PASS])
if pq.has_key(UNREAD_LOG):
get_unread_log = (''.join(pq[UNREAD_LOG]))
if pq.has_key(LIGHTS):
lights_choise = ''.join(pq[LIGHTS])
self.SetHeaders()
self.wfile.write(command(f, device, ldev))
'''
# if f == 'q':
# self.SetHeaders()
# self.wfile.write(GetListInformation())
if f == 'v':
self.SetHeaders()
self.wfile.write("AIS_GetDLLVersion() >> %s\n" % AISGetLibraryVersionStr())
if f in ('x', 'X'):
self.wfile.write("\nServer stopped !\nClose program !\n")
if sys.platform.startswith('linux'):
os.system('pkill -9 python')
os.kill(os.getpid(), signal.SIGINT)
elif sys.platform.startswith('win'):
os._exit(0)
try:
self.wfile.write(AISRestart(ldev))
except TypeError:
self.wfile.write('')
try:
self.wfile.write(AISDestroy(ldev))
except TypeError:
self.wfile.write('')
self.wfile.write(edit_device_list(2))
elif edit_list_choise == CLEAR_LIST:
self.wfile.write(edit_device_list(3))
elif edit_list_choise == ADD_DEVICE:
self.wfile.write("AIS_List_AddDevicesForCheck() ...\n")
if device_type == '' or device_id == '':
self.wfile.write("You must enter values in the relevant fields !")
return
else:
self.wfile.write(
edit_device_list(4, "AIS_List_AddDeviceForCheck", int(device_type), int(device_id)))
elif edit_list_choise == ERASE_DEVICE:
self.wfile.write("AIS_List_EraseDeviceForCheck()...\n")
self.wfile.write(
edit_device_list(5, "AIS_List_EraseDeviceForCheck", int(device_type), int(device_id)))
try:
self.wfile.write(AISOpen(ldev))
except TypeError:
self.wfile.write('')
try:
self.wfile.write(AISClose(ldev))
except TypeError:
self.wfile.write('')
self.wfile.write(' COUNT >> {0} {1}'.format(count, wr_status('', res)))
except WindowsError:
pass
if rt.strip() == '':
self.wfile.write('Must enter value for seconds !')
return
else:
stop_time = time.time() + seconds # 10
# dev = DEV_HND
self.wfile.write("Wait for RTE for %d sec ...\n" % seconds)
time.sleep(THD_SLEEP)
self.wfile.write("End RTE listen")
if start_index and end_index:
self.wfile.write(log_by_index(int(start_index), int(end_index), ldev))
else:
self.wfile.write('You must enter values for START INDEX and END INDEX !')
if start_time and end_time:
self.wfile.write(log_by_time(int(start_time), int(end_time), ldev))
else:
self.wfile.write('You must enter values for START TIME and END TIME !')
elif f == 'P':
global PASS
self.wfile.write("Actual application password is :%s\n" % PASS)
self.wfile.write("Patch - new pass = default pass\n")
set_def_pass = PASS
PASS = set_def_pass
self.wfile.write(password_set_default(set_def_pass))
self.wfile.write("Old password is actual application password: %s\n" % PASS)
self.wfile.write("New password for units ( and application ): %s\n" % new_pass)
self.wfile.write("Try set new password for units= %s\n" % (new_pass))
if pq.has_key('fw_file'):
fw_file_name = ''.join(pq['fw_file_name'])
with open(fw_file_name, 'wb') as out:
out.write(''.join(pq['fw_file']))
self.wfile.write(fw_update(ldev, fw_name=fw_file_name))
os.remove(fw_file_name)
except Exception as exc:
self.wfile.write("ERROR: %s" % exc)
self.wfile.write('DEPRECATED AIS_Config_Send(), AIS_Config_Read()')
return
conf_file_rd = ''.join(pq[CONFIG_FILE_READ])
self.wfile.write(config_file_rd(fname=conf_file_rd))
from socket import gethostname, gethostbyname
with open(conf_file_rd + '.config', 'wb') as out:
http_request(ip + ":" + str(HTTP_SERVER_PORT), out.write(conf_file_rd + '.config'))
except Exception as exc:
self.wfile.write("ERROR: %s" % exc)
self.wfile.write('DEPRECATED AIS_Config_Send(), AIS_Config_Read()')
return
confFileWR = ''.join(pq[CONFIG_FILE_WRITE])
out.write(confFileWR)
self.wfile.write(config_file_wr(fname=confFileNameWR))
else:
self.wfile.write('NO FILE')
except Exception as exc:
if not os.path.basename(sys.argv[0]) == AIS_HTTP:
try:
from ais_readers_main_process import DoPOST
except Exception as error_mess:
self.wfile.write(traceback.print_exc())
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
"""Handle requests in a separate thread."""
def RunAll():
serv = threading.Thread(target=handler_server)
serv.start()
try:
if serv.isAlive():
serv.join(timeout=SERV_JOIN)
except (KeyboardInterrupt, SystemExit, Exception) as e:
httpd.server_close()
print '\nServer stopped\nProgram close', e
shut_event.set()
if sys.platform.startswith('linux'):
os.system('pkill -9 python')
elif sys.platform.startswith('win'):
sys.exit(0)
while not shut_event.is_set():
my_lock.acquire()
httpd.handle_request()
my_lock.release()
time.sleep(THD_SLEEP)
def init():
print AISGetLibraryVersionStr()
list_device()
httpd = HTTPServer((HTTP_SERVER_NAME, HTTP_SERVER_PORT), GetHandler)
httpd.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
RunAll()
my_lock = threading.Lock()
shut_event = threading.Event()
if __name__ == '__main__':
global httpd
init()