Variables crole
================

typeole_

.. _typeole: api/creole.typeole-module.html

variable crole

    instance d'un objet type eole,  un nom de variable correspond
    peut-tre plusieurs valeurs

>>> from creole import typeole
>>> var = typeole.EoleVar('mavariable')
>>> var.val
[]
>>> var.set_value('valeur')
>>> var.set_value('defaut', default=True)
>>> var.val
['valeur']
>>> var.valdefault
['defaut']
>>> var.description = 'variable de test'
>>> var.description
'variable de test'
>>>

il est possible de crer une variable Eole  l'aide
d'une factory : 

>>> var2 = typeole.type_factory('string', 'test_string', valeole=["eole"], valdefault=["def"])
>>> var2.get_value()
['def']
>>>

des vrifications de type sont faites au moment du *set_value()*

collecte des variables crole
-----------------------------
                                                                                                               
collecte 

    Rcupration de variables qui serviront a la constitution du dictionnaire Eole 

Les donnes du dictionnaire sont collectes  partir de diffrents fichiers dans un premier format XML.

sur une machine cible, une collecte des variables eole est faite avec parse_dico_::

    from creole.parsedico import parse_dico
    parse_dico()

.. ce test n'est pas lanc car il peut y avoir un dico sur le poste
   de travail

.. _parse_dico: api/creole.parsedico-module.html

Le dictionnaire crole est vide. Pour le remplir, il faut
rcuprer des donnes depuis un fichier xml initial::

    my_dict = EoleDict()
    my_dict.read(join('/etc/eole/','eole.xml'))

.. TODO:    	read_string(self, xml_string)

Utilisation du dictionnaire
---------------------------

dictionnaire 

    fichier au format xml contenant : 
    - une liste de fichiers 
    - une liste de variables

famille

    Il s'agit d'un regroupement de variable utilis pour la saisie : on parle alors de famille de variables
                                                                                                               
groupe

    Il s'agit de variables de type `liste` dont les lments sont lies aux lments correspondants des autres
    eth[2] aura un lien avec netmask[2] et network[2].

Plutt que d'utiliser `parsedico`, construisons un dictionnaire creole EoleDict_ : 

>>> from creole import cfgparser
>>> from creole import typeole
>>>
>>> dico = cfgparser.EoleDict()
>>> dico.variables['ip_eth'] = typeole.type_factory('string', 'ip_eth', val=['ip0', 'ip1', 'ip2'])
>>> dico.variables['nom_etab'] = typeole.type_factory('string', 'nom_etab', val=['etab'])
>>> dico.variables['vrai'] = typeole.type_factory('boolean', 'vrai', val=[True])
>>> dico.variables['faux'] = typeole.type_factory('string', 'faux', val=['faux'])
>>> dico.variables['toto'] = typeole.type_factory('string', 'toto', val=['toto'])

voici comment accder aux variables crole

>>> assert dico.get_value('ip_eth') == ['ip0', 'ip1', 'ip2']
>>> assert dico.get_value('nom_etab') == ['etab']

.. _EoleDict : api/creole.cfgparser.EoleDict-class.html


variables  de template
-----------------------


lorsqu'on utilise un appel de bas niveau de traitement de template, 
c'est--dire l'appel direct  la
mthode process_ d'un template, il faut vrifier qu'une variable
est bien instancie avec le bon contexte de dictionnaire : 

.. _process: api/creole.template.Template-class.html

>>> from creole.cfgparser import EoleDict
>>> from creole import typeole
>>> from creole.template import Template
>>> dico = EoleDict()
>>> dico.variables['toto'] = typeole.type_factory('string', 
...  'toto', val=['toto'], context=dico)
>>> t = Template('data/dst/test.tmpl', templatedir= 'data/src')
>>> t.verify()
>>> t.process(dico)
>>> f = open('data/dst/test.tmpl')
>>> res = f.read()
>>> f.close()
>>> assert 'titi' not in res
>>> dico.set_value('toto', 'titi')
>>> t.process(dico)
>>> f = open('data/dst/test.tmpl')
>>> res = f.read()
>>> f.close()
>>> assert 'titi' in res
				   
le contexte `dico` est pass  la variable `toto`:: 

  dico.variables['toto'] = typeole.type_factory('string', 
                           'toto', val=['toto'], context=dico)

variables automatiques
----------------------

variable automatique

    variable prsente dans le dictionnaire xml mais pas dans le fichier *.ini* de configuration. 
	la valeur de cette variable (sont appel  *.get_value()* est soumis  une fonction de traitement 
	spcifie dans le xml, qui calcule la variable au lieu de formater sa valeur. 

Une variable automatique simple n'est pas traite diffremment d'une variable dont la valeur est prsente dans le dictionnaire et qui est soumise  une condition de vrification de sa valeur. Simplement, aucune vrification n'est effectue et la valeur est calcule.

dclaration de la variable::

		<variable name='server_mem' type='string' description='memoire du serveur' auto='True' />

dclaration de la fonction de remplissage::

		<fill name='server_mem' target='server_mem' />

deux fonctions strictement automatiques sont implmentes: `server_mem` et `kernel_version`

variable semi-automatique

    variable remplit automatiquement dans le cas d'une condition sur une autre variable,
	si cette condition n'est pas remplie, c'est l'uilisateur qui la remplit (ou une autre fonction).
	la condition est traite  deux niveaux, dans la fonction de remplissage, et au niveau de l'affichage.
	On remplit donc deux fonctions pour ce conditionnement (une fonction fill avec la variable 
	conditionnante en paramtre et une fonction condition qui conditionne l'affichage de la variable.
	exemple : rcupration des adresses eth dans le cas o l'on a pas de dhcp.

dclaration de la variable semi-auto::
		
		<variable name='eth0' type='string' auto='True'/>

dclaration de la variable qui dfinit la condition::

		<variable name='dhcp' type='boolean' description='Activation du dhcp' >
            <value>non</value>
        </variable>
		<check name='valid_enum' target='dhc'>
                <param>['oui','non']</param>
        </check>

dclaration de la fonction de contrle d'automatisme, la variable eth0 est remplie automatiquement par la fonction
*auto_eth* si le paramtre dhcp est gal  la condition *oui*::

		<fill name='auto_eth' target='eth0'>
            <param>eth0</param>
            <param name='condition'>oui</param>
            <param type='eole' name='parametre'>dhcp</param>
        </fill>

dclaration de la fonction de contrle d'ditabilit::

		<condition name='hidden_if_in' source='dhc'>
            <param>oui</param>
            <target type='variable'>eth0</target>
        </condition>

pour l'instant sont diposnible auto_eth, auto_netmask, auto_broadcast et auto_network.



