• [^] # Re: Ça me fait un peu penser à Augeas

    Posté par . En réponse au journal Dhall, une réponse au problème de configuration. Évalué à 2.

    « Les choses les plus difficiles en Informatique sont au nombre de deux : vider le cache et identifier les choses.1 »

    Les choses premières en premier, je commence avec l’identification pour noter que le projet est nommé Augeas et est chapeauté par une équipe nommée Hercules ; nul doute que cette équipe s’est à un certain moment proposée de nettoyer les écuries dans les config :) Bref, c’est toujours une agréable surprise de voir des emprunts faits à la mythologie grecque ...

    Élégance d’Augeas — l’outil, non pas les écuries, hein2

    Il semble qu’un objet configurable est modélisé en tant que foncteur. Pour des besoins de présentations, j’imagine, le vocabulaire foncteur et consorts est évacué de ce qu’on peut trouver sur le site web officiel. Les auteurs préfèrent parler d’arbre ou graphe. Pour les besoins de ce qui suit, je retiens foncteur.

    La structure sur laquelle est bâtie le reste d’Augeas serait Lens valeur, où Lens est une co-algèbre pour le foncteur Config valeur qui, lui, est une F-algèbre sur les configurables. Prosaïquement, Augeas ferait abstraction des objets configurables de telle façon que, quelle soit ce qu’ils configurent, il serait possible de les manipuler grâce à deux opérations de base, à savoir3

    1. retirer_valeur : config → val, la consultation d’une configuration ;
    2. modifier_valeur : config → val → config, l’actualisation d’une configuration.

    Ces opérations sont applicables à la fois sur un objet en entier ou à ses parties, grâce aux propriétés des Lenses. Et comme on a une algèbre, et ben, des opérations algébriques supplémentaires sont possibles sur ces Lenses.

    Avec un outillage pareil, on peut désormais uniformiser tout ce qui a trait à la configuration, à condition bien sûr de préalablement l’encapsuler sous une Lens. Le bidirectionnel est une conséquence immédiate de l’utilisation des Lenses. Très élégant !

    Et comme des paquets pour nombreuses distributions sont disponibles, j’ai mis la main dans le cambouis.

    # Comment sont traités les processus lancés
    # dans la session en cours si je la ferme ?
    augtool get /files/etc/systemd/logind.conf/Login/KillUserProcesses/value
    # /files/.../value = true

    Au lieu de get, j’aurais pu utiliser un set et cela, indépendamment de la syntaxe réelle qui se trouve dans /etc/systemd/logind.conf (INI dans ce cas-ci mais ça aurait pu être du Bash, du Python, ...). En somme, un outil conceptuellement balaise, je dirais. Viennent ensuite les points qui font tache.

    Implémentation d’Augeas

    Le langage à utiliser afin d’ajouter une nouvelle Lens est dérivé de ML, ça promet ! Sauf qu’en jetant un coup-d’œil sur les sources, on voit que Augeas — le ML-like — fait 59.8 % et le C 36.7 %. Le plus du tiers du dépôt en C fait des choses telles du parsing, dommage ! Je pense que ces dernières années, il est devenu inutile d’élaborer sur les méfaits de parser en C.

    Même au-delà du parsing, la manière dont les implémentations alternatives est faite consiste à appeler le C original. Je base cela sur ce qu’on peut par exemple voir pour les bindings en

    • Python : from cffi import FFI ...
    • OCaml : external create ...
    • Haskell : {-# LANGUAGE CPP, ForeignFunctionInterface #-} ...

    Cela étant dit, le projet est là depuis au-moins 2008, sous la houlette de David Lutterkort, employé de Red Hat. Donc, j’imagine qu’il y avait des contraintes corporate à se reposer sur du C pour des tâches pareilles. En plus, le regard qu’on peut porter sur des outils durant cette décennie n’est pas certainement le même qu’il y a deux décennies.

    Un petit détour sur le langage en soi avant de terminer. Ses types primitifs sont unit, string, regexp, lens, tree, et filter. Faire de REGEX un type primitif, même en se limitant à du POSIX étendu, en prenant en plus le soin de contrôler quelles sont les regex qu’on acceptera, ça reste un choix que je qualifierais de hack. Quand on crée un langage de toutes pièces, au lieu d’évacuer un problème (d’expressivité peut-être) dans des regex, autant enrichir la syntaxe du langage qu’on est de toutes façons en train d’inventer.

    En tout cas, merci d’avoir posté sur Augeas, ces satanés travaux d’Héraclès, on finira par les terminer, quelle que soit la configuration !


    1. Traduction libre d’une célèbre citation.

    2. Je donne mes impressions en première approximation, je découvre la chose, je commettrai certainement des erreurs qu’une familiarité avec Augeas permettrait d’éviter.

    3. En reprenant les notations mentionnées dans le journal.