1 contributor
#!/usr/bin/env python3
from http.server import BaseHTTPRequestHandler, HTTPServer
import datetime
from time import perf_counter
import os
import socket
import requests
from userio import *
import time
import sqlite3
import urllib.parse
server = None
db_name = None
webServer = None
server_name="ADMIN : "
connectionResults = None
data_begin = None
data_end = None
conn = None
c = None
class MyServer(BaseHTTPRequestHandler):
def log_message(self, format, *args):
# To silence the default output of server (too verbose)
return
def do_GET(self):
rootdir = '.'
if not os.path.exists(rootdir + self.path) or self.path == '/index.html' or self.path == '/':
sourceIP=""
if self.headers['X-Real-IP'] is None:
sourceIP="From: "+self.client_address[0]+" GET"
else:
sourceIP="From: "+self.headers['X-Real-IP']+" GET"
page=[]
data_page = "";
data_page += "<div class=\"topnav\" id=\"myTopnav\">\n"
data_page += "<span class=\"title\">"+server['name']+"</span>\n"
data_page += "<a href=\"?action=message\">Message</a>\n"
data_page += "<a href=\"?action=address\">Addresses</a>\n"
data_page += "</div>\n"
s = self.path
urlArgs = urllib.parse.parse_qs(s[2:])
try:
action = None
if "action" in urlArgs:
action = urlArgs['action'][0]
#data_page += "<br>["+action+"]<br>"
except:
return
if action == "message":
sqlquery='select * from sms order by epoch desc limit 10;'
c.execute(sqlquery)
rows = c.fetchall()
data_page+="<table>\n"
data_page+="<thead>\n"
data_page+=" <th>Date</th>\n"
data_page+=" <th>From</th>\n"
data_page+=" <th>To</th>\n"
data_page+=" <th>Content</th>\n"
data_page+="</thead>\n"
data_page+="<tbody>\n"
for row in rows:
data_page+="<tr><td>"+row[5]+"</td><td>"+row[1]+"</td><td>"+row[2]+"</td><td>"+row[4]+"</td></tr>\n"
data_page+="</tbody>\n"
data_page+="<table>\n"
elif action == "address":
sqlquery='select * from address;'
c.execute(sqlquery)
rows = c.fetchall()
data_page+="<table>\n"
data_page+="<thead>\n"
data_page+=" <th>DevEUI</th>\n"
data_page+=" <th>SubscriberID</th>\n"
data_page+=" <th>SMSid</th>\n"
data_page+="</thead>\n"
data_page+="<tbody>\n"
for row in rows:
data_page+="<tr><td>"+row[0]+"</td><td>"+row[1]+"</td><td>"+str(row[2])+"</td></tr>\n"
data_page+="</tbody>\n"
data_page+="<table>\n"
else:
data_page+="<p>Pick one action in the bar above</p>\n"
page.append(data_begin)
page.append(data_page)
page.append(data_end)
content = ''.join(page)
self.send_response(200)
self.send_header("Content-type", "text/html")
self.send_header('Server',server['name']+" v"+server['version'])
self.end_headers()
self.wfile.write(content.encode('utf-8'))
return
elif not os.path.exists(rootdir + self.path):
self.send_header('Server',server['name']+" v"+server['version'])
self.send_error(404, 'file not found')
else:
try:
f = open(rootdir + self.path,'rb') #open requested file
self.send_response(200)
if self.path.endswith('.css'):
self.send_header('Content-type','text/css')
elif self.path.endswith('.bmp'):
self.send_header('Content-type','image/x-ms-bmp')
elif self.path.endswith('.ico'):
self.send_header('Content-type','image/x-icon')
elif self.path.endswith('.png'):
self.send_header('Content-type','image/png')
elif self.path.endswith('.jpg'):
self.send_header('Content-type','image/jpeg')
else:
self.send_header('Content-type','text/html')
self.send_header('Server',server['name']+" v"+server['version'])
self.end_headers()
self.wfile.write(f.read())
f.close()
return
except IOError:
self.send_header('Server',server['name']+" v"+server['version'])
self.send_error(404, 'file not found')
def start(server_config):
#
global server
global data_begin
global data_end
global conn
global c
server = server_config['server']
db_name = server_config['database']
conn = sqlite3.connect(db_name)
c = conn.cursor()
data_begin = ""
with open('pageBegin.skel','r') as fStart:
data_begin += fStart.read().replace( 'CSTAPPNAME', server['name'] )
data_end = ""
with open('pageEnd.skel','r') as fStart:
data_end += fStart.read().replace( 'CSTAPPNAME', server['name'] )
say(server_name+server['name']+" v"+server['version'])
webServer = HTTPServer((server['address'], server['port']), MyServer)
say(server['address']+":"+str(server['port']))
webServer.serve_forever()
if __name__ == "__main__":
#global server
server = configuration.get_server()
say("----------------------")
say(server['name']+" v"+server['version'])
webServer = HTTPServer((server['address'], server['port']), MyServer)
say("Server started http://%s:%s" % (server['address'], server['port']))
getMenuItems()
try:
thWidget = threading.Thread(target=thCreateWidget)
thWidget.start()
thMqtt = threading.Thread(target=thMqttProbe)
thMqtt.start()
thMetar = threading.Thread(target=thCreateMetar)
thMetar.start()
thLightning = threading.Thread(target=thCreateLightning)
thLightning.start()
thIp = threading.Thread(target=thCreateIp)
thIp.start()
webServer.serve_forever()
except KeyboardInterrupt:
thWidget.join()
thMqtt.join()
thMetar.join()
thLightning.join()
thLightning.join()
thIp.join()
pass
webServer.server_close()
print("Server stopped.")