Fonctions prédéfinies
Il est possible d'accéder à des fonctions prédéfinies, provenant du module : eosfunc.py
.
Ces fonctions peuvent être utilisées dans un template de la manière suivante (exemple) :
[...] %%fonction_predefinie(%%variable)
[...]
Variable "optionnelle" : is_defined
Il peut arriver qu'on ne soit pas sûr que la variable que l'on souhaite tester soit définie dans les dictionnaires présents sur le module ou que la variable soit désactivée.
C'est le cas lorsque l'on veut traiter un cas particulier dans un template qui est commun à plusieurs modules.
Hors, si une variable est utilisée dans le template cible sans avoir été définie, le processus d'instanciation sera stoppé.
Pour tester si une variable est définie, il faut utiliser la fonction %%is_defined
.
Exemple
%if %%is_defined('ma_variable')
%%ma_variable
%else
la variable n'est pas définie
%end if
Contrairement à toutes les autres fonctions, is_defined nécessite comme argument le nom de la variable fourni sous forme d'une chaîne de caractères.
Si une variable non définie est placée dans un bloc qui n'est pas traité (conditionné par une fonction ou d'autres variables), ça n'est pas bloquant.
Truc & astuce
Dans de nombreux cas, la fonction is_defined peut avantageusement être remplacée par la fonction getVar à laquelle on aura pris soin d'indiquer une valeur par défaut à renvoyer en cas d'indisponibilité de la variable (voir ci-dessous).
Variable "vide" : is_empty
Il n'est pas toujours évident, en particulier lorsque l'on manipule des variables multi-valuées, de trouver le test adéquat afin de déterminer si une variable est vide.
Pour tester si une variable est vide, il est désormais recommandé d'utiliser la fonction %%is_empty
.
Exemple
%if not %%is_empty(%%ma_variable)
%%ma_variable[0]
%else
la variable est vide
%end if
Concaténation des éléments d'une liste : custom_join
La fonction %%custom_join
permet de concaténer facilement les éléments d'une variable multi-valuée.
Cela permet d'éviter le recours à une boucle %for
et l'utilisation du l'instruction %slurp
qui est souvent source d'erreurs.
Il est possible de spécifier le séparateur à utiliser en le passant comme paramètre à la fonction.
En l'absence de ce paramètre, le séparateur utilisé est l'espace.
Exemple
%%custom_join(%%ma_variable, ':')
Si ma_variable vaut ['a', 'b', 'c'], cela donnera :
a:b:c
Variable "dynamique" : getVar
Une variable dynamique prend comme nom (ou partie du nom) la valeur d'une autre variable.
Exemple
%for %%interface in range(0, %%int(%%nombre_interfaces))
L'interface eth%%interface a pour adresse %%getVar('adresse_ip_eth'+str(%%interface))
%end for
La fonction getVar peut également être utilisée lorsque l'on n'est pas certain qu'une variable est disponible car il est possible de lui spécifier une valeur par défaut à renvoyer en cas d'indisponibilité.
Exemple
%if %%getVar("activer_mon_logiciel", "non") == 'oui'
Activation du logiciel
%end if
Variable esclave "dynamique" : getattr
Lorsque le nom de la variable esclave doit être calculé, on peut utiliser %%getattr
à la place de la notation pointée.
Exemple
%set %%num='0'
%for %%ip_ssh in %%getVar('ip_ssh_eth'+%%num)
SSH est autorisé pour %%ip_ssh/%%getattr(%%ip_ssh, 'netmask_ssh_eth'+%%num)
%end for
Autres fonctions
Fonctions de traitement des chaînes de caractères
- transformation d'une chaîne en majuscules :
%%upper(%%ma_chaine)
; - transformation d'une chaîne en minuscules :
%%lower(%%ma_chaine)
; - encodage d'une chaîne en ISO-8859-1 (au lieu d'UTF-8) :
%%to_iso(%%ma_chaine)
; - transformation d'un masque réseau (ex : 255.255.255.0) en classe d'adresse (ex : 24) :
%%calc_classe(%%mask)
;
Fonctions de tests
- vérification que la variable est une adresse IP (et pas un nom DNS) :
%%is_ip(%%variable)
; - vérification de l'existence d'un fichier :
%%is_file(%%fichier)
.
Déclaration de fonctions locales
Pour un traitement local et répétitif, il peut être pratique de déclarer une fonction directement dans un template avec %def
et %end def
.
Cependant, la syntaxe à utiliser dans ces fonctions est assez complexe (on ne sait jamais quand mettre le caractère %
!) et ce genre de déclaration ne facilite pas la lisibilité du template.
Les fonctions déclarées localement s'utilisent de la même façon que les fonctions déjà prédéfinies.
Exemple
%def nombre_points(chaine)
%return chaine.count('.')
%end def
Il y a %%nombre_points(%%ma_variable) points dans ma variable.
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 faits 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.