Cette page décrit le principe du module nmirror de nlib, avant qu’il ne soit effectivement codé. Il s’agit d’un brouillon qui évoluera jusqu’à donner la référence du module.

Gestion de mirroirs de téléchargements

Introduction

nmirror fournit un jeu de fonctions permettant de gérer de manière standardisée les mirroirs de téléchargements, pour nos différents outils (à l’heure actuelle, Ncooker et Ndkm). Le besoin peut être résumé par les points suivants :

  • avoir un format de fichier de définition de mirroirs, pour chacun des types de projets (par exemple le kernel, Gnome, KDE, Sourceforge, etc..)
  • être assez générique pour être intégré facilement aux différents outils de Nasgaïa
  • permettre une sélection de mirroirs par ordre de préférence, avec ceux proches de la localité de l’utilisateur en priorité
  • permettre d’itérer facilement sur les mirroirs sélectionnés
  • fournir une reconnaissance rapide d’une URL contenant une référence sur un mirroir, cette référence devant être aussi générique que possible, pour s’adapter aux besoins des différents outils
  • permettre une customisation des mirroirs par l’utilisateur, sans altérer les fichiers de définition de mirroirs originaux (qui pourront par exemple être gérés par le gestionnaire de paquets Ncooker)

Format du fichier de définition de mirroirs

Le fichier est composé de lignes de texte, chacune contenant deux champs, séparés par une ou plusieurs tabulations ou espaces :

  • la zone horaire (timezone), ou - (zone horaire quelconque)
  • l’URL de base permettant d’accéder à ce mirroir

L’ordre des lignes a son importance : il est préférable de mettre les URLs les plus importantes en haut du fichier (voir l’algorithme de recherche décrit ci-dessous).

Ainsi, les mirroirs sont classés selon deux critères :

  • par localité, définie par la zone horaire
  • par ordre de préférence décroissant

Par exemple, le projet GNU détient ses paquets sur son serveur de téléchargements principal à l’adresse :

ftp://ftp.gnu.org/gnu

Il existe une plétore de mirroirs pour ce projet :

(pour info, la liste peut être obtenue sur le site du projet GNU)

Un fichier de définition de mirroirs pour le projet GNU pourrait donc être:

-                ftp://ftp.gnu.org/gnu
Europe/Paris     ftp://mirror.cict.fr/gnu
Europe/Paris     ftp://ftp.cs.univ-paris8.fr/mirrors/ftp.gnu.org/gnu
Europe/Amsterdam ftp://ftp.mirror.nl/pub/mirror/gnu
US/Pacific       ftp://mirrors.kernel.org/gnu
US/Pacific       ftp://ftp.keystealth.org/pub/gnu/gnu
US/Michigan      ftp://ftp.wayne.edu/pub/gnu

Fichiers de mirroirs

Tous les fichiers de mirroirs sont stockés dans un répertoire, qu’il faudra renseigner à *nmirror* en appelant une de ses fonctions. Le nom du fichier est significatif car c’est lui qui permettra de retrouver le bon fichier en fonction de l’URL passée à *nmirror*.

Tous les fichiers doivent avoir un nom en minuscules exclusivement, afin d’homogénéiser et de faciliter les définitions et reconnaissances.

L’utilisateur peut se définir un fichier personnel de définition de mirroirs par projet, afin d’activer ses préférences personnelles. nmirror utilisera ce fichier en priorité s’il existe. Le nommage est standardisé, et reprend le nom du fichier original, suivi de .user. Par exemple, pour le projet GNU, il pourra y avoir dans le répertoire les deux fichiers :

gnu
gnu.user

Algorithme de sélection des URLs d'un mirroir

La recherche des URLs d’un miroir s’effectue en trois étapes.

Pour chaque étape, des lignes du fichier correspondant au miroir sont sélectionnées. Si plusieurs lignes sont trouvées, elles sont conservées dans l’ordre défini dans le fichier.

Avant toute chose, la zone horaire de l’utilisateur est récupérée en lisant le contenu du fichier /etc/timezone.

Les trois étapes sont les suivantes :

  1. sélection des lignes qui correspondent exactement à la zone horaire
  2. sélection des lignes qui correspondent à la partie “continent” de la zone horaire
  3. sélection de toutes les lignes

Les trois sélections de lignes sont ensuite concaténées puis tronquées aux N premières lignes, N étant le nombre d’URLs dont l’outil a besoin.

Fonctions disponibles

Un premier jeu de fonctions permet de configurer le module selon ses besoins :

  • indiquer le répertoire contenant les fichiers de définitions de mirroirs
  • définir la localité préférée
  • définir la manière dont une référence à un mirroir est détectée dans une URL, avec une expression régulière (par exemple mirror:\/\/([a-z]+)\/.* pour une url de type mirror://gnu/partie-fixe-de-l-url) et un numéro indiquant quelle sous-expression correspond au nom de mirroir (ici 1 pour [a-z]+)

nmirror_set_mirrors_directory()

définit le répertoire où les fichiers de définition de mirroirs seront cherchés.

synopsys

nmirror_set_mirrors_directory <directory>

nmirror_set_url_type()

définit comment les mirroirs seront détectés dans les URLs passées. le comportement par défaut sera de détecter les URLs du type:

mirror://<mirror name>/....

synopsys

nmirror_set_url_type -e <regular expression> [-s <subexpr. number>]
  • -e <regex> expression régulière définissant la partie contenant le mirroir dans une URL. Par défaut, cette expression vaut ^mirror:\/\/([a-z]+)\/.
  • -s <subexpr. number> indique la sous-expression dans laquelle se trouve le nom du mirror. Par défault, cette valeur vaut 1 (correspondant à la sous-expression [a-z]+ de l’expression par défaut).

nmirror_get_mirror_name()

retourne le nom du mirroir dans l’URL passée.

synopsys

nmirror_get_mirror_name <url>

nmirror_get_urls()

retourne la liste des URLs correspondant au mirroir trouvé dans l’URL.

synopsys

nmirror_get_urls -u <source url> [-l <limit>] [-v <var>]
  • -u <source url> l’URL à vérifier. Si aucune référence à un mirroir n’est trouvée dans cette URL, elle est retournée telle quelle
  • -l <limit> limite le nombre d’URLs correspondantes
  • -v <var> indique la variable dans laquelle stocker le résultat. Si non spécifié, le résultat sera fait sur la sortie standard

Que le résultat se fasse dans une variable ou sur la sortie standard, il est composé de plusieurs lignes, chacune des lignes représentant une URL complète.

Autre algo pour la sélection

Le principe décrit ci-dessus peut se révéler trop limité, compte tenu du nombre important de zones horaires existantes (des dizaines par continent) et de zones horaires spéciales (Etc/GMT+1 par exemple).

Pour palier cette limitation, on peut envisager d’utiliser un fichier interne de base de donnée des localités avoisinantes :

Europe/Paris     Europe/Amsterdam Europe/Brussels Europe/Guernsey Europe/London Europe/Luxembourg Europe/Berlin
Europe/Lisbon    Europe/Madrid Europe/Gibraltar Europe/Monaco Europe/Andorra
...
Etc/GMT+1        Europe/Paris Europe/Brussels Europe/Guernsey ...
...

Voir plus bas pour la sélection.

Le gros travail est donc de définir cette base une fois (à part les éventuelles mises à jour pour correction d’erreurs ou ajouts de zones) pour toutes les zones trouvées dans /usr/share/zoneinfo.

Fonctionnement interne

Exemple pour Europe/Paris :

  • recherche dans le fichier de mirroirs les entrée correspondant à Europe/Paris
  • recherche pour chaque localité de secours dans l’odre d’arrivée les mirroirs correspondants
  • ne prend les les n premiers mirroirs sélectionné, n étant indiqué comme limite du nombre d’urls retournées

la recherche est rapide (grep), ce n’est pas pénalisant de faire une recherche sur toutes les localités de secours puis de ne prendre que les premiers mirroirs en tête de liste

 
nlib_nmirror.txt · Dernière modification: 12/11/2007 23:33 par julienl
 
Recent changes RSS feed Creative Commons License Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki