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.