Créer un miroir CentOS pour les updates

Et tu sync, et tu sync, et tu wget

Hier, j'ai commencé à me dire que ça serait sympa de rendre encore plus rapide mes installations de machines virtuelles CentOS 5. Donc, avant d'attaquer le trifouillage de mes kickstarts afin d'appliquer mes configurations de manière automatique, j'en suis venu à la conclusion qu'avoir le dépôt des mises à jour en local serait plus rapide que de devoir tout récupérer sur Internet.

Donc, il me faut me synchroniser avec un miroir. Comme je suis chez Free, j'ai voulu utiliser leur miroir. Oui mais, ce n'est qu'un miroir FTP. Et la plupart des scripts de synchronisation de miroir utilisent rsync. Je me suis donc rabattu sur le miroir de l'IPSL Jussieu qui possède un mirroir http, ftp et rsync. Génial ! Quelques instants plus tard, j'adapte ce script qui donne ceci :

#!/bin/bash

#################################################################################
#                                                                               #
# CentOS mirror syncer                                                          #
# Comes from :                                                                  #
#                                                                               #
# http://lists.centos.org/pipermail/centos-mirror/2005-April/000936.html        #
# http://wiki.monserveurperso.com/wakka.php?wiki=MirroringFTP                   #
# man wget                                                                      #
#                                                                               #
#################################################################################

RSYNC=`which rsync`
RSYNC_OPTS="-aHv --delete --bwlimit=512 "
CHOWN=`which chown`
CHMOD=`which chmod`
MIRROR="rsync://distrib-coffee.ipsl.jussieu.fr/pub/linux/centos/5/updates/i386/"
LOCAL="/home/ftp/mirrors/centos/5/updates/i386/"
PIDFILE="/var/run/centosmirror.pid"

# Don't run it twice...

if [ -f "$PIDFILE" ]; then
   RUNPID=`cat $PIDFILE`
   if ps -p $RUNPID; then
      echo "CentOS Mirror is already running..."
      exit 1
   else
      echo "CentOS Mirror pid found but process dead, cleaning up"
      rm -f $PIDFILE
   fi
else
   echo "No CentOS Mirror Process Detected"
fi
echo $$ > $PIDFILE

echo -n "CentOS Mirror Started at "
date

# Download, set up rights
$RSYNC $RSYNC_OPTS $MIRROR $LOCAL
$CHOWN -R apache:apache $LOCAL
$CHMOD -R 755 $LOCAL

echo -n "CentOS Mirror Ended at "
date
rm -f $PIDFILE

Ca, c'était la version rsync. Et si on est derrière un proxy, et qu'on ne peut pas faire du rsync? Pour le moment je me suis concentré sur ftp, mais ce script devrait tourner pour http :

#!/bin/bash

#################################################################################
#                                                                               #
# CentOS mirror syncer                                                          #
# Comes from :                                                                  #
#                                                                               #
# http://lists.centos.org/pipermail/centos-mirror/2005-April/000936.html        #
# http://wiki.monserveurperso.com/wakka.php?wiki=MirroringFTP                   #
# man wget                                                                      #
#                                                                               #
#################################################################################

# Variables

WGET=`which wget`
WGET_OPTS="-m --limit-rate=512k -nH --cut-dir 5"
CHOWN=`which chown`
CHMOD=`which chmod`
MIRROR="ftp://ftp.free.fr/mirrors/ftp.centos.org/5/updates/i386/*"
LOCAL="/home/ftp/mirrors/centos/5/updates/i386/"
PIDFILE="/var/run/centosmirror.pid"

# Don't run it twice...

if [ -f "$PIDFILE" ]; then
   RUNPID=`cat $PIDFILE`
   if ps -p $RUNPID; then
      echo "CentOS Mirror is already running..."
      exit 1
   else
      echo "CentOS Mirror pid found but process dead, cleaning up"
      rm -f $PIDFILE
   fi
else
   echo "No CentOS Mirror Process Detected"
fi
echo $$ > $PIDFILE

# wget + ftp = .listing files
find $LOCAL -name ".listing" -delete

echo -n "CentOS Mirror Started at "
date

# Download, set up rights
$WGET $WGET_OPTS $MIRROR -P $LOCAL
$CHOWN -R apache:apache $LOCAL
$CHMOD -R 755 $LOCAL

echo -n "CentOS Mirror Ended at "
date
rm -f $PIDFILE
find $LOCAL -name ".listing" -delete

On remarquera que c'est grosso modo la même chose, la version wget générant des fichiers .listing pour le téléchargement récursif, je les efface avant et après coup, au cas où.Comme mon miroir est aussi dispo en http, je rend le tout accessible pour l'utilisateur apache. Ce dernier script reste cependant à améliorer, car contrairement à rsync, il n'efface pas les fichiers présents en local mais disparus du miroir distant.