dictionary can be a YAML file

This commit is contained in:
Emmanuel Garette 2022-11-02 22:52:50 +01:00
parent f6143e843c
commit e16230064d
947 changed files with 15213 additions and 150 deletions

View file

@ -1,6 +1,6 @@
# Rougail
Rougail est un bibliothèque python3 qui permet de charger des dictionnaires (fichiers au format XML), de charger les variables dans Tiramisu et de générer des templates.
Rougail est un bibliothèque python3 qui permet de charger des dictionnaires (fichiers au format XML ou YAML), de charger les variables dans Tiramisu et de générer des templates.
## La bibliothèque

View file

@ -17,6 +17,20 @@ Voici un exemple simple de validation des valeurs :
</constraints>
```
En YAML :
```
variables:
- variable:
name: my_variable
constraints:
- check:
- name: islower
target:
- text: my_variable
```
La [cible (de type variable)](../target/variable.md) de la fonction de vérification est ici "my_variable".
Dans cette exemple, la valeur de la variable "my_variable" va être validé par la fonction islower.
@ -50,4 +64,14 @@ Dans la contrainte, il est possible de spécifier le niveau d'erreur et le mettr
</check>
```
En YAML :
```
- check:
- name: islower
level: warning
target:
- text: my_variable
```
Dans ce cas une valeur avec une majuscule sera accepté, mais un message d'avertissement apparaitra.

View file

@ -15,6 +15,19 @@ Dans un premier dictionnaire déclarons notre variable et sa fonction de vérifi
</constraints>
```
En YAML :
```
variables:
- variable:
name: my_variable
constraints:
- check:
- name: islower
target:
- text: my_variable
```
Dans un second dictionnaire il est possible de redéfinir le calcul :
```
@ -28,6 +41,20 @@ Dans un second dictionnaire il est possible de redéfinir le calcul :
</constraints>
```
En YAML :
```
variables:
- variable:
name: my_variable
redefine: 'True'
constraints:
- check:
- name: isspace
target:
- text: my_variable
```
Dans ce cas, la fonction "islower" exécuté. Si cette fonction ne retourne pas d'erreur, la seconde fonction "isspace" sera exécuté.
## Redéfinition avec suppression d'un calcul
@ -49,13 +76,33 @@ Dans un premier dictionnaire déclarons notre variable et notre fonction de vér
</constraints>
```
En YAML :
```
variables:
- variable:
name: my_variable
constraints:
- check:
- name: islower
target:
- text: my_variable
```
Dans un second dictionnaire supprimer cette vérification :
```
<variables>
<family name="family">
<variable name="my_variable" redefine="True" remove_check="True"/>
</family>
</variables>
```
En YAML :
```
variables:
- variable:
name: my_variable
redefine: 'True'
remove_check: 'True'
```

View file

@ -22,6 +22,25 @@ La condition hidden_if_in permet de cacher une variable où une famille à l'uti
</constraints>
```
En YAML :
```
variables:
- variable:
name: condition
type: boolean
- variable:
name: my_variable
constraints:
- condition:
- name: hidden_if_in
source: condition
param:
- text: 'True'
target:
- text: my_variable
```
Le [paramètres](../param/README.md) de la condition permet de définir les valeurs que doit avoir la source pour appliquer l'action.
La [cible](../target/README.md) de la condition est ici "my_variable".
@ -47,6 +66,25 @@ Il est également possible de mettre plusieurs paramètre :
</constraints>
```
En YAML :
```
variables:
- variable:
name: condition
- variable:
name: my_variable
constraints:
- condition:
- name: hidden_if_in
source: condition
param:
- text: 'yes'
- text: 'maybe'
target:
- text: my_variable
```
## Une condition optionnelle
Il est possible de définir une condition avec une variable source qui n'existe pas dans toutes les contextes.
@ -74,3 +112,18 @@ Exemple :
<target>my_variable</target>
</condition>
```
En YAML :
```
- condition:
- name: hidden_if_in
source: condition
optional: 'True'
apply_on_fallback: 'False'
param:
- text: 'yes'
- text: 'maybe'
target:
- text: my_variable
```

View file

@ -20,6 +20,25 @@ Dans un premier dictionnaire déclarons notre variable et notre calcule :
</constraints>
```
En YAML :
```
variables:
- variable:
name: condition
type: boolean
- variable:
name: my_variable
constraints:
- condition:
- name: hidden_if_in
source: condition
param:
- text: 'True'
target:
- text: my_variable
```
Dans un second dictionnaire supprimer ce calcul :
```
@ -27,3 +46,13 @@ Dans un second dictionnaire supprimer ce calcul :
<variable name="condition" redefine="True" remove_condition="True"/>
</variables>
```
En YAML :
```
variables:
- variable:
name: condition
redefine: 'True'
remove_condition: 'True'
```

View file

@ -28,9 +28,9 @@ Il existe deux types de répertoires de dictionnaires :
- les dictionnaires principaux avec la clef "dictionaries_dir". La valeur par défaut est ['/srv/rougail/dictionaries']. Cette variable doit contenir la liste des répertoires contenants des dictionnaires.
Les dictionnaires sont chargés dans l'ordre des répertoires. Chaque répertoire est chargé les uns après les autres. A l'intérieur de ces répertoires les fichiers XML seront classés par ordre alphabétique.
Les dictionnaires sont chargés dans l'ordre des répertoires. Chaque répertoire est chargé les uns après les autres. A l'intérieur de ces répertoires les fichiers XML ou YAML seront classés par ordre alphabétique.
Il n'y a pas de classement par ordre alphabétique de l'ensemble des fichiers XML de tous les répertoires.
Il n'y a pas de classement par ordre alphabétique de l'ensemble des fichiers XML ou YAML de tous les répertoires.
Les familles et variables de ces dictionnaires sont classés, par défaut, dans l'espace de nom "rougail". Il est possible de changer le nom de cet espace de nom avec la clef "variable_namespace".
@ -44,13 +44,13 @@ RougailConfig['extra_dictionaries']['example'] = ['/dir1', '/dir2']
Les dictionnaires sont chargés dans le même ordre que les dictionnaires principaux.
### La DTD
### La DTD et le schema YAML
Rougail a besoin du fichier de DTD pour lire les fichiers dictionnaire.
Rougail a besoin du fichier de la DTD pour lire les fichiers dictionnaire de type XML et du schema YAML pour les fichiers dictionnaire de type YAML.
Par défaut le fichier de la DTD est dans le sous répertoire "data" du répertoire de code. Le nom du fichier est rougail.dtd.
Par défaut le fichier de la DTD et le schema YAML sont dans le sous répertoire "data" du répertoire de code. Le nom du fichier est rougail.dtd et rougail.yml.
Pour pouvez changer le répertoire de destination de la DTD et le nom du fichier avec la clef "dtdfilename".
Pour pouvez changer le nom du fichier DTD avec la clef "dtdfilename" et le nom du schema YAML avec la clef "yamlschema_filename".
### Le fichier de fonction

View file

@ -2,7 +2,7 @@
## Un dictionnaire ?
Un dictionnaire est un fichier XML donc la structure est décrite dans cette documentation.
Un dictionnaire est un fichier XML ou YAML donc la structure est décrite dans cette documentation.
Un dictionnaire contient en ensemble de variable chargé dans Tiramisu, utilisable à tout moment, notamment dans des templates.

View file

@ -15,6 +15,25 @@ Par exemple :
</family>
```
En YAML :
```
variables:
- variable:
name: variable
multi: 'True'
value:
- text: 'val1'
- text: 'val2'
- family:
name: my_dyn_family_
dynamic: varname
description: 'Describe '
variables:
- variable:
name: my_dyn_var_
```
Créera deux familles :
- la famille dynamique : "my_dyn_family_val1" avec la description "Describe val1"

View file

@ -43,6 +43,24 @@ Voici un exemple de définition d'une variable meneuse et de deux variables mene
</variables>
```
En YAML :
```
variables:
- family:
name: family
leadership: 'True'
variables:
- variable:
name: leader
multi: 'True'
- variable:
name: follower1
- variable:
name: follower2
multi: 'True'
```
## Ajout d'une nouvelle variable suiveuse
Pour ajouter, dans un nouveau dictionnaire, une variable suiveuse à notre groupe, rien de plus simple, il suffit définir une ou des nouvelles variables dans la famille :
@ -54,3 +72,14 @@ Pour ajouter, dans un nouveau dictionnaire, une variable suiveuse à notre group
</family>
</variables>
```
En YAML :
```
variables:
- family:
name: family
variables:
- variable:
name: follower3
```

View file

@ -8,6 +8,13 @@ Pour décrire une famille il faut mettre au minimum un nom :
<family name="my_family"/>
```
En YAML :
```
- family:
name: my_family
```
Cette famille doit être placé dans une balise [variables](../variables.md) :
```
@ -16,6 +23,14 @@ Cette famille doit être placé dans une balise [variables](../variables.md) :
</variables>
```
En YAML :
```
variables:
- family:
name: my_family
```
Ou dans une autre famille :
```
@ -26,6 +41,17 @@ Ou dans une autre famille :
</variables>
```
En YAML :
```
variables:
- family:
name: my_family
variables:
- family:
name: second_family
```
Attention, une famille vide sera automatiquement supprimée.
## Description et aide de la famille
@ -36,12 +62,30 @@ En plus d'un nom, il est possible de mettre une "description" à la famille. C'e
<family name="my_family" description="This is a great family"/>
```
En YAML :
```
variables:
- family:
name: my_family
description: 'This is a great family'
```
En plus de la description, il est possible de préciser une aide complémentaire :
```
<family name="my_family" help="This is a great family"/>
```
En YAML :
```
variables:
- family:
name: my_family
help: 'This is a great family'
```
## Mode de la famille
Le [mode](../mode.md) par défaut d'une famille correspond au [mode](../mode.md) du mode le plus petit entre la famille parente, les variables enfants ou des familles enfants qui sont contenu dans cette famille.
@ -54,6 +98,14 @@ Pour définir le [mode](../mode.md) :
<family name="my_family" mode="expert"/>
```
En YAML :
```
- family:
name: my_family
mode: expert
```
## Famille invisible
Il est possible de cacher une famille, ainsi que toutes les variables et des familles inclusent dans cette famille.
@ -66,3 +118,11 @@ Pour cacher une famille :
```
<family name="my_family" hidden="True"/>
```
En YAML :
```
- family:
name: my_family
hidden: 'True'
```

View file

@ -15,6 +15,25 @@ Créeons deux variables multiples, une pour accueillir la liste des éléments d
</variables>
```
En YAML :
```
variables:
- variable:
name: zones_list
type: string
multi: 'True'
value:
- text: 'zone1'
- text: 'zone2'
- text: 'zone3'
- variable:
name: netwokd_configurations
type: filename
multi: 'True'
hidden: 'True'
```
Calculons la valeur de la seconde variable à partir de la première :
```
@ -30,6 +49,25 @@ Calculons la valeur de la seconde variable à partir de la première :
</constraints>
```
En YAML :
```
constraints:
- fill:
- name: calc_value
param:
- text: /systemd/network/10-
- type: variable
text: zones_list
- text: -risotto.network
- name: join
- name: multi
type: boolean
text: 'True'
target:
- text: netwokd_configurations
```
Le contenu de la variable `netwokd_configurations` sera alors :
- /systemd/netword/10-zone1/risotto.network
@ -46,3 +84,15 @@ Enfin déclarer une balise file en utilisant ces deux variables :
</services>
```
En YAML :
```
services:
- service:
- name: systemd-networkd
file:
- file_type: variable
source: network
variable: zones_list
text: netwokd_configurations
```

View file

@ -15,6 +15,19 @@ Dans un premier dictionnaire déclarons notre variable et notre calcule :
</constraints>
```
En YAML :
```
variables:
- variable:
name: my_calculated_variable
constraints:
- fill:
- name: return_no
target:
- text: my_calculated_variable
```
Dans un second dictionnaire il est possible de redéfinir le calcul :
```
@ -28,6 +41,20 @@ Dans un second dictionnaire il est possible de redéfinir le calcul :
</constraints>
```
En YAML :
```
variables:
- variable:
name: my_calculated_variable
redefine: 'True'
constraints:
- fill:
- name: return_yes
target:
- text: my_calculated_variable
```
Dans ce cas, à aucun moment la fonction "return_no" ne sera exécuté. Seul la fonction "return_yes" le sera.
## Redéfinition avec suppression d'un calcul
@ -49,6 +76,19 @@ Dans un premier dictionnaire déclarons notre variable et notre calcule :
</constraints>
```
En YAML :
```
variables:
- variable:
name: my_calculated_variable
constraints:
- fill:
- name: return_no
target:
- text: my_calculated_variable
```
Dans un second dictionnaire supprimer ce calcul :
```
@ -56,3 +96,13 @@ Dans un second dictionnaire supprimer ce calcul :
<variable name="my_calculated_variable" redefine="True" remove_fill="True"/>
</variables>
```
En YAML :
```
variables:
- variable:
name: my_calculated_variable
redefine: 'True'
remove_fill: 'True'
```

View file

@ -15,6 +15,19 @@ Créons une variable dont la valeur est retournée par la fonction "return_no" :
</constraints>
```
En YAML :
```
variables:
- variable:
name: my_calculated_variable
constraints:
- fill:
- name: return_no
target:
- text: my_calculated_variable
```
Puis créons la fonction "return_no" :
```
@ -33,6 +46,17 @@ Attention, si une valeur par défaut est définit dans la variable "my_calculate
<value>yes</value>
</variable>
```
En YAML :
```
variables:
- variable:
name: my_calculated_variable
value:
- text: yes
```
Cette valeur par défaut sera complètement ignorée. C'est le calcul qui en définira la valeur.
Il est possible de définir des [paramètres](../param/README.md) à cette fonction.
@ -45,6 +69,15 @@ En ajoutant le paramètre "hidden" à "True" dans la variable précédente, l'ut
<variable name="my_calculated_variable" hidden="True"/>
```
En YAML :
```
variables:
- variable:
name: my_calculated_variable
hidden: 'True'
```
Si une condition "hidden_if_in" est spécifié à la variable, la valeur sera modifiable par l'utilisateur si elle n'est pas cachée mais elle sera systèmatiquement calculée (même si elle a déjà était modifiée) si la variable est cachée.
## Variable meneuse ou suiveuse avec valeur calculé
@ -67,7 +100,7 @@ Il est également possible de calculer [une variable d'une famille dynamique](..
<value>val</value>
</variable>
<family name='dyn' dynamic="suffixes">
<variable name="my_calculated_variable_dyn\_" type="string" description="My calculated variable"/>
<variable name="my_calculated_variable_dyn_" type="string" description="My calculated variable"/>
<value>val</value>
</variable>
</family>
@ -80,6 +113,44 @@ Il est également possible de calculer [une variable d'une famille dynamique](..
</constraints>
```
En YAML :
```
variables:
- variable:
name: suffixes
type: string
description: Suffixes of dynamic family
multi: 'True'
value:
- text: val1
- text: val2
- variable:
name: my_variable
type: string
description: My variable
value:
- text: val
- family:
name: dyn
dynamic: suffixes
variables:
- variable:
name: my_calculated_variable_dyn_
type: string
description: My calculated variable
value:
- text: val
constraints:
- fill:
- name: return_value
param:
- type: variable
text: my_variable
target:
- text: my_calculated_variable_dyn_
```
Dans ce cas, les variables dynamiques "my_calculated_variable_dyn_" seront calculés à partir de la valeur de la variable "my_variable".
Que cela soit pour la variable "my_calculated_variable_dyn_val1" et "my_calculated_variable_dyn_val2".
@ -98,6 +169,20 @@ Dans ce cas, il faut explicitement demander la valeur du suffix dans la fonction
</constraints>
```
En YAML :
```
constraints:
- fill:
- name: return_value_suffix
param:
- type: variable
text: my_variable
- type:suffix
target:
- text: my_calculated_variable_dyn_
```
Et ainsi faire un traitement spécifique pour ce suffix :
```

View file

@ -8,6 +8,14 @@ Le paramètre peut être la valeur est issue d'une information de la configurati
<param type="information">server_name</param>
```
En YAML :
```
param:
- type: information
text: server_name
```
Dans ce cas, l'information de la configuration "server_name" sera utilisé comme valeur du paramètre.
Si l'information n'existe pas, la paramètre aura la valeur "None".
@ -20,5 +28,15 @@ Le paramètre peut être la valeur est issue d'une information de la cible du ca
<param type="target_information">help</param>
```
En YAML :
```
param:
- type: target_information
text: test
- type: target_information
text: help
```
Dans ce cas, l'information de la configuration "test" ou "help" sera utilisé comme valeur du paramètre.
Si l'information n'existe pas, la paramètre aura la valeur "None".

View file

@ -6,6 +6,13 @@ Déclarons un paramètre positionnel :
<param>no</param>
```
En YAML :
```
param:
- text: no
```
Créons la fonction correspondante :
```
@ -23,4 +30,12 @@ Déclarons maintenant un paramètre nommée :
<param name="valeur">no</param>
```
En YAML :
```
param:
- name: valeur
text: no
```
Dans ce cas la fonction return_value sera exécuté avec le paramètre nommé "valeur" dont sa valeur sera "no".

View file

@ -6,6 +6,14 @@ Déclarons un paramètre avec une string :
<param type="string">no</param>
```
En YAML :
```
param:
- type: string
text: no
```
C'est le type par défaut pour un paramètre.
# Paramètre de type "nombre"
@ -16,6 +24,14 @@ Déclarons un paramètre avec un nombre :
<param type="number">1</param>
```
En YAML :
```
param:
- type: number
text: '1'
```
Créons la fonction correspondante :
```
@ -35,6 +51,14 @@ Déclarons un paramètre avec un booléen :
<param type="boolean">True</param>
```
En YAML :
```
param:
- type: boolean
text: 'True'
```
# Paramètre de type "nil"
Le paramètre peut être une valeur null (None en python) :
@ -43,6 +67,13 @@ Le paramètre peut être une valeur null (None en python) :
<param type="nil"/>
```
En YAML :
```
param:
- type: nil
```
# Paramètre de type "space"
Les paramètres sont chargés en supprimer les espaces en début ou fin de chaîne. Ce qui rend impossible d'avoir un paramètre " ". Avec le type "space", le paramètre sera donc un simple espace :
@ -50,3 +81,10 @@ Les paramètres sont chargés en supprimer les espaces en début ou fin de chaî
```
<param type="space"/>
```
En YAML :
```
param:
- type: space
```

View file

@ -6,6 +6,14 @@ Imaginons que la variable "my_variable" pré-existe. La valeur de la variable se
<param type="variable">my_variable</param>
```
En YAML :
```
param:
- type: variable
text: my_variable
```
[Les variables meneuses ou suiveuses](../family/leadership.md) peuvent être utilisé sans soucis comme paramètre.
## Paramètre avec variable potentiellement non existante
@ -18,6 +26,15 @@ Un paramètre de type "variable" peut être "optional" :
<param type="variable" optional="True">unknow_variable</param>
```
En YAML :
```
param:
- type: variable
optional: 'True'
text: unknow_variable
```
Si la variable "unknow_variable" n'existe pas, le paramètre ne sera pas passé à la fonction.
Si maintenant on créé un nouveau dictionnaire en créant cette variable, la fonction sera exécuté avec le paramètre.
@ -32,6 +49,15 @@ Il est possible de ne pas générer d'erreur si une variable est désactivé en
<param type="variable" propertyerror="False">variable1</param>
```
En YAML :
```
param:
- type: variable
propertyerror: 'False'
text: variable1
```
Dans ce cas, si la variable est désactivé, le paramètre n'est jamais donnée à la fonction de destination.
## Paramètre avec variable dynamique
@ -44,6 +70,14 @@ Par exemple :
<param type="variable">vardynval1</param>
```
En YAML :
```
param:
- type: variable
text: vardynval1
```
Dans ce cas, la valeur du paramètre de la fonction sera la valeur de la variable "vardyn" pour la famille ayant le suffix "val1".
Il peut être utile de récupérer la valeur du suffix dans la fonction, pour cela il suffit de mettre un paramètre de type suffix :
@ -52,4 +86,11 @@ Il peut être utile de récupérer la valeur du suffix dans la fonction, pour ce
<param type="suffix"/>
```
En YAML :
```
param:
- type: suffix
```
Dans l'exemple précédent la valeur de ce paramètre sera "val1".

View file

@ -10,13 +10,22 @@ Il faut, à la création du service, préciser son nom :
```
<?xml version='1.0' encoding='UTF-8'?>
<rougail>
<rougail version="0.10">
<services>
<service name="squid"/>
</services>
</rougail>
```
En YAML :
```
version: '0.10'
services:
- service:
- name: squid
```
## Les types de service
Les services peuvent être de plusieurs type :
@ -30,6 +39,14 @@ Les services peuvent être de plusieurs type :
<service name="dev-disk-by\x2dpartlabel-swap" type="swap"/>
```
En YAML :
```
- service:
- name: dev-disk-by\x2dpartlabel-swap
type: swap
```
## Les targets de service
Active le service systemd pour une target systemd déterminé. Par défaut, l'activation du service n'est pas gérer par rougail.
@ -38,6 +55,14 @@ Active le service systemd pour une target systemd déterminé. Par défaut, l'ac
<service name="squid" target="multi-user"/>
```
En YAML :
```
- service:
- name: squid
target: multi-user
```
## La génération du fichier service
Le fichier de description du service peut être fourni directement par la distribution GNU/Linux utilisé, mais il peut également être fournit par l'administrateur.
@ -52,6 +77,15 @@ Deux types de template sont aujourd'hui disponible :
<service name="dev-disk-by\x2dpartlabel-swap" type="swap" engine="creole"/>
```
En YAML :
```
- service:
- name: dev-disk-by\x2dpartlabel-swap
type: swap
engine: creole
```
Dans ce cas, rougail utilisera le template "dev-disk-by\x2dpartlabel-swap.swap" pour générer le fichier systemd de gestion de ce service.
## Le service factice
@ -62,6 +96,14 @@ Un service peut être factice, donc non géré par le système de service du sys
<service name="ldap_client" manage="False"/>
```
En YAML :
```
- service:
- name: ldap_client
manage: 'False'
```
Un service factice est généralement une service qui n'existe pas réellement (par exemple si on configure un client). Il n'est là que pour contenir des fichiers.
## Désactiver le service
@ -69,9 +111,15 @@ Un service factice est généralement une service qui n'existe pas réellement (
Il est possible de désactiver un service. Pour cela il faut rajouter l'attribut "disabled" à True :
```
<services>
<service name="test" disabled="True"/>
</services>
```
En YAML :
```
- service:
- name: test
disabled: 'True'
```
Dans ce cas, le service et les éléments qu'il compose ([fichier](file.md), [IP](ip.md) et [réécriture](override.md) seront désactivés.
@ -94,6 +142,28 @@ Il est possible de définir une [condition](../condition/README.md) de type "dis
</constraints>
```
En YAML :
```
services:
- service:
- name: test
servicelist: test
variables:
- variable:
name: condition
type: boolean
constraints:
- condition:
name: disabled_if_in
source: condition
param:
- text: 'False'
target:
- type: servicelist
text: test
```
Dans ce cas, tous les services et les éléments qu'il compose avec un attribut servicelist à "test" seront désactivés si la variable "condition" est False.
## Ne pas désactiver le service dans systemd
@ -105,3 +175,12 @@ Si vous ne voulez juste pas créer le fichier de service et ne pas faire de lien
```
<service name="test" disabled="True" undisable="True"/>
```
En YAML :
```
- service:
- name: test
disabled: 'True'
undisable: 'True'
```

View file

@ -16,6 +16,16 @@ Il est nécessaire, au minimum, de spécifier le chemin complet du fichier :
</services>
```
En YAML :
```
services:
- service:
- name: squid
file:
- text: /etc/squid/squid.conf
```
Dans ce cas, le nom du template est déduit du nom du fichier, ici cela sera "squid.conf".
Si le template a un nom différent (par exemple si plusieurs template se retrouve avec le même nom), il est possible de changer le nom du template avec l'attribut source :
@ -24,6 +34,14 @@ Si le template a un nom différent (par exemple si plusieurs template se retrouv
<file source="template-squid.conf">/etc/squid/squid.conf</file>
```
En YAML :
```
file:
- source: template-squid.conf
text: /etc/squid/squid.conf
```
## Les noms de fichiers dynamique
Il est possible également de définir le nom du fichier dans une variable :
@ -41,6 +59,23 @@ Il est possible également de définir le nom du fichier dans une variable :
</variables>
```
En YAML :
```
services:
- service:
- name: squid
file:
- file_type: variable
source: squid.conf
text: my_variable
variables:
- variable:
name: my_variable
value:
- text: /etc/squid/squid.conf
```
Attention, la variable doit être de type "filename".
Dans le cas des fichiers dynamique, la source est obligatoire.
@ -61,6 +96,25 @@ Il est même possible de définir une variable de type multiple, ce qui génère
</variables>
```
En YAML :
```
services:
- service:
- name: squid
file:
- file_type: variable
source: squid.conf
text: my_variable
variables:
- variable:
name: my_variable
multi: 'True'
value:
- text: /etc/squid1/squid.conf
- text: /etc/squid2/squid.conf
```
Dans ce cas là, le fichier source est identique mais les fichiers de destination seront différent.
Il peut être important de personnaliser le contenu du fichier suivant le fichier de destination.
@ -89,6 +143,32 @@ En effet, il est possible de passer le contenu d'une variable au template :
</variables>
```
En YAML :
```
services:
- service:
- name: squid
file:
- file_type: variable
source: squid.conf
variable: my_variable2
text: my_variable1
variables:
- variable:
name: my_variable1
multi: 'True'
value:
- text: /etc/squid1/squid.conf
- text: /etc/squid2/squid.conf
- variable:
name: my_variable2
multi: 'True'
value:
- text: squid1
- text: squid2
```
Dans ce cas, lors de la génération du fichier /etc/squid1/squid.conf on retrouvera la variable "rougail_variable" avec la valeur "squid1" et la variable "rougail_index" avec la valeur "0". Lors de la génération du fichier /etc/squid2/squid.conf on retrouvera la variable "rougail_variable" avec la valeur "squid2" et la variable "rougail_index" avec la valeur "1".
Attention : les deux variables "my_variable1" et "my_variable2" doivent être multiple et de même longueur.
@ -103,6 +183,16 @@ Il est possible de définir les droits, l'utilisateur ou le groupe d'un fichier
<file mode="0640" owner="nobody" group="squid">/etc/squid/squid.conf</file>
```
En YAML :
```
file:
- mode: '0640'
owner: nobody
group: squid
text: /etc/squid/squid.conf
```
Il est possible de personnaliser les droits par défaut dans la [configuration de rougail](../dev/config.md)
## Désactiver la génération d'un fichier
@ -113,6 +203,14 @@ Il est possible de désactiver la génération d'un fichier avec l'attribut "dis
<file disabled="True">/etc/squid/squid.conf</file>
```
En YAML :
```
file:
- disabled: 'True'
text: /etc/squid/squid.conf
```
Il est aussi possible de définir une [condition](../condition/README.md) de type "disabled_if_in" ou "disabled_if_not_in" sur une balise fichier :
```
@ -132,6 +230,30 @@ Il est aussi possible de définir une [condition](../condition/README.md) de typ
</constraints>
```
En YAML :
```
services:
- service:
- name: text
file:
- filelist: squid
text: /etc/squid/squid.conf
variables:
- variable:
name: condition
type: boolean
constraints:
- condition:
- name: disabled_if_in
source: condition
param:
- text: 'False'
target:
- type: filelist
text: squid
```
Dans ce cas, tous les fichiers avec un attribut filelist à "squid" seront désactivés si la variable "condition" est False.
## Redéfinir une fichier
@ -152,12 +274,28 @@ Il est possible de désactiver la templatisation du fichier (il sera alors uniqu
<file engine="none">/etc/squid/squid.conf</file>
```
En YAML :
```
file:
- engine: 'none'
text: /etc/squid/squid.conf
```
Ou d'utiliser le moteur "jinja2" :
```
<file engine="jinja2">/etc/squid/squid.conf</file>
```
En YAML :
```
file:
- engine: jinja2
text: /etc/squid/squid.conf
```
Il est possible de personnaliser le moteur par défaut dans la [configuration de rougail](../dev/config.md)
## Inclusion de template
@ -205,6 +343,16 @@ Et déclaront ces deux templates :
<file included="name" engine="none">/etc/squid/squid.d/squid.conf</file>
```
En YAML :
```
file:
- text: /etc/squid/squid.conf
- included: name
engine: 'none'
text: /etc/squid/squid.d/squid.conf
```
Le contenu du fichier généré (/etc/squid/squid.conf) sera donc :
```
@ -242,6 +390,16 @@ Et déclaront ces deux templates :
<file included="content" engine="none">squid.d/squid.conf</file>
```
En YAML :
```
file:
- text: /etc/squid/squid.conf
- included: content
engine: 'none'
text: squid.d/squid.conf
```
Le contenu du fichier généré (/etc/squid/squid.conf) sera donc maintenant :
```

View file

@ -12,6 +12,14 @@ Il est nécessaire, au minimum, de spécifier le nom d'une variable de type "IP"
<ip ip_type="variable">variable_ip</ip>
```
En YAML :
```
ip:
- ip_type: variable_ip
text: variable_ip
```
## La gestion d'un réseau
L'adresse peut être de type réseau ("network") :
@ -20,6 +28,14 @@ L'adresse peut être de type réseau ("network") :
<ip netmask="variable_netmask">variable_ip</ip>
```
En YAML :
```
ip:
- netmask: variable_netmask
text: variable_ip
```
Attention, dans ce cas il faut préciser une variable de type "netmask" dans l'attribut netmask.
## Désactiver la génération d'une IP
@ -44,4 +60,32 @@ Il est possible de définir une [condition](../condition/README.md) de type "dis
</constraints>
```
En YAML :
```
services:
- service:
- name: test
ip:
- iplist: test_ip
text: variable_ip
variables:
- variable:
name: condition
type: boolean
- variable:
name: variable_ip
type: ip
constraints:
- condition:
- name: disabled_if_in
source: condition
param:
- text: 'False'
target:
- type: iplist
text: test_ip
```
Dans ce cas, tous les IP avec un attribut iplist à "test_ip" seront désactivé si la variable "condition" est False.

View file

@ -16,6 +16,15 @@ Il suffit d'avoir un template dont le nom est par défaut le nom du service avec
</services>
```
En YAML :
```
services:
- service:
- name: squid
override: null
```
Dans cette exemple, le template associé doit s'appeler squid.service
Si le fichier service a un nom différent (par exemple si plusieurs template se retrouve avec le même nom), il est possible de changer le nom du template avec l'attribut source :
@ -24,6 +33,13 @@ Si le fichier service a un nom différent (par exemple si plusieurs template se
<override source="test.service"/>
```
En YAML :
```
override:
- source: test.service
```
Dans ce cas le fichier de destination aura le même nom.
## Choix du moteur de templating
@ -36,10 +52,24 @@ Il est possible de désactiver la templatisation du fichier (il sera alors uniqu
<override engine="none"/>
```
En YAML :
```
override:
- engine: 'none'
```
Ou d'utiliser le moteur "jinja2" :
```
<override engine="jinja2"/>
```
En YAML :
```
override:
- engine: 'jinja2'
```
Il est possible de personnaliser le moteur par défaut dans la [configuration de rougail](../dev/config.md)

View file

@ -11,4 +11,11 @@ Il est placé à la racine du dictionnaire :
</rougail>
```
En YAML :
```
version: '0.10'
services: none
```
Attention, cette balise ne peut pas être placé dans un dictionnaire "extra".

View file

@ -6,8 +6,25 @@ Une cible peut être de type famille :
<target type="family">my_family</target>
```
En YAML :
```
target:
- type: family
text: my_family
```
Mais une target peut être optionnelle. C'est à dire que si la famille n'existe pas, l'action ne sera pas associé à cette famille.
```
<target type="family" optional="True">my_family</target>
```
En YAML :
```
target:
- type: family
optional: 'True'
text: my_family
```

View file

@ -10,6 +10,14 @@ Une cible peut être de type [service](../service/README.md) :
<target type="servicelist">example</target>
```
En YAML :
```
target:
- type: servicelist
text: example
```
### filelist
Une cible peut être de type [fichier](../service/file.md) :
@ -18,6 +26,14 @@ Une cible peut être de type [fichier](../service/file.md) :
<target type="filelist">example</target>
```
En YAML :
```
target:
- type: filelist
text: example
```
### iplist
Une cible peut être de type [ip](../service/ip.md) :
@ -26,6 +42,14 @@ Une cible peut être de type [ip](../service/ip.md) :
<target type="iplist">example</target>
```
En YAML :
```
target:
- type: iplist
text: example
```
## La cible optionnelle
Mais une target peut être optionnelle. C'est à dire que si la \*list n'existe pas, l'action ne sera pas associé.
@ -33,3 +57,12 @@ Mais une target peut être optionnelle. C'est à dire que si la \*list n'existe
```
<target type="filelist" optional="True">unknown</target>
```
En YAML :
```
target:
- type: filelist
optional: 'True'
text: unknown
```

View file

@ -6,8 +6,23 @@ Par défaut une cible est de type variable.
<target>my_variable</target>
```
En YAML :
```
target:
- text: my_variable
```
Mais une target peut être optionnelle. C'est à dire que si la variable n'existe pas, l'action ne sera pas associé à cette variable.
```
<target optional='True'>my_variable</target>
```
En YAML :
```
target:
- optional: 'True'
text: my_variable
```

View file

@ -15,18 +15,49 @@ Une variable est déjà un nom. C'est à dire qu'on pourra utiliser plus tard la
</variables>
```
En YAML :
```
variables:
- variable:
name: my_variable
- family:
name: my_family
variables:
- variable:
name: my_family_variable
```
## Description et aide sur la variable
En plus d'un nom, il est possible de mettre une "description" à la variable. C'est une information "utilisateur" qui nous permettra d'avoir des informations complémentaires sur le contenu de cette variable :
```
<variable name="my_variable" description="This is a greate variable"/>
<variable name="my_variable" description="This is a good variable"/>
```
En YAML :
```
variables:
- variable:
name: my_variable
description: This is a good variable
```
En plus de la description, il est possible de préciser une aide complémentaire :
```
<variable name="my_variable" help="This is a greate variable"/>
<variable name="my_variable" help="This is a good variable"/>
```
En YAML :
```
variables:
- variable:
name: my_variable
help: This is a good variable
```
Cette aide peut être utilisé à tout moment comme valeur [d'un paramètre](../param/information.md).
@ -66,6 +97,14 @@ Pour définir le type d'une variable :
<variable name="my_variable" type="number"/>
```
En YAML :
```
- variable:
name: my_variable
type: number
```
## Variable à valeur multiple
Par défaut une variable ne peut acceuillir qu'une seule valeur. Il peut être utile de pouvoir spécifier plusieurs valeurs à une même variable.
@ -76,6 +115,14 @@ Pour définir une variable à valeur multiple :
<variable name="my_variable" multi="True"/>
```
En YAML :
```
- variable:
name: my_variable
multi: 'True'
```
## Variable invisible
Il est possible de cacher une variable.
@ -89,6 +136,14 @@ Pour cacher une variable :
<variable name="my_variable" hidden="True"/>
```
En YAML :
```
- variable:
name: my_variable
hidden: 'True'
```
## Variable désactive
Il est possible de désactiver une variable.
@ -101,6 +156,14 @@ Pour désactiver une variable :
<variable name="my_variable" disabled="True"/>
```
En YAML :
```
- variable:
name: my_variable
disabled: 'True'
```
## Variable obligatoire
Variable dont une valeur est requise :
@ -109,12 +172,29 @@ Variable dont une valeur est requise :
<variable name="my_variable" mandatory="True"/>
```
En YAML :
```
- variable:
name: my_variable
mandatory: 'True'
```
Les variables booléans sont par défaut obligatoire. Pour qu'une variable booléan ne soit pas obligatoire il faut le préciser explicitement :
```
<variable name="my_variable" type="boolean" mandatory="False"/>
```
En YAML :
```
- variable:
name: my_variable
type: boolean
mandatory: 'False'
```
Les variables avec une valeur par défaut (non calculée) sont également automatiquement obligatoire.
## Valeur par défaut d'une variable
@ -127,6 +207,15 @@ Il est possible de fixer les valeurs par défaut d'une variable :
</variable>
```
En YAML :
```
- variable:
name: my_variable
value:
- text: value
```
Pour une variable multiple, il est possible de préciser plusieurs valeurs :
```
@ -136,6 +225,17 @@ Pour une variable multiple, il est possible de préciser plusieurs valeurs :
</variable>
```
En YAML :
```
- variable:
name: my_variable
multi: 'True'
value:
- text: value 1
- text: value 2
```
Si la variable n'est pas pas une [variable meneuse](../family/leadership.md), la première valeur défini dans cette liste sera également la valeur par défaut proposé si on ajoute une nouvelle valeur à cette variable.
Une valeur par défaut peut également être [une valeur calculer](../fill/README.md).
@ -156,12 +256,28 @@ Créons notre variable :
<variable name="my_variable"/>
```
En YAML :
```
- variable:
name: my_variable
```
Et redéfinisons là :
```
<variable name="my_variable" redefine="True" description="New description"/>
```
En YAML :
```
- variable:
name: my_variable
redefine: 'True'
description: New description
```
## Créer une variable inexistante
Il est parfois utile de créer une variable si elle n'existe pas dans un autre dictionnaire :
@ -170,6 +286,14 @@ Il est parfois utile de créer une variable si elle n'existe pas dans un autre d
<variable name="my_variable" exists="False"/>
```
En YAML :
```
- variable:
name: my_variable
exists: 'False'
```
Si cette variable existe dans un autre dictionnaire, elle ne sera pas modifié ni recréé
## Redéfinir une variable si elle existe
@ -180,6 +304,15 @@ Parfois on veut pouvoir redéfinir une variable mais seulement dans le cas où e
<variable name="my_variable" redefine="True" exists="True" hidden="True"/>
```
En YAML :
```
- variable:
name: my_variable
exists: 'True'
hidden: 'True'
```
## Variable à valeur automatiquement modifiée
Une variable avec valeur automatiquement modifiée est une variable dont la valeur sera considéré comme modifié quand la propriété global "force_store_value" de Tiramisu est mise.
@ -192,6 +325,16 @@ Voici une variable a valeur automatiquement modifiée :
</variable>
```
En YAML :
```
- variable:
name: my_variable
auto_save: 'True'
value:
- text: my_value
```
Dans ce cas la valeur est fixée à la valeur actuelle.
Par exemple, si la valeur de cette variable est issue d'un calcul, la valeur ne sera plus recalculée.
@ -212,6 +355,19 @@ Voici un variable à valeur en lecture seule automatique :
<variable name="my_variable" auto_freeze="True"/>
```
En YAML :
```
- variable:
name: server_deployed
type: boolean
value:
- text: 'False
- variable:
name: my_variable
auto_freeze: 'True'
```
Dans ce cas la valeur est fixée à la valeur actuelle et elle ne sera plus modifiable par l'utilisateur.
Par exemple, si la valeur de cette variable est issue d'un calcul, la valeur ne sera plus recalculée.
@ -231,12 +387,28 @@ Exemple :
<variable name="my_variable" test="yes"/>
```
En YAML :
```
- variable:
name: my_variable
test: yes
```
Il est possible de préciser plusieurs valeurs avec le séparateur "|" :
```
<variable name="my_variable" test="yes|no"/>
```
En YAML :
```
- variable:
name: my_variable
test: yes|no
```
Cette valeur peut être utilisé à tout moment comme valeur [d'un paramètre](../param/information.md).
## Mode de la variable
@ -255,6 +427,14 @@ Pour définir le [mode](../mode.md) :
<variable name="my_variable" mode="expert"/>
```
En YAML :
```
- variable:
name: my_variable
mode: expert
```
## Les variables qui fournissent des valeurs
Il peut être intéressant de retrouver facilement des variables sans connaitre le chemin complet mais en utilisant le contenu du paramètre "provider".
@ -266,6 +446,14 @@ Pour déclarer :
<variable name="my_variable" provider="my_function"/>
```
En YAML :
```
- variable:
name: my_variable
provider: my_variable
```
Dans le code de l'application, on pourra retrouver le chemin de la variable en faisant :
```

View file

@ -12,6 +12,18 @@ Il est possible d'imposer une liste de valeur pour une variable particulière :
</variable>
```
En YAML :
```
- variable:
name: my_variable
type: choice
choice:
- text: val1
- text: val2
- text: val3
```
Dans ce cas, seules les valeurs proposées sont possibles pour cette variable.
Cette variable n'est pas obligatoire dont il est possible de mettre la valeur "None".
@ -26,6 +38,20 @@ Si la variable est obligatoire ou si une valeur est précisée (la variable pass
</variable>
```
En YAML :
```
- variable:
name: my_variable
type: choice
choice:
- text: val1
- text: val2
- text: val3
value:
- text: val1
```
## Un variable à choix typée
Par défaut les choix sont de type "string". Il est possible de préciser des nombres, des booléens ou la valeur None :
@ -40,6 +66,23 @@ Par défaut les choix sont de type "string". Il est possible de préciser des no
</variable>
```
En YAML :
```
- variable:
name: my_variable
type: choice
choice:
- text: val1
- type: string
text: val2
- type: number
text: '3'
- type: boolean
text: 'True'
- type: 'nil'
```
Comme vu précédement ajouter la valeur None n'est pas utile parce qu'elle est automatiquement ajouté si la variable n'est pas obligatoire.
## Ajouter une option à une variable à choix existante
@ -52,6 +95,16 @@ Pour ajouter un choix à une variable à choix existante, rien de plus simple, j
</variable>
```
En YAML :
```
- variable:
name: my_variable
redefine: 'True'
choice:
- text: val4
```
## Redéfinir une option à choix
Si on veut supprimer un choix ou redéfinir complètement la liste, il faut redéfinir cette variable et ajouter l'attribut "remove_choice" à "True" :
@ -63,6 +116,18 @@ Si on veut supprimer un choix ou redéfinir complètement la liste, il faut red
</variable>
```
En YAML :
```
- variable:
name: my_variable
redefine: 'True'
remove_choice: 'True'
choice:
- text: val1
- text: val2
```
Dans ce cas toutes les anciens choix ne seront plus possible. Seuls les nouveaux le seront.
## Un variable à choix provenant d'une variable
@ -75,6 +140,17 @@ Une variable à valeur multiple peut servir de source des choix :
</variable>
```
En YAML :
```
- variable:
name: my_variable
type: choice
choice:
- type: variable
text: other_variable
```
Dans ce cas, toutes les valeurs de la variable seront des choix utilisables par l'utilisateur.
Seul un choice de type "variable" est possible par variable.
@ -82,10 +158,29 @@ Seul un choice de type "variable" est possible par variable.
```
<variable name="my_variable" type="choice">
<choice type="function" name="trange">
<choice type="function" name="range">
<param type="number">0</param>
<param type="number">10</param>
</choice>
<value type="number">9</value>
</variable>
```
En YAML :
```
- variable:
name: my_variable
type: choice
choice:
- type: function
name: range
param:
- type: number
text: '0'
- type: number
text: '10'
value:
- type: number
text: '9'
```

View file

@ -10,3 +10,10 @@ Il est placé à la racine du dictionnaire :
<variables/>
</rougail>
```
En YAML :
```
version: '0.10'
variables: none
```

View file

@ -39,6 +39,7 @@ RougailConfig = {'dictionaries_dir': [join(ROUGAILROOT, 'dictionaries')],
'destinations_dir': join(ROUGAILROOT, 'destinations'),
'tmp_dir': join(ROUGAILROOT, 'tmp'),
'dtdfilename': join(DTDDIR, 'rougail.dtd'),
'yamlschema_filename': join(DTDDIR, 'rougail.yml'),
'functions_file': join(ROUGAILROOT, 'functions.py'),
'tmpfile_dest_dir': '/usr/local/lib',
'variable_namespace': 'rougail',

View file

@ -9,6 +9,9 @@ Forked by:
Cadoles (http://www.cadoles.com)
Copyright (C) 2019-2021
Silique (https://www.silique.fr)
Copyright (C) 2022
distribued with GPL-2 or later license
This program is free software; you can redistribute it and/or modify
@ -46,7 +49,7 @@ from typing import List
from .i18n import _
from .config import RougailConfig
from .objspace import RougailObjSpace
from .xmlreflector import XMLReflector
from .reflector import Reflector
from .tiramisureflector import TiramisuReflector
from .annotator import SpaceAnnotator
from .error import DictConsistencyError
@ -63,7 +66,7 @@ class RougailConvert:
if rougailconfig is None:
rougailconfig = RougailConfig
self.rougailconfig = rougailconfig
xmlreflector = XMLReflector(self.rougailconfig)
xmlreflector = Reflector(self.rougailconfig)
self.rougailobjspace = RougailObjSpace(xmlreflector,
self.rougailconfig,
)
@ -101,13 +104,13 @@ class RougailConvert:
self.dictionaries = True
def _load_dictionaries(self,
xmlreflector: XMLReflector,
xmlreflector: Reflector,
namespace: str,
xmlfolders: List[str],
path_prefix: str,
namespace_description: str=None,
) -> List[str]:
for xmlfile, document in xmlreflector.load_xml_from_folders(xmlfolders):
for xmlfile, document in xmlreflector.load_dictionaries_from_folders(xmlfolders):
self.rougailobjspace.xml_parse_document(xmlfile,
document,
namespace,

2733
src/rougail/data/rougail.yml Normal file

File diff suppressed because it is too large Load diff

View file

@ -28,7 +28,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from typing import Optional
from .i18n import _
from .xmlreflector import XMLReflector
from .reflector import Reflector
from .utils import valid_variable_family_name, normalize_family
from .error import SpaceObjShallNotBeUpdated, DictConsistencyError
from .path import Path
@ -99,7 +99,7 @@ class RougailObjSpace:
"""
def __init__(self,
xmlreflector: XMLReflector,
xmlreflector: Reflector,
rougailconfig: 'RougailConfig',
) -> None:
self.space = ObjSpace()
@ -115,7 +115,7 @@ class RougailObjSpace:
self.xmlreflector = xmlreflector
def make_object_space_classes(self,
xmlreflector: XMLReflector,
xmlreflector: Reflector,
) -> None:
"""Create Rougail ObjectSpace class types from DDT file
It enables us to create objects like:
@ -426,6 +426,8 @@ class RougailObjSpace:
if has_value and len(child) != 0:
del variableobj.value
for attr, val in child.attrib.items():
if attr == 'text' and child.tag in self.forced_text_elts_as_name:
continue
if redefine and attr in UNREDEFINABLE:
msg = _(f'cannot redefine attribute "{attr}" for variable "{child.attrib["name"]}"'
f' already defined')

187
src/rougail/reflector.py Normal file
View file

@ -0,0 +1,187 @@
"""load XML file from directory
Created by:
EOLE (http://eole.orion.education.fr)
Copyright (C) 2005-2018
Forked by:
Cadoles (http://www.cadoles.com)
Copyright (C) 2019-2021
distribued with GPL-2 or later license
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""
from typing import List
from os.path import join, isfile
from os import listdir
from lxml.etree import DTD, parse, XMLSyntaxError # pylint: disable=E0611
from pykwalify.core import Core
from pykwalify.errors import SchemaError
from .i18n import _
from .error import DictConsistencyError
FORCE_SUBYAML = ['override']
class Reflector:
"""Helper class for loading the Creole XML file,
parsing it, validating against the Creole DTD
"""
def __init__(self,
rougailconfig: 'RougailConfig',
) -> None:
"""Loads the Creole DTD
:raises IOError: if the DTD is not found
:param dtdfilename: the full filename of the Creole DTD
"""
dtdfilename = rougailconfig['dtdfilename']
yamlschema_filename = rougailconfig['yamlschema_filename']
if not isfile(dtdfilename):
raise IOError(_(f"no such DTD file: {dtdfilename}"))
with open(dtdfilename, 'r') as dtdfd:
self.dtd = DTD(dtdfd)
if not isfile(yamlschema_filename):
raise IOError(_(f"no such YAML Schema file: {yamlschema_filename}"))
self.yamlschema_filename = yamlschema_filename
def load_dictionaries_from_folders(self,
folders: List[str],
):
"""Loads all the dictionary files located in the folders' list
:param folders: list of full folder's name
"""
filenames = {}
for folder in folders:
for filename in listdir(folder):
if filename.endswith('.xml'):
ext = 'xml'
full_filename = join(folder, filename)
elif filename.endswith('.yml'):
ext = 'yml'
full_filename = join(folder, filename)
else:
continue
if filename in filenames:
raise DictConsistencyError(_(f'duplicate dictionary file name {filename}'), 78, [filenames[filename], full_filename])
filenames[filename] = (ext, full_filename)
if not filenames:
raise DictConsistencyError(_('there is no dictionary file'), 77, [folder])
file_names = list(filenames.keys())
file_names.sort()
for filename in file_names:
ext, filename = filenames[filename]
if ext == 'xml':
yield self.load_xml_file(filename)
else:
yield self.load_yml_file(filename)
def load_xml_file(self,
filename: str,
):
try:
document = parse(filename)
except XMLSyntaxError as err:
raise DictConsistencyError(_(f'not a XML file: {err}'), 52, [filename]) from err
if not self.dtd.validate(document):
dtd_error = self.dtd.error_log.filter_from_errors()[0]
msg = _(f'not a valid XML file: {dtd_error}')
raise DictConsistencyError(msg, 43, [filename])
return filename, document.getroot()
def load_yml_file(self,
filename: str,
):
try:
document = Core(source_file=filename, schema_files=[self.yamlschema_filename])
except XMLSyntaxError as err:
raise DictConsistencyError(_(f'not a XML file: {err}'), 52, [filename]) from err
try:
return filename, YParser(document.validate(raise_exception=True))
except SchemaError as yaml_error:
msg = _(f'not a valid YAML file: {yaml_error}')
raise DictConsistencyError(msg, 43, [filename])
class SubYAML:
def __init__(self, key, value):
if value is None:
value = {}
self.tag = key
self.dico = value
if 'text' in value:
self.text = value['text']
else:
self.text = None
if isinstance(value, list):
self.attrib = {}
else:
self.attrib = {k: v for k, v in value.items() if not isinstance(v, list) and k not in FORCE_SUBYAML}
def __str__(self):
return f"<SubYAML {self.tag} at {id(self)}>"
def __iter__(self):
if isinstance(self.dico, list):
lists = []
for dico in self.dico:
for key, value in dico.items():
lists.append((key, [value]))
else:
lists = []
for key, values in self.dico.items():
if key == 'variables':
for v in values:
if 'variable' in v:
lists.append(('variable', [v['variable']]))
if 'family' in v:
lists.append(('family', [v['family']]))
else:
lists.append((key, values))
for key, values in lists:
if key not in FORCE_SUBYAML and not isinstance(values, list):
continue
if values is None:
values = [None]
for value in values:
yield SubYAML(key, value)
def __len__(self):
length = 0
for _ in self.__iter__():
length += 1
return length
class YParser:
def __init__(self, dico):
self.dico = dico
def __iter__(self):
for key, values in self.dico.items():
if not isinstance(values, list):
continue
if key == 'variables':
yield SubYAML(key, values)
else:
for val in values:
yield SubYAML(key, val)

View file

@ -1,87 +0,0 @@
"""load XML file from directory
Created by:
EOLE (http://eole.orion.education.fr)
Copyright (C) 2005-2018
Forked by:
Cadoles (http://www.cadoles.com)
Copyright (C) 2019-2021
distribued with GPL-2 or later license
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""
from typing import List
from os.path import join, isfile
from os import listdir
from lxml.etree import DTD, parse, XMLSyntaxError # pylint: disable=E0611
from .i18n import _
from .error import DictConsistencyError
class XMLReflector:
"""Helper class for loading the Creole XML file,
parsing it, validating against the Creole DTD,
writing the xml result on the disk
"""
def __init__(self,
rougailconfig: 'RougailConfig',
) -> None:
"""Loads the Creole DTD
:raises IOError: if the DTD is not found
:param dtdfilename: the full filename of the Creole DTD
"""
dtdfilename = rougailconfig['dtdfilename']
if not isfile(dtdfilename):
raise IOError(_("no such DTD file: {}").format(dtdfilename))
with open(dtdfilename, 'r') as dtdfd:
self.dtd = DTD(dtdfd)
def load_xml_from_folders(self,
xmlfolders: List[str],
):
"""Loads all the XML files located in the xmlfolders' list
:param xmlfolders: list of full folder's name
"""
filenames = {}
for xmlfolder in xmlfolders:
for filename in listdir(xmlfolder):
if not filename.endswith('.xml'):
continue
full_filename = join(xmlfolder, filename)
if filename in filenames:
raise DictConsistencyError(_(f'duplicate xml file name {filename}'), 78, [filenames[filename], full_filename])
filenames[filename] = full_filename
if not filenames:
raise DictConsistencyError(_('there is no XML file'), 77, [xmlfolder])
file_names = list(filenames.keys())
file_names.sort()
for filename in file_names:
xmlfile = filenames[filename]
try:
document = parse(xmlfile)
except XMLSyntaxError as err:
raise DictConsistencyError(_(f'not a XML file: {err}'), 52, [xmlfile]) from err
if not self.dtd.validate(document):
dtd_error = self.dtd.error_log.filter_from_errors()[0]
msg = _(f'not a valid XML file: {dtd_error}')
raise DictConsistencyError(msg, 43, [xmlfile])
yield xmlfile, document.getroot()

View file

@ -0,0 +1,4 @@
version: '0.10'
services:
- service:
- name: tata

View file

@ -0,0 +1,12 @@
version: '0.10'
variables:
- variable:
name: myvar
auto_freeze: 'True'
value:
- text: 'no'
- variable:
name: server_deployed
type: boolean
value:
- text: 'False'

View file

@ -0,0 +1,13 @@
version: '0.10'
variables:
- variable:
name: my_var
auto_freeze: 'True'
mode: expert
value:
- text: 'no'
- variable:
name: server_deployed
type: boolean
value:
- text: 'False'

View file

@ -0,0 +1,16 @@
version: '0.10'
variables:
- variable:
name: server_deployed
type: boolean
- family:
name: general
description: "g\xE9n\xE9ral"
variables:
- variable:
name: mode_conteneur_actif
type: string
description: No change
auto_save: 'True'
value:
- text: non

View file

@ -0,0 +1,17 @@
version: '0.10'
variables:
- variable:
name: server_deployed
type: boolean
- family:
name: general
description: "g\xE9n\xE9ral"
variables:
- variable:
name: mode_conteneur_actif
type: string
description: No change
auto_save: 'True'
mode: expert
value:
- text: non

View file

@ -0,0 +1,13 @@
version: '0.10'
variables:
- family:
name: general
description: "g\xE9n\xE9ral"
variables:
- variable:
name: mode_conteneur_actif
type: string
description: No change
hidden: 'True'
value:
- text: non

View file

@ -0,0 +1,17 @@
version: '0.10'
variables:
- family:
name: general
description: "g\xE9n\xE9ral"
variables:
- variable:
name: mode_conteneur_actif
type: string
description: No change
hidden: 'True'
value:
- text: non
- variable:
name: without_type
value:
- text: non

View file

@ -0,0 +1,13 @@
version: '0.10'
variables:
- family:
name: general
description: "g\xE9n\xE9ral"
variables:
- variable:
name: mode_conteneur_actif
type: string
description: No change
hidden: 'True'
value:
- text: non

View file

@ -0,0 +1,13 @@
version: '0.10'
variables:
- family:
name: general
description: "g\xE9n\xE9ral"
variables:
- variable:
name: mode_conteneur_actif
type: string
description: No change
hidden: 'True'
value:
- text: non

View file

@ -0,0 +1,13 @@
version: '0.10'
variables:
- family:
name: general
description: "g\xE9n\xE9ral"
variables:
- variable:
name: mode_conteneur_actif1
type: string
description: No change
hidden: 'True'
value:
- text: non

View file

@ -0,0 +1,20 @@
version: '0.10'
variables:
- variable:
name: server_deployed
type: boolean
value:
- text: 'no'
- variable:
name: my_variable
auto_freeze: 'True'
hidden: 'True'
value:
- text: 'no'
constraints:
- fill:
- name: calc_val
param:
- text: 'yes'
target:
- text: my_variable

View file

@ -0,0 +1,26 @@
version: '0.10'
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: No change
hidden: 'True'
value:
- text: non
- variable:
name: mode_conteneur_actif1
type: string
description: No change
value:
- text: non
constraints:
- fill:
- name: calc_val
param:
- type: variable
text: mode_conteneur_actif1
target:
- text: mode_conteneur_actif

View file

@ -0,0 +1,23 @@
version: '0.10'
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: No change
hidden: 'True'
value:
- text: non
- variable:
name: mode_conteneur_actif1
type: string
description: No change
value:
- text: non
constraints:
- fill:
- name: calc_val
target:
- text: mode_conteneur_actif

View file

@ -0,0 +1,11 @@
version: '0.10'
variables:
- family:
name: general
variables:
- variable:
name: domain
type: domainname
description: Description
value:
- text: my.domain.name

View file

@ -0,0 +1,18 @@
version: '0.10'
services:
- service:
- name: test
file:
- text: /etc/file
- engine: jinja2
text: /etc/file2
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Description
value:
- text: non

View file

@ -0,0 +1,20 @@
version: '0.10'
services:
- service:
- name: test
file:
- text: /etc/file
- engine: jinja2
text: /etc/file2
- disabled: 'True'
text: /etc/file3
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Description
value:
- text: non

View file

@ -0,0 +1,18 @@
version: '0.10'
services:
- service:
- name: test
file:
- text: /etc/file
- engine: jinja2
text: /etc/file2
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Description
value:
- text: non

View file

@ -0,0 +1,20 @@
version: '0.10'
services:
- service:
- name: test
file:
- text: /etc/file
- engine: jinja2
text: /etc/file2
- included: content
text: /etc/dir/incfile
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Description
value:
- text: non

View file

@ -0,0 +1,20 @@
version: '0.10'
services:
- service:
- name: test
file:
- text: /etc/file
- engine: jinja2
text: /etc/file2
- included: name
text: /etc/dir/incfile
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Description
value:
- text: non

View file

@ -0,0 +1,22 @@
version: '0.10'
services:
- service:
- name: test
file:
- owner: nobody
group: nobody
text: /etc/file
- owner: nobody
group: nobody
engine: jinja2
text: /etc/file2
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Description
value:
- text: non

View file

@ -0,0 +1,36 @@
version: '0.10'
services:
- service:
- name: test
file:
- owner_type: variable
owner: owner
group_type: variable
group: group
text: /etc/file
- owner_type: variable
owner: owner
group_type: variable
group: group
engine: jinja2
text: /etc/file2
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Description
value:
- text: non
- variable:
name: owner
type: unix_user
value:
- text: nobody
- variable:
name: group
type: unix_user
value:
- text: nobody

View file

@ -0,0 +1,18 @@
version: '0.10'
services:
- service:
- name: test
file:
- text: /etc/file
- engine: jinja2
text: /etc/file2
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Description
value:
- text: non

View file

@ -0,0 +1,18 @@
version: '0.10'
services:
- service:
- name: test
file:
- text: /etc/file
- engine: jinja2
text: /etc/file2
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Description
value:
- text: non

View file

@ -0,0 +1,18 @@
version: '0.10'
services:
- service:
- name: test
file:
- text: /etc/systemd-makefs@dev-disk-by\x2dpartlabel
- engine: jinja2
text: /etc/systemd-makefs@dev-disk-by\x2dpartlabel2
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Description
value:
- text: non

View file

@ -0,0 +1,18 @@
version: '0.10'
variables:
- family:
name: general
variables:
- variable:
name: float
type: float
description: Description
value:
- text: '0.527'
- variable:
name: float_multi
type: float
description: Description
multi: 'True'
value:
- text: '0.527'

View file

@ -0,0 +1,15 @@
version: '0.10'
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Redefine description
help: message with '
- variable:
name: mode_conteneur_actif1
type: string
description: Redefine description
help: message with "

View file

@ -0,0 +1,13 @@
version: '0.10'
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Redefine description
hidden: 'True'
multi: 'True'
value:
- text: non

View file

@ -0,0 +1,14 @@
version: '0.10'
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Redefine description
hidden: 'True'
multi: 'True'
unique: 'False'
value:
- text: non

View file

@ -0,0 +1,14 @@
version: '0.10'
variables:
- family:
name: general
variables:
- variable:
name: mode_conteneur_actif
type: string
description: Redefine description
hidden: 'True'
multi: 'True'
unique: 'True'
value:
- text: non

View file

@ -0,0 +1,19 @@
version: '0.10'
variables:
- family:
name: general
variables:
- variable:
name: float
type: float
description: Description
provider: float
value:
- text: '0.527'
- variable:
name: float_multi
type: float
description: Description
multi: 'True'
value:
- text: '0.527'

View file

@ -0,0 +1,6 @@
version: '0.10'
variables:
- variable:
name: float
type: float
description: Description

View file

@ -0,0 +1,9 @@
version: '0.10'
variables:
- family:
name: example
variables:
- variable:
name: description
type: string
provider: example

View file

@ -0,0 +1,20 @@
version: '0.10'
variables:
- family:
name: general
variables:
- variable:
name: float
type: float
description: Description
provider: float
hidden: 'True'
value:
- text: '0.527'
- variable:
name: float_multi
type: float
description: Description
multi: 'True'
value:
- text: '0.527'

Some files were not shown because too many files have changed in this diff Show more