Add net view.

This commit is contained in:
Jason Michalski
2024-07-26 21:32:18 -07:00
parent d01d442eb7
commit e3969e12d6
6 changed files with 90 additions and 4 deletions
+5 -1
View File
@@ -153,7 +153,7 @@ async def get_fuzzy_nodes(query):
return result.scalars()
async def get_packets(node_id=None, portnum=None, since=None, limit=500):
async def get_packets(node_id=None, portnum=None, since=None, limit=500, before=None, after=None):
async with database.async_session() as session:
q = select(Packet)
@@ -165,6 +165,10 @@ async def get_packets(node_id=None, portnum=None, since=None, limit=500):
q = q.where(Packet.portnum == portnum)
if since:
q = q.where(Packet.import_time > (datetime.datetime.utcnow() - since))
if before:
q = q.where(Packet.import_time < before)
if after:
q = q.where(Packet.import_time > after)
if limit is not None:
q = q.limit(limit)
+32
View File
@@ -0,0 +1,32 @@
{% extends "base.html" %}
{% block head %}
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
{% endblock %}
{% block css %}
#packet_details{
height: 95vh;
overflow: scroll;
}
{% endblock %}
{% block body %}
<div
id="net"
class="container text-center"
hx-ext="sse"
sse-connect="/events?portnum=1"
>
<div class="row">
<div class="col-6" id="packet_list" sse-swap="net_packet" hx-swap="afterbegin">
{% for packet in net_packets %}
{% include 'net_packet.html' %}
{% endfor %}
</div>
<div class="col-6 sticky-top" id="packet_details">
</div>
</div>
</div>
{% endblock body %}
+12
View File
@@ -0,0 +1,12 @@
<div class="card mt-2">
<div class="card-header">
<span class="fw-bold">{{packet.from_node.long_name}}</span>
<a href="/packet_details/{{packet.id}}" hx-trigger="click" hx-target="#packet_details" hx-get="/packet_details/{{packet.id}}" hx-swap="innerHTML scroll:top">🔎</a>
</div>
<div class="card-text text-start">
<dl>
<div>{{packet.import_time | format_timestamp}}</div>
<div>{{packet.payload}}</div>
</dl>
</div>
</div>
+2 -1
View File
@@ -28,7 +28,8 @@
</div>
<div class="card-body">
<div class="card-title">
<a hx-boost="false" href="#" hx-target="#packet_details" hx-get="/packet_details/{{packet.id}}" hx-swap="innerHTML scroll:top">{{packet.id}}</a>
{{packet.id}}
<a href="/packet_details/{{packet.id}}" hx-target="#packet_details" hx-get="/packet_details/{{packet.id}}" hx-swap="innerHTML scroll:top">🔎</a>
<a href="/packet/{{packet.id}}">🔗</a>
</div>
<div class="card-text text-start">
+2
View File
@@ -1,3 +1,5 @@
<div id="map"/>
{% for seen in packets_seen %}
<div class="card mt-2">
<div class="card-header">
+37 -2
View File
@@ -1,6 +1,5 @@
import asyncio
import io
from collections import Counter
from dataclasses import dataclass
import datetime
@@ -342,6 +341,7 @@ async def events(request):
portnum = int(portnum)
packet_template = env.get_template("packet.html")
net_packet_template = env.get_template("net_packet.html")
with notify.subscribe(node_id) as event:
async with sse_response(request) as resp:
while resp.is_connected():
@@ -364,14 +364,21 @@ async def events(request):
event.clear()
try:
for packet in packets:
ui_packet = Packet.from_model(packet)
await resp.send(
packet_template.render(
is_hx_request="HX-Request" in request.headers,
node_id=node_id,
packet=Packet.from_model(packet),
packet=ui_packet,
),
event="packet",
)
if ui_packet.portnum == PortNum.TEXT_MESSAGE_APP and '#baymeshnet' in ui_packet.payload.lower():
await resp.send(
net_packet_template.render(packet=ui_packet),
event="net_packet",
)
for packet in uplinked:
await resp.send(
packet_template.render(
@@ -845,6 +852,34 @@ async def graph_network(request):
)
@routes.get("/net")
async def graph_net(request):
if "date" in request.query:
start_date = datetime.date.fromisoformat(request.query["date"])
else:
start_date = datetime.date.today()
while start_date.weekday() != 2:
start_date = start_date - datetime.timedelta(days=1)
start_time = datetime.datetime.combine(start_date, datetime.time(0,0))
text_packets = [
Packet.from_model(p)
for p in await store.get_packets(
portnum=PortNum.TEXT_MESSAGE_APP,
after=start_time,
before=start_time + datetime.timedelta(hours=1),
)
]
net_packets = [p for p in text_packets if '#baymeshnet' in p.payload.lower()]
template = env.get_template("net.html")
return web.Response(
text=template.render(net_packets=net_packets),
content_type="text/html",
)
async def run_server(bind, port, tls_cert):
app = web.Application()
app.add_routes(routes)