module

Beryl::CLI::OsUpgrade

beryl os-upgrade <host> [--to X.Y] [--apply] [--reboot] — met à jour le SYSTÈME FreeBSD (≠ upgrade = paquets seuls). CONSCIENT DU TYPE D'INSTALL :

  • PKGBASE (base en paquets, dépôt FreeBSD-base) — le cas beryl par défaut : montée de release = REPOINTER le dépôt base_release_<minor> puis pkg upgrade -r FreeBSD-base + reboot. Pas de fusion /etc interactive. Déjà sur la dernière release : CORRECTIFS de celle-ci (même branche, sans repoint), sans avoir à préciser --to.
  • DISTRIBUTION_SETS (base en tarballs) : freebsd-update — multi-étapes + fusions interactives → beryl affiche le RUNBOOK (pas d'auto-apply).

DRY-RUN par défaut. --apply exécute (repoint + pkg upgrade), s'arrête AVANT le reboot (sûr). --reboot ajoute le reboot + attente du retour SSH (pour enchaîner une flotte). Un host protected: true refuse --apply.

Constants

BASE_LEAVES_QUERY = "pkg query -e '%a == 1 && %#r == 0' %n"

Paquets du système de base devenus inutiles : FreeBSD-* installés comme dépendance des ensembles (%a) que plus rien ne requiert (%#r = 0) — un ensemble ne les utilise plus (montée de release, paquet retiré d'un ensemble). Le ménage des paquets logiciels (recette pkg-autoremove) ne touche JAMAIS au base : c'est ici. Ni le noyau ni un ensemble, même orphelins (installés explicitement par le bootstrap, double sécurité).

BASE_REPO = "FreeBSD-base"
EXIT_FAILED = 2
EXIT_OK = 0
EXIT_USAGE = 1
IGNORE_OSV = "IGNORE_OSVERSION=yes"

Franchir un __FreeBSD_version plus récent (les paquets base de la release cible sont plus récents que le noyau courant) : mécanisme standard pkgbase. Sans lui : pkg: repository … contains packages for wrong OS version.

NOTE_OK = "à jour"
NOTE_PATCH = "correctifs en attente"
NOTE_REBOOT = "redémarrage en attente"
NOTE_SKIPPED = "pas encore installé"
NOTE_UP = "montée dispo"
SETUID_CHECK = "PERIODIC='security daily' /etc/periodic/security/100.chksetuid"

Contrôle setuid du rapport de sécurité quotidien (100.chksetuid) : il compare la liste des programmes setuid à /var/log/setuid.today et signale chaque écart par courriel. Une mise à jour du base remplace ces programmes (nouvel inode, nouvelle date) → le lendemain, un écart sans action à faire. On lance donc le script de FreeBSD lui-même juste après la mise à jour : il écrit l'écart ici et remet sa référence à jour. PERIODIC sélectionne la période, comme periodic security le fait.

Class methods

base_branch(version : String) : String

Nom de branche pkgbase pour une release X.Y (« 15.1 » → « base_release_1 »).

Source
base_orphans(output : String) : Array(String)

Noms à retirer dans la sortie de BASE_LEAVES_QUERY. Pur.

Source
fleet_hint(states : Array(HostState)) : String | Nil

Ligne d'action, SEULEMENT s'il y a quelque chose à faire (montée, correctifs, redémarrage, injoignable) : décompte non nul + commandes. nil quand tout est à jour. Pur.

Source
fleet_table(states : Array(HostState)) : String

Tableau aligné, une ligne par hôte. Un hôte sans version (pas installé) n'a que sa note : « fqdn : pas encore installé ». Pur.

Source
kernel_mismatch(output : String) : NamedTuple(installed: String, running: String) | Nil

Deux lignes (-k puis -r) → {installed, running} si elles diffèrent. Pure.

Source
parse_version(s : String) : Tuple(Int32, Int32, Int32 | Nil) | Nil

Parse « 15.0-RELEASE-p10 » → {major, minor, patch?}. nil si illisible.

Source
pending_kernel(shell : Beryl::Apply::Shell) : NamedTuple(installed: String, running: String) | Nil

Noyau INSTALLÉ (freebsd-version -k) différent du noyau EN SERVICE (-r) → {installed, running}, sinon nil : correctifs posés, redémarrage en attente.

Source
pending_upgrades?(dry_run_output : String) : Bool

Vrai si la sortie d'un pkg upgrade -n annonce des paquets à modifier (« Number of packages to be upgraded: 43 ») ; faux si « … is up to date ».

Source
run(config_root : String, args : Array(String)) : Int32
Source
setuid_changes(output : String) : NamedTuple(replaced: Array(String), added: Array(String), removed: Array(String))

Écart unifié de 100.chksetuid (lignes -/+ de ls -lid, chemin en dernier champ) → chemins remplacés (des deux côtés), ajoutés, retirés. Pur.

Source

Nested types