loraSMS / web / web.py /
Yanik Cawidrone Push everything
cbf75b6 a year ago
1 contributor
185 lines | 5.934kb
#!/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.")