Modifications entre les versions 1 et 9 (s'étendant sur 8 versions)
Version 1 à la date du 2007-09-06 20:14:22
Taille: 1569
Commentaire: hop, premier jet...
Version 9 à la date du 2008-01-16 16:22:45
Taille: 8576
Éditeur: ThomasNoël
Commentaire: clarifications, tions...
Texte supprimé. Texte ajouté.
Ligne 1: Ligne 1:
Cette page présente un projet de dépôt de paquets Debian/Ubuntu (au moins) accessible aisément via le système de gestion de paquets APT.
Ligne 3: Ligne 2:
== Stratégie ==
 * création d'un nom DNS `apt.auf.org` dirigé dans un premier temps vers `apt.vn.auf.org` ''=> fait le 06/09/2007''
 * mise en place d'un dépôt `apt.vn.auf.org` (au BAP, Vietnam) géré par ProgFou '''=> septembre 2007'''
 * test de ce dépôt à l'échelle de l'ensemble des machines du Bureau Asie-Pacifique ''=> octobre 2007''
 * test de ce dépôt à l'échelle de l'ensemble des machines de la région Asie-Pacifique ''=> décembre 2007''
 * déplacement de ce dépôt sur un serveur à Montréal (ou Paris, ou mieux : les deux en miroir rsync) ''=> janvier 2008''
Cette page présente le dépôt de paquets Debian/Ubuntu spécifiques à l'AUF.
Ligne 10: Ligne 4:
== Mise en place ==
 * création d'un serveur virtuel web `apt.vn.auf.org`
 * création de dossiers par distribution (objectifs différents pour Debian et Ubuntu)
 * création de compte utilisateurs avec accès sftp (très peu au début, plus ouvert ensuite)
  * les utilisateurs déposeront leurs paquets via leurs comptes
  * la signature des paquets sera ensuite vérifiée
  * puis les paquets seront transférés vers l'arborescence du dépôt
 * mise en place des clés SSH et GPG des utilisateurs
 * création d'une ''keyring'' (liste de clés) des utilisateurs
 * mise en place d'une technique de mise à jour des infos du dépôt :
  * faire un comparatif entre `apt-ftparchive` (que j'utilise déjà), `debarchiver` et `mini-dinstall`
  * mise en place d'une technique de signature de l'archive via GPG
## ajouter un blabla ici pour dire à quoi ça sert/servira, etc...

 ||<#ffaa00> Il s'agit d'un système en cours de mise en place, ne pas utiliser pour l'instant merci !||

= Accès aux paquets disponibles =

== Ajout de la clé GPG utilisée pour signer le dépôt ==

Il faut d'abord installer la clé publique GPG qui signe ce dépôt[[FootNote(et ça ajoute aussi la clé de celui de Dakar, en cadeau)]].

 . Ajouter dans le `sources.list` le dépôt AUF concernant votre distribution :
 {{{# à ajouter dans /etc/apt/sources.list (ou créer un /etc/apt/sources.list.d/auf)
# remplacer distrib par etch, lenny, feisty, gutsy, hardy, ... selon votre système.
deb http://apt.auf.org/ distrib auf
}}}
 . Puis installer le paquet `auf-keyring` :
 {{{
# aptitude update
# aptitude install auf-keyring}}}
 . Puisqu'avant cette installation vous n'aviez pas encore la clé dans votre système, ''aptitude'' va vous demander de confirmer l'installation car il ne juge pas la source "sûre". Confirmez l'installation, la clé sera ajoutée et ''aptitude'' fera désormais confiance au dépôt AUF[[FootNote(On peut aussi faire "{{{wget -qO - http://apt.auf.org/auf-keyring.gpg | sudo apt-key add -}}}". C'est un peu plus rapide, mais ça ne mettra pas à jour automatiquement les clés AUF si on en ajoute dans le paquet auf-keyring.)]].

== Configuration des sources de paquets (sources.list) ==
Ensuite ajouter les sources qui vous conviennent en fonction de ce que vous avez à mettre en place. Les lignes à ajouter dans le `sources.list` sont de la forme :
 {{{
deb http://apt.auf.org/ distribution composant
}}}
Exemples (non fonctionnels à l'heure de la rédaction) :
 {{{
# paquets pour la mise en place d'un serveur VoIP Asterisk AUF :
deb http://apt.auf.org/ etch voip
# paquets spécifiques à Dakar pour les postes clients Ubuntu Feisty :
deb http://apt.auf.org/ feisty sn
}}}

= Pour ajouter ses petits paquets dans le dépôt =

Il faut :
 * savoir faire des beaux paquets Debian : `dpkg-buildpackage`, `dh-make`, retroportages, ...
 * savoir à quelle distribution sont destinés les paquets : etch, lenny, feisty, gutsy, hardy, ...
 * trouver un nom pour le composant : voip, rpv2, auf-desktop, votre-iso-pays, votre-nom, ...
 * avoir un compte ''ssh'' sur la machine `apt.auf.org` (demander à Moussa)
 * avoir un répertoire (''incoming'' ou tout autre nom poétique) configuré pour recevoir les paquets (fichiers changes, deb, dsc et sources)

Pour envoyer un paquet, on utilise '''dput''' (`aptitude install dput`) que l'on configure ainsi (dans `~/.dput.cf`) :
 {{{
# extrait de ~/.dput.cf (inspiré de /etc/dput.cf) :
[DEFAULT]
method = rsync
hash = md5
allow_unsigned_uploads = 0
run_lintian = 0
run_dinstall = 0
check_version = 0
default_host_main = voip
fqdn = apt.auf.org

# par défaut on envoie ici :
[voip]
incoming = ~/incoming/voip

# mais on peut aussi envoyer ici (en ajoutant voip-test après dput) :
[voip-test]
incoming = ~/incoming/voip-test
}}}

Pour envoyer un paquet il suffit de faire :
 {{{
$ dput nom-du-paquet.changes
}}}

Si tout va bien le paquet sera ajouté dans le dépôt 5 minutes plus tard. Sinon un courriel sera envoyé à qui de droit, qui vous informera de la fin de votre contrat à l'AUF.

= Comment ça marche à l'intérieur =

attachment:reprepro-apt-auf-org.png

Le système est basé sur [http://mirrorer.alioth.debian.org/ reprepro] ([http://packages.debian.org/etch/reprepro version etch]). C'est ce logiciel qui gère le dépot : on lui dit quel paquet ajouter à quel composant de quelle distribution, et il gère le pool, les fichiers Release, Packages, Sources, etc. A côté, un serveur ''apache2'' propose le dépôt en HTTP.

Le principe : il y a un utilisateur virtuel "reprepro" sur le système, qui gère le dépôts. C'est cet utilisateur qui va lancer le logiciel "reprepro" avec les bons arguments, régulièrement (via cron).

 * `/srv/www/apt.auf.org/pool` et `.../dists` : le dépôt lui-même
 * `~reprepro/conf/` : configuration de reprepro, voir `man reprepro` pour explication :
 * `~reprepro/db/` : contient les bases de données internes de reprepro

Un script lance le logiciel reprepro en lui disant d'aller chercher les paquets de tel composant pour telle distribution dans tel répertoire. La liste de ces triplets est dans `~reprepro/incomings` :
 {{{
# (... extrait de ~reprepro/incomings ...)
# voip : la config AUF d'asterisk 1.2 pour etch
etch voip /home/thomas/voip
# voip-test : backport de asterisk 1.4 en cours
etch voip-test /home/thomas/voip-test
}}}

Le script (version du 15 janvier 22h TU) :
 {{{$ cat ~reprepro/reprepro-incoming
#!/bin/bash

# reprepro-incoming <dist> <component> [<repertoire>]
# - se place dans le repertoire indiqué, y regarde les fichiers .changes
# - pour chaque fichier .change, analyse si les fichiers correspondants sont présents
# (pour le cas d'un upload en cours)
# - si oui, envoie les paquets dans le dépot, sur la distrib et selon le composant indiqué
# La configuration est dans /etc/reprepro/options et /etc/reprepro/distributions (cf man reprepro)
# Exemple :
# $ reprepro-incoming etch voip /home/thomas/voip/

# Note : reprepro-incoming est destiné à tourner en cron, il ne dit rien s'il
# n'a rien à faire. Exemple de configuration en cron :
# */5 * * * * reprepro cd /home/reprepro && ./reprepro-incoming
# Attention, reprepro ne gère sans doute pas les accès concurrents à un même dépôt !

# Note : si on lance "reprepro-incoming" sans argument, il va lire le fichier ~/incomings
# qui contient un triplet "<dist> <component> [<repertoire>]" par ligne. r-i se lance
# alors autant de fois que de ligne, avec ces arguments à chaque fois... Ces lancements
# séquentiels évitent d'avoir à ce soucier des accès concurrents...
if [ $# -eq 0 -a -r ~/incomings ]; then
        sed '/^\s*#/d;/^\s*$/d' ~/incomings | while read ARGS; do
                ~/reprepro-incoming $ARGS # le script s'appelle lui-même ici
                if [ $? -ne 0 ]; then
                        echo " ^^ erreur lors de $0 $ARGS ^^ "
                        echo ""
                fi
        done
        exit 0
fi

if [ $# -lt 2 ]; then
        echo "syntaxe: $0 distribution component [repertoire]" >&2
        exit 1
fi
DISTRIB=${1}
COMPONENT=${2}

# s'il existe un 3ème argument c'est un repertoire, on va dedans
if [ -n "${3}" ]; then
        cd "${3}" || exit 2
fi

# pas de fichier .changes : on s'arrete ici (silencieusement car ça peut être normal)
ls *.changes > /dev/null 2>&1 || exit 0

export REPREPRO_CONFIG_DIR=${REPREPRO_CONFIG_DIR:-~/conf}

# on analyse chaque fichier changes
for fc in *.changes; do
        # les md5sum sont-ils ok ?
        sed '0,/^Files:\s*$/d' ${fc} | while read MD5 SIZE SECT PRIO FILE; do
                echo $MD5" "$FILE
        done | md5sum --check --status > /dev/null 2>&1
        if [ $? -ne 0 ]; then
                echo "warn: fichier ${fc}, echec de la verification des sommes md5"
                sed '0,/^Files:\s*$/d' ${fc} | while read MD5 SIZE SECT PRIO FILE; do
                        echo $MD5" "$FILE
                done | md5sum --check
                # md5 pas bon : on passe au .change suivant
                continue
        fi
        echo "traitement de ${fc} :"
        echo "$ reprepro --component $COMPONENT include $DISTRIB $fc"
        # on envoie dans le dépôt (et si ça passe pas, on va pas plus loin !)
        reprepro -V --component $COMPONENT include $DISTRIB $fc || exit 3
        # et on efface les fichiers, ils sont dans le pool maintenant
        sed '0,/^Files:\s*$/d' ${fc} | while read MD5 SIZE SECT PRIO FILE; do
                rm -f $FILE
        done
        rm -f ${fc}
        echo ""
done
}}}

= Il reste à faire =

 * tester un peu plus !... et mettre en place le cron... et dire que "ça marche" ;)
 * envoi d'un courriel à l'auteur quand un reprepro a eu lieu sur un repertoire donné (ajout d'un champ mail dans ~reprepro/incomings), avec rapport d'erreur le cas échéant
 * regarder le [http://packages.debian.org/etch-backports/reprepro backport de reprepro] et notamment son "processincoming"

------
Notes de bas de page :

Cette page présente le dépôt de paquets Debian/Ubuntu spécifiques à l'AUF.

  • Il s'agit d'un système en cours de mise en place, ne pas utiliser pour l'instant merci !

Accès aux paquets disponibles

Ajout de la clé GPG utilisée pour signer le dépôt

Il faut d'abord installer la clé publique GPG qui signe ce dépôtFootNote(et ça ajoute aussi la clé de celui de Dakar, en cadeau).

  • Ajouter dans le sources.list le dépôt AUF concernant votre distribution : {{{# à ajouter dans /etc/apt/sources.list (ou créer un /etc/apt/sources.list.d/auf)

# remplacer distrib par etch, lenny, feisty, gutsy, hardy, ... selon votre système. deb http://apt.auf.org/ distrib auf }}}

Configuration des sources de paquets (sources.list)

Ensuite ajouter les sources qui vous conviennent en fonction de ce que vous avez à mettre en place. Les lignes à ajouter dans le sources.list sont de la forme :

  • deb http://apt.auf.org/ distribution composant

Exemples (non fonctionnels à l'heure de la rédaction) :

  • # paquets pour la mise en place d'un serveur VoIP Asterisk AUF :
    deb http://apt.auf.org/ etch voip
    # paquets spécifiques à Dakar pour les postes clients Ubuntu Feisty :
    deb http://apt.auf.org/ feisty sn

Pour ajouter ses petits paquets dans le dépôt

Il faut :

  • savoir faire des beaux paquets Debian : dpkg-buildpackage, dh-make, retroportages, ...

  • savoir à quelle distribution sont destinés les paquets : etch, lenny, feisty, gutsy, hardy, ...
  • trouver un nom pour le composant : voip, rpv2, auf-desktop, votre-iso-pays, votre-nom, ...
  • avoir un compte ssh sur la machine apt.auf.org (demander à Moussa)

  • avoir un répertoire (incoming ou tout autre nom poétique) configuré pour recevoir les paquets (fichiers changes, deb, dsc et sources)

Pour envoyer un paquet, on utilise dput (aptitude install dput) que l'on configure ainsi (dans ~/.dput.cf) :

  • # extrait de ~/.dput.cf (inspiré de /etc/dput.cf) :
    [DEFAULT]
    method                  = rsync
    hash                    = md5
    allow_unsigned_uploads  = 0
    run_lintian             = 0
    run_dinstall            = 0
    check_version           = 0
    default_host_main       = voip
    fqdn                    = apt.auf.org
    
    # par défaut on envoie ici :
    [voip]
    incoming                = ~/incoming/voip
    
    # mais on peut aussi envoyer ici (en ajoutant voip-test après dput) :
    [voip-test]
    incoming                = ~/incoming/voip-test

Pour envoyer un paquet il suffit de faire :

  • $ dput nom-du-paquet.changes

Si tout va bien le paquet sera ajouté dans le dépôt 5 minutes plus tard. Sinon un courriel sera envoyé à qui de droit, qui vous informera de la fin de votre contrat à l'AUF.

Comment ça marche à l'intérieur

attachment:reprepro-apt-auf-org.png

Le système est basé sur [http://mirrorer.alioth.debian.org/ reprepro] ([http://packages.debian.org/etch/reprepro version etch]). C'est ce logiciel qui gère le dépot : on lui dit quel paquet ajouter à quel composant de quelle distribution, et il gère le pool, les fichiers Release, Packages, Sources, etc. A côté, un serveur apache2 propose le dépôt en HTTP.

Le principe : il y a un utilisateur virtuel "reprepro" sur le système, qui gère le dépôts. C'est cet utilisateur qui va lancer le logiciel "reprepro" avec les bons arguments, régulièrement (via cron).

  • /srv/www/apt.auf.org/pool et .../dists : le dépôt lui-même

  • ~reprepro/conf/ : configuration de reprepro, voir man reprepro pour explication :

  • ~reprepro/db/ : contient les bases de données internes de reprepro

Un script lance le logiciel reprepro en lui disant d'aller chercher les paquets de tel composant pour telle distribution dans tel répertoire. La liste de ces triplets est dans ~reprepro/incomings :

  • # (... extrait de ~reprepro/incomings ...)
    # voip : la config AUF d'asterisk 1.2 pour etch
    etch voip /home/thomas/voip
    # voip-test : backport de asterisk 1.4 en cours
    etch voip-test /home/thomas/voip-test

Le script (version du 15 janvier 22h TU) :

  • {{{$ cat ~reprepro/reprepro-incoming

#!/bin/bash

# reprepro-incoming <dist> <component> [<repertoire>] # - se place dans le repertoire indiqué, y regarde les fichiers .changes # - pour chaque fichier .change, analyse si les fichiers correspondants sont présents # (pour le cas d'un upload en cours) # - si oui, envoie les paquets dans le dépot, sur la distrib et selon le composant indiqué # La configuration est dans /etc/reprepro/options et /etc/reprepro/distributions (cf man reprepro) # Exemple : # $ reprepro-incoming etch voip /home/thomas/voip/

# Note : reprepro-incoming est destiné à tourner en cron, il ne dit rien s'il # n'a rien à faire. Exemple de configuration en cron : # */5 * * * * reprepro cd /home/reprepro && ./reprepro-incoming # Attention, reprepro ne gère sans doute pas les accès concurrents à un même dépôt !

# Note : si on lance "reprepro-incoming" sans argument, il va lire le fichier ~/incomings # qui contient un triplet "<dist> <component> [<repertoire>]" par ligne. r-i se lance # alors autant de fois que de ligne, avec ces arguments à chaque fois... Ces lancements # séquentiels évitent d'avoir à ce soucier des accès concurrents... if [ $# -eq 0 -a -r ~/incomings ]; then

  • sed '/\s*#/d;/\s*$/d' ~/incomings | while read ARGS; do

    • ~/reprepro-incoming $ARGS # le script s'appelle lui-même ici if [ $? -ne 0 ]; then
      • echo " erreur lors de $0 $ARGS " echo ""

      fi
    done exit 0

fi

if [ $# -lt 2 ]; then

  • echo "syntaxe: $0 distribution component [repertoire]" >&2 exit 1

fi DISTRIB=${1} COMPONENT=${2}

# s'il existe un 3ème argument c'est un repertoire, on va dedans if [ -n "${3}" ]; then

  • cd "${3}" || exit 2

fi

# pas de fichier .changes : on s'arrete ici (silencieusement car ça peut être normal) ls *.changes > /dev/null 2>&1 || exit 0

export REPREPRO_CONFIG_DIR=${REPREPRO_CONFIG_DIR:-~/conf}

# on analyse chaque fichier changes for fc in *.changes; do

  • # les md5sum sont-ils ok ?

    sed '0,/^Files:\s*$/d' ${fc} | while read MD5 SIZE SECT PRIO FILE; do

    • echo $MD5" "$FILE

    done | md5sum --check --status > /dev/null 2>&1 if [ $? -ne 0 ]; then

    • echo "warn: fichier ${fc}, echec de la verification des sommes md5"

      sed '0,/^Files:\s*$/d' ${fc} | while read MD5 SIZE SECT PRIO FILE; do

      • echo $MD5" "$FILE
      done | md5sum --check # md5 pas bon : on passe au .change suivant continue
    fi echo "traitement de ${fc} :" echo "$ reprepro --component $COMPONENT include $DISTRIB $fc" # on envoie dans le dépôt (et si ça passe pas, on va pas plus loin !)

    reprepro -V --component $COMPONENT include $DISTRIB $fc || exit 3 # et on efface les fichiers, ils sont dans le pool maintenant sed '0,/^Files:\s*$/d' ${fc} | while read MD5 SIZE SECT PRIO FILE; do

    • rm -f $FILE
    done rm -f ${fc} echo ""

done }}}

Il reste à faire

  • tester un peu plus !... et mettre en place le cron... et dire que "ça marche" ;)

  • envoi d'un courriel à l'auteur quand un reprepro a eu lieu sur un repertoire donné (ajout d'un champ mail dans ~reprepro/incomings), avec rapport d'erreur le cas échéant
  • regarder le [http://packages.debian.org/etch-backports/reprepro backport de reprepro] et notamment son "processincoming"


Notes de bas de page :

DépôtAPT/EnvoyerSesPaquets (dernière édition le 2011-03-11 03:14:48 par JeanChristopheAndré)