Exécution d’un outil externe dans une BackgroundTask #40
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Exécution d’un outil externe dans une BackgroundTask
Statut
À faire
Priorité
Haute
Objectif
Créer une couche d’intégration permettant d’exécuter un outil externe dans une
BackgroundTask, puis de suivre cette exécution avec leTaskManageret le panneau d’activité.Ce ticket doit relier proprement les modules déjà validés :
Le résultat attendu est une abstraction réutilisable capable de :
Contexte
Les tickets précédents ont fourni :
Ticket #034
pour exécuter un travail asynchrone, publier une progression et gérer l’annulation.
Ticket #035
pour conserver, afficher et annuler les tâches.
Ticket #036
pour détecter les exécutables disponibles sur la machine.
Ticket #037
pour lancer un exécutable sans shell, capturer ses sorties et gérer son annulation.
Il manque maintenant une couche métier qui assemble ces briques sans obliger
Application, les futurs adaptateurs OSINT ou les widgets GTK à connaître tous les détails de leur fonctionnement interne.Nom proposé du module
Fichiers attendus :
Le nom peut être ajusté avant implémentation s’il existe une meilleure proposition cohérente avec le projet.
Responsabilité du module
ToolTaskdoit représenter une exécution externe préparée pour être lancée dans uneBackgroundTask.Le module devra :
ToolRegistry;BackgroundTask;ToolProcessdans son worker ;GCancellablefourni parBackgroundTask;ToolTask;Hors périmètre
Ce ticket ne doit pas encore :
ToolRegistry.Le premier adaptateur OSINT concret viendra après ce ticket.
Contraintes générales
Modèle public
ToolTaskResult
Créer une structure opaque :
Cette structure doit conserver au minimum :
Le champ
process_resultdoit contenir leToolProcessResultproduit parToolProcess.Le résultat doit être indépendant du
ToolRegistryaprès sa création.ToolTask
Deux approches sont possibles.
Approche recommandée
Ne pas créer une structure persistante
ToolTask.Créer directement une
BackgroundTaskconfigurée à partir d’une requête.Exemple :
Le
BackgroundTaskretourné n’est pas encore démarré.Une seconde fonction démarre la tâche :
Approche alternative
Créer une structure opaque
ToolTaskpossédant saBackgroundTask.Cette approche n’est acceptable que si elle simplifie clairement la propriété et les tests.
Domaine d’erreur
Créer :
Énumération minimale :
Fonction :
Règles de préparation
Outil inconnu
Si l’identifiant n’existe pas dans le registre :
Outil non vérifié
Si l’état vaut :
la création doit échouer avec :
Le module ne doit pas appeler automatiquement
tool_registry_refresh().Cette décision garde les responsabilités séparées.
Outil absent
Si l’état vaut :
la création doit échouer avec :
Outil disponible sans chemin
Un outil marqué disponible mais sans chemin résolu représente un état incohérent.
La création doit échouer.
Arguments
Le tableau d’arguments :
peut être
NULL.Lorsqu’il est fourni :
NULLjusqu’au terminateur ;NULL.Titre
Le titre de la tâche doit être non vide.
Exemple :
Le titre ne doit pas être fabriqué automatiquement par le module.
Cycle de vie recommandé
Création
Comportement :
ToolInfo;BackgroundTask;Démarrage
Cette fonction doit :
ToolTask;background_task_start();La fonction ne doit pas ajouter elle-même la tâche dans un
TaskManager.Cette responsabilité reste à l’appelant.
Worker
Le worker doit respecter la signature actuelle de
BackgroundTask.Comportement attendu :
tool_process_run()avec :GCancellablereçu ;ToolTaskResult;ToolProcessResult;Progression
Une commande externe ne fournit pas toujours une progression mesurable.
Pour ce ticket, utiliser une progression qualitative :
Il ne faut pas simuler une progression régulière avec un minuteur.
Code de sortie non nul
Un programme lancé correctement mais terminant avec un code non nul ne doit pas faire échouer la
BackgroundTask.Dans ce cas :
Le résultat doit conserver :
Cette distinction est essentielle pour les futurs adaptateurs.
Exemple :
La tâche technique est terminée, mais le résultat fonctionnel signale un échec.
Annulation
Le
GCancellablereçu par le worker doit être transmis directement à :Si
ToolProcessretourne :le worker doit permettre à
BackgroundTaskd’aboutir à l’état :Il ne doit pas transformer l’annulation en erreur métier générique.
Aucun processus enfant ne doit rester actif.
Résultat
Cycle de vie
La fonction doit accepter
NULL.Identifiant
Chaîne empruntée.
Chemin de l’exécutable
Chaîne empruntée.
Arguments
Chaînes empruntées.
Dossier de travail
Retourne
NULLsi aucun dossier n’a été défini.Résultat du processus
Pointeur emprunté.
Une fonction de transfert ou de référence n’est pas nécessaire pour ce ticket.
Propriété des données
Données de préparation
Le module doit copier toutes les données nécessaires avant le démarrage.
Il ne doit pas dépendre de la durée de vie :
ToolRegistry;ToolInfo;Résultat
ToolTaskResultdevient propriétaire de :ToolProcessResult.Le destructeur doit tout libérer.
BackgroundTask
La propriété de la
BackgroundTaskreste conforme au ticket #034.API publique suggérée
L’API peut évoluer si l’implémentation de
BackgroundTaskrend une autre forme plus sûre.Marquage d’une BackgroundTask
tool_task_start()doit pouvoir vérifier que la tâche reçue a été créée partool_task_create().Approches possibles :
Structure privée associée
Conserver les données du worker dans une structure privée connue uniquement de
ToolTask.Extension de BackgroundTask
Ajouter un pointeur de contexte privé à
BackgroundTaskuniquement si cela reste générique et justifié.Wrapper opaque
Créer un
ToolTaskopaque contenant laBackgroundTask.Cette solution peut être préférable si la vérification devient fragile.
Le choix final doit privilégier :
Tests unitaires obligatoires
Les tests doivent créer un faux outil temporaire.
Ils ne doivent pas dépendre d’un outil réel.
1. Arguments invalides
Tester au minimum :
NULL;NULL;NULL;GErrordéjà initialisé si la convention est vérifiée.Résultat attendu :
2. Outil inconnu
Registre valide mais identifiant absent.
Résultat :
3. Outil non vérifié
Enregistrer un outil sans appeler
tool_registry_refresh().Résultat :
4. Outil absent
Enregistrer un faux outil absent, puis rafraîchir.
Résultat :
5. Création valide
Créer un faux outil dans un
PATHtemporaire.Vérifier :
BackgroundTask;PENDING.6. Copie des arguments
Créer les arguments avec des chaînes dynamiques.
Créer la tâche, puis libérer les chaînes originales.
Démarrer la tâche.
Le résultat doit toujours contenir les bonnes valeurs.
7. Exécution réussie
Le faux outil écrit dans stdout et retourne zéro.
Vérifier :
COMPLETED;NULL;ToolProcessResultdisponible ;is_success == TRUE.8. Code de sortie non nul
Le faux outil retourne :
Vérifier :
COMPLETED;7;FALSE.9. Erreur de lancement
Créer la tâche avec un exécutable détecté, puis supprimer le fichier avant le démarrage.
Vérifier :
FAILED;10. Annulation
Créer un faux outil long.
Démarrer la tâche puis l’annuler.
Vérifier :
CANCELLED;11. Dossier de travail
Le faux outil affiche son dossier courant.
Vérifier que le résultat correspond au dossier demandé.
12. Plusieurs tâches simultanées
Créer deux tâches à partir du même outil avec des arguments différents.
Les lancer simultanément.
Vérifier :
13. Destruction avant démarrage
Créer une tâche puis la libérer sans la lancer.
Vérifier :
14. Destruction après exécution
Exécuter une tâche, lire le résultat, puis libérer la tâche.
Vérifier la libération complète.
Noms de tests suggérés
Synchronisation des tests
Les tests doivent utiliser une
GMainLooppour attendre la fin desBackgroundTask.Ils ne doivent pas utiliser une attente active infinie.
Prévoir un timeout de sécurité afin qu’un test défectueux ne bloque pas toute la suite.
Exemple :
Le test d’annulation doit se terminer rapidement.
Makefile
Ajouter :
Règle attendue :
Ajouter la cible à :
Vérifications manuelles
Vérification mémoire
Surveiller particulièrement :
Critères d’acceptation
Le ticket est validé lorsque :
ToolRegistry;UNKNOWNetMISSINGsont correctement refusés ;ToolProcessdans un thread secondaire ;GCancellableest transmis ;CANCELLED;COMPLETED;Makefile.Démonstration finale prévue
Après validation du module, remplacer temporairement le bouton actuel :
par une vraie démonstration basée sur un faux outil ou un outil stable détecté.
Cette démonstration devra passer par :
Le bouton temporaire sera supprimé dès que le premier adaptateur OSINT réel sera disponible.
Suite prévue
Après ce ticket :
fy59 referenced this issue2026-07-18 09:13:00 +02:00