Template syntax

Updated 5 Novembre 2026

Un modèle est un fichier de configuration ordinaire. Sa première ligne peut être un enregistrement de contrôleparamètres (format=…, path=…), conditions (ac_install_merge==on) et les substitutions dans les valeurs (#-variable-#).

# Calculate format=samba name=smb.conf path=/etc [parameters] [conditions && conditions]

Vous pouvez répartir l'en-tête du modèle sur plusieurs lignes : si la première commence par # Calculate et se termine par un seul \, la ligne suivante est considérée comme sa continuation. Une continuation sans # est appliquée, une ligne de continuation qui commence par # conduit à Gabarit incorrect, et deux \ d'affilée cassent l'analyse.

L'enregistrement de contrôle n'est pas obligatoire. Sans en-tête, le modèle est traité comme un fichier "brut"

L'enregistrement de contrôle n'est pas obligatoire. Sans en-tête, le modèle est traité comme un fichier "brut" : il réécrit entièrement la cible (format=raw, par conséquent append=replace), et le chemin est pris de la position courante - depuis la racine du dépôt, en prolongeant les répertoires situés plus haut dans l'arborescence des modèles. Conséquence pratique : si vous placez un fichier sans en-tête dans un sous-répertoire, son nom se retrouve dans le chemin du résultat, et la variable d'action doit figurer dans l'en-tête de l'élément de premier niveau - sinon le sous-arbre sera ignoré sans aucun message. niveau - sinon le sous-arbre sera ignoré sans aucun message.

si vous placez un fichier sans en-tête dans un sous-répertoire, son nom se retrouve dans le chemin du résultat, et la variable d'action doit figurer dans l'en-tête de l'élément de premier niveau - sinon le sous-arbre sera ignoré sans aucun message. niveau - sinon le sous-arbre sera ignoré sans aucun message.

Paramètres de l'en-tête du fichier

paramètre valeur
format= format du fichier de configuration : kde, samba, openrc, procmail, xml_xfce, json, patch, diff, kernel, dconf, world, contents, sqlite, backgrounds, plasma et autres. Sans lui, le format est raw. Liste et différences →
comment= caractère de commentaire du fichier cible (#, ;, --) ; la valeur spéciale xml/XML active les paires <!-- -->
append= la méthode d'ajout : join, before, after, replace, remove, skip, patch, clear
path= le répertoire où se trouvera le fichier de configuration
name= nom du fichier de configuration (par défaut, le nom du fichier du modèle)
link= le fichier dont est tiré le texte du modèle (le modèle lui-même n'est pas lu) ; avec symbolic, la cible du lien symbolique créé
symbolic créer un lien symbolique vers le fichier de link=
mirror fusionner seulement si le fichier de configuration existe ; s'il est donné par link= et qu'un tel fichier n'existe pas, le fichier de destination est supprimé
force supprimer le fichier existant avant l'écriture (activé automatiquement avec symbolic)
protected ne pas supprimer le fichier lorsque le paquet auquel le modèle est associé est supprimé
chmod= droits d'accès du résultat
chown= propriétaire et groupe (user:group)
autoupdate après la fusion, transférer le fichier de configuration modifié dans le système sans dispatch-conf
run= l'interpréteur qui exécute le résultat immédiatement après le traitement du modèle
exec= identique, mais le script est mis en file d'attente après tous les modèles habituels
env= module de variables (install, desktop, update, …) ; si le module n'est pas disponible, le modèle est omis
module= nom du module de modèles
merge= à la fin, configurer les paquets listés (sys-apps/openrc,sys-boot/grub)
postmerge= identique, mais après pkg_postinst() lors de la compilation du paquet
rebuild= abaisser la version du paquet pour qu'il soit reconstruit lors de la mise à jour du système
restart=, start=, stop= redémarrer/démarrer/arrêter les services séparés par des virgules
multiline, dotall modes des expressions régulières ; lus uniquement par le format patch
stretch, convert, dconf paramètres des formats backgrounds et dconf

Un paramètre invalide dans l'en-tête est une erreur : l'utilitaire affiche paramètre d'en-tête incorrect : '<name>' et ignore le modèle.

Paramètres de l'en-tête du répertoire

Le répertoire de modèles est décrit par un fichier .calculate_directory qu'il contient. L'ensemble de paramètres est différent et nettement plus court :

append=, path=, name=, link= (copie le contenu du répertoire), chmod=, chown=, mirror, subvolume (créé comme sous-volume btrfs), autoupdate, env=, module=, merge=, postmerge=, rebuild=, restart=, start=, stop=.

Il n'y a ici ni format=, comment=, symbolic, protected, force, run=, exec=, multiline, dotall - ils concernent le fichier.

Pour un répertoire, les valeurs autorisées sont append=join|remove|skip|clear, et link= ne se combine qu'avec append=join ou append=replace.

Un répertoire sans .calculate_directory n'est pas une erreur

.calculate_directory

# Calculate append=skip

Sinon un répertoire superflu apparaîtra dans le système (vous pouvez le vérifier à l'avance par une fusion hors ligne).

Valeurs par défaut qu'il est utile de connaître

Si l'en-tête n'a pas d'append=, il est choisi selon le format :

  • patch et les formats "exécutables" (diff, dconf, contents, sqlite, backgrounds) → patch ; de plus, pour eux append= doit être patch : toute autre valeur sera rejetée par l'utilitaire avec le message Option incorrecte 'append=<value>' dans le modèle <file>;
  • tout autre format → join (les deux fichiers sont fusionnés) ;
  • raw, bin → replace (le fichier est écrit en entier).

Par défaut, name= est pris du nom du fichier du modèle, path= du répertoire parent du modèle ou hérité de .calculate_directory.

Variables et fonctions

La valeur d'une variable est substituée par #-name-#, celle d'un autre module par #-module.name-# :

HOSTNAME="#-os_net_hostname-#"
Modes "#-install.os_install_x11_resolution-#"

Les fonctions s'écrivent de la même façon, mais avec des parenthèses d'arguments - elles sont obligatoires même sans argumentsle moteur les distingue à la présence de (). Les fonctions de condition sont souvent nécessaires :

  • pkg(cat/pkg), merge(cat/pkg), mergepkg(cat/pkg) - à propos d'un paquet installé ou en cours de configuration. mergepkg() signifie "c'est exactement ce paquet qui est configuré" et "le paquet est installé" : la version est prise de la base /var/db/pkg. Si la liste des paquets en cours de configuration est vide, merge() renvoie vrai ;
  • exists(path[,root]) - indique si un fichier ou un répertoire existe ; au lieu de 1 il renvoie le type (f, d, l, …), donc la condition s'écrit habituellement exists(/etc/x)!= ;
  • ini(section.key) - lit une variable de la pile ini.env ;
  • grep(file, regular expression) - la première correspondance issue du fichier ;
  • cut(number[separator[string]]) - un fragment de chaîne ; par défaut le séparateur est -, et la chaîne est prise de cl_pass_file - le nom du fichier de modèle en cours de traitement (pour un répertoire, son nom). Les champs sont numérotés à partir de zéro : cut(0,-,a-b-c) → a, cut(1,-,a-b-c) → b, cut(2,-,a-b-c) → c ; un numéro au-delà de la fin de la chaîne donne une valeur vide, un numéro négatif - une erreur de modèle (cut(-1,-,a-b-c) interrompt le modèle avec Erreur dans le gabarit) ;
  • in(variable,values…), groups(groups…), ls(directory,pattern), env(module.variable), case(type,variable), list(variable,index), sum(), push()/pop() (une pile entre les modèles).

Vous pouvez créer et modifier des variables de fonctions à l'intérieur d'un modèle ; leur portée est le modèle courant, et via push()/pop() une valeur est transmise à un autre.

Conditions dans l'en-tête

Les conditions viennent après les paramètres sur la même ligne. Opérateurs : >, <, ==, !=, >=, <=, et pour les versions aussi <> (hors de l'intervalle) et =>, <= (bornes de l'intervalle, données séparées par des virgules).

  • plusieurs conditions séparées par une espace sont combinées par "ET" ;
  • liens explicites : && ("ET"), || ("OU"), "ET" est prioritaire ;
  • une partie droite vide (!=, ==) signifie "la valeur n'est pas vide" / "la valeur est vide".
# Calculate cl_ver>=3.5 os_linux_shortname==CLDX||os_linux_shortname==CLD

Cela se lit comme "version ≥ 3.5 et (CLDX ou CLD)".

La partie gauche d'une condition peut être un appel de fonction sans délimiteurs : exists(/etc/f)==, ini(x.y)!=off, checkdev(wan0)!=.

Blocs conditionnels dans le corps

Un bloc de texte est substitué si la condition est vraie. Il commence par #?condition# en début de ligne et se termine par #name_of_the_first_condition_variable# :

#?os_locale_language==ru&&pkg(media-gfx/cldx-themes)!=#
current_theme calculate_ru
#os_locale_language#

À l'intérieur du bloc, comme partout ailleurs, les substitutions #-…-# sont disponibles ; les variables sont calculées avant les fonctions, donc vous pouvez passer une #-variable-# comme argument d'une fonction.

Modifier, ajouter et supprimer des entrées

La méthode dépend du format, mais l'ensemble de base des préfixes de noms est le suivant :

  • key=value - définir une valeur (l'ajouter si la clé n'existait pas) ;
  • !key= - supprimer la clé ; fonctionne dans tous les formats de type ini (samba, kde, openrc, procmail, postfix, …) ;
  • +key=value - ajouter une valeur à une liste partagée (samba, ldap) ;
  • -key=value signifie formellement "remplacer", mais aucune action ne se cache derrière signifie formellement "remplacer", mais aucune action ne se cache derrière : le code n'attribue pas d'action au préfixe

    -key=value signifie formellement "remplacer", mais aucune action ne se cache derrière signifie formellement "remplacer", mais aucune action ne se cache derrière : le code n'attribue pas d'action au préfixe -, et le comportement se réduit à une écriture ordinaire. Dans kde, c'est pire : +//- au niveau de la clé ne sont pas reconnus du tout et restent au niveau de la clé ne sont pas reconnus du tout et restent dans le nom, donc , donc +key= créera un paramètre nommé créera un paramètre nommé +key, qui ne correspondra jamais à , qui ne correspondra jamais à key. Dans . Dans kde, supprimez uniquement avec , supprimez uniquement avec !..

    +//- au niveau de la clé ne sont pas reconnus du tout et restent au niveau de la clé ne sont pas reconnus du tout et restent dans le nom, donc , donc +key= créera un paramètre nommé créera un paramètre nommé +key, qui ne correspondra jamais à , qui ne correspondra jamais à key. Dans . Dans kde, supprimez uniquement avec , supprimez uniquement avec !..

Au niveau de la section, ! avant un nom de groupe le supprime, - le remplace entièrement.

Voir aussi