Example #1
0
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"
Example #2
0
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"
Example #3
0
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
Example #4
0
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
Example #5
0
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"
Example #6
0
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