Le projet s'articule autour de deux programmes distincts qui communiquent via des tubes nommés (FIFO) :
tadmor(client) : L'interface utilisateur permettant d'envoyer des commandes de planification.erraid(démon) : Le service tournant en arrière-plan, chargé de gérer le temps et d'exécuter les tâches.
La communication entre ces deux entités s'appuie sur un protocole binaire encodé en big-endian (défini dans common/protocol.c), garantissant une lecture uniforme des données.
Le code source est réparti en trois grands dossiers pour séparer les responsabilités :
task_model.c: Gère la structure de données des tâches (Task). Cette structure est récursive, ce qui permet de créer des tâches complexes (un tableausubtaskscontient les sous-tâches).protocol.c: Regroupe les fonctions utilitaires pour lire et écrire les types de base (entiersuint16, chaînes de caractères, etc.) pour la communication.
- Utilise
getoptpour analyser les options saisies par l'utilisateur dans le terminal. - Construit le message binaire (une suite d'octets) à envoyer au serveur.
- Affiche les réponses du serveur de manière lisible, en utilisant une fonction récursive pour bien indenter les commandes imbriquées.
- Planification : Une boucle infinie vérifie chaque minute (via
tm_should_run) si une tâche doit être lancée. - Exécution (
server/executor.c) : Gère le lancement des commandes de façon récursive selon leur type :SI(Simple) : Utiliseforketexecvp. Redirige les sorties (stdout/stderr) vers des fichiers de logs avecdup2.SQ(Séquence) : Exécute les sous-tâches les unes après les autres.PL(Pipeline) : Crée des tubes (pipe()) entre les processus fils pour lier leurs entrées/sorties.IF(Conditionnelle) : Lance la première sous-tâche, analyse son code de retour, puis décide d'exécuter la brancheTHENou la brancheELSE.
Chaque tâche possède un identifiant unique qui sert de nom à son répertoire de sauvegarde. Par défaut, l'ensemble de ces données est stocké dans le répertoire /tmp/$USER/erraid/.
Voici comment sont organisés les fichiers pour une tâche donnée :
cmd/: Contient la définition de la commande (type, arguments). Pour les tâches complexes, ce dossier devient récursif (cmd/0/,cmd/1/, etc.) pour stocker les sous-tâches.timing: Fichier gérant la planification (utilise des bitmaps pour enregistrer les minutes, heures et jours d'exécution).- Historique et Logs :
times-exitcodes: Enregistre les codes de retour des anciennes exécutions.stdout: Sauvegarde la sortie standard.stderr: Sauvegarde la sortie d'erreur.
pipes/: Dossier contenant les tubes nommés (FIFO) utilisés pour la communication directe entreerraidettadmor.