Files
esp32-cluster/coordinator/__pycache__/dashboard.cpython-314.pyc
T

511 lines
44 KiB
Plaintext
Raw Normal View History

2026-04-03 14:38:38 +03:00
+
2026-04-05 13:06:25 +03:00
1ÒižãóZaRUt@0tRt^RIt^RIt^RIt^RIt^RIt^RIHtH t H
t
^RI H t H
t
Ht]PP!]PP#]4R4t]PP!]PP#]4RR4t]PP!]PP#]4RR4t]PP!]PP#]4RR 4t]PP!]PP#]4R
2026-04-03 14:38:38 +03:00
4t^t^dt/^RVb^RWb^RXb^RYb^RZb^R[b^R\b^R]b^R^b^ R_b^
R`b^ Rab^
2026-04-05 13:06:25 +03:00
Rbb^Rcb^Rdb^Reb^Rfb^Rg^Rh^Ri^Rj^Rk^Rl^Rm^"Rn^'Ro^-Rp^/Rq^cRr^gRs^“Rt/Ct]^kR R ltR
2026-04-03 14:38:38 +03:00
Rlt]!]4t]^kRRltRRltRuRRllt ]3RRllt!RRlt"]R3RRllt#RRlt$RRlt%RR lt&R!R"lt'R#R$lt(R%R&lt)R'R(lt*R)t+]!R*R+7t,]+!4],P[R,] R-7R.4t.],P[R/4R04t/],P[R14R24t0],P[R34R44t1],P[R54]3R6R7ll4t2],P[R84R94t3],P[R:4R;4t4],P[R<4R=4t5],P[R>4R?4t6],P[R@4RvRARBll4t7],P[RC4RwRDREll4t8],P[RF4RG4t9],P[RH4RI4t:],P[RJ4RKRLl4t;],P[RM4RN4t<]=RO8Xd^RI>t>]>P~!RPRQRRRSRT7R#R#)xz]
WiFi Recon Dashboard
2026-04-05 13:06:25 +03:00
Reads from events.db (written by udp_ingest.py), serves a live web UI.
2026-04-03 14:38:38 +03:00
N)ÚFastAPIÚRequestÚ
HTTPException)Ú HTMLResponseÚStreamingResponseÚ FileResponsez events.dbÚ templateszdashboard.htmlÚstaticz
dashboard.cssz dashboard.jszoui.txtcóRV^8„dQhR\R\\\3,/#)éÚcodeÚreturn)ÚintÚtupleÚstr)Úformatscoordinator/dashboard.pyÚ __annotate__r<s&÷MñMœSðM¤U¬3´¨8¥_ñMócó.\PVR4#)úUnknown / vendor-specific)rÚnormal)ÚDEAUTH_REASONSÚget)r s&rÚdeauth_reason_infor<sÜ × Ñ ˜dÐ$KÓ LrcóRV^8„dQhR\R\\\3,/#)r Úpathr
©rÚdict)rs"rrrAs"÷
2026-04-05 13:06:25 +03:00
ñ
”Cð
2026-04-03 14:38:38 +03:00
œD¤¤c 
2026-04-05 13:06:25 +03:00
rcóÌ/p\PPV4'gV#\VRRR7;_uu_4pVFpRV9dK VP R4pV^,P 4P
RR4P4pV^,P 4pV'gKsV'gK}WaV& RRR4V# +'giT#;i)zutf-8Úignore)ÚencodingÚerrorsz(hex)Ú:N)ÚosrÚexistsÚopenÚsplitÚstripÚreplaceÚupper)rÚdbÚlineÚpartsÚprefixÚvendors& rÚ _load_ouir2AØ€BÜ
2026-04-03 14:38:38 +03:00
7‰7>‰>˜$× Ò Øˆ Ü
2026-04-05 13:06:25 +03:00
ˆd˜W¨X× 6Õ 6¸ˆ˜Ø—JJ˜'ˆ˜1•X—^%×-¨c°3Ó?ˆFؘ1•X—^%ˆ‰vŸ&™&Ø#6“
ñ÷
2026-04-03 14:38:38 +03:00
 €I÷
2026-04-05 13:06:25 +03:00
7Ö 6ð €IúsÁA1CÂ6CÃCÃ C# cóRV^8„dQhR\R\\\3,/#)r Úmacr
)rrÚbool)rs"rrrSs#÷3”Cð3œE¤#¤t 3rcóZV'd\V4^8dR#\VPRR4PRR4R,^4p\V^,4pT'dR #TP 4R,p\ PTR4R3# \dRu#i;i)
2026-04-03 14:38:38 +03:00
Returns (vendor_name, is_randomized).
2026-04-05 13:06:25 +03:00
Randomized MACs have the locally-administered bit set (bit 1 of first byte).
2026-04-03 14:38:38 +03:00
OUI lookup is meaningless for randomized MACs.
ÚUnknownFr$Úr#:Nr N:NéN)r7F)zRandomized MACT)Úlenrr*r5Ú
ValueErrorr+Ú_OUI_DBr)r4Ú
first_byteÚ
randomizedr0s& rÚ
oui_lookupr?Ss÷ ”#c“(˜Q”,ؘŸ S¨"Ó-×5°c¸>¸BÀBÓGˆ
ܘ* ,ˆ
2026-04-05 13:06:25 +03:00
֯
2026-04-03 14:38:38 +03:00
Y‰Y‹[˜_€FÜ K‰K˜  Ó *¨EÐ 2øô ô"úsœABÂ
B*Â)B*có8V^8„dQhR\P/#©r r
)Úsqlite3Ú
Connection)rs"rrrgs÷ñ”'×rcó†\P!\4p\PVnVP R4V#)zPRAGMA journal_mode=WAL)rBÚconnectÚDB_PATHÚRowÚ row_factoryÚexecute©Úconns rÚget_connrLgs.Ü ?Š?œ7Ó #€DÜ—{‘{€DÔØ‡L €KrcóRV^8„dQhR\R\R\\,/#)r ÚsqlÚparamsr
)rrÚlistr)rs"rrrns%÷#Œsð#œEð#¬4´­#rcóÜ\4;_uu_4pVPW4P4pRRR4XUu.uFp\V4NK up# +'giL+;iuupi©N)rLrIÚfetchallr)rNrOrKÚrowsÚrs&& rÚqueryrVnsJÜ Œ|‰|˜CÓ÷
2026-04-05 13:06:25 +03:00
á "™T˜ŒDŽG™TÑ 
üâ "s“ A¿A)Á A& cóJV^8„dQhR\R,R\R\/#)r Ú last_seenNÚ thresholdr
2026-04-03 14:38:38 +03:00
©rr)rs"rrrts%÷ñœC $´3ðÌñrcóôV'gR#\PPV4p\PP4V,
P4pW18:dR#R# \dR#i;i)ÚofflineÚonline)ÚdatetimeÚ
fromisoformatÚutcnowÚ
total_secondsr;)rXrYÚdtÚdeltas&& rÚ _node_statusrdtsgß ÙðÜ
×
2026-04-05 13:06:25 +03:00
Ñ
2026-04-03 14:38:38 +03:00
×
,¨YÓ
7ˆÜ×"×+¨bÕ0ר Ô-ˆ<°9Ð<øÜ ôÚðúsŒAA(Á&A(Á( A7Á6A7có:V^8„dQhR\\,/#rA©rPr)rs"rrrs÷ñ”Tœ$•Zñrcó\R4p\R4pVUu/uF q"R,VbK ppVpVPVR,/4pVPR4VR&VPR4VR&VPR4VR&VPR4VR&VR,;'g
VR,VR&VR,'d\VR,^R 7VR
&\VR,^<R 7VR
2026-04-05 13:06:25 +03:00
& V#uupi) a
SELECT
node_id,
2026-04-03 14:38:38 +03:00
MAX(received_at) AS last_beacon,
COUNT(*) AS total_events,
MIN(received_at) AS first_seen
FROM beacon_events
GROUP BY node_id
ORDER BY node_id ASC
SELECT node_id, received_at AS last_heartbeat,
uptime_ms, free_heap, wifi_rssi
FROM heartbeat_events
WHERE id IN (SELECT MAX(id) FROM heartbeat_events GROUP BY node_id)
Únode_idÚlast_heartbeatÚ uptime_msÚ free_heapÚ wifi_rssiÚ last_beaconrX©rYÚstatus)rVrrd)rTÚhb_rowsrUÚhb_mapÚhbs rÚ build_nodesrssÜ ð ó €Dôðó €Gñ (/Ó
/¡w ! l˜AŠo¡w€FÐ
2026-04-05 13:06:25 +03:00
ˆØ
Z‰Z˜˜)  
Ø Ÿf™fÐ%5ÓÐ
2026-04-03 14:38:38 +03:00
ÑØ Ÿf™f [Óˆ+‰Ø Ÿf™f [Óˆ+‰Ø Ÿf™f [Óˆ+‰ØÐ 0ÕE°Q°}Õ5Eˆˆ+‰à Ð
2026-04-05 13:06:25 +03:00
× Ô Ü& qÐ)9Õ':ÀbÔIˆAˆh& Õ'7À2ÔFˆAˆhð €Kùò0sC?có`V^8„dQhR\R\R,R\\,/#)r ÚlimitrhNr
2026-04-03 14:38:38 +03:00
)rrrPr)rs"rrr¢s)÷
ñ
œð
´#¸µ*ð
ÌÌTÍ
ñ
rcóFV'd\RW34#\RV34#)zt
SELECT * FROM beacon_events
WHERE node_id = ?
ORDER BY id DESC LIMIT ?
zJ
SELECT * FROM beacon_events
ORDER BY id DESC LIMIT ?
2026-04-05 13:06:25 +03:00
©rV©rurhs&&rÚ build_eventsry¢s:ßÜð ðÐ
ó ð ô
ðð ˆó ðrcó:V^8„dQhR\\,/#rArf)rs"rrr¯s÷ñœœT
ñrcó\R4pV#)
SELECT
ssid,
bssid,
MAX(rssi) AS best_rssi,
ROUND(AVG(rssi), 1) AS avg_rssi,
channel,
2026-04-03 14:38:38 +03:00
encryption,
COUNT(*) AS times_seen,
COUNT(DISTINCT node_id) AS node_count,
MAX(received_at) AS last_seen
FROM beacon_events
2026-04-05 13:06:25 +03:00
WHERE bssid IS NOT NULL
2026-04-03 14:38:38 +03:00
GROUP BY bssid
2026-04-05 13:06:25 +03:00
ORDER BY times_seen DESC
LIMIT 300
rw)rTs rÚbuild_networksr|¯sÜ ðó €Dð" €Krcó:V^8„dQhR\\,/#rArf)rs"rrrÄs÷'ñ'”tœD•zñ'rcóÒ\R4pV'g.#VUu.uF qR,NK
ppRPR\V4,4p\RV R2\V44p/pVF2pVP VR,.4P VR,4K4 VF;pVP
VR,.4VR&\VR,4wrxWqR &WR
&K= V#uupi) zK
Per unique src_mac: aggregated stats and the SSIDs they were probing for.
aL
SELECT
src_mac,
COUNT(*) AS times_seen,
COUNT(DISTINCT node_id) AS node_count,
MAX(rssi) AS best_rssi,
ROUND(AVG(rssi), 1) AS avg_rssi,
COUNT(DISTINCT NULLIF(ssid,'')) AS unique_ssids,
MIN(received_at) AS first_seen,
MAX(received_at) AS last_seen
FROM probe_events
WHERE src_mac IS NOT NULL
2026-04-03 14:38:38 +03:00
GROUP BY src_mac
2026-04-05 13:06:25 +03:00
ORDER BY times_seen DESC
LIMIT 300
Úsrc_macÚ?zS
2026-04-03 14:38:38 +03:00
SELECT DISTINCT src_mac, ssid FROM probe_events
WHERE src_mac IN (zI) AND ssid IS NOT NULL AND ssid != ''
2026-04-05 13:06:25 +03:00
ORDER BY src_mac, ssid
ÚssidÚ probed_ssidsr1r>)rVÚjoinr:rÚ
setdefaultÚappendrr?) rTrUÚmac_listÚ placeholdersÚ ssid_rowsÚ ssids_by_macÚsr1r>s rÚ
build_clientsrŒÄô ðó €D÷" ؈ Ù*.Ó/©$ Qi—LL©$€HЗ88˜C¤# h£-Õ0€LÜðà'˜)ðô
ˆxó €Ið
€LÛ
ˆØ×Ñ  )¥ ¨bÓ¸6½ÖóˆØ,¨Q¨y­\¸>ˆˆÜ¨)­ ÓˆØ ˆ(‰ Ø$ˆ,‹ñ ð
€Kùò!0sšC$có$V^8„dQhR\/#rA©r)rs"rrrîs÷886œ$ñ86rc óÊ\R4pVUu.uF qR,NK
pp\R4p/pVFipVR,pWT9d$RVRVR,RVR,RVR,R//WE&R VR ,R
VR
,R VR ,/WE,R,VR,&Kk \VP4R R
R7pVFp\VR,4VR&K RVRV/#uupi)
For every BSSID, return per-node RSSI stats side by side.
Result: { node_ids: [...], networks: [{bssid, ssid, channel, encryption,
node_count, nodes: {node_id: {best_rssi, avg_rssi, times_seen}}}] }
z;SELECT DISTINCT node_id FROM beacon_events ORDER BY node_idrh
SELECT
b.bssid,
MAX(b.ssid) AS ssid,
MAX(b.channel) AS channel,
MAX(b.encryption) AS encryption,
b.node_id,
MAX(b.rssi) AS best_rssi,
ROUND(AVG(b.rssi), 1) AS avg_rssi,
COUNT(*) AS times_seen
FROM beacon_events b
WHERE b.bssid IN (
SELECT bssid FROM beacon_events
WHERE bssid IS NOT NULL
GROUP BY bssid
ORDER BY COUNT(DISTINCT node_id) DESC, COUNT(*) DESC
LIMIT 300
)
GROUP BY b.bssid, b.node_id
ORDER BY b.bssid, b.node_id
ÚbssidrÚchannelÚ
encryptionÚnodesÚ best_rssiÚavg_rssiÚ
times_seencó&\VR,4#)r“)r:)Úxs&rÚ<lambda>Ú"build_cross_node.<locals>.<lambda> s ”c˜!˜G*”orT)ÚkeyÚreverseÚ
node_countÚnode_idsÚnetworks)rVÚsortedÚvaluesr:)Ú node_rowsrUrTrÚresultÚnets rÚbuild_cross_noder¥îs
ô ÐT€IÙ'0Ó1¡y !9—¡y€HÐ ðó €Dð,€HÛ
ˆØ'•
ˆØ Ô à˜eؘa ˜a  ˜a  ˜bð ˆH‰Oð
˜!˜K ˜!˜J ˜!˜L2
ˆ˜Õ   9¥Óô ØÓÙ ô€Fó
ˆÜ  G¥ ÓˆLÓñð
˜ *¨fÐ 5ùòc2sC có$V^8„dQhR\/#rA)rs"rrr)s÷nñnœñnrc
óä\PP4pV\P!^R7,
PRR7pV\P!^R7,
PRR7p\ RV34p.pVF6p\ VR,4wrgV'dK!WeR&VP
V4K8 \ RV34p.p VF0p\ VR,4wrgWeR&WuR&V P
V4K2 \ R V34p
\ R
4p .p V F0p\ VR,4wrgWeR&WuR&V P
V4K2 \ R 4p
R VR
V RV
RV RV
/#)é©ÚhoursÚseconds©ÚtimespecaÃ
SELECT src_mac,
COUNT(*) AS times_seen,
MAX(rssi) AS best_rssi,
ROUND(AVG(rssi), 1) AS avg_rssi,
MAX(received_at) AS last_seen,
COUNT(DISTINCT node_id) AS node_count
FROM probe_events
WHERE src_mac IS NOT NULL AND received_at > ?
GROUP BY src_mac
HAVING COUNT(*) > 1
ORDER BY last_seen DESC
rr1a™
SELECT src_mac,
MIN(received_at) AS first_seen,
MAX(rssi) AS best_rssi,
COUNT(*) AS times_seen,
COUNT(DISTINCT node_id) AS node_count
FROM probe_events
WHERE src_mac IS NOT NULL
GROUP BY src_mac
HAVING MIN(received_at) > ?
ORDER BY first_seen DESC
LIMIT 100
r>
SELECT bssid,
MAX(ssid) AS ssid,
MIN(received_at) AS first_seen,
MAX(rssi) AS best_rssi,
MAX(channel) AS channel,
MAX(encryption) AS encryption,
COUNT(DISTINCT node_id) AS node_count
FROM beacon_events
WHERE bssid IS NOT NULL
GROUP BY bssid
HAVING MIN(received_at) > ?
ORDER BY first_seen DESC
LIMIT 100
af
SELECT src_mac,
COUNT(DISTINCT date(received_at)) AS days_seen,
MIN(received_at) AS first_seen,
MAX(received_at) AS last_seen,
MAX(rssi) AS best_rssi,
COUNT(*) AS times_seen,
COUNT(DISTINCT node_id) AS node_count
FROM probe_events
WHERE src_mac IS NOT NULL
GROUP BY src_mac
HAVING COUNT(DISTINCT date(received_at)) >= 2
ORDER BY days_seen DESC, times_seen DESC
LIMIT 50
a×
SELECT bssid,
MAX(ssid) AS ssid,
COUNT(DISTINCT date(received_at)) AS days_seen,
MIN(received_at) AS first_seen,
MAX(received_at) AS last_seen,
MAX(rssi) AS best_rssi,
MAX(channel) AS channel,
MAX(encryption) AS encryption,
COUNT(DISTINCT node_id) AS node_count
FROM beacon_events
WHERE bssid IS NOT NULL
GROUP BY bssid
HAVING COUNT(DISTINCT date(received_at)) >= 2
ORDER BY days_seen DESC, best_rssi DESC
LIMIT 50
ÚpresentÚnew_macsÚ new_networksÚreg_macsÚ reg_networks)r^r`Ú timedeltaÚ isoformatrVr?r†)ÚnowÚ cutoff_1hÚ
cutoff_24hÚ present_rowsr®rUr1r>Ú new_mac_rowsr¯Ú reg_mac_rowsr±s rÚbuild_presencer»)sÜ×"×+€CØœ×Ô3×>È ÐR€IØœ×ÔÐS€Jôð ð ˆó €Lð€GÛ
ˆÜ¨)­ ӈ߉zØ ˆh‰KØ N‰N˜1Ö ñ ôð ð ˆó €Lð€HÛ
ˆÜ¨)­ ÓˆØ ˆ(‰ Ø$ˆ,‰Ø˜Öñ ô ðð ˆó€Lô"ðó €Lð€HÛ
ˆÜ¨)­ ÓˆØ ˆ(‰ Ø$ˆ,‰Ø˜Öñ ô ðó €Lð& ˜Ø˜Ø˜ ؘؘ ð  ðrcó$V^8„dQhR\/#rA)rs"rrršs÷HñH”dñHrcóP\PP4pV\P!^R7,
PRR7pV\P!^R7,
PRR7p\ R4p\ RV34pV'd´VUu.uF qUR,NK
ppRP R \
V4,4p\ R
V R 2\V44pVU u/uF q™R,V bK p
p VFDpV
PVR,/4p V PR 4VR &V PR
4VR
&KF \ RV34p \ R4p
V
'd•V
Uu.uF qîR,NK
ppRP R \
V4,4p\ RV R 2\V44pVU u/uFq™R,V R ,bK p
p V
FpV
PVR,4VR &K \ R4pVF"p\VR,4wppVVR&VVR&K$ \ R4pVF"p \V R,4wppVV R&VV R&K$ \ R4pRTRTRV 'd
V ^,M/RV
RVRVR V/#uupiuup iuupiuup i)!é)Úminutesr«zL
SELECT * FROM deauth_events
ORDER BY id DESC LIMIT 100

SELECT
bssid,
subtype,
COUNT(*) AS count,
COUNT(DISTINCT node_id) AS node_count,
COUNT(DISTINCT src) AS unique_srcs,
MIN(received_at) AS first_seen,
MAX(received_at) AS last_seen
FROM deauth_events
WHERE received_at > ?
GROUP BY bssid, subtype
HAVING COUNT(*) >= 10
ORDER BY count DESC
rr€rz{
SELECT bssid, MAX(ssid) AS ssid, MAX(encryption) AS encryption
FROM beacon_events WHERE bssid IN (z%)
GROUP BY bssid
rraˆ
SELECT
COUNT(*) AS total,
COUNT(DISTINCT bssid) AS unique_bssids,
COUNT(DISTINCT src) AS unique_srcs,
SUM(CASE WHEN subtype='deauth' THEN 1 ELSE 0 END) AS deauth_count,
SUM(CASE WHEN subtype='disassoc' THEN 1 ELSE 0 END) AS disassoc_count
FROM deauth_events
WHERE received_at > ?
a
SELECT
bssid,
COUNT(*) AS total_frames,
COUNT(DISTINCT src) AS unique_srcs,
COUNT(DISTINCT node_id) AS node_count,
MIN(received_at) AS first_seen,
MAX(received_at) AS last_seen
FROM deauth_events
GROUP BY bssid
ORDER BY total_frames DESC
LIMIT 10
z\
SELECT bssid, MAX(ssid) AS ssid
FROM beacon_events WHERE bssid IN (aŸ
SELECT
dst,
COUNT(*) AS total_frames,
COUNT(DISTINCT bssid) AS networks_used,
COUNT(DISTINCT node_id) AS node_count,
MIN(received_at) AS first_seen,
MAX(received_at) AS last_seen
FROM deauth_events
GROUP BY dst
ORDER BY total_frames DESC
LIMIT 10
Údstr1r>a‡
SELECT reason,
COUNT(*) AS total_frames,
COUNT(DISTINCT bssid) AS unique_bssids,
COUNT(DISTINCT dst) AS unique_targets,
MIN(received_at) AS first_seen,
MAX(received_at) AS last_seen
FROM deauth_events
GROUP BY reason
ORDER BY total_frames DESC
ÚreasonÚ descriptionÚclassificationa%
SELECT date(received_at) AS day,
CAST(strftime('%H', received_at) AS INTEGER) AS hour,
COUNT(*) AS frames
FROM deauth_events
GROUP BY day, hour
ORDER BY day, hour
ÚrecentÚburstsÚsummaryÚ top_targetsÚtop_targeted_devicesÚ reason_statsÚheatmap) r^r`r´rVr„r:rrr?r)Ú cutoff_5mr¶Ú
bssid_listrˆr‰rUÚssid_mapr¤ÚtrÈÚdr1r>Ú reason_rowsÚdescrÃÚ heatmap_rowss rÚ build_alertsrÔšÜ×,€CØœ×+°AÔAÈ9ÐU€IØœ×+°!ÔÐS€Iôðó €Fôðð ˆó€F÷"Ù*0Ó1©& Q˜—jj©&ˆ
Зx‘x ¤c¨*£oÕ 5Ó6ˆ Üð0à0<¨~ð> ð ô
ó  ˆ ñ
,5Ó5©9 ag•J ’M©9ˆÐˆAØ—,‘,˜q z¨2Ó.ˆCØ!Ÿg™g foˆAˆf‰IØ!Ÿg™g 3ˆAˆl‹Oñô ð ð ˆó €Gôð ó  €K÷Ù,7Ó8©K q˜
˜
©Kˆ
Зx‘x ¤c¨*£oÕ 5Ó6ˆ Üð"0à0<¨~ð> ð ô
ó  ˆ ñ
4=Ó=±9¨ag•J  &¥ Ò)±9ˆÐˆ Ÿ  Q w¥ZÓ0ˆAˆfô "ó  Ðó"ˆÜ¨%­Óˆ
Ø ˆˆ(‰ ؈,‹ñ ð
ó
 €KóˆÜ1°!°Hµ+Óˆˆ"ˆˆØ,ˆÐ
Óñô ðó €Lð  Ø Ø¯g ¨¦
¸2Ø  ØÐ 4Ø  Ø  ð ðùòC2ùò6ùòB9ùò>sÂJÃ0JÅ2JÇJ#có0V^8„dQhR\R\/#)r Úqr
r)rs"rrr%s÷WñW”CðWœDñWrcó(aV'd\V4^8d/#RV R2p/p\RW34pV'dW2R&\RV34pV'd\RV34p/pVF2pVPVR,.4PVR,4K4 VF;p\ VR,4wršW˜R&W¨R &VP VR,.4VR
&K= WBR &\R V34p V 'd*V Fp\ VR,4wršW˜R&W¨R &K! W²R
&\RV34p V 'd*V Fp\ VR,4wršW˜R&W¨R &K! WÂR&\RV34p
V
'dWÒR&VP
4o\P4UU u.uFwréSV P
49gKVNK up pR,pV'Ed;RPR\V4,4p\RV R2\V44pV'\RV R2\V44p/pVF2pVPVR,.4PVR,4K4 VF;p\ VR,4wršW˜R&W¨R &VP VR,.4VR
&K= VVR&\RV R2\V44pV'dVVR&RV9gRV9d,\V3Rl\P44V4VR&V#uup pi) r Ú%aä
SELECT bssid, MAX(ssid) AS ssid,
COUNT(*) AS times_seen,
MAX(rssi) AS best_rssi, ROUND(AVG(rssi),1) AS avg_rssi,
MAX(channel) AS channel, MAX(encryption) AS encryption,
COUNT(DISTINCT node_id) AS node_count,
MIN(received_at) AS first_seen, MAX(received_at) AS last_seen
FROM beacon_events
WHERE bssid LIKE ? OR ssid LIKE ?
GROUP BY bssid ORDER BY times_seen DESC LIMIT 20
Ú
2026-04-03 14:38:38 +03:00
as_networkag
SELECT src_mac,
COUNT(*) AS times_seen,
MAX(rssi) AS best_rssi, ROUND(AVG(rssi),1) AS avg_rssi,
COUNT(DISTINCT node_id) AS node_count,
MIN(received_at) AS first_seen, MAX(received_at) AS last_seen
FROM probe_events
WHERE src_mac LIKE ?
GROUP BY src_mac LIMIT 10
SELECT DISTINCT src_mac, ssid FROM probe_events
WHERE src_mac LIKE ? AND ssid IS NOT NULL AND ssid != ''
rrr1r>Ú as_clienta'
SELECT src_mac,
COUNT(*) AS times_seen,
MAX(rssi) AS best_rssi,
MIN(received_at) AS first_seen, MAX(received_at) AS last_seen
FROM probe_events
WHERE ssid LIKE ?
GROUP BY src_mac ORDER BY times_seen DESC LIMIT 20
Ú probing_foraN
SELECT dst,
COUNT(*) AS total_frames,
2026-04-05 13:06:25 +03:00
COUNT(DISTINCT bssid) AS networks_used,
2026-04-03 14:38:38 +03:00
COUNT(DISTINCT node_id) AS node_count,
2026-04-05 13:06:25 +03:00
MIN(received_at) AS first_seen, MAX(received_at) AS last_seen
2026-04-03 14:38:38 +03:00
FROM deauth_events
WHERE dst LIKE ?
GROUP BY dst LIMIT 10
Ú as_victimaS
SELECT bssid,
COUNT(*) AS total_frames,
COUNT(DISTINCT dst) AS unique_targets,
COUNT(DISTINCT node_id) AS node_count,
MIN(received_at) AS first_seen, MAX(received_at) AS last_seen
FROM deauth_events
WHERE bssid LIKE ?
GROUP BY bssid LIMIT 10
Úas_impersonated:Né<Nr€raf
SELECT src_mac,
COUNT(*) AS times_seen,
MAX(rssi) AS best_rssi, ROUND(AVG(rssi),1) AS avg_rssi,
COUNT(DISTINCT node_id) AS node_count,
2026-04-05 13:06:25 +03:00
MIN(received_at) AS first_seen, MAX(received_at) AS last_seen
FROM probe_events
WHERE substr(src_mac,1,8) IN (zI)
GROUP BY src_mac ORDER BY times_seen DESC LIMIT 30
zo
SELECT DISTINCT src_mac, ssid FROM probe_events
WHERE substr(src_mac,1,8) IN (zD)
AND ssid IS NOT NULL AND ssid != ''
Úvendor_clientsaÁ
SELECT bssid, MAX(ssid) AS ssid,
COUNT(*) AS times_seen,
MAX(rssi) AS best_rssi, ROUND(AVG(rssi),1) AS avg_rssi,
MAX(channel) AS channel, MAX(encryption) AS encryption,
COUNT(DISTINCT node_id) AS node_count,
MIN(received_at) AS first_seen, MAX(received_at) AS last_seen
FROM beacon_events
WHERE substr(bssid,1,8) IN (zG)
GROUP BY bssid ORDER BY times_seen DESC LIMIT 30
Úvendor_networksc3óZ<"TF wrSVP49gKVxK" R#5irR)Úlower)Ú.0Úq_lowers& €rÚ <genexpr>Úbuild_search.<locals>.<genexpr>¹s"øéÐG™tq°'¸Q¿W¹W»YÑ2F—ùsƒ+¡
+Ú vendor_name) r:rVr…r†r?rr<Úitemsr„rÚnext)ÚlikeÚresultsrÙr‰rrUr1r>r0Úmatching_prefixesÚphrßs& @rÚ build_searchrð%s‰ø€ß A“˜
؈ Ø
ˆqˆcˆ8€DØ€Gôð
ð ˆó
€J÷Ø * Ñôð ð ˆó €I÷Üð ðˆWóˆ ð ˆ ÛˆAØ × # A i¥L°"Ó 5× <¸Q¸v½YÖ ãˆAÜ!+¨A¨i­LÓ!9Ñ ˆFØ &ˆh‰KØ *ˆl‰OØ ,× 0Ñ 0°°9µ¸rÓ BˆAˆnÓ ñ ð
) Ñôðð ˆó€K÷ÛˆAÜ!+¨A¨i­LÓ!9Ñ ˆFØ$ˆh‰KØ(ˆlð"-
Ñôð ð ˆó €I÷ÛˆAÜ!+¨A¨e­HÓ!5Ñ ˆFØ$ˆh‰KØ(ˆl‹Oñð ) Ñôð ð ˆó €O÷Ø%4Ðg‰gi€Gä%,§]¡]¤_ôÙ%4> f—ll“nÑ  ˆ¡_òð
õ Ð÷
ÐØ
X‰XcœCÐ 1Ó
äð$+ð,.¨$ð/ ð ôÐ
 'ˆ÷ Üð#/à/1¨dð3
ðôÐ+ˆIð
"$ˆØ×¨)­ °bÓ9×À6ÅÖã#Ü%/°°)µ Ó%=Ñ"Ø$*( Ø$.,Ø$0×$4Ñ$4°Q°yµ\À2Ó$F
)7ˆ ð%)ð*,¨ð- ð
! ôÐ

'ˆ÷ Ø)8ˆ ˜ &Ð*;¸wÔ*FÜ%)ÜGœwŸ}™}œÓó&ˆG  €Nùóks ÆLÆ8Lcó>V^8„dQhR\R\R,/#)r rhr
Nr)rs"rrr¿s÷$ñ$œsð$¤t¨d¥{ñ$rcó\RV34pV'gR#V^,p\RV34pV'd
V^,M/pVPR4VR&VPR4VR&VPR4VR&VPR4VR&VR,'d\VR,^R7VR&M\VR ,^<R7VR&VR
,'d\VR
,^4MRVR
&\ \
VR 7VR &V#)

SELECT
node_id,
MIN(received_at) AS first_seen,
MAX(received_at) AS last_seen,
COUNT(*) AS total_events,
COUNT(DISTINCT ssid) AS unique_ssids,
COUNT(DISTINCT bssid) AS unique_bssids,
AVG(rssi) AS avg_rssi,
MIN(rssi) AS min_rssi,
MAX(rssi) AS max_rssi
FROM beacon_events
WHERE node_id = ?
GROUP BY node_id
2026-04-03 14:38:38 +03:00
Nz¬
SELECT received_at AS last_heartbeat, uptime_ms, free_heap, wifi_rssi
FROM heartbeat_events
2026-04-05 13:06:25 +03:00
WHERE node_id = ?
2026-04-03 14:38:38 +03:00
ORDER BY id DESC LIMIT 1
rirjrkrlrnrorXr•rxÚevents)rVrrdÚroundryÚ EVENT_CAP)rhrTÚdetailrprrs& rÚbuild_node_detailr÷¿sÜ ðð ˆó €D÷ ÙØ
!W€FÜðð
ˆó €G÷ ˆŽ B€BØ!Ÿv™vÐ&6Ó7€FÐ ÑØ!Ÿv™v kÓ2€Fˆ;ÑØ!Ÿv™v 2€Fˆ;ÑØ!Ÿv™v 2€Fˆ;ÑØ
Ð×ÔÜÐ/?Õ(@ÈBÔOˆˆä¨{Õ(;ÀrÔJˆˆØ9?À
×9KÔ9Kœ˜v 1°1Ô5ÐQU€Fˆ:ÑÜ%¬I¸wÔG€Fˆ8ÑØ €MrcóP\4;_uu_4pVPR4VPR4VPR4VPR4VPR4VPR4VP4RRR4R# +'giR#;i)z8Create tables if they don't exist. Runs once at startup.aF
CREATE TABLE IF NOT EXISTS beacon_events (
2026-04-05 13:06:25 +03:00
id INTEGER PRIMARY KEY AUTOINCREMENT, received_at TEXT NOT NULL,
node_id TEXT, node_ts INTEGER, ssid TEXT, bssid TEXT,
rssi INTEGER, channel INTEGER, encryption TEXT, importance TEXT, confidence TEXT
)
a
CREATE TABLE IF NOT EXISTS probe_events (
id INTEGER PRIMARY KEY AUTOINCREMENT, received_at TEXT NOT NULL,
node_id TEXT, node_ts INTEGER, src_mac TEXT, ssid TEXT,
rssi INTEGER, importance TEXT
)
a
CREATE TABLE IF NOT EXISTS heartbeat_events (