samedi 31 janvier 2015 (), par
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 :
baseurl
du fichier de configuration du dépôt dans /etc/yum.repos.d
[1] sur le serveur.
wget
afin de ne pas avoir les fichiers auxiliaires (images, etc) et de renommer le fichier.wget -O depart -c http://.........
echo
, ce qui donnera quelque chose comme : echo "adresse_actuelle=http://......." >> depart
../dl_depot.sh depart
[2]
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 :
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.
[1] pour la famille redhat
[2] le 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 ]