def configure_device(): if request.method == 'POST': try: devices = json.loads(request.data.decode()) conn = sqlite3.connect(DB_FILE_PROXY, timeout=60) conn.row_factory = sqlite3.Row for device in devices: conn.execute( 'INSERT OR REPLACE INTO device (DevEui, AppKey, NwkKey, region) VALUES (?,?,?,?)', (reverse_eui(device["DevEui"]), device["AppKey"], device["NwkKey"], device["region"])) conn.commit() conn.close() return "ok" except Exception as e: return request.data.decode() + "<br>" + str(e) if request.method == 'GET': conn = sqlite3.connect(DB_FILE_PROXY, timeout=60) conn.row_factory = sqlite3.Row responses = conn.execute("SELECT rowid,* FROM device").fetchall() conn.close() all_devices = [] for response in responses: all_devices.append(dict(response)) html = """<html><table border="1"> <tr><th>DevEui</th><th>AppKey</th><th>NwkKey</th><th>Region</th><th>Rowid</th></tr>""" for response in all_devices: html += "<tr>" for key in ["DevEui", "AppKey", "NwkKey", "region", "rowid"]: if key == "DevEui": html += "<td>{}</td>".format( reverse_eui(response[key]).upper()) else: html += "<td>{}</td>".format(response[key]) html += "</tr>" html += "</table></html>" return html if request.method == 'DELETE': try: conn = sqlite3.connect(DB_FILE_PROXY, timeout=60) conn.row_factory = sqlite3.Row if request.data.decode() == "all": conn.execute('DELETE FROM device') conn.commit() else: rows = json.loads(request.data.decode()) for row in rows: conn.execute('DELETE FROM device WHERE rowid=(?)', (row["rowid"], )) conn.commit() conn.close() return "ok" except: conn.close() return "error"
def configure_schedule(): if request.method == 'POST': try: schedules = json.loads(request.data.decode()) conn = sqlite3.connect(DB_FILE_CONTROLLER, timeout=60) conn.row_factory = sqlite3.Row for schedule in schedules: if "Config" not in schedule: schedule["Config"] = {} schedule["Config"] = json.dumps(schedule["Config"]) conn.execute( 'INSERT OR REPLACE INTO schedule (DevEui, Cat, SubCat, Criteria, Parameter, \ CurrentPara, Config, AddTime, Ready) VALUES (?,?,?,?,?,?,?,?,?)', (reverse_eui(schedule["DevEui"]), schedule["Cat"], schedule["SubCat"], schedule["Criteria"], schedule["Parameter"], 0, schedule["Config"], time.time(), 0)) conn.commit() conn.close() return "ok" except: return "error" if request.method == 'GET': return "<a href='/result' target='_blank'>All sequences and results</a>" if request.method == 'DELETE': try: conn = sqlite3.connect(DB_FILE_CONTROLLER, timeout=60) conn.row_factory = sqlite3.Row if request.data.decode() == "all": conn.execute('DELETE FROM schedule') conn.commit() else: rows = json.loads(request.data.decode()) for row in rows: if "rowid" in row: conn.execute('DELETE FROM schedule WHERE rowid=(?)', (row["rowid"], )) conn.commit() if "Cat" in row and "SubCat" not in row: conn.execute('DELETE FROM schedule WHERE Cat=(?)', (row["Cat"], )) conn.commit() if "Cat" in row and "SubCat" in row: conn.execute( 'DELETE FROM schedule WHERE Cat=(?) and SubCat=(?)', (row["Cat"], row["SubCat"])) conn.commit() conn.close() return "ok" except: conn.close() return "error"
def open_packet_device(DevEui, startTime, duration, items): response = {"DevEui": reverse_eui(DevEui).lower(), "StartTime": float(startTime), "FinishTime": float(startTime) + float(duration), "UpdateTime": 0} packets = get_all_packets(response) html, packets = generate_error_log(packets, response) html += plot_items(packets, items, None) return html
def get_device(deveui): conn = sqlite3.connect(DB_FILE_BACKUP, timeout=60) conn.row_factory = sqlite3.Row device = conn.execute("SELECT * from device WHERE devEUI = (?)", (deveui, )).fetchone() if device: device = dict(device) device['DevEui'] = reverse_eui(device['DevEui']) response = conn.execute( "SELECT Region from regionSKU WHERE SkuID = (?)", (device['SkuID'], )).fetchone() if response: region = dict(response) logging.debug("region is {}".format(region)) device['region'] = region['Region'] else: device = None logging.error( "Cannot find region information for device: {}".format(deveui)) else: logging.error("Cannot find information for device: {}".format(deveui)) conn.close() return device
def configure_session(): if request.method == 'POST': try: sessions = json.loads(request.data.decode()) conn = sqlite3.connect(DB_FILE_PROXY, timeout=60) conn.row_factory = sqlite3.Row for session in sessions: packet = {} packet['AppSKey'] = session['AppSKey'] packet['FNwkSIntKey'] = session['NwkSKey'] packet['SNwkSIntKey'] = session['NwkSKey'] packet['NwkSEncKey'] = session['NwkSKey'] packet['JoinNonce'] = "" packet['Home_NetID'] = "" packet['DevAddr'] = session['DevAddr'] packet['RxDelay'] = 1 packet['OptNeg'] = "0" packet['RX1DRoffset'] = 0 packet['RX2DataRate'] = 7 conn.execute( 'INSERT OR REPLACE INTO session (FCntUp,NFCntDown,AFCntDown,AppSKey,FNwkSIntKey,' 'SNwkSIntKey,NwkSEncKey,JoinNonce,Home_NetID,DevAddr,RxDelay,' 'OptNeg,RX1DRoffset,RX2DataRate, RX2Freq) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', (0, 0, 0, packet['AppSKey'], packet['FNwkSIntKey'], packet['SNwkSIntKey'], packet['NwkSEncKey'], packet['JoinNonce'], packet['Home_NetID'], packet['DevAddr'], packet['RxDelay'], packet['OptNeg'], packet['RX1DRoffset'], packet['RX2DataRate'], 923.3)) conn.commit() conn.close() return "ok" except: return "error" return "POST method not supported" if request.method == 'GET': conn = sqlite3.connect(DB_FILE_PROXY, timeout=60) conn.row_factory = sqlite3.Row responses = conn.execute('SELECT rowid,* FROM session').fetchall() all_session = [] for response in responses: all_session.append(dict(response)) all_session = sorted(all_session, key=lambda k: k['time']) if not all_session: return "No session information available" keys = [ "time", "DevEui", "JoinEUI", "Home_NetID", "region", "DevNonce", "JoinNonce", "DevAddr", "AFCntDown", "FCntUp", "AppSKey", "rowid" ] html = '<html><table border="1"><tr>' for key in keys: html += "<th>" + key + "</th>" html += "</tr>" for response in all_session: html += "<tr>" for key in keys: if key == "DevEui": html += "<td>{}</td>".format( reverse_eui(response[key]).upper()) continue if key.find("Key") >= 0 or key in [ "DevAddr", "DevNonce", "JoinNonce" ]: if response[key]: html += "<td>{}</td>".format(response[key].upper()) else: html += "<td>None</td>" continue if key.find("time") >= 0 or key.find("Time") >= 0: if not response[key]: response[key] = "Ongoing" else: response[key] = str( datetime.fromtimestamp(response[key]))[:-7] html += "<td>{}</td>".format(str(response[key])) html += "</tr>" html += "</table></html>" return html if request.method == 'DELETE': conn = sqlite3.connect(DB_FILE_PROXY, timeout=60) conn.row_factory = sqlite3.Row conn.execute('DELETE FROM session') conn.commit() conn.close() return "ok"
def list_tests(): conn = sqlite3.connect(DB_FILE_CONTROLLER, timeout=60) conn.row_factory = sqlite3.Row responses = conn.execute('SELECT rowid,* FROM schedule').fetchall() all_sequence = [] for response in responses: all_sequence.append(dict(response)) all_sequence = sorted(all_sequence, key=lambda k: k['AddTime'], reverse=False) html = '<html><table border="1"><tr>' for key in ["DevEui", "Cat", "SubCat", "Criteria", "Parameter", "CurrentPara", "Config", "StartTime", "FinishTime", "rowid", "Passed", "Report Ready"]: html += "<th>" + key + "</th>" html += "</tr>" #response["Passed"] None: ongoing, 1: passed, -1: failed, -2: not run, -3: not implemented, -4: packet MIC error for response in all_sequence: if (response["FinishTime"] and not response["Passed"]): packets = get_all_packets(response) _, packets_valid = generate_error_log(packets, response) if len(packets_valid) == len(packets): try: _, suc = eval("ext_verification.verify_" + response["Cat"] + "_" + response["SubCat"] + "(packets, response)") print("Verify", response["Cat"] + "_" + response["SubCat"]) except AttributeError: suc = -3 else: suc = -4 response["Passed"] = suc conn.execute("UPDATE schedule SET Passed=(?) WHERE rowid=(?)", (response["Passed"], response["rowid"])) conn.commit() for response in all_sequence: html += "<tr>" for key in ["DevEui", "Cat", "SubCat", "Criteria", "Parameter", "CurrentPara", "Config", "StartTime", "FinishTime", "rowid", "Passed", "Ready"]: if key == "rowid": html += "<td><a href='/result/testid=%d'>%d</a><br></td>" % (response[key], response[key]) continue if key == "DevEui": html += "<td>{}</td>".format(reverse_eui(response[key]).upper()) continue if key == "Passed": lut = {1: "<font color='green'>Passed</font>", -1: "<font color='red'>Failed</font>", -2: "<font color='black'>Not Tested</font>", -3: "<font color='black'>Not Implemented</font>", -4: "<font color='red'>Packet MIC Error</font>", None: ""} response[key] = lut[response[key]] if key == "StartTime": if not response[key]: response[key] = "Pending Start" else: response[key] = str(datetime.fromtimestamp(response[key]))[:-7] if key == "FinishTime": if not response[key]: response[key] = "Not Finished" else: response[key] = str(datetime.fromtimestamp(response[key]))[:-7] if key == "Ready": if response[key] == 0: response[key] = " " if response[key] == 1: response[key] = "Generating" if response[key] == 2: response[key] = "Ready" html += "<td>{}</td>".format(str(response[key])) html += "</tr>" html += "</table></html>" conn.commit() conn.close() return html