dark mode and websockets
[kismet-logviewer.git] / logviewer / dbview / views.py
1 from django.shortcuts import render
2 from django.http import HttpResponse, HttpRequest
3 import os
4 import sqlite3
5 import time
6 import json
7 import websockets
8
9 import pprint
10
11 from django.views.decorators.csrf import csrf_exempt
12
13 def load_db(query):
14     dir_list = os.listdir("logs/")
15     connection = sqlite3.connect("logs/"+dir_list[0])
16     cursor = connection.cursor()
17     rows = cursor.execute(query).fetchall()
18     return(rows)
19
20 @csrf_exempt
21 def index(request):
22     #if request.method == 'POST':
23     #    print("GOT A POST")
24     if request.path == "/devices/views/all_views.json":
25         uuid_members="["
26         dev_count=list(load_db("select count(device) from devices where type='Wi-Fi AP'"))
27         (devcount,) = dev_count[0]
28         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"IEEE802.11 Access Points\", \"kismet.devices.view.id\": \"phydot11_accesspoints\", \"kismet.devices.view.size\": "+str(devcount)+" },"
29         dev_count=list(load_db("select count(device) from devices where phyname='IEEE802.11'"))
30         (devcount,) = dev_count[0]
31         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"IEEE802.11 devices\", \"kismet.devices.view.id\": \"phy-IEEE802.11\", \"kismet.devices.view.size\": "+str(devcount)+" },"
32         dev_count=list(load_db("select count(device) from devices where type='RTL433'"))
33         (devcount,) = dev_count[0]
34         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"RTL433 devices\", \"kismet.devices.view.id\": \"phy-RTL433\", \"kismet.devices.view.size\": "+str(devcount)+" },"
35         dev_count=list(load_db("select count(device) from devices where type='Z-wave'"))
36         (devcount,) = dev_count[0]
37         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"Z-Wave devices\", \"kismet.devices.view.id\": \"phy-Z-Wave\", \"kismet.devices.view.size\": "+str(devcount)+" },"
38         dev_count=list(load_db("select count(device) from devices where type='BR/EDR'"))
39         (devcount,) = dev_count[0]
40         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"Bluetooth devices\", \"kismet.devices.view.id\": \"phy-Bluetooth\", \"kismet.devices.view.size\": "+str(devcount)+" },"
41         dev_count=list(load_db("select count(device) from devices where type='UAV'"))
42         (devcount,) = dev_count[0]
43         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"UAV devices\", \"kismet.devices.view.id\": \"phy-UAV\", \"kismet.devices.view.size\": "+str(devcount)+" },"
44         dev_count=list(load_db("select count(device) from devices where type='NrfMousejack'"))
45         (devcount,) = dev_count[0]
46         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"NrfMousejack devices\", \"kismet.devices.view.id\": \"phy-NrfMousejack\", \"kismet.devices.view.size\": "+str(devcount)+"},"
47         dev_count=list(load_db("select count(device) from devices where type='BTLE'"))
48         (devcount,) = dev_count[0]
49         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"BTLE devices\", \"kismet.devices.view.id\": \"phy-BTLE\", \"kismet.devices.view.size\": "+str(devcount)+" },"
50         dev_count=list(load_db("select count(device) from devices where phyname='AMR'"))
51         (devcount,) = dev_count[0]
52         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"RTLAMR devices\", \"kismet.devices.view.id\": \"phy-RTLAMR\", \"kismet.devices.view.size\": "+str(devcount)+" },"
53         dev_count=list(load_db("select count(device) from devices where phyname='ADSB'"))
54         (devcount,) = dev_count[0]
55         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"RTLADSB devices\", \"kismet.devices.view.id\": \"phy-RTLADSB\", \"kismet.devices.view.size\": "+str(devcount)+" },"
56         dev_count=list(load_db("select count(device) from devices where phyname='802.15.4'"))
57         (devcount,) = dev_count[0]
58         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"802.15.4 devices\", \"kismet.devices.view.id\": \"phy-802.15.4\", \"kismet.devices.view.size\": "+str(devcount)+" },"
59         dev_count=list(load_db("select count(device) from devices where phyname='RADIATION'"))
60         (devcount,) = dev_count[0]
61         uuid_members = uuid_members + "{ \"kismet.devices.view.description\": \"RADIATION devices\", \"kismet.devices.view.id\": \"phy-RADIATION\", \"kismet.devices.view.size\": "+str(devcount)+" },"
62         total_dev=list(load_db("select count(device) from devices"))
63         (devcount,) = total_dev[0]
64         uuid_members=uuid_members+"{ \"kismet.devices.view.description\": \"All devices\", \"kismet.devices.view.id\": \"all\", \"kismet.devices.view.size\": "+str(devcount)+" },"
65         uuid_list = list(load_db("select uuid from datasources"))
66         for uuid in uuid_list:
67             (single_uuid,) = uuid
68             uuid_count = list(load_db("select count(*) from data where datasource='"+str(single_uuid)+"'"))
69             (single_uuid_count,) = uuid_count[0]
70             uuid_members = uuid_members + "{\"kismet.devices.view.description\": \"Devices seen by datasource "+single_uuid+"\","
71             uuid_members = uuid_members + "\"kismet.devices.view.id\": \"seenby-"+single_uuid+"\","
72             uuid_members = uuid_members + "\"kismet.devices.view.size\": "+str(single_uuid_count)+"},"
73         uuid_members=uuid_members[:-1]
74         uuid_members=uuid_members+"]"
75         return HttpResponse(uuid_members, content_type='text/json')
76     elif request.path == "/system/user_status.json":
77         #Hardcoded for now
78         user_status = open('dbview/user_status.json')
79         return HttpResponse(user_status, content_type='text/json')
80     elif request.path == "/session/check_setup_ok":
81         return HttpResponse('Login configured in user config')
82     elif request.path == "/session/check_login":
83         return HttpResponse('Login valid')
84     elif request.path == "/dynamic.js":
85         #INCOMPLETE - read the devices and create a dynamic.js output
86         devices = load_db("select distinct(typestring) from datasources")
87         load_file = open('static/dynamic.js')
88         return HttpResponse(load_file, content_type='application/javascript')
89     elif request.path == "/gps/location.json":
90         #hardcoded cus it doesnt matter
91         user_status = open('dbview/gps_status.json')
92         return HttpResponse(user_status, content_type='text/json')
93     elif request.path == "/alerts/wrapped/last-time/0/alerts.json":
94         alerts = list(load_db("select cast(json as text) from alerts"))
95         alert_string="{\"kismet.alert.list\": ["
96         for alert in alerts:
97             (single_alert,) = alert
98             alert_string = alert_string + single_alert + ","
99         alert_string = alert_string[:-1]
100         alert_string = alert_string + "] ,\"kismet.alert.timestamp\": "+str(time.time())+"}"
101         return HttpResponse(alert_string, content_type='text/json')
102     elif request.path == "/phy/phy80211/ssids/views/ssids.json":
103         ssid_count = list(load_db("select count(device) from devices where type='Wi-Fi AP'"))
104         ssid_list = "{ \"recordsTotal\": "+str(ssid_count[0][0])+", \"data\": ["
105         ssids = list(load_db("select cast(device as text) from devices where type='Wi-Fi AP'"))
106         for ssid in ssids:
107             (single_ssid,) = ssid
108             ssid_json = json.loads(single_ssid)
109             try:
110                 ssid_list = ssid_list + "{"
111                 ssid_list = ssid_list + "\"dot11.ssidgroup.first_time\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.first_time']) +"\","
112                 ssid_list = ssid_list + "\"dot11.ssidgroup.ssid_len\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.ssidlen'])+"\","
113                 ssid_list = ssid_list + "\"dot11.ssidgroup.crypt_set\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.crypt_set'])+"\","
114                 ssid_list = ssid_list + "\"dot11.ssidgroup.hash\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.ssid_hash'])+"\","
115                 ssid_list = ssid_list + "\"dot11.ssidgroup.advertising_devices_len\": \"" + str(ssid_json['dot11.device']['dot11.device.num_advertised_ssids'])+"\","
116                 ssid_list = ssid_list + "\"dot11.ssidgroup.probing_devices_len\": \"" + str(ssid_json['dot11.device']['dot11.device.num_probed_ssids'])+"\","
117                 ssid_list = ssid_list + "\"dot11.ssidgroup.ssid\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.ssid'])+"\","
118                 ssid_list = ssid_list + "\"dot11.ssidgroup.responding_devices_len\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.probe_response'])+"\","
119                 ssid_list = ssid_list + "\"dot11.ssidgroup.last_time\": \"" + str(ssid_json['dot11.device']['dot11.device.last_beaconed_ssid_record']['dot11.advertisedssid.last_time'])+"\""
120                 ssid_list = ssid_list + "},"
121             except:
122                 ssid_list = ssid_list[:-1]
123                 #print("Skipping")
124         ssid_list = ssid_list[:-2]+ "}], \"draw\": 3, \"recordsFiltered\": "+str(ssid_count[0][0])+" }"
125         return HttpResponse(ssid_list, content_type='text/json')
126     elif request.path == "/system/status.json":
127         #Hardcoded - Setup for other users
128         user_status = open('dbview/status.json')
129         return HttpResponse(user_status, content_type='text/json')
130     elif request.path == "/alerts/alerts_view.json":
131         #INCOMPLETE - Check device Mappings
132         total_alerts=list(load_db("select count(json) from alerts"))
133         (alert_count,) = total_alerts[0]
134         alerts = list(load_db("select cast(json as text) from alerts"))
135         alert_string="{\"recordsTotal\": "+str(alert_count)+",\"data\": ["
136         for alert in alerts:
137             (single_alert,) = alert
138             alert_string = alert_string + single_alert + ","
139         alert_string = alert_string[:-1]
140         alert_string = alert_string + "], \"draw\": 6,\"recordsFiltered\": "+str(alert_count)+"}"
141         return HttpResponse(alert_string, content_type='text/json')
142     elif request.path == "/messagebus/last-time/0/messages.json":
143         messages = list(load_db("select * from messages DESC limit 30"))
144         message_string="{\"kismet.messagebus.list\": ["
145         for message in messages:
146             message_string = message_string + "{"
147             message_string = message_string + "\"kismet.messagebus.message_string\": \"" + message[4] + "\","
148             flag = "0"
149             if message[3] == "INFO":
150                 flag = "0"
151             if message[3] == "LOW":
152                 flag = "5"
153             if message[3] == "MEDIUM":
154                 flag = "10"
155             if message[3] == "HIGH":
156                 flag = "15"
157             if message[3] == "CRITICAL":
158                 flag = 20
159             if message[3] == "ERROR":
160                 flag = 20
161             message_string = message_string + "\"kismet.messagebus.message_flags\": \"" + str(flag) + "\","
162             message_string = message_string + "\"kismet.messagebus.message_time\": \"" + str(message[0]) + "\""
163             message_string = message_string + "},"
164         message_string = message_string[:-1]
165         message_string = message_string + "], \"kismet.messagebus.timestamp\": "+str(time.time())+" }"
166         return HttpResponse(message_string, content_type='text/json')
167     elif request.path == "/channels/channels.json":
168         user_status = open('dbview/channels.json')
169         return HttpResponse(user_status, content_type='text/json')
170     elif request.path == "/devices/views/all/devices.json":
171         #gotta figure out paging
172
173         total_dev=list(load_db("select count(device) from devices"))
174         (dev_count,) = total_dev[0]
175         dev_string = "{ \"recordsTotal\": "+str(dev_count)+", \"data\": ["
176         dev_list = list(load_db("select cast(device as text) from devices limit 126"))
177         for device in dev_list:
178             (dev,) = device
179             dev_string = dev_string + dev + ","
180         dev_string = dev_string[:-1]
181         dev_string = dev_string + "],\"draw\": 5,\"recordsFiltered\": "+str(dev_count)+"}"
182         return HttpResponse(dev_string, content_type='text/json')
183     elif request.path == "/eventbus/events.ws":
184         return HttpResponse("[]", content_type='text/json')
185     elif request.path == "/devices/multikey/as-object/devices.json":
186         #ClientMap incomplete.... figure out where the rest of the JSON comes from
187         search_json = ""
188         multikey = "{"
189         for key, value in request.POST.items():
190             search_json=json.loads(value)
191             for device in search_json['devices']:
192                 device_json = list(load_db("select cast(device as text) from devices where devkey='"+str(device)+"'"))
193                 (tmp,) = device_json
194                 device_json_x = json.loads(str(tmp[0]))
195                 multikey = multikey + "\""+str(device)+"\": {"
196                 for field in search_json['fields']:
197                     if (field[0:6] == "kismet"):
198                         multikey = multikey + "\""+field+"\": \""+device_json_x[field]+"\","
199                 multikey = multikey + "\"dot11.device.client_map\": {},"
200                 multikey = multikey[:-1]
201                 multikey = multikey + "},"
202         multikey = multikey[:-1]
203         multikey = multikey + "}"
204         return HttpResponse(multikey, content_type='text/json')