Projet

Général

Profil

EnvoleEoleDB » Historique » Version 16

Gérald Schwartzmann, 25/03/2016 15:21

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 15 Gérald Schwartzmann
# Supporter nativement l'externalisation des bases 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 16 Gérald Schwartzmann
*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 16 Gérald Schwartzmann
* -d, --dbdir: Définir un répertoire qui contient 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
h2. Configurer EoleDB
42 10 Philippe Caseiro
43 3 Philippe Caseiro
h3. Les options de configuration possibles pour _/etc/eole/eole-db.conf_:
44 3 Philippe Caseiro
45 2 Philippe Caseiro
* *dbcont*: Définition du conteneur par défaut de la base de données en mode conteneur
46 2 Philippe Caseiro
* *dbhost*: Définition de l'adresse du serveur de base de données par défaut
47 1 Philippe Caseiro
* *dbport*: Définition du port d'écoute du serveur de base de données par défaut
48 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
49 1 Philippe Caseiro
* *dbrootpwd*: Définition du mot de passe part défaut de l'utilisateur définis par l'option *dbroot*
50 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, ...)
51 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. 
52 3 Philippe Caseiro
* *dbcliconf* : Définition d'un fichier de paramètrage par défaut (utile pour mysql)
53 3 Philippe Caseiro
54 3 Philippe Caseiro
*Attention :* 
55 3 Philippe Caseiro
56 6 Philippe Caseiro
Les options passées dans le fichier définis dans *dbcliconf* rendent inutiles les options *dbhost*, *dbport*, *dbroot*, *dbrootpwd* et *dbtype*
57 3 Philippe Caseiro
58 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.
59 3 Philippe Caseiro
60 3 Philippe Caseiro
 h3. Les options de configuration possibles pour les fichiers spécifiques aux applications (_/etc/eole/eole-db.d/*.yml_:
61 3 Philippe Caseiro
62 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_*)
63 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_*)
64 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_*)
65 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_*)
66 3 Philippe Caseiro
67 3 Philippe Caseiro
* *dbname*: Nom de la base de données de l'application
68 3 Philippe Caseiro
* *dbuser*: Nom de l'utilisateur utilisé par l'application pour accéder à la base définies dans *dbname*
69 3 Philippe Caseiro
* *dbpass*: Mot de passe utilisé par l'application pour l'utilisateur définis dans *dbuser*
70 3 Philippe Caseiro
* *createscript*: Script SQL de création de la base de données définie dans *dbname*
71 3 Philippe Caseiro
* *sqlscripts*: Scripts SQL a lancer après le script de création définis dans *createscript*
72 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à)
73 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*
74 3 Philippe Caseiro
75 3 Philippe Caseiro
Note sur l'option *pwd_files*:
76 3 Philippe Caseiro
77 3 Philippe Caseiro
L'option pwd_files prend une liste de "dictionnaires" au sens python, cette option attend donc quelque chose comme ça :
78 3 Philippe Caseiro
79 3 Philippe Caseiro
<pre>
80 3 Philippe Caseiro
pwd_files:
81 3 Philippe Caseiro
    - {file: '/var/www/html/posh/includes/config.inc.php',
82 3 Philippe Caseiro
       container: 'web',
83 3 Philippe Caseiro
       pattern: 'define("__PASS","',
84 3 Philippe Caseiro
       end_pattern: ');',
85 3 Philippe Caseiro
       owner: 'root:www-data',
86 3 Philippe Caseiro
       mod: '660' }
87 3 Philippe Caseiro
    - {file: '/usr/share/envole/eoledb/posh',
88 3 Philippe Caseiro
       pattern: 'dbpassPOSH="',
89 3 Philippe Caseiro
       owner: 'root:root',
90 3 Philippe Caseiro
       mod: '600' }
91 3 Philippe Caseiro
</pre>
92 3 Philippe Caseiro
93 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*:
94 3 Philippe Caseiro
95 3 Philippe Caseiro
* file : Chemin complet du fichier a modifier, *cette option est obligatoire*
96 3 Philippe Caseiro
* pattern : Modèle de ligne qui contiens le mot de passe entre ''. *cette option est obligatoire*
97 3 Philippe Caseiro
* container: Conteneur ou ce trouve le fichier a modifier (valable uniquement en mode conteneur) 
98 3 Philippe Caseiro
* end_pattern: caractères a ajouter après le mot de passe sur la ligne lors de la modification du fichier
99 3 Philippe Caseiro
* owner: Propriétaire, au format "user:group", a définir après la modification du mot de passe
100 3 Philippe Caseiro
* mod: Droits au format unix (ex: 600) a définir après la modification du mot de passe
101 3 Philippe Caseiro
102 3 Philippe Caseiro
Note sur l'option *pattern*:
103 3 Philippe Caseiro
104 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.
105 3 Philippe Caseiro
106 3 Philippe Caseiro
Par exemple si la ligne a changer est la suivante : 
107 3 Philippe Caseiro
108 3 Philippe Caseiro
<pre>
109 3 Philippe Caseiro
password: "JeSuiSunMauvaisPassowrd"
110 3 Philippe Caseiro
</pre>
111 3 Philippe Caseiro
112 3 Philippe Caseiro
Il faut définir la valeur suivante pour l'option *pattern*:
113 3 Philippe Caseiro
<pre>
114 3 Philippe Caseiro
pwd_files:
115 3 Philippe Caseiro
   - {file: "/monfichier.conf",
116 3 Philippe Caseiro
      pattern: 'password: "'
117 3 Philippe Caseiro
</pre>
118 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 
119 3 Philippe Caseiro
la mise en place du nouveau mot de passe.
120 3 Philippe Caseiro
121 3 Philippe Caseiro
Si le pattern de votre mot de passe doit être entre des ' il faut préférer le format suivant : 
122 3 Philippe Caseiro
<pre>
123 3 Philippe Caseiro
pattern: "password: '"
124 3 Philippe Caseiro
</pre>
125 3 Philippe Caseiro
126 3 Philippe Caseiro
EoleDB gère également la fermeture des '
127 3 Philippe Caseiro
128 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*.
129 3 Philippe Caseiro
130 3 Philippe Caseiro
Note sur l'option *end_pattern*:
131 3 Philippe Caseiro
132 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.
133 3 Philippe Caseiro
134 3 Philippe Caseiro
Par exemple si votre ligne de mot de passe à le format suivant : 
135 3 Philippe Caseiro
<pre>
136 3 Philippe Caseiro
define('DBPASS': 'JeSuisUnMauvaisPassword');
137 3 Philippe Caseiro
</pre>
138 3 Philippe Caseiro
139 3 Philippe Caseiro
Sans l'option *end_pattern* EoleDB vas produire la ligne suivante:
140 3 Philippe Caseiro
141 3 Philippe Caseiro
<pre>
142 3 Philippe Caseiro
define('DBPASS': 'Sv;434up<'
143 3 Philippe Caseiro
</pre>
144 3 Philippe Caseiro
145 3 Philippe Caseiro
Pour que votre ligne soit correctement fermée il faut défnir *end_pattern* de la manière suivante:
146 1 Philippe Caseiro
147 3 Philippe Caseiro
<pre>
148 3 Philippe Caseiro
   end_pattern: ");",
149 4 Philippe Caseiro
</pre>
150 3 Philippe Caseiro
151 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:
152 3 Philippe Caseiro
153 3 Philippe Caseiro
<pre>
154 3 Philippe Caseiro
define('DBPASS': 'Sv;434up<');
155 3 Philippe Caseiro
</pre>
156 8 Philippe Caseiro
157 8 Philippe Caseiro
158 8 Philippe Caseiro
Voici un exemple tiré du projet eole-posh après migration a EoleDB : 
159 8 Philippe Caseiro
160 13 Philippe Caseiro
<pre>
161 13 Philippe Caseiro
dbtype: mysql
162 8 Philippe Caseiro
dbname: posh
163 8 Philippe Caseiro
dbuser: posh
164 8 Philippe Caseiro
dbpass: "MOTDEPASSE"
165 8 Philippe Caseiro
createscript: "/usr/share/eole/mysql/posh/gen/posh-create-1.sql"
166 8 Philippe Caseiro
sqlscripts: ["/usr/share/eole/mysql/posh/updates/posh-update-1.sql"]
167 8 Philippe Caseiro
pwd_files:
168 8 Philippe Caseiro
    - {file: '/var/www/html/posh/includes/config.inc.php',
169 8 Philippe Caseiro
       container: 'web',
170 8 Philippe Caseiro
       pattern: 'define("__PASS","',
171 8 Philippe Caseiro
       end_pattern: ');',
172 8 Philippe Caseiro
       owner: 'root:www-data',
173 8 Philippe Caseiro
       mod: '660' }
174 8 Philippe Caseiro
    - {file: '/usr/share/envole/eoledb/posh',
175 8 Philippe Caseiro
       pattern: 'dbpassPOSH="',
176 8 Philippe Caseiro
       owner: 'root:root',
177 8 Philippe Caseiro
       mod: '600' }
178 8 Philippe Caseiro
    - {file: '/usr/share/eole/postservice/10-posh',
179 8 Philippe Caseiro
       pattern: 'POSHPASS=',
180 8 Philippe Caseiro
       owner: 'root:root',
181 8 Philippe Caseiro
       mod: '700' }
182 8 Philippe Caseiro
    - {file: '/var/www/html/sap/config/mysql.inc.php',
183 8 Philippe Caseiro
       container: 'web',
184 8 Philippe Caseiro
       pattern: '$dbpwd="',
185 8 Philippe Caseiro
       end_pattern: ';',
186 8 Philippe Caseiro
       owner: 'root:www-data',
187 8 Philippe Caseiro
       mod: '660' }
188 8 Philippe Caseiro
189 1 Philippe Caseiro
190 1 Philippe Caseiro
</pre>
191 10 Philippe Caseiro
192 10 Philippe Caseiro
193 10 Philippe Caseiro
h2. Migrer une application vers EoleDB.
194 10 Philippe Caseiro
195 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.
196 13 Philippe Caseiro
197 1 Philippe Caseiro
En bref si votre application répond au standard _eole-skeletor_ il suffit de remplacer les fichiers de configuration
198 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
199 13 Philippe Caseiro
à disposition dans EoleDB.
200 10 Philippe Caseiro
201 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
202 10 Philippe Caseiro
dans vos dépôts il suffit de transcrire les fichiers suivants dans un seul et unique yaml :
203 10 Philippe Caseiro
* conf/updates/config.py
204 10 Philippe Caseiro
* conf/gen/mon_apply.py
205 10 Philippe Caseiro
* conf/passwords/mon_apply.ini
206 10 Philippe Caseiro
207 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):
208 10 Philippe Caseiro
209 10 Philippe Caseiro
<pre>
210 10 Philippe Caseiro
dbtype: mysql
211 10 Philippe Caseiro
dbname: taskfreak
212 10 Philippe Caseiro
dbuser: taskfreak
213 10 Philippe Caseiro
dbpass: "Un mot de passe !!"
214 10 Philippe Caseiro
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql"
215 10 Philippe Caseiro
pwd_files:
216 10 Philippe Caseiro
    - {file: '/var/www/html/taskfreak/include/config.php',
217 10 Philippe Caseiro
       pattern: '$dbpass="',
218 10 Philippe Caseiro
       owner: 'www-data:www-data',
219 10 Philippe Caseiro
       mod: '600'}
220 10 Philippe Caseiro
</pre>
221 10 Philippe Caseiro
222 10 Philippe Caseiro
Pas une ligne de python un seul fichier.
223 10 Philippe Caseiro
224 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.
225 10 Philippe Caseiro
226 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. 
227 10 Philippe Caseiro
228 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.
229 10 Philippe Caseiro
230 10 Philippe Caseiro
h3. Possibilités offertes par EoleDB aux applications.
231 10 Philippe Caseiro
232 10 Philippe Caseiro
h4. Le mode "default" !
233 10 Philippe Caseiro
234 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.
235 10 Philippe Caseiro
236 10 Philippe Caseiro
Ce qui ce traduit par l'exemple de taskfreak dans la partie précédente. Dans cette configuration : 
237 10 Philippe Caseiro
238 10 Philippe Caseiro
<pre>
239 10 Philippe Caseiro
dbtype: mysql
240 10 Philippe Caseiro
dbname: taskfreak
241 10 Philippe Caseiro
dbuser: taskfreak
242 10 Philippe Caseiro
dbpass: "Un mot de passe !!"
243 10 Philippe Caseiro
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql"
244 10 Philippe Caseiro
pwd_files:
245 10 Philippe Caseiro
    - {file: '/var/www/html/taskfreak/include/config.php',
246 10 Philippe Caseiro
       pattern: '$dbpass="',
247 10 Philippe Caseiro
       owner: 'www-data:www-data',
248 10 Philippe Caseiro
       mod: '600'}
249 10 Philippe Caseiro
</pre>
250 10 Philippe Caseiro
251 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.
252 10 Philippe Caseiro
253 10 Philippe Caseiro
h4. Le mode "local" !
254 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 : 
255 10 Philippe Caseiro
256 10 Philippe Caseiro
<pre>
257 10 Philippe Caseiro
---
258 10 Philippe Caseiro
dbhost: 127.0.0.1
259 10 Philippe Caseiro
dbtype: mysql
260 10 Philippe Caseiro
dbname: taskfreak
261 10 Philippe Caseiro
dbuser: taskfreak
262 10 Philippe Caseiro
dbpass: "task;Freak"
263 10 Philippe Caseiro
client_hosts: ["127.0.0.1", "localhost"]
264 10 Philippe Caseiro
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql"
265 10 Philippe Caseiro
pwd_files:
266 10 Philippe Caseiro
    - {file: '/var/www/html/taskfreak/include/config.php',
267 10 Philippe Caseiro
       pattern: '$dbpass="',
268 10 Philippe Caseiro
       owner: 'www-data:www-data',
269 10 Philippe Caseiro
       mod: '600' }
270 10 Philippe Caseiro
</pre>
271 10 Philippe Caseiro
272 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.
273 10 Philippe Caseiro
274 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.
275 10 Philippe Caseiro
276 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.
277 10 Philippe Caseiro
278 10 Philippe Caseiro
h4. Le mode "externe"!
279 10 Philippe Caseiro
280 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 :
281 10 Philippe Caseiro
282 10 Philippe Caseiro
<pre>
283 10 Philippe Caseiro
---
284 10 Philippe Caseiro
dbhost: 192.168.45.34
285 10 Philippe Caseiro
dbport: 3309
286 10 Philippe Caseiro
dbroot: adminDB
287 10 Philippe Caseiro
dbrootpwd: /root/.secrets-mydb
288 10 Philippe Caseiro
dbtype: mysql
289 10 Philippe Caseiro
dbname: taskfreak
290 10 Philippe Caseiro
dbuser: taskfreak
291 10 Philippe Caseiro
dbpass: "task;Freak"
292 10 Philippe Caseiro
client_hosts: ["127.0.0.1", "localhost", "192.168.0.14" ]
293 10 Philippe Caseiro
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql"
294 10 Philippe Caseiro
pwd_files:
295 10 Philippe Caseiro
    - {file: '/var/www/html/taskfreak/include/config.php',
296 10 Philippe Caseiro
       pattern: '$dbpass="',
297 10 Philippe Caseiro
       owner: 'www-data:www-data',
298 10 Philippe Caseiro
       mod: '600' }
299 10 Philippe Caseiro
</pre>
300 10 Philippe Caseiro
301 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.
302 10 Philippe Caseiro
303 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.
304 10 Philippe Caseiro
305 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.
306 10 Philippe Caseiro
307 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.
308 10 Philippe Caseiro
309 10 Philippe Caseiro
Donc pour créer ce nouveau template nous allons avoir besoin de créer de nouvelles variables.
310 10 Philippe Caseiro
311 10 Philippe Caseiro
h3. Mise à jour du dictionnaire pour le support des 3 modes
312 10 Philippe Caseiro
313 10 Philippe Caseiro
Afin de simplifier les choses pour l'utilisateur, nous avons pris le partis de mettre toutes les variables dans une 
314 10 Philippe Caseiro
nouvelle famille (donc nouvel onglet dans gen_connfig) en mode expert.
315 10 Philippe Caseiro
316 10 Philippe Caseiro
<pre>
317 10 Philippe Caseiro
<family name='taskfreak' mode='expert'>
318 10 Philippe Caseiro
</family>
319 10 Philippe Caseiro
</pre>
320 10 Philippe Caseiro
321 10 Philippe Caseiro
La première variable de cette famille vas servir a permettre à l'utilisateur de faire le choix du mode.
322 10 Philippe Caseiro
Voici la dite variable pour taskfreak:
323 10 Philippe Caseiro
324 10 Philippe Caseiro
<pre>
325 10 Philippe Caseiro
<variable name='tf_db_mode' type='string' description='Serveur de bases de données à utiliser'/>
326 10 Philippe Caseiro
</pre>
327 10 Philippe Caseiro
328 10 Philippe Caseiro
Cetta variable est une simple liste des trois modes, il faut donc lui ajouter une contrainte : 
329 10 Philippe Caseiro
330 10 Philippe Caseiro
<pre>
331 10 Philippe Caseiro
<check name='valid_enum' target='tf_db_mode'>
332 10 Philippe Caseiro
    <param>['default', 'externe', 'local']</param>
333 10 Philippe Caseiro
</check>
334 10 Philippe Caseiro
</pre>
335 10 Philippe Caseiro
336 10 Philippe Caseiro
Ensuite il nous faut une variable pour stocker l'adresse du serveur de base de données en mode "externe":
337 10 Philippe Caseiro
338 10 Philippe Caseiro
<pre>
339 10 Philippe Caseiro
<variable type='string' name='tf_dbserver' description='Adresse du serveur de base de données'/>
340 10 Philippe Caseiro
</pre>
341 10 Philippe Caseiro
342 10 Philippe Caseiro
Puis une variable pour le port d'écoute du serveur en mode "externe" : 
343 10 Philippe Caseiro
344 10 Philippe Caseiro
<pre>
345 10 Philippe Caseiro
<variable type='number' name='tf_dbport' description="Port d'écoute du serveur de base de données"/>
346 10 Philippe Caseiro
</pre>
347 10 Philippe Caseiro
348 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: 
349 10 Philippe Caseiro
<pre>
350 10 Philippe Caseiro
<variable type='string' name='tf_dbuser' description='Utilisateur du serveur de base de données'/>
351 10 Philippe Caseiro
</pre>
352 10 Philippe Caseiro
353 10 Philippe Caseiro
Une variable pour permettre spécifier le fichier de mot de passe pour l'utilisateur définis précédement :
354 10 Philippe Caseiro
<pre>
355 10 Philippe Caseiro
<variable type='string' name='tf_dbpass' description='Fichier de mot de passe du serveur'/>
356 10 Philippe Caseiro
</pre>
357 10 Philippe Caseiro
358 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:
359 10 Philippe Caseiro
360 10 Philippe Caseiro
<pre>
361 10 Philippe Caseiro
<variable type='string' name='tf_allow_hosts' description="Hôtes authorisés à utiliser la base de données" multi='true'/>
362 10 Philippe Caseiro
</pre>
363 10 Philippe Caseiro
364 10 Philippe Caseiro
Cette dernière est une liste et donc avec l'option "multi=true"
365 10 Philippe Caseiro
<pre>
366 11 Philippe Caseiro
367 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
368 11 Philippe Caseiro
"local" aucun besoin d'afficher toutes les variables dans l'interface : 
369 11 Philippe Caseiro
370 11 Philippe Caseiro
Voici les conditions pour taskfreak :
371 11 Philippe Caseiro
372 11 Philippe Caseiro
Donc pour taskfreak voici la première containte : "Pas de EoleDB, pas de taskfreak !"
373 11 Philippe Caseiro
<pre>
374 11 Philippe Caseiro
 <constraints>
375 11 Philippe Caseiro
     <condition name='disabled_if_in' source='activer_eoledb'>
376 11 Philippe Caseiro
         <param>non</param>
377 11 Philippe Caseiro
         <target type='variable'>activer_taskfreak</target>
378 11 Philippe Caseiro
     </condition>
379 11 Philippe Caseiro
</pre>
380 11 Philippe Caseiro
381 11 Philippe Caseiro
La traditionnelle "activer_monapply":
382 11 Philippe Caseiro
</pre>
383 11 Philippe Caseiro
     <condition name='hidden_if_in' source='activer_taskfreak'>
384 11 Philippe Caseiro
         <param>non</param>
385 11 Philippe Caseiro
         <target type='filelist'>taskfreak</target>
386 11 Philippe Caseiro
         <target type='servicelist'>taskfreak</target>
387 11 Philippe Caseiro
     </condition>
388 11 Philippe Caseiro
389 11 Philippe Caseiro
</pre>
390 11 Philippe Caseiro
391 11 Philippe Caseiro
Le valid_enum déjà évoqué plus haut pour la liste des choix possible, un rappel ne fait jamais de mal
392 11 Philippe Caseiro
<pre>
393 11 Philippe Caseiro
     <check name='valid_enum' target='tf_db_mode'>
394 11 Philippe Caseiro
         <param>['default', 'externe', 'local']</param>
395 11 Philippe Caseiro
     </check>
396 11 Philippe Caseiro
397 11 Philippe Caseiro
</pre>
398 11 Philippe Caseiro
399 11 Philippe Caseiro
400 11 Philippe Caseiro
Voila la partie affichage des dites nouvelles variables, donc ici nous allons cacher les variables :
401 11 Philippe Caseiro
* tf_dbserver,
402 11 Philippe Caseiro
* tf_dbuser,
403 11 Philippe Caseiro
* tf_dbport,
404 11 Philippe Caseiro
* tf_dbpass,
405 11 Philippe Caseiro
406 11 Philippe Caseiro
si le mode choisis par l'utilisateur est "local".
407 11 Philippe Caseiro
408 11 Philippe Caseiro
<pre>
409 11 Philippe Caseiro
     <condition name='disabled_if_in' source='tf_db_mode'>
410 11 Philippe Caseiro
         <param>local</param>
411 11 Philippe Caseiro
         <target type='variable'>tf_dbserver</target>
412 11 Philippe Caseiro
         <target type='variable'>tf_dbuser</target>
413 11 Philippe Caseiro
         <target type='variable'>tf_dbport</target>
414 11 Philippe Caseiro
         <target type='variable'>tf_dbpass</target>
415 11 Philippe Caseiro
     </condition>
416 11 Philippe Caseiro
</pre>
417 11 Philippe Caseiro
418 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.
419 11 Philippe Caseiro
420 11 Philippe Caseiro
<pre>
421 11 Philippe Caseiro
     <condition name='disabled_if_in' source='tf_db_mode'>
422 11 Philippe Caseiro
         <param>default</param>
423 11 Philippe Caseiro
         <target type='variable'>tf_dbserver</target>
424 11 Philippe Caseiro
         <target type='variable'>tf_dbuser</target>
425 11 Philippe Caseiro
         <target type='variable'>tf_dbport</target>
426 1 Philippe Caseiro
         <target type='variable'>tf_dbpass</target>
427 12 Philippe Caseiro
         <target type='variable'>tf_allow_hosts</target>
428 11 Philippe Caseiro
     </condition>
429 11 Philippe Caseiro
 </constraints>
430 11 Philippe Caseiro
</pre>
431 11 Philippe Caseiro
432 11 Philippe Caseiro
Voila notre dictionnaire est à jour, nous allons pouvoir passer au tempalte de la configuration EoleDB.
433 11 Philippe Caseiro
434 11 Philippe Caseiro
h3. Création du template pour le support des 3 modes et du mode bonus (support des conteneurs).
435 11 Philippe Caseiro
436 11 Philippe Caseiro
Attention n'oubliez pas de déclarer votre nouveau template dans le dictionnaire.
437 11 Philippe Caseiro
438 11 Philippe Caseiro
Ne perdons pas plus de temps et allons dans le code du tempalte.
439 11 Philippe Caseiro
440 11 Philippe Caseiro
Nous allons avoir besoin de connaitre le mode choisis par l'utilisateur plusieurs fois dans le template
441 11 Philippe Caseiro
commençons donc par déclarer une variable de template nommée "dmode"
442 11 Philippe Caseiro
<pre>
443 11 Philippe Caseiro
%set dmode = %%getVar('tf_db_mode','non')
444 11 Philippe Caseiro
</pre>
445 11 Philippe Caseiro
446 11 Philippe Caseiro
Vérifions d'abord si le mode est "externe", si c'est le cas nous allons utiliser les nouvelles variables 
447 11 Philippe Caseiro
pour définir les configurations pour dbhost, dbroot, dbrootpwd ... Si le mode est "local" nous forçons simplement
448 11 Philippe Caseiro
la valeur de dbhost à 127.0.0.1. Pour  le mode "default" il n'y a rien à faire.
449 11 Philippe Caseiro
450 11 Philippe Caseiro
</pre>
451 11 Philippe Caseiro
%if %%dmode == "externe"
452 11 Philippe Caseiro
dbhost: %%tf_dbserver
453 11 Philippe Caseiro
dbport: %%tf_dbport
454 11 Philippe Caseiro
dbroot: %%tf_dbuser
455 11 Philippe Caseiro
dbrootpwd: %%tf_dbpass
456 11 Philippe Caseiro
%else if %%dmode == "local"
457 11 Philippe Caseiro
dbhost: 127.0.0.1
458 11 Philippe Caseiro
%end if
459 11 Philippe Caseiro
</pre>
460 11 Philippe Caseiro
461 11 Philippe Caseiro
Cette partie du tempalte est commune a tous les modes :
462 11 Philippe Caseiro
463 11 Philippe Caseiro
<pre>
464 11 Philippe Caseiro
dbtype: mysql
465 11 Philippe Caseiro
dbname: taskfreak
466 11 Philippe Caseiro
dbuser: taskfreak
467 11 Philippe Caseiro
dbpass: "task;Freak"
468 1 Philippe Caseiro
</pre>
469 11 Philippe Caseiro
470 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
471 1 Philippe Caseiro
que nous savons bien que cette valeur est obligatoire.
472 11 Philippe Caseiro
473 12 Philippe Caseiro
Avant tout on récupère la liste saisie par l'utilisateur pour la stocker dans une variable de template :
474 1 Philippe Caseiro
475 12 Philippe Caseiro
<pre>
476 12 Philippe Caseiro
%set allow_hosts = %%getVar('tf_allow_hosts', '')
477 1 Philippe Caseiro
</pre>
478 12 Philippe Caseiro
479 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" : 
480 12 Philippe Caseiro
481 12 Philippe Caseiro
<pre>
482 1 Philippe Caseiro
%if %%dmode == "local"
483 12 Philippe Caseiro
client_hosts: ["127.0.0.1", "localhost" %slurp
484 12 Philippe Caseiro
</pre>
485 12 Philippe Caseiro
486 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" : 
487 12 Philippe Caseiro
488 12 Philippe Caseiro
<pre>
489 1 Philippe Caseiro
%else if %%dmode == "externe"
490 12 Philippe Caseiro
client_hosts: ["%%adresse_ip_eth0" %slurp
491 12 Philippe Caseiro
%end if
492 12 Philippe Caseiro
</pre>
493 12 Philippe Caseiro
494 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 "]".
495 12 Philippe Caseiro
496 12 Philippe Caseiro
<pre>
497 12 Philippe Caseiro
%if %%dmode != "default"
498 12 Philippe Caseiro
    %if %%is_empty(%%allow_hosts)
499 11 Philippe Caseiro
]
500 11 Philippe Caseiro
    %else
501 12 Philippe Caseiro
        %for %%hst in %%allow_hosts
502 12 Philippe Caseiro
,"%%hst" %slurp
503 12 Philippe Caseiro
        %end for
504 12 Philippe Caseiro
]
505 1 Philippe Caseiro
    %end if
506 1 Philippe Caseiro
%end if
507 1 Philippe Caseiro
</pre>
508 1 Philippe Caseiro
509 1 Philippe Caseiro
Cette partie est également commune a tous les modes
510 11 Philippe Caseiro
511 11 Philippe Caseiro
<pre>
512 11 Philippe Caseiro
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql"
513 11 Philippe Caseiro
</pre>
514 11 Philippe Caseiro
515 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.
516 12 Philippe Caseiro
Le mode bonus fait son entrée, en effet les fichiers de configuration des applications sont bien souvent dans un conteneur
517 12 Philippe Caseiro
la plus part du temps dans le conteneur web. Il faut donc prendre en compte ce petit détail.
518 11 Philippe Caseiro
519 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 
520 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) 
521 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
522 12 Philippe Caseiro
que le conteneur web est dans le groupe réseau et le tour est joué pour taskfreak.
523 12 Philippe Caseiro
524 1 Philippe Caseiro
<pre>
525 1 Philippe Caseiro
pwd_files:
526 1 Philippe Caseiro
%if %%getVar('mode_conteneur_actif','non') == 'non'
527 1 Philippe Caseiro
    - {file: '/var/www/html/taskfreak/include/config.php',
528 1 Philippe Caseiro
%else
529 1 Philippe Caseiro
    - {file: '%%container_path_reseau/var/www/html/taskfreak/include/config.php',
530 1 Philippe Caseiro
%end if
531 1 Philippe Caseiro
       pattern: '$dbpass="',
532 1 Philippe Caseiro
       owner: 'www-data:www-data',
533 1 Philippe Caseiro
       mod: '600' }
534 12 Philippe Caseiro
</pre>
535 12 Philippe Caseiro
536 12 Philippe Caseiro
Cette variante est également possible : 
537 12 Philippe Caseiro
538 12 Philippe Caseiro
<pre>
539 12 Philippe Caseiro
pwd_files:
540 12 Philippe Caseiro
    - {file: '%%container_path_reseau/var/www/html/taskfreak/include/config.php',
541 12 Philippe Caseiro
       pattern: '$dbpass="',
542 12 Philippe Caseiro
       owner: 'www-data:www-data',
543 12 Philippe Caseiro
       mod: '600' }
544 12 Philippe Caseiro
</pre>
545 12 Philippe Caseiro
<pre>
546 12 Philippe Caseiro
547 12 Philippe Caseiro
La variable container_path_reseau existe toujours et si le serveur n'est pas en mode conteneur elle est simplement vide.
548 12 Philippe Caseiro
549 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.
550 12 Philippe Caseiro
551 12 Philippe Caseiro
On continue avec l'exemple de taskfreak :
552 12 Philippe Caseiro
553 12 Philippe Caseiro
h3. Évolution du template de configuration de l'application pour le support des 3 modes et du mode bonus.
554 12 Philippe Caseiro
555 12 Philippe Caseiro
On commence par récupérer et stocker dans une variable de template le contenues de la variable "tf_db_mode".
556 12 Philippe Caseiro
<pre>
557 12 Philippe Caseiro
%set db_mode = %%getVar("tf_db_mode", 'non')
558 12 Philippe Caseiro
</pre>
559 12 Philippe Caseiro
560 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 
561 12 Philippe Caseiro
configuration de l'application. On traite également la définition du port d'écoute, ici on ajoute une valeur 
562 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
563 12 Philippe Caseiro
n'est pas obligatoire.
564 12 Philippe Caseiro
565 12 Philippe Caseiro
<pre>
566 12 Philippe Caseiro
%if %%db_mode == "externe"
567 12 Philippe Caseiro
define('TZN_DB_HOST','%%tf_dbserver');
568 12 Philippe Caseiro
    %if %%getVar('tf_dbport', 'non') != "non"
569 12 Philippe Caseiro
define('TZN_DB_PORT', '%%tf_dbport');
570 12 Philippe Caseiro
    %end if
571 12 Philippe Caseiro
</pre>
572 12 Philippe Caseiro
573 12 Philippe Caseiro
Ensuite on traite le mode "default" qui est le mode le plus compliqué ici.
574 12 Philippe Caseiro
Donc si l'utilisateur a choisi "default" on récupère la valeur de la variable 
575 12 Philippe Caseiro
edb_host, définie dans le dictionnaire de l'Eolisation de EoleDB. Cette variable
576 12 Philippe Caseiro
contiens dans certains cas l'adresse du serveur définis.
577 12 Philippe Caseiro
578 12 Philippe Caseiro
<pre>
579 1 Philippe Caseiro
%else if %%db_mode == "default"
580 12 Philippe Caseiro
   %set dbhost = %%getVar('edb_host', 'non')
581 12 Philippe Caseiro
</pre>
582 12 Philippe Caseiro
583 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.
584 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
585 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".
586 12 Philippe Caseiro
587 12 Philippe Caseiro
<pre>
588 12 Philippe Caseiro
   %if %%dbhost == 'non' and %%mode_conteneur_actif == 'oui':
589 12 Philippe Caseiro
define('TZN_DB_HOST', '%%adresse_ip_mysql')
590 12 Philippe Caseiro
   %else
591 12 Philippe Caseiro
       %if %%dbhost == 'non'
592 12 Philippe Caseiro
define('TZN_DB_HOST', 'localhost');
593 12 Philippe Caseiro
       %else
594 12 Philippe Caseiro
define('TZN_DB_HOST', '%%edb_host');
595 12 Philippe Caseiro
       %end if
596 12 Philippe Caseiro
   %end if
597 12 Philippe Caseiro
   %if %%getVar('edb_dbport', 'non') != "non"
598 12 Philippe Caseiro
define('TZN_DB_PORT', '%%edb_port');
599 12 Philippe Caseiro
    %end if
600 12 Philippe Caseiro
</pre>
601 12 Philippe Caseiro
602 12 Philippe Caseiro
Sinon en mode local on utilise simplement la variable adresse_ip_mysql qui est toujours définie.
603 12 Philippe Caseiro
604 12 Philippe Caseiro
<pre>
605 12 Philippe Caseiro
%else
606 1 Philippe Caseiro
define('TZN_DB_HOST','%%adresse_ip_mysql');
607 1 Philippe Caseiro
%end if
608 12 Philippe Caseiro
</pre>
609 16 Gérald Schwartzmann
610 16 Gérald Schwartzmann