import socket
import time
import threading
import tkinter as tk
from tkinter import messagebox


sauvdns = {}
port_ecoute = 9995
fichier_sortie = "logs.csv"
ecoute_en_cours = False

def get_domain_name(ip):
    """ Fonction pour transformer l'IP en nom de domaine (DNS) """
    if ip in sauvdns:
        return sauvdns[ip]
    try:
        
        socket.setdefaulttimeout(0.1)
        domain = socket.gethostbyaddr(ip)[0]
    except:
        domain = ip
    sauvdns[ip] = domain
    return domain

def demarrer_ecoute():
    global ecoute_en_cours
    ecoute_en_cours = True
    btn_start.config(state="disabled", text="Écoute active...")
    
   
    thread = threading.Thread(target=boucle_principale)
    thread.daemon = True
    thread.start()

def boucle_principale():
    global ecoute_en_cours
    try:
        
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.bind(("0.0.0.0", port_ecoute))
        
        log_ecran.insert(tk.END, f"[*] Serveur lancé sur le port {port_ecoute}\n")

        with open(fichier_sortie, "a") as f: # "a" pour ajouter sans effacer
            while ecoute_en_cours:
                donnees, addr = sock.recvfrom(2048)
                
               
                nb_flux = int.from_bytes(donnees[2:4], byteorder='big')
                
                for i in range(nb_flux):
                   
                    base = 24 + (i * 48)
                    flux = donnees[base : base + 48]
                    
                    if len(flux) < 48:
                        break

                   
                    ip_src = socket.inet_ntoa(flux[0:4])
                    ip_dst = socket.inet_ntoa(flux[4:8])
                    
                    
                    volume_octets = int.from_bytes(flux[20:24], byteorder='big')

                    if volume_octets > 1024: 
                        nom_src = get_domain_name(ip_src)
                        nom_dst = get_domain_name(ip_dst)
                        
                        date = time.strftime("%Y-%m-%d %H:%M:%S")
                        vol_mo = round(volume_octets / (1024 * 1024), 3)

                       
                        ligne = f"{date},{ip_src},{nom_src},{ip_dst},{nom_dst},{volume_octets},{vol_mo}\n"
                        f.write(ligne)
                        f.flush()
                        log_ecran.insert(tk.END, f"{nom_src} -> {nom_dst} ({vol_mo} Mo)\n")
                        log_ecran.see(tk.END) 
                        
    except Exception as e:
        messagebox.showerror("Erreur", f"Problème réseau : {e}")
    finally:
        ecoute_en_cours = False


root = tk.Tk()
root.title("Récupérateur de Logs Lycée")
root.geometry("600x400")

tk.Label(root, text="Logs du trafic réseau en direct", font=("Arial", 12, "bold")).pack(pady=10)

log_ecran = tk.Text(root, height=15, width=70)
log_ecran.pack(padx=10, pady=10)

btn_start = tk.Button(root, text="Démarrer la récupération", command=demarrer_ecoute, bg="green", fg="white")
btn_start.pack(pady=5)

root.mainloop()