Mettre en place des contraintes

Des fonctions (contraintes) peuvent être utilisées pour grouper / tester / remplir / conditionner des variables.

L'ensemble des contraintes d'un dictionnaire se place à l'intérieur d'un nœud XML <constraints></constraints>.

Lien entre variables : <group>

Il est possible de lier des variables sous la forme d'une relation maître-esclave(s).

La variable maître doit obligatoirement être multi-valuée (multi='True').

Elle se définit dans l'attribut master.

Les variables esclaves sont définies entre les balises <slave>.

Les variables esclaves deviennent automatiquement multi-valuées.

Exemple

1
<group master='adresse_ip_eth0'>
2
    <slave>adresse_netmask_eth0</slave>
3
    <slave>adresse_network_eth0</slave>
4
</group>

Calcul automatique modifiable <fill> ou non <auto>

Le calcul automatique permet d'associer automatiquement (par le calcul) une valeur par défaut à une variable.

Cette valeur peut être :

  • éditable par l'utilisateur : balise <fill> ;
  • non éditable par l'utilisateur (exemple : l'IP d'un serveur en DHCP) : balise <auto>.

Attention

Contrairement aux versions précédentes si l'utilisateur a choisi de conserver la valeur par défaut d'une variable affectée par un fill, le calcul de la valeur sera réalisé à chaque fois, comme pour les variables auto sauf si la variable possède l'attribut auto_save='True'.

Attention

Les calculs auto ne sont pas compatibles avec les variables à verrouillage automatique (auto_freeze) ou à enregistrement obligatoire (auto_save).

L'attribut name correspond au nom de la fonction qui sera utilisée pour le calcul.

Les fonctions utilisées peuvent être :

  • des fonctions natives de Tiramisu[1] ;
  • des fonctions déclarées dans le fichier eosfunc.py ;
  • des fonctions ajoutées en tant que fonctions personnalisées (voir ci-dessous).

L'attribut de la balise param : optional='True' : indique que le paramètre sera ignoré si la variable associée n'existe pas. Cela permet de contourner les erreurs du type : Utilisation de la variable <param_var_name> non présente dans un calcul

L'attribut de la balise param : hidden='False' : indique que le paramètre sera ignoré si la variable possède des propriétés incompatibles avec le calcul (variable désactivée, variable obligatoire sans valeur, ...). Cela permet de contourner les erreurs du type : impossible d'effectuer le calcul, l'option <target_var_name> a les propriétés : ['disabled'] pour : <param_var_name>

Les principales fonctions de calcul utilisables avec les balises fill et auto sont les suivantes :

  • calc_network : calcule l'adresse réseau par défaut à partir d'une IP et d'un masque de sous-réseau

    <fill name='calc_network' target='my_network'>

        <param type='eole' name='ip'>my_ip</param>

        <param type='eole' name='netmask'>my_netmask</param>

    </fill>

  • calc_broadcast : calcule l'adresse de broadcast à partir d'une adresse IP et d'un masque de sous-réseau

    <fillname='calc_broadcast' target='my_broadcast'>

        <param type='eole' name='ip'>my_ip</param>

        <param type='eole' name='netmask'>my_netmask</param>

    </fill>

  • calc_val : renvoie la valeur passée en paramètre (généralement la valeur d'une autre variable)

    <fill name='calc_val' target='nom_machine'>

        <param type='eole' name='valeur'>eole_module</param>

    </fill>

  • calc_val_first_value : renvoie la valeur de la première variable définie

    <fill name='calc_val_first_value' target='eolesso_adresse'>

        <param type='eole' optional='True' hidden='False'>web_url</param>

        <param type='eole'>adresse_ip_eth0</param>

    </fill>

  • calc_multi_val : renvoie les valeurs passées en paramètre en supprimant les doublons

    <fill name='calc_multi_val' target='ssl_organization_unit_name'>

        <param>110 043 015</param>

        <param type='eole'>nom_academie</param>

        <param type='eole'>numero_etab</param>

    </fill>

    Si l'une des valeurs passées à la fonction est vide, elle renverra une liste vide.

    À partir d'EOLE 2.6.2, il est possible de modifier ce comportement en ajoutant la balise suivante : <param name='allow_none'>True</param>.

  • concat : concaténation de plusieurs valeurs

    <fill name="concat" target='bacula_dir_name'>

        <param type='eole' name='valeur1'>nom_machine</param>

        <param name='valeur2'>-dir</param>

    </fill>

  • calc_multi_condition : la valeur est déterminée en fonction d'une ou de plusieurs autres variables. Le résultat peut être une chaîne de caractères ou la valeur d'une autre variable multi ou non (si type='eole')

    <auto name='calc_multi_condition' target='variable_calculee'>

        <param>oui</param>

        <param type='eole' name='condition_1'>activer_logiciel1</param>

        <param type='eole' name='condition_2' hidden='False'>activer_logiciel2</param>

        <param name='match'>oui</param>

        <param name='mismatch' type='eole'>variablemiss</param>

        <param name='default_mismatch'>valeur_si_variablemiss_disabled</param>

    </auto>

    Il est possible d'utiliser des calc_multi_condition avec des variables non déclarées ou désactivées mais uniquement si toutes les variables testent la même condition.

    A contrario, il est possible de spécifier une condition différente pour chacune des variables en en fournissant la liste dans la première balise param : <param>['non', 'oui']</param>. Dans ce cas, il faut exactement le bon nombre de variables et que celles-ci soient accessibles.

Validation et/ou liste de choix : <check>

La valeur renseignée pour une variable est validée par une fonction.

Truc & astuce

La déclaration de nombreuses validations peut être évitée en affectant un type adapté à chacune des variables.

L'attribut name correspond au nom de la fonction qui sera utilisée pour le calcul.

Les fonctions utilisées peuvent être :

  • des fonctions natives de Tiramisu[1] ;
  • des fonctions déclarées dans le fichier eosfunc.py ;
  • des fonctions ajoutées en tant que fonctions personnalisées (voir ci-dessous).

L'attribut de la balise param : optional='True' : indique que le paramètre sera ignoré si la variable associée n'existe pas. Cela permet de contourner les erreurs du type : Utilisation de la variable <param_var_name> non présente dans un calcul

L'attribut de la balise param : hidden='False' : indique que le paramètre sera ignoré si la variable possède des propriétés incompatibles avec le calcul (variable désactivée, variable obligatoire sans valeur, ...). Cela permet de contourner les erreurs du type : impossible d'effectuer le calcul, l'option <target_var_name> a les propriétés : ['disabled'] pour : <param_var_name>

La présence de l'attribut level="warning" indique que le test de validation n'est pas bloquant.

En cas d'échec de la validation un message d'alerte apparaîtra mais la valeur sera tout de même acceptée.

Exemple

1
<check name="valid_ipnetmask" target="adresse_netmask_eth0" level="warning">
2
    <param type='eole'>adresse_ip_eth0</param>
3
</check>

Les principales fonctions de validation disponibles sont les suivantes :

  • valid_enum : la valeur doit être choisie parmi celles de la liste, si checkval est à False, l'utilisateur est autorisé à entrer la valeur de son choix (liste ouverte)

    <check name="valid_enum" target="lettre">

        <param>['a','b','c']</param>

        <param name="checkval">False</param>

    </check>

  • valid_regexp : la valeur doit être conforme à une expression rationnelle

    <check name='valid_regexp' target='code_ent'>

        <param>^[A-Z][0-9]$</param>

        <param name='err_msg'>L'identifiant doit etre compose d'une lettre et d'un chiffre</param>

    </check>

  • valid_differ : la valeur doit être différente de celle passée en paramètre

    <check name='valid_differ' target='smb_workgroup'>

        <param type='eole' hidden='False'>smb_netbios_name</param>

    </check>

  • valid_entier : la valeur doit être un entier sur lequel on peut définir un minimum et/ou un maximum

    <check name='valid_entier' target='nombre'>

        <param name='mini'>0</param>

        <param name='maxi'>50</param>

    </check>

  • valid_networknetmask : vérifie la cohérence entre une variable de type network et la variable de type netmask associée

    <check name="valid_networknetmask" target="netmask_ssh_eth0">

        <param type='eole'>ip_ssh_eth0</param>

    </check>

  • valid_ipnetmask : vérifie la cohérence entre une variable de type ip et la variable de type netmask associée

    <check name="valid_ipnetmask" target="adresse_netmask_eth0" level="warning">

        <param type='eole'>adresse_ip_eth0</param>

    </check>

  • valid_in_network : vérifie la cohérence entre une variable de type ip et les variables de type network et netmask associées

    <check name="valid_in_network" target="adresse_ip_gw">

        <param type='eole'>adresse_network_eth0</param>

        <param type='eole'>adresse_netmask_eth0</param>

    </check>

Autre fonction de validation disponible mais non utilisée dans les dictionnaires livrés :

  • valid_broadcast

Contrainte entre variables : <condition>

disabled_if_in et disabled_if_not_in

Les conditions disabled_if_in et disabled_if_not_in permettent :

  • d'activer/désactiver une variable (type='variable')
  • d'activer/désactiver une famille (type='family')
  • d'activer/désactiver des services (type='servicelist')
  • d'activer/désactiver des règles de pare-feu (type='service_accesslist')
  • d'activer/désactiver la templatisation de fichiers (type='filelist')

en fonction d'un ensemble de conditions.

Exemple
1
<condition name='disabled_if_not_in' source='port_rpc'>
2
    <param>0</param>
3
    <param>7080</param>
4
    <target>ip_eth0</target>
5
    <target type='family' optional='True'>net</target>
6
    <target type='filelist'>ldap</target>
7
    <target type='servicelist'>ldap</target>
8
</condition>
Truc & astuce

La syntaxe <param></param> permet de mettre en place une condition sur le fait que la variable source est renseignée ou non.

Attentionhidden_if_in et hidden_if_not_in

Les anciennes conditions hidden_if_in et hidden_if_not_in sont toujours supportées mais leur comportement est désormais calqué sur celui des disabled_if_in et disabled_if_not_in par lesquelles elles doivent être remplacées.

Gestion des variables inexistantes ou désactivées

Si l'attribut optional de la balise target vaut 'True', la cible sera ignorée si elle n'existe pas.

Cela permet de contourner les erreurs du type : Variable <target_var_name> inexistante mais avec condition

Si l'attribut fallback de la balise condition vaut 'True', les cibles seront automatiquement désactivées si le calcul de la condition est impossible (variable source inconnue ou désactivée).

Cela permet de contourner les erreurs du type : Variable <src_var_name> inexistante mais utilisée dans une condition

Son utilisation évite d'avoir à déclarer explicitement la variable source avec l'attribut exists='False'  dans le dictionnaire courant.

Exemple
1
<condition name='disabled_if_in' source='activer_spamassassin' fallback='True'>
2
    <param>non</param>
3
    <target type='variable'>exim_spam_score</target>
4
</condition>
Désactivation de variables entre esclaves du même groupe

À partir de la version 2.6.1 d'EOLE, il est possible de gérer la désactivation d'une variable esclave en fonction de la valeur d'une autre variable esclave du même groupe.

Dans les versions précédentes, il était possible de désactiver totalement une variable esclave mais pas de le faire pour une seule de ses valeurs.

ExempleDictionnaire avec conditions de désactivation entre variables esclaves
1
<?xml version="1.0" encoding="utf-8"?>
2
<creole>
3
    <files/>
4
    <variables>
5
        <family name='famille_demo'>
6
            <variable name='ma_master' type='string' description='Je suis une variable maitre' multi="True"/>
7
            <variable name='ma_slave1' type='oui/non' description='Je suis une variable esclave qui cache'>
8
                <value>oui</value>
9
            </variable>
10
            <variable name='ma_slave2' type='string' description='Je suis une variable esclave qui peut être caché'/>
11
            <variable name='ma_slave3' type='string' description='Je suis une variable esclave qui peut être caché aussi'/>
12
        </family>
13
    </variables>
14
    <constraints>
15
        <group master='ma_master'>
16
            <slave>ma_slave1</slave>
17
            <slave>ma_slave2</slave>
18
            <slave>ma_slave3</slave>
19
        </group>
20
        <condition name='disabled_if_in' source='ma_slave1'>
21
            <param>non</param>
22
            <target type='variable'>ma_slave2</target>
23
        </condition>
24
        <condition name='disabled_if_in' source='ma_slave1'>
25
            <param>oui</param>
26
            <target type='variable'>ma_slave3</target>
27
        </condition>
28
    </constraints>
29
    <help/>
30
</creole>
ExempleTemplate associé au dictionnaire
1
%for %%master in %%ma_master
2
pour %%master :
3
%if %%master.ma_slave1 == 'oui'
4
* ma_slave2 : %%master.ma_slave2
5
%else
6
* ma_slave3 : %%master.ma_slave3
7
%end if
8
%end for

frozen_if_in et frozen_if_not_in

Les conditions frozen_if_in et frozen_if_not_in permettent de passer une variable en mode automatique (valeur non modifiable par l'utilisateur) en fonction d'un ensemble de conditions.

Exemple
1
<condition name='frozen_if_not_in' source='eth0_method'>
2
    <param>statique</param>
3
    <target type='variable'>adresse_ip_eth0</target>
4
    <target type='variable'>adresse_netmask_eth0</target>
5
    <target type='variable'>adresse_ip_gw</target>
6
</condition>
Truc & astuce

La syntaxe <param></param> permet de mettre en place une condition sur le fait que la variable source est renseignée ou non.

Gestion des variables inexistantes ou désactivées

Si l'attribut optional de la balise target vaut 'True', la cible sera ignorée si elle n'existe pas.

Cela permet de contourner les erreurs du type : Variable <target_var_name> inexistante mais avec condition

Si l'attribut fallback de la balise condition vaut 'True', les cibles seront automatiquement désactivées si le calcul de la condition est impossible (variable source inconnue ou désactivée).

Cela permet de contourner les erreurs du type : Variable <src_var_name> inexistante mais utilisée dans une condition

Son utilisation évite d'avoir à déclarer explicitement la variable source avec l'attribut exists='False'  dans le dictionnaire courant.

mandatory_if_in et mandatory_if_not_in

Les conditions mandatory_if_in et mandatory_if_not_in permettent passer une variable en mode obligatoire (une valeur doit être renseignée par l'utilisateur) en fonction d'un ensemble de conditions.

Exemple
1
<condition name='mandatory_if_not_in' source='mode_zephir'>
2
    <param>non</param>
3
    <target type='variable'>nom_carte_eth0</target>
4
    <target type='variable'>nom_zone_eth0</target>
5
</condition>
Truc & astuce

La syntaxe <param></param> permet de mettre en place une condition sur le fait que la variable source est renseignée ou non.

Gestion des variables inexistantes ou désactivées

Si l'attribut optional de la balise target vaut 'True', la cible sera ignorée si elle n'existe pas.

Cela permet de contourner les erreurs du type : Variable <target_var_name> inexistante mais avec condition

Si l'attribut fallback de la balise condition vaut 'True', les cibles seront automatiquement désactivées si le calcul de la condition est impossible (variable source inconnue ou désactivée).

Cela permet de contourner les erreurs du type : Variable <src_var_name> inexistante mais utilisée dans une condition

Son utilisation évite d'avoir à déclarer explicitement la variable source avec l'attribut exists='False'  dans le dictionnaire courant.

Ajout de fonctions personnalisées

Il est possible d'ajouter des librairies de fonctions personnalisées dans le répertoire /usr/share/creole/funcs.

Les librairies doivent posséder l'extension .py et contenir des fonctions python.

Exemple

# -*- coding: utf-8 -*-

def to_iso(data):

""" encode une chaine en ISO"""

try:

    return unicode(data, "UTF-8").encode("ISO-8859-1")

except:

    return data

Attention

Si vous devez importez des librairies python dans un fichier de fonctions personnalisées, ne les importez pas en début de fichier.

Les imports doivent être effectués dans la fonction de calcul elle-même.

Truc & astuce

Les adaptations que vous pouvez réaliser sur l'un de vos serveurs EOLE sont susceptible d'intéresser d'autres utilisateurs. Elles peuvent faire l'objet d'une intégration dans le projet EOLE par l'équipe de développement.

Les avantages sont multiples :

  • pérennité de vos modifications ;

  • diffusion sur l'ensemble de vos serveurs ;

  • optimisé par l'équipe ;

  • diffuser à tous les utilisateurs.

Aussi n'hésitez pas à proposer votre travail. Pour se faire vous pouvez vous référer à la documentation pour apprendre comment contribuer.