"""Detection locale simple de commandes potentiellement destructives, proposees par l'assistant IA. N'a pas besoin d'etre parfaite : sert a afficher un avertissement, jamais a bloquer ou executer quoi que ce soit automatiquement.""" from __future__ import annotations import re from dataclasses import dataclass _DANGEROUS_PATTERNS: list[tuple[str, re.Pattern]] = [ ("rm -rf (suppression recursive forcee)", re.compile(r"\brm\s+(-\w*\s+)*-\w*[rf]\w*[rf]\w*\b", re.IGNORECASE)), ("mkfs (formatage)", re.compile(r"\bmkfs(\.\w+)?\b", re.IGNORECASE)), ("dd (ecriture bas niveau sur un disque)", re.compile(r"\bdd\s+.*\bif=", re.IGNORECASE | re.DOTALL)), ("wipefs (effacement des signatures de systeme de fichiers)", re.compile(r"\bwipefs\b", re.IGNORECASE)), ("shutdown (extinction)", re.compile(r"\bshutdown\b", re.IGNORECASE)), ("reboot (redemarrage)", re.compile(r"\breboot\b", re.IGNORECASE)), ("iptables : purge des regles", re.compile(r"\biptables\b.*(-F|--flush)\b", re.IGNORECASE)), ("nft : purge des regles", re.compile(r"\bnft\b.*\bflush\b", re.IGNORECASE)), ("DROP DATABASE", re.compile(r"\bDROP\s+DATABASE\b", re.IGNORECASE)), ("DELETE FROM sans WHERE", re.compile(r"\bDELETE\s+FROM\s+\S+\s*;", re.IGNORECASE)), ("docker system prune (suppression en masse)", re.compile(r"\bdocker\s+system\s+prune\b", re.IGNORECASE)), ("zpool destroy", re.compile(r"\bzpool\s+destroy\b", re.IGNORECASE)), ("lvremove (suppression de volume logique)", re.compile(r"\blvremove\b", re.IGNORECASE)), ("vgremove (suppression de groupe de volumes)", re.compile(r"\bvgremove\b", re.IGNORECASE)), ] @dataclass class DangerMatch: label: str def check_dangerous(command: str) -> list[DangerMatch]: return [DangerMatch(label) for label, pattern in _DANGEROUS_PATTERNS if pattern.search(command)] def is_dangerous(command: str) -> bool: return bool(check_dangerous(command))