# [Howto] Server Yum pour RedHat, CentOS, SuSE...

## El_Goretto

Le but du jeu: faire héberger par une belle Gentoo svelte, propre sur elle, bien dans son corps et bien dans sa tête, toute l'infra pour que les OS à base de RPMs puissent installer leurs packages à distance (avec yum, zypper, yast, etc). Traduction: avoir un repository RPM sur son LAN.

Attention, c'est un peu brut de fonderie, mais ça a marché, et je viens de refaire une install pour vérifier que cela fonctionne:

emerge apache (vhost config file sample: http://sial.org/howto/yum/)

emerge rpm pysqlite [dépendances pour createrepo]

créer un lien: ln -s /usr/lib/python2.4/site-packages/pysqlite2/dbapi2.py /usr/lib/python2.4/site-packages/sqlite.py [ya peut être moins crado, mais "ça marche" (tm)]

installer yum-metadata-parser (from sources: http://linux.duke.edu/projects/yum/download.ptml)

installer createrepo (from sources: http://linux.duke.edu/projects/metadata/)

optionnel: écrire un script pour cron, afin de remettre à jour les metadata du repository si vous faites des modifs sur la liste de packages. Comme c'est très/trop dépendant de votre structures de fichiers où sont stockés les RPMs, je vous laisse l'écrire vous même, le mien n'est qu'un exemple.

```

#!/bin/bash

# auteur: Elgo

# version: 1.0 <11/09/07>

# version: 1.1 <??/06/08>  (prise en compte du fichier comps.xml pour supporter la selection de groupes de paquets)

# version: 2.0 <24/06/08>  (reecriture au propre avec la fonction update_repo)

# version: 3.0 <24/06/08>  (prise en charge des RedHat 5Ux et nouveau PATH d'acces aux repository RH)

# version: 4.0 <19/08/08>  (support du fonctionnement en cluster: test si le script s'execute avec l'@IP associée à linux-rep.truc.fr + modif repo_path)

# Note: les noms des repertoires des distributions RedHat doivent contenir la version sous la forme "_XUY_" ou X est la release majeur et Y la mineure

# Note2: ces repertoires doivent contenir un sous-rep nomme "full" contenant quelque part les RPMs

#    Il s'agit generalement des images ISOs des releases directement extraites.

# Note3: les RH5 fournissent deja un espace metadata pour chaque produit sur le DVD (Cluster, Server, etc), contenant le fichier comps_xxxx.xml

REPO_MNT_PT="/mnt/drivers"

REPO_PATH=""

CREA_REPO_CMD="/usr/bin/createrepo -d"

LOG_FILE="/var/log/maj_yum_repo.log"

update_repo()

{

# $1 = path du repo

# on exploite les groupes de paquets si le fichier les referencant existe

if echo "$1" | grep -q "_4U._"

then

   # RH4

   COMPS_XML_FILE=`find "$1" -name "comps*xml" -a ! -path "${1}/repodata/*"`

elif echo "$1" | grep -q "_5U._"

then

   # RH5

   COMPS_XML_FILE=`find "$1" -name "comps*xml"`

else

   COMPS_XML_FILE=""

fi

if [ -r "$COMPS_XML_FILE" ]

then

   CREA_REPO_CMD="/usr/bin/createrepo -d -g $COMPS_XML_FILE"

else

   CREA_REPO_CMD="/usr/bin/createrepo -d"

fi

# si les metadata deja presente, on update

if [ -d "${1}/repodata" ]

then

   echo "Debut de MAJ des metadata du repository [${1}]" >> $LOG_FILE

        ${CREA_REPO_CMD} --update "$1"

else

   echo "Debut de creation des metadata du repository [${1}]" >> $LOG_FILE

   ${CREA_REPO_CMD} "$1"

fi

echo "MAJ du repository [${1}] termine" >> $LOG_FILE

}

# Corps principal du Script

# vérification que le script se lance sur la machine avec l'@IP associée à linux-rep.truc.fr

IP_LINUX_REP=`nslookup linux-rep.truc.fr | grep Address | grep -v '#' | cut -d ' ' -f 2`

if ! ip a sh | grep -q "$IP_LINUX_REP"

then

   exit

fi

touch $LOG_FILE

echo "" >> $LOG_FILE

echo "Debut execution MAJ des repositories: `date +%c`" >> $LOG_FILE

echo "Remontage en RW de $REPO_MNT_PT" >> $LOG_FILE

/bin/mount -o remount,rw "$REPO_MNT_PT"

# Repositories RedHat

REPO_PATH="/var/ftp/labtech/labtech_drivers/Distrib_Linux/RedHat"

# repo RH 4Ux

for DIR in `ls -1 "$REPO_PATH" | grep "_4U._"`

do

   THIS_REPO_PATH="${REPO_PATH}/${DIR}/full"

   if [ -d "$THIS_REPO_PATH" ]

   then

      echo "Trouve un repository RH 4Ux valide dans ${THIS_REPO_PATH}" >> $LOG_FILE

      update_repo "${THIS_REPO_PATH}"

   else

      echo "Trouve un repository RH 4Ux potentiel NON valide dans ${REPO_PATH}/${DIR}" >> $LOG_FILE

   fi

done

# repo RH 5Ux

for DIR in `ls -1 "$REPO_PATH" | grep "_5U._"`

do

        if [ -d "${REPO_PATH}/${DIR}/full" ]

        then

                echo "Trouve un repository RH 5Ux valide dans ${REPO_PATH}/${DIR}/full" >> $LOG_FILE

      # seuls les sous-repertoire contenant deja un repodata comme Server,Cluster, etc sont valides

      for DIR2 in `ls -1 "${REPO_PATH}/${DIR}/full"`

      do

         THIS_REPO_PATH="${REPO_PATH}/${DIR}/full/${DIR2}"

         if [ -d "${THIS_REPO_PATH}/repodata" ]

         then

            update_repo "${THIS_REPO_PATH}"

         fi

      done

        else

                echo "Trouve un repository RH 5Ux potentiel NON valide dans ${REPO_PATH}/${DIR}" >> $LOG_FILE

        fi

done

# Repositories prive

REPO_PATH="/var/ftp/labtech/labtech_drivers/Distrib_Linux/prive"

CREA_REPO_CMD="/usr/bin/createrepo -d"

for DIR in `ls -1 "$REPO_PATH"`

do

   for ARCH in `ls -1 "$REPO_PATH/${DIR}"`

   do

      THIS_REPO_PATH="${REPO_PATH}/${DIR}/${ARCH}"

      echo "Trouve un repository dans ${THIS_REPO_PATH}" >> $LOG_FILE

      update_repo "${THIS_REPO_PATH}"

   done

done

echo "Remontage en RO de $REPO_MNT_PT" >> $LOG_FILE

/bin/mount -o remount,ro "$REPO_MNT_PT"

echo "Fin execution MAJ des repositories: `date +%c`" >> $LOG_FILE

```

----------

