#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Script pour générer un rapport factorisé des vulnérabilités critiques suivant la structure définie dans Remarques.md. """ import streamlit as st import uuid from utils.translations import _ from utils.widgets import html_expander from networkx.drawing.nx_agraph import write_dot from batch_ia import ( load_config, write_report, parse_graphs, extract_data_from_graph, calculate_vulnerabilities, generate_report, ) from app.plan_d_action.utils.data.plan_d_action import initialiser_interface from app.plan_d_action.utils.interface.parser import preparer_graphe from app.plan_d_action.utils.interface.niveau_utils import extraire_niveaux from app.plan_d_action.utils.interface.selection import ( selectionner_minerais, selectionner_noeuds, extraire_chemins_selon_criteres ) from app.plan_d_action.utils.interface.export import ( exporter_graphe_filtre, extraire_liens_filtres ) from app.plan_d_action.utils.interface.visualization import remplacer_par_badge from app.plan_d_action.utils.interface.config import ( niveau_labels, JOBS ) inverse_niveau_labels = {v: k for k, v in niveau_labels.items()} def interface_plan_d_action(G_temp): st.markdown(f"# {str(_('pages.plan_d_action.title'))}") if "plan_d_action" not in st.session_state: st.session_state["plan_d_action"] = 0 if "g_md_done" not in st.session_state: st.session_state["g_md_done"] = False if "uuid" not in st.session_state: st.session_state["uuid"] = str(uuid.uuid4())[:8] st.session_state["G_dot"] = f"{JOBS}/{st.session_state["uuid"]}.dot" st.session_state["G_md"] = f"{JOBS}/{st.session_state["uuid"]}.md" if st.session_state["plan_d_action"] == 0: html_expander(f"{str(_('pages.plan_d_action.help'))}", content="\n".join(_("pages.plan_d_action.help_content")), open_by_default=False, details_class="details_introduction") # Préparation du graphe G_temp, niveaux_temp = preparer_graphe(G_temp) # Sélection des niveaux niveau_depart = 0 niveau_arrivee = 99 # Sélection fine des noeuds noeuds_depart, noeuds_arrivee = selectionner_noeuds(G_temp, niveaux_temp, niveau_depart) # Sélection des minerais si nécessaire if noeuds_depart: minerais = selectionner_minerais(G_temp, noeuds_depart) # Étape 1 : Extraction des niveaux des nœuds niveaux = extraire_niveaux(G_temp) # Étape 2 : Extraction des chemins selon les critères chemins = extraire_chemins_selon_criteres(G_temp, niveaux, niveau_depart, noeuds_depart, noeuds_arrivee, minerais) niveaux_speciaux = [1000, 1001, 1002, 1010, 1011, 1012] # Extraction des liens sans filtrage liens_chemins = extraire_liens_filtres(chemins, niveaux, niveau_depart, niveau_arrivee, niveaux_speciaux) else: liens_chemins = None if liens_chemins: G_final = exporter_graphe_filtre(G_temp, liens_chemins) st.session_state["G_final"] = G_final # formulaire ou sélection if st.button(str(_("pages.plan_d_action.submit_request")), icon=":material/send:"): # On déclenche la suite — mais on NE traite rien maintenant st.session_state["plan_d_action"] = 1 st.rerun() # force la réexécution immédiatement avec état mis à jour elif st.session_state["plan_d_action"] == 1: # Traitement lourd une seule fois if not st.session_state["g_md_done"]: write_dot(st.session_state["G_final"], st.session_state["G_dot"]) config = load_config() graph, ref_graph = parse_graphs(st.session_state["G_dot"]) data = extract_data_from_graph(graph, ref_graph) results = calculate_vulnerabilities(data, config) report, file_names = generate_report(data, results, config) write_report(remplacer_par_badge(report), st.session_state["G_md"]) st.session_state["g_md_done"] = True # pour ne pas re-traiter à chaque affichage # Affichage de l’interface Streamlit initialiser_interface(st.session_state["G_md"]) if (st.button("Réinitialiser", icon=":material/refresh:")): st.session_state["plan_d_action"] = 0 st.session_state["g_md_done"] = False for f in JOBS.glob(f"*{st.session_state["uuid"]}*"): if f.is_file(): f.unlink() st.rerun()