module

Beryl::CLI

Point d'entrée CLI de beryl.

Tous les chemins de configuration partent de $XDG_CONFIG_HOME/beryl/ (= ~/.config/beryl/ par défaut, conforme à la https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html[spec XDG Base Directory]). -c PATH override explicitement, typiquement pour des tests. Structure figée (voir docs/adr/ADR-014-beryl-config-tree.adoc) :

~/.config/beryl/ _default.yml # socle FreeBSD (sans clés SSH) .env.yml # credentials providers par domaine <domaine>.yml # identité d'un domaine (clés SSH, ovh.ssh_key_name) <domaine>/ # contenu du domaine (hosts directs, groupes) <host>.yml # → <host>.<domaine> <groupe>.yml + <groupe>/<host>.yml

Migration depuis v0.2.0 : avant le 8 mai 2026, beryl utilisait +~/.beryl/+ (non-XDG). Pour migrer : mv ~/.beryl ~/.config/beryl.

Constants

EXIT_BAD_OPTION = 2

Code de sortie d'une ligne de commande mal formée (option inconnue, valeur manquante).

GLOBAL_FLAGS_WITH_VALUE = {"-c", "--config", "--transport"}

Options globales qui consomment l'argument suivant (forme « -c VALEUR »).

LEGACY_ALIASES = {"apply" => "sync", "a" => "sync"}

Anciens noms gardés comme alias : apply (et a) est devenu sync — tâches planifiées, scripts et habitudes continuent de marcher.

SUBCOMMAND_ALIASES = SUBCOMMANDS.each_with_object({} of String => String) do |__temp_106, h| name, short, _desc = __temp_106 if short.empty? else h[short] = name end end

Alias courts → nom long, DÉRIVÉS de SUBCOMMANDS (source unique).

SUBCOMMANDS = [{"add-domain", "ad", "Ajoute un domaine à une société (zone DNS)"}, {"add-provider", "ap", "Ajoute un fournisseur à une société (credentials)"}, {"bake-seed", "bs", "cloud-init seed.img pour Ubuntu Server live"}, {"boot-hd", "bh", "Bascule sur le disque via l'API (inverse rescue)"}, {"bootstrap", "b", "Installe FreeBSD 15 (mfsBSD-in-QEMU)"}, {"build-status", "bst", "État des builds de paquets poudriere d'un builder (en cours, échecs, durées)"}, {"dns", "", "Pose les records DNS (forward + reverse + rename)"}, {"dns-alias", "", "Pose un alias DNS A/AAAA <label>.<zone> → IP d'un host (forward seul ; ex. failover headscale)"}, {"dns-record", "", "Pose un enregistrement DNS quelconque (A, AAAA, CNAME, MX, TXT) dans une zone gérée"}, {"env", "e", "Gère le coffre de credentials chiffré (.env.toml.age)"}, {"fmt", "", "Normalise les host.yml (clés triées, commentaires gardés, FQDN en tête)"}, {"follow-install", "fi", "Suit l'installation FreeBSD en cours"}, {"headscale-authkey", "hak", "Génère une pre-auth key sur le serveur Headscale (à injecter dans un node)"}, {"help", "h", "Aide globale ou d'une sous-commande précise"}, {"info", "nf", "Inventaire serveurs (gamme/CPU/RAM/disques ; --usage = live ; --refresh = MAJ via API OVH)"}, {"init", "i", "Initialise ~/.config/beryl/<société>/ + providers/domaines"}, {"keys", "k", "Clés ZFS des serveurs : import dans le coffre [tang], séquestre papier PDF — DRY-RUN par défaut"}, {"list-hosts", "ls", "Liste les hôtes de toutes les sociétés"}, {"lock", "l", "Verrouille les pools chiffrés (unload-key + export) — inverse d'unlock"}, {"monitoring", "mo", "Monitoring OVH des serveurs (état ; on/off — DRY-RUN par défaut, --apply pour exécuter)"}, {"os-upgrade", "", "Met à jour le système FreeBSD (correctifs via --apply ; runbook pour une montée de release)"}, {"pg-upgrade", "", "Migre PostgreSQL vers une version majeure (pg_upgrade) — DRY-RUN par défaut, --apply pour exécuter"}, {"prep-rescue", "pr", "HTTP local pour préparer un rescue Debian"}, {"reboot", "rb", "Reboot d'un host (--soft via SSH ou --hard via API)"}, {"rescue", "r", "Bascule un hôte en rescue via l'API hébergeur"}, {"rotate-key", "", "Rotation des clés SSH d'un host/domaine"}, {"scaleway-reinstall", "", "Réinstalle un serveur Scaleway via l'API"}, {"scan", "s", "Détecte les disques et propose un YAML host"}, {"show", "sh", "Détails d'un hôte (config mergée complète)"}, {"ssh-config", "", "Écrit ~/.ssh/beryl.conf : hosts cachés derrière le vRack, rebond à replis — DRY-RUN par défaut"}, {"sync", "sy", "Synchronise packages/users/clés SSH (recettes) — ex-`apply`"}, {"status", "st", "État pools / services chiffrés d'un host"}, {"tang-enroll", "te", "Enrôle les pools chiffrés via Tang"}, {"update", "", "pkg update (rafraîchit le catalogue) sur une portée"}, {"upgrade", "", "pkg upgrade sur une portée — DRY-RUN par défaut, --apply pour exécuter"}, {"unlock", "u", "Déverrouille les pools chiffrés (clé du coffre ou du poste → SSH ; --key-file pour le séquestre)"}, {"version", "v", "Affiche la version"}, {"vrack", "", "Gère le vRack OVH (statut / rattachement)"}, {"wipe", "w", "Efface un disque sur un hôte en rescue"}, {"zpool-create", "", "Crée les pools data déclarés sur un serveur déjà installé (chiffrés : clé du poste) — DRY-RUN par défaut"}]

Source UNIQUE des sous-commandes : {nom, alias court ("" si aucun), description}. TRIÉE PAR NOM (règle par défaut : on garde l'ordre alphabétique en insérant). L'aide ET les alias en sont dérivés → ils restent triés et cohérents automatiquement.

Class methods

default_config_root

Racine de config par défaut (dynamique : honore $XDG_CONFIG_HOME si défini au runtime). Voir Beryl::Xdg.config_dir.

Source
extract_account_flag(args : Array(String)) : String | Nil

Même idée pour --account=X. Utilisé par show qui ne passe pas par un OptionParser dédié.

Source
extract_domain_flag(args : Array(String)) : String | Nil

Extrait --domain=X d'un tableau d'arguments sans le consommer (helper pour les sous-commandes qui veulent y accéder avant le parser OptionParser complet). Version très simple, limitée à --domain=X pour l'instant.

Source
handle_option_errors(parser : OptionParser) : OptionParser

Erreurs d'options de TOUTES les commandes : message clair qui renvoie à l'aide de la commande, code 2. Sans cela, OptionParser lève une exception que les commandes affichent en « erreur inattendue — OptionParser::… ». Retourne le parser, pour s'écrire handle_option_errors(parser).parse(args).

Source
known_subcommand?(name : String) : Bool

Sous-commande (nom long) connue ? Pur.

Source
option_command(parser : OptionParser) : String

Nom de la commande tiré du banner, 1re ligne de l'aide (« USAGE : beryl env migrate [--force] » → « beryl env migrate ») ; lu au moment de l'erreur, une fois le banner posé.

Source
run(argv : Array(String) = ARGV) : Int32
Source

Nested types