You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

94 regels
3.0 KiB

  1. import streamlit as st
  2. import pandas as pd
  3. import os
  4. import time
  5. from datetime import datetime
  6. import requests
  7. import paho.mqtt.client as mqtt
  8. import psutil # AGGIUNTO per monitoraggio processi
  9. def is_main_running():
  10. """Verifica se il processo main.py è attualmente in esecuzione."""
  11. for proc in psutil.process_iter(['cmdline']):
  12. try:
  13. cmd = proc.info['cmdline']
  14. if cmd and 'app.main' in ' '.join(cmd):
  15. return True
  16. except (psutil.NoSuchProcess, psutil.AccessDenied):
  17. continue
  18. return False
  19. def check_mqtt_broker(host, port, protocol_str="mqttv311"):
  20. try:
  21. # Mappatura protocollo per compatibilità paho-mqtt
  22. proto = mqtt.MQTTv311
  23. if protocol_str == "mqttv5":
  24. proto = mqtt.MQTTv5
  25. client = mqtt.Client(protocol=proto)
  26. # Aumentiamo il timeout a 5 secondi per maggiore stabilità
  27. client.connect(host, port, keepalive=5)
  28. client.disconnect()
  29. return True
  30. except Exception as e:
  31. # Utile per il debug interno se necessario
  32. return False
  33. def check_api_server(token_url, verify_tls):
  34. try:
  35. response = requests.get(token_url, timeout=2, verify=verify_tls)
  36. return True
  37. except:
  38. return False
  39. def show_system_status(cfg, secrets):
  40. st.subheader("🖥️ Stato Infrastruttura")
  41. col1, col2, col3, col4 = st.columns(4)
  42. # 1. CORE ENGINE
  43. main_active = is_main_running()
  44. col1.metric("Core Engine", "ON" if main_active else "OFF",
  45. delta=None, delta_color="normal")
  46. if main_active: col1.success("✅ Main Attivo")
  47. else: col1.error("❌ Main Fermo")
  48. # 2. MQTT BROKER
  49. mqtt_cfg = cfg.get('mqtt', {})
  50. mqtt_ok = check_mqtt_broker(
  51. mqtt_cfg.get('host', 'localhost'),
  52. mqtt_cfg.get('port', 1883),
  53. mqtt_cfg.get('protocol', 'mqttv311')
  54. )
  55. col2.metric("MQTT Broker", "Online" if mqtt_ok else "Offline")
  56. if mqtt_ok: col2.success("✅ Broker OK")
  57. else: col2.error("❌ Errore MQTT")
  58. # 3. API SERVER
  59. api_cfg = cfg.get('api', {})
  60. api_ok = check_api_server(api_cfg.get('token_url', ''), api_cfg.get('verify_tls', False))
  61. col3.metric("API System", "Ready" if api_ok else "Error")
  62. if api_ok: col3.success("✅ API OK")
  63. else: col3.error("❌ API Down")
  64. # 4. DISCO (Data Dir)
  65. try:
  66. usage = psutil.disk_usage('/data')
  67. col4.metric("Spazio Disco", f"{usage.percent}%")
  68. if usage.percent < 90: col4.success(f"✅ {usage.free // (1024**3)} GB Liberi")
  69. else: col4.warning("⚠️ Disco quasi pieno")
  70. except:
  71. col4.write("N/D")
  72. # LOG RECENTI (Ripristinati dal tuo originale)
  73. st.divider()
  74. st.subheader("📝 Ultimi Eventi Log")
  75. LOG_FILE = "/tmp/main_process.log"
  76. if os.path.exists(LOG_FILE):
  77. with open(LOG_FILE, "r") as f:
  78. lines = f.readlines()
  79. st.text_area("Log in tempo reale:", "".join(lines[-20:]), height=300)
  80. else:
  81. st.info("Nessun file di log trovato in /tmp/main_process.log")