X-Git-Url: https://handorf.org/code/?a=blobdiff_plain;f=logviewer%2Fdbview%2Fviews.py;h=6a899ee6658d617d580b330ddc152701ef85e03d;hb=56cb69d2e0dd567bcbbed653863fc38dfd12f756;hp=e27c9c449b54f5df6f824433e7ba2cb0100bad44;hpb=8b386685d38cdb35f2d4090b14491d17761df339;p=kismet-logviewer.git diff --git a/logviewer/dbview/views.py b/logviewer/dbview/views.py index e27c9c4..6a899ee 100644 --- a/logviewer/dbview/views.py +++ b/logviewer/dbview/views.py @@ -4,6 +4,8 @@ import os import sqlite3 import time import json +import websockets + import pprint from django.views.decorators.csrf import csrf_exempt @@ -11,15 +13,16 @@ from django.views.decorators.csrf import csrf_exempt def load_db(query): dir_list = os.listdir("logs/") connection = sqlite3.connect("logs/"+dir_list[0]) - #connection.row_factory = lambda cursor, row: row[0] cursor = connection.cursor() rows = cursor.execute(query).fetchall() return(rows) @csrf_exempt + def index(request): #if request.method == 'POST': - # print("GOT A POST") + # for key, value in request.POST.items(): + # print(key,value) if request.path == "/devices/views/all_views.json": uuid_members="[" dev_count=list(load_db("select count(device) from devices where type='Wi-Fi AP'")) @@ -73,6 +76,7 @@ def index(request): uuid_members=uuid_members+"]" return HttpResponse(uuid_members, content_type='text/json') elif request.path == "/system/user_status.json": + #Hardcoded for now user_status = open('dbview/user_status.json') return HttpResponse(user_status, content_type='text/json') elif request.path == "/session/check_setup_ok": @@ -80,10 +84,12 @@ def index(request): elif request.path == "/session/check_login": return HttpResponse('Login valid') elif request.path == "/dynamic.js": + #INCOMPLETE - read the devices and create a dynamic.js output devices = load_db("select distinct(typestring) from datasources") load_file = open('static/dynamic.js') return HttpResponse(load_file, content_type='application/javascript') elif request.path == "/gps/location.json": + #hardcoded cus it doesnt matter user_status = open('dbview/gps_status.json') return HttpResponse(user_status, content_type='text/json') elif request.path == "/alerts/wrapped/last-time/0/alerts.json": @@ -96,20 +102,44 @@ def index(request): alert_string = alert_string + "] ,\"kismet.alert.timestamp\": "+str(time.time())+"}" return HttpResponse(alert_string, content_type='text/json') elif request.path == "/phy/phy80211/ssids/views/ssids.json": - user_status = open('dbview/ssids.json') - return HttpResponse(user_status, content_type='text/json') + ssid_count = list(load_db("select count(device) from devices where type='Wi-Fi AP'")) + ssid_list = "{ \"recordsTotal\": "+str(ssid_count[0][0])+", \"data\": [" + ssids = list(load_db("select cast(device as text) from devices where type='Wi-Fi AP'")) + for ssid in ssids: + (single_ssid,) = ssid + ssid_json = json.loads(single_ssid) + try: + ssid_list = ssid_list + "{" + ssid_list = ssid_list + "\"dot11.ssidgroup.first_time\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.first_time']) +"\"," + ssid_list = ssid_list + "\"dot11.ssidgroup.ssid_len\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.ssidlen'])+"\"," + ssid_list = ssid_list + "\"dot11.ssidgroup.crypt_set\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.crypt_set'])+"\"," + ssid_list = ssid_list + "\"dot11.ssidgroup.hash\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.ssid_hash'])+"\"," + ssid_list = ssid_list + "\"dot11.ssidgroup.advertising_devices_len\": \"" + str(ssid_json['dot11.device']['dot11.device.num_advertised_ssids'])+"\"," + ssid_list = ssid_list + "\"dot11.ssidgroup.probing_devices_len\": \"" + str(ssid_json['dot11.device']['dot11.device.num_probed_ssids'])+"\"," + ssid_list = ssid_list + "\"dot11.ssidgroup.ssid\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.ssid'])+"\"," + ssid_list = ssid_list + "\"dot11.ssidgroup.responding_devices_len\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.probe_response'])+"\"," + ssid_list = ssid_list + "\"dot11.ssidgroup.last_time\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.last_time'])+"\"" + ssid_list = ssid_list + "}," + except: + ssid_list = ssid_list[:-1] + #print("Skipping") + ssid_list = ssid_list[:-2]+ "}], \"draw\": 3, \"recordsFiltered\": "+str(ssid_count[0][0])+" }" + return HttpResponse(ssid_list, content_type='text/json') elif request.path == "/system/status.json": + #Hardcoded - Setup for other users user_status = open('dbview/status.json') return HttpResponse(user_status, content_type='text/json') elif request.path == "/alerts/alerts_view.json": - #MAY NOT BE COMPLETE + #INCOMPLETE - Check device Mappings + total_alerts=list(load_db("select count(json) from alerts")) + (alert_count,) = total_alerts[0] alerts = list(load_db("select cast(json as text) from alerts")) - alert_string="[" + alert_string="{\"recordsTotal\": "+str(alert_count)+",\"data\": [" for alert in alerts: (single_alert,) = alert alert_string = alert_string + single_alert + "," alert_string = alert_string[:-1] - alert_string = alert_string + "]" + alert_string = alert_string + "], \"draw\": 6,\"recordsFiltered\": "+str(alert_count)+"}" return HttpResponse(alert_string, content_type='text/json') elif request.path == "/messagebus/last-time/0/messages.json": messages = list(load_db("select * from messages DESC limit 30")) @@ -130,7 +160,7 @@ def index(request): flag = 20 if message[3] == "ERROR": flag = 20 - message_string = message_string + "\"kismet.messagebus.message_flags\": \"" + flag + "\"," + message_string = message_string + "\"kismet.messagebus.message_flags\": \"" + str(flag) + "\"," message_string = message_string + "\"kismet.messagebus.message_time\": \"" + str(message[0]) + "\"" message_string = message_string + "}," message_string = message_string[:-1] @@ -139,36 +169,213 @@ def index(request): elif request.path == "/channels/channels.json": user_status = open('dbview/channels.json') return HttpResponse(user_status, content_type='text/json') - elif request.path == "/devices/views/all/devices.json": - #for key, value in request.POST.items(): - # #print("-----") - # print(key+" = "+value) - # #print(value) - # if key == "draw": - # print("-----") - # print("DRAW") - # print(value) - # print("-----") - #gotta figure out paging - + #elif request.path == "/devices/views/all/devices.json": + elif request.path.startswith("/devices/views") and request.path.endswith("devices.json"): + device_request=request.path[15:-13] + #print("POST INFO") + #print(request.POST.getlist('search[value]')) + search = str(request.POST.getlist('search[value]'))[2:-2] + draw = str(request.POST.getlist('draw'))[2:-2] + start = str(request.POST.getlist('start'))[2:-2] + limit = str(request.POST.getlist('length'))[2:-2] total_dev=list(load_db("select count(device) from devices")) (dev_count,) = total_dev[0] - dev_string = "{ \"recordsTotal\": "+str(dev_count)+", \"data\": [" - dev_list = list(load_db("select cast(device as text) from devices limit 54")) + dev_string = "" + dev_string = "{ \"recordsTotal\": "+str(dev_count)+", \"data\": [ " + if device_request == "all": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phy-RTLADSB": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where phyname = 'ADSB' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and phyname = 'ADSB' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phydot11_accesspoints": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where type = 'Wi-Fi AP' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and type = 'Wi-Fi AP' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phy-BTLE": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where phyname = 'BTLE' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and type = 'BTLE' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phy-Bluetooth": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where phyname = 'Bluetooth' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and phyname = 'Bluetooth' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phy-RTL433": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where phyname = 'RTL433' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and phyname = 'RTL433' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phy-IEEE802.11": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where phyname = 'IEEE802.11' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and phyname = 'IEEE802.11' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phy-RADIATION": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where phyname = 'RADIATION' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and phyname = 'RADIATION' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phy-802.15.4": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where phyname = '802.15.4' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and phyname = '802.15.4' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phy-RTLAMR": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where phyname = 'METER' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and phyname = 'METER' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phy-NrfMousejack": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where phyname = 'NrfMousejack' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and phyname = 'NrfMousejack' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phy-UAV": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where phyname = 'UAV' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and phyname = 'UAV' LIMIT "+limit+" OFFSET "+start)) + elif device_request == "phy-Z-Wave": + if search == "": + dev_list = list(load_db("select cast(device as text) from devices where phyname = 'Z-Wave' LIMIT "+limit+" OFFSET "+start)) + else: + dev_list = list(load_db("select cast(device as text) from devices where cast(device as text) like '%"+search+"%' and phyname = 'Z-Wave' LIMIT "+limit+" OFFSET "+start)) for device in dev_list: (dev,) = device - dev_string = dev_string + dev + "," + dev_json = json.loads(dev) + newdev = {} + newdev['kismet.device.base.commonname'] = dev_json['kismet.device.base.commonname'] + newdev['kismet.device.base.type'] = dev_json['kismet.device.base.type'] + newdev['kismet.device.base.phyname'] = dev_json['kismet.device.base.phyname'] + newdev['kismet.device.base.crypt'] = dev_json['kismet.device.base.crypt'] + newdev['kismet.device.base.channel'] = dev_json['kismet.device.base.channel'] + newdev['kismet.device.base.datasize'] = dev_json['kismet.device.base.datasize'] + newdev['kismet.device.base.last_time'] = dev_json['kismet.device.base.last_time'] + newdev['kismet.device.base.first_time'] = dev_json['kismet.device.base.first_time'] + newdev['kismet.device.base.key'] = dev_json['kismet.device.base.key'] + newdev['kismet.device.base.macaddr'] = dev_json['kismet.device.base.macaddr'] + newdev['kismet.device.base.frequency'] = dev_json['kismet.device.base.frequency'] + newdev['kismet.device.base.manuf'] = dev_json['kismet.device.base.manuf'] + if newdev['kismet.device.base.phyname'] == "IEEE802.11": + newdev['adsb.device'] = 0 + newdev['bluetooth.device'] = 0 + newdev['uav.device'] = 0 + if newdev['kismet.device.base.phyname'] == "Bluetooth": + newdev['adsb.device'] = 0 + newdev['uav.device'] = 0 + newdev['buetooth.device'] = dev_json['bluetooth.device'] + if newdev['kismet.device.base.phyname'] == "ADSB": + newdev['bluetooth.device'] = 0 + newdev['uav.device'] = 0 + newdev['adsb.device'] = dev_json['adsb.device'] + if "kismet.common.rrd.last_time" in dev_json: + newdev['kismet.common.rrd.last_time'] = dev_json['kismet.common.rrd.last_time'] + if "dot11.device.num_associated_clients" in dev_json: + newdev['dot11.device.num_associated_clients'] = dev_json['dot11.device.num_associated_clients'] + if "dot11.device.last_bssid" in dev_json: + newdev['dot11.device.last_bssid'] = dev_json['dot11.device.last_bssid'] + if "dot11.advertisedssid.dot11e_channel_utilization_perc" in dev_json: + newdev['dot11.advertisedssid.dot11e_channel_utilization_perc'] = dev_json['dot11.advertisedssid.dot11e_channel_utilization_perc'] + if "dot11.advertisedssid.dot11e_qbss_stations" in dev_json: + newdev['dot11.advertisedssid.dot11e_qbss_stations'] = dev_json['dot11.advertisedssid.dot11e_qbss_stations'] + if "kismet.common.signal.last_signal" in dev_json: + newdev['kismet.common.signal.last_signal'] = dev_json['kismet.common.signal.last_signal'] + if "dot11.device.bss_timestamp" in dev_json: + newdev['dot11.device.bss_timestamp'] = dev_json['dot11.device.bss_timestamp'] + if "dot11.advertisedssid.dot11e_qbss" in dev_json: + newdev['dot11.advertisedssid.dot11e_qbss'] = dev_json['dot11.advertisedssid.dot11e_qbss'] + if "dot11.device.wpa_handshake_list" in dev_json: + newdev['dot11.device.wpa_handshake_list'] = dev_json['dot11.device.wpa_handshake_list'] + if "dot11.device.pmkid_packet" in dev_json: + newdev['dot11.device.pmkid_packet'] = dev_json['dot11.device.pmkid_packet'] + if "kismet.common.rrd.serial_time" in dev_json: + newdev['kismet.common.rrd.serial_time'] = dev_json['kismet.common.rrd.serial_time'] + + #print("====") + #print(json.dumps(newdev)) + #print(dev_json['kismet.device.base.commonname']) + #print("====") + #dev_string = dev_string + dev + "," + dev_string = dev_string + json.dumps(newdev) + "," dev_string = dev_string[:-1] - dev_string = dev_string + "],\"draw\": 5,\"recordsFiltered\": "+str(dev_count)+"}" - #dev_string = open('dbview/devices.json') + dev_string = dev_string + "],\"draw\": "+draw+",\"recordsFiltered\": "+str(dev_count)+"}" return HttpResponse(dev_string, content_type='text/json') elif request.path == "/eventbus/events.ws": return HttpResponse("[]", content_type='text/json') elif request.path == "/devices/multikey/as-object/devices.json": - print("here") + #ClientMap incomplete.... figure out where the rest of the JSON comes from + search_json = "" + multikey = "{" for key, value in request.POST.items(): - print("-----") - print(key) - print(value) - print("-----") - return HttpResponse("[]", content_type='text/json') + search_json=json.loads(value) + for device in search_json['devices']: + device_json = list(load_db("select cast(device as text) from devices where devkey='"+str(device)+"'")) + (tmp,) = device_json + device_json_x = json.loads(str(tmp[0])) + multikey = multikey + "\""+str(device)+"\": {" + for field in search_json['fields']: + if (field[0:6] == "kismet"): + multikey = multikey + "\""+field+"\": \""+device_json_x[field]+"\"," + multikey = multikey + "\"dot11.device.client_map\": {}," + multikey = multikey[:-1] + multikey = multikey + "}," + multikey = multikey[:-1] + multikey = multikey + "}" + return HttpResponse(multikey, content_type='text/json') + elif request.path == "/phy/ADSB/map_data.json": + #I had to do a stupid lat/long offset to draw the map grid because for some stupid reason python wouldnt do number scales right? + #limiting to 100 until i figure out paging + min_long = 361.0 + max_long = 0.0 + min_lat = 181.0 + max_lat = 0.0 + adsblist = "{ \"kismet.adsb.map.devices\": [ " + dev_list = list(load_db("select cast(device as text) from devices where phyname = 'ADSB' limit 100")) + for device in dev_list: + (dev,) = device + dev_json = json.loads(dev) + newdev = {} + newdev['kismet.device.base.first_time'] = dev_json['kismet.device.base.first_time'] + if "kismet.device.base.location" in dev_json: + newdev['kismet.device.base.location'] = dev_json['kismet.device.base.location'] + (tmp_min_long,tmp_min_lat) = newdev['kismet.device.base.location']['kismet.common.location.min_loc']['kismet.common.location.geopoint'] + tmp_min_lat = round(tmp_min_lat + 91, 6) + tmp_min_long = round(tmp_min_long + 181, 6) + if (tmp_min_lat != 91 and tmp_min_long !=181): + if (tmp_min_lat < min_lat): + min_lat = tmp_min_lat + if (tmp_min_long < min_long): + min_long = tmp_min_long + (tmp_max_long,tmp_max_lat) = newdev['kismet.device.base.location']['kismet.common.location.max_loc']['kismet.common.location.geopoint'] + tmp_max_lat = round(tmp_max_lat + 91,6) + tmp_max_long = round(tmp_max_long +181,6) + if (tmp_max_lat != 91 and tmp_max_long !=181): + if (tmp_max_lat > max_lat): + max_lat = tmp_max_lat + if (tmp_max_long > max_long): + max_long = tmp_max_long + newdev['kismet.device.base.macaddr'] = dev_json['kismet.device.base.macaddr'] + newdev['adsb.device'] = dev_json['adsb.device'] + newdev['kismet.device.base.type'] = dev_json['kismet.device.base.type'] + newdev['kismet.device.base.commonname'] = dev_json['kismet.device.base.commonname'] + newdev['kismet.device.base.name'] = dev_json['kismet.device.base.name'] + newdev['kismet.device.base.packets.data'] = dev_json['kismet.device.base.packets.data'] + newdev['kismet.device.base.frequency'] = dev_json['kismet.device.base.frequency'] + newdev['kismet.device.base.phyname'] = dev_json['kismet.device.base.phyname'] + newdev['kismet.device.base.last_time'] = dev_json['kismet.device.base.last_time'] + newdev['kismet.device.base.key'] = dev_json['kismet.device.base.key'] + adsblist = adsblist + json.dumps(newdev) + "," + adsblist = adsblist[:-1] + min_lat = round(min_lat - 91, 6) + min_long = round(min_long - 181, 6) + max_lat = round(max_lat - 91, 6) + max_long = round(max_long - 181, 6) + adsblist = adsblist + " ], \"kismet.adsb.map.min_lon\": "+str(min_long) + ", \"kismet.adsb.map.max_lat\": "+str(max_lat)+", \"kismet.adsb.map.min_lat\": "+str(min_lat)+", \"kismet.adsb.map.max_lon\": "+str(max_long)+" }" + return HttpResponse(adsblist, content_type='text/json')