Table des matières

, , , , , , ,

Créer son propre dépot Debian

Il peut être tres pratique de créer son propre dépôt Debian.

Il existe pas mal de facons de faire et je vais vous présenter ici la manière que j'utilise au quotidien : Cette méthode utilise :

Ce dépot permet une installation aisée d'un ensemble de machine car il héberge des meta-packages installant un ensemble de logiciels (peut être un jour un article la dessus).

Créer l'arborescence d'un dépot

Voici l'arborescence type de l'ensemble des depots :

./cache
./mirror/pool-lenny
./mirror/pool-lenny/custom
./mirror/pool-lenny/custom/binary-i386
./mirror/pool-lenny/custom/binary-amd64
./mirror/pool-lenny/custom/binary-all
./mirror/pool-lenny-test
./mirror/pool-lenny-test/custom
./mirror/pool-lenny-test/custom/binary-i386
./mirror/pool-lenny-test/custom/binary-amd64
./mirror/pool-lenny-test/custom/binary-all
./mirror/pool-hardy
./mirror/pool-hardy/custom
./mirror/pool-hardy/custom/binary-i386
./mirror/pool-hardy/custom/binary-amd64
./mirror/pool-hardy/custom/binary-all
./mirror/pool-hardy-test
./mirror/pool-hardy-test/custom
./mirror/pool-hardy-test/custom/binary-i386
./mirror/pool-hardy-test/custom/binary-amd64
./mirror/pool-hardy-test/custom/binary-all
./filelists
./filelists/dists
./filelists/dists/lenny
./filelists/dists/lenny-test
./filelists/dists/hardy
./filelists/dists/hardy-test

Comme on ne va pas créer cette arborescence a la main, voici un petit script permettant de créer/ajouter facilement un dépot :

#!/bin/bash
# /usr/local/sbin/create_debian_repository.sh
# cree un nouveau depot deb local
ARCHS="i386 amd64"
REPO_ROOT="/var/www/depots_deb"
MIRROR_ROOT="$REPO_ROOT/mirror/dists"
FILELISTS_DIR="$REPO_ROOT/filelists"
 
if [ $# -lt 1 ] ; then
    echo "" >&2
    echo "Usage: $0  depot section" >&2
    echo "" >&2
    echo "Cree l'arborescence nécessaire pour créer un depot avec la section souhaitée" >&2
    echo "Genere le fichier de configuration associé pour apt-ftparchive" >&2
    echo "" >&2
    exit 1
fi
 
# le premier argument specifie le depot
if [ -n "$1" ]; then
    DIST=$1
    shift
fi
 
# le deuxieme argument specifie la section
if [ -n "$1" ]; then
    SECTION=$1
    shift
fi
 
FTP_ARCHIVE_CONF_FILE="/etc/apt/apt-perso-${DIST}.conf"
 
#creation de l'arborescence
DIR=""
    for archi in $ARCHS; do
     DIR="$DIR ${FILELISTS_DIR}/dists/${DIST} $REPO_ROOT/mirror/pool-${DIST}/$SECTION/binary-${archi} $MIRROR_ROOT/$DIST/$SECTION/binary-${archi}"
    done
 
    DIR="$DIR $REPO_ROOT/mirror/pool-${DIST}/$SECTION/binary-all $MIRROR_ROOT/$DIST/$SECTION/binary-all"
 
mkdir -p $DIR
chown root:admin $DIR
chmod u=rwx,g=rwxs,o=rx,g+s $DIR
chmod g+ws $DIR
 
# generation du fichier de configuration du depot
if [ -f $FTP_ARCHIVE_CONF_FILE ]; then
    echo "Le fichier de conf $FTP_ARCHIVE_CONF_FILE existe deja : Abandon" >&2
    echo "Veuillez le compléter a la main (si vous voulez créer une nouvelle section dans un depot existant)" >&2
    echo "ou le supprimer avant de relancer ce script" >&2
    exit 1
fi
 
echo "APT::FTPArchive::Release::Origin \"Internal Repository\";" > $FTP_ARCHIVE_CONF_FILE
echo "APT::FTPArchive::Release::Label \"Internal tools\";" >> $FTP_ARCHIVE_CONF_FILE
echo "APT::FTPArchive::Release::Suite \"$DIST\";" >> $FTP_ARCHIVE_CONF_FILE
echo "APT::FTPArchive::Release::Codename \"$DIST\";" >> $FTP_ARCHIVE_CONF_FILE
echo "APT::FTPArchive::Release::Architecture \"$ARCHS\";" >> $FTP_ARCHIVE_CONF_FILE
echo "APT::FTPArchive::Release::components \"$SECTION\";" >> $FTP_ARCHIVE_CONF_FILE
echo "APT::FTPArchive::Release::Description \"Internal Repository\";" >> $FTP_ARCHIVE_CONF_FILE
echo "" >> $FTP_ARCHIVE_CONF_FILE
echo "Tree \"dists/$DIST\" {" >> $FTP_ARCHIVE_CONF_FILE
echo "        Sections \"$SECTION\";" >> $FTP_ARCHIVE_CONF_FILE
echo "        Architectures \"$ARCHS\";" >> $FTP_ARCHIVE_CONF_FILE
echo "        Directory \"pool-$DIST/\$(SECTION)/binary-\$(ARCH)\";" >> $FTP_ARCHIVE_CONF_FILE
echo "        SrcDirectory \"pool-$DIST/\$(SECTION)/source\";" >> $FTP_ARCHIVE_CONF_FILE
echo "}" >> $FTP_ARCHIVE_CONF_FILE

Il ne vous reste plus qu'a poser les paquets .deb dans le repertoire pool-$DIST/$(SECTION)/binary-$(ARCH) qui convient.

Mettre a jour le depot

Pour générer l'index du dépot afin qu'il soit utilisable sur vos postes clients, voici le script de mise à jour utilisé :

#!/bin/bash
#/usr/local/bin/updateMirror.sh
# met a jour le depot debian cible passé en argument
 
DISTS="etch gutsy hardy intrepid lenny ubuntu unstable" # adapter  ala liste des depots que vous possédez
REPO_ROOT="/var/www/depots_deb"
MIRROR_ROOT="$REPO_ROOT/mirror/dists"
GPG_HOME="/root/.gnupg_depots_deb"
FILELISTS_DIR="$REPO_ROOT/filelists"
ARCH_LIST="i386 amd64 all"
 
if [ $# -lt 1 ] ; then
    echo "" >&2
    echo "Usage: $0 [ all|etch|unstable|... ] [ test ]" >&2
    echo "" >&2
    echo "Mise à jour du ou des dépots (all)  spécifié en premier argument." >&2
    echo "Un seul dépot peut-être spécifié à la fois." >&2
    echo "" >&2
    echo "Si le deuxième argument est 'test', " >&2
    echo "la mise à jour se fait sur les dépots de test" >&2
    echo "" >&2
    exit 1
fi
 
# le premier argument specifie le depot à mettre à jour
if [ -n "$1" ]; then
    ONLY_DIST=""
    tmp_sec=$1
    shift
 
    for i in ${DISTS}
    do
        if [ "X$i" = "X$tmp_sec" ]; then
            ONLY_DIST=$i
            break
        fi
    done
 
    if [ "X$tmp_sec" = "Xall" ]; then
        ONLY_DIST=${DISTS}
    fi
 
    if [ -z "${ONLY_DIST}" ]; then
        echo "ERREUR: depot invalide $tmp_sec" >&2
        exit 1
    fi
 
    DISTS=${ONLY_DIST}
fi
# depots de prod ou de test 
DIST_SUFFIX=""
if [ "X$1" == "Xtest" ]; then
    DIST_SUFFIX="-test"
    shift
fi
 
for DIST in $DISTS
do
    DIST="${DIST}${DIST_SUFFIX}"
    FTP_ARCHIVE_CONF_FILE="/etc/apt/apt-perso-${DIST}.conf"
 
    rm -f $REPO_ROOT/cache/*db
 
    # generation des filelist des depots
    cd $REPO_ROOT/mirror
    for section in `ls pool-${DIST}`
    do
        for archi in $ARCH_LIST;
        do
                if [ "x${archi}" = "xall" ]; then
                    continue
                fi
                mkdir -p ${FILELISTS_DIR}/dists/${DIST}
                echo "Section : ${section}"
                echo "Arch : ${archi}"
                FILELIST="${FILELISTS_DIR}/dists/${DIST}/${section}-${archi}.filelist"
                echo "filelist : $FILELIST"
                find pool-${DIST}/$section/binary-${archi} pool-${DIST}/$section/binary-all -name "*.deb" > \
                    ${FILELISTS_DIR}/dists/${DIST}/${section}-${archi}.filelist
        done
 
    done
    echo "generation apt ftp archive :"
        apt-ftparchive generate ${FTP_ARCHIVE_CONF_FILE}
    echo "creation du fichier Release :"
        # creation des fichiers Release
        RELEASE_FILE="${MIRROR_ROOT}/${DIST}/Release"
        apt-ftparchive -c $FTP_ARCHIVE_CONF_FILE release \
            ${MIRROR_ROOT}/${DIST}/ > $RELEASE_FILE
 
        # signature gpg des fichiers Release
     rm -f $RELEASE_FILE.gpg
     ${DEBUG} gpg --verbose --homedir ${GPG_HOME} -ba \
         --output $RELEASE_FILE.gpg $RELEASE_FILE
done

Configuration du virtualhost apache

Pour utiliser ce dépot le plus simple est de le servir en http via un serveur Web (apache2 dans notre cas). Voici un exemple de fichier de VirtualHost apache2 (fichier : /etc/apache2/sites-available/debtools.domaine.interne ) :

# /etc/apache2/sites-available/debtools.domaine.interne
<VirtualHost *>
        ServerAdmin admin@mondomaine.com
        ServerName debtools.domaine.interne
        ServerAlias debtools

        DocumentRoot   /var/www/depots_deb/mirror/

        ErrorLog /var/log/apache2/depots_deb_error.log
        TransferLog /var/log/apache2/depots_deb_access.log

        <Directory /var/www/depots_deb/mirror/>
                AllowOverride AuthConfig
                Options Indexes FollowSymLinks MultiViews

                order deny,allow
                allow from all
        </Directory>
</VirtualHost>

Utilisation coté client

Il suffit d'ajouter la ligne correspondante a la distribution dans votre fichier /etc/apt/sources.list (ou créer un nouveau fichier dans le repertoire /etc/apt/sources.list.d/ ), par exemple pour lenny :

cat << EOF >> /etc/apt/sources.list
deb http://debtools.domaine.interne lenny custom
EOF