Accueil > Linux & Logiciels Libres > Script bash Linux de téléchargement de dépôt
1540 visites

Script bash Linux de téléchargement de dépôt

samedi 31 janvier 2015 (), par Vader[FR]

Devant gérer et mettre régulièrement un jour un serveur ne pouvant accéder à internet (à cause d’un proxy), j’utilisais la méthode de mise à jour sans internet.

Cependant, avec les nouveaux dépôts où les paquets sont regroupés par leur première lettre, il faut télécharger et éditer une trentaine de liste à chaque fois.

J’ai donc automatisé une partie de la procédure, à savoir le téléchargement des paquets, et ce de manière assez simple pour commencer, à l’aide d’un script bash Linux.
A partir de l’index du dépôt, il peut parcourir les répertoires et télécharger les fichiers.

Ce script est conçu pour les dépôts RedHat, et plus particulièrement Fedora.
Mais il devrait être facilement adaptable pour les autres distributions.

Il ne gère pas les listes de miroirs, du moins pour l’instant.

Son fonctionnement est donc pour le moment assez simple :

  • on télécharge d’abord, depuis une machine ayant accès à internet, l’index d’un dépôt, selon ce qui est mis en baseurl du fichier de configuration du dépôt dans /etc/yum.repos.d [1] sur le serveur.
    • il est préférable d’utiliser l’utilitaire wget afin de ne pas avoir les fichiers auxiliaires (images, etc) et de renommer le fichier.
    • la ligne de commande ressemblera donc à wget -O depart -c http://.........
    • ici, le fichier créé se nommera "depart"
  • ensuite, il faut ajouter dans ce fichier une ligne contenant l’adresse à laquelle il correspond, c’est à dire là où il a été téléchargé.
    • cette adresse servira de base pour les urls contenues dans le fichier
    • on peut utiliser la commande echo, ce qui donnera quelque chose comme : echo "adresse_actuelle=http://......." >> depart.
    • En effet, le script lira dans ce fichier (et les suivants) la variable "adresse_actuelle".
  • puis il suffit de lancer le script sur le fichier de départ : ./dl_depot.sh depart [2]
    • le script commencera donc par récupérer l’adresse du dépôt, puis lira le fichier ligne par ligne
    • si la ligne concerne un paquet rpm, il le téléchargera en rajoutant le nom du fichier paquet rpm lu à l’adresse du dépôt.
    • si la ligne concerne un répertoire, qui n’est pas le "Parent Directory" (répertoire parent), il téléchargera l’index du répertoire dans un fichier portant son nom, y ajoutera la ligne "adresse_actuelle=..." et lancera le script sur ce nouveau fichier, afin de le parcourir, ce après quoi il effacera le fichier portant le nom du répertoire.
  • une fois tous les paquets téléchargés, on peut vérifier que tout s’est bien passé via le fichier journal créé, copier les fichiers rpm sur le serveur ou une machine du réseau du serveur, créer le dépôt, le configurer sur le serveur, et faire les mises à jour/installations.

Pour des raisons de simplicité, ce script téléchargera donc tous les fichiers rpm du dépôt dans le même répertoire.

#!/bin/bash
fichier=$1
# le fichier indiqué en paramètre doit contenir une ligne :
# adresse_actuelle=http://....... correspondant à l'adresse où a été téléchargé le fichier
# pour le fichier de départ, c'est à faire manuellement après le wget
# pour les fichiers suivants, c'est fait automatiquement par le script
echo "================================= traitement de $fichier ==========================================" | tee -a info_dl_depot.log;
adresse_actuelle=$(grep -i adresse_actuelle $fichier | awk -F \= '{ print $2 }');
echo "l'adresse actuelle est $adresse_actuelle" | tee -a info_dl_depot.log;
while read ligne 
do
	cible=$(echo $ligne | grep -i href | wc -l)
	if [ $cible -gt 0 ] 
	then
		# rpm
		ciblerpm=$(echo $ligne | grep -i ".rpm" | wc -l)
		if [ $ciblerpm -gt 0 ] 
		then
			addciblerpm=$(echo $ligne | awk -F href\=\" '{ print $2 }' | awk -F \" '{ print $1 }');
			addciblerpmt=$adresse_actuelle$addciblerpm;
			echo "On télécharge $addciblerpmt" | tee -a info_dl_depot.log;
			wget -nv -c -a info_dl_depot.log $addciblerpmt;
		fi
		# dossier, non parent
		cibledir=$(echo $ligne | grep -i "alt=\"\[DIR\]\"" | grep -v "Parent Directory" | wc -l);
		if [ $cibledir -gt 0 ] 
		then
			addcibledir=$(echo $ligne | awk -F href\=\" '{ print $2 }' | awk -F \" '{ print $1 }');
			addcibledirt=$adresse_actuelle$addcibledir;
			nomdir="dir_"$(echo $addcibledir | awk -F \/ '{ print $1 }');
			echo "On télécharge $addcibledirt, index de $nomdir" | tee -a info_dl_depot.log;
			wget -nv -c -a info_dl_depot.log -O $nomdir $addcibledirt;
			echo "adresse_actuelle=$addcibledirt" >> $nomdir;
			./dl_depot.sh $nomdir;
			rm -f $nomdir;
		fi
	fi
done < $fichier

On peut bien sûr imaginer quelque chose de plus sophistiqué ; ce script pourrait être lancé par un autre, qui lirait une liste de dépôts ou même de miroirs (nom + adresse de base + type miroir/dépôt) dans un fichier ou une BDD, avec éventuellement une arborescence de type :

  • Fedora
    • 20
      • x86_64,
      • i386
      • updates
        • x86_64
        • i386

Il se déplacerait dans le répertoire où mettre les fichiers téléchargés (à créer si besoin), et lancerait le script avec son adresse absolue - il faudrait alors modifier le script actuel, ou modifier les wgets pour y envoyer directement les paquets
On pourrait aussi rajouter des filtres pour ne pas télécharger certains paquets (par exemple les jeux comme astromenace, vegastrike...ou les fichiers de langue) qui ne sont pas indispensables sur un serveur, allongent considérablement (par leur taille) la durée du téléchargement, et prennent une place non négligeable sur le disque.

Script bash Linux de téléchargement de dépôt

Notes

[1pour la famille redhat

[2le script se nomme dl_depot.sh. si vous changez le nom du script, changez l’appel ./dl_depot.sh $nomdir; dans le bloc if [ $cibledir -gt 0 ]

Répondre à cet article

Total 398684 visites depuis 4471 jours | | SPIP | | Plan du site | Suivre la vie du site RSS 2.0
()