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.
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 :
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
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
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 :
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.
Un premier jeu de fonctions permet de configurer le module selon ses besoins :
définit le répertoire où les fichiers de définition de mirroirs seront cherchés.
nmirror_set_mirrors_directory <directory>
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>/....
nmirror_set_url_type -e <regular expression> [-s <subexpr. number>]
retourne le nom du mirroir dans l’URL passée.
nmirror_get_mirror_name <url>
retourne la liste des URLs correspondant au mirroir trouvé dans l’URL.
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.
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.
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