Suivant: , Précédent: , Monter: Définir des services   [Table des matières][Index]


8.17.2 Types service et services

Un type de service est un nœud dans le DAG décrit plus haut. Commençons avec un exemple simple, le type de service pour le démon de construction de Guix (voir Invoquer guix-daemon) :

(define guix-service-type
  (service-type
   (name 'guix)
   (extensions
    (list (service-extension shepherd-root-service-type guix-shepherd-service)
          (service-extension account-service-type guix-accounts)
          (service-extension activation-service-type guix-activation)))
   (default-value (guix-configuration))))

Il définit trois choses :

  1. Un nom, dont le seul but de rendre l’inspection et le débogage plus faciles.
  2. Une liste d’extensions de services, où chaque extension désigne le type de service cible et une procédure qui, étant donné les paramètres du service, renvoie une liste d’objets pour étendre le service de ce type.

    Chaque type de service a au moins une extension de service. La seule exception est le type de service boot, qui est le service ultime.

  3. Éventuellement, une valeur par défaut pour les instances de ce type.

Dans cet exemple, guix-service-type étend trois services :

shepherd-root-service-type

La procédure guix-shepherd-service définit comment le service du Shepherd est étendu. En fait, elle renvoie un objet <shepherd-service> qui définit comment guix-daemon est démarré et stoppé (voir Services Shepherd).

account-service-type

Cette extension pour ce service est calculée par guix-accounts, qui renvoie une liste d’objets user-group et user-account représentant les comptes des utilisateurs de construction (voir Invoquer guix-daemon).

activation-service-type

Ici, guix-activation est une procédure qui renvoie une gexp, qui est un bout de code qui s’exécute au moment de l’activation — p. ex. lorsque le service est démarré.

Un service de ce type est instancié de cette manière :

(service guix-service-type
         (guix-configuration
           (build-accounts 5)
           (use-substitutes? #f)))

Le deuxième argument de la forme service est une valeur représentant les paramètres de cet instance spécifique du service. Voir guix-configuration, pour plus d’informations sur le type de données guix-configuration. Lorsque la valeur est omise, la valeur par défaut spécifiée par guix-service-type est utilisée :

(service guix-service-type)

guix-service-type est très simple car il étend d’autres services mais ne peut pas être étendu.

Le type de service pour un service extensible ressemble à ceci :

(define udev-service-type
  (service-type (name 'udev)
                (extensions
                 (list (service-extension shepherd-root-service-type
                                          udev-shepherd-service)))

                (compose concatenate)       ; concatène la liste des règles
                (extend (lambda (config rules)
                          (match config
                            (($ <udev-configuration> udev initial-rules)
                             (udev-configuration
                              (udev udev)   ; le paquet udev à utiliser
                              (rules (append initial-rules rules)))))))))

C’est le type de service pour le le démon de gestion des périphériques eudev. Comparé à l’exemple précédent, en plus d’une extension de shepherd-root-service-type, on trouve deux nouveaux champs :

compose

C’est la procédure pour composer la liste des extensions de services de ce type.

Les services peuvent étendre le service udev en lui passant des listes de règles ; on compose ces extensions simplement en les concaténant.

extend

Cette procédure définie comme la valeur du service est étendue avec la composition des extensions.

Les extensions Udev sont composés en une liste de règles, mais la valeur du service udev est elle-même un enregistrement <udev-configuration>. Donc ici, nous étendons cet enregistrement en ajoutant la liste des règle contribuées à la liste des règles qu’il contient déjà.

description

C’est une chaîne donnant un aperçu du type de service. Elle peut contenir du balisage Texinfo (voir Overview dans GNU Texinfo). La commande guix system search permet de rechercher dans ces chaînes et de les afficher (voir Invoquer guix system).

Il ne peut y avoir qu’une instance d’un type de service extensible comme udev-service-type. S’il y en avait plus, les spécification service-extension seraient ambiguës.

Toujours ici ? La section suivante fournit une référence de l’interface de programmation des services.


Suivant: , Précédent: , Monter: Définir des services   [Table des matières][Index]