Samba » Historique » Version 31
Version 30 (Joël Cuissinat, 12/04/2019 17:40) → Version 31/69 (Joël Cuissinat, 12/04/2019 17:50)
h1. Compilation de Samba
{{toc}}
h2. État des lieux
Lors de la rédaction de cet article, la version de samba sur EOLE 2.7.0 et 2.7.1 (bionic) était la 4.9.2 et le but était de passer en 4.9.5 (compilée par "Debian":https://packages.debian.org/sid/samba) avec les patches (CVE) de la "4.9.6":https://www.samba.org/samba/history/samba-4.9.6.html.
Ceci tout en conservant nos deux patches actuels :
* 0035-workaround-bug-when-demoting-RODC.patch
* 0036-dlz-bind-zone-transfer-restriction.patch
h2. Dépôts Samba
https://dev-eole.ac-dijon.fr/projects/samba/repository
Sur la forge EOLE, on retrouve le dépôt samba ainsi que des dépôts pour chacune les librairies associées :
* cmocka
* ldb
* talloc
* tdb
* tevent
h3. Dépôts distants
Pour Samba, plusieurs dépôts sont disponibles.
Il est recommandé de commencer par cloner le dépôt Debian (salsa) afin que la branche master pointe vers celui-ci puis de déclarer les autres dépôts distants :
<pre>
git clone https://salsa.debian.org/samba-team/samba.git
cd samba
git remote add dev-eole https://dev-eole.ac-dijon.fr/git/samba.git
git remote add samba https://git.samba.org/samba.git
</pre>
Une fois ces opérations réalisées, on doit obtenir la configuration suivante :
<pre>
# git remote -v
dev-eole ssh://git@dev-eole.ac-dijon.fr/samba.git (fetch)
dev-eole ssh://git@dev-eole.ac-dijon.fr/samba.git (push)
origin https://salsa.debian.org/samba-team/samba.git (fetch)
origin https://salsa.debian.org/samba-team/samba.git (push)
samba https://git.samba.org/samba.git (fetch)
samba https://git.samba.org/samba.git (push)
</pre>
NB : Le dépôt officiel de Samba n'a pas été utilisé dans les manipulation réalisées ce jour ;)
h3. Branches distantes
Les branches que nous utilisons sont les suivantes :
* @master@ : branche de packaging Debian
* @upstream_4.9@ : sources samba-4.9 importées par Debian (NB : dans cette branche les patches sont déjà appliqués)
* @pristine-tar@ : upstream tarball au format "pristine"
* @dist/eole/2.7.0/master@ : branche de packaging EOLE (NB : dans cette branche les patches sont déjà appliqués)
NB1 : Pour forcer l'utilisation du dépôt "origin" pour la branche @pristine-tar@, la commande suivante pourra être utilisée :
<pre>
git checkout -b pristine-tar origin/pristine-tar
</pre>
NB2 : Pour d'obtenir (checkout) la branche @dist/eole/2.7.0/master@, il faut au préalable avoir exécuté :
<pre>
git fetch dev-eole
</pre>
h2. Préparer le paquet
h3. Fusionner les modifications
Pour commencer, mettre toutes les branches à jour :
<pre>
git pull
</pre>
À titre informatif, il est possible de lister tous les commits ajoutés depuis le dernier paquet EOLE à l'aide des tags (exemple) :
<pre>
git log debian/2%4.9.2+dfsg-2-8-ga9af810f873..debian/2%4.9.5+dfsg-3
</pre>
Se positionner sur la branche de packaging EOLE et fusionner le tag souhaité (le dernier en général) :
<pre>
git checkout dist/eole/2.7.0/master
git merge debian/2%4.9.5+dfsg-3
</pre>
Cela entraîne généralement quelques conflits mais pas trop complexes :
* @debian/changelog@: move EOLE entries at the proper place in history
* @debian/patches/series@: keep EOLE/MTES patches
NB : dans notre exemple la lecture du changelog Debian a montré que les patches de sécurité (CVE) samba-4.9.6 étaient déjà appliqués sur la version 4.9.5 packagée par Debian.
h3. Vérifier/Corriger les dépendances
Pour vérifier les dépendances de compilation, il est possible d'utiliser la commande indiquée dans le fichier README.sources :
<pre>
grep ^VERSION lib/{talloc,tdb,tevent,ldb}/wscript
</pre>
Mais il faut également analyser en détail les versions (et les noms) des paquets mentionnés dans la section @Build-Depends@ du fichier @debian/control@.
Les pièges sont nombreux comme des noms de paquets différents entre Debian et Ubuntu (ex : libglusterfs-dev), des paquest re-numérotés avec le mot clé "really" (ex : ldb), ...
Ceci dit, si on en rate, on s'en apercevra très vite dans les étapes qui suivent ;)
NB : La bionic est en retard sur la @Standards-Version@ requise mais ce n'est pas bloquant.
h3. Valider les modifications
Une fois qu'on a réglé les conflits et que le fichier @debian/control@ nous semble correct, il est possible de réaliser un commit pour finaliser le merge.
Il est conseillé de vérifier toutes les modifications à l'aide de la commande suivante :
<pre>
git diff HEAD~..HEAD
</pre>
Si l'on est satisfait, on ajoute une nouvelle entrée dans le changelog avec le numéro de version souhaité et on commite.
Puis exporter le "upstream tarball" (nécessite le paquet @git-buildpackage@) :
<pre>
gbp export-orig
</pre>
Cela crée une archive au format @tar.xz@ (exemple : @samba_4.9.5+dfsg.orig.tar.xz@)
NB : comme par hasard, ça plante sous bionic (@XD3_INVALID_INPUT@) mais fonctionne sous Debian !
h2. Compilation du paquet samba
h3. Préparation du serveur de compilation
Pour compiler, le plus simple est d'installer un Eolebase, lui ajouter les dépôts samba-4.9 et les dépôts sources Ubuntu ainsi que le paquet build-essential :
<pre>
echo -e "deb [ arch=amd64 ] http://test-eole.ac-dijon.fr/samba samba-4.9 main\ndeb-src [ arch=amd64 ] http://test-eole.ac-dijon.fr/samba samba-4.9 main" > /etc/apt/sources.list.d/samba.list
sed -e 's/^deb/deb-src/' /etc/apt/sources.list >> /etc/apt/sources.list.d/samba.list
apt update
apt install build-essential
</pre>
Copier l'archive et sources (branche dist/eole/2.7.0/master du dépôt) :
<pre>
scp samba_4.9.5+dfsg.orig.tar.xz root@eolebase.ac-test.fr:
rsyc scp -r samba root@eolebase.ac-test.fr: #FIXME
</pre>
NB : La copie des sources (dépôt) samba via ssh entraîne une erreur de liens symboliques par la suite !
Vérifier/installer les dépendances de compilation :
<pre>
apt build-dep ./samba
</pre>
Compiler le paquet :
<pre>
cd samba
dpkg-buildpackage -sa --no-sign
</pre>
L'option @-sa@ permet d'inclure les sources. Il ne faut pas la mettre si les sources ont déjà été inclues.
L'option @--no-sign@ évite d'avoir une erreur lors de la tentative de signature des paquets ;)
h3. Signer le paquet
h3. Publier le paquet
h3. Finaliser le travail
h2. Compilation d'une librairie (exemple :ldb)
{{toc}}
h2. État des lieux
Lors de la rédaction de cet article, la version de samba sur EOLE 2.7.0 et 2.7.1 (bionic) était la 4.9.2 et le but était de passer en 4.9.5 (compilée par "Debian":https://packages.debian.org/sid/samba) avec les patches (CVE) de la "4.9.6":https://www.samba.org/samba/history/samba-4.9.6.html.
Ceci tout en conservant nos deux patches actuels :
* 0035-workaround-bug-when-demoting-RODC.patch
* 0036-dlz-bind-zone-transfer-restriction.patch
h2. Dépôts Samba
https://dev-eole.ac-dijon.fr/projects/samba/repository
Sur la forge EOLE, on retrouve le dépôt samba ainsi que des dépôts pour chacune les librairies associées :
* cmocka
* ldb
* talloc
* tdb
* tevent
h3. Dépôts distants
Pour Samba, plusieurs dépôts sont disponibles.
Il est recommandé de commencer par cloner le dépôt Debian (salsa) afin que la branche master pointe vers celui-ci puis de déclarer les autres dépôts distants :
<pre>
git clone https://salsa.debian.org/samba-team/samba.git
cd samba
git remote add dev-eole https://dev-eole.ac-dijon.fr/git/samba.git
git remote add samba https://git.samba.org/samba.git
</pre>
Une fois ces opérations réalisées, on doit obtenir la configuration suivante :
<pre>
# git remote -v
dev-eole ssh://git@dev-eole.ac-dijon.fr/samba.git (fetch)
dev-eole ssh://git@dev-eole.ac-dijon.fr/samba.git (push)
origin https://salsa.debian.org/samba-team/samba.git (fetch)
origin https://salsa.debian.org/samba-team/samba.git (push)
samba https://git.samba.org/samba.git (fetch)
samba https://git.samba.org/samba.git (push)
</pre>
NB : Le dépôt officiel de Samba n'a pas été utilisé dans les manipulation réalisées ce jour ;)
h3. Branches distantes
Les branches que nous utilisons sont les suivantes :
* @master@ : branche de packaging Debian
* @upstream_4.9@ : sources samba-4.9 importées par Debian (NB : dans cette branche les patches sont déjà appliqués)
* @pristine-tar@ : upstream tarball au format "pristine"
* @dist/eole/2.7.0/master@ : branche de packaging EOLE (NB : dans cette branche les patches sont déjà appliqués)
NB1 : Pour forcer l'utilisation du dépôt "origin" pour la branche @pristine-tar@, la commande suivante pourra être utilisée :
<pre>
git checkout -b pristine-tar origin/pristine-tar
</pre>
NB2 : Pour d'obtenir (checkout) la branche @dist/eole/2.7.0/master@, il faut au préalable avoir exécuté :
<pre>
git fetch dev-eole
</pre>
h2. Préparer le paquet
h3. Fusionner les modifications
Pour commencer, mettre toutes les branches à jour :
<pre>
git pull
</pre>
À titre informatif, il est possible de lister tous les commits ajoutés depuis le dernier paquet EOLE à l'aide des tags (exemple) :
<pre>
git log debian/2%4.9.2+dfsg-2-8-ga9af810f873..debian/2%4.9.5+dfsg-3
</pre>
Se positionner sur la branche de packaging EOLE et fusionner le tag souhaité (le dernier en général) :
<pre>
git checkout dist/eole/2.7.0/master
git merge debian/2%4.9.5+dfsg-3
</pre>
Cela entraîne généralement quelques conflits mais pas trop complexes :
* @debian/changelog@: move EOLE entries at the proper place in history
* @debian/patches/series@: keep EOLE/MTES patches
NB : dans notre exemple la lecture du changelog Debian a montré que les patches de sécurité (CVE) samba-4.9.6 étaient déjà appliqués sur la version 4.9.5 packagée par Debian.
h3. Vérifier/Corriger les dépendances
Pour vérifier les dépendances de compilation, il est possible d'utiliser la commande indiquée dans le fichier README.sources :
<pre>
grep ^VERSION lib/{talloc,tdb,tevent,ldb}/wscript
</pre>
Mais il faut également analyser en détail les versions (et les noms) des paquets mentionnés dans la section @Build-Depends@ du fichier @debian/control@.
Les pièges sont nombreux comme des noms de paquets différents entre Debian et Ubuntu (ex : libglusterfs-dev), des paquest re-numérotés avec le mot clé "really" (ex : ldb), ...
Ceci dit, si on en rate, on s'en apercevra très vite dans les étapes qui suivent ;)
NB : La bionic est en retard sur la @Standards-Version@ requise mais ce n'est pas bloquant.
h3. Valider les modifications
Une fois qu'on a réglé les conflits et que le fichier @debian/control@ nous semble correct, il est possible de réaliser un commit pour finaliser le merge.
Il est conseillé de vérifier toutes les modifications à l'aide de la commande suivante :
<pre>
git diff HEAD~..HEAD
</pre>
Si l'on est satisfait, on ajoute une nouvelle entrée dans le changelog avec le numéro de version souhaité et on commite.
Puis exporter le "upstream tarball" (nécessite le paquet @git-buildpackage@) :
<pre>
gbp export-orig
</pre>
Cela crée une archive au format @tar.xz@ (exemple : @samba_4.9.5+dfsg.orig.tar.xz@)
NB : comme par hasard, ça plante sous bionic (@XD3_INVALID_INPUT@) mais fonctionne sous Debian !
h2. Compilation du paquet samba
h3. Préparation du serveur de compilation
Pour compiler, le plus simple est d'installer un Eolebase, lui ajouter les dépôts samba-4.9 et les dépôts sources Ubuntu ainsi que le paquet build-essential :
<pre>
echo -e "deb [ arch=amd64 ] http://test-eole.ac-dijon.fr/samba samba-4.9 main\ndeb-src [ arch=amd64 ] http://test-eole.ac-dijon.fr/samba samba-4.9 main" > /etc/apt/sources.list.d/samba.list
sed -e 's/^deb/deb-src/' /etc/apt/sources.list >> /etc/apt/sources.list.d/samba.list
apt update
apt install build-essential
</pre>
Copier l'archive et sources (branche dist/eole/2.7.0/master du dépôt) :
<pre>
scp samba_4.9.5+dfsg.orig.tar.xz root@eolebase.ac-test.fr:
rsyc scp -r samba root@eolebase.ac-test.fr: #FIXME
</pre>
NB : La copie des sources (dépôt) samba via ssh entraîne une erreur de liens symboliques par la suite !
Vérifier/installer les dépendances de compilation :
<pre>
apt build-dep ./samba
</pre>
Compiler le paquet :
<pre>
cd samba
dpkg-buildpackage -sa --no-sign
</pre>
L'option @-sa@ permet d'inclure les sources. Il ne faut pas la mettre si les sources ont déjà été inclues.
L'option @--no-sign@ évite d'avoir une erreur lors de la tentative de signature des paquets ;)
h3. Signer le paquet
h3. Publier le paquet
h3. Finaliser le travail
h2. Compilation d'une librairie (exemple :ldb)