diff --git a/doc/family/simple.md b/doc/family/simple.md
index 76acb0d3..cbc17fbc 100644
--- a/doc/family/simple.md
+++ b/doc/family/simple.md
@@ -1,6 +1,6 @@
# Une famille
-Une famille est un conteneur de variables.
+Une famille est un [conteneur de variables](variables.md).
Pour décrire une famille il faut mettre au minimum un nom :
@@ -8,7 +8,7 @@ Pour décrire une famille il faut mettre au minimum un nom :
```
-Cette famille doit être placé dans une balise "variables" :
+Cette famille doit être placé dans une balise [variables](variables.md) :
```
diff --git a/doc/fill/README.md b/doc/fill/README.md
new file mode 100644
index 00000000..62163905
--- /dev/null
+++ b/doc/fill/README.md
@@ -0,0 +1,7 @@
+# Les variables calculées
+
+Une variable calculée est une variable donc sa valeur est le résultat d'une fonction python.
+
+ - [Valeur calculée de la variable](value.md)
+ - [Paramètre de la fonction](param.md)
+ - [Réfinition](redefine.md)
diff --git a/doc/fill/param.md b/doc/fill/param.md
new file mode 100644
index 00000000..79e9947e
--- /dev/null
+++ b/doc/fill/param.md
@@ -0,0 +1,186 @@
+# Paramètre de la fonction
+
+## Paramètre positionnel
+
+Déclarons un calcul avec paramètre :
+
+```
+
+
+ no
+
+
+```
+
+Créons la fonction correspondante :
+
+```
+def return_value(value):
+ return value
+```
+
+La variable aura donc "no" comme valeur puisque le paramètre aura la valeur fixe "no".
+
+## Paramètre nommée
+
+Déclarons une contrainte avec un paramètre nommée :
+
+```
+
+
+ no
+
+
+```
+
+Dans ce cas la fonction return_value sera exécuté avec le paramètre nommé "valeur" dont sa valeur sera "no".
+
+## Paramètre de type texte
+
+Dans l'exemple précédent :
+
+```
+
+
+ no
+
+
+```
+
+Le paramètre est de type texte (ou "string").
+
+## Paramètre de type nombre
+
+Déclarons un calcul avec paramètre avec un nombre :
+
+```
+
+
+ 1
+
+
+```
+
+Créons la fonction correspondante :
+
+```
+def return_value_with_number(value):
+ if value == 1:
+ return 'no'
+ return 'yes'
+```
+
+La variable aura donc "no" comme valeur puisque le paramètre aura la valeur fixe "1".
+
+## Paramètre de type variable
+
+Créons deux variables avec une contrainte de type variable qui contient le nom de la variable dont sa valeur sera utilisé comme paramètre :
+
+```
+
+
+
+
+ 1
+
+
+
+
+
+ my_variable
+
+
+```
+
+Si l'utilisateur laisse la valeur 1 à "my_variable", la valeur par défault de la variable "my_calculated_variable" sera "no".
+Si la valeur de "my_variable" est différent de 1, la valeur par défaut de la variable "my_calculated_variable" sera "yes".
+
+### Paramètre avec variable potentiellement non existante
+
+Suivant le contexte une variable peut exister ou ne pas exister.
+
+Un paramètre de type "variable" peut être "optional" :
+
+```
+
+
+
+
+
+
+
+ unknow_variable
+
+
+```
+
+Dans ce cas la fonction "return_value" est exécuté sans paramètre.
+
+Si maintenant on créé un nouveau dictionnaire en créant cette variable, la fonction sera exécuté avec le paramètre.
+
+### Paramètre avec variable potentiellement désactivée
+
+FIXME :
+
+Il n'y a pas spécialement de test !
+
+### Paramètre avec variable suiveuse
+
+[variable suiveuse](variable/leadership.md)
+
+FIXME :
+
+- tests/flattener_dicos/10leadership_append/00-base.xml
+- tests/flattener_dicos/10leadership_auto/00-base.xml
+- tests/flattener_dicos/10leadership_autoleader/00-base.xml
+- tests/flattener_dicos/10leadership_autoleader_expert/00-base.xml
+
+### Paramètre avec variable dynamique
+
+Il est possible de faire un calcul avec comme paramètre [une variable d'une famille dynamique](family/auto.md) mais pour une suffix particulier :
+
+```
+
+
+
+ val1
+ val2
+
+
+
+
+
+ val
+
+
+
+
+
+ vardynval1
+
+
+```
+
+Dans ce cas, valeur du paramètre de la fonction "return_value" sera la valeur de la variable "vardyn" avec le suffix "val1".
+
+## Paramètre de type information
+
+Le paramètre peut être la valeur est issue d'une information de la configuration.
+
+Créons une variable et la contrainte :
+
+```
+
+
+
+
+
+
+
+ server_name
+
+
+```
+
+Dans ce cas, l'information de la configuration "server_name" sera utilisé comme valeur de la variable "my_calculated_variable".
+Si l'information n'existe pas, la paramètre aura la valeur "None".
diff --git a/doc/fill/redefine.md b/doc/fill/redefine.md
new file mode 100644
index 00000000..f29fd0e8
--- /dev/null
+++ b/doc/fill/redefine.md
@@ -0,0 +1,61 @@
+# Rédéfinition
+
+## Redéfinition des calcules
+
+Dans un premier dictionnaire déclarons notre variable et notre calcule :
+
+```
+
+
+
+
+
+
+
+
+```
+
+Dans un second dictionnaire il est possible de redéfinir le calcul :
+
+```
+
+
+
+
+
+
+
+
+```
+
+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
+
+Il se peut que dans un dictionnaire on décide de définir une valeur par défaut à une variable via un calcul.
+
+Dans un second dictionnaire il est possible de supprimer ce calcul.
+
+Dans un premier dictionnaire déclarons notre variable et notre calcule :
+
+```
+
+
+
+
+
+
+
+
+```
+
+Dans un second dictionnaire supprimer ce calcul :
+
+```
+
+
+
+
+
+```
+
diff --git a/doc/fill/value.md b/doc/fill/value.md
new file mode 100644
index 00000000..8d33a681
--- /dev/null
+++ b/doc/fill/value.md
@@ -0,0 +1,104 @@
+# Valeur calculée de la variable
+
+## Variable avec une valeur par défaut calculée
+
+Créons une variable dont la valeur est retournée par la fonction "return_no" :
+
+```
+
+
+
+
+
+
+
+
+```
+
+Puis créons la fonction "return_no" :
+
+```
+def return_no():
+ return 'no'
+```
+
+Dans ce cas, la valeur par défaut est la valeur retournée par la fonction (ici "no"), elle sera calculée tant que l'utilisateur n'a pas de spécifié une valeur à cette variable.
+
+Attention, si une valeur par défaut est définit dans la variable "my_calculated_variable" :
+
+```
+
+ yes
+
+```
+
+Cette valeur par défaut sera complètement ignorée. C'est le calcul qui en définira la valeur.
+
+## Variable avec une valeur calculée
+
+En ajoutant le paramètre "hidden" à "True" dans la variable précédente, l'utilisateur n'aura plus la possibilité de modifié la valeur. La valeur de la variable sera donc systématiquement calculée :
+
+```
+
+```
+
+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 dynamique avec une valeur calculée
+
+Il est également possible de calculer [une variable d'une famille dynamique](family/auto.md) à partir d'une variable standard :
+
+```
+
+
+
+ val1
+ val2
+
+
+ val
+
+
+
+
+ val
+
+
+
+
+
+ my_variable
+
+
+```
+
+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".
+
+Par contre, il n'est pas possible de faire un calcul pour une seule des deux variables issues de la variable dynamique.
+Si c'est ce que vous cherchez à faire, il faudra prévoir un traitement particulier dans votre fonction.
+
+Dans ce cas, il faut explicitement demander la valeur du suffix dans la fonction :
+
+```
+
+
+ my_variable
+
+
+
+```
+
+Et ainsi faire un traitement spécifique pour ce suffix :
+
+```
+def return_value_suffix(value, suffix):
+ if suffix == 'val1':
+ return value
+```
+
+## Variable avec valeur calculée obligatoire
+
+Par défaut les variables calculées ne sont pas des variables obligatoires.
+Dans ce cas un calcul peut retourner "None" ou "", mais surtout un utilisateur peut spécifier une valeur nulle à cette variable. Dans ce cas le calcul ne sera plus réalisé.
+
diff --git a/doc/variable/README.md b/doc/variable/README.md
new file mode 100644
index 00000000..db84b9ed
--- /dev/null
+++ b/doc/variable/README.md
@@ -0,0 +1,6 @@
+# Variable
+
+ - [Une variable](simple.md)
+ - [Variable meneuse ou suiveuse](leadership.md)
+
+FIXME
diff --git a/doc/variable/simple.md b/doc/variable/simple.md
new file mode 100644
index 00000000..08bbd18b
--- /dev/null
+++ b/doc/variable/simple.md
@@ -0,0 +1,204 @@
+# Variable
+
+## Un variable
+
+Une variable est forcement dans une famille. Il faut donc déjà avoir créer une famille.
+
+Une variable est déjà un nom. C'est à dire qu'on pourra utiliser plus tard la variable via ce nom.
+
+```
+
+```
+
+## 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 :
+
+```
+
+```
+
+En plus de la description, il est possible de préciser une aide complémentaire :
+
+```
+
+```
+
+## Le type de la variable
+
+Une variable a un type. Ce type permet de définir les valeurs acceptées par cette variable :
+
+- string : chaine de caractère (type par défaut)
+- number : un nombre
+- float : un chiffre flottant
+- boolean : True ou False si aucune valeur n'est défini la valeur par défaut cette variable sera True
+- password : un mot de passe
+- mail : une adresse mail
+- filename : nom de fichier au sens Unix (exemple : '/etc/passwd')
+- date : une date au format "%Y-%m-%d" (exemple : "2021-01-30")
+- unix_user : nom d'utilisateur au sens Unix
+- ip : n'importe quelle adresse IPv4
+- cidr : n'importe quelle adresse IPv4 au format CIDR
+- local_ip : adresse IPv4 sur un réseau local, si l'adresse IPv4 n'est pas local, un warning sera afficher mais la valeur sera accepté tout de même
+- netmask : masque d'une adresse IPv4
+- network : adresse réseau
+- network_cidr : adresse réseau au format CIDR
+- broadcast : adresse de diffusion
+- netbios : nom netbios
+- domain : nom de domaine
+- hostname : nom d'hôte
+- web_address : adresse web (http://www.cadoles.com/)
+- port : port
+- mac : adresse MAC
+- schedule : périodicité du schedule, les valeurs possibles sont "none", "daily", "weekly" ou "monthly"
+- schedulemod : type de schedule, les valeurs possibles sont "pre" ou "post"
+
+Pour définir le type d'une variable :
+
+```
+
+```
+
+## 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.
+
+Pour définir une variable à valeur multiple :
+
+```
+
+```
+
+## Mode de la variable
+
+Le [mode](./mode.md) par défaut d'une variable correspond au [mode](./mode.md) de la famille.
+
+Pour définir le [mode](./mode.md) :
+
+```
+
+```
+
+## Variable invisible
+
+Il est possible de cacher une variable.
+
+Cacher une variable signifie qu'elle ne sera pas visible lorsqu'on modifie la configuration du service.
+Par contre cette variable sont accessibles lorsqu'on va l'utiliser.
+
+Pour cacher une variable :
+
+```
+
+```
+
+## Variable désactive
+
+Il est possible de désactiver une variable.
+
+Désactiver une variable signifie qu'elle ne sera pas visible lorsqu'on modifie la configuration du service mais également lorsqu'on va l'utiliser.
+
+Pour désactiver une variable :
+
+```
+
+```
+
+## Variable obligatoire
+
+Variable dont une valeur est requise :
+
+```
+
+```
+
+## Valeur par défaut d'une variable
+
+Il est possible de fixer les valeurs par défaut d'une variable :
+
+```
+
+ value
+
+```
+
+Pour une variable multiple, il est possible de préciser plusieurs valeurs :
+
+```
+
+ value 1
+ value 2
+
+```
+
+Une valeur par défaut peut également être [une valeur calculer](fill/README.md).
+
+## Redéfinir une variable
+
+Il est possible de définir une variable dans un dictionnaire et de changer son comportement dans une second dictionnaire.
+
+Attention trois attributs ne sont redéfinisable :
+
+- name
+- type
+- multi
+
+Créons notre variable :
+
+
+
+Et redéfinisons là :
+
+```
+
+```
+
+## Créer une variable inexistante
+
+Il est parfois utile de créer une variable si elle n'existe pas dans un autre dictionnaire :
+
+```
+
+```
+
+Si cette variable existe dans un autre dictionnaire, elle ne sera pas modifié ni recréé
+
+## Redéfinir une variable si elle existe
+
+Parfois on veut pouvoir redéfinir une variable mais seulement dans le cas où elle existe déjà :
+
+```
+
+```
+
+## Variable à valeur automatiquement modifiée
+
+Une variable avec valeur automatiquement modifiée est une variable dont la valeur sera considéré comme modifié quand le serveur sera déployé.
+
+Voici une variable a valeur automatiquement modifiée :
+
+```
+
+ 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.
+
+Ces variables sont généralement des variables obligatoires. En effet ces variable ne sont automatiquement modifiées que si elles ont une valeurs.
+
+## Variable à valeur en lecture seule automatique
+
+Une variable avec valeur en lecture seule automatique est une variable dont la valeur ne sera plus modifiable par l'utilisateur quand le serveur sera déployé.
+
+Voici un variable à valeur en lecture seule automatique :
+
+```
+
+```
+
+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.
+
+Ces variables sont généralement des variables obligatoires. En effet ces variable ne sont en lecteur seul que si elles sont une valeurs.
diff --git a/doc/variables.md b/doc/variables.md
index 2de8a86e..6b95be14 100644
--- a/doc/variables.md
+++ b/doc/variables.md
@@ -1,6 +1,6 @@
# Le conteneur des variables
-La balise "variables" est le conteneur de l'ensemble des familles dans laquelle on pourra placer des variables :
+La balise "variables" est le conteneur de l'ensemble des [familles](family/README.md) dans laquelle on pourra placer des [variables](variable/README.md) :
```