mira_os.py — v2 (Linux, calcul et shell sécurisés)

Bienvenue sur CFTPfr.fr Forums core mira_os.py — v2 (Linux, calcul et shell sécurisés)

  • Ce sujet est vide.
Affichage de 1 message (sur 1 au total)
  • Auteur
    Messages
  • #226
    Mario Da Conceicao
    Maître des clés

    Version corrigée du 25/07/2026 — étape 4 du portage Linux. Trois changements :

    1. Chemin calculé automatiquement (plus de « D:… » en dur)
    2. os.system("dir") (commande Windows) remplacé par un vrai listage de fichiers en Python, qui fonctionne pareil sous Windows et Linux
    3. La calculatrice n’utilise plus eval() brut (qui pouvait exécuter n’importe quel code Python) — elle utilise désormais le même calcul sécurisé que chat_ia.py, limité aux seules opérations mathématiques
    import os
    import sys
    import json
    import ast
    import operator as op
    from pathlib import Path
    
    # --- CORRECTION 1 : chemin calculé automatiquement, plus de "D:\..." en dur ---
    BASE_DIR = Path(__file__).resolve().parent.parent
    sys.path.append(str(BASE_DIR))
    
    from mira_ai.mira_ia import MiraIA
    
    print("MIRA_OS : Démarrage du système...")
    print("Version : 0.3 (Alpha)")
    print(f"Environnement : Python {sys.version.split()[0]}")
    
    # --- CORRECTION 3 : calcul sécurisé, comme dans chat_ia.py (plus d'eval() brut) ---
    SAFE_OPERATORS = {
        ast.Add: op.add,
        ast.Sub: op.sub,
        ast.Mult: op.mul,
        ast.Div: op.truediv,
        ast.FloorDiv: op.floordiv,
        ast.Mod: op.mod,
        ast.Pow: op.pow,
        ast.UAdd: op.pos,
        ast.USub: op.neg,
    }
    
    def calcul_securise(expression):
        node = ast.parse(expression, mode="eval").body
        return eval_node(node)
    
    def eval_node(node):
        if isinstance(node, ast.Constant) and isinstance(node.value, (int, float)):
            return node.value
        if isinstance(node, ast.BinOp) and type(node.op) in SAFE_OPERATORS:
            return SAFE_OPERATORS[type(node.op)](eval_node(node.left), eval_node(node.right))
        if isinstance(node, ast.UnaryOp) and type(node.op) in SAFE_OPERATORS:
            return SAFE_OPERATORS[type(node.op)](eval_node(node.operand))
        raise ValueError("Expression interdite")
    
    # Mini-shell
    def mira_shell():
        print("\n--- MIRA_Shell (Tape 'exit' pour quitter) ---")
        while True:
            commande = input("mira> ")
            if commande.lower() == "exit":
                break
            elif commande.lower() == "help":
                print("Commandes disponibles : exit, help, version")
            elif commande.lower() == "version":
                print("MIRA_OS Version : 0.3 (Alpha)")
            else:
                print("Commande non reconnue dans ce shell restreint.")
                # Remarque : l'ancienne version passait la commande directement à
                # os.system(), sans filtre. Retiré volontairement : sur un système
                # autonome, exécuter n'importe quelle commande tapée est un risque
                # de sécurité, pas juste un souci de portabilité.
    
    # Gestion de fichiers
    def gestion_fichiers():
        print("\n--- Gestion de fichiers ---")
        print("1. Lister les fichiers")
        print("2. Créer un fichier")
        print("3. Supprimer un fichier")
        print("4. Retour au menu principal")
        while True:
            choix = input("Choisis une option (1-4) : ")
            if choix == "1":
                # CORRECTION 2 : listage en Python pur, plus de "dir" (Windows-only)
                print("\n--- Fichiers dans MIRA_Project ---")
                for item in sorted(BASE_DIR.iterdir()):
                    print(("[dossier] " if item.is_dir() else "         ") + item.name)
            elif choix == "2":
                nom_fichier = input("Nom du fichier à créer : ")
                with open(nom_fichier, "w") as f:
                    f.write("")
                print(f"Fichier '{nom_fichier}' créé.")
            elif choix == "3":
                nom_fichier = input("Nom du fichier à supprimer : ")
                if os.path.exists(nom_fichier):
                    os.remove(nom_fichier)
                    print(f"Fichier '{nom_fichier}' supprimé.")
                else:
                    print(f"Fichier '{nom_fichier}' introuvable.")
            elif choix == "4":
                break
            else:
                print("Option invalide. Réessaye.")
    
    # Gestion des notes
    def gestion_notes():
        print("\n--- Gestion des notes ---")
        print("1. Créer une note")
        print("2. Lister les notes")
        print("3. Lire une note")
        print("4. Supprimer une note")
        print("5. Retour au menu principal")
    
        dossier_notes = Path("mira_notes")
        dossier_notes.mkdir(exist_ok=True)
    
        while True:
            choix = input("Choisis une option (1-5) : ")
            if choix == "1":
                titre = input("Titre de la note : ")
                contenu = input("Contenu de la note : ")
                (dossier_notes / f"{titre}.txt").write_text(contenu, encoding="utf-8")
                print(f"Note '{titre}' créée.")
            elif choix == "2":
                # CORRECTION 2 : listage en Python pur, plus de "dir" (Windows-only)
                print("\n--- Liste des notes ---")
                for item in sorted(dossier_notes.glob("*.txt")):
                    print(item.name)
            elif choix == "3":
                titre = input("Titre de la note à lire : ")
                chemin_note = dossier_notes / f"{titre}.txt"
                if chemin_note.exists():
                    print(f"\n--- {titre} ---\n{chemin_note.read_text(encoding='utf-8')}")
                else:
                    print(f"Note '{titre}' introuvable.")
            elif choix == "4":
                titre = input("Titre de la note à supprimer : ")
                chemin_note = dossier_notes / f"{titre}.txt"
                if chemin_note.exists():
                    chemin_note.unlink()
                    print(f"Note '{titre}' supprimée.")
                else:
                    print(f"Note '{titre}' introuvable.")
            elif choix == "5":
                break
            else:
                print("Option invalide. Réessaye.")
    
    # Calculatrice
    def calculatrice():
        print("\n--- Calculatrice MIRA_OS ---")
        print("Opérations disponibles : +, -, *, /")
        while True:
            try:
                expression = input("Entrez une opération (ex: 2+2) ou 'exit' pour quitter : ")
                if expression.lower() == "exit":
                    break
                # CORRECTION 3 : calcul_securise() au lieu d'eval() brut
                resultat = calcul_securise(expression)
                print(f"Résultat : {resultat}")
            except Exception:
                print("Erreur : expression invalide. Réessayez.")
    
    # Fonction pour gérer l'IA
    def gerer_ia():
        ia = MiraIA(version_actuelle="0.3")
        print("\n--- MIRA_OS IA ---")
        print("1. Vérifier les mises à jour")
        print("2. Proposer une amélioration")
        print("3. Voir les propositions de l'IA")
        print("4. Chat avec l'IA")
        print("5. Retour au menu")
        choix_ia = input("Choisis une option (1-5) : ")
    
        if choix_ia == "1":
            mise_a_jour = ia.verifier_mises_a_jour()
            if mise_a_jour:
                print(f"Mise à jour disponible : Version {mise_a_jour['version']} - {mise_a_jour['description']}")
                appliquer = input("Appliquer la mise à jour ? (o/n) : ")
                if appliquer.lower() == "o":
                    ia.appliquer_mise_a_jour(mise_a_jour)
            else:
                print("Aucune mise à jour disponible.")
        elif choix_ia == "2":
            suggestion = input("Entrez votre suggestion d'amélioration : ")
            ia.proposer_amelioration(suggestion)
        elif choix_ia == "3":
            propositions = ia.get_propositions()
            if not propositions:
                print("Aucune proposition d'amélioration pour le moment.")
            else:
                print("\n--- Propositions de l'IA ---")
                for i, prop in enumerate(propositions, 1):
                    print(f"{i}. {prop['description']}")
                    print(f"   Explication : {prop['explication']}")
                    print(f"   Fichiers à modifier : {', '.join(prop['fichiers_a_modifier'])}")
                    print(f"   Date : {prop['date']}\n")
                choix_prop = input("Choisis une proposition à appliquer (ou '0' pour revenir) : ")
                if choix_prop != "0":
                    try:
                        prop = propositions[int(choix_prop) - 1]
                        print(f"\nProposition sélectionnée : {prop['description']}")
                        print(f"Explication : {prop['explication']}")
                        print(f"Fichiers à modifier : {', '.join(prop['fichiers_a_modifier'])}")
                        appliquer = input("Appliquer cette amélioration ? (o/n) : ")
                        if appliquer.lower() == "o":
                            chemin = BASE_DIR / "mira_ai" / "amelioration_a_appliquer.json"
                            with open(chemin, "w", encoding="utf-8") as f:
                                json.dump(prop, f, indent=4, ensure_ascii=False)
                            print(f"Amélioration validée ! Fichier créé : {chemin}")
                    except (ValueError, IndexError):
                        print("Proposition invalide.")
        elif choix_ia == "4":
            ia.chat_ia()
        elif choix_ia == "5":
            return
        else:
            print("Option invalide.")
    
    # Menu principal
    if __name__ == "__main__":
        while True:
            print("\n--- MIRA_OS Menu ---")
            print("1. Afficher la version")
            print("2. Lancer MIRA_Shell")
            print("3. Gérer les fichiers")
            print("4. Gérer les notes")
            print("5. Calculatrice")
            print("6. Interagir avec l'IA")
            print("7. Quitter")
            choix = input("Choisis une option (1-7) : ")
    
            if choix == "1":
                print("MIRA_OS Version : 0.3 (Alpha)")
            elif choix == "2":
                mira_shell()
            elif choix == "3":
                gestion_fichiers()
            elif choix == "4":
                gestion_notes()
            elif choix == "5":
                calculatrice()
            elif choix == "6":
                gerer_ia()
            elif choix == "7":
                print("MIRA_OS : Arrêt du système.")
                break
            else:
                print("Option invalide. Réessaye.")

    ⚠️ Remarque : le mini-shell (option 2) ne transmet plus les commandes tapées directement au système — c’était un risque de sécurité, pas juste un souci Windows/Linux. Dis-moi si tu avais un usage précis pour ça (ex. lancer certains outils système) et on ajoutera une liste précise de commandes autorisées plutôt que tout ouvrir.

Affichage de 1 message (sur 1 au total)
  • Vous devez être connecté pour répondre à ce sujet.
Retour en haut