import cgi import datetime import configparser import pymysql def getDatabase(path = "config.cfg"): config = configparser.RawConfigParser() config.read(path) host = config.get("Database", "host") user = config.get("Database", "user") pwd = config.get("Database", "pass") name = config.get("Database", "name") conn = pymysql.connect(host, user, pwd, name) cur = conn.cursor(pymysql.cursors.DictCursor) return conn, cur def application(env, re): if env["REQUEST_METHOD"] == "POST": args = cgi.parse_qs(env['wsgi.input'].readline().decode(), True) elif env["REQUEST_METHOD"] == "GET": args = cgi.parse_qs(env['QUERY_STRING'], True) else: re("405 Method Not Allowed", []) return if env["PATH_INFO"] in ("/endpoint", "/endpoint.php"): try: device = args["device"][0] except: re("400 Bad Request", []) yield "

400 Bad Request

".encode() yield "device is required.".encode() return try: latitude = float(args["lat"][0].replace(",", ".")) longitude = float(args["lon"][0].replace(",", ".")) except Exception: re("400 Bad Request", []) yield "

400 Bad Request

".encode() yield "lat and lon are required.".encode() return try: altitude = float(args["alt"][0].replace(",", ".")) except: altitude = None try: timestamp = datetime.datetime.fromtimestamp(float(args["t"][0]) / 1000) except: timestamp = datetime.datetime.now() timestr = timestamp.strftime('%Y-%m-%d %H:%M:%S') conn, cur = getDatabase() sql = "INSERT INTO tracker(ts, device, lat, lon, alt) VALUES (%s, %s, %s, %s, %s);" cur.execute(sql, (timestr, device, str(latitude), str(longitude), str(altitude) if altitude != None else None)) conn.commit() re("200 OK", []) yield "OK".encode() return if env["PATH_INFO"] in ("/location", "/location.php"): try: device = args["device"][0] except: re("400 Bad Request", []) yield "

400 Bad Request

".encode() yield "device is required.".encode() return conn, cur = getDatabase() cur.execute("SELECT * FROM tracker WHERE device = %s ORDER BY ts DESC LIMIT 1;", device) row = cur.fetchone() re("200 OK", [["Content-Type", "text/html"]]) yield (""" Current Location

My location at %s

(last known position where I had a GPS signal, a network connection, and some battery power)

""" % (row["ts"], row["lat"], row["lon"], row["lat"], row["lon"])).encode() return