import { useQuery, useMutation } from "@tanstack/react-query"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Activity, Brain, Database, FileText, Terminal, RefreshCw, AlertCircle, Play, Square, RotateCw } from "lucide-react"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { useToast } from "@/hooks/use-toast"; import { queryClient, apiRequest } from "@/lib/queryClient"; interface ServiceStatus { name: string; status: "running" | "idle" | "offline" | "error" | "unknown"; healthy: boolean; details: any; } interface ServicesStatusResponse { services: { mlBackend: ServiceStatus; database: ServiceStatus; syslogParser: ServiceStatus; analyticsAggregator: ServiceStatus; }; } export default function ServicesPage() { const { toast } = useToast(); const { data: servicesStatus, isLoading, refetch } = useQuery({ queryKey: ["/api/services/status"], refetchInterval: 5000, // Refresh every 5s }); // Mutation for service control const serviceControlMutation = useMutation({ mutationFn: async ({ service, action }: { service: string; action: string }) => { return apiRequest("POST", `/api/services/${service}/${action}`); }, onSuccess: (data, variables) => { toast({ title: "Operazione completata", description: `Servizio ${variables.service}: ${variables.action} eseguito con successo`, }); // Refresh status after 2 seconds setTimeout(() => { queryClient.invalidateQueries({ queryKey: ["/api/services/status"] }); }, 2000); }, onError: (error: any, variables) => { toast({ title: "Errore operazione", description: error.message || `Impossibile eseguire ${variables.action} su ${variables.service}`, variant: "destructive", }); }, }); const handleServiceAction = (service: string, action: string) => { serviceControlMutation.mutate({ service, action }); }; const getStatusBadge = (service: ServiceStatus) => { if (service.healthy) { return Online; } if (service.status === 'idle') { return In Attesa; } if (service.status === 'offline') { return Offline; } if (service.status === 'error') { return Errore; } return Sconosciuto; }; const getStatusIndicator = (service: ServiceStatus) => { if (service.healthy) { return
; } if (service.status === 'idle') { return
; } return
; }; return (

Gestione Servizi

Monitoraggio e controllo dei servizi IDS

Gestione Servizi Systemd I servizi IDS sono gestiti da systemd sul server AlmaLinux. Usa i pulsanti qui sotto per controllarli oppure esegui i comandi systemctl direttamente sul server. {/* Services Grid */}
{/* ML Backend Service */} ML Backend Python {servicesStatus && getStatusIndicator(servicesStatus.services.mlBackend)}
Stato: {servicesStatus && getStatusBadge(servicesStatus.services.mlBackend)}
{servicesStatus?.services.mlBackend.details?.modelLoaded !== undefined && (
Modello ML: {servicesStatus.services.mlBackend.details.modelLoaded ? "Caricato" : "Non Caricato"}
)} {/* Service Controls */}

Controlli Servizio:

{/* Manual Commands (fallback) */}

Comando systemctl (sul server):

sudo systemctl {servicesStatus?.services.mlBackend.status === 'offline' ? 'start' : 'restart'} ids-ml-backend

Log:

tail -f /var/log/ids/backend.log
{/* Database Service */} PostgreSQL Database {servicesStatus && getStatusIndicator(servicesStatus.services.database)}
Stato: {servicesStatus && getStatusBadge(servicesStatus.services.database)}
{servicesStatus?.services.database.status === 'running' && (
Connessione: Connesso
)}

Verifica status:

systemctl status postgresql-16
{servicesStatus?.services.database.status === 'error' && (

Riavvia database:

sudo systemctl restart postgresql-16
)}

Log:

sudo journalctl -u postgresql-16 -f
{/* Syslog Parser Service */} Syslog Parser {servicesStatus && getStatusIndicator(servicesStatus.services.syslogParser)}
Stato: {servicesStatus && getStatusBadge(servicesStatus.services.syslogParser)}
{servicesStatus?.services.syslogParser.details?.pid && (
PID Processo: {servicesStatus.services.syslogParser.details.pid}
)} {servicesStatus?.services.syslogParser.details?.systemd_unit && (
Systemd Unit: {servicesStatus.services.syslogParser.details.systemd_unit}
)} {/* Service Controls */}

Controlli Servizio:

{/* Manual Commands (fallback) */}

Comando systemctl (sul server):

sudo systemctl {servicesStatus?.services.syslogParser.status === 'offline' ? 'start' : 'restart'} ids-syslog-parser

Log:

tail -f /var/log/ids/syslog_parser.log
{/* Analytics Aggregator Service */} Analytics Aggregator {servicesStatus && getStatusIndicator(servicesStatus.services.analyticsAggregator)}
Stato: {servicesStatus && getStatusBadge(servicesStatus.services.analyticsAggregator)}
{servicesStatus?.services.analyticsAggregator.details?.lastRun && (
Ultima Aggregazione: {new Date(servicesStatus.services.analyticsAggregator.details.lastRun).toLocaleString('it-IT')}
)} {servicesStatus?.services.analyticsAggregator.details?.hoursSinceLastRun && (
Ore dall'ultimo run: {servicesStatus.services.analyticsAggregator.details.hoursSinceLastRun}h
)} {/* CRITICAL ALERT: Aggregator idle for too long */} {servicesStatus?.services.analyticsAggregator.details?.hoursSinceLastRun && parseFloat(servicesStatus.services.analyticsAggregator.details.hoursSinceLastRun) > 2 && ( ⚠️ Timer Systemd Non Attivo

L'aggregatore non esegue da {servicesStatus.services.analyticsAggregator.details.hoursSinceLastRun}h! Dashboard e Analytics bloccati.

Soluzione Immediata (sul server):

sudo /opt/ids/deployment/setup_analytics_timer.sh
)}

Verifica timer:

systemctl status ids-analytics-aggregator.timer

Avvia aggregazione manualmente:

cd /opt/ids && ./deployment/run_analytics.sh

Log:

journalctl -u ids-analytics-aggregator.timer -f
{/* Additional Commands */} Comandi Utili

Verifica tutti i processi IDS attivi:

ps aux | grep -E "python.*(main|syslog_parser)" | grep -v grep

Verifica log RSyslog (ricezione log MikroTik):

tail -f /var/log/mikrotik/raw.log

Esegui training manuale ML:

curl -X POST http://localhost:8000/train -H "Content-Type: application/json" -d '{"max_records": 10000, "hours_back": 24}'

Verifica storico training nel database:

psql $DATABASE_URL -c "SELECT * FROM training_history ORDER BY trained_at DESC LIMIT 5;"
); }