Complete Guide to Calculate Templates
Updated 5 Novembre 2026
Introduction
Traditionnellement, dans les distributions Linux, les paramètres des applications sont stockés dans des fichiers texte, en règle générale dans le répertoire /etc, plus rarement dans /var. Les formats de ces fichiers de configuration varient : des simples variable=value aux constructions C plus complexes, ou rédigés en XML.
Une approche apparemment simple assure une stabilité exceptionnelle dans le fonctionnement des applications, car seul le système de fichiers veille à la préservation des paramètres.
Les différentes distributions Linux proposent en règle générale leurs propres programmes de configuration des applications. Malheureusement, cette approche présente un avantage incontestable en convivialité, mais aussi plusieurs inconvénients :
-
l'utilisateur est lié à un programme de configuration déterminé (la distribution) ;
-
le nombre de paramètres est, en règle générale, limité par l'interface du programme ;
-
la modification directe des paramètres devient difficile, car le programme réécrit le fichier lors des modifications.
Particularités de l'utilisation des modèles
Dans les utilitaires Calculate 2 et 3, l'approche des modèles a été profondément retravaillée et présente plusieurs différences avec la première version :
-
Le principal mode de transfert des modèles est leur ajout aux fichiers de configuration du système. Tous les formats de fichiers populaires sont pris en charge.
-
Un modèle est fusionné avec un fichier de configuration par conversion au format XML. Le format du fichier modèle peut différer de celui du fichier de configuration.
-
Un fichier modèle peut contenir un en-tête décrivant les méthodes de fusion.
-
Les noms des variables intégrées ont été renommés selon le type.
Modèles d'installation
Le programme Calculate remplace la modification directe des fichiers de configuration par la création de modèles.
Formats de fichiers
Selon la méthode de stockage des données, les fichiers modèles peuvent avoir l'un des formats listés :
-
apache, kde, bind, postfix, proftpd, samba, procmail, ldap, dovecot, xml_xfce, xml_xfcepanel, xml_gconf, xml_gconf_tree, compiz, plasma, squid, dhcp, openrc, kernel, json, world - formats de fichiers de configuration des applications courantes
-
bin - format de fichiers binaire
-
raw - texte brut
-
patch - un modèle pour l'application d'expressions régulières (utilise le mode de fusion patch spécial).
-
diff - un modèle pour appliquer des correctifs obtenus par la commande diff
-
dconf - un fichier de modification des paramètres dans le service dconf de l'utilisateur
-
ldif - un format textuel de représentation des enregistrements du service d'annuaire ou de leurs modifications
-
contents - un format spécialisé pour changer le paquet auquel appartient un fichier
-
backgrounds - un format spécialisé pour créer des images d'arrière-plan
- sqlite - un format pour modifier le contenu des bases de données SQLite ; le moteur accepte ce format - un format pour modifier le contenu des bases de données SQLite ; le moteur accepte ce format : le corps du modèle est exécuté comme un script SQL, donc une requête incorrecte renvoie un avertissement de l'interpréteur SQLite (par exemple,
sqlite - un format pour modifier le contenu des bases de données SQLite ; le moteur accepte ce format - un format pour modifier le contenu des bases de données SQLite ; le moteur accepte ce format : le corps du modèle est exécuté comme un script SQL, donc une requête incorrecte renvoie un avertissement de l'interpréteur SQLite (par exemple,
near "BODY": syntax errorsur un corpsSELECT 1;). Comme les autres formats exécutables, il exige le mode de fusionpatch:# Calculate format=sqlite append=join …est rejeté. est rejeté.# Calculate format=sqlite append=join …est rejeté. est rejeté.
Pour le format kde, les paramètres '-', '+' des éléments à l'intérieur d'une section ne sont pas traités.
Les noms de paramètres au format openrc ne sont pas sensibles à la casse.
Le format ldif n'est disponible qu'en présence du module ldap des utilitaires Calculate. Sans env=, l'en-tête n'est pas accepté avec ce module : Paramètre d'en-tête de modèle incorrect : 'format=ldif' ; avec env=ldap sur un système sans le module, le modèle est ignoré sans message d'erreur.
Le format dconf est disponible dans les modèles de configuration du profil utilisateur, en présence du paquet gnome-base/dconf. Le paquet seul ne suffit pas : dbus-run-session et su sont également nécessaires, sinon le modèle se termine par le message Le format 'dconf' est indisponible.
Éléments de contrôle
Outre les paramètres des services rédigés dans le format d'origine du programme, les fichiers modèles contiennent des enregistrements de contrôle, que l'on peut schématiquement diviser en plusieurs types.
Variable
Une variable est un élément texte nommé du modèle, remplacé par une valeur dans le fichier de configuration correspondant.
Une variable possède un nom, une valeur et une portée.
-
nom - lettres latines et chiffres
-
valeur - le texte de remplacement (créé dans le programme)
-
portée - s'applique globalement à tous les modèles ou localement à un seul
Les variables se divisent en variables de modèles et variables de fonctions.
Les variables de modèles ont une portée globale, c'est-à-dire que toute variable de modèle disponible pour le programme peut être utilisée dans n'importe quel modèle. La valeur d'une variable ne peut pas être modifiée dans un modèle.
Les variables de fonctions peuvent être créées dans un modèle ; la valeur d'une variable peut aussi être modifiée dans un modèle. La portée d'une variable de fonction est le modèle courant.
Pour transmettre des valeurs de variables de fonctions du modèle courant à un autre modèle, on utilise la pile des variables de fonctions de modèles (LIFO)seule la valeur passe dans l'autre modèle. Le nom créé par pop() appartient au modèle récepteur et n'est déjà plus disponible dans un troisième modèle, il faut donc lire la pile dans le même fichier où vous allez utiliser la variable.
Pile des variables de fonctions de modèles
Une pile (LIFO - "dernier entré, premier sorti") pour stocker les valeurs des variables de fonctions. Disponible globalement pour tous les modèles ; les fonctions de modèles push() - écriture et pop() - lecture sont utilisées. L'écriture et la lecture sont possibles aussi bien dans un même modèle que dans des modèles différents.
En-tête
L'en-tête est un enregistrement de contrôle du modèle qui définit comment le modèle sera fusionné avec le système. L'en-tête du modèle s'écrit en première ligne du fichier et a la forme suivante :
# Calculate parameter1=value1 parameter2 [parameter3=value3 ...]
Le contenu de l'en-tête peut être réparti sur plusieurs lignes. Dans ce cas, chaque ligne de l'en-tête, sauf la dernière, doit se terminer par le caractère "\" (barre oblique inverse).
En l'absence d'en-tête, les paramètres du fichier modèle sont déterminés d'après les valeurs par défaut.
Paramètres autorisés :
Format
-
format=[...] - le format du fichier modèle (voir formats de fichiers). Par défaut, le format du fichier modèle est déterminé comme
raw, oubinpour les fichiers contenant des données binaires. -
comment=[.] - le marqueur de début de commentaire de ligne (exemple :
#).
Fusion
-
append=[join|before|after|replace|remove|skip|patch|clear] - le mode de fusion. Par défaut, le mode de fusion est défini selon le format du fichier. Si
append=skip, le modèle est ignoré. Siappend=clear, dans le cas d'un modèle de fichier, le fichier de configuration est vidé - longueur du fichier 0, et, dans le cas d'un modèle de répertoire, tous les fichiers et répertoires à l'intérieur du répertoire de configuration sont supprimés. -
force - supprimer les fichiers existants avant l'écriture du fichier de configuration. La règle s'applique par défaut si le paramètre
symbolicest indiqué. -
link=chemin - le fichier dont est tiré le texte du modèle à la place du fichier modèle lui-mêmetous les fichiers, liens symboliques et répertoires du répertoire indiqué par
linksont copiés dans le répertoire créé.linkpour un répertoire ne prend en charge que deux modesappendlink=/etc/conf.d/net.example -
path=chemin - le chemin du répertoire qui contiendra le fichier de configuration
-
name=nom - le nom du fichier de configuration
-
mirror - effectuer la fusion uniquement si le fichier de configuration existe. Si le fichier de configuration est défini par le paramètre
linket qu'il n'existe pas, le fichier de destination est supprimé. -
protected - protéger le fichier lors de la suppression du paquet auquel il appartient.
-
symbolic - créer un lien symbolique vers le fichier indiqué par le paramètre
link. -
autoupdate - lors de l'installation de n'importe quel paquet, un script spécial
cl-update-configest lancé, qui applique les modèles pour le paquet en cours d'installation. Les fichiers de configuration du paquet en cours d'installation sont protégés. En d'autres termes, lors de l'installation d'un paquet, si un tel fichier existe déjà dans le système et a été modifié, il ne sera pas remplacé. Les fichiers de configuration des paquets installés sont remplacés par la commande dispatch-conf. Si l'en-tête du modèle contient le paramètre autoupdate, alors, après l'application du modèle, le fichier de configuration sera copié dans le système. Si le paramètre est absent, vous devez utiliser dispatch-conf pour transférer le fichier de configuration modifié. -
run - l'interpréteur pour exécuter le fichier de configuration obtenu à partir du modèle. Le script est exécuté immédiatement après le traitement de ce modèle. Exemple :
run=/bin/bash -
exec - l'interpréteur pour exécuter le fichier de configuration obtenu à partir du modèle. Le script est ajouté à une file d'attente qui est exécutée après le traitement de tous les modèles non exécutables. Exemple :
exec=/bin/bash. La file d'attente est traitée lors du deuxième passage du moteur, donc en un seul passage le scriptexec=n'est pas exécuté ; nirun=niexec=ne laissent le fichier de configuration sur le disque. -
env - utiliser dans le modèle les variables du module indiqué. Si le module est absent du système, le modèle sera ignoré. Exemple
module=est également accepté. -
subvolume - appliquer aux modèles de répertoires - appliquer aux modèles de répertoires
subvolume - appliquer aux modèles de répertoires - appliquer aux modèles de répertoires
- appliquer aux modèles de répertoires - appliquer aux modèles de répertoires
- appliquer aux modèles de répertoires - appliquer aux modèles de répertoires : si le répertoire de configuration est absent et qu'il est créé, le créer comme btrfs subvolume. Le paramètre s'indique sans valeur. Les répertoires parents sont créés comme des répertoires ordinaires (récursivement) ; le subvolume n'est créé que pour le répertoire du modèle lui-même ; les répertoires de modèles imbriqués avec subvolume forment des subvolumes imbriqués. Exemple : "# Calculate subvolume"
"# Calculate subvolume""# Calculate subvolume""# Calculate subvolume"
Actions
-
merge - à la fin, configurer les paquets listés. Exemple :
merge=openrc,grub(les paquets doivent être indiqués avec la catégoriemerge=sys-apps/openrc,sys-boot/grub) -
postmerge - à la fin, configurer les paquets listés. Contrairement à merge, les paquets seront configurés après
pkg_postinst()lors de la construction du paquet. Exemple : "postmerge=sys-apps/openrc,sys-boot/grub" -
stop, start, restart - arrêter/démarrer/redémarrer les services indiqués, séparés par des virgules. Pour un modèle de fichier, l'action du service sera exécutée immédiatement après la fusion du modèle ; pour un modèle de répertoire, l'action du service sera exécutée immédiatement après le traitement de tous les modèles imbriqués. Exemple :
restart=consolefont,keymap -
rebuild - abaisser la version du paquet pour une reconstruction ultérieure lors de la mise à jour du système. L'indication des slots et des versions des paquets est prise en charge.
Droits d'accès
-
chmod=XXX - les droits d'accès au fichier cible (exemple : "644"). Par défaut, les droits correspondent à ceux du fichier d'origine. S'il est absent, les droits correspondent à ceux du fichier du modèle.
-
chown=user:group - le propriétaire et/ou le groupe du fichier cible (exemple : "root:root").
Conditions
- variable[>|<|==|!=|>=|<=]value ... - les conditions de transfert du fichier du modèle dans le système. Les opérations arithmétiques peuvent être combinées par la condition "ET" (&) (pour calculate-lib>=2.2, la condition "ET" (&&)) et la condition "OU" (||). Dans ce cas, la condition ET est prioritaire. Plusieurs conditions séparées par un espace sont combinées par la condition "ET" ; si l'une des conditions n'est pas remplie, les autres ne seront pas évaluées. Ainsi
cl_ver>=3.5 os_linux_shortname==CLDX||os_linux_shortname==CLDest traité commecl_ver>=3.5 ET (os_linux_shortname==CLDX OU os_linux_shortname==CLD).
Balises
Vous pouvez configurer le système en fonction des exigences matérielles de l'ordinateur, des paramètres réseau et d'autres conditions. Pour cela, dans le fichier du modèle, vous pouvez définir des balises de variables au lieu de valeurs constantes.
Exemple du fichier /etc/conf.d/hostname :
HOSTNAME="#-os_net_hostname-#"
Pour utiliser des variables d'un autre module, indiquez le module avant la variable, séparés par un point :
Exemple :
#-install.os_install_root_dev-#
Blocs conditionnels
Le fichier du modèle peut contenir des blocs conditionnels.
Blocs conditionnels - texte mis en évidence dans le modèle, substitué lorsqu'une expression régulière correspond.
Expression régulière - méthode de vérification des valeurs des expressions. Les types de données suivants peuvent servir de valeurs :
-
variables - variables intégrées de Calculate.
-
nombres - nombres entiers et décimaux, avec un point "." comme séparateur décimal.
-
chaînes - lettres, chiffres, caractères spéciaux.
-
numéros de version - nombres et un ou deux points séparant le numéro de version (par exemple, 8.5.1).
-
plages de versions - deux numéros de version séparés par une virgule
La méthode de vérification est une opération arithmétique >, <, ==, !=, >=, <= (supérieur à, inférieur à, égal à, différent de, supérieur ou égal à, inférieur ou égal à). Le type de données est déterminé avant l'opération de comparaison.
Vous pouvez aussi vérifier qu'une version est comprise dans une plage. La vérification utilise les opérateurs suivants :
-
== - la version est
>=à la valeur inférieure et la version est<=à la valeur supérieure -
<= - la version est
>à la valeur inférieure et la version est<=à la valeur supérieure -
=> - la version est
>=à la valeur inférieure et la version est<à la valeur supérieure -
<> - la version est
>à la valeur inférieure et la version est<à la valeur supérieure -
!= - la version n'est pas comprise dans la plage indiquée
Exemple :
La version des utilitaires est supérieure ou égale à 3.3 et inférieure à 4 #?pkg(sys-apps/calculate-utils)=>3.3,4#
Les opérations arithmétiques peuvent être combinées par la condition "ET" (&) et la condition "OU" (||). Dans ce cas, la priorité sera donnée à la condition "ET".
Le bloc doit avoir une balise fermante, et pour une fonction dans la condition, la balise est le nom de la fonction - #pkg# ; sans elle, le moteur signale Cannot find closing tag #pkg# et le fichier reste vide, donc l'exemple ci-dessus est incomplet. Avec la balise fermante, les opérateurs ==, <=, =>, <> et != fonctionnent exactement comme décrit ci-dessus, y compris dans l'en-tête du fichier. Une branche "sinon" est également possible : #!pkg#.
Le bloc conditionnel doit commencer par la balise "#?variable1==value1(...)#" et se terminer par "#variable1#", écrites en début de ligne.
Exemple d'un bloc conditionnel dans le fichier /etc/make.conf :
#?os_arch_march==i686&&os_linux_shortname==CLD# CFLAGS="-O2 -march=i686 -pipe" CHOST="i686-pc-linux-gnu" #os_arch_march#
Dans l'exemple donné, les variables setup_march et setup_sys_shortname sont comparées aux valeurs de chaîne "i686" et "CLD" respectivement. Si les valeurs des deux variables coïncident, le texte du bloc sera inséré dans le fichier résultant.
Tel quel, le bloc ne fonctionne pas#?os_linux_shortname==CLD&&os_net_hostname==box# ... #os_linux_shortname# insère le texte du bloc.
Fonctions
Les fonctions servent à construire des fichiers complexes nécessitant un calcul lors du traitement. Comme les variables, les fonctions sont insérées dans le texte du modèle avec la construction "#-function()-#".
Les fonctions qui utilisent un chemin de fichier en argument (path) peuvent employer le répertoire personnel de l'utilisateur ~
En plus de celles listées, l'administrateur peut définir ses propres fonctions - par un fichier dans le répertoire <location>/scripts/functions/, où <location> provient de /etc/portage/repos.conf. Une fonction personnelle est prioritaire sur une fonction intégrée : en cas d'homonymie, l'appel part vers votre fichier et non vers le code des utilitaires ; la liste ci-dessous décrit donc les noms intégrés et n'est pas exhaustive - si une fonction se comporte différemment de ce qui est indiqué ici, vérifiez si elle a été remplacée (pour la rédaction, voir Fonctions personnelles des modèles dans un overlay).
Fonctions disponibles :
belong - (non utilisé) - même objectif que merge, sauf qu'il ne fonctionne qu'avec le nom du paquet, sans tenir compte de la catégorie.
merge([category/pkg_name]) - vérifie le nom du paquet en cours d'installation, lorsqu'un paquet est en cours d'installation. Dans tous les autres cas, la fonction renverra un résultat positif.
category - la catégorie du paquet.
pkg_name - le nom du paquet.
Si la fonction n'a pas d'argument, le nom du paquet devient le nom du modèle (pour les répertoires, le nom du répertoire) et la catégorie devient le répertoire parent. Si le nom de la catégorie ou le nom du paquet contient une version et/ou un numéro de tri (20-mc,40-xfce-4.6), ils sont supprimés.
Exemples :
sys-apps/15-portage-2.2/.calculate_directory, category=sys-apps,pkg_name=portage
sys-fs/udev, (fichier portage), category=sys-fs,pkg_name=udev
Le résultat dépend de la valeur de la variable du modèle cl_merge_pkg (dans les versions antérieures à 3.1.1, cl_belong_pkg)
-
значение
cl_merge_pkg- '' результат '1', независимо от того, есть или нет аргумент у функции -
значение
cl_merge_pkg- 'имя_пакета' если совпадают значенияcl_merge_pkgи аргумента функции, результат - '1' иначе '' -
si la fonction n'a pas d'argument, la valeur de
cl_merge_pkgest comparée au nom du répertoire dans lequel se trouve le modèle avec la fonctionmerge(); en cas de coïncidence, le résultat est '1' sinon ''
Lors de l'exécution des modèles pour la modification du code source des paquets (ac_install_patch), la fonction renvoie le numéro de version au lieu de 1 en cas de résultat positif.
Exemple. En-tête du modèle1 :
# Calculate merge(sys-auth/nss_ldap)!=
En-tête du modèle2 :
# Calculate merge(kde-libs/kdm)!=
-
Fusionnez le modèle pour le programme sys-auth/nss_ldap : définissez la valeur de la variable
cl_merge_pkgsur sys-auth/nss_ldap. Seul le modèle1 sera appliqué -
Fusionnez tous les modèles. La valeur par défaut de la variable
cl_merge_pkgest ''. Le modèle1 et le modèle2 seront appliqués.
Si le paramètre indiqué pour merge (ou défini par le chemin du modèle) est un paquet inexistant, la fonction renvoie une valeur vide.
merge() ne vérifie pas l'existence du paquet ne vérifie pas l'existence du paquet :
merge() ne vérifie pas l'existence du paquet ne vérifie pas l'existence du paquet : #-merge(sys-auth/nosuchpkg)-# donne 1 avec un cl_merge_pkg vide comme lorsque cl_merge_pkg vaut ce même nom fictif ; #-merge(x11-misc/nosuch)-# dans le répertoire 40-xfce-4.6 donne aussi 1. Le résultat n'est vide qu'en cas de non-correspondance avec la valeur de cl_merge_pkg. mergepkg() vérifie l'existence du paquet : #-mergepkg(cat/nosuchpkg)-# avec avec cl_merge_pkg=["cat/nosuchpkg"] donne une valeur vide, tandis que sur un paquet installé il renvoie la version - donne une valeur vide, tandis que sur un paquet installé il renvoie la version - 2.18-r1 pour pour sys-apps/baselayout..
#-mergepkg(cat/nosuchpkg)-# avec avec cl_merge_pkg=["cat/nosuchpkg"] donne une valeur vide, tandis que sur un paquet installé il renvoie la version - donne une valeur vide, tandis que sur un paquet installé il renvoie la version - 2.18-r1 pour pour sys-apps/baselayout..
mergepkg(category/package) - un appel combiné de merge et pkg. Renvoie la version du paquet installé (ou en cours d'installation) dans le système lorsque c'est ce paquet précis qui est configuré, ou lorsque tout le système est reconfiguré.
case(type,var) - affiche la valeur d'une variable du modèle avec un changement de casse, où :
-
type - type de changement de casse
tESTbOXdonneTestbox. -
var - le nom de la variable du modèle.
Exemple. Affichez le nom d'hôte en majuscules :
#-case(upper,os_net_hostname)-#
cut(number,delimiter,data) - découpe une chaîne en sous-chaînes et renvoie celle qui est indiquée.
-
number - numéro de la sous-chaîne à renvoyer (à partir de 0). Si la fonction est appelée sans paramètres, le numéro est 0.
-
delimiter - le séparateur ; si le paramètre est indiqué mais vide, le séparateur est la virgule. Si le paramètre n'est pas indiqué, le séparateur est
-. -
data - la chaîne ; elle peut être le résultat d'une fonction ou la valeur d'une variable. Si le paramètre n'est pas indiqué, la valeur de la variable
cl_pass_fileest utilisée (le nom du fichier du modèle).
Exemple.
#os_audio_default contient le numéro de la carte son et le numéro du périphérique séparés par une virgule, obtenons le numéro du périphérique #-cut(1,,#-os_audio_default-#)-# #Obtenir le numéro à partir du nom du modèle (05-rebuild_openrc) #-cut()-# #Obtenir le nom du modèle sans le chiffre #-cut(1)-#
disk(mount_point,name) - affiche la valeur d'un paramètre du disque dur lors de l'installation du système.
La fonction prend la valeur dans une variable ('os_install_disk_' + name, ou 'os_disk_'+ name si une telle variable n'existe pas), et recherche la valeur voulue à l'aide de la variable os_install_disk_mount (points de montage lors de l'installation).
-
mount_point - le point de montage lors de l'installation.
-
name - le dernier élément des noms de variables commençant par os_install_disk_/os_disk ('os_install_disk_'/'os_disk_' + name).
valeurs des variables
os_install_disk_mount = ['swap', '/', '', '', '/var/calculate']
os_disk_grub ['0,0', '0,1', '0,2', '0,3', '0,4']
fonction
disk(/var/calculate,grub)
-
dans la variable os_install_disk_mount, nous trouvons /var/calculate et obtenons l'indice 4
-
dans la variable os_disk_grub, à l'indice 4, nous obtenons la valeur '0,4' résultat de la fonction disk(/var/calculate,grub) '0,4'
fonction
disk(/boot,grub)
-
/boot n'est pas trouvé dans la variable os_install_disk_mount, il n'y a pas d'indice
-
s'il n'y a pas d'indice, nous trouvons / dans la variable os_disk_install et obtenons l'indice 1
-
dans la variable os_disk_grub, à l'indice 1, nous obtenons la valeur '0,1' résultat de la fonction disk(/boot,grub) '0,1'
Exemple. Affichez le disque pour le chargeur de démarrage grub :
#-disk(/boot,grub)-#
nous obtenons la valeur 0,1
L'exemple suppose que les listes de points de montage et la liste correspondante sont rassemblées de façon cohérente.
Si leurs longueurs diffèrent, la fusion est interrompue avec une erreur de type la taille de install.os_install_disk_mount
ne correspond pas à install.os_disk_grub et le fichier n'est pas créé : ce
message n'indique pas une faute de frappe dans l'appel, mais un ensemble incomplet ou incohérent de variables d'installation.
elog(pkg) - obtient l'heure d'installation (timestamp) du paquet indiqué. Si aucun paquet n'est indiqué, l'heure du dernier paquet installé est renvoyée. Les informations sont extraites de emerge.log. La fonction sert à déterminer si le profil de l'utilisateur doit être configuré lors de sa connexion à la session.
où :
pkg - le nom complet du paquet avec la catégorie
env(module.var_name) - lit la valeur d'une variable de module dans les fichiers calculate.env.
-
module - le nom du module.
-
var_name - la variable du service. le séparateur est un point '.'
-
nous lisons, dans les fichiers calculate.env, le nom du domaine auquel la machine est ajoutée
#-env(client.os_remote_auth)-#
nous obtenons par exemple la valeur domain-server, si /etc/calculate/calculate.env contient
[client] os_remote_auth = domain-server
exists(path,opt) - vérifie l'existence d'un fichier ou d'un répertoire.
Si le fichier ou le répertoire existe, la fonction affiche '1', sinon ''. Au lieu de 1, il renvoie la désignation du type de fichier :
-
d- répertoire -
f- fichier -
l- lien symbolique -
s- socket -
b- périphérique bloc tamponné -
c- périphérique bloc non tamponné -
p- FIFO
path - le chemin dans le système de fichiers.
opt - une option optionnelle.
Valeurs possibles de opt :
- root - le chemin d'accès au fichier ne contiendra pas le chemin chroot. (Le chemin indiqué est celui qui sera réellement utilisé - quelle que soit la valeur des variables
cl_chroot_pathetcl_root_path)
Exemple. Vérifiez l'existence du répertoire /etc :
#-exists(/etc)-#
Le résultat sera 'd'.
grep(file,regex) - obtient la valeur du fichier file qui correspond à l'expression régulière regex. Si l'expression régulière utilise un groupement de valeurs, la fonction renvoie le contenu du premier groupe.
\xFF est converti, où FF est un code hexadécimal de caractère à deux chiffres. Tous les espaces sont retirés de l'argument avant même l'analyse de l'expression régulière, donc key = "(.*?)" et key="(.*?)" se comportent de la même manière et ne trouvent pas la chaîne key = "V1" ; un espace dans le texte recherché s'indique par \s, \s+, . ou [\x20].
Exemple. Récupérez la valeur de nofscks dans dracut.conf.
#-grep(/etc/dracut.conf,nofscks="(.*?)")-#
Caractères spéciaux de l'expression régulière (regex) :
"." - correspond à n'importe quel caractère sauf le saut de ligne. Si le mode - correspond à n'importe quel caractère sauf le saut de ligne. Si le mode dotall est activé, il correspond à n'importe quel caractère. est activé, il correspond à n'importe quel caractère.
"^" - correspond au début du fichier. Si le mode - correspond au début du fichier. Si le mode multiline est activé, il correspond au début d'une ligne. est activé, il correspond au début d'une ligne.
"$" - correspond à la fin du fichier. Si le mode - correspond à la fin du fichier. Si le mode multiline est activé, il correspond à la fin d'une ligne. est activé, il correspond à la fin d'une ligne.
"*" - correspond à 0 ou plusieurs répétitions de la regex précédente. La regex correspondra à la plus grande partie possible du texte. - correspond à 0 ou plusieurs répétitions de la regex précédente. La regex correspondra à la plus grande partie possible du texte.
"*?" - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte. - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte.
"+" - correspond à 1 ou plusieurs répétitions de la regex précédente. La regex correspondra à la plus grande partie possible du texte. - correspond à 1 ou plusieurs répétitions de la regex précédente. La regex correspondra à la plus grande partie possible du texte.
"+?" - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte. - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte.
"?" - correspond à 0 ou 1 répétition de la regex précédente. La regex correspondra à la plus grande partie possible du texte. - correspond à 0 ou 1 répétition de la regex précédente. La regex correspondra à la plus grande partie possible du texte.
"??" - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte. - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte.
"{m,n}" - correspond de m à n répétitions de la regex précédente. - correspond de m à n répétitions de la regex précédente.
"{m,n}?" - la version "non gourmande" de l'utilisation de la construction précédente. La regex correspondra à la plus petite partie possible du texte. - la version "non gourmande" de l'utilisation de la construction précédente. La regex correspondra à la plus petite partie possible du texte.
"\" - échappement des caractères spéciaux - échappement des caractères spéciaux
"[]" - correspond à n'importe quel caractère de l'ensemble indiqué. - correspond à n'importe quel caractère de l'ensemble indiqué.
"[^]" - correspond à n'importe quel caractère hors de l'ensemble indiqué. - correspond à n'importe quel caractère hors de l'ensemble indiqué.
"A|B" - créer une regex qui correspond soit à A, soit à B - créer une regex qui correspond soit à A, soit à B :
"." - correspond à n'importe quel caractère sauf le saut de ligne. Si le mode - correspond à n'importe quel caractère sauf le saut de ligne. Si le mode dotall est activé, il correspond à n'importe quel caractère. est activé, il correspond à n'importe quel caractère.
"^" - correspond au début du fichier. Si le mode - correspond au début du fichier. Si le mode multiline est activé, il correspond au début d'une ligne. est activé, il correspond au début d'une ligne.
"$" - correspond à la fin du fichier. Si le mode - correspond à la fin du fichier. Si le mode multiline est activé, il correspond à la fin d'une ligne. est activé, il correspond à la fin d'une ligne.
"*" - correspond à 0 ou plusieurs répétitions de la regex précédente. La regex correspondra à la plus grande partie possible du texte. - correspond à 0 ou plusieurs répétitions de la regex précédente. La regex correspondra à la plus grande partie possible du texte.
"*?" - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte. - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte.
"+" - correspond à 1 ou plusieurs répétitions de la regex précédente. La regex correspondra à la plus grande partie possible du texte. - correspond à 1 ou plusieurs répétitions de la regex précédente. La regex correspondra à la plus grande partie possible du texte.
"+?" - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte. - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte.
"?" - correspond à 0 ou 1 répétition de la regex précédente. La regex correspondra à la plus grande partie possible du texte. - correspond à 0 ou 1 répétition de la regex précédente. La regex correspondra à la plus grande partie possible du texte.
"??" - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte. - la version "non gourmande" de l'utilisation du caractère précédent. La regex correspondra à la plus petite partie possible du texte.
"{m,n}" - correspond de m à n répétitions de la regex précédente. - correspond de m à n répétitions de la regex précédente.
"{m,n}?" - la version "non gourmande" de l'utilisation de la construction précédente. La regex correspondra à la plus petite partie possible du texte. - la version "non gourmande" de l'utilisation de la construction précédente. La regex correspondra à la plus petite partie possible du texte.
"\" - échappement des caractères spéciaux - échappement des caractères spéciaux
"[]" - correspond à n'importe quel caractère de l'ensemble indiqué. - correspond à n'importe quel caractère de l'ensemble indiqué.
"[^]" - correspond à n'importe quel caractère hors de l'ensemble indiqué. - correspond à n'importe quel caractère hors de l'ensemble indiqué.
"A|B" - créer une regex qui correspond soit à A, soit à B - créer une regex qui correspond soit à A, soit à B : (zz|CC) donne CC, alors que (zz|aa11) donne aa11.
"(...)" - groupement d'une regex avec conservation des groupes (grep renvoie le contenu du premier groupe)
"(?ims)" - définit les modes de la regex
- définit les modes de la regex
- définit les modes de la regex : insensible à la casse, multiline, dotall. Le drapeau n'agit que s'il se trouve au début de l'expression :
(?i)cc et et (?m)^CC donnent une correspondance, alors que le même drapeau dans un groupe ( donnent une correspondance, alors que le même drapeau dans un groupe (((?i)cc), , ((?m)^CC)) conduit à ) conduit à Mauvaise expression régulière et à une substitution vide. et à une substitution vide."(?:...)" - groupement d'une regex sans conservation des groupes - groupement d'une regex sans conservation des groupes
"(?=...)" - contrôle si le texte après la regex correspond. - contrôle si le texte après la regex correspond.
"(?!...)" - contrôle si le texte après la regex ne correspond pas. - contrôle si le texte après la regex ne correspond pas.
"(?<=...)" - contrôle si le texte avant la regex correspond (cette regex doit avoir une longueur fixe). - contrôle si le texte avant la regex correspond (cette regex doit avoir une longueur fixe).
"(?<!...)" - contrôle si le texte avant la regex ne correspond pas (cette regex doit avoir une longueur fixe). - contrôle si le texte avant la regex ne correspond pas (cette regex doit avoir une longueur fixe).insensible à la casse, multiline, dotall. Le drapeau n'agit que s'il se trouve au début de l'expression :
(?i)cc et et (?m)^CC donnent une correspondance, alors que le même drapeau dans un groupe ( donnent une correspondance, alors que le même drapeau dans un groupe (((?i)cc), , ((?m)^CC)) conduit à ) conduit à Mauvaise expression régulière et à une substitution vide. et à une substitution vide."(?:...)" - groupement d'une regex sans conservation des groupes - groupement d'une regex sans conservation des groupes
"(?=...)" - contrôle si le texte après la regex correspond. - contrôle si le texte après la regex correspond.
"(?!...)" - contrôle si le texte après la regex ne correspond pas. - contrôle si le texte après la regex ne correspond pas.
"(?<=...)" - contrôle si le texte avant la regex correspond (cette regex doit avoir une longueur fixe). - contrôle si le texte avant la regex correspond (cette regex doit avoir une longueur fixe).
"(?<!...)" - contrôle si le texte avant la regex ne correspond pas (cette regex doit avoir une longueur fixe). - contrôle si le texte avant la regex ne correspond pas (cette regex doit avoir une longueur fixe).
"\w" - correspond à n'importe quel caractère de l'ensemble [a-zA-Z0-9_]
"\W" - correspond à n'importe quel caractère hors de l'ensemble [a-zA-Z0-9_], c'est-à-dire le même que [^a-zA-Z0-9_] ; le saut de ligne en fait également partie
"\s" - correspond à n'importe quel caractère d'espacement
"\S" - correspond à n'importe quel caractère autre qu'un espace
"\d" - correspond à n'importe quel chiffre décimal [0-9]
"\D" - correspond à n'importe quel caractère qui n'est pas un chiffre décimal [^0-9]
Le comportement correspond à celui de Python : pour un texte où les lignes sont aa11bb et CC22dd, \w+ donne aa11bb, \d+ donne 11, \D+ donne aa, \W+ donne le saut de ligne ; pour la chaîne k1="a b c" \s+ donne un espace, et \S+ donne k1="a.
groups(group1,group2,..groupN) - vérifie si l'utilisateur appartient aux groupes group1,group2, ..groupN
Si l'utilisateur appartient à au moins un des groupes, la fonction affiche '1', sinon ''
group1 .. groupN - les noms des groupes.
Exemple. Vérifiez si l'utilisateur appartient au groupe wheel :
#-groups(wheel)-#
Si l'utilisateur appartient au groupe wheel, le résultat sera '1'.
ini(var, value, opt) - écrit et lit une variable du fichier de configuration de l'utilisateur (~/.calculate/ini.env).
Lors de la configuration du système, l'écriture se fait dans <chroot>/var/lib/calculate/ini.env, tandis que /etc/calculate/ini.env reste une couche de lecture : après #-ini(mytest,42)-# la valeur apparaît dans var/lib/calculate/ini.env, et le fichier etc/calculate/ini.env n'est pas modifié.
-
var - le nom de la variable de la fonction. Le nom doit commencer par une lettre et peut contenir des lettres latines et des chiffres, ainsi qu'un point. Le point sert de séparateur entre la section et le nom de la variable pour le placement dans le fichier de configuration.
-
value - la valeur de la variable de la fonction, la valeur est affectée à la variable de la fonction et écrite dans le fichier de configuration (la fonction renvoie alors une valeur vide). En l'absence du second argument, la variable est lue dans le fichier de configuration ; en l'absence du nom de la variable dans le fichier de configuration, une valeur vide est écrite dans la variable. Si l'argument est une chaîne vide sans guillemets, la variable est supprimée. Si l'argument est une chaîne vide entre guillemets, la valeur de la variable dans le fichier ini est effacée.
-
opt - option de conversion de la valeur de la variable, paramètre optionnel ; valeurs possibles url, purl, unicode, hexcode. Lorsque cet argument est utilisé, le second argument de la fonction doit être vide.
Exemples :
1. Créez la variable "test", affectez-lui la valeur 15 et écrivez-la dans le fichier de configuration :
#-ini(test,15)-#
-
Lisez la valeur de la variable test précédemment écrite dans le fichier de configuration, remplacez la fonction par la valeur de la variable lue, dans notre cas "15" :
#-ini(test)-#
-
Utilisation de la fonction ini avec trois arguments. Supposons que le fichier
~/.calculate/ini.envcontienne la section
[test] param = Тестовый параметр
alors la fonction
#-ini(test.param,,unicode)-#
renverra
\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440
fonction
#-ini(test.param,,hexcode)-#
renverra
\x422\x435\x441\x442\x43e\x432\x44b\x439 \x43f\x430\x440\x430\x43c\x435\x442\x440
fonction
#-ini(test.param,,url)-#
renverra
%d0%a2%d0%b5%d1%81%d1%82%d0%be%d0%b2%d1%8b%d0%b9%20%d0%bf%d0%b0%d1%80%d0%b0%d0%bc%d0%b5%d1%82%d1%80
L'option purl diffère de url en ce qu'elle convertit '/' en code '%2F'
Dans l'implémentation actuelle, le résultat est différent. La valeur Тестовый параметр donne donne :
Dans l'implémentation actuelle, le résultat est différent. La valeur Тестовый параметр donne donne : unicode → естовый параметр, hexcode → естовый параметр (sans aucun échappement \x422…), url → '%d0%a2%d0%b5%d1%81%d1%82%d0%be%d0%b2%d1%8b%d0%b9%20%d0%bf%d0%b0%d1%80%d0%b0%d0%bc%d0%b5%d1%82%d1%80, purl pour /a/b/c → '%2fa%2fb%2fc. La cause est un défaut connu de l'implémentation actuelle : unicode et et hexcode prennent le prennent le repr() de la valeur et coupent les deux premiers caractères, en s'attendant au préfixe de la valeur et coupent les deux premiers caractères, en s'attendant au préfixe u'…' de Python 2, qui n'existe pas dans Python 3, si bien que la découpe mange le premier caractère de la valeur; de Python 2, qui n'existe pas dans Python 3, si bien que la découpe mange le premier caractère de la valeur; url et et purl découpent le découpent le repr() de la chaîne d'octets et laissent le guillemet simple initial, tandis que de la chaîne d'octets et laissent le guillemet simple initial, tandis que purl encode la barre oblique en minuscules ( encode la barre oblique en minuscules (%2f, et non , et non %2F).).
unicode et et hexcode prennent le prennent le repr() de la valeur et coupent les deux premiers caractères, en s'attendant au préfixe de la valeur et coupent les deux premiers caractères, en s'attendant au préfixe u'…' de Python 2, qui n'existe pas dans Python 3, si bien que la découpe mange le premier caractère de la valeur; de Python 2, qui n'existe pas dans Python 3, si bien que la découpe mange le premier caractère de la valeur; url et et purl découpent le découpent le repr() de la chaîne d'octets et laissent le guillemet simple initial, tandis que de la chaîne d'octets et laissent le guillemet simple initial, tandis que purl encode la barre oblique en minuscules ( encode la barre oblique en minuscules (%2f, et non , et non %2F).).
- placer le service sshd dans le démarrage automatique avec vérification et marque dans ini.env
# Calculate path=/etc/runlevels/default name=sshd link=/etc/init.d/sshd symbolic ini(runlevels.openssh)!=on&&ini(runlevels.openssh,on)==
livemenu(mode) - fonction spéciale pour la création du menu multiboot pour Flash. mode - le mode de fonctionnement de la fonction, et peut être le suivant :
-
submenu - renvoie la liste des systèmes au format suivant :
identifiant du système; nom complet dans le menu de démarrage; chemin vers le noyau; paramètres de démarrage; chemin vers l'initrd; paramètres de démarrage splash; Exemple: cl-2; Calculate Linux Desktop Xfce; /boot/vmlinuz-2; root=live:LABEL=CALCULATE; /boot/initrd-2; splash;
-
xorg - renvoie la liste des systèmes où xorg-server est installé. Par exemple
cl-1 cl-2 cl-3. -
video - renvoie la liste des systèmes où des pilotes propriétaires sont présents. Par exemple
cl-2 cl-3
La fonction est utilisée dans les modèles 6_ac_builder_iso/0_bootmenu/desktop.config, ainsi que pour la génération de gfxboot.cfg.
ls(dir,pattern) - obtient la liste du répertoire indiqué dir et la convertit selon pattern. Si pattern n'est pas indiqué, la liste est affichée séparée par des espaces.
-
dir - le répertoire ou un motif de chemin vers les fichiers (
/etc/conf.dou/etc/*.conf) -
pattern - le motif de conversion de la liste des fichiers du répertoire.
Si pattern contient \1, le texte de pattern est affiché à la place du nom du fichier, mais \1 est remplacé par le nom du fichier.
Si pattern ne contient pas \1, il est utilisé comme séparateur entre les noms de fichiers.
\n est converti en un saut de ligne. Si vous devez afficher \n, utilisez \\n. \\n donne un antislash et un véritable saut de ligne - le séparateur devient net\ et une nouvelle ligne, et non les deux caractères imprimables \n; on ne peut pas les obtenir via ls().
Exemple.
#-ls(/etc/openldap/slapd.conf.d/*.conf,include \1\n)-#
Dans ce cas,
/etc/openldap/slapd.conf.d contient les fichiers unix.conf et samba.conf
include /etc/openldap/slapd.conf.d/unix.conf include /etc/openldap/slapd.conf.d/samba.conf
La fonction affiche de vrais chemins de fichiers, c'est-à-dire include /etc/openldap/slapd.conf.d/unix.conf et include /etc/openldap/slapd.conf.d/samba.conf. L'ordre des lignes suit le parcours du répertoire et n'est pas trié, il ne faut donc pas l'inverser - le moteur renvoie les fichiers tels que le système de fichiers les voit.
Exemple 2
files = #-ls(/etc/conf.d,,)-#
Dans ce cas,
/etc/conf.d contient les fichiers net, modules, rootfiles = /etc/conf.d/net,/etc/conf.d/modules,/etc/conf.d/root
server(service.option,var) - lit la valeur d'un paramètre du service. L'information est obtenue par le traitement du fichier /var/calculate/remote/server.env,
-
service - le nom du service.
-
option - l'option du service.
-
var - le nom de la variable de fonction (paramètre facultatif). Le séparateur entre service et option : '.' - un point. Si var - le nom de la variable de fonction - est utilisé, la valeur obtenue de l'option du service sera écrite dans la variable de fonction var. Si var n'est pas utilisé, la valeur obtenue de l'option du service sera insérée dans le texte du fichier de configuration.
-
lisons la valeur du port de connexion au service jabber
#-server(jabber.port)-#
nous obtenons la valeur 5223
Le séparateur entre le service et l'option est le point : #-server(jabber,port)-# retire le modèle avec l'erreur erreur, terme de gabarit server(jabber,port), tandis que #-server(jabber.port)-# donne 5223. La virgule sépare les arguments de la fonction.
- lisons la valeur du port de connexion au service jabber et plaçons-la dans la variable de fonction
jabber_port
#-server(jabber.port,jabber_port)-#
#-jabber_port-# doit être lu dans ce même fichier de modèle : la variable que crée le deuxième argument,
appartient au modèle courant et n'est pas disponible dans un autre fichier de la passe.
La valeur de la variable de fonction jabber_port est 5223. La forme avec point fonctionne aussi avec un nom de variable : #-server(jabber.port,jabber_port)-# écrit 5223 dans la variable de fonction jabber_port, et l'étiquette elle-même est remplacée par une chaîne vide; la variante avec une virgule dans le premier argument donne la même erreur.
list(var,index) - affiche la valeur à l'index donné dans une variable.
où :
-
var - le nom de la variable de fonction ou de la variable de modèle (la valeur de la variable doit être une liste).
-
index - l'index pour rechercher la valeur dans la variable de fonction ou la variable de modèle (le premier élément a l'index 0, et ainsi de suite).
Exemple. La valeur de la variable
os_disk_dev = ['/dev/sda1', '/dev/sda2', '/dev/sda3', '/dev/sda4', '/dev/sda5']
#-list(os_disk_dev,1)-#
L'étiquette de la fonction sera remplacée par '/dev/sda2'.
Si l'élément demandé est absent de la liste, la fonction renvoie une chaîne vide.
in(var,value1,value2...) - vérifie s'il y a au moins une des valeurs de value parmi les valeurs de la variable var. Si une valeur est trouvée, elle renvoie "1", sinon une chaîne vide. La variable peut être aussi bien une liste qu'une chaîne.
-
var - le nom de la variable
-
valueX - la liste des valeurs à comparer
Exemple :
La valeur de la variable est une chaîne
os_install_linux_shortname = CLDX
#-in(os_install_linux_shortname,CLDX,CLD,CLDG)-#
Exemple 2 :
La valeur de la variable est une liste
os_linux_pkglist = CLDX,base
#-in(os_linux_pkglist,CLDX,CLD,CLDG)-#
Elle renverra 1, car il y a une valeur commune - CLDX.
L'étiquette de la fonction sera remplacée par 1; la valeur CLDX n'atteint pas le point d'insertion.
kernel(kernel_opt) - obtient la valeur d'un paramètre de configuration du noyau. Elle renvoie "y","m" ou une chaîne vide. y - l'option est intégrée au noyau, m - un module du noyau, chaîne vide - l'option est désactivée.
kernel_opt - le nom de l'option, sans distinction de casse, sans le préfixe CONFIG_
Ce n'est pas seulement y/m/vide qui est renvoyé : les options à chaîne sont renvoyées sans guillemets (CONFIG_LOCALVERSION="-calc" → -calc), et la recherche se fait par sous-chaîne, c'est pourquoi une ligne comme # CONFIG_EXT4_FS is not set, placée au-dessus de celle recherchée, interrompt la lecture et donne une valeur vide.
Exemple 1. ext4 est-il activé :
kernel(ext4_fs)!=
Exemple 2. reiserfs est un module du noyau, alors qu'ext4 est intégré au noyau
kernel(reiserfs_fs)==m&&kernel(ext4_fs)==y
load(arg,path,opt) - affiche les informations d'un fichier.
où :
arg - le type de contenu du fichier;
path - le chemin vers le fichier;
opt - l'option facultative
- root - le chemin du fichier ne contiendra pas les chemins chroot. (Quel que soit le chemin indiqué, ce sera réellement celui-ci, indépendamment des variables
cl_chroot_pathetcl_root_path.)
Les valeurs possibles de "arg" :
-
ver - le contenu du fichier est un numéro de version
-
num - le contenu du fichier est un nombre
-
char - le contenu du fichier est une chaîne
-
empty - le résultat, le contenu du fichier sans les lignes commentées (commentaires # ou ;) и пустых строк.
-
key - est accepté dans la liste des valeurs autorisées, mais n'a pas de traitement particulierun fichier vide, composé uniquement d'espaces ou absent leur donne
0, alors que char, key et empty donnent une valeur vide sur la même entrée.
Les valeurs possibles de path :
- path - le chemin absolu ou relatif vers le fichier.
Exemple. Affichez le contenu de /proc/cpuinfo à la place de la déclaration de la fonction :
#-load(char,/proc/cpuinfo)-#
module(module_name) - obtient la version d'un module des utilitaires Calculate. Si le module est absent -renvoie une valeur vide. Si les modèles sont exécutés pour le système en cours d'installation, la fonction renverra la version la plus basse du module.
La fonction ne renvoie la "version la plus basse" que si le système en cours d'installation possède le répertoire usr/lib/python3.10/site-packages/calculate/<module>/variables - le numéro de Python est codé en dur dans le chemin, et sur un système avec un autre Python la vérification échoue; la version du paquet est cherchée, elle, strictement dans le slot sys-apps/calculate-utils:3. Dans le chroot, dans ces conditions, #-module(core)-# donne une valeur vide, tandis qu'hors du chroot - la version des utilitaires (3.7.6.8).
Exemple. Demandez la version du module client
#-module(client)-#
Si le système a les utilitaires installés avec le module client (par exemple la version 3.5.0_alpha1), elle renverra 3.5.0_alpha1.
pkg (category/package) - affiche la version d'un paquet installé ; si plusieurs versions de ce paquet sont installées dans le système, la version du slot le plus haut est affichée.
où :
-
category - la catégorie du paquet
-
package - le nom du paquet
-
Le slot du paquet peut être indiqué avec un deux-points :
pkg(kde-base/kdelibs:4) -
Vous pouvez vérifier la présence de drapeaux USE d'un paquet. Les drapeaux USE à vérifier sont indiqués entre crochets, séparés par des virgules. Indiquer "-" avant un drapeau USE signifie que le drapeau doit être désactivé sur le paquet.
En mode compatibilité, vous pouvez indiquer uniquement le nom du paquet; dans ce cas la vitesse de traitement du modèle sera plus basse.
Exemple. Affichez la version du paquet installé (par exemple 4.2.4) :
#-pkg(kde-base/kdelibs)-#
Ainsi, le paquet kdelibs-4.2.4 est installé dans le système.
Exemple d'utilisation de USE. Affichez la version du paquet installé s'il a été compilé avec le drapeau desktop activé et le drapeau client désactivé.
#-pkg(sys-apps/calculate-utils[desktop,-client])-#
print (message) - affichage d'un message d'information à l'écran pendant l'exécution du modèle
warning (message) - affichage d'un message d'avertissement à l'écran pendant l'exécution du modèle
error (message) - affichage d'un message d'erreur à l'écran pendant l'exécution du modèle
push(var, value) - dépôt de la valeur d'une variable dans la pile des variables de fonctions de modèles.
-
var - le nom de la variable de la fonction. Le nom doit commencer par une lettre et peut contenir des lettres latines et des chiffres. La variable est créée pendant le traitement du fichier de configuration.
-
value - la valeur d'une variable de fonction : la valeur est affectée à la variable de fonction et écrite dans la pile des variables de fonctions de modèles. En l'absence du deuxième argument, la valeur de la variable est écrite dans la pile des variables de fonctions de modèles.
-
Créez la variable "test", affectez-lui la valeur 15 et écrivez-la dans la pile des variables de fonctions de modèles.
#-push(test,15)-#
-
Écrivez dans la pile des variables de fonctions de modèles la valeur de la variable
testcréée précédemment :
#-push(test)-#
Ici, "créée précédemment" signifie dans le même modèle : une variable de fonction vit uniquement pendant le temps de traitement
d'un seul fichier, et sans #-push(test,15)-# plus haut dans le même fichier, la balise retirera le modèle avec l'erreur
erreur, terme de gabarit push(test).
pop(var) - extraction d'une valeur de la pile des variables de fonctions de modèles et affectation de celle-ci à une variable.
-
var - le nom de la variable de la fonction. Le nom doit commencer par une lettre et peut contenir des lettres latines et des chiffres. La variable est créée pendant le traitement du fichier de configuration.
-
Créez la variable "test", affectez-lui la valeur 15 et écrivez-la dans la pile des variables de fonctions de modèles.
#-push(test,15)-#
-
Obtenez la valeur depuis la pile des variables de fonctions de modèles et affectez-la à la variable
test2:
#-pop(test2)-#
Vous pouvez extraire une valeur de la pile des variables de fonctions de modèles aussi bien dans le modèle courant que dans tout autre. Après l'extraction de la valeur, celle-ci est supprimée de la pile.
D'autres fonctions du modèle lisent la variable créée par pop() - par exemple list() ou sum() ;обычная метка
#-name-# ne la verra pas, car elle accède aux variables du modèle, et non aux variables de fonctions, et elle retirera
le modèle avec l'erreur Variable non trouvée.
replace(old, new, var) - remplacement du texte old dans la valeur de la variable var par new.
où :
-
old - le texte dont chaque occurrence dans la valeur de la variable sera remplacée par le texte new
-
new - le texte par lequel le texte old sera remplacé dans la valeur de la variable
-
var - le nom d'une variable de fonction ou d'une variable de modèle
Les textes old et new doivent être entourés de guillemets doubles ou simples.
Dans un texte entre guillemets doubles, les caractères de contrôle (\', \", \n, \r, \t, \\) sont traités. Entre guillemets doubles, \xFF est également traité, où FF est le code hexadécimal du caractère sur deux chiffres. Entre guillemets simples, le texte n'est pas traité.
Exemple. la valeur de la variable de modèle ur_signature
Les variables de type ur_* n'apparaissent que lors de la conversion de /var/calculate/remote/calculate.env :
ur_signature provient du champ signature du service mail. Dans les événements d'installation, une telle variable n'existe pas, et
la balise retire le modèle avec l'erreur variable de gabarit 'ur_signature' non trouvée - ce n'est pas replace() qui échoue,
mais un accès à une variable d'un autre contexte.
Calculate Company\nRussie, Saint-Pétersbourg, place Stachek, 4\nhttp://www.calculate.ru\n+7 812 3363632\n+7 495 7727678
lors de l'exécution de la fonction
#-replace('\n',"\n",ur_signature)-#
le texte suivant sera inséré au point d'insertion (le caractère "\n" sera remplacé par un saut de ligne)
Calculate Company Russie, Saint-Pétersbourg, place Stachek, 4 http://www.calculate.ru +7 812 3363632 +7 495 7727678
L'exemple ci-dessous permet de convertir l'espace dans la valeur de hr_board_model en caractère de soulignement.
...
|main.hr_board_model | rs | |P8H77-V LE|
...
#?replace("\x20","_",main.hr_board_model)==P8H77-V_LE#
...
#replace#
rnd(type,len) - affichage d'une combinaison aléatoire de caractères.
où :
-
type - les caractères utilisés ; valeurs possibles
hexdonne une chaîne plate de[0-9a-f], alors queuuiddonne la forme UUID avec des tirets, c'est pourquoi#-rnd(uuid,16)-#renvoie non pas 16 mais 18 caractères (cc842c8f-a93d-406c) : les tirets comptent aussi dans la longueur, et l'argument définit le nombre de chiffres hex, mais pas la longueur finale de la chaîne. La longueur deuuidne peut pas dépasser 32 -rnd(uuid,40)est rejetée, etlenest obligatoire pour tous les types saufuuid. -
len - le nombre de caractères (un nombre). Vous pouvez ne pas l'indiquer lors de la génération uuid dans les utilitaires 3.5.
Exemple. Affichez trois nombres aléatoires (par exemple 372) :
#-rnd(num,3)-#
Exemple pour 3.5. Générez un demi-UUID et un UUID complet.
#-rnd(uuid,16)-# #-rnd(uuid)-#
sum(var,sum_print, sum_out) - valeurs calculées des décalages. La fonction a été développée pour la configuration de Plasma (KDE).
-
var - le nom de la variable de fonction "sum". Le nom doit commencer par une lettre et peut contenir des lettres latines et des chiffres. La variable est créée pendant le traitement du fichier de configuration.
-
sum_print - une expression arithmétique dont le résultat sera affiché à l'endroit où la fonction est déclarée. En l'absence d'argument, la valeur ne sera pas affichée. Les opérations d'addition "+", de soustraction "-", de division "/" et de multiplication "*" sont prises en charge. D'autres variables de fonction peuvent participer à l'expression arithmétique, ainsi que les variables de modèle.
-
sum_out - une expression arithmétique dont le résultat sera affecté à la variable "var" (le premier argument de la fonction). En l'absence de troisième argument, la valeur calculée du deuxième argument est affectée à la variable "var".
-
Créez la variable "clock" et affectez-lui la valeur 15 sans afficher le résultat.
#-sum(clock,,15)-#
-
Créez la variable "bt", affectez-lui la valeur de la variable "clock" et affichez la valeur.
#-sum(bt,clock)-#
-
Placez un bouton sur un panneau de "35" pixels de large, en laissant une marge de "4" pixels sur les bords :
#-sum(bt,bt+2,bt+35+2)-#
wallpaper(resolution, wallpapers_path, file) - la fonction choisit, dans le répertoire, l'image la mieux adaptée à la résolution indiquée. La fonction renvoie le chemin complet. Le troisième paramètre est utilisé pour obtenir le nom du fichier.
-
resolution - la résolution requise (la résolution courante peut être obtenue depuis les variables
os_x11_resolution,os_install_x11_resolution) -
wallpapers_path - le chemin où se trouve l'image sous différentes résolutions. Format des fichiers1024x768.jpg
-
file - ne peut prendre que
filecomme valeur, auquel cas la fonction ne renvoie que le nom du fichier.
wallpapers_path peut être indiqué par un fichier. Dans ce cas, la fonction renvoie l'image indiquée.
Exemple :
Le répertoire /usr/share/wallpapers/1 contient les images suivantes :
-
1024x768.jpg
-
1280x1024.jpg
-
1680x1050.jpg
-
1920x1080.jpg
#-wallpaper(1280x720,/usr/share/wallpapers/1)-#
renvoie /usr/share/wallpapers/1/1920x1080.jpg comme la mieux adaptée en termes de proportions
#-wallpaper(1280x720,/usr/share/wallpapers/1,file)-#
renvoie 1920x1080.jpg
Vous pouvez utiliser les variables indiquées plus haut pour obtenir la résolution courante
#-wallpaper(#-install.os_install_x11_resolution-#,/usr/share/wallpapers/1)-#
profile() - la fonction est utilisée lors de la configuration du profil utilisateur et renvoie son état.
-
configured le profil est configuré par les utilitaires
-
empty le profil est vide, ou ne contient que des fichiers /etc/skel
-
custom le profil n'est pas configuré par les utilitaires Calculate
Les valeurs empty et custom ne sont utilisées que pour la première détermination de l'état du profil utilisateur : dans le premier cas le profil sera configuré par les utilitaires, dans le second il recevra une note dans .calculate/ini.env indiquant que le profil n'a pas besoin d'être configuré par la suite. Un profil qui contient .calculate/ini.env est toujours configured.
world(category) - la fonction est utilisée pour construire le fichier world. Renvoie la liste des paquets de la catégorie indiquée disponibles pour l'installation. Si la catégorie ne contient aucun paquet à installer ou est indiquée incorrectement, un message d'avertissement sera affiché.
Exemple :
#-world(dev-lang)-#
... dev-lang/orc:0 dev-lang/perl:0 dev-lang/php:8.2 ...
Modes de fusion
Il existe plusieurs façons de fusionner un modèle d'installation avec le fichier d'origine du système :
-
join - le mode de fusion principal, lorsque les deux fichiers sont fusionnés. Il est décrit en détail dans le "schéma de fusion".
-
before - le modèle est réécrit au début du fichier d'origine
-
after - le modèle est réécrit à la fin du fichier d'origine
-
replace - le modèle est réécrit en remplaçant le fichier d'origine
-
delete - la fusion n'a pas lieu, le fichier d'origine est supprimé
-
remove - au lieu de la fusion, le fichier d'origine est supprimé
Modification du modèle avant la fusion, pour les modes de fusion before, after, replace :
-
si des éléments de contrôle existent, ils sont traités
-
si un en-tête existe, il est traité
-
если существует параметр format в заголовке то происходит обработка управляющих символов: "+, -, !"
Règles par défaut
Par défaut, le mode de fusion est défini selon le format du fichier. Pour les formats de fichiers des principales applications samba, bind, etc., la fusion join s'applique par défaut ; pour les formats raw et bin - la fusion replace. Pour un fichier vide, la règle de fusion delete s'applique par défaut - le fichier cible est supprimé du système.
Il existe aussi un troisième cas
Il existe aussi un troisième cas : pour patch, diff, dconf, ldif, contents, sqlite, backgrounds, le mode de fusion par défaut est patch, et indiquer append=join pour eux n'est pas autorisé - le moteur répond Option incorrecte 'append=join' dans le modèle. Un modèle vide ne supprime pas le fichier : avec raw le fichier est tronqué à zéro, avec les formats le fichier est tronqué à zéro, avec les formats join ( (kde, , samba) la cible reste intacte, et le moteur ne connaît aucune valeur ) la cible reste intacte, et le moteur ne connaît aucune valeur append=delete - un tel en-tête est rejeté. - un tel en-tête est rejeté. append=remove sert à la suppression. sert à la suppression.
raw le fichier est tronqué à zéro, avec les formats le fichier est tronqué à zéro, avec les formats join ( (kde, , samba) la cible reste intacte, et le moteur ne connaît aucune valeur ) la cible reste intacte, et le moteur ne connaît aucune valeur append=delete - un tel en-tête est rejeté. - un tel en-tête est rejeté. append=remove sert à la suppression. sert à la suppression.
Les règles de fusion peuvent être modifiées en définissant le paramètre append de l'en-tête du fichier modèle.
Emplacement
Règles de nommage des fichiers
Les noms des fichiers modèle peuvent contenir des opérateurs conditionnels qui définissent les règles selon lesquelles le fichier modèle sera transféré dans le système. Comme pour un lien vers une page du site, les conditions sont séparées du nom par un point d'interrogation (?), après lequel peuvent figurer des opérateurs conditionnels, décrits en détail dans les blocs conditionnels (voir ci-dessus).
Les opérations arithmétiques peuvent être combinées par les conditions ET (&) et OU (?). Dans ce cas, la priorité sera donnée à la condition ET.
Un & simple comme "ET" n'est pas accepté dans l'en-tête simple comme "ET" n'est pas accepté dans l'en-tête :
Un & simple comme "ET" n'est pas accepté dans l'en-tête simple comme "ET" n'est pas accepté dans l'en-tête : os_linux_shortname==CLD&cl_ver>=99 donne en-tête de gabarit invalide; seul && fonctionne, et || lui est subordonné selon la priorité "ET". Le caractère ? n'est pas un opérateur OU : dans un nom de fichier, il sépare les conditions, dont chacune doit être remplie - grub.conf?os_linux_shortname==CDS?os_linux_shortname==CLD s'applique sous s'applique sous CLD et ne s'applique pas sous et ne s'applique pas sous CLDG..
grub.conf?os_linux_shortname==CDS?os_linux_shortname==CLD s'applique sous s'applique sous CLD et ne s'applique pas sous et ne s'applique pas sous CLDG..
Exemple :
grub.conf?os_linux_shortname==CDS?os_linux_shortname==CLD
Dans l'exemple donné, le fichier modèle configurera le chargeur de démarrage aussi bien pour les systèmes Calculate Linux Desktop que pour Calculate Directory Server.
Si l'en-tête du fichier modèle contient des opérateurs conditionnels, les deux expressions conditionnelles doivent être remplies pour que le fichier modèle soit transféré dans le système.
Règles de nommage des répertoires
Les règles de nommage des répertoires sont semblables aux règles de nommage des fichiers. Lorsque les conditions définies par les opérateurs conditionnels sont remplies, le répertoire sera transféré dans le système ; sinon le répertoire sera ignoré avec tout son contenu.
Droits d'accès
Les droits d'accès d'un fichier de configuration après sa fusion avec le fichier modèle sont définis selon les priorités suivantes :
-
si le fichier de configuration existe dans le système, les droits seront conservés inchangés ;
-
si le fichier de configuration d'origine est absent, les droits seront définis à 644 pour le fichier et 755 pour le répertoire ;
-
si la valeur de la variable
chmodouchownde l'en-tête du fichier modèle est définie, les droits du fichier de configuration seront modifiés selon la valeur définie.
Liens symboliques
Pour créer des liens symboliques, utilisez les paramètres "link + symbolic" de l'en-tête du fichier modèle.
Si, en plus de l'en-tête, le fichier modèle contient un corps de modèle, le fichier d'origine sera modifié selon les règles de fusion.
Calculate ne transférera pas les soi-disant "liens cassés" - des liens ne pointant vers aucun fichier (répertoire), sauf si le paramètre force est explicitement indiqué.
Un lien cassé est transféré également : un répertoire modèle avec link= copie un lien symbolique orphelin vers la cible sans aucun force, et symbolic avec link= vers un fichier inexistant crée lui aussi un lien qui ne pointe nulle part (resolves: False). En même temps, force dans l'en-tête d'un répertoire n'est pas accepté (paramètre d'en-tête incorrect : 'force'), si bien que l'exception décrite ne peut pas être exprimée dans ce cas.
Schéma de fusion
La fusion modifie les paramètres du fichier de paramètres d'origine selon les paramètres du fichier modèle.
Pendant la fusion, toutes les entrées du fichier d'origine et du fichier modèle sont décomposées en éléments : sections, variables, listes, listes séparées, commentaires, éléments de contrôle (voir ci-dessous).
Le fichier modèle doit être rédigé en utilisant la syntaxe du fichier d'origine. La fusion préserve la position des éléments du fichier d'origine. Pendant la fusion, les commentaires du fichier modèle ne sont pas transférés.
Règles de fusion
Les opérations Joindre, Remplacer, Supprimer peuvent être effectuées sur les éléments :
Joindre
-
Les éléments absents du fichier d'origine sont ajoutés à la fin de la section. Dans ce cas, s'il y a un saut de ligne avant l'élément inséré, un saut de ligne est ajouté après l'élément inséré. Dans le cas contraire, un saut de ligne est ajouté avant l'élément inséré.
-
Lors de la fusion d'une liste séparée, les éléments manquants sont ajoutés juste après le dernier élément de la liste séparée du fichier de configuration.
Remplacer
- Les valeurs des éléments sont remplacées par de nouvelles. Dans ce cas, la mise en forme est reprise du fichier modèle.
Supprimer
- L'élément est supprimé avec le saut de ligne qui le précède.
Règles de fusion par défaut
Les règles de fusion s'appliquent aux éléments portant le même nom situés dans la même section du modèle.
Lorsque des différences sont trouvées, les règles suivantes s'appliquent par défaut :
-
Sections - le contenu de deux sections est joint (+).
-
Variables - les valeurs des variables sont remplacées (-).
-
Listes - le contenu des listes est remplacé (-).
-
Listes séparées - comme pour la règle de fusion des variables - les valeurs des listes sont remplacées (-).
Modification des règles de fusion
-
"+" - joindre les éléments (pour les sections et les listes) ; après la fusion, seuls les éléments uniques restent
-
"-" - la valeur de l'élément est remplacée
-
"!" - l'élément est supprimé. Dans les descriptions de fichier modèle CXmlConf, ces règles sont décrites par la balise "
<action>".
Format CXmlConf
Remarque. Cette section décrit un format historique : l'implémentation CXmlConf est absente des utilitaires actuels et le format n'est pas pris en charge.
CXmlConf est un format universel de description des fichiers de configuration. Il est conçu pour la modification sélective des paramètres de la plupart des types courants de fichiers de configuration des systèmes d'exploitation Linux/Unix.
Le fichier XML de description des paramètres découpe le fichier de configuration en structures logiques - éléments adaptés à une fusion ultérieure. Après la fusion, le fichier peut être reconverti dans son état d'origine, à quelques exceptions près (voir Schéma de fusion).
Les descriptions d'éléments sont imbriquées dans la construction :
<cxmlconf>
<head>
<ver>version du format</ver>
<format>format du fichier de configuration</format>
</head>
<body>
[<area>...</area>... <field>..</field>]
</body>
</cxmlconf>
-
ver - transmet le numéro de version du balisage
-
format - le format du fichier de configuration (déterminé d'après les programmes courants).
Tous les éléments (voir ci-dessous) sont placés dans l'élément <body/>.
Sections
Les sections des fichiers de configuration délimitent l'espace de noms des variables. Les sections peuvent contenir des structures logiques, notamment d'autres sections (exemple : named.conf).
Les sections sont placées dans la construction :
<area>
<caption>
<name>Titre de la section</name>
<action>join|replace|drop</action>
<quote>Partie initiale de la section (titre)</quote>
<quote>Partie finale de la description de la section</quote>
</caption>
[<field></field>...]
</area>
Variables
Les variables s'écrivent sous la forme :
<field type="var"> <name>nom de la variable</name> <value>valeur de la variable</value> <action>join|replace|drop</action> <quote>Texte d'origine de la description</quote> </field>
Certains fichiers de configuration, par exemple /etc/openldap/slapd.conf, contiennent cette construction :
index cn pres,sub,eq index sn pres,sub,eq index uid pres,sub,eq
Dans ce cas, le nom de la variable se compose des première et deuxième parties, et la valeur - de la troisième.
La ligne
index cn pres,sub,eq
En XML, cela ressemblera à :
<field type="var"> <name>indexcn</name> <value>pres,sub,eq</value> <quote>index cn pres,sub,eq</quote> </field> <field type="br"/>
Listes
Dans l'exemple du fichier named.conf, le bloc "listen-on" peut ne contenir que des valeurs - des valeurs du bloc, non des variables.
La construction pour désigner les valeurs est :
<field type="list"> <name>hostsallow</name> <value>192.168.0.0/24</value> <value>127.</value> <action>join|replace|drop</action> <quote>Texte d'origine de la liste</quote> </field>
où, à l'intérieur du bloc "<quote>", le texte d'origine de la description de la valeur est conservé, sans le saut de ligne final.
Listes séparées
Le fichier de paramètres du serveur web Apache peut contenir une directive "Include", qui permet de rendre le fichier source modulaire. De tels cas sont décrits dans "CXmlConf" comme "Listes séparées".
Les listes séparées sont décrites par la construction suivante :
<field type="seplist"> <name>Include</name> <value>/etc/apache2/modules.d/*.conf</value> <action>join|replace|drop</action> <quote>Texte d'origine de la liste</quote> </field>
Commentaires
Lors de la fusion des fichiers de configuration, les commentaires du fichier d'origine sont conservés inchangés.
Tous les types de commentaires sont placés dans la construction "<comment>". Le texte placé dans "<quote/>" conserve les caractères de commentaire et le saut de ligne :
<field type="comment"> <quote>Texte d'origine du commentaire</quote> </field>
Les commentaires ne peuvent pas être imbriqués (être décrits dans d'autres constructions de commentaires).
Éléments de contrôle
La construction pour désigner les sauts de ligne est :
<field type="br"> <quote>éléments de séparation (espaces, tabulations)</quote> </field>
- "quote" contient des éléments de mise en forme (espaces, tabulations)
Format XML
Formats XML pris en charge
À l'heure actuelle, les formats xml_xfce (fichier XML pour configurer le gestionnaire de fenêtres XFCE), xml_xfcepanel (fichier XML pour configurer les panneaux du gestionnaire de fenêtres XFCE), xml_gconf (fichier XML pour configurer GNOME) sont pris en charge ; la version actuelle contient aussi un quatrième - xml_gconf_tree (décrit ci-dessous).
Différences avec le format CXmlConf
-
Les fichiers XML sont stockés et traités sans conversion vers un autre format.
-
Toutes les règles, fonctions et variables s'appliquent au fichier modèle XML comme à un modèle ordinaire, à l'exception des opérations de jonction des éléments XML
Joindre les éléments XML
Pour joindre des éléments XML dans le texte du modèle XML, l'attribut de l'élément XML 'action' est utilisé
Valeurs autorisées de l'attribut
-
action="join" - les éléments sont joints (s'applique par défaut)
-
action="replace" - l'élément du modèle remplace l'élément du fichier
-
action="drop" - l'élément du fichier est supprimé
Format xml_xfce
Le format se compose des éléments channel et property.
Les attributs de channel contiennent le nom et la version du fichier.
À l'intérieur de l'élément channel se trouvent les éléments property.
Exemple d'un élément "channel" :
<channel name="xfwm4" version="1.0"> <property name="general" type="empty"> ..... </property> </channel>
Exemple d'un élément "property" :
<property name="wrap_workspaces" type="bool" value="false"/>
Chaque élément property possède un attribut type.
Si type="array", cet élément et ses éléments internes sont remplacés par les éléments du modèle. Sinon, les éléments sont fusionnés.
Exemple de type="array" :
<property name="workspace_names" type="array"> <value type="string" value="Espace de travail 1"/> <value type="string" value="Espace de travail 2"/> <value type="string" value="Espace de travail 3"/> <value type="string" value="Espace de travail 4"/> </property>
Format xml_xfcepanel
Le format se compose des éléments suivants : panels, panel, properties, property, items, item.
S'il s'agit de l'élément items, cet élément et ses éléments internes sont remplacés par les éléments du modèle. Sinon, les éléments sont fusionnés.
Exemple d'un élément "items" :
<items> <item name="xfce4-mixer-plugin" id="9"/> <item name="clock" id="10"/> <item name="separator" id="52"/> <item name="actions" id="12"/> </items>
Format xml_gconf
Le format se compose des éléments entry.
Si un élément entry possède un attribut ltype (une liste) ou un attribut type="string", cet élément et ses éléments internes sont remplacés par les éléments du modèle ; sinon, les éléments sont fusionnés.
Le remplacement n'a lieu que pour les éléments sans balise fille : <entry name="dpi" type="float" value="96"/> dans le fichier existant reçoit value="86". Si le fichier de configuration en cours de fusion contient déjà un <entry> avec un <stringvalue> fils (c'est le cas de type="string" ou de ltype), la fusion s'interrompt avec La fusion des modèles a échoué, et le fichier reste intact. C'est un défaut connu de l'implémentation actuelle du format ; la solution de contournement utilisée par l'overlay est append=replace ; le fichier est alors écrasé par le contenu du modèle. Un fichier créé à partir de zéro avec le même modèle est généré normalement, et son mtime est remplacé par l'heure courante.
L'attribut mtime d'un élément entry, lorsque l'élément entry change, indique l'heure à laquelle la modification a eu lieu, en secondes.
Exemple d'un modèle xml_gconf :
# Calculate format=xml_gconf
<?xml version="1.0"?>
<gconf>
<entry name="rgba_order" mtime="1235158855" type="string">
<stringvalue>rgb</stringvalue>
</entry>
<entry name="dpi" mtime="1235162438" type="float" value="86">
</entry>
<entry name="hinting" mtime="1235266915" type="string">
<stringvalue>full</stringvalue>
</entry>
<entry name="antialiasing" mtime="1235266915" type="string">
<stringvalue>rgba</stringvalue>
</entry>
</gconf>
Format xml_gconf_tree
Le format se compose des éléments dir et entry et de leurs attributs.
Les attributs des éléments sont fusionnés dans le cas d'une fusion join.
Lors de la fusion d'un modèle avec un fichier de configuration, les éléments entry du fichier de configuration sont remplacés par les éléments entry correspondants du modèle.
L'attribut mtime d'un élément entry, lorsque l'élément entry change, indique l'heure à laquelle la modification a eu lieu, en secondes.
Lors de la fusion avec un fichier déjà existant, le même défaut que pour xml_gconf s'applique : La fusion des modèles a échoué ; append=replace fonctionne, ne laissant dans la cible que les éléments du modèle. L'exemple ci-dessous est balisé correctement et s'analyse comme du XML avec gconf pour racine. Si vous cassez délibérément la balise fermante de la racine en laissant <gconf>, le moteur répond Le gabarit n'est pas en format XML ; une fois </gconf> restaurée, l'exemple s'analyse et se fusionne de nouveau.
Exemple d'un modèle xml_gconf :
# Calculate format=xml_gconf_tree
<?xml version="1.0"?>
<gconf>
<dir name="desktop">
<dir name="gnome">
<dir name="volume_manager">
<entry name="percent_used" mtime="1285580987" schema="/schemas/desktop/gnome/volume_manager/percent_used"/>
</dir>
</dir>
</dir>
</gconf>
Exemples d'utilisation
Fichier de modèle :
# Calculate format=xml_xfce
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfce4-session" version="1.0">
<property name="general" type="empty" action="drop">
<property name="FailsafeSessionName" type="empty"/>
<property name="SessionName" type="string" value="Default"/>
<property name="SaveOnExit" type="bool" value="true"/>
</property>
</channel>
La ligne <property name="general" type="empty" action="drop"> signifie que cet élément et tous les éléments internes sont supprimés.
Le fichier obtenu est le suivant :
<?xml version="1.0" encoding="UTF-8"?> <channel name="xfce4-session" version="1.0"> </channel>
À noter : le moteur prend l'attribut name de <channel> non pas du modèle, mais du nom du fichier cible - pour le fichier
xfceplain.xml, vous obtenez <channel name="xfceplain" version="1.0"> avec le même texte de modèle. Si le nom
du canal doit différer du nom du fichier, définissez-le par une entrée property séparée à l'intérieur du canal.
Le contenu correspond : l'élément general avec ses éléments internes est supprimé, action="drop" fonctionne. L'attribut name de channel est pris du nom du fichier de configuration (xfce4-session.xml → name="xfce4-session", xf.xml → name="xf"), et le fichier créé reçoit un en-tête d'origine Calculate (<!-- Modified Calculate Utilities … -->), которого в примере выше нет.
Format 'patch'
Le format patch traite les fichiers de configuration à l'aide d'expressions régulières du langage de programmation Python.
Fonctionnalités
Le format patch traite le fichier de configuration à partir du modèle (type de fusion patch) ; il n'y a pas de fusion entre le modèle et le fichier de configuration.
Le fichier source est traité dans son ensemble, et non ligne par ligne, donc les caractères '^' et '$' désignent respectivement le début et la fin du fichier. Le caractère '.' désigne n'importe quel caractère sauf le saut de ligne.
Les paramètres d'en-tête pour format=patch incluent les options multiline et dotall. Avec multiline activé, '^' et '$' désignent le début et la fin d'une ligne. Avec dotall activé, '.' inclut le saut de ligne.
Les deux options ne sont acceptées qu'avec format=patch : dans un en-tête, format=raw multiline fait répondre au moteur L'option multiline ne doit être utilisée que pour format=patch, et format=raw dotall - L'option dotall ne doit être utilisée que pour format=patch ; avec format=patch, les deux fonctionnent comme décrit.
Description
Un modèle au format patch :
# Calculate format=patch <reg>expression régulière python 1</reg> <text>texte 1 remplaçant l'expression régulière</text> <reg>expression régulière python 2</reg> <text>texte 2 remplaçant l'expression régulière</text> ...
Dans le contenu des balises reg et text, les caractères &, <, > doivent être remplacés par &, <, > respectivement.
Exemple :
# Calculate format=patch <reg>TEXT&DATA</reg> <text>TEXT_CONFIG</text>
Ce modèle remplacera TEXT&DATA par TEXT_CONFIG dans le fichier de configuration.
Format 'diff'
Le format diff applique des correctifs diff au code source d'un paquet. Le fichier lui-même n'est pas créé dans le système ; le contenu obtenu est traité par rapport au répertoire indiqué dans le paramètre path=.
path n'influence pas la recherche du fichierpanel-plugin/xkb-cairo.c à la racine est patché (Application du patch), tandis que le même correctif avec le fichier dans usr/src/xfce/panel-plugin/xkb-cairo.c et path=/usr/src/xfce donne Impossible de corriger.
Exemple :
# Calculate format=diff --- panel-plugin/xkb-cairo.c 2012-07-17 16:23:24.997030066 +0400 +++ panel-plugin/xkb-cairo.c 2012-07-17 16:47:34.107054590 +0400 @@ -27,7 +27,7 @@ #include "xkb-util.h" #include "xfce4-xkb-plugin.h" -#define XKB_PREFERRED_FONT "Courier New, Courier 10 Pitch, Monospace Bold %d" +#define XKB_PREFERRED_FONT "Droid Sans, Courier New, Courier 10 Pitch, Monospace Bold %d"
Le hunk doit être complet : l'en-tête @@ -27,7 +27,7 @@ signifie sept lignes avant la modification - trois lignes de contexte
en haut, une ligne supprimée et trois lignes de contexte en bas. Si les lignes de contexte finales sont omises, patch
rejette le hunk et la fusion s'interrompt avec Impossible de corriger ; avec un hunk complet, le correctif est appliqué
(Application du patch), et le moteur essaie lui-même le niveau de retrait du chemin de -p0 à -p3.
Format 'kernel'
Le format kernel fusionne les fichiers de configuration du noyau sans conserver les commentaires.
Exemple :
# Calculate format=kernel CONFIG_XFS_FS=m CONFIG_REISERFS_FS=y # CONFIG_EXT3_FS is not set !CONFIG_EXT3_FS_POSIX_ACL= !CONFIG_EXT3_FS_SECURITY= !CONFIG_EXT3_FS_XATTR=
Format 'dconf'
Le format dconf sert à modifier les paramètres utilisateur stockés dans la base dconf. Le format dconf prend en charge le paramètre d'en-tête dconfpath pour changer le chemin de base des paramètres.
Le paramètre d'en-tête s'appelle dconf, comme dans l'exemple ci-dessous ; l'orthographe dconfpath n'est pas acceptée : # Calculate format=dconf dconfpath=/org/x/ … donne paramètre d'en-tête incorrect : 'dconfpath' (c'est le nom d'un attribut interne du format, pas un paramètre d'en-tête). dconf= n'est autorisé qu'avec format=dconf ; dans un autre en-tête, il donne Option dconf doit être utilisée pour format=dconf uniquement.
Exemple :
# Calculate format=dconf dconf=/org/gnome/eog/ [view] background-color='#000000' use-background-color=true [ui] statusbar=true toolbar=true sidebar=false
Pour appliquer les modèles au format dconf, les utilitaires utilisent le paquet gnome-base/dconf.
Ce format n'est fusionné que dans l'événement du profil utilisateur. Dans l'arborescence, ces modèles se trouvent dans 6_ac_desktop_profile/2-user/<category>/<package>/…, où le .calculate_directory du répertoire de l'événement contient # Calculate env=desktop path=~ name= chown=#-main.ur_login-#:#-main.ur_group-# ac_desktop_profile==on, et le .calculate_directory du répertoire 2-user - # Calculate append=skip ur_login!=root. La variable d'action doit se trouver au premier niveau : si vous placez le modèle plus bas et laissez la condition dans le deuxième répertoire, le moteur répond Aucune condition de vérification pour une variable d'action et affiche Répertoires omis :. Vous pouvez déclencher l'événement avec la commande cl-core --method=desktop -u <user> ; la base créée se trouve dans ~/.config/dconf/user, appartient à l'utilisateur lui-même et se lit avec la commande su - <user> -c 'dbus-run-session -- dconf dump /org/gnome/eog/'.
Le format est indisponible si /usr/bin/dconf, dbus-run-session et su ne sont pas trouvés : le modèle se termine par le message Le format 'dconf' est indisponible.
Format 'json'
Le format json sert à modifier les paramètres au format json (par exemple Preferences du paquet www-client/chromium).
Exemple json
{"google": {"services": {"signin": {"LSID": "", "SID": ""}}},
"intl": {"accept_languages": "ru-RU,ru,en-US,en", "status": 1}}
Lors de la fusion, les valeurs de premier niveau sont remplacées par celles fournies, et la branche imbriquée du même nom issue du modèle remplace entièrement la branche du fichier : les autres clés de cette branche disparaissent. Si vous avez besoin de conserver le contenu d'une branche, indiquez-la en entier dans le modèle.
Pour modifier les règles de fusion appliquées par défaut, des caractères de contrôle sont ajoutés au début du nom de l'élément dans le fichier de modèle :
-
"-" - la branche est remplacée
-
"!""!"** - la branche est supprimée
Les deux caractères ne fonctionnent qu'au niveau supérieur du document{"a": {"b": {"-c": ""}}} donne la clé "-c" telle quelle. Le fichier est toujours écrit avec un retrait de quatre espaces ; la forme compacte du fichier source n'est pas conservée.
Exemple de fusion
# Calculate format=json
{"intl":{"accept_languages": "en"}}
{
"google": {
"services": {
"signin": {
"LSID": "",
"SID": ""
}
}
},
"intl": {
"accept_languages": "en"
}
}
Exemple de suppression
# Calculate format=json
{"!intl":""}
{
"google": {
"services": {
"signin": {
"LSID": "",
"SID": ""
}
}
}
}
Exemple de remplacement
# Calculate format=json
{"-intl":{"accept_languages": "en"}}
{
"google": {
"services": {
"signin": {
"LSID": "",
"SID": ""
}
}
},
"intl": {
"accept_languages": "en"
}
}
La branche de paramètres est également remplacée entièrement si le modèle contient une valeur.
Exemple de remplacement
# Calculate format=json
{"intl": 5}
{
"google": {
"services": {
"signin": {
"LSID": "",
"SID": ""
}
}
},
"intl": 5
}
Le format 'contents'
Le format contents sert à modifier les paquets auxquels les fichiers appartiennent. Il permet d'ajouter des fichiers à un paquet, de les supprimer, et de changer le paquet auquel un fichier appartient. Chaque ligne du modèle est une instruction décrivant une action sur des fichiers. Les lignes vides sont ignorées, ainsi que les lignes de commentaire commençant par #.
Ajout d'un fichier à un paquet.
<package> <path>
-
package - le paquet auquel le fichier sera ajouté. Le paquet peut être indiqué avec une version ou un slot, pour plus de précision.
-
path - un chemin dans le système de fichiers. Les caractères génériques sont pris en charge (*, [], [!], ?)
Le fichier est ajouté au paquet même s'il appartient déjà à un autre paquet. Si le système contient deux paquets et que la règle n'indique pas de slot, le fichier sera ajouté au paquet dont la version est la plus élevée. La somme de contrôle du fichier est calculée lors de son ajout.
Suppression de l'appartenance d'un fichier à un paquet.
!<package> <path>
Pour obtenir la liste des fichiers à supprimer (utilisation de caractères génériques), c'est la liste des fichiers du paquet qui est utilisée, et non le système de fichiers. Si le système contient deux paquets et que la règle n'indique pas de slot, le fichier sera supprimé des deux paquets.
Déplacement d'un fichier d'un paquet à un autre
<source>,<target> <path>
-
source - le paquet duquel le fichier sera supprimé
-
target - le paquet auquel le fichier sera ajouté
-
path - un chemin dans le système de fichiers. Les caractères génériques sont pris en charge (*, [], [!], ?)
Pour obtenir la liste des fichiers, tout comme pour la suppression, c'est la liste des fichiers du paquet source qui est utilisée, et non le système de fichiers. La somme de contrôle des fichiers sera transférée depuis le paquet source. Ainsi, si un fichier a été modifié par l'utilisateur alors qu'il appartenait au paquet source, après son association au paquet target, le système le verra comme modifié.
Exemples
# Calculate format=contents # ajouter au paquet openrc les fichiers de /etc/conf.d dont le nom commence par dhcp sys-apps/openrc /etc/conf.d/dhcp* # ajouter au paquet udisks, second slot sys-fs/udisks:2 /etc/polkit-1/rules.d/60-* # ajouter au paquet udisks avec la version 1.0.5-r1 sys-fs/udisks-1.0.5-r1 /etc/polkit-1/rules.d/60-* # retirer la propriété de /etc/conf.d/hostname au paquet openrc !sys-apps/openrc /etc/conf.d/hostname # déplacer les fichiers appartenant à sys-apps/baselayout de /etc/conf.d vers le paquet openrc sys-apps/baselayout,sys-apps/openrc /etc/conf.d/*
Le format 'backgrounds'
Il nécessite le paquet media-gfx/imagemagick.
Sans media-gfx/imagemagick, tout modèle de ce format se termine par le message The 'backgrounds' format is unavailable. Need to install virtual/imagemagick-tools, et aucune image n'est créée. Les paramètres convert= et stretch ne sont acceptés qu'ici : dans un autre en-tête, le moteur répond Option convert doit être utilisé pour format=backgrounds uniquement et Option stretch doit être utilisé pour format=backgrounds uniquement.
Le format backgrounds sert à créer plusieurs images d'arrière-plan de résolutions différentes à partir d'une image source.
Les paramètres d'en-tête suivants sont utilisés :
-
link= paramètre indiquant l'image source, si le paramètre n'est pas indiqué ou indique un fichier inexistant, les images ne seront pas créées
-
convert= le format et l'extension des images d'arrière-plan finales (
jpg,png,gif,gfxboot), par défaut le format de l'image source est le même que l'extension du fichier source. -
stretch créer les images même si l'image source est plus petite que nécessaire
-
mirror si l'image source est absente, toutes les images précédemment créées par ce modèle seront supprimées
-
path= le répertoire dans lequel les images créées seront placées
-
name= un préfixe ajouté au nom du fichier
Les noms des images sont formés comme suit : (prefix)(resolution).(format), où prefix est le nom obtenu depuis le paramètre name=, resolution est la résolution de l'image créée, format est le format de l'image (jpg, png, gif ou gfxboot). Gfxboot - un jpeg avec des paramètres spécifiques, adaptés pour installer l'image comme image d'arrière-plan pour syslinux-gfxboot.
En plus des images, le modèle crée un fichier de somme de contrôle : name=bg- donne bg.md5 à côté. Si name= est laissé vide, le fichier de somme de contrôle prend le nom md5sum.
Le contenu du format est un ensemble de lignes contenant les résolutions des images à créer. Si le contenu n'est pas indiqué, la liste des résolutions standard indiquées dans la variable main.cl_resolutions sera utilisée.
Si la résolution de l'image source est plus petite que celle de l'image finale, l'image ne sera pas créée, et un avertissement sera affiché. Si le paramètre stretch est indiqué, l'image source sera étirée jusqu'à la résolution voulue.
Pour empêcher la réexécution du modèle, un fichier avec la somme de contrôle de l'image source est utilisé.
Toutes les images créées (ainsi que le fichier de somme de contrôle) sont "associées" au paquet que les modèles configurent.
Si une seule résolution est indiquée, un seul fichier avec la résolution voulue sera créé, et le nom du fichier final sera composé de path/name. Le fichier de somme de contrôle ne sera pas créé.
À la place d'une résolution, vous pouvez indiquer original, ce qui signifie la résolution de l'image source. Il peut être utilisé, par exemple, pour convertir une image d'un format dans un autre.
Exemples.
Créer des images dans /usr/share/wallpapers/Calculate_Linux/images/contents/images, avec des noms de type 1920x1080.jpg, à partir de /usr/share/backgrounds/bg.png, sans créer d'images avec une résolution supérieure à celle de l'image source.
# Calculate format=backgrounds convert=jpg link=/usr/share/backgrounds/bg.png \ path=/usr/share/wallpapers/Calculate_Linux/images/contents/images name=
Créer des images dans /etc/splash/calculate/images, avec des noms de type silent-1920x1080.jpg, à partir de /usr/share/backgrounds/bg.png, l'image source sera étirée si nécessaire.
# Calculate format=backgrounds convert=jpg stretch \ link=/usr/share/backgrounds/bg.png path=/etc/splash/calculate/images name=silent-
Créer une seule image /boot/grub/grub-calculate.png avec une résolution de 1920x1440.
# Calculate format=backgrounds path=/boot/grub name=grub-calculate.png \ link=/usr/share/backgrounds/bg.png stretch 1920x1440
Le format 'world'
Le format de modification du fichier world. Il contient une liste de paquets qui doivent être soit ajoutés au fichier, soit supprimés de celui-ci. Pour supprimer un paquet de world, la syntaxe est !<пакет>. Pour supprimer avec vérification (si le paquet nécessaire est absent, un message d'avertissement sera affiché) - !!<paquet>. Si le fichier contenant la liste est nommé comme la catégorie, vous pouvez ne pas indiquer la catégorie pour les paquets à l'intérieur.
Pour supprimer un paquet dans tous les slots, la syntaxe est !<пакет>:*.
La syntaxe de suppressiondev-db/postgresql:* non trouvé dans le world. Le fichier cible est défini par le duo . Le fichier cible est défini par le duo path=/var/lib/portage name=world : si
La syntaxe de suppressiondev-db/postgresql:* non trouvé dans le world. Le fichier cible est défini par le duo . Le fichier cible est défini par le duo path=/var/lib/portage name=world : si path= indique le fichier world lui-même au lieu du répertoire, le moteur accède au fichier à l'intérieur du répertoire world, et world lui-même reste inchangé. Le préfixe de catégorie est pris du nom du fichier du modèle, et non de name= : le fichier sys-apps avec le corps avec le corps calculate-utils, , portage, , sed donne donne sys-apps/calculate-utils, , sys-apps/portage et et sys-apps/sed, tandis qu'un fichier nommé , tandis qu'un fichier nommé world donne donne world/eix..
sys-apps avec le corps avec le corps calculate-utils, , portage, , sed donne donne sys-apps/calculate-utils, , sys-apps/portage et et sys-apps/sed, tandis qu'un fichier nommé , tandis qu'un fichier nommé world donne donne world/eix..
Exemples.
Ajouter sys-apps/calculate-utils à world
# Calculate format=world path=/var/lib/portage name=world sys-apps/calculate-utils
Supprimer tous les dev-db/postgresql de world avec vérification
# Calculate format=world path=/var/lib/portage name=world !!dev-db/postgresql:*
Ajouter calculate-utils, portage, sed de la catégorie sys-apps
sys-apps
# Calculate format=world path=/var/lib/portage name=world calculate-utils portage sed
La ligne sys-apps au-dessus du troisième exemple est le nom du fichier du modèle, et non son contenu : c'est précisément du nom du fichier que le préfixe de catégorie est tiré, aussi les lignes se retrouvent dans world déjà sous la forme sys-apps/calculate-utils, sys-apps/portage, sys-apps/sed.
Les trois exemples sont un fichier à l'intérieur d'un répertoire d'événement, et non un fichier à la racine de l'arbre des modèles. La variable d'action est portée par le .calculate_directory du répertoire lui-même du répertoire lui-même : pour les exemples ci-dessus, l'arbre se présente ainsi - un répertoire
Les trois exemples sont un fichier à l'intérieur d'un répertoire d'événement, et non un fichier à la racine de l'arbre des modèles. La variable d'action est portée par le .calculate_directory du répertoire lui-même du répertoire lui-même : pour les exemples ci-dessus, l'arbre se présente ainsi - un répertoire 7_ac_install_merge/ avec un fichier .calculate_directory, où il est écrit # Calculate append=skip env=install ac_install_merge==on, et un modèle imbriqué sys-apps/calculate-utils/world portant l'un des en-têtes donnés. Sans un tel fichier, le moteur signale No conditions for checking the value of an action variable et ne crée rien. Les modèles prêts à l'emploi sont organisés de la même façon : 6_ac_install_config/dev-db/postgresql/world commence par la ligne commence par la ligne # Calculate protected format=world path=/var/lib/portage name=world, et , et ac_install_config==on se trouve dans le se trouve dans le .calculate_directory du répertoire du répertoire 6_ac_install_config..
6_ac_install_config/dev-db/postgresql/world commence par la ligne commence par la ligne # Calculate protected format=world path=/var/lib/portage name=world, et , et ac_install_config==on se trouve dans le se trouve dans le .calculate_directory du répertoire du répertoire 6_ac_install_config..
Voir aussi
- Référence des formats de modèles - quel format choisir pour un type de configuration donné.
- Fonctions de modèles personnalisées dans un overlay - fonctions utilisateur et leur priorité sur les fonctions intégrées.
- Variables de modèles - d'où viennent les valeurs
#-…-#. - Un modèle à côté du fichier :
.clt- configurer un seul fichier sans répertoire de modèles. - Le modèle n'a rien fait en silence : diagnostic - quoi regarder quand le modèle ne s'est pas appliqué.