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)
-
AuteurMessages
-
26.07.2026 à 21h32 #226
Mario Da Conceicao
Maître des clésVersion corrigée du 25/07/2026 — étape 4 du portage Linux. Trois changements :
- Chemin calculé automatiquement (plus de « D:… » en dur)
os.system("dir")(commande Windows) remplacé par un vrai listage de fichiers en Python, qui fonctionne pareil sous Windows et Linux- 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.
-
AuteurMessages
Affichage de 1 message (sur 1 au total)
- Vous devez être connecté pour répondre à ce sujet.