diff --git a/app.py b/app.py index f2f51b2..6116f53 100644 --- a/app.py +++ b/app.py @@ -47,6 +47,10 @@ def init_db(): c.execute("ALTER TABLE radio_logs ADD COLUMN protocol TEXT DEFAULT 'DMR'") except: pass + try: + c.execute("ALTER TABLE radio_logs ADD COLUMN source_ext TEXT DEFAULT ''") + except: pass + c.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE, password_hash TEXT, role TEXT, allowed_nodes TEXT)''') @@ -122,8 +126,8 @@ def save_cache(data): def save_to_sqlite(client_id, data, protocol="DMR"): conn = sqlite3.connect(DB_PATH) c = conn.cursor() - c.execute("INSERT INTO radio_logs (timestamp, client_id, protocol, source_id, target, slot, duration, ber) VALUES (datetime('now', 'localtime'), ?, ?, ?, ?, ?, ?, ?)", - (client_id, protocol, str(data.get('source_id', '---')), str(data.get('destination_id', '---')), data.get('slot', 0), round(data.get('duration', 0), 1), round(data.get('ber', 0), 2))) + c.execute("INSERT INTO radio_logs (timestamp, client_id, protocol, source_id, target, slot, duration, ber, source_ext) VALUES (datetime('now', 'localtime'), ?, ?, ?, ?, ?, ?, ?, ?)", + (client_id, protocol, str(data.get('source_id', '---')), str(data.get('destination_id', '---')), data.get('slot', 0), round(data.get('duration', 0), 1), round(data.get('ber', 0), 2), str(data.get('source_ext', '')))) conn.commit() conn.close() socketio.emit('dati_aggiornati') @@ -345,13 +349,13 @@ def on_message(client, userdata, msg): else: target = current_target - active_calls[cid][k] = {'src': src, 'dst': target} + active_calls[cid][k] = {'src': src, 'dst': target, 'ext': str(p.get('source_ext', ''))} client_telemetry[cid].update({"ts1":"","ts2":"","alt": f"{ico} {name}: {src} ➔ {target}"}) socketio.emit('dati_aggiornati') # <--- WEBSOCKET elif act in ['end', 'lost']: - info = active_calls[cid].get(k, {'src': '---', 'dst': '---'}) - p.update({'source_id': info['src'], 'destination_id': info['dst']}) + info = active_calls[cid].get(k, {'src': '---', 'dst': '---', 'ext': ''}) + p.update({'source_id': info['src'], 'destination_id': info['dst'], 'source_ext': info['ext']}) save_to_sqlite(cid, p, protocol=name) client_telemetry[cid]["alt"] = f"{'✅' if act=='end' else '⚠️'} {name}: {info['src']}" save_cache(client_telemetry) @@ -381,7 +385,7 @@ def get_clients(): def get_logs(): conn = sqlite3.connect(DB_PATH, timeout=10) c = conn.cursor() - c.execute("SELECT timestamp, client_id, protocol, source_id, target, slot, duration, ber FROM radio_logs ORDER BY id DESC LIMIT 60") + c.execute("SELECT timestamp, client_id, protocol, source_id, target, slot, duration, ber, source_ext FROM radio_logs ORDER BY id DESC LIMIT 60") logs = c.fetchall() conn.close() return jsonify(logs) diff --git a/templates/index.html b/templates/index.html index 15a5007..b4d4913 100644 --- a/templates/index.html +++ b/templates/index.html @@ -795,7 +795,19 @@ const res = await fetch('/api/logs'); const logs = await res.json(); const tbody = document.getElementById('log-body'); let tableHTML = ""; let networkLogs = {}; logs.forEach(row => { - const time = row[0] ? row[0].split(' ')[1] : "--:--"; const clientId = row[1]; const protocol = row[2] || "DMR"; const source = row[3] || "---"; const target = row[4] || "---"; const rawSlot = row[5]; + const time = row[0] ? row[0].split(' ')[1] : "--:--"; + const clientId = row[1]; + const protocol = row[2] || "DMR"; + let source = row[3] || "---"; + const target = row[4] || "---"; + const rawSlot = row[5]; + const source_ext = row[8]; // <--- NUOVO CAMPO DAL BACKEND + + // Formattiamo il source_ext se presente e non vuoto + if (source_ext && source_ext.trim() !== "") { + source = `${source} /${source_ext}`; + } + const slotDisplay = protocol === "DMR" ? `TS${rawSlot}` : "--"; let protoColor = "#3b82f6"; if (protocol === "NXDN") protoColor = "#10b981"; else if (protocol === "YSF") protoColor = "#8b5cf6"; else if (protocol === "D-STAR") protoColor = "#06b6d4"; else if (protocol === "P25") protoColor = "#f59e0b"; @@ -810,7 +822,6 @@ clients.forEach(c => { const localDiv = document.getElementById(`sys-log-${c.id}`); if (localDiv && networkLogs[c.id]) { localDiv.innerHTML = networkLogs[c.id]; } }); } catch (e) { console.error(e); } } - // --- USER MANAGEMENT (ADD & EDIT) --- async function openAdmin() { document.getElementById('admin-modal').style.display = 'flex'; loadUsers(); loadSettings(); cancelEdit(); } function closeAdmin() { document.getElementById('admin-modal').style.display = 'none'; cancelEdit(); }