Aller au contenu
English
English
medium

dsoxlab : fichiers, variables d'environnement et codes de sortie

Read this page in English

15 min de lecture

dsoxlab conserve son état à deux endroits, et nulle part ailleurs : dans le catalogue que vous jouez, pour la progression, et sous votre répertoire personnel, pour le journal, les caches et le state Terraform. Cette page de référence liste chaque fichier, chaque variable d'environnement et chaque code de sortie de la version 0.2.5, avec le geste que chacun appelle. Elle s'adresse à qui veut sauvegarder sa progression, retrouver un journal après un échec, ou appeler dsoxlab depuis un script. Ces emplacements sont tenus en accord avec le code par un test du projet : ils ne dérivent pas en silence.

  • Situer la base de progression et le contexte, qui vivent dans le catalogue.
  • Retrouver le journal, les caches et le state Terraform sous votre répertoire personnel.
  • Régler la langue, le provider ou le délai d'attente par variable d'environnement.
  • Interpréter chaque code de sortie, et distinguer un « non » d'un « impossible ».
  • Exploiter la sortie --json sans dépendre d'un libellé traduit.

La progression appartient au catalogue, pas à la machine. Deux catalogues côte à côte gardent des historiques séparés, copier le répertoire d'un catalogue copie votre historique avec lui, et le supprimer supprime le sien. C'est ce qui rend une sauvegarde triviale : un seul fichier à copier.

CheminContenuÉcrit par
<catalogue>/.dsoxlab.dbBase SQLite : les notes (results) et les indices pris (hint_requests)check, submit, hint
<catalogue>/.dsoxlab-context.jsonSection, niveau, langue, lab, cible et provider actifs, plus la position de lecture du coursuse, run, course
<catalogue>/ssh/id_ed25519 et .pubLa paire de clés SSH déployée sur les machines des labs vminstructor bootstrap

Les deux premiers sont à ignorer dans le .gitignore du catalogue, et les catalogues publiés le font. La paire de clés n'est jamais commitée non plus : la privée ne doit pas l'être, et la publique ne sert à rien sans elle, d'où la règle d'une paire par clone, produite sur chaque machine qui provisionne.

Tout le reste suit les conventions XDG et se déplace avec les trois variables correspondantes. <catalog-id> est le repo.id du meta.yml du catalogue, ce qui fait que deux clones du même catalogue partagent un seul state Terraform et un seul verrou.

CheminContenuDéplacé par
~/.local/state/dsoxlab/dsoxlab.logJournal complet de chaque commande, quelle que soit la verbositéXDG_STATE_HOME
~/.local/state/dsoxlab/<catalog-id>/terraform/<provider>/Répertoire de travail et state Terraform, un par providerXDG_STATE_HOME
~/.local/state/dsoxlab/<catalog-id>/cloud-init/Templates cloud-init recopiés depuis l'outil pour le provisionnementXDG_STATE_HOME
~/.local/state/dsoxlab/<catalog-id>/dsoxlab.lockVerrou d'écriture de ce catalogueXDG_STATE_HOME
~/.local/state/dsoxlab/<catalog-id>/labs/Empreintes du répertoire de travail, prises par run, pour distinguer un lab prêt d'un lab en coursXDG_STATE_HOME
~/.local/state/dsoxlab/catalogue-actifIdentifiant du catalogue actifXDG_STATE_HOME
~/.cache/dsoxlab/<catalog-id>/inventory.jsonInventaire Ansible généréXDG_CACHE_HOME
~/.cache/dsoxlab/<catalog-id>/ssh_configConfiguration OpenSSH générée pour les hôtes du labXDG_CACHE_HOME
~/.cache/dsoxlab/version-check.jsonDernière version vue sur PyPI, et sa dateXDG_CACHE_HOME
~/.local/share/dsoxlab/demo/Catalogue de démonstration installé par dsoxlab demoXDG_DATA_HOME
~/.local/share/dsoxlab/catalogs/Catalogues installés par catalog add, un sous-répertoire par identifiantXDG_DATA_HOME
~/.ssh/config.d/<catalog-id>.confFragment SSH des hôtes du lab, pour que ssh, scp et votre IDE les atteignent par leur nomaucune

Deux de ces fichiers sont des caches, et les perdre ne coûte qu'une régénération : inventory.json et ssh_config sont reconstruits à la prochaine commande qui en a besoin. Tout ce qui pointerait sur le ssh_config généré, un Include ou un profil d'IDE, doit donc tolérer sa disparition. Le fragment de ~/.ssh/config.d/ est celui qui est stable, à condition que ~/.ssh/config porte un Include de ce répertoire avant tout bloc Host : dsoxlab n'écrit pas cette ligne à votre place, et le signale à chaque provision tant qu'elle manque.

Le state Terraform est délibérément hors du catalogue : un state posé dans un dépôt de labs finit commité, et un state commité ment. La complétion du shell écrit en dehors de ces deux familles, une fois : ~/.zfunc/_dsoxlab plus une ligne dans ~/.zshrc, ou ~/.bash_completion.d/dsoxlab plus une ligne dans ~/.bashrc.

Trois chemins ont été documentés par le passé et figurent ici pour que personne ne les cherche à nouveau. Il n'existe aucun ~/.config/dsoxlab/config.yaml, ni aucun fichier de configuration utilisateur : ce qui se règle passe par le contrat du meta.yml, par le contexte actif de dsoxlab use, ou par une variable d'environnement. Il n'existe aucun ~/.local/share/dsoxlab/progress.db : les notes vivent dans <catalogue>/.dsoxlab.db. Et XDG_CONFIG_HOME n'est lue nulle part : les trois variables XDG citées plus haut sont les seules que dsoxlab honore.

Une variable d'environnement vaut le temps d'un appel, ou d'une session de shell, et passe devant le fichier de contexte du catalogue. C'est le bon outil pour un essai ponctuel, une commande dans un script, ou un délai à allonger sur une machine lente.

VariableEffet
LAB_HOMERacine du catalogue à jouer, au lieu de la détection automatique
DSOXLAB_LANGLangue d'affichage, en ou fr, prioritaire sur le fichier de contexte
DSOXLAB_PROVIDERProvider d'infrastructure, prioritaire sur dsoxlab use --provider
DSOXLAB_TARGETCible par défaut d'un lab vm, quand la session n'en fixe aucune
DSOXLAB_PAGERPagineur de course et challenge, puis PAGER, défaut less -R
DSOXLAB_LOGDSOXLAB_LOG=debug équivaut à -vv
DSOXLAB_HOST_READY_TIMEOUTSecondes d'attente d'un hôte fraîchement provisionné, défaut 180
DSOXLAB_NO_UPDATE_CHECKÀ 1, coupe l'avis quotidien de nouvelle version
DSOXLAB_OUTSCALE_PROFILE, DSOXLAB_AWS_PROFILEProfil d'identifiants de ces providers

Deux autres sont posées par dsoxlab pour que les tests d'un lab les lisent, et ne se règlent pas à la main : DSOXLAB_TARGET_HOST, l'hôte que les tests doivent inspecter, ce qui permet à un lab multi-distributions de valider la cible choisie, et DSOXLAB_LAB_SESSION, l'identifiant du lab dans la session ouverte par run.

Un code de sortie est le contrat le plus dur que l'outil expose : un document JSON peut gagner un champ, une phrase traduite peut changer de mot, mais un code, une fois qu'un script le lit, ne peut plus bouger sans casser cet appelant en silence. Ils vivent tous au même endroit du code, dans un énuméré, et deux tests tiennent la table honnête : aucune valeur ne sert deux fois, et chaque code doit figurer dans la documentation.

CodeCe qu'il veut direLe geste qu'il appelle
0La commande a fait ce qu'on lui demandaitRien
1La commande a tourné, et la réponse est non : identifiant de lab inconnu, test rouge, hôte qui ne répond pas, aucun contexte actifLire le message ; la réponse porte sur votre travail, pas sur votre installation
2La commande n'a pas pu s'exécuter : infrastructure non provisionnée, provider non empaqueté, fixture déclarée absente, point de reprise exigé impossiblePréparer quelque chose ; ce n'est pas une faute dans votre travail
3Terraform n'est pas installé, donc provision et destroy n'ont aucun moyen d'agirL'installer
4Terraform a répondu, et il a échouéLire sa sortie ; dsoxlab nomme les causes qu'il reconnaît, comme un pool de stockage plein ou absent
5Un provision a laissé des machines orphelines, définies sur l'hyperviseur mais absentes du state, ou en a trouvé avant de commencerJouer la ligne virsh undefine que le message affiche
6Un destroy n'a pas pu retirer ces orphelinesLes retirer à la main, puis rejouer destroy
7Une autre commande dsoxlab tient déjà le verrou de ce catalogueRéessayer ; c'est le seul code où réessayer est juste, et le message nomme le processus qui le détient
8Un provision a rendu la main sans que tous les hôtes ciblés répondentdsoxlab status dit lequel et pourquoi ; souvent plus de temps ou plus de vCPU
9doctor --strict : un contrôle requis a échoué, c'est établiRéparer ce que le tableau nomme
10doctor --strict : un contrôle requis n'a pas pu être mesuréRemesurer ; rien n'est conclu, donc rien n'est validé
127Un exécutable attendu n'est pas dans le PATHL'installer ; 127 est le code que le shell rend lui-même ici
130Un Ctrl-CLe message donne le geste de reprise

Trois distinctions sont délibérées, et ce sont elles qui justifient cette table. Le 7 est le seul code sur lequel réessayer, parce que sa cause est temporaire par nature ; tous les autres décrivent un état qui ne changera pas de lui-même. Le 9 et le 10 sont séparés parce que les gestes diffèrent, réparer contre remesurer, et quand les deux coexistent, 9 l'emporte : une certitude est plus forte qu'une ignorance. Le 1 et le 2 séparent « non » de « impossible » : un check qui échoue sort en 1, l'outil a travaillé ; un run dont une fixture manque sort en 2, rien n'a été mesuré.

doctor sans --strict sort en 0 quoi qu'il trouve, délibérément : pour un humain, un diagnostic n'est pas un échec, et le verdict vit dans le champ ok de --json. C'est --strict, et non --json, qui traduit le diagnostic en 9 ou 10.

Tout ce que dsoxlab affiche est fait pour des yeux, des tableaux dont la largeur suit le terminal, des couleurs, des barres de progression, et c'est fait pour bouger. --json rend un document à la place, et trois règles le gouvernent. La sortie standard porte le document et rien d'autre : le rappel du contexte, les astuces et l'avis de mise à jour partent sur la sortie d'erreur. Chaque document porte un champ schema, son premier, dont la valeur courante est 1. Et un verdict se lit dans une clé et un jeton stable, key, state, kind, status, cause, jamais dans un libellé traduit posé à côté pour l'affichage.

Une conséquence mérite d'être dite à part : --json change la forme de la sortie, jamais le verdict ni le code de retour. Un check sur un lab en échec sort en 1 avec ou sans lui, et rend son document d'abord, pour qu'un appelant recevant un code non nul puisse lire ce qui n'allait pas. Lisez le code de retour en premier, le document ensuite.

Fenêtre de terminal
dsoxlab list-labs --json | jq '.count'
dsoxlab doctor --json --strict; echo "code : $?"
dsoxlab check premiers-pas --json | jq '.check.ok'

doctor --json --fix est refusé, et le dit sur la sortie d'erreur : les commandes de remédiation écrivent sur la sortie standard, et le document en deviendrait illisible. On lit le diagnostic d'abord, on agit ensuite.

  • La progression vit dans <catalogue>/.dsoxlab.db, par catalogue : un fichier à copier pour la sauvegarder.
  • Le journal complet est toujours dans ~/.local/state/dsoxlab/dsoxlab.log, et le state Terraform sous ~/.local/state/dsoxlab/<catalog-id>/.
  • Il n'existe aucun fichier de configuration utilisateur : contrat, contexte actif ou variable d'environnement.
  • Une variable DSOXLAB_* passe devant le fichier de contexte, le temps d'un appel.
  • 7 se réessaie, 9 se répare, 10 se remesure ; 1 est un « non », 2 un « impossible ».
  • --json change la forme, jamais le verdict ni le code ; on lit le code en premier.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens ce site gratuitement, sans publicité, sans profilage et sans compte à créer. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn