Replit-Commit-Author: Agent Replit-Commit-Session-Id: 7a657272-55ba-4a79-9a2e-f1ed9bc7a528 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 1c71ce6e-1a3e-4f53-bb5d-77cdd22b8ea3
113 lines
3.8 KiB
Python
113 lines
3.8 KiB
Python
# Importa le librerie necessarie
|
|
import pandas as pd
|
|
import mysql.connector
|
|
from datetime import datetime, timedelta
|
|
import logging
|
|
|
|
# Configura il logging
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
|
|
|
# Configura la connessione al database
|
|
db_config = {
|
|
'user': 'root',
|
|
'password': 'Hdgtejskjjc0-',
|
|
'host': 'localhost',
|
|
'database': 'LOG_MIKROTIK',
|
|
'raise_on_warnings': True
|
|
}
|
|
|
|
# Funzione per estrarre i nuovi dati dal database
|
|
def estrai_nuovi_dati(ultimo_id):
|
|
logging.info(f"Estrazione dei nuovi dati a partire da ID > {ultimo_id}...")
|
|
cnx = mysql.connector.connect(**db_config)
|
|
query = f"SELECT ID, Data, Ora, Host, IndirizzoIP, Messaggio1, Messaggio2, Messaggio3 FROM Esterna WHERE ID > {ultimo_id}"
|
|
df = pd.read_sql(query, cnx)
|
|
cnx.close()
|
|
if not df.empty:
|
|
df['Timestamp'] = pd.to_datetime(df['Data'] + ' ' + df['Ora'])
|
|
logging.info(f"Dati estratti: {len(df)} record.")
|
|
return df
|
|
|
|
# Funzione per pre-elaborare i dati e creare le nuove caratteristiche
|
|
def pre_elabora_dati(df):
|
|
logging.info("Pre-elaborazione dei dati...")
|
|
|
|
# Rinomina le colonne per chiarezza
|
|
df.rename(columns={
|
|
'Messaggio1': 'Protocollo',
|
|
'Messaggio2': 'IP_Sorgente',
|
|
'Messaggio3': 'IP_Destinazione'
|
|
}, inplace=True)
|
|
|
|
# Estrae indirizzi IP e porte
|
|
df[['IP_Sorgente', 'Porta_Sorgente']] = df['IP_Sorgente'].str.split(':', expand=True)
|
|
df[['IP_Destinazione', 'Porta_Destinazione']] = df['IP_Destinazione'].str.split(':', expand=True)
|
|
|
|
# Converti le porte in numeri interi
|
|
df['Porta_Sorgente'] = pd.to_numeric(df['Porta_Sorgente'], errors='coerce')
|
|
df['Porta_Destinazione'] = pd.to_numeric(df['Porta_Destinazione'], errors='coerce')
|
|
|
|
# Aggiungi una colonna per l'IP esterno (ipotizzando che l'IP esterno sia sempre l'IP di origine)
|
|
df['IP_Esterno'] = df['IP_Sorgente']
|
|
df['IP_Interno'] = df['IP_Destinazione']
|
|
|
|
# Filtra i dati per l'intervallo di tempo desiderato (ad esempio, ultimi 5 minuti)
|
|
tempo_iniziale = df['Timestamp'].max() - timedelta(minutes=5)
|
|
df = df[df['Timestamp'] >= tempo_iniziale]
|
|
|
|
return df
|
|
|
|
# Funzione per aggregare i dati e creare le nuove caratteristiche
|
|
def crea_caratteristiche(df):
|
|
logging.info("Creazione delle nuove caratteristiche...")
|
|
|
|
# Raggruppa per IP esterno nell'intervallo di tempo
|
|
aggregated = df.groupby(['IP_Esterno']).agg(
|
|
num_ip_interni_contattati=('IP_Interno', 'nunique'),
|
|
num_connessioni=('IP_Interno', 'count'),
|
|
num_porte_uniche=('Porta_Destinazione', 'nunique')
|
|
).reset_index()
|
|
|
|
return aggregated
|
|
|
|
# Funzione principale
|
|
def main():
|
|
# Leggi l'ultimo ID elaborato (puoi memorizzarlo in un file o database)
|
|
ultimo_id = leggi_ultimo_id()
|
|
|
|
# Estrai i nuovi dati
|
|
df_nuovi = estrai_nuovi_dati(ultimo_id)
|
|
|
|
if df_nuovi.empty:
|
|
logging.info("Nessun nuovo dato da elaborare.")
|
|
return
|
|
|
|
# Pre-elabora i dati
|
|
df_preparato = pre_elabora_dati(df_nuovi)
|
|
|
|
# Crea le nuove caratteristiche
|
|
df_caratteristiche = crea_caratteristiche(df_preparato)
|
|
|
|
# Salva il nuovo ultimo ID
|
|
salva_ultimo_id(df_nuovi['ID'].max())
|
|
|
|
# Salva o restituisci il DataFrame delle caratteristiche per l'uso nel modello
|
|
df_caratteristiche.to_csv('caratteristiche.csv', index=False)
|
|
logging.info("Caratteristiche salvate nel file 'caratteristiche.csv'.")
|
|
|
|
# Funzioni per leggere e salvare l'ultimo ID elaborato
|
|
def leggi_ultimo_id():
|
|
try:
|
|
with open('ultimo_id.txt', 'r') as f:
|
|
ultimo_id = int(f.read().strip())
|
|
except FileNotFoundError:
|
|
ultimo_id = 0
|
|
return ultimo_id
|
|
|
|
def salva_ultimo_id(ultimo_id):
|
|
with open('ultimo_id.txt', 'w') as f:
|
|
f.write(str(ultimo_id))
|
|
|
|
if __name__ == "__main__":
|
|
main()
|