|
- import streamlit as st
- import pandas as pd
- import os
- import time
- from datetime import datetime
- import requests
- import paho.mqtt.client as mqtt
- import psutil # AGGIUNTO per monitoraggio processi
-
- def is_main_running():
- """Verifica se il processo main.py è attualmente in esecuzione."""
- for proc in psutil.process_iter(['cmdline']):
- try:
- cmd = proc.info['cmdline']
- if cmd and 'app.main' in ' '.join(cmd):
- return True
- except (psutil.NoSuchProcess, psutil.AccessDenied):
- continue
- return False
-
-
- def check_mqtt_broker(host, port, protocol_str="mqttv311"):
- try:
- # Mappatura protocollo per compatibilità paho-mqtt
- proto = mqtt.MQTTv311
- if protocol_str == "mqttv5":
- proto = mqtt.MQTTv5
-
- client = mqtt.Client(protocol=proto)
- # Aumentiamo il timeout a 5 secondi per maggiore stabilità
- client.connect(host, port, keepalive=5)
- client.disconnect()
- return True
- except Exception as e:
- # Utile per il debug interno se necessario
- return False
-
- def check_api_server(token_url, verify_tls):
- try:
- response = requests.get(token_url, timeout=2, verify=verify_tls)
- return True
- except:
- return False
-
- def show_system_status(cfg, secrets):
- st.subheader("🖥️ Stato Infrastruttura")
-
- col1, col2, col3, col4 = st.columns(4)
-
- # 1. CORE ENGINE
- main_active = is_main_running()
- col1.metric("Core Engine", "ON" if main_active else "OFF",
- delta=None, delta_color="normal")
- if main_active: col1.success("✅ Main Attivo")
- else: col1.error("❌ Main Fermo")
-
- # 2. MQTT BROKER
- mqtt_cfg = cfg.get('mqtt', {})
- mqtt_ok = check_mqtt_broker(
- mqtt_cfg.get('host', 'localhost'),
- mqtt_cfg.get('port', 1883),
- mqtt_cfg.get('protocol', 'mqttv311')
- )
- col2.metric("MQTT Broker", "Online" if mqtt_ok else "Offline")
- if mqtt_ok: col2.success("✅ Broker OK")
- else: col2.error("❌ Errore MQTT")
-
- # 3. API SERVER
- api_cfg = cfg.get('api', {})
- api_ok = check_api_server(api_cfg.get('token_url', ''), api_cfg.get('verify_tls', False))
- col3.metric("API System", "Ready" if api_ok else "Error")
- if api_ok: col3.success("✅ API OK")
- else: col3.error("❌ API Down")
-
- # 4. DISCO (Data Dir)
- try:
- usage = psutil.disk_usage('/data')
- col4.metric("Spazio Disco", f"{usage.percent}%")
- if usage.percent < 90: col4.success(f"✅ {usage.free // (1024**3)} GB Liberi")
- else: col4.warning("⚠️ Disco quasi pieno")
- except:
- col4.write("N/D")
-
- # LOG RECENTI (Ripristinati dal tuo originale)
- st.divider()
- st.subheader("📝 Ultimi Eventi Log")
- LOG_FILE = "/tmp/main_process.log"
- if os.path.exists(LOG_FILE):
- with open(LOG_FILE, "r") as f:
- lines = f.readlines()
- st.text_area("Log in tempo reale:", "".join(lines[-20:]), height=300)
- else:
- st.info("Nessun file di log trovato in /tmp/main_process.log")
|