Programmer un paquet logiciel pour Debian

De Analyse Développement Hacking
Sauter à la navigation Sauter à la recherche
Naviguer dans ce wiki : Accueil du wiki - Objectifs - Administrateur - Développeur - Intégrateur - Jeux - Marketing - Multimédia - Objets numériques - We make Hack
Consulter le site : Accueil du site - Annuaire - Blog - Forum - Outils - Utilisateur     Consulter le Redmine : Accueil du Redmine

Sommaire

Programmer un paquet logiciel pour Debian

Un paquet .deb est un dossier compressé qui contient les informations d’installation d'un paquet et les éléments qui seront installés sur un système reposant sur Debian.

Les systèmes reposants sur Debian


Pré-requis

Les paquets suivants sont supposés être disponibles sur la machine du développeur.
Inutile de les ajouter au champ de contrôle Depends de votre futur paquet.
build-essential
devscripts
dpkg-dev

Debian Policy : Exigences pour la distribution Debian

Le manuel Debian Policy conseille de ne pas utiliser de majuscules dans le nom du paquet. Utiliser uniquement des minuscules, des chiffres, des tirets et des underscores.
Le manuel Debian Policy décrit la politique d'exigences pour développer un paquet pour la distribution Debian.
Le manuel Debian Policy aborde également des problèmes de conception du système d'exploitation Debian.
Consulter le manuel Debian Policy en anglais : https://www.debian.org/doc/debian-policy/

Les directives de Debian concernant le logiciel libre

1- Redistribution gratuite.
2- Code source libre d'accès.
3- Œuvres dérivées autorisées.
4- Intégrité du code source de l'auteur.
5- Aucune discrimination contre des personnes ou des groupes.
6- Aucune discrimination contre les champs d'application de Debian.
7- Distribution de licence libre.
8- La licence ne doit pas être spécifique à Debian.
9- La licence ne doit pas contaminer d'autres logiciels.
10- Exemples de licences : Les licences "GPL", "BSD" et "Artistic" sont des exemples de licences considérées comme libre.
Source : https://www.debian.org/doc/debian-policy/#the-debian-free-software-guidelines

Arborescence minimaliste d'un paquet Debian

- Programme_1.0_1_all/
--- DEBIAN/
----- control
----- preinst
----- postinst
----- prerm
----- postrm
--- usr/
----- bin/
------- le_programme

Créer le .deb du programme GreeN-Project

Créer le dossier principale

Créer un dossier avec un nom au choix. Ici, Objectif-GreeN-Project_1.0.0-1_all.
Le nomm du dossier contenant le programme est de la forme : "Nom-du-projet_Version_Révision_Architecture".
Il semble que l'on puisse utiliser les majuscules et les minuscules, les "." ainsi que les "-" et les "_" pour nommer le dossier conteneur du paquet.
Pour respecter les conventions de nommage, utiliser uniquement des minuscules, les "." ainsi que les "-" et les "_" pour nommer le dossier conteneur du paquet.

Créer le sous dossier DEBIAN

Créer dans le dossier Objectif-GreeN-Project_1.0.0-1_all un dossier nommé "DEBIAN", le tout en majuscules.
Mettre le dossier "DEBIAN" en majuscule est une des normes à respecter pour créer un paquet .deb.

Créer le fichier control

Dans le dossier DEBIAN, créer un fichier nommé "control" :
touch control
Ouvrir le fichier "control" avec nano, vim ou emacs. Éviter un programme graphique comme gedit.
# Rendre le fichier "control" exécutable ne semble pas nécessaire.
# sudo chmod 755 control
Exemple minimaliste
Les quatre premières lignes sont indispensables.
Ajouter le code suivant dans le fichier "control" :
Package: green-project
Version: 1.0.0-1
Maintainer: Visionduweb <mail@visionduweb.com>
Description: Libérez les graines !
Exemple standard
Les quatre premières lignes sont indispensables, les deux lignes suivantes sont nécessaires pour un serveur de dépôt apt, les autres lignes sont facultatives.
Ajouter le code suivant dans le fichier "control" :
Package: green-project

Version: 1.0.0-1 Maintainer: Visionduweb <mail@visionduweb.com> Description: Libérez les graines ! Section: education Priority: optional Architecture: all Pre-Depends:coreutils, libtinfo5, libc6 Depends: tzdata Recommends: bash |Recommends: zsh Homepage: https://www.visionduweb.eu

Exemple avancé
Les quatre premières lignes sont indispensables, les deux lignes suivantes sont nécessaires pour un serveur de dépôt apt, les autres lignes sont facultatives.
Ajouter le code suivant dans le fichier "control" :
Package: green-project
Version: 1.0.0-1
Maintainer: Visionduweb <mail@visionduweb.com>
Description: GreeN Project - Libérez les graines - Plantez !
Section: education
Architecture: all
Essential: No
Priority: optional
Installed-Size: 1378
Origin: GNU/Linux Mint 18.3
Bugs: https://visionduweb.eu/forum
Homepage: https://www.visionduweb.eu
Tag: culture
Pre-Depends: coreutils, libtinfo5, libc6
Depends: tzdata
Suggests: 
Recommends: bash
|Recommends: zsh
Explications sur les différentes lignes du fichier control
Lignes indispensables
Package : Chaque paquet doit avoir un nom unique dans l'archive Debian.
 Utilisé pour l'installation avec la commande apt-get install nom-du-paquet.
 Le nom du paquet doit être constitué uniquement de lettres minuscules (a-z), de chiffres (0-9), de signes (+) et moins (-) et de points (.).
 Il doit comporter au moins deux caractères et commencer par un caractère alphanumérique.
 Supprimer le paquet une fois installé avec la commande sudo apt autoremove nom-du-paquet
Version : La version du programme.
 Par convention, on nomme un paquet de la façon suivante : [nom du paquet]_[version-x.y.z]-[révision_debian].deb
 On peut également ajouter l'architecture utilisée : [nom du paquet]_[version-x.y.z]-[révision_debian]_[architecture].deb
 Exemple pour la version d'un paquet 3.1.4-1. Le dernier moins délimite la révision Debian.
 Si un bogue doit être corrigé dans Debian, un nouveau .deb est produit par les développeurs de Debian : 3.1.4-2.
 L’auteur corrige de son côté et publie une nouvelle version du paquet 3.1.5. Debian publie alors un .deb avec la version 3.1.5-1.
 
 La date peut être utilisée également avec le format AAAAMMJJ. La référence du développeur Debian recommande vigoureusement de ne pas utiliser de dates comme 20182806, qui se révèlent catastrophiques quand l’auteur change d’avis et décide de sortir la version 1.0.0 qui est considérée comme antérieure à 20182806. L'astuce proposée si l'auteur utilise 20182806 pour version de son paquet Debian est de nommer la version  0.0.20182806.
Maintainer : Le nom et le mail du développeur du paquet.
 Visionduweb <adresse@visionduweb.com>
Noter que les paquets orphelins sont des paquets sans mainteneur courant qui sont suivis par le projet Debian et doivent avoir la ligne Maintainer définie avec "Debian QA Group <packages@qa.debian.org>".
Uploaders : Cette ligne complète la ligne Maintainer dans le cas ou le paquet est maintenu par un groupe de personnes qui utilisent une adresse mail partagée.
Description : La description courte et obligatoire de votre paquet, de préférence avec moins de 80 caractères. 
 La description longue et obligatoire de votre paquet. Cette description sert à  définir le rôle du paquet, ce qu'il apporte.
 Permet de donner des informations à l'utilisateur sur les dépendances et les conflits significatifs entre ce paquet et d'autres paquets.
 Les instructions pour la configuration ou l'utilisation du paquet ne sont pas à inclure. Elles sont à ajouter dans le script d'installation ou dans la documentation du paquet.
 Les déclarations de droits d'auteur et les autres administrateurs ayants collaborés à la création du paquet ne doivent pas non plus être inclus. Ces informations sont à ajouter dans le fichier copyright.
Lignes indispensables pour que le paquet puisse être hébergé sur un serveur apt
Section : la catégorie dans laquelle mettre le paquet.
 Les paquet Debian sont répartis en différentes parties : main (logiciels libres), non-free (logiciels non libres), et contrib (logiciels libres qui dépendent de logiciels non libres).
 Chacune d’entre elles est divisée en sections qui classent les paquets en catégories.
 La liste complète : admin, cli-mono, comm, database, debug, devel, doc, editors, education, electronics, embedded, fonts, games, gnome, gnu-r, gnustep, graphics, hamradio, haskell, httpd, interpreters, introspection, java, javascript, kde, kernel, libdevel, libs, lisp, localization, mail, math, metapackages, misc, net, news, ocaml, oldlibs, otherosfs, perl, php, python, ruby, rust, science, shells, sound, tasks, tex, text, utils, vcs, video, web, x11, xfce, zope.
 La liste des sections se retrouve depuis la page unstable de Debian : https://packages.debian.org/unstable/
 La section additionnelle debian-installer contient des paquets spéciaux utilisés par l'installeur et n'est pas utilisée pour les paquets normaux de Debian.
 Noter que la section "base" qui est souvent présentée dans des tutoriels de conception de paquet .deb a été retirée et ne devrait donc plus être utilisée.
Priority : L'importance du paquet pour le système. La plupart du temps, notre programme personnalisé sera renseigné avec l'option "optional".
 Les valeurs possibles : "extra", "optional", "standard", "important" ou "required".
 Pour en savoir plus : https://www.debian.org/doc/debian-policy/#priorities
Lignes facultatives
Architecture : Les architectures avec lesquelles le programme est compatible.
 Avec "any" le paquet créé va dépendre de l'architecture sur laquelle il est installé.
 Exemples d'architectures : 'all', 'alpha', 'amd64', 'arm', 'arm64', 'armeb', 'armel', 'armhf', 'avr32', 'hppa', 'i386', 'ia64', 'lpia', 'm32r', 'm68k', 'mips', 'mipsel', 'powerpc', 'powerpcspe', 'ppc64', 's390', 's390x', 'sh3', 'sh3eb', 'sh4', 'sh4eb', 'sparc', 'sparc64'.
 Avec "all" le paquet créé est indépendant de l'architecture. La plupart du temps, on choisira "all" pour les scripts shell et Perl ainsi que pour la documentation.
Essential : Yes / No. Ce champ n'est généralement pas nécessaire si la réponse est non. Il désigne un package requis pour le bon fonctionnement du système.
 Dpkg ou tout autre outil d'installation ne permettra pas de supprimer un paquet Essential sans utiliser une options pour forcer la désinstallation.
Installed-Size : Une valeur entière en octets pour estimer la quantité totale d'espace disque requis pour installer le package.
 On obtient la taille une fois le paquet.deb créé avec la commande suivante : dpkg -I Objectif-GreeN-Project_1.0.0-1_all.deb
 Il faudra recréer une seconde fois le paquet.deb après avoir ajouté la taille dans le fichier control.
Origin: Le nom de la distribution à partir de laquelle ce paquet provient.
Bugs: <url>. L'URL du système de suivi des bogues pour ce paquet.
 Le format actuellement utilisé est <bts_type>: // <bts_address>, comme debbugs: //bugs.debian.org.
 Pour ma part, je met un lien vers le forum : https://www.visionduweb.eu/forum
Homepage : L'adresse de la page internet de référence.
 https://www.visionduweb.eu
Tag: Liste des étiquettes décrivant les qualités du paquet. La description et la liste des tags pris en charge peuvent être trouvées dans le paquet debtags.
 Voir le wiki de Debian : https://wiki.debian.org/Debtags
 Voir la liste de Tags existante : https://debtags.debian.org/reports/facets
Multi-Arch: same|foreign|allowed|no
 Ce champ sert à indiquer comment ce paquet se comporte sur des installations multiarchitectures.
 La valeur same indique que le paquet peut être co-installé avec lui-même, mais ne doit pas être utilisé pour satisfaire une dépendance d'un paquet d'une architecture différente de la sienne.
 La valeur foreign indique que le paquet ne peut pas être co-installé avec lui-même, mais peut permettre de satisfaire les dépendances d'un paquet d'une architecture différente de la sienne.
 La valeur allowed permet aux dépendances inverses d'indiquer dans leur champ Depends qu'elles acceptent un paquet d'une autre architecture, et n'a pas d'autres effets.
 La valeur no est la valeur par défaut quand cette option est omise ce qui rend cette ligne inutile.
Subarchitecture: valeur
 Kernel-Version: valeur
 Installer-Menu-Item: valeur
 Ces champs sont utilisés par l'installateur et ne sont en général pas nécessaires. Veuillez consulter /usr/share/doc/debian-installer/devel/modules.txt fourni avec le paquet debian-installer pour plus de détails.
Source : Le nom du paquet source dont provient ce paquet binaire, s'il est différent du nom du paquet lui-même.
Depends : Paquets obligatoires.
 Les éventuelles dépendances nécessaires apportant des fonctionnalités supplémentaires et permettant l'installation réussie du paquet. Ils doivent être installés avant l'installation de notre paquet.
 Le logiciel de maintenance de paquet n'autorisera pas l'installation du paquet si les paquets listés dans son champ Depends ne sont pas installés (du moins pas sans utiliser les options de force).
 Ici, le paquet tzdata est nécessaire pour afficher la date et l'heure au début de notre script.
Lors d'une installation, les scripts postinst sont exécutés avant ceux de leurs dépendances.
Lors d'une suppression, les scripts prerm sont lancés avant ceux de leurs dépendances.
 Exemple pour prendre en compte la version spécifique d'un paquet : Depends : libc6 (>= 2.1)
 Syntaxe pour Depends, Pre-Depends, Recommends et Suggests :
 Une virgule représente un « ET » logique et une barre verticale représente un « OU » logique.
 Les relations acceptées pour les versions : « >> » pour supérieur à, « << » pour inférieur à, « >= » pour supérieur ou égal, « <= » pour inférieur ou égal, et « = » pour égal à. (>> << >= <=  =)
 Les paquets du système pour supporter le lancement du programme. Ici, coreutils, libtinfo5, libc6.
Différents outils nous informent pour trouver les dépendances d'un paquet.
Pre-Depends : Liste des paquets obligatoires devant être installés et configurés avant notre paquet.
 Habituellement, on utilise ce champ quand un paquet a besoin d'un autre paquet pour lancer le script preinst.
 D'après Debian Policy, il ne faut pas spécifier une entrée Pre-Depends pour un paquet avant que cela n'ait été discuté sur la liste de diffusion debian-devel et qu'un consensus sur le fait d'avoir à faire cela ait été atteint.
 Contacter le groupe debian-devel francophone : debian-devel-french@lists.debian.org
Recommends: bash
|Recommends: zsh
 Paquet recommandé qui sera installé par défaut.
 Ici, on recommande bash ou zsh. Si ils ne sont pas déjà installés, les paquets recommandés sont installés en même temps que le paquet. (Ou alors, le programme avertis l'utilisateur qu'il doit installer de nouveaux paquets ?)
Suggests : Paquet recommandé qui ne sera pas installé par défaut. C'est la liste des paquets qui, associés avec ce paquet, peuvent améliorer son utilité. Néanmoins, une installation sans ces paquets est parfaitement raisonnable.
 Les paquets suggérés ne sont pas installés par défaut. Par exemple, la documentation Python n'est pas nécessaire à l'utilisation de Python, mais, peut être utile. Ici, on ne suggère aucun paquet supplémentaire.
Breaks : Les paquets qui sont déjà installés sur votre système mais qui se cassent quand ils dépendent du paquet à installer ce qui empêchent votre installation d'aboutir car dpkg refusera d'installer vos paquets cibles à moins que les paquet cassés ne soit d'abord déconfiguré ou mis à jour.
Conflicts : Indique les paquets qui sont déjà installés sur votre machine mais qui créent une incompatibilité absolue. PAr exemple, des paquets avec le même nom. Les paquets doivent être désinstallés avant d'installer le paquet cible.
Replaces : Indique les paquets déjà installés sur votre machine qui seront remplacés par ce paquet à installer. Les paquets à supprimer doivent être ajoutés au niveau de la ligne Conflicts.
Provides : Liste de paquets virtuels.
 On s'en sert habituellement pour des paquets qui offrent le même service. Par exemple, sendmail et exim sont des serveurs de courrier, et donc ils procurent chacun le paquet « mail-transport-agent » ; ainsi les autres paquets peuvent dépendre de ce paquet virtuel. Sendmail et exim peuvent ainsi chacun satisfaire la dépendance. Les paquets qui dépendent d'un serveur de courrier n'ont pas à connaître les noms de tous les serveurs de courrier et n'ont pas à utiliser « | » comme séparateur de liste.
Built-Using: liste-de-paquets
 Ce champ affiche les paquets source supplémentaires utilisés lors de la construction du paquet binaire. Il permet d'indiquer au logiciel de gestion de l'archive que des paquets source supplémentaires doivent être conservés tant que le paquet binaire est maintenu. Ce champ doit être une liste de paquets source avec des références strictes de version (=). Veuillez noter que le logiciel de gestion de l'archive risque de ne pas accepter un envoi qui déclare une relation Built-Using qui ne peut pas être satisfaite dans l'archive. 
Built-For-Profiles: liste-de-profile (Obsolète.)
Auto-Built-Package: reason-list
 This field specifies a whitespace separated list of reasons why this package was auto-generated. Binary packages marked with this field will not appear in the debian/control master source control file. The  only currently used reason is debug-symbols.

Créer les scripts d'installation/suppression

Facultatif : ajouter des scripts qui seront exécutés avant/après l'installation/la suppression du paquet.
Les scripts doivent avoir la permission 755.
sudo chmod 755 post*
sudo chmod 755 pre*
preinst
Exemple avec un fichier preinst.
#!/bin/bash
echo "preinst : script exécuté avant l’installation."
echo "preinst : Le paquet green-project va être installé."
exit 0
postinst
Exemple avec un fichier postinst.
#!/bin/bash 
echo "postinst : script exécuté après l’installation."
echo "postinst : Le paquet green-project se lance depuis le terminal avec la commande GreeN-Project."
exit 0
prerm
Exemple avec un fichier prerm.
#!/bin/bash 
echo "prerm : script exécuté avant la suppression."
echo "prerm : Le paquet va être désinstallé."
exit 0
postrm
Exemple avec un fichier postrm.
#!/bin/bash 
echo "postrm : script exécuté après la suppression."
echo "postrm : Si aucune erreur n'est affichée, le paquet a été désinstallé."
exit 0

Créer le fichier conffiles

Le fichier conffiles liste les fichiers du paquet qui doivent être considérés comme des fichiers de configuration.
Ces fichiers demanderont une confirmation avant d’être écrasés.

Créer le sous dossier /usr/bin pour ajouter le fichier GreeN-Project

Pour un simple script, on supposera qu'il faut l'installer dans /usr/bin.
Le script présent dans le dossier /usr/bin du paquet d'installation sera placé dans le dossier /usr/bin local suite à l'installation.
Aller à la racine du dossier principale Objectif-GreeN-Project_1.0.0-1_all.
Créer un dossier usr/ dans lequel on ajoute un dossier bin/ qui contiendra le fichier GreeN-Project. Ce fichier "GreeN-Project" contiendra le programme.
Ainsi, on peut différencier les trois chemins suivants dans la structure de notre projet .deb :
Le dossier principale, le nom du paquet utilisé dans le fichier DEBIAN/control, le nom du fichier programme depuis usr/bin/GreeN-Project
Il est possible, voir recommandé, d'utiliser le même nom pour les trois parties évoquées. Les conventions de nommage recommandent d'utiliser des minuscules, des "-" et des "_".
Le fichier du programme GreeN-Project semble tout de même pouvoir être nommé avec des majuscules, ce que je fais pour différencier le nom du paquet et le nom du programme.
Une fois le paquet installé dans /usr/bin, le script du paquet devient donc également une commande.
Lancer le programme depuis un terminal en utilisant le nom de fichier du script : GreeN-Project
Ajouter le code du programme dans le fichier GreeN-Project.
#!/bin/bash
echo "Nous sommes le `date`."
echo ""
sleep 1
echo "Libérez les graines !"
sleep 1
echo "Plantez !"
sleep 2
echo "Des carottes volantes !"
sleep 3
echo "Mais aussi ..."
sleep 4
echo "Du cannabis !"
sleep 4
echo "Partout ..."
sleep 4
Rendre le fichier exécutable.
sudo chmod 755 GreeN-Project

Créer le sous dossier /usr/lib pour ajouter une bibliothèque

Le programme nécessite l'utilisation d'une bibliothèque dynamique bibliotheque_necessaire.so ?
Placer la bibliothèque dans un dossier usr/lib à la racine du dossier pour la retrouver dans /usr/lib une fois le .deb installé.

Créer le sous dossier /usr/share/doc/nom-du-paquet/ pour ajouter les informations relatives à l'installation

Pour les informations relatives à l'installation du paquet, on supposera qu'il faut les installer dans /usr/share/doc.
Les informations présentes dans le dossier /usr/share/doc/nom-du-paquet/ du paquet d'installation seront placées dans le dossier /usr/share/doc/nom-du-paquet/ local suite à l'installation.
Aller à la racine du dossier principale Objectif-GreeN-Project_1.0.0-1_all.
Créer un dossier /usr/share/doc/ dans lequel on ajoute un dossier nom-du-paquet/ qui contiendra les informations relatives à l'installation.
Créer les fichiers suivants :
README (Informations relatives à l'utilisation du programme.)
copyright
changelog (Changements apportés par rapport à la dernière version.)
changelog.Debian (Changements apportés par rapport à la dernière version, uniquement pour le paquet Debian.)

Renseigner le fichier copyright

Source : https://www.debian.org/doc/debian-policy/#copyright-considerations
Licence GPL :
GNU General Public License version 3, du 29 juin 2007 : https://opensource.org/licenses/GPL-3.0
GNU General Public License version 3, du 29 juin 2007 traduit en français. Toujours faire référence à la version en anglais pour éviter les erreurs de traduction : http://dachary.org/loic/gpl-french.pdf

Structure du programme Objectif-GreeN-Project_1.0.0-1_all

# Structure minimale d'un paquet .deb pour Debian.
Objectif-GreeN-Project_1.0.0-1_all/
 ├── DEBIAN
 │   ├── control
 │   ├── postinst
 │   ├── postrm
 │   ├── preinst
 │   └── prerm
 └── usr
     └── bin
         └── GreeN-Project
# Structure avancée d'un paquet .deb pour Debian.
Objectif-GreeN-Project_1.0.0-1_all/
 ├── DEBIAN
 │   ├── control
 │   ├── postinst
 │   ├── postrm
 │   ├── preinst
 │   └── prerm
 ├── share
 │   └── doc
 │       ├── changelog
 │       ├── changelog.Debian
 │       ├── copyright
 │       └── README
 └── usr
     └── bin
         └── GreeN-Project

Changer le propriétaire pour root

sudo chown -R root:root Objectif-GreeN-Project_1.0.0-1_all

Compilation

Aller au même niveau que le dossier Objectif-GreeN-Project_1.0.0-1_all, ne pas être dedans.
Lancer la compilation avec la commande :
sudo dpkg-deb --build Objectif-GreeN-Project_1.0.0-1_all

Vérifier les informations proposées par un paquet

dpkg -I Objectif-GreeN-Project_1.0.0-1_all.deb

Installation

Un fichier Objectif-GreeN-Project_1.0.0-1_all.deb devrait avoir été créé dans le répertoire courant.
Lancer l'installation avec la commande :
sudo dpkg -i Objectif-GreeN-Project_1.0.0-1_all.deb
Si le paquet a des dépendances, compléter l'installation avec la commande suivante :
sudo apt-get -f install

Vérifier que le paquet est bien installé

ls /usr/bin | grep GreeN-Project

Utiliser le paquet

Lancer "GreeN-Project" depuis le terminal.

Désinstaller le paquet

sudo apt-get remove green-project
Si le nom du paquet est défini avec des majuscules dans le fichier DEBIAN/control, la suppression ne fonctionnera pas en ligne de commande. Utiliser alors Synaptic pour supprimer le paquet.
Avec un nom en minuscules qui respect les standards, le paquet est bien supprimé avec la commande de suppression apt autoremove paquet.

Vérifier que le paquet est bien désinstallé

ls /usr/bin | grep GreeN-Project

Récapitulatif pour créer l'arborescence d'un paquet en ligne de commande

Créer les dossiers et les fichiers nécessaires

# Définir la variable à utiliser avec le nom du programme.
paquet=Objectif-GreeN-Project_1.0.0-1_all
# Créer le répertoire projet "$paquet"
mkdir -p $paquet
#####
# Contenu du dossier DEBIAN.
#####
# Créer le répertoire "DEBIAN"
mkdir -p $paquet/DEBIAN
# Créer le fichier "control" 
touch $paquet/DEBIAN/control
# Créer le fichier "postinst" 
touch $paquet/DEBIAN/postinst
# Créer le fichier "postrm" 
touch $paquet/DEBIAN/postrm
# Créer le fichier "preinst" 
touch $paquet/DEBIAN/preinst
# Créer le fichier "prerm" 
touch $paquet/DEBIAN/prerm
#####
# Contenu du programme.
#####
# Créer le répertoire "usr"
mkdir -p $paquet/usr
# Créer le répertoire "bin"
mkdir -p $paquet/usr/bin
# Créer le fichier "$paquet.sh" 
touch $paquet/usr/bin/$paquet.sh
#####
# Contenu des informations d'installation.
#####
# Créer le répertoire "share"
mkdir -p $paquet/usr/share
# Créer le répertoire "doc"
mkdir -p $paquet/usr/share/doc
# Créer le répertoire "$paquet"
mkdir -p $paquet/usr/share/doc/$paquet
# Créer le fichier "README"
touch $paquet/usr/share/doc/$paquet/README
# Créer le fichier "copyright"
touch $paquet/usr/share/doc/$paquet/copyright
# Créer le fichier "changelog"
touch $paquet/usr/share/doc/$paquet/changelog
# Créer le fichier "changelog.Debian"
touch $paquet/usr/share/doc/$paquet/changelog.Debian

Changer les permissions des fichiers

# Définir la variable à utiliser avec le nom du programme.
paquet=Objectif-GreeN-Project_1.0.0-1_all
# Changer les permissions d'accès des fichiers post* et pre* (755 : donne au propriétaire tous les droits, aux membres du groupe et aux autres les droits de lecture et d'accès).
chmod 755 $paquet/DEBIAN/post*
chmod 755 $paquet/DEBIAN/pre*
# Permettre l'exécution du script "$paquet.sh" 
chmod +x $paquet/usr/bin/$paquet.sh

Écrire les informations dans les fichiers

# Définir la variable à utiliser avec le nom du programme.
paquet=Objectif-GreeN-Project_1.0.0-1_all
# Ajouter les contrôles du programme dans le fichier $paquet/DEBIAN/control
cat << FIN >> $paquet/DEBIAN/control
Package: $paquet
Version: 1.0.0-1
Section: education
Priority: optional
Architecture: all
Depends: bash
Maintainer: Visionduweb <mail@visionduweb.com>
Description: Test de création qu'un paquet Debian.
Homepage: https://www.visionduweb.eu
FIN
# Ajouter le contenu du programme dans le fichier "/usr/bin/$paquet.sh" :
cat << FIN >> $paquet/usr/bin/$paquet.sh
#!/bin/bash
echo "$paquet.sh : exécution du programme."
FIN
# Ajouter du contenu dans le fichier "$paquet/DEBIAN/preinst" :
cat << FIN >> $paquet/DEBIAN/preinst
#!/bin/bash
echo "preinst : script exécuté avant l’installation."
FIN
# Ajouter du contenu dans le fichier "$paquet/DEBIAN/postinst" :
cat << FIN >> $paquet/DEBIAN/postinst
#!/bin/bash
echo "postinst : script exécuté après l’installation."
FIN
# Ajouter du contenu dans le fichier "$paquet/DEBIAN/prerm" :
cat << FIN >> $paquet/DEBIAN/prerm
#!/bin/bash
echo "prerm : script exécuté avant la suppression."
FIN
# Ajouter du contenu dans le fichier "$paquet/DEBIAN/postrm" :
cat << FIN >> $paquet/DEBIAN/postrm
#!/bin/bash
echo "postrm : script exécuté après la suppression."
FIN

Aller plus loin lors de la création du paquet .deb

Paramétrer la création d'une entrée dans le menu système

Utile si on utilise un OS graphique.
La plupart du temps, on se passera de cette fonctionnalité pour les serveurs.
Ajouter le fichier dans /usr/share/applications/nom-du-lanceur.desktop
Il est plus propre d'utiliser le dossier de l'utilisateur : /home/USER/.local/share/applications/
[Desktop Entry]
Name=Nom-du-lanceur-dans-le-menu
Version=1.0.0-1
Exec=/usr/bin/nom-du-programme-a-executer
Comment=Commentaires affiché depuis le menu.
Icon=/usr/icons/GreeN-Project/icon.png
Type=Application
Terminal=false
StartupNotify=true
Encoding=UTF-8
Categories=Development;
Category ou Categories ???
Texte complémentaire de description.
A suivre et ajouter la catégorie.
Information :
Type 	Sauf exception, on le laissera toujours sur « Application »
Terminal 	Sert à indiquer si on désire afficher ou non le terminal lors de l'exécution du script. À mettre à False dans le cas d'une application avec IHM, à True autrement.
Notification de démarrage 	Permet d'indiquer au sein de l'OS si l'application démarre, un peu à l'image des info-bulles système.
Encodage 	On le laissera toujours en UTF-8.
Catégorie 	Ce sont les catégories du menu dans lesquelles on désire voir apparaître notre logiciel. Attention, les noms des catégories ne sont pas traduits. Ainsi bureautique est en réalité office.

Contrôler l'intégrité du programme

Contrôler l'intégrité du programme avec un fichier md5sums.
Créer le fichier dpk-build-sign.sh au même niveau que le dossier DEBIAN.
#!/bin/sh
find . -type f ! -regex '.*.hg.*' ! -regex '.*?debian-binary.*' ! -regex '.*?DEBIAN.*' -printf '%P ' | xargs md5sum > DEBIAN/md5sums
Lancer le fichier sh dpk-build-sign.sh va créer un fichier md5sums dans le dossier DEBIAN.
Une clé de contrôle MD5 est ajoutée pour chaque fichier présent dans le programme.
Mythe : MD5 a été cassé. C'est faux.
La faille trouvée dans MD5 concerne la possibilité de trouver des collisions MD5, c'est-à-dire des blocs de données différents possédant la même MD5.
Les chercheurs sont parvenus à trouver rapidement des collisions MD5, ce qui est bien une découverte en cryptanalyse, cependant, il est toujours impossible de forger des données ayant une MD5 précise.
Il n'est donc pas possible pour un "ennemi" de créer un fichier ayant la même MD5 qu'un fichier existant.0
Source : https://www.commentcamarche.net/faq/4470-mythes-md5-a-ete-casse

Conversion vers d'autres paquets

Une fois le paquet créé, il est possible de générer des paquets pour d'autres distributions avec l'outil ALIEN.
alien -r mon_paquet.deb pour convertir en .rpm (Pour les distributions Red Hat.)
alien -t mon_paquet.deb pour convertir en .tgz (Pour les distributions Slackware.)
alien -p mon_paquet.deb pour convertir en .pkg (Pour les distributions Solaris.)
alien -d mon_paquet.rpm pour convertir en .deb depuis un .rpm
A suivre.

Bibliographie

Créer un paquet pour Debian

Ok.png Créer un paquet Debian .deb : https://www.it-connect.fr/creer-un-paquet-debian-deb/
Ko.png Créer un paquet Debian .deb : https://blog.serverdensity.com/how-to-create-a-debian-deb-package/

Le fichier control

Ok.png Le fichier control : https://linux.die.net/man/5/deb-control
Ok.png Le fichier control : https://manpages.debian.org/jessie/dpkg-dev/deb-control.5.fr.html
Ok.png Le fichier control : http://manpages.ubuntu.com/manpages/artful/en/man5/deb-control.5.html

Automatiser la création depuis une interface graphique

Pour créer un paquet .deb, il est judicieux surtout au début de laisser faire des outils automatiques.

Debreate

Ok.png Utiliser debreate pour automatiser la création d'un paquet .deb depuis une interface graphique : https://antumdeluge.github.io/debreate-web/
Ok.png Utiliser debreate pour automatiser la création d'un paquet .deb depuis une interface graphique : https://deusyss.developpez.com/tutoriels/Linux/Debreate/

Autres outils pouvant assister la création d'un paquet

debuild (dpkg-source+dpkg-buildpackage)
pdebuild (chroot+debuild)
dpkg-buildpackage

Créer un serveur de dépôt

Debian se réserve le droit de limiter l'inclusion des paquets dans les archives si :
- La licence n'est pas libre.
- L'utilisation ou la distribution viole une loi.
- Un conflit éthique existe dans la distribution ou l'utilisation.
- La distribution entre en conflit avec les autres politiques du projet.
Ok.png Source : https://www.debian.org/doc/debian-policy/#copyright-considerations
Ko.png Source : Créer son propre dépôt .deb : http://www.serveur-linux.info/2012/01/depot-personnalise-paquets-debian/

Ressources complémentaires

Ok-ko.png La construction de paquets Debian : https://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial.fr.pdf
Ok-ko.png Référence du développeur Debian : https://www.debian.org/doc/manuals/developers-reference/index.fr.html
Ok-ko.png Guide du nouveau responsable Debian : https://www.debian.org/doc/manuals/maint-guide/index.fr.html
Ok-ko.png Guide for Debian Maintainers : https://www.debian.org/doc/manuals/debmake-doc/index.en.html

NAVIGATION

PARTICIPER ET PARTAGER

Vous êtes sur le wiki de Vision du Web.
Les pages présentées sur le wiki évoluent tous les jours.
Certaines recherches sont peu abouties et incluent des erreurs.
Pour participer sur le wiki, créer un compte utilisateur en haut à droite.
La recherche interne du wiki permet de trouver le contenu qui vous intéresse.
Identifiez-vous pour poser vos questions sur la page de discussion de VisionDuWeb.
Améliorer le contenu des pages en faisant des propositions depuis l'onglet discussion.
Télécharger le sommaire au format PDF pour le consulter en étant déconnecté du réseau.
Les informations du wiki ne doivent pas servir à nuire à autrui ou à un système informatique.
De nombreux outils gratuits sont listés et disponibles dans la boîte à outils de Vision du web.
D'autres pages du wiki peuvent correspondre à vos attentes. La liste de toutes les pages du wiki.

VALORISER LE WIKI

Valoriser le contenu partagé sur le wiki avec un don en monnaie numérique :
AEON - Bitcoins (BTC) - Bitcoins Cash - Bitcoins Gold - Bitcore (BTX) - Blackcoins - Bytecoins - Clams - Dash - Monero - Dogecoins - Ethereum - Ethereum Classique - Litecoins - Potcoins - Solarcoins - Zcash

OBTENIR DE LA MONNAIE NUMERIQUE

Obtenir gratuitement de la monnaie numérique :
Gagner des Altcoins - Miner des Altcoins.
Miroir PlanetHoster du 11 Mars 2019.