Table des matières

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 :

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 :

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 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 :

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>]

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>]

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 :

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