module

Beryl::CLI::SessionLog

Journal de session : par défaut, toute commande beryl qui agit sur le parc écrit sa sortie (et ce qui s'affiche dans le terminal : questions, réponses, sortie des commandes distantes) dans un fichier de <état>/logs/ (~/.local/state/beryl/logs/, cf. Beryl::Xdg.state_dir). --no-log, n'importe où sur la ligne, désactive le journal.

Mécanique (shard session-log, extrait d'ici) : beryl se RELANCE lui-même, le parent ne fait qu'enregistrer — sous script(1) dans un terminal (vrai terminal gardé à l'enfant), par recopie écran + fichier sinon. Restent ICI les règles propres à beryl : quoi journaliser (wanted?), le libellé (label), la portée dans le nom du fichier et le dossier d'état XDG. L'enfant reçoit BERYL_SESSION_LOG (chemin du journal) : il ne se relance pas une seconde fois, et ses propres enfants (tâches détachées) non plus.

Jamais journalisées : l'aide, la lecture locale de la config, et surtout les commandes où l'on SAISIT des secrets (coffre, clés d'API) — un journal ne doit pas devenir une copie du coffre. Fichiers 0600 dans un dossier 0700 ; journaux de plus de KEEP_DAYS jours effacés à chaque nouvelle session journalisée.

Constants

DRY_RUN_BY_DEFAULT = {"sync", "boot-hd", "bootstrap", "dns", "dns-alias", "dns-record", "headscale-authkey", "lock", "monitoring", "os-upgrade", "pg-upgrade", "reboot", "rescue", "scaleway-reinstall", "scan", "ssh-config", "tang-enroll", "unlock", "upgrade", "vrack", "wipe"}

Sous-commandes en essai à blanc par défaut (--apply pour agir).

ENV_ACTIVE = "BERYL_SESSION_LOG"
FLAG = ::SessionLog::FLAG
KEEP_DAYS = 90
SKIP = {"add-domain", "add-provider", "env", "fmt", "help", "init", "keys", "list-hosts", "show", "version"}

Sous-commandes (noms longs) jamais journalisées.

Instance methods

config(base : String = dir) : ::SessionLog::Config

Réglages du shard pour beryl : nom, version, dossier, variable héritée (BERYL_SESSION_LOG, lue aussi par Beryl.log_step), rétention.

Source
label(subcommand : String, sub_args : Array(String)) : String

Libellé de la commande dans le nom du journal : upgrade-dry-run pour un essai à blanc, upgrade quand elle agit (--apply ; -W/--write-to pour scan, qui l'implique), upgrade-status pour --status (lecture de l'état d'une tâche). Les commandes sans --apply gardent leur nom. Pur.

Source
path(subcommand : String, sub_args : Array(String), now : Time, base : String = dir) : String

<dossier>/2026-10-20--23-40-28--upgrade-dry-run--aloli.net.log : date, heure, libellé de la commande, puis la portée (premier argument qui n'est pas une option), réduite aux caractères sûrs dans un nom de fichier. Pur.

Source
run(argv : Array(String), log : String) : Int32

Relance beryl (argv complet, options globales comprises) sous journal et renvoie son code de sortie ; le chemin du journal est rappelé sur stderr à la fin (shard session-log).

Source
strip_flag(argv : Array(String)) : Tuple(Array(String), Bool)

Retire --no-log d'argv (où qu'il soit). Renvoie {argv nettoyé, journal refusé ?}. Pur.

Source
wanted?(subcommand : String | Nil, sub_args : Array(String), no_log : Bool, active : Bool) : Bool

La commande doit-elle être journalisée ? active : déjà sous journal (variable BERYL_SESSION_LOG héritée). Pur.

Source