Improve training history logging and file management
Enhance error handling in Python ML backend for training and update script location. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 7a657272-55ba-4a79-9a2e-f1ed9bc7a528 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: b7099249-7827-46da-bdf9-2ff1d9c07b6c Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/449cf7c4-c97a-45ae-8234-e5c5b8d6a84f/7a657272-55ba-4a79-9a2e-f1ed9bc7a528/VDRknFA
This commit is contained in:
parent
83f3d4cf8e
commit
c31e1ca838
@ -129,7 +129,10 @@ async def train_model(request: TrainRequest, background_tasks: BackgroundTasks):
|
|||||||
Esegue in background per non bloccare l'API
|
Esegue in background per non bloccare l'API
|
||||||
"""
|
"""
|
||||||
def do_training():
|
def do_training():
|
||||||
|
conn = None
|
||||||
|
cursor = None
|
||||||
try:
|
try:
|
||||||
|
print("[TRAIN] Inizio training...")
|
||||||
conn = get_db_connection()
|
conn = get_db_connection()
|
||||||
cursor = conn.cursor(cursor_factory=RealDictCursor)
|
cursor = conn.cursor(cursor_factory=RealDictCursor)
|
||||||
|
|
||||||
@ -148,13 +151,18 @@ async def train_model(request: TrainRequest, background_tasks: BackgroundTasks):
|
|||||||
print("[TRAIN] Nessun log trovato per training")
|
print("[TRAIN] Nessun log trovato per training")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
print(f"[TRAIN] Trovati {len(logs)} log per training")
|
||||||
|
|
||||||
# Converti in DataFrame
|
# Converti in DataFrame
|
||||||
df = pd.DataFrame(logs)
|
df = pd.DataFrame(logs)
|
||||||
|
|
||||||
# Training
|
# Training
|
||||||
|
print("[TRAIN] Addestramento modello...")
|
||||||
result = ml_analyzer.train(df, contamination=request.contamination)
|
result = ml_analyzer.train(df, contamination=request.contamination)
|
||||||
|
print(f"[TRAIN] Modello addestrato: {result}")
|
||||||
|
|
||||||
# Salva nel database
|
# Salva nel database
|
||||||
|
print("[TRAIN] Salvataggio training history nel database...")
|
||||||
cursor.execute("""
|
cursor.execute("""
|
||||||
INSERT INTO training_history
|
INSERT INTO training_history
|
||||||
(model_version, records_processed, features_count, training_duration, status, notes)
|
(model_version, records_processed, features_count, training_duration, status, notes)
|
||||||
@ -168,6 +176,7 @@ async def train_model(request: TrainRequest, background_tasks: BackgroundTasks):
|
|||||||
f"Anomalie: {result['anomalies_detected']}/{result['unique_ips']}"
|
f"Anomalie: {result['anomalies_detected']}/{result['unique_ips']}"
|
||||||
))
|
))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
print("[TRAIN] ✅ Training history salvato con successo!")
|
||||||
|
|
||||||
cursor.close()
|
cursor.close()
|
||||||
conn.close()
|
conn.close()
|
||||||
@ -175,7 +184,16 @@ async def train_model(request: TrainRequest, background_tasks: BackgroundTasks):
|
|||||||
print(f"[TRAIN] Completato: {result}")
|
print(f"[TRAIN] Completato: {result}")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[TRAIN ERROR] {e}")
|
print(f"[TRAIN ERROR] ❌ Errore durante training: {e}")
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
if conn:
|
||||||
|
conn.rollback()
|
||||||
|
finally:
|
||||||
|
if cursor:
|
||||||
|
cursor.close()
|
||||||
|
if conn:
|
||||||
|
conn.close()
|
||||||
|
|
||||||
# Esegui in background
|
# Esegui in background
|
||||||
background_tasks.add_task(do_training)
|
background_tasks.add_task(do_training)
|
||||||
|
|||||||
10
replit.md
10
replit.md
@ -150,6 +150,16 @@ The IDS features a React-based frontend for real-time monitoring, detection visu
|
|||||||
|
|
||||||
## Fix Recenti (Novembre 2025)
|
## Fix Recenti (Novembre 2025)
|
||||||
|
|
||||||
|
### 🔧 Fix Training History + Logging Migliorato (22 Nov 2025 - 11:30)
|
||||||
|
- **Problema**: Storico training sempre vuoto anche dopo training completato
|
||||||
|
- **Causa**: INSERT in `training_history` falliva silenziosamente (errore solo in console)
|
||||||
|
- **Soluzione**: Error handling migliorato con logging dettagliato e traceback
|
||||||
|
- **Fix Applicati**:
|
||||||
|
- ✅ `python_ml/main.py`: Logging step-by-step training + traceback errori
|
||||||
|
- ✅ `finally` block per chiusura connessioni sicura
|
||||||
|
- ✅ `rollback` automatico in caso di errore
|
||||||
|
- **Testing**: Monitorare `/var/log/ids/ml_backend.log` durante training per vedere errori esatti
|
||||||
|
|
||||||
### 🐛 Fix Monitoring Syslog Parser + Schema Database (22 Nov 2025 - 11:10)
|
### 🐛 Fix Monitoring Syslog Parser + Schema Database (22 Nov 2025 - 11:10)
|
||||||
- **Problema 1**: Dashboard mostrava Syslog Parser in errore nonostante systemd "active (running)"
|
- **Problema 1**: Dashboard mostrava Syslog Parser in errore nonostante systemd "active (running)"
|
||||||
- **Causa**: Bug fetch `signal: controller2.abort` invece di `signal: controller2.signal` in `/api/services/status`
|
- **Causa**: Bug fetch `signal: controller2.abort` invece di `signal: controller2.signal` in `/api/services/status`
|
||||||
|
|||||||
@ -1,211 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# IDS - Aggiornamento Sistema da git.alfacom.it
|
|
||||||
# =============================================================================
|
|
||||||
# Eseguire come ROOT: ./update_from_git.sh [--db]
|
|
||||||
# Lo script esegue i comandi git come utente 'ids' automaticamente
|
|
||||||
#
|
|
||||||
# Opzioni:
|
|
||||||
# --db Sincronizza anche schema database da database-schema/schema.sql
|
|
||||||
# =============================================================================
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Colori per output
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m'
|
|
||||||
|
|
||||||
# Opzioni
|
|
||||||
UPDATE_DB=false
|
|
||||||
if [ "$1" == "--db" ]; then
|
|
||||||
UPDATE_DB=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "${BLUE}"
|
|
||||||
echo "╔═══════════════════════════════════════════════╗"
|
|
||||||
echo "║ 🔄 AGGIORNAMENTO SISTEMA IDS DA GIT ║"
|
|
||||||
echo "╚═══════════════════════════════════════════════╝"
|
|
||||||
echo -e "${NC}"
|
|
||||||
|
|
||||||
IDS_DIR="/opt/ids"
|
|
||||||
IDS_USER="ids"
|
|
||||||
|
|
||||||
# Verifica di essere root
|
|
||||||
if [ "$EUID" -ne 0 ]; then
|
|
||||||
echo -e "${RED}❌ Questo script deve essere eseguito come root${NC}"
|
|
||||||
echo -e "${YELLOW} Esegui: sudo ./update_from_git.sh [--db]${NC}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd "$IDS_DIR" || exit 1
|
|
||||||
|
|
||||||
# Fix git ownership se necessario
|
|
||||||
echo -e "${BLUE}🔧 Verifica configurazione git...${NC}"
|
|
||||||
if ! sudo -u $IDS_USER git config --global --get-all safe.directory | grep -q "^/opt/ids$"; then
|
|
||||||
echo -e "${YELLOW} Configuro safe directory...${NC}"
|
|
||||||
sudo -u $IDS_USER git config --global --add safe.directory /opt/ids
|
|
||||||
echo -e "${GREEN} ✅ Configurato${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Backup configurazione locale
|
|
||||||
echo -e "\n${BLUE}💾 Backup configurazione locale...${NC}"
|
|
||||||
if [ -f ".env" ]; then
|
|
||||||
cp .env .env.backup
|
|
||||||
echo -e "${GREEN}✅ .env salvato in .env.backup${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f "git.env" ]; then
|
|
||||||
cp git.env git.env.backup
|
|
||||||
echo -e "${GREEN}✅ git.env salvato in git.env.backup${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Verifica modifiche locali
|
|
||||||
echo -e "\n${BLUE}🔍 Verifica modifiche locali...${NC}"
|
|
||||||
if ! sudo -u $IDS_USER git diff-index --quiet HEAD -- 2>/dev/null; then
|
|
||||||
echo -e "${YELLOW}⚠️ Ci sono modifiche locali non committate${NC}"
|
|
||||||
echo -e "${YELLOW} Esegui 'git status' per vedere i dettagli${NC}"
|
|
||||||
read -p "Vuoi procedere comunque? (y/n) " -n 1 -r
|
|
||||||
echo
|
|
||||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# Stash modifiche locali
|
|
||||||
echo -e "${BLUE} Salvo modifiche locali temporaneamente...${NC}"
|
|
||||||
sudo -u $IDS_USER git stash
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Pull da git
|
|
||||||
echo -e "\n${BLUE}📥 Download aggiornamenti da git.alfacom.it...${NC}"
|
|
||||||
sudo -u $IDS_USER git fetch origin
|
|
||||||
sudo -u $IDS_USER git pull origin main
|
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo -e "${GREEN}✅ Aggiornamenti scaricati con successo${NC}"
|
|
||||||
else
|
|
||||||
echo -e "${RED}❌ Errore durante il download${NC}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ripristina configurazione locale
|
|
||||||
echo -e "\n${BLUE}🔄 Ripristino configurazione locale...${NC}"
|
|
||||||
if [ -f ".env.backup" ]; then
|
|
||||||
cp .env.backup .env
|
|
||||||
chown $IDS_USER:$IDS_USER .env
|
|
||||||
echo -e "${GREEN}✅ .env ripristinato${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f "git.env.backup" ]; then
|
|
||||||
cp git.env.backup git.env
|
|
||||||
chown $IDS_USER:$IDS_USER git.env
|
|
||||||
echo -e "${GREEN}✅ git.env ripristinato${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Sincronizza schema database se richiesto
|
|
||||||
if [ "$UPDATE_DB" = true ]; then
|
|
||||||
echo -e "\n${BLUE}🗄️ Sincronizzazione schema database...${NC}"
|
|
||||||
|
|
||||||
SCHEMA_DIR="$IDS_DIR/database-schema"
|
|
||||||
|
|
||||||
# Carica configurazione database
|
|
||||||
if [ ! -f "$IDS_DIR/.env" ]; then
|
|
||||||
echo -e "${RED}❌ File .env non trovato${NC}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
source "$IDS_DIR/.env"
|
|
||||||
export PGPASSWORD="$PGPASSWORD"
|
|
||||||
|
|
||||||
# Trova tutti gli script SQL (escludi schema.sql che è solo snapshot)
|
|
||||||
SQL_SCRIPTS=$(find "$SCHEMA_DIR" -maxdepth 1 -name "*.sql" ! -name "schema.sql" -type f | sort)
|
|
||||||
|
|
||||||
if [ -z "$SQL_SCRIPTS" ]; then
|
|
||||||
echo -e "${YELLOW}⚠️ Nessuno script SQL trovato in database-schema/${NC}"
|
|
||||||
echo -e "${YELLOW} (schema.sql è solo uno snapshot, non viene applicato)${NC}"
|
|
||||||
else
|
|
||||||
echo -e "${YELLOW}⚠️ APPLICAZIONE MODIFICHE AL DATABASE${NC}"
|
|
||||||
echo -e "${YELLOW} Database: ${PGDATABASE}@${PGHOST}${NC}"
|
|
||||||
echo -e "${YELLOW} Script da applicare:${NC}"
|
|
||||||
|
|
||||||
# Mostra lista script
|
|
||||||
for script in $SQL_SCRIPTS; do
|
|
||||||
echo -e "${YELLOW} • $(basename $script)${NC}"
|
|
||||||
done
|
|
||||||
|
|
||||||
read -p "Confermi applicazione modifiche? (y/n) " -n 1 -r
|
|
||||||
echo
|
|
||||||
|
|
||||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
||||||
# Applica tutti gli script in ordine
|
|
||||||
for script in $SQL_SCRIPTS; do
|
|
||||||
SCRIPT_NAME=$(basename "$script")
|
|
||||||
echo -e "\n${BLUE}📄 Applicando $SCRIPT_NAME...${NC}"
|
|
||||||
|
|
||||||
psql -h "${PGHOST:-127.0.0.1}" -p "${PGPORT:-5432}" -U "${PGUSER}" -d "${PGDATABASE}" -f "$script"
|
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo -e "${GREEN}✅ $SCRIPT_NAME applicato con successo${NC}"
|
|
||||||
else
|
|
||||||
echo -e "${RED}❌ Errore applicando $SCRIPT_NAME${NC}"
|
|
||||||
echo -e "${YELLOW}⚠️ Gli script successivi NON saranno applicati${NC}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo -e "\n${GREEN}✅ Tutti gli script SQL applicati con successo${NC}"
|
|
||||||
else
|
|
||||||
echo -e "${YELLOW}⏭️ Sincronizzazione database saltata${NC}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Aggiorna dipendenze Node.js
|
|
||||||
echo -e "\n${BLUE}📦 Aggiornamento dipendenze Node.js...${NC}"
|
|
||||||
sudo -u $IDS_USER npm install
|
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo -e "${GREEN}✅ Dipendenze Node.js aggiornate${NC}"
|
|
||||||
else
|
|
||||||
echo -e "${YELLOW}⚠️ Possibili warning npm (spesso ignorabili)${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Aggiorna dipendenze Python
|
|
||||||
echo -e "\n${BLUE}📦 Aggiornamento dipendenze Python...${NC}"
|
|
||||||
cd python_ml
|
|
||||||
sudo -u $IDS_USER /usr/bin/python3.11 -m pip install --upgrade -r requirements.txt
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo -e "${GREEN}✅ Dipendenze Python aggiornate${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Restart servizi
|
|
||||||
echo -e "\n${BLUE}🔄 Restart servizi...${NC}"
|
|
||||||
if [ -f "./deployment/restart_all.sh" ]; then
|
|
||||||
chmod +x ./deployment/restart_all.sh
|
|
||||||
./deployment/restart_all.sh
|
|
||||||
echo -e "${GREEN}✅ Servizi riavviati${NC}"
|
|
||||||
else
|
|
||||||
echo -e "${YELLOW}⚠️ Script restart_all.sh non trovato${NC}"
|
|
||||||
echo -e "${YELLOW} Riavvia manualmente i servizi se necessario${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo -e "${GREEN}╔═══════════════════════════════════════════════╗${NC}"
|
|
||||||
echo -e "${GREEN}║ ✅ AGGIORNAMENTO COMPLETATO ║${NC}"
|
|
||||||
echo -e "${GREEN}╚═══════════════════════════════════════════════╝${NC}"
|
|
||||||
echo ""
|
|
||||||
echo -e "${BLUE}📋 VERIFICA SISTEMA:${NC}"
|
|
||||||
echo -e " • Log backend: ${YELLOW}tail -f /var/log/ids/backend.log${NC}"
|
|
||||||
echo -e " • Log frontend: ${YELLOW}tail -f /var/log/ids/frontend.log${NC}"
|
|
||||||
echo -e " • API backend: ${YELLOW}curl http://localhost:8000/health${NC}"
|
|
||||||
echo -e " • Frontend: ${YELLOW}curl http://localhost:5000${NC}"
|
|
||||||
echo ""
|
|
||||||
echo -e "${BLUE}📊 STATO SERVIZI:${NC}"
|
|
||||||
ps aux | grep -E 'python.*main|npm.*dev|syslog_parser' | grep -v grep
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
Loading…
Reference in New Issue
Block a user