From 61d1ef49a66e223b30f321ed41614d01b7a8fcdd Mon Sep 17 00:00:00 2001 From: 7ka1 <7ka1@noreply.localhost> Date: Tue, 19 May 2026 14:25:52 +0000 Subject: [PATCH] =?UTF-8?q?T=C3=A9l=C3=A9verser=20les=20fichiers=20vers=20?= =?UTF-8?q?"/"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zorin-disk-health.py | 196 ++++++++++++++++++++++++++++++++ zorin-disk-health_4.1.0_all.deb | Bin 0 -> 3858 bytes 2 files changed, 196 insertions(+) create mode 100644 zorin-disk-health.py create mode 100644 zorin-disk-health_4.1.0_all.deb diff --git a/zorin-disk-health.py b/zorin-disk-health.py new file mode 100644 index 0000000..e45efe6 --- /dev/null +++ b/zorin-disk-health.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python3 +import tkinter as tk +from tkinter import ttk, scrolledtext +import subprocess +import re + +class ZorinDiskHealthV4: + def __init__(self, root): + self.root = root + self.root.title("Zorin Disk Health 4.1 - GOD MODE (Fixed)") + self.root.geometry("900x750") + self.root.minsize(850, 700) + + # Couleurs Premium Dark Zorin + self.bg_dark = "#09090b" + self.bg_panel = "#18181b" + self.text_light = "#fafafa" + self.text_dim = "#a1a1aa" + self.accent = "#3b82f6" + self.success = "#10b981" + self.warn = "#f59e0b" + self.danger = "#ef4444" + + self.root.configure(bg=self.bg_dark) + + self.current_health = 0 + self.target_health = 0 + self.current_temp = 0 + self.target_temp = 0 + + self.create_ui() + self.refresh_disks() + + def create_ui(self): + header = tk.Frame(self.root, bg=self.bg_dark, pady=25) + header.pack(fill=tk.X, padx=40) + tk.Label(header, text="Zorin Disk Health", font=("Helvetica", 28, "bold"), fg=self.text_light, bg=self.bg_dark).pack(side=tk.LEFT) + tk.Label(header, text="v4.1 PRO", font=("Helvetica", 12, "bold"), fg=self.accent, bg=self.bg_dark).pack(side=tk.LEFT, padx=15, pady=12) + + controls = tk.Frame(self.root, bg=self.bg_panel, padx=25, pady=20, highlightthickness=1, highlightbackground="#27272a") + controls.pack(fill=tk.X, padx=40, pady=10) + + tk.Label(controls, text="Sélectionnez le disque :", bg=self.bg_panel, fg=self.text_light, font=("Helvetica", 11, "bold")).pack(side=tk.LEFT) + self.disk_var = tk.StringVar() + self.disk_combo = ttk.Combobox(controls, textvariable=self.disk_var, width=40, state="readonly", font=("Helvetica", 10)) + self.disk_combo.pack(side=tk.LEFT, padx=15) + + self.btn_analyze = tk.Button(controls, text="DÉMARRER L'ANALYSE", command=self.start_analysis, bg=self.accent, fg="white", font=("Helvetica", 11, "bold"), bd=0, padx=25, pady=10, cursor="hand2") + self.btn_analyze.pack(side=tk.RIGHT) + + dash_frame = tk.Frame(self.root, bg=self.bg_dark) + dash_frame.pack(fill=tk.X, padx=40, pady=30) + + self.c_health = tk.Canvas(dash_frame, width=250, height=250, bg=self.bg_dark, highlightthickness=0) + self.c_health.pack(side=tk.LEFT, expand=True) + self.draw_ring(self.c_health, 125, 125, 100, 18, 0, "#27272a", "0%", "SANTÉ") + + self.c_temp = tk.Canvas(dash_frame, width=250, height=250, bg=self.bg_dark, highlightthickness=0) + self.c_temp.pack(side=tk.LEFT, expand=True) + self.draw_ring(self.c_temp, 125, 125, 100, 18, 0, "#27272a", "0°C", "TEMPÉRATURE") + + self.log_area = scrolledtext.ScrolledText(self.root, wrap=tk.WORD, font=("Consolas", 10), bg="#0f0f11", fg="#34d399", bd=1, highlightthickness=1, highlightbackground="#27272a", padx=20, pady=20) + self.log_area.pack(fill=tk.BOTH, expand=True, padx=40, pady=(0, 40)) + self.log_area.insert(tk.END, "✓ Zorin OS Mode activé.\n✓ Moteur graphique prêt.\n") + + def draw_ring(self, canvas, x, y, radius, thickness, percentage, color, text_main, text_sub): + canvas.delete("all") + canvas.create_oval(x-radius, y-radius, x+radius, y+radius, outline="#27272a", width=thickness) + if percentage > 0: + extent = -(percentage / 100) * 360 + canvas.create_arc(x-radius, y-radius, x+radius, y+radius, start=90, extent=extent, style=tk.ARC, outline=color, width=thickness) + canvas.create_text(x, y-15, text=text_main, fill=self.text_light, font=("Helvetica", 34, "bold")) + canvas.create_text(x, y+25, text=text_sub, fill=self.text_dim, font=("Helvetica", 12, "bold")) + + def animate_health(self, color, text_sub): + if abs(self.target_health - self.current_health) < 0.5: + self.current_health = self.target_health + else: + self.current_health += (self.target_health - self.current_health) * 0.1 + self.draw_ring(self.c_health, 125, 125, 100, 18, self.current_health, color, f"{int(self.current_health)}%", text_sub) + if self.current_health != self.target_health: + self.root.after(16, self.animate_health, color, text_sub) + + def animate_temp(self, color, text_sub): + if abs(self.target_temp - self.current_temp) < 0.5: + self.current_temp = self.target_temp + else: + self.current_temp += (self.target_temp - self.current_temp) * 0.1 + fill_pct = min((self.current_temp / 70) * 100, 100) + self.draw_ring(self.c_temp, 125, 125, 100, 18, fill_pct, color, f"{int(self.current_temp)}°C", text_sub) + if self.current_temp != self.target_temp: + self.root.after(16, self.animate_temp, color, text_sub) + + def refresh_disks(self): + try: + result = subprocess.run(['lsblk', '-d', '-p', '-n', '-o', 'NAME,SIZE,MODEL'], capture_output=True, text=True) + disks = [line.strip() for line in result.stdout.split('\n') if line.strip()] + self.disk_combo['values'] = disks if disks else ["/dev/sda"] + self.disk_combo.current(0) + except Exception: + pass + + def log(self, msg): + self.log_area.insert(tk.END, msg + "\n") + self.log_area.see(tk.END) + self.root.update() + + def start_analysis(self): + disk = self.disk_var.get().split()[0] + self.btn_analyze.config(text="ANALYSE EN COURS...", state=tk.DISABLED) + + self.current_health, self.target_health = 0, 0 + self.current_temp, self.target_temp = 0, 0 + self.draw_ring(self.c_health, 125, 125, 100, 18, 0, "#27272a", "0%", "SANTÉ") + self.draw_ring(self.c_temp, 125, 125, 100, 18, 0, "#27272a", "0°C", "TEMPÉRATURE") + + self.log_area.delete(1.0, tk.END) + self.log(f"🔍 Démarrage sur {disk}...") + self.log("⚠️ Le système va vous demander votre mot de passe pour autoriser le test matériel.") + + self.root.after(100, self.brute_force_samsung, disk) + + def brute_force_samsung(self, disk): + # Le "Super-Script" qui teste les 8 protocoles en 1 seule demande administrateur + bash_script = f''' + for d in "" "sat" "nvme" "scsi" "samsung" "sntrealtek" "sntjmicron" "usbjmicron"; do + if [ -z "$d" ]; then + out=$(smartctl -A -H -T permissive {disk} 2>/dev/null) + else + out=$(smartctl -d "$d" -A -H -T permissive {disk} 2>/dev/null) + fi + if echo "$out" | grep -q -iE "Temperature|PASSED"; then + echo "BINGO:$d" + echo "$out" + exit 0 + fi + done + echo "FAILED" + ''' + + cmd = ["pkexec", "bash", "-c", bash_script] + try: + self.log("⚡ Analyse des contrôleurs USB en arrière-plan...") + res = subprocess.run(cmd, capture_output=True, text=True) + out = res.stdout + + if "BINGO:" in out: + driver = out.split("\n")[0].split(":")[1].strip() + drv_name = driver if driver else "Auto" + self.log(f"🎯 Succès ! Protection Samsung contournée (Pilote: {drv_name}).") + self.log("\n📊 Décodage des puces mémoire...\n") + self.parse_and_animate(out) + elif "pkexec" in res.stderr or res.returncode == 127: + self.log("❌ Action annulée : Mot de passe requis pour lire la santé physique du disque.") + self.btn_analyze.config(text="DÉMARRER L'ANALYSE", state=tk.NORMAL) + else: + self.log("❌ ÉCHEC. Le câble USB bloque absolument toutes les requêtes matérielles.") + self.btn_analyze.config(text="DÉMARRER L'ANALYSE", state=tk.NORMAL) + + except Exception as e: + self.log(f"Erreur : {e}") + self.btn_analyze.config(text="DÉMARRER L'ANALYSE", state=tk.NORMAL) + + def parse_and_animate(self, data): + health_val = 0 + health_color = self.danger + h_text = "CRITIQUE" + + if "PASSED" in data or "OK" in data: + health_val = 100 + health_color = self.success + h_text = "EXCELLENTE" + p1 = re.search(r"Percentage Used:\s+(\d+)%", data) + if p1: health_val = 100 - int(p1.group(1)) + + self.target_health = health_val + self.animate_health(health_color, h_text) + + temp_val = 0 + t1 = re.search(r"Temperature:\s+(\d+)\s+Celsius", data) + t2 = re.search(r"194 Temperature_Celsius.*\s+(\d+)\s*$", data, re.MULTILINE) + if t1: temp_val = int(t1.group(1)) + elif t2: temp_val = int(t2.group(1)) + + if temp_val > 0: + t_color = self.accent if temp_val < 45 else (self.warn if temp_val < 55 else self.danger) + t_text = "FRAIS" if temp_val < 45 else ("CHAUD" if temp_val < 55 else "SURCHAUFFE") + self.target_temp = temp_val + self.animate_temp(t_color, t_text) + + self.btn_analyze.config(text="DÉMARRER L'ANALYSE", state=tk.NORMAL) + +if __name__ == "__main__": + root = tk.Tk() + app = ZorinDiskHealthV4(root) + root.mainloop() diff --git a/zorin-disk-health_4.1.0_all.deb b/zorin-disk-health_4.1.0_all.deb new file mode 100644 index 0000000000000000000000000000000000000000..5355e352978c5fbf61de728418bdea28381b5899 GIT binary patch literal 3858 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