Skip to main content
Toute l’exploitation d’une box OxiMail passe par un seul binaire, oximail, et sa surface de commandes tient quelques promesses. Chaque verbe qu’une machine lit parle JSON. Chaque code de sortie veut dire la même chose partout. Chaque écriture est montrée avant d’être faite. Les diagnostics marchent quand le serveur est arrêté. Ce sont exactement les propriétés qu’exige un opérateur automatique : un script en cron, une ronde de supervision nocturne, ou un agent d’IA qui exploite la box pour son administrateur et lui rend compte. Aucune n’a été conçue pour l’IA. Elles existent parce que l’exploitation les exigeait, et un test de la CI du serveur échoue quand un nouveau verbe en casse une. C’est pour cela qu’on peut bâtir dessus. Cette page est le contrat de qui écrit cette automatisation. La référence de la CLI dresse la carte des verbes ; oximail <commande> --help reste l’autorité sur les options.

Le contrat

Par où commencer

Trois commandes donnent l’état d’une box, dans cet ordre :
  • doctor est le contrôle d’ensemble : configuration, base, file d’attente, DNS, DKIM, certificat, DANE, plan de sauvegarde, séquestre de la clé, âge du dernier exercice de restauration. Lisez chaque status : ok, warn, fail et skipped. skipped veut dire que rien n’a été mesuré, ce qui n’est jamais un succès. Chaque entrée porte aussi sa family, ses facts datés (observedAt, expiresAt) et, sur un warn ou un fail, le remedy : le verbe à proposer, tel qu’il se tape (la ronde doctor).
  • status compte les comptes, les messages, la file d’attente, les bannissements et le stockage.
  • schema check dit si le binaire accepte la base présente sur le disque (accepts, newer ou error). Lisez-le avant un déploiement ou un retour arrière.

Le mode d’emploi est livré avec le binaire

La commande affiche le mode d’emploi destiné à un agent : l’ordre des gestes, le contrat ci-dessus et ce qu’il ne faut jamais faire. C’est le binaire lui-même qui l’affiche : le mode d’emploi correspond donc toujours à la version installée. Il n’y a rien à télécharger, et aucune copie ne vieillit. Un agent qui se connecte à une box par ssh peut commencer par là.

La délégation laisse un humain aux commandes

L’automate propose, un humain applique. L’essai à blanc et les drapeaux de confirmation existent pour que la personne responsable lise ce qui va s’écrire avant que ce soit écrit. Sur une box qui sert des gens, montrez l’essai à blanc avant de lancer --apply. Le journal dit qui a décidé. Un processus qui lance les verbes pour un agent le déclare dans l’environnement de chaque verbe qu’il démarre : OXIMAIL_CLI_CHANNEL=agent et OXIMAIL_CLI_DECIDED_BY=<le nom de la personne qui a ouvert la session>. Les actes d’administration de ce verbe sont alors journalisés en cli-agent au nom de cette personne, jamais comme une commande qu’elle aurait tapée, et jamais au nom de l’agent : l’agent ne décide rien. Toute autre valeur de canal, agent sans nom, ou un nom sans agent est refusé.

Les limites, dites d’emblée

  • Le contrat engage les verbes créés après lui. Quelques anciens verbes de migration ponctuelle (backfill-* et leur famille) s’exécutent par défaut et prennent --dry-run. Leur défaut n’est pas inversé : changer un défaut déjà livré change en silence ce que fait un script. Leur --help le dit.
  • Les verbes de lecture parlent JSON ; un verbe qui produit un fichier, non. print-systemd-unit affiche une unité systemd, du texte par nature. --help montre si un verbe prend --json.
  • Une question se règle par une option, jamais par une invite sur un tube. oximail setup --config-file refuse, en la nommant, une question que son fichier ne règle pas. oximail setup dns tourne sans terminal et accepte --replace-mx, --replace-spf, --replace-dmarc et --public-ipv4 : une question de remplacement laissée ouverte garde l’enregistrement existant et se termine en sortie 1, une IPv4 publique non tranchée arrête l’exécution avant toute publication, en sortie 2 (sous-commandes de setup).
  • Le texte pour les humains n’est pas un contrat. Les messages deviennent plus clairs d’une version à l’autre. Seuls la sortie JSON et les codes de sortie sont stables.