Projet

Général

Profil

EnvoleEoleDB » Historique » Version 14

Gérald Schwartzmann, 09/03/2016 15:22

1 9 Gérald Schwartzmann
h1. Comment migrer une application Envole à EoleDB
2 1 Philippe Caseiro
3 10 Philippe Caseiro
h2. Comprendre EoleDB
4 1 Philippe Caseiro
5 10 Philippe Caseiro
EoleDB est une re-implémentation de l'ancien système eole-sql avec quatres objectifs principaux : 
6 1 Philippe Caseiro
# Avoir 1 seul fichier de configuration.
7 1 Philippe Caseiro
# Supporter nativement plusieurs types de bases de données (mysql, postgresql, sqlite, ...).
8 1 Philippe Caseiro
# Supporter nativement l'externalisation des baes de données sur d'autres serveurs.
9 10 Philippe Caseiro
# Ne plus avoir fournir des scripts python pour pouvoir générer ou mettree à jour des bases de données quand de la configuration suffit largement (cf conf/updates/config.py).
10 1 Philippe Caseiro
11 10 Philippe Caseiro
12 3 Philippe Caseiro
EoleDB dispose d'un fichier de configuration par défaut, _*/etc/eole/eole-db.conf*_, ce fichier
13 2 Philippe Caseiro
au format yaml définis le comportement par défaut de EoleDB si aucune configuration spécifique 
14 2 Philippe Caseiro
n'est définie par l'application.
15 2 Philippe Caseiro
16 14 Gérald Schwartzmann
L'application dispose d'un fichier de configuration au format YAML qui surcharge le comportement
17 3 Philippe Caseiro
de EoleDB. Les fichiers de configurations sont dans _*/etc/eole/eole-db.d/*_**.
18 1 Philippe Caseiro
Les fichiers de configuration spécifiques aux applications redéfinissent le comportement de EoleDB.
19 1 Philippe Caseiro
20 10 Philippe Caseiro
Actuellement EoleDB supporte complètement MySQL, le support postgresql et sqlite sont a compléter.
21 10 Philippe Caseiro
22 14 Gérald Schwartzmann
Pour des raisons pratiques, EoleDB réalise également le changement de mots de passe dans les 
23 10 Philippe Caseiro
fichiers de configuration des applications, les mots de passes sont changées a chaque lancement
24 10 Philippe Caseiro
de la commande eole_db_gen, dans le cas de EOLE au minimum cette commande est lancée a chaque reconfigure.
25 10 Philippe Caseiro
26 10 Philippe Caseiro
Pour utiliser EoleDB il suffit de mettre en place les fichiers de configuration et de lancer la commande 
27 10 Philippe Caseiro
*eole_db_gen* 
28 10 Philippe Caseiro
29 10 Philippe Caseiro
h3. man eole_db_gen
30 10 Philippe Caseiro
31 10 Philippe Caseiro
Si vous lancez eole_db_gen sans aucun paramètre le programme vas utiliser les paramètres par défaut,
32 10 Philippe Caseiro
pour diverses raisons vous pouvez avoir envie d'utiliser d'autres fichiers de configurations.
33 10 Philippe Caseiro
34 10 Philippe Caseiro
Pour ce faire vous pouvez utiliser les paramètres de la commande suivants : 
35 10 Philippe Caseiro
36 10 Philippe Caseiro
* -h, --help: Affiche le message d'aide à l'utilisation de la commande
37 10 Philippe Caseiro
* -c, --config: Définir un fichier de configuration a utiliser à la place de _/etc/eole/eole-db.conf_
38 10 Philippe Caseiro
* -d, --dbdir: Définir un répertoire qui contiens les fichiers de configuration des applications qui n'est pas _/etc/eole/eole-db.d/_
39 10 Philippe Caseiro
* -b, --backup-dir: Définir un répertoire pour copier les sauvegardes des fichiers modifiés par EoleDB
40 10 Philippe Caseiro
41 10 Philippe Caseiro
42 10 Philippe Caseiro
h2. Configurer EoleDB
43 10 Philippe Caseiro
44 3 Philippe Caseiro
h3. Les options de configuration possibles pour _/etc/eole/eole-db.conf_:
45 3 Philippe Caseiro
46 2 Philippe Caseiro
* *dbcont*: Définition du conteneur par défaut de la base de données en mode conteneur
47 2 Philippe Caseiro
* *dbhost*: Définition de l'adresse du serveur de base de données par défaut
48 1 Philippe Caseiro
* *dbport*: Définition du port d'écoute du serveur de base de données par défaut
49 1 Philippe Caseiro
* *dbroot*: Définition du nom de l'utilisateur ayant des droits "Administrateur" sur le serveur de base de données par défaut
50 1 Philippe Caseiro
* *dbrootpwd*: Définition du mot de passe part défaut de l'utilisateur définis par l'option *dbroot*
51 1 Philippe Caseiro
* *dbtype* : Définition du type de base de données par défaut du serveur de base de données (mysql, pgsql, sqlite, ...)
52 3 Philippe Caseiro
* *client_hosts*: Liste des noms d'hôtes ou IP depuis lesquels les utilisateurs pourrons ouvrir des sessions sur le serveur de base de données. 
53 3 Philippe Caseiro
* *dbcliconf* : Définition d'un fichier de paramètrage par défaut (utile pour mysql)
54 3 Philippe Caseiro
55 3 Philippe Caseiro
*Attention :* 
56 3 Philippe Caseiro
57 6 Philippe Caseiro
Les options passées dans le fichier définis dans *dbcliconf* rendent inutiles les options *dbhost*, *dbport*, *dbroot*, *dbrootpwd* et *dbtype*
58 3 Philippe Caseiro
59 7 Philippe Caseiro
L'option *dbrootpwd* ne prend pas un mot de passe en clair, mais un fichier qui contiens le mot de passe. Comme le .reader du LDAP.
60 3 Philippe Caseiro
61 3 Philippe Caseiro
 h3. Les options de configuration possibles pour les fichiers spécifiques aux applications (_/etc/eole/eole-db.d/*.yml_:
62 3 Philippe Caseiro
63 3 Philippe Caseiro
* *dbhost*: définition de l'adresse du serveur de base de données utilisé par l'application (surcharge la valeur par défaut défnie dans *_/etc/eole/eole-db.conf_*)
64 3 Philippe Caseiro
* *dbport*: définition du port d'écoute du serveur de base de données utilisé par l'application (surcharge la valeur par défaut défnie dans *_/etc/eole/eole-db.conf_*)
65 3 Philippe Caseiro
* *dbroot*: Définition du nom de l'utilisateur ayant des droits "Administrateur" sur le serveur de base de données utilisé par l'application (surcharge la valeur par défaut défnie dans *_/etc/eole/eole-db.conf_*)
66 3 Philippe Caseiro
* *dbrootpwd*: Définition du mot de passe part défaut de l'utilisateur définis par l'option *dbroot* (surcharge la valeur par défaut défnie dans *_/etc/eole/eole-db.conf_*)
67 3 Philippe Caseiro
68 3 Philippe Caseiro
* *dbname*: Nom de la base de données de l'application
69 3 Philippe Caseiro
* *dbuser*: Nom de l'utilisateur utilisé par l'application pour accéder à la base définies dans *dbname*
70 3 Philippe Caseiro
* *dbpass*: Mot de passe utilisé par l'application pour l'utilisateur définis dans *dbuser*
71 3 Philippe Caseiro
* *createscript*: Script SQL de création de la base de données définie dans *dbname*
72 3 Philippe Caseiro
* *sqlscripts*: Scripts SQL a lancer après le script de création définis dans *createscript*
73 3 Philippe Caseiro
* *updatescripts*: Scripts de mise à jour lancée sur la base définie dans *dbname* (lancé uniquement si la base existe déjà)
74 3 Philippe Caseiro
* *pwd_files* : Définition des fichiers à mettre à jour après le changement du mot de passe de l'utilisateur définis dans *dbuser*
75 3 Philippe Caseiro
76 3 Philippe Caseiro
Note sur l'option *pwd_files*:
77 3 Philippe Caseiro
78 3 Philippe Caseiro
L'option pwd_files prend une liste de "dictionnaires" au sens python, cette option attend donc quelque chose comme ça :
79 3 Philippe Caseiro
80 3 Philippe Caseiro
<pre>
81 3 Philippe Caseiro
pwd_files:
82 3 Philippe Caseiro
    - {file: '/var/www/html/posh/includes/config.inc.php',
83 3 Philippe Caseiro
       container: 'web',
84 3 Philippe Caseiro
       pattern: 'define("__PASS","',
85 3 Philippe Caseiro
       end_pattern: ');',
86 3 Philippe Caseiro
       owner: 'root:www-data',
87 3 Philippe Caseiro
       mod: '660' }
88 3 Philippe Caseiro
    - {file: '/usr/share/envole/eoledb/posh',
89 3 Philippe Caseiro
       pattern: 'dbpassPOSH="',
90 3 Philippe Caseiro
       owner: 'root:root',
91 3 Philippe Caseiro
       mod: '600' }
92 3 Philippe Caseiro
</pre>
93 3 Philippe Caseiro
94 3 Philippe Caseiro
Voici la liste des options possibles pour les "structures" (dictionnaires au sens python) possibles pour un élément de la liste *pwd_files*:
95 3 Philippe Caseiro
96 3 Philippe Caseiro
* file : Chemin complet du fichier a modifier, *cette option est obligatoire*
97 3 Philippe Caseiro
* pattern : Modèle de ligne qui contiens le mot de passe entre ''. *cette option est obligatoire*
98 3 Philippe Caseiro
* container: Conteneur ou ce trouve le fichier a modifier (valable uniquement en mode conteneur) 
99 3 Philippe Caseiro
* end_pattern: caractères a ajouter après le mot de passe sur la ligne lors de la modification du fichier
100 3 Philippe Caseiro
* owner: Propriétaire, au format "user:group", a définir après la modification du mot de passe
101 3 Philippe Caseiro
* mod: Droits au format unix (ex: 600) a définir après la modification du mot de passe
102 3 Philippe Caseiro
103 3 Philippe Caseiro
Note sur l'option *pattern*:
104 3 Philippe Caseiro
105 3 Philippe Caseiro
L'option pattern permet de définir le modèle de ligne qui contiens le mot de passe, il est important de définir la totalité de ce qui précède le mot de passe dans la ligne.
106 3 Philippe Caseiro
107 3 Philippe Caseiro
Par exemple si la ligne a changer est la suivante : 
108 3 Philippe Caseiro
109 3 Philippe Caseiro
<pre>
110 3 Philippe Caseiro
password: "JeSuiSunMauvaisPassowrd"
111 3 Philippe Caseiro
</pre>
112 3 Philippe Caseiro
113 3 Philippe Caseiro
Il faut définir la valeur suivante pour l'option *pattern*:
114 3 Philippe Caseiro
<pre>
115 3 Philippe Caseiro
pwd_files:
116 3 Philippe Caseiro
   - {file: "/monfichier.conf",
117 3 Philippe Caseiro
      pattern: 'password: "'
118 3 Philippe Caseiro
</pre>
119 3 Philippe Caseiro
Le " est important car lorsqu'il est définis EoleDB détermine automatiquement qu'il faut qu'il ferme les " après 
120 3 Philippe Caseiro
la mise en place du nouveau mot de passe.
121 3 Philippe Caseiro
122 3 Philippe Caseiro
Si le pattern de votre mot de passe doit être entre des ' il faut préférer le format suivant : 
123 3 Philippe Caseiro
<pre>
124 3 Philippe Caseiro
pattern: "password: '"
125 3 Philippe Caseiro
</pre>
126 3 Philippe Caseiro
127 3 Philippe Caseiro
EoleDB gère également la fermeture des '
128 3 Philippe Caseiro
129 3 Philippe Caseiro
EoleDB détecte également les ";" en fin de ligne ce qui fait que si votre ligne de mot de passe ce termine par un ";" , il ajouteras automatiquement le ";" final. Si vous avez des problèmes avec la terminaison automatique de la ligne avec le ";" ou que votre ligne ce termine par autre chose que ";" vous pouvez utiliser l'option *end_pattern*.
130 3 Philippe Caseiro
131 3 Philippe Caseiro
Note sur l'option *end_pattern*:
132 3 Philippe Caseiro
133 3 Philippe Caseiro
Cette option permet de définir les caractères a ajouter a la fin de la ligne juste après le nouveau mot de passe.
134 3 Philippe Caseiro
135 3 Philippe Caseiro
Par exemple si votre ligne de mot de passe à le format suivant : 
136 3 Philippe Caseiro
<pre>
137 3 Philippe Caseiro
define('DBPASS': 'JeSuisUnMauvaisPassword');
138 3 Philippe Caseiro
</pre>
139 3 Philippe Caseiro
140 3 Philippe Caseiro
Sans l'option *end_pattern* EoleDB vas produire la ligne suivante:
141 3 Philippe Caseiro
142 3 Philippe Caseiro
<pre>
143 3 Philippe Caseiro
define('DBPASS': 'Sv;434up<'
144 3 Philippe Caseiro
</pre>
145 3 Philippe Caseiro
146 3 Philippe Caseiro
Pour que votre ligne soit correctement fermée il faut défnir *end_pattern* de la manière suivante:
147 1 Philippe Caseiro
148 3 Philippe Caseiro
<pre>
149 3 Philippe Caseiro
   end_pattern: ");",
150 4 Philippe Caseiro
</pre>
151 3 Philippe Caseiro
152 3 Philippe Caseiro
Il faut noter que le *end_pattern * ne contiens pas le ' fermant car EoleDB gère automatiquement la fermeture des " il est donc inutil de le préciser. Avec cette définition la ligne produite par EoleDB sera:
153 3 Philippe Caseiro
154 3 Philippe Caseiro
<pre>
155 3 Philippe Caseiro
define('DBPASS': 'Sv;434up<');
156 3 Philippe Caseiro
</pre>
157 8 Philippe Caseiro
158 8 Philippe Caseiro
159 8 Philippe Caseiro
Voici un exemple tiré du projet eole-posh après migration a EoleDB : 
160 8 Philippe Caseiro
161 13 Philippe Caseiro
<pre>
162 13 Philippe Caseiro
dbtype: mysql
163 8 Philippe Caseiro
dbname: posh
164 8 Philippe Caseiro
dbuser: posh
165 8 Philippe Caseiro
dbpass: "MOTDEPASSE"
166 8 Philippe Caseiro
createscript: "/usr/share/eole/mysql/posh/gen/posh-create-1.sql"
167 8 Philippe Caseiro
sqlscripts: ["/usr/share/eole/mysql/posh/updates/posh-update-1.sql"]
168 8 Philippe Caseiro
pwd_files:
169 8 Philippe Caseiro
    - {file: '/var/www/html/posh/includes/config.inc.php',
170 8 Philippe Caseiro
       container: 'web',
171 8 Philippe Caseiro
       pattern: 'define("__PASS","',
172 8 Philippe Caseiro
       end_pattern: ');',
173 8 Philippe Caseiro
       owner: 'root:www-data',
174 8 Philippe Caseiro
       mod: '660' }
175 8 Philippe Caseiro
    - {file: '/usr/share/envole/eoledb/posh',
176 8 Philippe Caseiro
       pattern: 'dbpassPOSH="',
177 8 Philippe Caseiro
       owner: 'root:root',
178 8 Philippe Caseiro
       mod: '600' }
179 8 Philippe Caseiro
    - {file: '/usr/share/eole/postservice/10-posh',
180 8 Philippe Caseiro
       pattern: 'POSHPASS=',
181 8 Philippe Caseiro
       owner: 'root:root',
182 8 Philippe Caseiro
       mod: '700' }
183 8 Philippe Caseiro
    - {file: '/var/www/html/sap/config/mysql.inc.php',
184 8 Philippe Caseiro
       container: 'web',
185 8 Philippe Caseiro
       pattern: '$dbpwd="',
186 8 Philippe Caseiro
       end_pattern: ';',
187 8 Philippe Caseiro
       owner: 'root:www-data',
188 8 Philippe Caseiro
       mod: '660' }
189 8 Philippe Caseiro
190 1 Philippe Caseiro
191 1 Philippe Caseiro
</pre>
192 10 Philippe Caseiro
193 10 Philippe Caseiro
194 10 Philippe Caseiro
h2. Migrer une application vers EoleDB.
195 10 Philippe Caseiro
196 1 Philippe Caseiro
Pour migrer une application vers EoleDB le principe est plutôt simple, même si le faire n'est pas si simple.
197 13 Philippe Caseiro
198 1 Philippe Caseiro
En bref si votre application répond au standard _eole-skeletor_ il suffit de remplacer les fichiers de configuration
199 10 Philippe Caseiro
du répertoire *sql* de votre dépôt par un seul et unique fichier de configuration au format yaml avec les options
200 13 Philippe Caseiro
à disposition dans EoleDB.
201 10 Philippe Caseiro
202 10 Philippe Caseiro
Oui sur le papier c'est simple, et cela peut être très très simple pour reproduire ce que vous avez aujourd'hui
203 10 Philippe Caseiro
dans vos dépôts il suffit de transcrire les fichiers suivants dans un seul et unique yaml :
204 10 Philippe Caseiro
* conf/updates/config.py
205 10 Philippe Caseiro
* conf/gen/mon_apply.py
206 10 Philippe Caseiro
* conf/passwords/mon_apply.ini
207 10 Philippe Caseiro
208 10 Philippe Caseiro
Par exemple pour l'application taskfreak, voici le yaml qu'il faut mettre dans _/etc/eole/eole-db.d/_ pour rempalcer tous les anciens fichiers de configuration (valable pour un scribe):
209 10 Philippe Caseiro
210 10 Philippe Caseiro
<pre>
211 10 Philippe Caseiro
dbtype: mysql
212 10 Philippe Caseiro
dbname: taskfreak
213 10 Philippe Caseiro
dbuser: taskfreak
214 10 Philippe Caseiro
dbpass: "Un mot de passe !!"
215 10 Philippe Caseiro
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql"
216 10 Philippe Caseiro
pwd_files:
217 10 Philippe Caseiro
    - {file: '/var/www/html/taskfreak/include/config.php',
218 10 Philippe Caseiro
       pattern: '$dbpass="',
219 10 Philippe Caseiro
       owner: 'www-data:www-data',
220 10 Philippe Caseiro
       mod: '600'}
221 10 Philippe Caseiro
</pre>
222 10 Philippe Caseiro
223 10 Philippe Caseiro
Pas une ligne de python un seul fichier.
224 10 Philippe Caseiro
225 10 Philippe Caseiro
La ou l'affaire deviens complexe c'est lorsqu'on a envie que notre application bénéficie de toutes les possibilités de EoleDB et surtout de la base de données externalisée.
226 10 Philippe Caseiro
227 10 Philippe Caseiro
Dans le cas de l'exemple il suffit de fournir un template simple pour générer cette configuration, voir même de la fournir en dur en l'étât. 
228 10 Philippe Caseiro
229 10 Philippe Caseiro
Pour comprendre pourquoi supporter les divers modes de base de données offerts par EoleDB est complexe il faut comprendre quels sont les dits modes.
230 10 Philippe Caseiro
231 10 Philippe Caseiro
h3. Possibilités offertes par EoleDB aux applications.
232 10 Philippe Caseiro
233 10 Philippe Caseiro
h4. Le mode "default" !
234 10 Philippe Caseiro
235 10 Philippe Caseiro
La première et la plus simple est le mode "défault" ce mode consiste a dire, je fait confiance a la configuration globale de EoleDB et mon application est très heureuse avec ça.
236 10 Philippe Caseiro
237 10 Philippe Caseiro
Ce qui ce traduit par l'exemple de taskfreak dans la partie précédente. Dans cette configuration : 
238 10 Philippe Caseiro
239 10 Philippe Caseiro
<pre>
240 10 Philippe Caseiro
dbtype: mysql
241 10 Philippe Caseiro
dbname: taskfreak
242 10 Philippe Caseiro
dbuser: taskfreak
243 10 Philippe Caseiro
dbpass: "Un mot de passe !!"
244 10 Philippe Caseiro
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql"
245 10 Philippe Caseiro
pwd_files:
246 10 Philippe Caseiro
    - {file: '/var/www/html/taskfreak/include/config.php',
247 10 Philippe Caseiro
       pattern: '$dbpass="',
248 10 Philippe Caseiro
       owner: 'www-data:www-data',
249 10 Philippe Caseiro
       mod: '600'}
250 10 Philippe Caseiro
</pre>
251 10 Philippe Caseiro
252 10 Philippe Caseiro
L'application ne prend aucune liberté avec la configuration de EoleDB et ce repose exclusivement sur ce qui est définis par défaut dans /etc/eole/eole-db.conf.
253 10 Philippe Caseiro
254 10 Philippe Caseiro
h4. Le mode "local" !
255 10 Philippe Caseiro
Le second mode est le mode dit "local" dans ce mode l'application a envie de forcer l'utilisation d'un serveur local, pour ce faire on vas devoir générer la configuration suivante : 
256 10 Philippe Caseiro
257 10 Philippe Caseiro
<pre>
258 10 Philippe Caseiro
---
259 10 Philippe Caseiro
dbhost: 127.0.0.1
260 10 Philippe Caseiro
dbtype: mysql
261 10 Philippe Caseiro
dbname: taskfreak
262 10 Philippe Caseiro
dbuser: taskfreak
263 10 Philippe Caseiro
dbpass: "task;Freak"
264 10 Philippe Caseiro
client_hosts: ["127.0.0.1", "localhost"]
265 10 Philippe Caseiro
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql"
266 10 Philippe Caseiro
pwd_files:
267 10 Philippe Caseiro
    - {file: '/var/www/html/taskfreak/include/config.php',
268 10 Philippe Caseiro
       pattern: '$dbpass="',
269 10 Philippe Caseiro
       owner: 'www-data:www-data',
270 10 Philippe Caseiro
       mod: '600' }
271 10 Philippe Caseiro
</pre>
272 10 Philippe Caseiro
273 10 Philippe Caseiro
On vois déjà les différences entre les deux modes. Vous remarquerez que nous ne définissons pas de *dbroot* ni de *dbrootpwd*, c'est pour une raison simple, Sur un serveur Eole, EoleDB vas utiliser le fichier de configuration par défaut fournis par ubuntu pour ce connecter a la base de données et effectué les opérations, donc ces options ne sont pas nécessaires, cependant vous pouvez les définir si EoleDB ne fonctionne pas sur un serveur Eole.
274 10 Philippe Caseiro
275 10 Philippe Caseiro
Ici l'application dit a EoleDB d'ignorer la configuration définie dans le fichier de configuration _/etc/eole/eole-db.conf_ pour utiliser le serveur local, donc si vous avez définis un serveur externe dans la configuration par défaut la base seras créer sur le serveur local.
276 10 Philippe Caseiro
277 10 Philippe Caseiro
Nous avons donc deux cas qui demandent des configurations différentes et il reste un troisième mode, pour que l'application puisse définir son propre serveur de base de données externe et une fois de plus dire a EoleDB de ne pas appliquer la configuration par défaut.
278 10 Philippe Caseiro
279 10 Philippe Caseiro
h4. Le mode "externe"!
280 10 Philippe Caseiro
281 10 Philippe Caseiro
Dans ce mode l'application définie complètement un serveur externe de base de données. Voici a quoi la configuration pour ce mode pour l'application taskfreak :
282 10 Philippe Caseiro
283 10 Philippe Caseiro
<pre>
284 10 Philippe Caseiro
---
285 10 Philippe Caseiro
dbhost: 192.168.45.34
286 10 Philippe Caseiro
dbport: 3309
287 10 Philippe Caseiro
dbroot: adminDB
288 10 Philippe Caseiro
dbrootpwd: /root/.secrets-mydb
289 10 Philippe Caseiro
dbtype: mysql
290 10 Philippe Caseiro
dbname: taskfreak
291 10 Philippe Caseiro
dbuser: taskfreak
292 10 Philippe Caseiro
dbpass: "task;Freak"
293 10 Philippe Caseiro
client_hosts: ["127.0.0.1", "localhost", "192.168.0.14" ]
294 10 Philippe Caseiro
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql"
295 10 Philippe Caseiro
pwd_files:
296 10 Philippe Caseiro
    - {file: '/var/www/html/taskfreak/include/config.php',
297 10 Philippe Caseiro
       pattern: '$dbpass="',
298 10 Philippe Caseiro
       owner: 'www-data:www-data',
299 10 Philippe Caseiro
       mod: '600' }
300 10 Philippe Caseiro
</pre>
301 10 Philippe Caseiro
302 10 Philippe Caseiro
Ici on définis des nouvelles valeurs pour *dbhost*, *dbport*, *dbroot*, *dbrootpwd*, on ajoute également l'adresse IP de la carte réseaux qui communique avec le serveur de base de données dans la liste *client_hosts*, attention si on n'ajoute pas cette adresse IP la connexion avec l'utilisateur définis dans *dbname* ne sera pas fonctionnelle.
303 10 Philippe Caseiro
304 10 Philippe Caseiro
Nous avons donc trois possibilités de configuration pour EoleDB et si nous voulons offrir les trois possibilités aux utilisateurs, il n'y a qu'une seule solution créer un template pour le fichier de configuration au foramt yaml de notre application.
305 10 Philippe Caseiro
306 10 Philippe Caseiro
Il existe d'autres possibilités qui ne sont pas développées ici, par exemple permettre la création de plusieurs bases de données une une seule application, mais ces usages relèves plus de nos délires de développeurs Eole/Envole que de la réalité du besoin. Nous nous sommes concentrés sur les 3 cas qui nous semblais être les plus utiles aux utilisateurs.
307 10 Philippe Caseiro
308 10 Philippe Caseiro
Avant d'entrer dans le vif du sujet il faut malgré tout parlé d'un "quatrième" cas, le mode conteneur et oui si on souhaite que notre application soit fonctionnelle sur un module comme AmonÉcole lorsque l'utilisateur selection le mode "local" il faut adapater la configuration.
309 10 Philippe Caseiro
310 10 Philippe Caseiro
Donc pour créer ce nouveau template nous allons avoir besoin de créer de nouvelles variables.
311 10 Philippe Caseiro
312 10 Philippe Caseiro
h3. Mise à jour du dictionnaire pour le support des 3 modes
313 10 Philippe Caseiro
314 10 Philippe Caseiro
Afin de simplifier les choses pour l'utilisateur, nous avons pris le partis de mettre toutes les variables dans une 
315 10 Philippe Caseiro
nouvelle famille (donc nouvel onglet dans gen_connfig) en mode expert.
316 10 Philippe Caseiro
317 10 Philippe Caseiro
<pre>
318 10 Philippe Caseiro
<family name='taskfreak' mode='expert'>
319 10 Philippe Caseiro
</family>
320 10 Philippe Caseiro
</pre>
321 10 Philippe Caseiro
322 10 Philippe Caseiro
La première variable de cette famille vas servir a permettre à l'utilisateur de faire le choix du mode.
323 10 Philippe Caseiro
Voici la dite variable pour taskfreak:
324 10 Philippe Caseiro
325 10 Philippe Caseiro
<pre>
326 10 Philippe Caseiro
<variable name='tf_db_mode' type='string' description='Serveur de bases de données à utiliser'/>
327 10 Philippe Caseiro
</pre>
328 10 Philippe Caseiro
329 10 Philippe Caseiro
Cetta variable est une simple liste des trois modes, il faut donc lui ajouter une contrainte : 
330 10 Philippe Caseiro
331 10 Philippe Caseiro
<pre>
332 10 Philippe Caseiro
<check name='valid_enum' target='tf_db_mode'>
333 10 Philippe Caseiro
    <param>['default', 'externe', 'local']</param>
334 10 Philippe Caseiro
</check>
335 10 Philippe Caseiro
</pre>
336 10 Philippe Caseiro
337 10 Philippe Caseiro
Ensuite il nous faut une variable pour stocker l'adresse du serveur de base de données en mode "externe":
338 10 Philippe Caseiro
339 10 Philippe Caseiro
<pre>
340 10 Philippe Caseiro
<variable type='string' name='tf_dbserver' description='Adresse du serveur de base de données'/>
341 10 Philippe Caseiro
</pre>
342 10 Philippe Caseiro
343 10 Philippe Caseiro
Puis une variable pour le port d'écoute du serveur en mode "externe" : 
344 10 Philippe Caseiro
345 10 Philippe Caseiro
<pre>
346 10 Philippe Caseiro
<variable type='number' name='tf_dbport' description="Port d'écoute du serveur de base de données"/>
347 10 Philippe Caseiro
</pre>
348 10 Philippe Caseiro
349 10 Philippe Caseiro
Une variable pour le nom de l'utilisateur ayant des droits administrateur sur le serveur de base de données en mode externe: 
350 10 Philippe Caseiro
<pre>
351 10 Philippe Caseiro
<variable type='string' name='tf_dbuser' description='Utilisateur du serveur de base de données'/>
352 10 Philippe Caseiro
</pre>
353 10 Philippe Caseiro
354 10 Philippe Caseiro
Une variable pour permettre spécifier le fichier de mot de passe pour l'utilisateur définis précédement :
355 10 Philippe Caseiro
<pre>
356 10 Philippe Caseiro
<variable type='string' name='tf_dbpass' description='Fichier de mot de passe du serveur'/>
357 10 Philippe Caseiro
</pre>
358 10 Philippe Caseiro
359 10 Philippe Caseiro
Enfin il nous faut une variable pour permettre de saisir les adresse IP qui peuvent ouvrir des sessions sur le serveur distant:
360 10 Philippe Caseiro
361 10 Philippe Caseiro
<pre>
362 10 Philippe Caseiro
<variable type='string' name='tf_allow_hosts' description="Hôtes authorisés à utiliser la base de données" multi='true'/>
363 10 Philippe Caseiro
</pre>
364 10 Philippe Caseiro
365 10 Philippe Caseiro
Cette dernière est une liste et donc avec l'option "multi=true"
366 10 Philippe Caseiro
<pre>
367 11 Philippe Caseiro
368 11 Philippe Caseiro
Il est évident qu'il faut des contraintes pour régler l'affichage ou non des options dans gen_config, en effet si l'utilisateur fait le choix
369 11 Philippe Caseiro
"local" aucun besoin d'afficher toutes les variables dans l'interface : 
370 11 Philippe Caseiro
371 11 Philippe Caseiro
Voici les conditions pour taskfreak :
372 11 Philippe Caseiro
373 11 Philippe Caseiro
Donc pour taskfreak voici la première containte : "Pas de EoleDB, pas de taskfreak !"
374 11 Philippe Caseiro
<pre>
375 11 Philippe Caseiro
 <constraints>
376 11 Philippe Caseiro
     <condition name='disabled_if_in' source='activer_eoledb'>
377 11 Philippe Caseiro
         <param>non</param>
378 11 Philippe Caseiro
         <target type='variable'>activer_taskfreak</target>
379 11 Philippe Caseiro
     </condition>
380 11 Philippe Caseiro
</pre>
381 11 Philippe Caseiro
382 11 Philippe Caseiro
La traditionnelle "activer_monapply":
383 11 Philippe Caseiro
</pre>
384 11 Philippe Caseiro
     <condition name='hidden_if_in' source='activer_taskfreak'>
385 11 Philippe Caseiro
         <param>non</param>
386 11 Philippe Caseiro
         <target type='filelist'>taskfreak</target>
387 11 Philippe Caseiro
         <target type='servicelist'>taskfreak</target>
388 11 Philippe Caseiro
     </condition>
389 11 Philippe Caseiro
390 11 Philippe Caseiro
</pre>
391 11 Philippe Caseiro
392 11 Philippe Caseiro
Le valid_enum déjà évoqué plus haut pour la liste des choix possible, un rappel ne fait jamais de mal
393 11 Philippe Caseiro
<pre>
394 11 Philippe Caseiro
     <check name='valid_enum' target='tf_db_mode'>
395 11 Philippe Caseiro
         <param>['default', 'externe', 'local']</param>
396 11 Philippe Caseiro
     </check>
397 11 Philippe Caseiro
398 11 Philippe Caseiro
</pre>
399 11 Philippe Caseiro
400 11 Philippe Caseiro
401 11 Philippe Caseiro
Voila la partie affichage des dites nouvelles variables, donc ici nous allons cacher les variables :
402 11 Philippe Caseiro
* tf_dbserver,
403 11 Philippe Caseiro
* tf_dbuser,
404 11 Philippe Caseiro
* tf_dbport,
405 11 Philippe Caseiro
* tf_dbpass,
406 11 Philippe Caseiro
407 11 Philippe Caseiro
si le mode choisis par l'utilisateur est "local".
408 11 Philippe Caseiro
409 11 Philippe Caseiro
<pre>
410 11 Philippe Caseiro
     <condition name='disabled_if_in' source='tf_db_mode'>
411 11 Philippe Caseiro
         <param>local</param>
412 11 Philippe Caseiro
         <target type='variable'>tf_dbserver</target>
413 11 Philippe Caseiro
         <target type='variable'>tf_dbuser</target>
414 11 Philippe Caseiro
         <target type='variable'>tf_dbport</target>
415 11 Philippe Caseiro
         <target type='variable'>tf_dbpass</target>
416 11 Philippe Caseiro
     </condition>
417 11 Philippe Caseiro
</pre>
418 11 Philippe Caseiro
419 12 Philippe Caseiro
Même opération si le mode est "default" sauf qu'on cache en plus la liste des hôtes a autorisé qui doit être définie globalement dans ce cas.
420 11 Philippe Caseiro
421 11 Philippe Caseiro
<pre>
422 11 Philippe Caseiro
     <condition name='disabled_if_in' source='tf_db_mode'>
423 11 Philippe Caseiro
         <param>default</param>
424 11 Philippe Caseiro
         <target type='variable'>tf_dbserver</target>
425 11 Philippe Caseiro
         <target type='variable'>tf_dbuser</target>
426 11 Philippe Caseiro
         <target type='variable'>tf_dbport</target>
427 1 Philippe Caseiro
         <target type='variable'>tf_dbpass</target>
428 12 Philippe Caseiro
         <target type='variable'>tf_allow_hosts</target>
429 11 Philippe Caseiro
     </condition>
430 11 Philippe Caseiro
 </constraints>
431 11 Philippe Caseiro
</pre>
432 11 Philippe Caseiro
433 11 Philippe Caseiro
Voila notre dictionnaire est à jour, nous allons pouvoir passer au tempalte de la configuration EoleDB.
434 11 Philippe Caseiro
435 11 Philippe Caseiro
h3. Création du template pour le support des 3 modes et du mode bonus (support des conteneurs).
436 11 Philippe Caseiro
437 11 Philippe Caseiro
Attention n'oubliez pas de déclarer votre nouveau template dans le dictionnaire.
438 11 Philippe Caseiro
439 11 Philippe Caseiro
Ne perdons pas plus de temps et allons dans le code du tempalte.
440 11 Philippe Caseiro
441 11 Philippe Caseiro
Nous allons avoir besoin de connaitre le mode choisis par l'utilisateur plusieurs fois dans le template
442 11 Philippe Caseiro
commençons donc par déclarer une variable de template nommée "dmode"
443 11 Philippe Caseiro
<pre>
444 11 Philippe Caseiro
%set dmode = %%getVar('tf_db_mode','non')
445 11 Philippe Caseiro
</pre>
446 11 Philippe Caseiro
447 11 Philippe Caseiro
Vérifions d'abord si le mode est "externe", si c'est le cas nous allons utiliser les nouvelles variables 
448 11 Philippe Caseiro
pour définir les configurations pour dbhost, dbroot, dbrootpwd ... Si le mode est "local" nous forçons simplement
449 11 Philippe Caseiro
la valeur de dbhost à 127.0.0.1. Pour  le mode "default" il n'y a rien à faire.
450 11 Philippe Caseiro
451 11 Philippe Caseiro
</pre>
452 11 Philippe Caseiro
%if %%dmode == "externe"
453 11 Philippe Caseiro
dbhost: %%tf_dbserver
454 11 Philippe Caseiro
dbport: %%tf_dbport
455 11 Philippe Caseiro
dbroot: %%tf_dbuser
456 11 Philippe Caseiro
dbrootpwd: %%tf_dbpass
457 11 Philippe Caseiro
%else if %%dmode == "local"
458 11 Philippe Caseiro
dbhost: 127.0.0.1
459 11 Philippe Caseiro
%end if
460 11 Philippe Caseiro
</pre>
461 11 Philippe Caseiro
462 11 Philippe Caseiro
Cette partie du tempalte est commune a tous les modes :
463 11 Philippe Caseiro
464 11 Philippe Caseiro
<pre>
465 11 Philippe Caseiro
dbtype: mysql
466 11 Philippe Caseiro
dbname: taskfreak
467 11 Philippe Caseiro
dbuser: taskfreak
468 11 Philippe Caseiro
dbpass: "task;Freak"
469 1 Philippe Caseiro
</pre>
470 11 Philippe Caseiro
471 12 Philippe Caseiro
Il nous faut maintenant résoudre les problèmes d'autorisations à joindre la base. On ne vas pas demander a l'utilisateur de saisir 127.0.0.1 lorsqu'il prend le mode local alors
472 1 Philippe Caseiro
que nous savons bien que cette valeur est obligatoire.
473 11 Philippe Caseiro
474 12 Philippe Caseiro
Avant tout on récupère la liste saisie par l'utilisateur pour la stocker dans une variable de template :
475 1 Philippe Caseiro
476 12 Philippe Caseiro
<pre>
477 12 Philippe Caseiro
%set allow_hosts = %%getVar('tf_allow_hosts', '')
478 1 Philippe Caseiro
</pre>
479 12 Philippe Caseiro
480 12 Philippe Caseiro
Ensuite on vérifie si le mode est local, si c'est le cas on ajoute le début de la ligne "client_hots" : 
481 12 Philippe Caseiro
482 12 Philippe Caseiro
<pre>
483 1 Philippe Caseiro
%if %%dmode == "local"
484 12 Philippe Caseiro
client_hosts: ["127.0.0.1", "localhost" %slurp
485 12 Philippe Caseiro
</pre>
486 12 Philippe Caseiro
487 12 Philippe Caseiro
Si ce n'est pas le cas et que le mode est "externe" on ajoute le début de la ligne client_host pour le cas du mode "externe" : 
488 12 Philippe Caseiro
489 12 Philippe Caseiro
<pre>
490 1 Philippe Caseiro
%else if %%dmode == "externe"
491 12 Philippe Caseiro
client_hosts: ["%%adresse_ip_eth0" %slurp
492 12 Philippe Caseiro
%end if
493 12 Philippe Caseiro
</pre>
494 12 Philippe Caseiro
495 12 Philippe Caseiro
Maintenant que nous avons le bon début de ligne il nous faut la bonne fin, On vérifie que le mode choisi par l'utilisateur n'est pas "défault" dans ce cas la il n'y a pas de début de ligne donc pas besoin de fin de ligne. Si le mode est local ou externe et que l'utilisateur n'a pas remplis la liste des autorisations on ferme la configuration avec le "]" sinon on  ajoute tous les éléments de la liste à la configuration et on ferme avec le "]".
496 12 Philippe Caseiro
497 12 Philippe Caseiro
<pre>
498 12 Philippe Caseiro
%if %%dmode != "default"
499 12 Philippe Caseiro
    %if %%is_empty(%%allow_hosts)
500 11 Philippe Caseiro
]
501 11 Philippe Caseiro
    %else
502 12 Philippe Caseiro
        %for %%hst in %%allow_hosts
503 12 Philippe Caseiro
,"%%hst" %slurp
504 12 Philippe Caseiro
        %end for
505 12 Philippe Caseiro
]
506 1 Philippe Caseiro
    %end if
507 1 Philippe Caseiro
%end if
508 1 Philippe Caseiro
</pre>
509 1 Philippe Caseiro
510 1 Philippe Caseiro
Cette partie est également commune a tous les modes
511 11 Philippe Caseiro
512 11 Philippe Caseiro
<pre>
513 11 Philippe Caseiro
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql"
514 11 Philippe Caseiro
</pre>
515 11 Philippe Caseiro
516 12 Philippe Caseiro
Nous y sommes presque, il ne nous reste plus qu'a définir les fichiers de configuration ou le mot de passe doit être mis à jour.
517 12 Philippe Caseiro
Le mode bonus fait son entrée, en effet les fichiers de configuration des applications sont bien souvent dans un conteneur
518 12 Philippe Caseiro
la plus part du temps dans le conteneur web. Il faut donc prendre en compte ce petit détail.
519 11 Philippe Caseiro
520 12 Philippe Caseiro
Ici on vérifie que le serveur est en mode conteneur avec la variable mode_conteneur_actif, si le serveur n'est pas en mode 
521 12 Philippe Caseiro
conteneur on indique le chemin complet du fichier à modifier, sinon il faut utiliser la variable "container_path_NOMGROUPECONTENEUR" (ici container_path_reseau) 
522 12 Philippe Caseiro
pour connaître l'emplacement de la racine du conteneur, chaque groupe de conteneur dispose d'une variable "container_path_NOMGROUPECONTENEUR", il faut juste savoir
523 12 Philippe Caseiro
que le conteneur web est dans le groupe réseau et le tour est joué pour taskfreak.
524 12 Philippe Caseiro
525 1 Philippe Caseiro
<pre>
526 1 Philippe Caseiro
pwd_files:
527 1 Philippe Caseiro
%if %%getVar('mode_conteneur_actif','non') == 'non'
528 1 Philippe Caseiro
    - {file: '/var/www/html/taskfreak/include/config.php',
529 1 Philippe Caseiro
%else
530 1 Philippe Caseiro
    - {file: '%%container_path_reseau/var/www/html/taskfreak/include/config.php',
531 1 Philippe Caseiro
%end if
532 1 Philippe Caseiro
       pattern: '$dbpass="',
533 1 Philippe Caseiro
       owner: 'www-data:www-data',
534 1 Philippe Caseiro
       mod: '600' }
535 12 Philippe Caseiro
</pre>
536 12 Philippe Caseiro
537 12 Philippe Caseiro
Cette variante est également possible : 
538 12 Philippe Caseiro
539 12 Philippe Caseiro
<pre>
540 12 Philippe Caseiro
pwd_files:
541 12 Philippe Caseiro
    - {file: '%%container_path_reseau/var/www/html/taskfreak/include/config.php',
542 12 Philippe Caseiro
       pattern: '$dbpass="',
543 12 Philippe Caseiro
       owner: 'www-data:www-data',
544 12 Philippe Caseiro
       mod: '600' }
545 12 Philippe Caseiro
</pre>
546 12 Philippe Caseiro
<pre>
547 12 Philippe Caseiro
548 12 Philippe Caseiro
La variable container_path_reseau existe toujours et si le serveur n'est pas en mode conteneur elle est simplement vide.
549 12 Philippe Caseiro
550 12 Philippe Caseiro
Voila pour le template de configuration de EoleDB. Maintenant il faut que l'application utilisent les configurations de base de données dans ça propre configuration.
551 12 Philippe Caseiro
552 12 Philippe Caseiro
On continue avec l'exemple de taskfreak :
553 12 Philippe Caseiro
554 12 Philippe Caseiro
h3. Évolution du template de configuration de l'application pour le support des 3 modes et du mode bonus.
555 12 Philippe Caseiro
556 12 Philippe Caseiro
On commence par récupérer et stocker dans une variable de template le contenues de la variable "tf_db_mode".
557 12 Philippe Caseiro
<pre>
558 12 Philippe Caseiro
%set db_mode = %%getVar("tf_db_mode", 'non')
559 12 Philippe Caseiro
</pre>
560 12 Philippe Caseiro
561 12 Philippe Caseiro
On commence par le mode "externe", on récupère la valeur que l'utilisateur a définis en mode "externe" pour la 
562 12 Philippe Caseiro
configuration de l'application. On traite également la définition du port d'écoute, ici on ajoute une valeur 
563 12 Philippe Caseiro
que si l'utilisateur en définis une, je suppose que taskfreak a le port mysql en dur quelque part vus que l'option
564 12 Philippe Caseiro
n'est pas obligatoire.
565 12 Philippe Caseiro
566 12 Philippe Caseiro
<pre>
567 12 Philippe Caseiro
%if %%db_mode == "externe"
568 12 Philippe Caseiro
define('TZN_DB_HOST','%%tf_dbserver');
569 12 Philippe Caseiro
    %if %%getVar('tf_dbport', 'non') != "non"
570 12 Philippe Caseiro
define('TZN_DB_PORT', '%%tf_dbport');
571 12 Philippe Caseiro
    %end if
572 12 Philippe Caseiro
</pre>
573 12 Philippe Caseiro
574 12 Philippe Caseiro
Ensuite on traite le mode "default" qui est le mode le plus compliqué ici.
575 12 Philippe Caseiro
Donc si l'utilisateur a choisi "default" on récupère la valeur de la variable 
576 12 Philippe Caseiro
edb_host, définie dans le dictionnaire de l'Eolisation de EoleDB. Cette variable
577 12 Philippe Caseiro
contiens dans certains cas l'adresse du serveur définis.
578 12 Philippe Caseiro
579 12 Philippe Caseiro
<pre>
580 1 Philippe Caseiro
%else if %%db_mode == "default"
581 12 Philippe Caseiro
   %set dbhost = %%getVar('edb_host', 'non')
582 12 Philippe Caseiro
</pre>
583 12 Philippe Caseiro
584 13 Philippe Caseiro
Il est possible que la variable ne soit pas définie, c'est le cas si EoleDB est configuré pour utiliser le serveur local.
585 13 Philippe Caseiro
Donc si la variable "edb_host" n'est pas définie et que le mode conteneur est actif on utilise la variable adresse_ip_mysql
586 13 Philippe Caseiro
Dans le cas contraire on vérifie si edb_host est définis, si oui on l'utilise sinon on utilise "localhost".
587 12 Philippe Caseiro
588 12 Philippe Caseiro
<pre>
589 12 Philippe Caseiro
   %if %%dbhost == 'non' and %%mode_conteneur_actif == 'oui':
590 12 Philippe Caseiro
define('TZN_DB_HOST', '%%adresse_ip_mysql')
591 12 Philippe Caseiro
   %else
592 12 Philippe Caseiro
       %if %%dbhost == 'non'
593 12 Philippe Caseiro
define('TZN_DB_HOST', 'localhost');
594 12 Philippe Caseiro
       %else
595 12 Philippe Caseiro
define('TZN_DB_HOST', '%%edb_host');
596 12 Philippe Caseiro
       %end if
597 12 Philippe Caseiro
   %end if
598 12 Philippe Caseiro
   %if %%getVar('edb_dbport', 'non') != "non"
599 12 Philippe Caseiro
define('TZN_DB_PORT', '%%edb_port');
600 12 Philippe Caseiro
    %end if
601 12 Philippe Caseiro
</pre>
602 12 Philippe Caseiro
603 12 Philippe Caseiro
Sinon en mode local on utilise simplement la variable adresse_ip_mysql qui est toujours définie.
604 12 Philippe Caseiro
605 12 Philippe Caseiro
<pre>
606 12 Philippe Caseiro
%else
607 12 Philippe Caseiro
define('TZN_DB_HOST','%%adresse_ip_mysql');
608 12 Philippe Caseiro
%end if
609 1 Philippe Caseiro
</pre>