Libconf & conf2xml par Damien Krotkine alias dams (dams@gentoo.org), responsable des applications CDROMS chez IDM. Damien était chef de projet dans le cadre de la réalisation de l'encyclopédie Hachette 2005 et de son site web, l'encyclopédie Hachette en ligne. Il maintient également quelques ebuilds des programmes qu'il utilise sous Gentoo.
Dams débuta sa conférence par un exemple assez simple avec l'utilisation du fichier de configuration /etc/resolv.conf par un être humain.
En théorie un utilisateur va éditer son fichier de configuration à la main avec un éditeur de texte, modifier son fichier sans pour autant respecter la syntaxe de celui-ci, puis l'enregistrer. Si l'on prend en compte le pourcentage d'erreurs d'un être humain (mauvaise compréhension de la syntaxe, erreur de frappe..etc), la structure du fichier pourrait être altérée.
Deuxième cas, en théorie les démarches dont a besoin un programme lors de la modification d'un fichier de configuration seraient : Connaître la syntaxe du fichier de configuration : Parsing File Lire le fichier : La lecture du fichier engendre la compréhension de celui-ci Comprendre le fichier Modifier le fichier Ensuite écrire le fichier
IRL (In Real Life). Lors d'une utilisation normale, les outils de configuration différents de libconf font des choses très sales telles que : L'édition de fichier en utilisant de mauvaise expression régulière. Réécriture de fichier. Mélanges entre le fichier par défaut et les informations de l'utilisateur
Damien Krotkine, expose le problème des fichiers de configurations cassés ou corrompus, la perte d'informations utilisateurs et la modification des manuels utilisateurs ou pire encore la réinitialisation complète du fichier. C'est pour toutes ces raisons que libconf est conseillé pour la manipulation de fichiers de configuration. Libconf et conf2xml présentent de nombreux avantages comme la syntaxe améliorée, le parsing, la facilité de modification d'un fichier, la possibilité d'importation et d'exportation des fichiers, la gestion du multi language tout en respectant la syntaxe du fichier modifié.
Parmit les différences entre les méthodes de parsing il est déconseillé d'utiliser un parseur spécifique entre chacun des fichiers, qui allourdirait considérable le travail de développement. Une solution non optimisée, qui engendrerait une redondance entre les fichiers. Dans le cas présent il est préférable d'utiliser les splits ansi qu'une représentation sémantique de la structure d'un fichier de configuration.
Si l'on prend l'exemple du make.conf sous Gentoo, on récupère la représentation de la structure basée sur des objets et templates.
Dans cet exemple la chaîne de caractères "#Define CFLAGS" est associée à l'objet comment. CFLAGS et CHOST sont tous deux des clés associées à une valeur, ils deviennent des flags compréhensibles par le parseur de libconf. On peut noter que l'on ne parcour pas le fichier en fonction de balises mais d'objets, dans l'absolu on aurait parcouru les lignes une à une et si le caractère # se trouvait dans la chaîne de caractères il serait considéré comme un commentaire.
Lors de la conférence plusieurs exemples on étaient exposés, la configuration de resolv.conf, fichier permettant de définir les différents serveurs DNS du système. Voici l'exemple :
Grâce à cette méthode on peut avoir des petites imbrications entre les fichiers de configuration, les templates sont alors transmissibles par exemple :
KeyValue + Section => KeyValueSection
On peut alors définir différentes variables en fonction des situations, SECTION, ENDSECTION, FLAG, KEY_VALUE, KEY_LIST, VALUE...
Pour comprendre un fichier de configuration, sa structure doit être simple et précise, on peut donc la représenter facilement par une vision sémantique de celui-ci. Prenons l'exemple du fichier de configuration de Samba (/etc/smb.conf), qui intègre des balises de types [nom_balise] pour définit chaque section.
Dans un premier temps chaque section est associée à un flag KEY_VALUE, qui correspond à une valeur. Chaque valeur est associée à une clé qui elle-même est une option de la section du fichier. Dans sa dernière représentation le fichier de configuration est associé à un pseudo code un peu comme les array list en php. En effet global est un tableau, avec des indices et à chaque indices correspond une valeur. Pour "homes" l'indice writable contient la valeur yes.
Voici un petit bout de code en Perl qui ajoute dans le fichier smb.conf un partage [MyShare]
XML
Sous sa représentation XML, un fichier de configuration peut être chargé avec conf2xml afin de le lire et de le modifier. L'API modifiera directement la structure xml du fichier. La représentation du fichier xml standardisé ressemblera à ceci :
La structure xml du fichier ne diffère que très peu des flags précédemment définis avec libconf. Le xml permet de définir une structure claire et concise qui facilite les tâches de parsing.
Voici deux exemples de code en C et en Python qui nous on étaient présentés :
En conclusion, libconf et conf2xml sont deux API permettent de manipuler facilement et proprement des fichiers de configuration, tout en respectant leur syntaxe. Damien Krotkine a d'ailleurs implémenté cette librairie dans profuse un éditeur de Use-flag possible remplaçant de ufed. On peut citer plusieurs implémentation de libconf comme confid_confd, un utilitaire graphique permettant de gérer facilement la configuration de Gentoo. Mandriva l'utilise également pour son assistant de configuration Samba qui facilite la configuration des partages réseaux pour les utilisateurs débutants.
Pour toutes documentations complémentaires nous vous conseillons ce lien : Libconf.net