]> La Charte Debian Ian Jackson ijackson@gnu.ai.mit.edu Christian Schwarz schwarz@debian.org révision: David A. Morris bweaver@debian.org La liste de diffusion « Debian Policy » debian-policy@lists.debian.org version 3.2.1.1, 28 novembre 2000 Ce manuel est la charte de la distribution Debian GNU-Linux. On y aborde la structure et le contenu d'une archive Debian, quelques questions sur la conception du système d'exploitation, ainsi que les exigences techniques que chaque paquet doit satisfaire afin d'être inclus dans la distribution. Le paquet « debian-policy » quant à lui est maintenu par un groupe de responsables sans pouvoirs rédactionnels, dont voici la liste actuelle :

Michael Alan Dorman mdorman@debian.org

Richard Braakman dark@xs4all.nl

Philip Hands phil@hands.com

Julian Gilbey J.D.Gilbey@qmw.ac.uk

Manoj Srivastava srivasta@debian.org

Copyright ©1996,1997,1998 Ian Jackson and Christian Schwarz.

Ce manuel est un logiciel libre ; il peut être redistribué et/ou modifié selon les termes de la « GNU General Public License  », telle que publiée par la « Free Software Foundation » ; version 2 ou toute version suivante (au choix).

Il est distribué dans l'espoir qu'il sera utile, mais sans aucune garantie; sans même la garantie implicite d'une possible commercialisation ou d'une adéquation avec la satisfaction d'un but précis. Consultez la « GNU General Public License » pour plus de détails.

Une copie de la « GNU General Public License » est disponible à /usr/share/common-licences/GPL dans la distribution Debian GNU-Linux ou sur le World Wide Web à . Vous pouvez également l'obtenir en écrivant à la Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

À propos de ce manuel Les objectifs de ce manuel

Ce manuel est la charte de la distribution Debian GNU-Linux. On y aborde la structure et le contenu d'une archive Debian, quelques questions sur la conception du système d'exploitation, ainsi que les exigences techniques que chaque paquet doit satisfaire afin d'être inclus dans la distribution.

Les mots must, should, may et les adjectifs required, recommended et optional servent à distinguer la signification des diverses directives contenues dans cette charte. La distribution Debian ne considérera généralement pas comme acceptables les paquets qui ne se conforment pas aux directives dénotées par must (ou required)

En français, nous employons le verbe « devoir » et ses déclinaisons. . Une non conformité à une directive dénotée par should (ou recommended) sera en général considérée comme un bogue, mais cela ne rendra pas nécessairement le paquet indistribuable

En français, nous employons le futur de l'indicatif et jamais le verbe « devoir ».. Les directives dénotées par may (ou optional) sont véritablement facultatives et sont laissées à l'appréciation du responsable de paquet.

Ce classement est en gros équivalent à celui des bogues : important (pour des violations des directives must ou required), normal (pour des violations des directives should ou recommended) et wishlist (pour les éléments optional)

voir aussi le RFC 2119..

Ce manuel ne décrit pas les mécanismes techniques liés à la création, l'installation ou la suppression des paquets. On peut touver ces informations dans le Manuel des paquets Debian et dans le Manuel d'administration système Debian. Veuillez noter que les notes en bas des pages de cette charte ne font pas partie de la politique Debian : elles sont simplement instructives.

Ce document suppose une certaine familiarité avec ces deux autres manuels. Malheureusement, le Manuel d'administration système Debian n'existe pas encore.

La plupart des informations de ce manuel seront également utiles pour la création de paquets qu'on distribuera d'une autre façon ou qui sont destinés à un usage local.

Nouvelles versions de ce document

La version actuelle de ce document est toujours accessible depuis le serveur FTP de Debian ftp.debian.org à /debian/doc/manuals/debian-policy.html.tar.gz ou sur le serveur WWW de Debian à « The Debian Policy Manual » ().

De plus, ce manuel est distribué avec le paquet debian-policy.

Avis et critiques

Comme le système Debian GNU-Linux est en constante évolution, ce manuel change avec le temps.

Bien que les auteurs de ce document aient veillé à ne pas introduire des typos et autres erreurs, il en reste toujours. Si vous découvrez des erreurs dans la version de ce manuel ou si vous voulez nous faire part de vos commentaires, suggestions ou critiques, veuillez envoyer un courrier électronique sur la liste de diffusion « Debian Policy », debian-policy@lists.debian.org, ou envoyer un rapport de bogue concernant le paquet debian-policy.

À propos de la traduction

Serge Stinckwich et David Rocher ont initié cette traduction et ils furent rejoints par Christophe Le Bars, Benjamin Drieu, Laurent Pelecq, Christophe Mertz, Olivier Ripoll, Georges Mariano, Hugues Marilleau, Michel Court et les relecteurs de la liste de diffusion debian-l10n-french, debian-l10n-french@lists.debian.org. Si vous voulez faire part de vos commentaires, suggestions ou critiques, vous pouvez envoyer un mél à Philippe Batailler pbatailler@teaser.fr.

L'archive Debian

Le système Debian GNU/Linux est maintenu et distribué sous la forme d'un ensemble de paquets. Comme ils sont très nombreux (plus de 2600), ils sont répartis en plusieurs sections et priorités de manière à simplifier leur traitement.

Le projet Debian s'efforce de construire un système d'exploitation libre, mais tous les paquets que nous voulons rendre accessibles ne sont pas libres selon notre définition (voir plus loin les Directives Debian pour le logiciel libre) ou ne peuvent pas être importés ou exportés sans restrictions. L'archive a donc été séparée suivant les sections main, non-free, contrib, non-US/main, non-US/non-free et non-US/contrib.

Les sections main et non-US/main constituent la distribution Debian GNU-Linux.

Les paquets des autres sections ne sont pas considérés comme faisant partie de la distribution Debian, bien que nous soutenions leur utilisation à travers notre infrastructure (comme notre système de suivi des bogues et nos listes de diffusion). La Charte de Debian s'applique aussi à ces paquets.

Le copyright des paquets et les sections

Voici les objectifs de cette charte :

nous voulons mettre à disposition le plus grand nombre possible de logiciels ;

nous voulons encourager chacun à écrire des logiciels libres ;

nous voulons faciliter la production des cédéroms de notre système sans craindre la violation de licences, ou de restrictions d'importation/exportation ou de toutes autres lois.

Les directives Debian pour le logiciel libre

Les directives Debian pour le logiciel libre (DFSG : « Debian Free Software Guidelines ») suivantes constituent notre définition du logiciel « libre ». Redistribution autorisée

La licence d'un composant Debian ne doit pas empêcher quiconque de vendre ou de donner ce logiciel en tant qu'élément d'une distribution logicielle qui regroupe des programmes de différentes sources. La licence ne doit pas demander le paiement de droits ou autres redevances pour une telle vente.

Code source

Le programme doit inclure son code source et doit permettre sa distribution en tant que code source et comme forme compilée.

Travaux dérivés

La licence doit autoriser les modifications et les travaux dérivés. Elle doit autoriser leur distribution selon les termes mêmes de la licence du logiciel original.

Intégrité du code source de l'auteur

La distribution d'un code source modifié peut être limitée par la licence seulement si des fichiers « patch », joints avec le code source, permettent de modifier le programme au moment de sa compilation. La licence doit explicitement permettre la redistribution de logiciels construits à partir de code source modifié. La licence peut exiger que les travaux dérivés portent un nom différent ou un numéro de version différent du logiciel initial. (C'est un compromis. Le groupe Debian encourage tous les auteurs à ne pas limiter les modifications de fichier, source ou binaire.)

Non-discrimination envers des personnes ou groupes de personnes

La licence ne doit faire aucune discrimination à l'encontre d'une personne ou d'un groupe de personnes.

Non-discrimination envers des champs d'activités

La licence ne doit pas empêcher l'usage du programme dans un champ spécifique d'activité. Par exemple, elle ne doit pas empêcher l'utilisation du programme dans le cadre d'une activité commerciale ou pour faire de la recherche génétique.

Distribution de licence

Les droits attachés au programme doivent s'appliquer à tous ceux à qui le logiciel est redistribué sans que ceux-ci aient besoin d'une licence supplémentaire.

La licence ne doit pas être spécifique à Debian

Les droits attachés à un programme ne doivent pas être liés à l'appartenance de ce programme à un système Debian. Si ce programme est extrait de Debian et est utilisé ou distribué sans Debian mais dans les termes de la licence du programme, toutes les parties à qui ce programme a été redistribué doivent avoir les mêmes droits que ceux qui sont accordés avec le système Debian.

La licence ne doit pas contaminer d'autres logiciels

La licence ne doit pas apporter des restrictions à d'autres logiciels distribués avec le logiciel en question. Par exemple, la licence ne doit pas exiger que tous les autres programmes distribués sur le même support soient des logiciels libres.

Exemples de licence

Les licences « GPL », « BSD » et « Artistic » sont des exemples de licence que nous considérons comme libres.

La section « main »

Tous les paquets dans « main » doivent se conformer aux DFSG (« Debian Free Software Guidelines » -- Les directives Debian pour le logiciel libre).

De plus, les paquets dans « main »

ne doivent pas demander un paquet extérieur à « main » pour leur compilation ou leur exécution (ainsi les paquets ne doivent pas déclarer de relation « Depends » ou « Recommends » avec un paquet qui n'est pas contenu dans « main ») ;

ne seront pas si bogués que nous refusions de les soutenir ;

se conformeront à toutes les règles énoncées dans ce manuel.

La section « contrib »

Tous les paquets dans « contrib » doivent se conformer aux « DFSG ».

Voici des exemples de paquets qu'on peut inclure dans la section « contrib » :

des paquets libres qui demandent pour leur compilation ou leur exécution des paquets appartenant aux sections « contrib », « non-free » ou « non-US », ou des paquets qui ne sont pas contenus dans notre archive ;

des paquets « wrapper », et d'autres accessoires libres pour des programmes non libres.

La section « non-free »

La section « non-free » contient les paquets qui ne se conforment pas aux « DFSG ».

Tous les paquets de la section « non-free » doivent être distribuables électroniquement à travers les frontières internationales.

Le serveur « non-us »

Certains programmes qui contiennent du code source utilisant la cryptographie doivent être déposés sur le serveur « non-us » à cause des limitations US. à l'exportation.

Ceci ne s'applique qu'aux paquets qui contiennent du code source utilisant la cryptographie. Un paquet qui contient un programme interfacé avec un programme de cryptographie ou lié dynamiquement à une bibliothèque de cryptographie ne sera pas distribué par le serveur « non-us » s'il peut fonctionner sans le programme ou la bibliothèque cryptographique.

Considérations supplémentaires sur le copyright

Tous les paquets doivent être accompagnés d'une copie verbatim de leur copyright et de leur licence dans le fichier /usr/share/doc/<package-name>/copyright (voir pour les détails).

Nous nous réservons le droit d'empêcher l'inclusion de fichiers dans nos archives si

leur utilisation ou leur distribution violent une loi ;

leur utilisation ou leur distribution créent un conflit éthique ;

nous sommes obligés de signer une licence pour les utiliser ;

leur distribution entre en conflit avec des politiques du projet Debian.

Les programmes dont les auteurs encouragent l'utilisateur à faire des dons conviennent très bien à la section « main », sauf si les auteurs affirment que ne pas faire de don est immoral, non-éthique, illégal ou quelque chose de similaire ; dans ce cas, ces programmes doivent être placés dans la section « non-free ».

Les paquets dont les notices de copyright (ou des problèmes de brevet) ne permettent pas la redistribution, même sous forme binaire, et pour lesquels aucune permission spéciale n'a été obtenue, ne doivent pas être placés sur le site FTP de Debian et ses miroirs.

On notera que dans la loi internationale du copyright (ceci s'applique aussi aux US), aucune distribution ou modification d'un travail n'est autorisée sans une mention explicite. C'est pourquoi un programme sans notice de copyright est protégé et vous ne pouvez rien en faire sans risquer d'être poursuivi. De même, un programme avec une notice de copyright qui n'énoncerait pas explicitement ce qui est permis interdit tout.

Beaucoup d'auteurs de soi-disant logiciels libres ignorent les problèmes posés aux utilisateurs par des copyrights restrictifs (ou l'absence de notice de copyright). Il est souvent intéressant de contacter diplomatiquement de tels auteurs pour leur demander de modifier les termes de leur licence. Cependant cela est politiquement difficile et vous devriez au préalable demander conseil sur la liste de diffusion debian-legal.

Dans le doute, envoyez un courrier électronique à debian-legal@lists.debian.org. Soyez prêt à nous donner le copyright complet. Les logiciels couverts par la « GPL », les logiciels du domaine public et les copyrights de type « BSD » sont sûrs ; méfiez vous d'expressions comme « utilisation commerciale interdite » et « distribution limitée ».

Les sous-sections

Les paquets des sections (main, contrib, non-US/main, non-free, non-US/contrib, and non-US/non-free) sont regroupés en sous-sections pour simplifier leur traitement.

La section de chaque paquet sera spécifiée dans le fichier de contrôle du paquet. Toutefois, le responsable de l'archive Debian peut changer cette sélection afin d'assurer la cohérence de la distribution Debian.

Veuillez consulter la distribution Debian en cours pour connaître les sections présentes.

Les priorités

Chaque paquet aura une priorité, spécifiée dans son fichier de contrôle. Cette information, utilisée par l'outil de gestion des paquets Debian, permet de séparer les paquets prioritaires de ceux qui le sont moins.

Le système Debian de gestion de paquet, dpkg, comprend les niveaux de priorités suivants : required

Les paquets required sont nécessaires au bon fonctionnement du système. Vous ne devez pas les enlever sous peine de rendre votre système complètement inutilisable ; vous ne pourrez probablement même plus utiliser dpkg pour remettre les choses en place. Les systèmes composés uniquement de paquets required sont probablement inutilisables, mais ils disposent des fonctionnalités suffisantes pour permettre à l'administrateur système de booter et d'installer d'autres logiciels.

important

Les paquets important incluent ceux que l'on s'attend à trouver sur un système de type Unix. Si l'on pense qu'un expert Unix, détectant l'absence d'un programme s'exclamera : « Mille Tonnerres de Brest ! Mais où est passé ce fichu programme ? », alors celui-ci doit être dans important. C'est un critère fort, car nous cherchons à produire, entre autres choses, un Unix libre. Les autres paquets sans lesquels le système ne fonctionne pas bien ou est inutilisable doivent avoir cette priorité. Cela n'inclut pas « Emacs » ou « X11 » ou « TeX » ou tout autre grosse application. Les paquets important constituent simplement un ensemble minimal d'outils nécessaires et communément attendus.

standard

Ces paquets fournissent un système en mode caractère, relativement petit mais pas trop limité. Ils seront installés par défaut si l'utilisateur ne sélectionne rien d'autre. Ce niveau n'inclut pas de nombreuses grosses applications, mais contient « Emacs » (considéré comme une partie de l'infrastructure, plutôt qu'une application) et un sous-ensemble raisonnable de « TeX » et « LaTeX » (si c'est possible en l'absence de « X »).

optional

(En un sens, est optionnel ce qui n'est pas obligatoire, mais ici « optional » ne doit pas être compris ainsi.) Ce sont tous les logiciels qu'on pourrait raisonnablement vouloir installer quand on ne les connaît pas et qu'on a pas d'exigences particulières. Cela constitue un système nettement plus gros et contient « X11 », la distribution complète de « TeX » et de nombreuses applications. Notez qu'il ne doit pas y avoir de conflit entre les paquets optionnels.

extra

Sont regroupés là les paquets qui sont en conflit avec d'autres paquets dont les priorités sont « required », « important », « standard » ou « optional », ou bien les paquets utiles uniquement si vous savez déjà ce qu'ils font, ou bien les paquets qui ont des exigences spécifiques.

Les paquets ne doivent pas dépendre de paquets dont les priorités sont de valeur inférieure (hors dépendances pour la construction). Pour cela, on doit ajuster les priorités d'un ou de plusieurs paquets.

Les paquets binaires

La distribution Debian GNU-Linux est fondée sur le système Debian de gestion de paquets, appelé dpkg. Par conséquent, tous les paquets de la distribution Debian doivent être fournis au format de fichier .deb.

Le nom d'un paquet

Chaque paquet doit avoir un nom unique dans l'archive Debian.

Un nom de paquet ne doit comporter que des lettres minuscules, des chiffres (0-9), les signes plus (+), moins (-) ou point (.).

Le nom d'un paquet fait partie du nom du fichier .deb et est inclus dans le fichier de contrôle du paquet.

Le responsable d'un paquet

Chaque paquet aura un seul responsable à un instant donné. Cette personne est responsable du fait que la licence du logiciel du paquet suit les règles de la distribution à laquelle il appartient.

Le responsable doit être indiqué dans le champ de contrôle Maintainer avec son nom correct et une adresse électronique valide. Quand une personne s'occupe de plusieurs paquets, elle essaiera d'éviter d'avoir différents noms ou adresses dans les champs Maintainer des différents paquets.

Quand la personne en charge d'un paquet quitte le projet Debian, c'est le groupe Debian QAdebian-qa@lists.debian.org qui reprend la maintenance du paquet jusqu'à ce qu'un volontaire se propose pour cette tâche. Ces paquets sont appelés paquets orphelins.

La description d'un paquet

Chaque paquet Debian doit avoir une description complète et enregistrée dans les champs ad hoc de son fichier de contrôle.

La description apportera à l'utilisateur les informations dont il a besoin pour décider d'installer ou non le paquet. La description ne reprendra pas simplement le baratin publicitaire du programme. Les instructions de configuration ou d'utilisation du paquet ne doivent pas en faire partie -- c'est le rôle des scripts d'installation, des pages de man, des fichiers infos, etc. -- et les notices de copyright et autres écrits administratifs non plus -- c'est le rôle des fichiers de copyright.

Les dépendances

Chaque paquet doit indiquer ses relations de dépendance avec les paquets dont il a besoin pour fonctionner correctement.

Par exemple, une relation de dépendance doit être déclarée pour toute bibliothèque partagée qui est demandée par l'exécutable dynamiquement lié d'un paquet.

Il n'est pas nécessaire d'indiquer les dépendances d'un paquet envers des paquets marqués comme Essential (voir ci-dessous), et on ne doit pas le faire, à moins que ce ne soit une dépendance pour une version précise de tel paquet.

Dans certains cas, l'installation d'un paquet exige l'installation et la configuration préalables d'un autre paquet. Il faut alors déclarer une relation Pre-Depends pour ce paquet.

Vous ne déclarerez pas une relation Pre-Depends pour un paquet avant d'en avoir débattu dans la liste de diffusion debian-devel et qu'un consensus favorable se soit dégagé.

Les paquets virtuels

Parfois il y a des paquets qui font plus ou moins la même chose. Dans ce cas, il est utile de définir un paquet virtuel dont le nom décrit la fonction de ces paquets. (Les paquets virtuels existent de manière logique et non physique, c'est pour cela qu'ils sont appelés virtuels.) Les paquets assurant cette fonction viendront remplir ce paquet virtuel. Ainsi, tout autre paquet qui a besoin de cette fonction pourra simplement dépendre du paquet virtuel, sans avoir à énumérer tous les paquets possibles.

Tous les paquets utiliseront les noms de paquets virtuels quand il convient de le faire ; ils s'arrangeront pour en créer de nouveaux quand c'est nécessaire. On n'utilisera que les paquets virtuels qui ont été acceptés et qui apparaissent dans la liste des noms de paquets virtuels (sauf de manière privée, pour un ensemble local de paquets corrélés).

La plus récente version de la liste officielle des paquets virtuels se trouve sur ftp.debian.org dans /debian/doc/package-developer/virtual-package-names-list.text ou sur votre miroir local. De plus, elle est dans le paquet debian-policy. La procédure de mise à jour de la liste est décrite au début du fichier.

Les paquets dans « base »

Les paquets inclus dans la section base ont une fonction particulière. Ils forment le sous-ensemble minimal du système Debian GNU-Linux qui est installé, avant tout autre chose, sur un nouveau système. Ainsi, seulement un tout petit nombre de paquets peut aller dans la section base afin de minimiser la quantité d'espace disque nécessaire à une installation.

La plupart de ces paquets auront le niveau de priorité required ou au moins important et beaucoup d'entre eux seront étiquetés essential (voir ci-dessous).

Vous ne devez placer aucun paquet dans la section base avant qu'une discussion dans la liste de diffusion debian-devel n'ait abouti à un consensus sur le sujet.

les paquets « essential »

Certains paquets sont marqués essential. (Ils ont Essential: yes dans leur champ de contrôle.) Cet indicateur est utilisé pour les paquets qui sont indispensables à un système.

Comme ces paquets ne peuvent pas être facilement supprimés (il faut ajouter une option de forçage de dpkg) l'indicateur essential ne doit être utilisé que si c'est absolument nécessaire. Un paquet comprenant une bibliothèque partagée ne doit pas être étiquetée essential --les dépendances empêchent sa suppression prématurée, or il doit être possible de la supprimer quand elle est périmée.

Comme dpkg n'empêche pas la mise à jour de paquets alors qu'un paquet essential est non configuré, tous les paquets essential doivent fournir l'essentiel de leurs fonctions même s'ils ne sont pas configurés. Quand un paquet ne peut pas satisfaire cette exigence, il ne doit pas être étiqueté essential ; et tous les paquets qui en dépendent doivent, comme il est de règle, expliciter leurs dépendances.

Vous ne devez pas étiqueter un paquet comme essential avant qu'une discussion dans la liste de diffusion debian-devel n'ait abouti à un consensus sur le sujet.

Les scripts du responsable de paquet

Les scripts d'installation d'un paquet éviteront d'afficher des messages que l'utilisateur n'a pas besoin de voir et s'appuieront sur dpkg pour sauver de l'ennui un utilisateur qui installe de nombreux paquets. Cela signifie entre autres choses qu'il faut utiliser l'option --quiet de install-info.

Les paquets essaieront de minimiser le nombre de questions posées et s'assureront que chaque question ne sera posée qu'une seule fois. Cela signifie que les paquets doivent essayer d'utiliser les fichiers de configuration partagés (comme /etc/papersize ou /etc/nntpserver), plutôt que de redemander, chacun, le même morceau d'information.

Cela signifie aussi qu'une mise à jour ne reposera pas les mêmes questions, sauf si l'utilisateur a utilisé dpkg --purge pour supprimer la configuration du paquet. Les réponses aux questions de configuration seront enregistrées dans un emplacement approprié de /etc afin que l'utilisateur puisse les modifier. De plus, la manière de faire ces modifications sera documentée.

Si un paquet doit donner une information importante à l'utilisateur (comme « ne pas exécuter directement ce programme, vous devez d'abord modifier les fichiers de configuration suivants sinon votre système émettra des messages mal formatés »), il affichera ce message dans le script de post-installation (script postinst). Il demandera ensuite à l'utilisateur de taper sur la touche « retour-chariot » quand il a pris connaissance du message. Les messages de copyright et les instructions d'utilisation ne sont pas considérés comme des messages vitaux. Ils doivent apparaître respectivement dans /usr/share/doc/package/copyright et dans la documentation en ligne, où tous les utilisateurs peuvent les consulter.

Presque toujours, seul le script de post-installation doit poser les questions nécessaires ; et il doit empêcher, par une condition quelconque, qu'elles soient posées en cas d'échec de l'installation d'un paquet ou s'il est appelé avec abort-upgrade, abort-remove ou abort-deconfigure.

Le script d'installation détectera toute erreur qui se produit et arrêtera immédiatement l'installation.

On remarquera que la section , s'applique généralement aussi aux scripts des responsables de paquet.

On ne doit pas utiliser dpkg-divert sur un fichier appartenant à un autre paquet sans consulter au préalable le responsable du paquet en question.

Tous les paquets qui donnent une valeur au nom « partagé » d'une commande (en général, c'est un nom de fichier), utiliseront en général update-alternatives, de manière à rendre possible leur installation simultanée. Quand on n'emploie pas update-alternatives, chaque paquet doit utiliser Conflicts pour s'assurer que les autres paquets ne sont pas installés. (On peut spécifier dans ce cas un conflit avec quelques versions antérieures d'un paquet qui n'utilisait pas update-alternatives -- c'est une exception à la règle habituelle qui l'interdit.)

Les paquets source La conformité aux manuels Debian

Vous indiquerez la version la plus récente de la Charte Debian à laquelle se conforme le paquet. Cela se précise dans le champ de contrôle Standards-Version.

On utilise cette valeur pour remplir automatiquement des rapports de bogue quand le paquet est vraiment trop vieux.

Cette valeur correspond à une version des manuels Debian. On peut la trouver sur la page de titre ou bien en haut des pages (en bas, selon le format).

Le numéro de version est composé de quatre parties : un numéro majeur et un mineur, un niveau de patch majeur et un mineur. Quand les normes changent, exigeant des modifications dans tous les paquets, le numéro majeur est changé. Les changements significatifs, exigeant des évolutions dans de nombreux paquets, sont signalés par un changement du numéro mineur. Le niveau majeur de patch sera modifié pour tout changement limité de la signification des standards. Le niveau de patch mineur sera changé pour toute amélioration légère (typographique, ou autres...) qui ne modifie pas le sens, ou pour des changements qui n'affectent pas le contenu des paquets.

Seuls les trois premiers chiffres sont significatifs pour le champ Standards-Version, et les responsables de paquet peuvent choisir de donner soit les trois chiffres, soit la formule complète.

Par le passé, on devait donner la formule complète à quatre chiffres, par exemple : « 2.3.0.0 ». Mais comme un changement de niveau de « patch » n'introduit pas une nouvelle norme, on a trouvé préférable d'assouplir la règle et de ne demander qu'une formule à trois chiffres. (On peut toujours utiliser la formule complète si l'on veut.)

Vous consulterez régulièrement, et notamment si votre paquet est obsolète, la plus récente version de la Charte Debian, et vous mettrez à jour votre paquet si nécessaire. Lorsque le paquet est conforme à la nouvelle norme, vous mettrez à jour le champ Standards-Version du paquet source et vous le diffuserez.

Les relations entre paquets

Les paquets source préciseront les paquets binaires qui doivent être installés et ceux qui ne doivent pas l'être, pour que l'installation réussisse. Si l'on doit, par exemple, compiler un paquet avec tel compilateur particulier, une dépendance de compilation sera déclarée envers ce paquet.

Pour un très petit nombre de paquets , ceux dont on a toujours besoin pour compiler, lier et insérer dans un paquet debian un programme classique écrit en C ou C++ comme « Hello world! », il n'est pas nécessaire de déclarer explicitement des relations de dépendance. Ces paquets, sur lesquels on peut trouver des renseignements dans la liste /usr/share/doc/build-essential/list (contenue dans le paquet build-essential), sont marqués build-essential.

La liste des dépendances de compilation ne contiendra que les paquets explicitement nécessaires à la compilation. Les paquets simplement demandés parce qu'un paquet de cette liste dépend d'eux ne doivent pas être déclarés. La raison en est que les relations de dépendance changent et vous ne déclarerez que ce dont vous avez besoin. Ce dont les autres ont besoin est leur affaire.

Quand les relations de dépendance de compilation sont indiquées, on doit pouvoir compiler un paquet et produire un binaire opérationnel sur un système où les paquets build-essential sont installés et où les relations de dépendance de compilation sont satisfaites (y compris les implicites). Cela signifie en particulier que, dans les relations de dépendance de compilation, on doit traiter rigoureusement les questions de version de manière à éviter les paquets mal ou stupidement configurés quand les relations de dépendances sont correctement satisfaites.

Les modifications dans les « sources » originaux

Si vous modifiez d'une façon généralisable le code source, vous enverrez ces changements aux auteurs, dans la forme qu'ils préféreront, de manière à ce qu'ils puissent être intégrés dans la version originale.

Si vous avez besoin de configurer le paquet de façon différente sous Debian et sous Linux et si les sources originaux ne proposent pas de manière de le faire, veuillez ajouter ces moyens de configuration. C'est par exemple un nouveau test d'autoconf ou un #define. Envoyez ensuite le « patch » aux auteurs, en choisissant comme valeur par défaut la configuration qu'ils avaient choisie. Vous pouvez facilement remplacer la valeur par défaut dans votre debian/rules ou à tout autre endroit approprié.

Vous vérifierez que l'outil configure détecte la bonne déclaration d'architecture (reportez vous à la section pour plus de détails).

Si vous avez besoin de modifier un Makefile qui utilise des scripts configure de style « GNU », vous modifierez les fichiers .in, plutôt que directement le Makefile. Cela permet à l'utilisateur de reconfigurer le paquet si nécessaire. Vous ne devez pas configurer le paquet et modifier le Makefile produit ! Cela rend impossible la reconfiguration ultérieure du paquet par un autre utilisateur.

Comment documenter vos modifications ?

Vous documenterez vos modifications et vos mises à jour des sources du paquet dans le fichier ad hoc debian/changelog. (Plutôt que de « réécrire l'histoire » en modifiant les vieilles entrées, il vaut mieux corriger les erreurs en créant une nouvelle entrée dans le « changelog ».

Une copie du fichier qui est installé dans /usr/share/doc/package/copyright sera mise dans debian/copyright.

Dans les paquets définitifs, vous ne devez utiliser, pour debian/changelog, qu'un format supporté par la version la plus récente de dpkg. Si votre format n'est pas supporté par dpkg, mais qu'il est suffisamment commun, vous contacterez le responsable de dpkg afin qu'il ajoute le script analyseur de votre format dans le paquet dpkg. (Vous accepterez ainsi que l'analyseur et ses pages de manuel soient distribués sous la licence « GNU GPL », comme l'est le reste du paquet dpkg.)

La détection des erreurs dans les makefiles

Quand make appelle une commande dans un makefile (incluant les makefiles originaux de votre paquet et debian/rules), cela se fait par sh. Or sh traite mal les erreurs : si vous incluez un mini-script shell en tant que commande dans votre makefile, vous constaterez que si vous n'avez pas de mécanisme de détection d'erreur, make continuera aveuglément malgré les problèmes rencontrés.

Chaque fois que vous mettez plus d'une commande shell (cela inclut l'utilisation d'une boucle) dans une commande du makefile, vous devez vous assurer que les erreurs sont détectées. Pour de simples commandes composées comme changer de répertoire et exécuter un programme, il est suffisant d'utiliser « && » à la place du point-virgule. Pour des commandes plus complexes incluant la plupart des boucles et des conditionnelles, vous ajouterez la commande set -e au début de chacun de ces mini-scripts shell que sont les commandes d'un makefile.

Les constructions obsolètes et les bibliothèques

Le fichier d'« include » <varargs.h> est fourni pour les utilisateurs qui compilent des logiciels très anciens; la bibliothèque libtermcap est fournie pour l'exécution de programmes qui ont été liés avec elle (soit de vieux programmes, soit des programmes comme Netscape disponibles uniquement sous forme binaire).

Les paquets Debian doivent inclurent <stdarg.h> et ncurses au moment de leur construction.

Le système d'exploitation La hiérarchie du système de fichiers La structure du système de fichiers Linux

L'emplacement de tous les répertoires et fichiers installés doit être conforme au standard Linux sur la hiérarchie du système de fichier (FHS). On peut trouver la plus récente version de ce document avec ce manuel ou sur La distribution Debian donne actuellement une version préliminaire de la version 2.1 du « FHS » parce que plusieurs détails significatifs ont changé entre la version actuelle 2.0 et la version à venir 2.1.. Toute question relative à la manière de suivre ce standard peut-être posée dans la liste de diffusion debian-devel ou à Daniel Quinlan, le coordinateur FHS à l'adresse quinlan@pathname.com.

Les programmes spécifiques à un site

Conformément au « FHS », aucun paquet ne doit placer de fichiers dans/usr/local, que ce soit en les mettant dans l'archive qui doit être dépaquetée par dpkg ou que ce soit en les manipulant dans les scripts d'installation.

Cependant, un paquet peut créer des répertoires vides sous /usr/local de manière que l'administrateur système ait un endroit où placer des fichiers locaux. S'ils sont vides, ces répertoires seront supprimés quand on supprime le paquet.

On notera que cela ne s'applique qu'aux répertoires sous /usr/local et non pas dans /usr/local. Le répertoire /usr/local ne doit contenir lui-même que les répertoires listés dans le FHS, section 4.6. Cependant vous pouvez créer autant de répertoires que vous voulez sous ces répertoires. Vous ne devez pas supprimer les répertoires listés à la section 4.6, même si vous les avez créés.

Comme /usr/local peut être monté en lecture seule depuis un serveur distant, on doit créer ces répertoires avec les scripts de post-installation, postinst et on doit les supprimer avec les scripts de pré-désinstallation, prerm. Ces scripts ne doivent pas échouer si l'une de ces opérations échoue. (À l'avenir, il sera possible d'indiquer à dpkg de ne pas extraire tel fichier correspondant à tels critères ; ce qui permettra d'inclure ces répertoires dans le paquet .deb. Les administrateurs système qui le désirent, pourront alors empêcher l'installation de ces répertoires dans /usr/local.)

Par exemple, le paquet emacs contiendra mkdir -p /usr/local/lib/emacs/site-lisp || true dans le script postinst, et rmdir /usr/local/lib/emacs/site-lisp && \ rmdir /usr/local/lib/emacs || \ true dans le script prerm.

Si vous créez un répertoire dans /usr/local pour « localiser » un paquet, vous vous assurerez que le paramétrage dans /usr/local sera prioritaire par rapport à celui dans /usr.

Cependant, puisque « /usr/local » et son contenu sont réservés à l'administrateur local, un paquet ne doit pas compter sur la présence ou l'absence de fichiers ou répertoires dans « /usr/local » pour toute opération normale.

Le répertoire /usr/local lui-même et tous les sous-répertoires créés par un paquet, auront (par défaut) les droits 2775 (modifiable et exécutable par le groupe (bit « set-group-id » positionné)). Ils doivent appartenir à root.staff.

Les utilisateurs et les groupes

Le système Debian est configuré pour utiliser soit les mots de passe ordinaires soit les mots de passe masqués (« shadow password »).

L'utilisation de quelques identifiants d'utilisateur (UIDs) et de groupe (GIDs) est réservée à certains paquets. Ces paquets ont besoin d'inclure des fichiers appartenant à ces utilisateurs ou à ces groupes, ou bien ont besoin de compiler des binaires avec ces identifiants ; c'est pourquoi, sur tout système Debian, ces identifiants ne pourront être utilisés que dans ce cadre prédéfini. C'est une restriction importante, et on évitera d'interférer avec des politiques particulières d'administration système. De nombreux sites notamment allouent des utilisateurs et/ou des groupes systèmes spécifiques à partir de 100.

En dehors de cet aspect, les identifiants seront attribués dynamiquement et seront rangés selon un ordre raisonnable mais qui peut être redéfini.

Seul le paquet base-passwd a le droit de modifier /etc/passwd, /etc/shadow, ou /etc/group.

L'ordre des « UID » et des « GID » est le suivant : 0-99:

Attribués en bloc par le projet Debian, ils doivent être identiques sur tout système Debian. Ces identifiants apparaîtront dans les fichiers passwd et group de tout système Debian, tout nouvel identifiant dans cet intervalle étant automatiquement ajouté quand le paquet base-passwd est mis à jour.

Un paquet qui a besoin d'un identifiant UID ou GID unique et attribué de manière fixe utilisera cet intervalle ; le responsable demandera son obtention au responsable de base-passwd.

100-999:

Utilisateurs et groupes-système attribués dynamiquement. Les paquets qui ont besoin d'un utilisateur ou d'un groupe et qui tolèrent que cet identifiant soit attribué dynamiquement et différemment sur chaque système, utiliseront adduser --system pour la création d'un tel groupe et/ou utilisateur. Le programme adduser vérifie qu'un tel groupe ou utilisateur n'existe pas déjà et utilise si nécessaire un autre identifiant dans l' intervalle spécifié par adduser.conf.

1000-29999:

Comptes utilisateurs attribués dynamiquement. Par défaut, adduser choisit les « UIDs » et les « GIDs » pour les comptes utilisateurs dans cet intervalle, bien que adduser.conf puisse modifier ce comportement.

30000-59999:

Usage réservé.

60000-64999:

Attribués en bloc par le projet Debian, mais ils ne sont créés qu'à la demande. Les identifiants sont attribués de manière fixe et centralisée mais les comptes ne sont effectivement créés sur le système qu'à la demande.

Ces identifiants sont réservés à des paquets obscurs ou à des paquets qui demandent de nombreux identifiants attribués de manière fixe. Ces paquets doivent s'assurer de l'inexistence de ces comptes dans /etc/passwd ou dans /etc/group et les créer eux-mêmes si nécessaire (en utilisant si possible adduser). Les paquets qui risquent d'avoir besoin de davantage d'identifiants, se réserveront un intervalle d'attribution plus large que de besoin, laissant ainsi des possibilités de développement.

65000-65533:

Usage réservé.

65534:

Utilisateur « nobody ».

65535:

(uid_t)(-1) == (gid_t)(-1). NE DOIT PAS ÊTRE UTILISÉ, car il s'agit de la valeur sentinelle pour retourner une erreur.

Les niveaux de fonctionnement du système Introduction

Le répertoire /etc/init.d contient les scripts exécutés par init quand le système démarre et quand l'état de init (son « niveau de fonctionnement ») est modifié (voir ).

Il y a au moins deux façons, différentes mais fonctionnellement équivalentes, de se servir de ces scripts. Pour rester simple, on décrit ici la méthode des liens symboliques. On ne doit cependant pas présumer que cette méthode est utilisée, et toute manipulation sur le comportement des différents niveaux de fonctionnement doit être faite avec le programme update-rc.d comme décrit plus bas, et non pas en créant soi même les liens symboliques. Voyez la documentation du paquet file-rc pour des renseignements sur la mise en oeuvre de l'autre méthode.

Ces scripts sont référencés par des liens symboliques dans les répertoires /etc/rcn.d. Lorsque le niveau de fonctionnement change, init recherche les scripts qu'il doit exécuter dans le répertoire /etc/rcn.d, où n est soit le niveau de fonctionnement demandé soit « S » pour le démarrage.

Les noms de ces liens sont tous de la forme Smmscript ou de la forme Kmmscript ; mm est un nombre à deux chiffres et script est le nom du script (qui sera le même que le véritable script dans /etc/init.d).

Lorsque init change de niveau de fonctionnement, il exécute d'abord les scripts référencés par les liens dont le nom commence par K, chacun avec un seul argument: stop. Puis init exécute les scripts préfixés par S, avec pour chacun un seul argument: start. Les liens K sont chargés d'arrêter les services et les liens S de démarrer les services au démarrage du niveau de fonctionnement.

Par exemple, pour passer du niveau 2 au niveau 3, init exécutera d'abord tous les scripts préfixés par K qu'il trouve dans /etc/rc3.d, puis tous les scripts préfixés par S. Les liens qui commencent par K entraîneront l'exécution des scripts qu'ils référencent avec l'argument stop alors que les liens S entraîneront l'exécution des scripts avec l'argument start.

Le nombre à deux chiffres mm est utilisé pour décider de l'ordre d'exécution des scripts de démarrage et d'arrêt. Les scripts de numéros les plus faibles sont exécutés en priorité. Par exemple les scripts K20 seront exécutés avant les scripts K30. Cela sert quand un service doit être démarré avant un autre. Par exemple, il peut être nécessaire de démarrer le serveur de noms bind avant le serveur de news inn afin que inn puisse positionner ses listes d'accès. Dans ce cas, le script de démarrage de bind doit avoir un numéro plus faible que le script qui démarre inn: /etc/rc2.d/S17bind /etc/rc2.d/S70inn

L'écriture des scripts

Les paquets qui mettent en service des « démons » mettront des scripts dans /etc/init.d pour démarrer ou arrêter des services au moment de l'amorçage ou pour un changement du niveau de fonctionnement. Ces scripts seront nommés /etc/init.d/package et ne doivent prendre qu'un seul argument, lequel indique ce qu'il faut faire : start

démarrer le service,

stop

arrêter le service,

restart

arrêter et redémarrer le service,

reload

chargement d'une nouvelle configuration du service sans réellement arrêter et redémarrer le service,

force-reload

chargement d'une nouvelle configuration si le service le permet, sinon redémarrer le service.

Les options start, stop, restart, et force-reload seront acceptés par tous les scripts de /etc/init.d ; l'option reload est facultative.

Les scripts de /etc/init.d auront un comportement raisonnable quand ils sont appelés avec l'option start alors que le service tourne déjà. Il en est de même pour l'option stop quand le service ne tourne pas. Ils ne doivent pas tuer des processus utilisateurs appelés par mégarde. Le meilleur moyen est généralement d'utiliser start-stop-daemon.

Quand un service recharge automatiquement sa configuration (comme c'est le cas de cron par exemple), l'option reload du script dans /etc/init.d se comportera comme si la configuration avait été rechargée avec succès.

Ces scripts ne doivent pas échouer de façon obscure quand ils trouvent dans le système les fichiers de configuration d'un paquet supprimé ; en effet par défaut, dpkg conserve ces fichiers de configuration et ne les supprime qu'avec l'option --purge. En particulier, le script « init » lui même est un fichier de configuration (voir ) et reste sur le système quand le paquet est supprimé avec l'option « remove » et non pas avec l'option « purge ». C'est pourquoi vous inclurez une instruction test au début du script, comme par exemple : test -f program-executed-later-in-script || exit 0

La gestion des liens

Le programme update-rc.d facilite la création et la suppression des liens symboliques dans /etc/rcn.d, ou de leurs équivalents fonctionnels quand on utilise une autre méthode. Les responsables de paquet peuvent s'en servir dans leurs scripts postinst et postrm.

On doit utiliser ce programme pour faire des modifications dans le répertoire /etc/rcn.d et ne jamais inclure des liens symboliques dans le /etc/rcn.d du système réel, ni en créer ou en supprimer directement dans les scripts du responsable de paquet. (Dans ce dernier cas, cela échouera si le système d'information sur les niveaux de fonctionnement utilise une autre méthode.)

Par défaut, update-rc.d démarrera les serveurs dans chacun des niveaux de fonctionnement du système (2, 3, 4 et 5) pour le mode multi-utilisateurs et les arrêtera dans le niveau (0) mode halt, le niveau (1) mode mono-utilisateur et le niveau (6) mode reboot. L'administrateur système pourra paramétrer les niveaux de fonctionnement soit en ajoutant, supprimant ou déplaçant les liens symboliques contenus dans /etc/rcn.d si la méthode des liens symboliques est utilisée, soit en modifiant /etc/runlevel.conf quand on utilise la méthode file-rc.

Pour obtenir le comportement par défaut pour votre paquet, mettez dans le script postinst : update-rc.d package defaults >/dev/null et dans votre postrm if [ purge = "$1" ]; then update-rc.d package remove >/dev/null fi

Le numéro d'ordre d'exécution par défaut sera égal à 20. Si l'ordre ou le moment d'exécution du script sont indifférents, utilisez cette valeur par défaut. S'ils sont importants, vous devez en discuter avec le responsable du paquet sysvinit ou envoyer un message à debian-devel. Ceci devrait vous aider à déterminer le numéro d'ordre d'exécution.

Pour plus d'informations sur l'utilisation d'update-rc.d, veuillez consulter sa page de manuel .

L'initialisation au moment de l'amorçage

Classiquement, un autre répertoire, /etc/rc.boot, contenait les scripts exécutés seulement au démarrage. Mais on préfère maintenant se servir de liens de /etc/rcS.d vers les fichiers dans /etc/init.d, comme décrit dans . Aucun paquet ne doit placer de fichiers dans /etc/rc.boot.

Notes

N'incluez pas les liens symboliques de /etc/rcn.d/* dans l'archivage produisant un fichier .deb ! C'est une source de problèmes ! Vous devez les créer avec update-rc.d, comme il est dit plus haut.

N'incluez pas les liens symboliques de /etc/rcn.d/* dans la liste de fichiers de configuration de dpkg ! C'est une source de problèmes ! Mais vous considérerez les scripts de /etc/init.d comme des fichiers de configuration, soit en les marquant comme fichiers de configuration soit en les traitant correctement dans les scripts du responsable de paquet (voir ). (C'est important car nous voulons laisser à l'administrateur système la possibilité d'adapter ces scripts à son système local -- par exemple, désactiver un service sans désinstaller le paquet, ou bien spécifier des options particulières sur la ligne de commande au démarrage d'un service -- tout en assurant que ses modifications ne seront pas perdues lors de la prochaine mise à jour du paquet.)

Exemple

Le paquet bind, un serveur de noms de domaine (DNS), veut s'assurer que le serveur de noms s'exécute à un niveau de fonctionnement multi-utilisateurs et qu'il est correctement fermé à l'arrêt du système. Il place un script dans /etc/init.d et le nomme judicieusement bind. Comme vous pouvez le constater, le script interprète l'argument reload pour envoyer le signal HUP au serveur de nom (ce qui provoque le rechargement de sa configuration) ; de cette manière, l'utilisateur peut utiliser la commande /etc/init.d/bind reload pour recharger la configuration du serveur de noms.

#!/bin/sh # # Original version by Robert Leslie # <rob@mars.org>, edited by iwj and cs test -x /usr/sbin/named || exit 0 case "$1" in start) echo -n "Starting domain name service: named" start-stop-daemon --start --quiet --exec /usr/sbin/named echo "." ;; stop) echo -n "Stopping domain name service: named" start-stop-daemon --stop --quiet \ --pidfile /var/run/named.pid --exec /usr/sbin/named echo "." ;; restart) echo -n "Restarting domain name service: named" start-stop-daemon --stop --quiet \ --pidfile /var/run/named.pid --exec /usr/sbin/named start-stop-daemon --start --verbose --exec /usr/sbin/named echo "." ;; force-reload|reload) echo -n "Reloading configuration of domain name service: named" start-stop-daemon --stop --signal 1 --quiet \ --pidfile /var/run/named.pid --exec /usr/sbin/named echo "." ;; *) echo "Usage: /etc/init.d/bind {start|stop|restart|reload|force-reload}" >&2 exit 1 ;; esac exit 0

Un autre exemple sur lequel baser les scripts de /etc/init.d se trouve dans /etc/init.d/skeleton.

Si ce paquet se satisfait des valeurs par défaut de update-rc.d, en l'occurence un numéro d'ordre d'exécution égal à 20 et l'exécution dans tous les niveaux de fonctionnement, il peut indiquer dans son script postinst: update-rc.d bind defaults >/dev/null et dans son script postrm, pour supprimer les liens quand le paquet est purgé : if [ purge = "$1" ]; then update-rc.d bind remove >/dev/null fi

Les travaux de « Cron »

Les paquets ne doivent pas modifier le fichier de configuration /etc/crontab, ni les fichiers contenus dans /var/spool/cron/crontabs.

Quand un paquet veut confier une tâche au programme cron, il doit placer un fichier de même nom que lui dans l'un des répertoires suivants : /etc/cron.daily /etc/cron.weekly /etc/cron.monthly Comme l'indique le nom de ces répertoires, les fichiers sont exécutés une fois par jour, une fois par semaine ou une fois par mois. Le rythme exact est contenu dans /etc/crontab.

Tous les fichiers installés dans l'un de ces répertoires doivent être des scripts (scripts shell, perl, etc.) pour que l'administrateur du système local puisse facilement les modifier. De plus ils seront traités comme des fichiers de configuration.

Quand une tâche doit s'exécuter plus souvent que quotidiennement, le paquet installera un fichier /etc/cron.d/nom-du-paquet. Ce fichier a la même syntaxe que le fichier /etc/crontab et est traité automatiquement par cron. Il doit aussi être considéré comme un fichier de configuration. (On remarquera que le programme anacron ne se sert pas des scripts dans le répertoire /etc/cron.d. Vous ne l'utiliserez donc que pour des tâches qui peuvent être omises si le système ne tourne pas.)

Les scripts ou les entrées de la « crontab » dans ces répertoires doivent vérifier d'abord la présence de tous les fichiers nécessaires à leur exécution. Sinon, il y aura des problèmes avec les paquets qui ont été supprimés sans l'option « purge », car, dans ce cas, les fichiers de configuration sont conservés.

Les messages de la console

Cette section décrit les formats des différents messages que les scripts du répertoire /etc/init.d écrivent sur la sortie standard. L'objectif est d'améliorer la cohérence du style Debian en matière de séquences de démarrage et d'arrêt d'un système.

Veuillez faire très attention aux détails. Nous voulons que les messages fassent une utilisation identique des espaces, de la ponctuation et de la casse des lettres.

Voici une liste des règles générales à respecter pour la création de messages en sortie. Elles peuvent être utiles si vous avez des messages non standards qui ne sont pas abordés par les sections suivantes.

Tous les messages tiendront sur une ligne. Ils commenceront par une capitale et se termineront par un point « . ».

Quand vous voulez signaler que l'ordinateur est occupé (exécution d'une tâche particulière et non pas le démarrage ou la fermeture d'un programme), utilisez une « ellipse », à savoir trois points « ... ». Vous remarquerez que nous n'insérons pas d'espace avant ou après les points. Quand la tâche est terminée nous écrivons « done. » et un retour à la ligne.

Concevez vos messages comme si l'ordinateur vous disait ce qu'il fait (rendez-le poli :-), mais n'en faites pas un personnage. Par exemple, si vous voulez dire : I'm starting network daemons: nfsd mountd. dites simplement : Starting network daemons: nfsd mountd.

Les formats suivants seront utilisés :

au lancement d'un démon.

Utilisez ce format si votre script démarre un ou plusieurs démons. Le message en sortie (une seule ligne, sans espaces en fin de ligne) doit ressembler à ceci : Starting <description>: <daemon-1> <daemon-2> <...> <daemon-n>. L'élément <description> décrira le sous-système dont fait partie le ou les démons alors que les éléments de <daemon-1> jusqu'à <daemon-n> indiqueront chacun le nom du démon (typiquement le nom du fichier programme).

Par exemple, la sortie de /etc/init.d/lpd ressemble à : Starting printer spooler: lpd.

Ce qui peut être obtenu en écrivant dans le script : echo -n "Starting printer spooler: lpd" start-stop-daemon --start --quiet lpd echo "." Si vous avez plusieurs démons à démarrer, vous pouvez écrire le code suivant : echo -n "Starting remote file system services:" echo -n " nfsd"; start-stop-daemon --start --quiet nfsd echo -n " mountd"; start-stop-daemon --start --quiet mountd echo -n " ugidd"; start-stop-daemon --start --quiet ugidd echo "." L'utilisateur peut savoir ainsi ce qui prend tant de temps et quand le dernier démon a été démarré. Vous serez précis avec les espaces : dans l'exemple précédent un administrateur système peut facilement commenter une ligne s'il ne veut pas lancer un démon particulier; le message affiché reste correct.

quand quelque chose doit être configuré.

Si vous devez positionner différents paramètres au démarrage du système, vous utiliserez ce format : Setting <parameter> to `<value>'.

vous pouvez utiliser le message suivant qui place correctement les guillemets : echo "Setting DNS domainname to \`"value"'."

Il faut noter que l'apostrophe à gauche (`) est différente de l'apostrophe à droite (').

quand on arrête un démon.

Quand vous arrêtez un démon, vous devez afficher un message similaire à celui du démarrage en remplaçant « Starting » par « Stopping ».

Le message à l'arrêt du démon printer sera : Stopping printer spooler: lpd.

quand on exécute un programme.

Il y a plusieurs cas où vous devez lancer un programme soit au démarrage soit à l'arrêt du système pour exécuter des tâches spécifiques. Par exemple, initialiser l'heure système à l'aide de « netdate » ou bien tuer tous les processus à l'arrêt du système. Vos messages suivront cet exemple : Doing something very useful...done. Vous afficherez le « done. » immédiatement après la fin de la tâche de manière que l'utilisateur soit renseigné sur le pourquoi de son attente. Pour cela, mettez dans votre script : echo -n "Doing something very useful..." do_something echo "done."

quand la configuration est rechargée.

Quand un démon est forcé de recharger ses fichiers de configuration, vous utiliserez des messages qui suivent le format suivant : Reloading <daemon's-name> configuration...done.

quand aucune des règles précédentes ne s'applique.

Si vous devez imprimer un message qui n'entre dans aucune des catégories précédentes, vous pouvez l'écrire comme vous l'entendez, mais veuillez prendre en compte les règles générales énoncées plus haut.

Les menus

Les rubriques d'un menu suivront la politique exposée dans le fichier /debian/doc/package-developer/menu-policy.txt qu'on peut trouver sur ftp.debian.org ou un miroir local. Il est aussi dans le paquet debian-policy.

Le paquet Debian menu propose une interface remarquable entre les paquets qui fournissent des applications ou des documents et les programmes offrant des menus (aussi bien des gestionnaires de fenêtres sous X que des programmes qui fournissent des menus en mode texte, comme par exemple pdmenu).

Les paquets renseigneront une rubrique de menu pour toutes les applications qui, pour leur usage normal, n'ont pas besoin de recevoir d'argument particulier depuis la ligne de commande. Ainsi les utilisateurs du paquet menu auront automatiquement des rubriques de menu pour ces applications dans leurs gestionnaires de fenêtre et dans des shells comme pdmenu.

Veuillez vous référer au document Debian Menu System livré avec le paquet menu pour plus d'information sur la manière de déclarer vos applications et vos documents web.

Outils pour le multimédia

Les paquets qui proposent des solutions pour lire-afficher-jouer, composer, modifier ou imprimer les types « MIME » déclareront cette capacité, et se conformeront ainsi à l'actuelle politique concernant « MIME », telle qu'elle est définie dans le fichier /debian/doc/package-developer/mime_policy.txt ; fichier qu'on peut trouver sur ftp.debian.org ou sur un miroir local. Ce fichier est aussi dans le paquet debian-policy.

MIME (Multipurpose Internet Mail Extensions, RFC 1521) est un manière de coder les fichiers et les flux de données et de donner des informations supplémentaires, telles que, par exemple, leur type (c.-à-d. audio ou vidéo) et leur format (c.-à-d. PNG, HTML, MP3).

La déclaration de cette capacité à traiter les types « MIME » permet à des programmes comme les logiciels de courrier (mua) ou les butineurs web de faire appel à ces outils pour lire, éditer ou afficher les types « MIME » qu'ils ne supportent pas directement.

La configuration du clavier

Pour obtenir une configuration cohérente du clavier (c.-à-d. que tous les programmes interprètent les événements clavier de la même manière), tous les programmes de la distribution Debian doivent suivre les directives suivantes :

Voici une liste de quelques touches avec leur interprétation : <--

supprime le caractère à gauche du curseur

Delete

supprime le caractère à droite du curseur

Control+H

emacs: le préfixe d'aide

L'interprétation des événements clavier sera indépendante du terminal utilisé (la console, X Window, une session rlogin ou telnet, etc.).

La liste suivante explique comment les différents programmes seront configurés pour y arriver :

`<--' génère KB_Backspace sous X.

`Delete' génère KB_Backspace sous X.

Le mécanisme « X translations » est configuré pour que KB_Backspace déclenche ASCII DEL et que KB_Delete déclenche ESC [ 3 ~ (c'est la séquence d'échappement du vt220 pour la touche « delete character »). Il faut charger les ressources sur tous les serveurs locaux « X » à l'aide de xrdb et ne pas utiliser les « défauts » des applications pour que les ressources de translation correspondent aux choix de xmodmap.

La console Linux est configurée pour que la touche <-- déclenche DEL et « Delete » déclenche ESC [ 3 ~ (c'est actuellement le cas).

Les applications X sont configurées pour que « Backspace » efface à gauche et « Delete » efface à droite. Les applications Motif fonctionnent déjà de cette manière.

stty erase ^? .

L'entrée « xterm » dans terminfo doit avoir ESC [ 3~ pour kdch1, tout comme TERM=linux et TERM=vt220.

Emacs est programmé pour associer « KB_ckspace » ou le caractère « stty erase » à « delete-backward-char ». Il associe « KB_Delete » ou « kdch1 » à « delete-forward-char » et associe ^H à help comme toujours.

D'autres applications utilisent le caractère « stty erase » et kdch1 comme deux touches d'effacement. ASCII DEL est la « suppression du caractère précédent ». kdch1 est la « suppression du caractère sous le curseur ».

Tout ceci résout le problème sauf dans les cas suivants :

Certains terminaux ont une touche <-- qui ne peut pas produire autre chose que ^H. Sur ces terminaux l'aide d'Emacs ne sera pas accessible à partir de ^H (en supposant que le caractère « stty erase » est prioritaire dans Emacs et qu'il ait été bien configuré). Les touches « M-x help » ou « F1 » (si elles sont disponibles) peuvent être utilisées en remplacement.

Certains systèmes utilisent ^H pour « stty erase ». Cependant les versions modernes de telnet et toutes les versions de rlogin diffusent les configurations « stty ». Presque toutes les versions d'UNIX acceptent « stty erase ». Quand la configuration « stty » n'est pas reproduite correctement, on peut résoudre le problème en utilisant « stty » manuellement.

Certains systèmes (notamment des versions antérieures de Debian) utilisent xmodmap pour que <-- et « Delete » déclenchent « KB_Delete ». Nous pouvons changer le comportement de leurs clients X à l'aide des mêmes ressources que nous avons utilisées ou bien configurer nos propres clients avec les ressources de ces systèmes dans le cas inverse. Sur des serveurs configurés de cette manière, <-- fonctionnera mais pas « Delete ».

Certains systèmes d'exploitation ont d'autres configurations pour « kdch1 » dans leur terminfo pour xterm et consort. Sur ces systèmes, la touche « Delete » ne fonctionnera pas quand vous vous connecterez depuis un système qui suit notre politique. <-- fonctionnera.

Les variables d'environnement

Un programme ne doit pas dépendre des variables d'environnement pour déterminer des valeurs par défaut (cela impliquerait de définir ces variables globalement au niveau du système par exemple dans /etc/profile, ce que tous les shells ne permettent pas).

Quand un programme dépend de variables d'environnement pour sa configuration, il doit prévoir, en leur absence, une configuration raisonnable par défaut. Si c'est difficile à faire (p.ex. quand le code source d'un programme non libre n'est pas disponible), le programme doit être remplacé par un petit shell script enveloppant (« wrapper ») qui positionne les variables d'environnement et appelle le programme initial.

Voici un exemple de script enveloppant écrit dans ce but : #!/bin/sh BAR=${BAR:-/var/lib/fubar} export BAR exec /usr/lib/foo/foo "$@"

De plus, comme /etc/profile est un fichier de configuration du paquet bash, aucun autre paquet ne peut y ajouter des variables d'environnement ou des commandes.

Les fichiers Les fichiers binaires

Deux paquets ne doivent pas installer des programmes qui ont des fonctions différentes tout en ayant le même nom. (Le cas de deux programmes avec les mêmes fonctionnalités mais des implémentations différentes est traité via « alternatives ».) Si ce cas se produit, un des deux programmes doit changer de nom. Les responsables rapporteront ce problème sur la liste de distribution debian-devel pour essayer de trouver un consensus. Si aucun consensus n'est trouvé, le nom des deux programmes doit être changé.

Généralement on utilisera les paramètres de compilation suivants : CC = gcc CFLAGS = -O2 -g -Wall # sane warning options vary between programs LDFLAGS = # none install -s # (or use strip on the files in debian/tmp)

On remarquera que tous les binaires installés sont épurés de tout symbole, soit en utilisant l'option -s de install, soit en appliquant le programme strip sur les binaires après qu'ils ont été copiés dans debian/tmp mais avant qu'une arborescence ne soit faite pour le paquet.

L'option -N ne sera pas utilisée. Dans les systèmes « a.out » cela pouvait être utile pour de tout petits binaires, mais cela n'a pas d'intérêt dans les systèmes « ELF ».

Les symboles de débogage sont utiles pour la détection des erreurs, la recherche dans un « core dump » (envoyé par un utilisateur pour un rapport de bogue), ou bien dans la phase de développement d'un logiciel. C'est pourquoi on construira un paquet avec des instructions pour le débogage de la manière suivante : si la variable d'environnement DEB_BUILD_OPTIONS contient la chaîne debug, on compile le logiciel avec les informations de débogage (habituellement on ajoute le drapeau -g à CFLAGS). Cela permet la construction d'une arborescence avec les informations de débogage. Si la variable d'environnement DEB_BUILD_OPTIONS contient nostrip, on n'épure pas les fichiers durant la phase d'installation. Cela permet de produire un paquet avec des informations de débogage. Le bout de makefile suivant est une des façons de tester l'une et l'autre condition

Argument : compiler par défaut avec l'option -g gaspille davantage de cycles CPU puisque les informations sont de toute manière enlevées. Le paquet peut être compilé sans l'option -g s'il fournit un mécanisme qui facilite sa recompilation avec les informations de débogage. Il faut pour cela fournir une cible de « make » appelée « build-debug », ou bien permettre à l'utilisateur de spécifier « DEB_BUILD_OPTIONS=debug » pour l'environnement de compilation du paquet. Et cela offre quelques avantages supplémentaires :

C'est réellement plus facile de construire des binaires ou des bibliothèques avec des informations de débogage de cette manière (plus besoin de modifier debian/rules et autres) car cela donne une façon documentée d'obtenir ce genre de compilation.

Beaucoup moins de temps CPU sera gaspillé par les « autobuilders » puisque ne pas avoir les informations de débogage (et donc ne pas avoir à les enlever) accélérera la vitesse de compilation. Cela saute une passe entière du compilateur.

: CFLAGS = -O2 -Wall INSTALL = install ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) CFLAGS += -g endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL += -s endif

C'est au responsable du paquet de décider des meilleures options de compilation. Certains binaires (comme ceux qui font des calculs intensifs) fonctionnent mieux avec certaines options (p.ex. -O3) ; faites comme vous voulez. Utilisez ces options avec discernement ; pour de bonnes raisons, pas seulement pour elles-mêmes. Ne craignez pas de remplacer les options qu'avait choisies l'auteur du programme original : elles sont souvent inappropriées dans votre environnement.

Les bibliothèques

Toutes les bibliothèques doivent avoir une version partagée dans le paquet « lib » et une version statique dans le paquet « lib-dev ». La version partagée doit être compilée avec les options -fPIC mais pas la version statique. En d'autres termes, tous les fichiers *.c doivent être compilés deux fois.

Vous devez indiquer l'option -D_REENTRANT de gcc quand vous compilez une bibliothèque (statique ou dynamique) pour qu'elle soit compatible avec les « threads » Linux.

On remarquera que toutes les bibliothèques partagées qu'on installe doivent être épurées de tout symbole par : strip --strip-unneeded <your-lib> (L'option « --strip-unneeded » fait que strip enlève uniquement les symboles qui ne sont pas utiles au mécanisme de réallocation.) Les bibliothèques partagées fonctionnent parfaitement bien quand elles sont épurées, car les symboles de liens dynamiques sont dans une autre partie du fichier objet « ELF ».

Il faut noter que dans certaines circonstances, il peut être utile d'installer une bibliothèque non épurée, p.ex. pour la construction d'un paquet d'aide au débogage.

Un nombre toujours croissant de paquets utilisent « libtool » pour l'édition de liens. La plus récente version de « GNU libtools (>= 1.3a) » peut se servir avantageusement des meta-données contenues dans les fichiers ( « *.la ») de « libtool ». Le principal avantage de ces fichiers est que « libtool » peut conserver ces meta-données et donc y accéder en fonction des bibliothèques qu'il construit. « Libtool » cherche ces fichiers et les renseignements utiles qu'ils contiennent à propos des bibliothèques (p.ex. les bibliothèques nécessaires pour une édition de liens statique).Ils sont aussi indispensables aux programmes utilisant « libltdl ».

Sans doute, « libtool » peut faire de l'édition de liens avec des bibliothèques qui n'ont pas de fichier « .la » ; mais, n'étant qu'un simple script shell, il peut augmenter considérablement le temps de compilation d'un paquet s'il doit, pour chaque bibliothèque et chaque fois qu'elle est liée, déduire tous ces renseignements des premiers principes. Avec l'apparition de « libtool-1.4 » (et dans une moindre mesure de « libtool-1.3 »), les fichiers « .la » garderont des renseignements sur les dépendances entre bibliothèques qui ne peuvent pas être nécessairement déduits une fois détruit le fichier « .la ».

Les paquets qui se servent de « libtool » pour créer des bibliothèques partagées mettront les fichiers .la dans les paquets -dev ; dans le cas où un paquet compte sur la bibliothèque libltdl de « libtool », les fichiers .la iront dans le paquet de la bibliothèque. En général c'est une bonne idée, et particulièrement pour les questions d'édition de liens statiques.

Vous devez vous assurer que vous n'utilisez que les versions diffusées des bibliothèques partagées pour construire vos paquets ; dans le cas contraire, les autres utilisateurs ne pourront pas exécuter vos binaires correctement. Produire des paquets sources qui dépendent de compilateurs non autorisés est habituellement une mauvaise idée.

Les bibliothèques partagées

Un paquet qui contient des bibliothèques partagées sera séparé en plusieurs paquets binaires.

Pour une bibliothèque classique constituée d'un environnement de développement et d'un kit fonctionnel comprenant simplement des bibliothèques partagées, vous devez créer deux paquets : nom-de-bibliothèqueso-nom et nom-de-bibliothèqueso-nom-dev (où so-nom est le nom du fichier objet partagé de la bibliothèque partagée -- c'est ce qui, entre le moment de la construction de l'exécutable et celui de son fonctionnement, doit être exactement le même pour que l'éditeur de liens dynamiques soit capable de faire marcher le programme ; habituellement so-nom est le numéro majeur de la bibliothèque).

Si vous préférez ne gérer qu'une version de développement à la fois, vous pouvez nommer le paquet de développement nom-de-bibliothèque-dev ; sinon, vous pouvez utiliser les mécanismes de gestion de conflit de dpkg pour vous assurer que l'utilisateur ne peut installer qu'une seule version de développement à la fois. (Après tout ! plusieurs versions de développement auront sans doute les mêmes fichiers d'en-tête, ce qui créera un conflit de nom.) En général, la version de développement aura une dépendance vers la bonne version de la bibliothèque fonctionnelle, afin que la compilation et l'édition de liens s'effectuent correctement.

Un paquet qui utilise une bibliothèque partagée aura une dépendance vers le nom du paquet de la bibliothèque partagée, nom-de-bibliothèqueso-nom. Quand so-nom est modifié, les deux versions de la bibliothèque peuvent cohabiter pendant le passage de l'ancienne à la nouvelle.

Si votre paquet contient des programmes d'aide au fonctionnement qui utilisent la bibliothèque partagée, vous ne devez pas les mettre dans le paquet de la bibliothèque partagée. Si vous le faites, vous ne pourrez pas installer plusieurs versions de la bibliothèque sans créer des conflits de noms de fichiers. À la place, vous pouvez soit créer un troisième paquet pour ces binaires fonctionnels (le paquet doit typiquement s'appeler nom-de-bibliothèque-runtime -- notez l'absence de so-nom dans le nom du paquet), soit inclure ces binaires dans le paquet de développement si celui-ci est petit.

Si vous construisez plusieurs bibliothèques partagées à partir d'un même arbre de sources, vous pouvez les regrouper dans le même paquet de bibliothèques, sachant que vous devrez changer tous leurs so-nom simultanément (pour éviter des conflits de noms de fichiers lors de l'installation de différentes versions de ce paquet).

Vous suivrez les recommandations du manuel des paquets Debian pour faire le paquet d'une bibliothèque partagée ; vous devez inclure le fichier de contrôle shlibs avec le détail des dépendances pour les paquets qui utilisent la bibliothèque.

Les bibliothèques partagées ne doivent pas être installées comme exécutables, puisque ld.so ne le demande pas et que tenter d'exécuter une bibliothèque partagée se traduit pas un « core dump ».

Les scripts

Tous les scripts de commandes, y compris les scripts inclus dans un paquet par le responsable et utilisés par dpkg, commenceront par « #! » et le nom du shell interpréteur.

Pour les scripts Perl, c'est « #!/usr/bin/perl ».

Les scripts shell (sh et bash) commenceront presque systématiquement par set -e pour que les erreurs soient détectées. Tous les scripts utiliseront set -e ou vérifieront l'état de sortie de toutes les commandes.

L'interpréteur shell de base « /bin/sh » peut être un lien symbolique vers n'importe quel shell compatible POSIX, si echo -n ne produit pas une nouvelle ligne

La politique de Debian indique que /bin/sh suit la norme POSIX, mais echo -n est largement utilisé dans la communauté Linux (tout particulièrement la politique Debian, les sources du noyau Linux, beaucoup de scripts Debian, etc.). Ce mécanisme est valable mais n'est pas demandé par POSIX, d'où cet ajout explicite. D'autre part, la rumeur dit que ce mécanisme doit devenir de toute façon obligatoire sous LSB.. Les scripts shell indiquant « /bin/sh » comme interpréteur n'utiliseront donc que des caractéristiques POSIX. Si un script a besoin des caractéristiques non-POSIX d'un interpréteur, celui-ci doit être spécifié dans la première ligne du script (par exemple « #!/bin/bash »). Son paquet doit dépendre du paquet qui fournit le shell (à moins que le paquet ne soit marqué « Essential », comme par exemple pour bash).

Quand c'est possible, on peut vouloir limiter les scripts aux caractéristiques POSIX de manière à utiliser l'interpréteur /bin/sh. Si votre script fonctionne avec ash, il est probablement conforme à POSIX, mais en cas de doute, utilisez /bin/bash.

Les scripts Perl détecteront les erreurs survenant lors de tous les appels système, comme open, print, close, rename et system.

Les shells csh et tcsh devraient être évités comme langage de script. Référez vous au document Csh Programming Considered Harmful (NdT: Pourquoi programmer en Csh est risqué), l'une des FAQs du groupe usenet comp.unix.*. Il peut être trouvé sur , ou ou même sur ftp.cpan.org dans /pub/perl/CPAN/doc/FMTEYEWTK/versus/csh.whynot. Si un paquet original utilise des scripts csh vous devez vous assurer qu'ils commencent par « #!/bin/csh » et vous devez rendre votre paquet dépendant du paquet virtuel c-shell

Tout script qui crée des fichiers dans des répertoires où tout le monde peut écrire, (p.ex. dans /tmp) doit utiliser un mécanisme qui provoquera une erreur si un fichier de même nom existe déjà.

À cet usage, la distribution Debian de base fournit les utilitaires tempfile et mktemp.

Les liens symboliques

En général, les liens symboliques à l'intérieur d'un répertoire de premier niveau seront relatifs alors que les liens symboliques qui pointent d'un répertoire de premier niveau vers un autre répertoire de premier niveau seront absolus. (Un répertoire de premier niveau est un sous-répertoire du répertoire racine « / ».)

De plus, les liens symboliques doivent utiliser un nom de chemin le plus court possible; on évitera par exemple le chemin « foo/../bar ».

On remarquera que pour créer un lien relatif avec ln il n'est pas nécessaire que le fichier cible soit relatif au répertoire où est exécuté ln ; de même il n'est pas nécessaire de se déplacer dans le répertoire où vous désirez créer le lien. Donnez simplement à ln comme premier argument la chaîne de caractères qui représentera la cible du lien (cette chaîne doit être un chemin relatif au répertoire contenant le lien).

Par exemple, dans votre Makefile ou dans debian/rules, écrivez: ln -fs gcc $(prefix)/bin/cc ln -fs gcc debian/tmp/usr/bin/cc ln -fs ../sbin/sendmail $(prefix)/bin/runq ln -fs ../sbin/sendmail debian/tmp/usr/bin/runq

Un lien symbolique vers un fichier comprimé aura toujours le même suffixe que le fichier référencé. (Par exemple, si le fichier « foo.gz » est référencé par un lien symbolique, le nom du lien doit aussi se terminer par « .gz », comme par exemple « bar.gz ».)

Les fichiers de périphérique

Un paquet ne doit pas contenir de fichiers de périphérique dans son arborescence.

Si un paquet a besoin d'un fichier de périphérique particulier qui n'est pas inclus dans le système de base, il doit appeler makedev dans le script postinst, après en avoir demandé l'autorisation à l'utilisateur.

Un paquet ne doit pas supprimer de fichier de périphérique dans le script postrm ou dans un autre script. Ceci doit être laissé à l'initiative de l'administrateur système.

Debian utilise les périphériques série /dev/ttyS*. Les programmes qui utilisent les anciens périphériques /dev/cu* seront modifiés pour utiliser /dev/ttyS*.

Les fichiers de configuration Définitions

fichier de configuration

C'est un fichier qui influe sur le fonctionnement d'un programme, ou bien qui donne des renseignements particuliers à un site ou un hôte, autrement dit un fichier qui singularise le comportement d'un programme. Classiquement, les fichiers de configuration sont faits pour être modifiés par l'administrateur système (s'il en a besoin ou s'il le souhaite) pour se conformer ainsi à une politique locale ou bien pour obtenir un fonctionnement plus utile à ce site.

conffile

C'est un fichier répertorié dans le fichier conffiles d'un paquet ; et dpkg en fait un usage particulier (voir le Debian Packaging Manual).

Cette distinction est importante ; ce ne sont pas des concepts interchangeables. Presque tous les conffiles sont des fichiers de configuration, mais beaucoup de fichiers de configuration ne sont pas des conffiles.

Il faut noter que les scripts qui renferment des informations de configuration (ainsi la plupart des fichiers de /etc/init.d et de /etc/cron.{daily,weekly,monthly}) sont de facto des fichiers de configuration et seront traités comme tels.

Emplacement

Tous les fichiers de configuration créés ou utilisés par votre paquet se trouveront dans /etc. S'il y en a plusieurs, vous envisagerez de créer un sous-répertoire de /etc de même nom que votre paquet.

Quand votre paquet se sert de fichiers de configuration qui sont hors de /etc, et qu'il n'est pas possible de le modifier pour qu'il utilise /etc, vous placerez quand même les fichiers de configuration dans /etc et vous créerez des liens symboliques vers l'endroit réclamé par le paquet.

Fonctionnement

Le traitement des fichiers de configuration doit se faire selon les règles suivantes :

les changements locaux doivent être préservés pendant la mise à jour d'un paquet ;

les fichiers de configuration doivent être préservés quand le paquet est supprimé ; ils ne sont détruits que si le paquet est supprimé avec « purge ».

La façon simple d'obtenir cela, c'est que le fichier de configuration soit un conffile. C'est parfait quand on peut distribuer une version par défaut qui marche pour la plupart des installations, bien que quelques administrateurs puissent vouloir la modifier. Cela suppose que la version par défaut fasse partie du paquet et que les scripts du responsable du paquet ne la modifient pas pendant l'installation (ou à quelque autre moment).

Pour faire que les changements locaux soient préservés correctement, nul paquet ne peut contenir des liens « en dur », ou en créer, vers des « conffiles »

Argument : Il y a deux problèmes avec les liens « en dur ». Le premier, c'est que certains « éditeurs » casse le lien quand ils modifient l'un des fichiers, et les deux fichiers peuvent devenir involontairement différents. Le second, c'est qu'il arrive que dpkg casse le lien pendant une mise à jour de conffiles.

.

L'autre façon, c'est d'utiliser les scripts du responsable de paquet. Dans ce cas, le fichier de configuration ne doit pas être un conffile et ne doit pas faire partie du paquet. Si la configuration correcte d'un paquet demande un fichier, c'est au responsable du paquet, via ses scripts, de créer, mettre à jour, maintenir et supprimer un tel fichier. Ces scripts doivent être idempotents (c.-à-d. ils doivent fonctionner correctement si dpkg a besoin de les relancer à cause d'erreurs survenant pendant l'installation ou la suppression) ; ils doivent comprendre toutes les manières de dpkg en ce qui concerne l'appel des scripts ; ils ne doivent pas remplacer, autrement dit massacrer, la configuration de l'utilisateur sans lui demander ; ils ne doivent pas poser des questions sans intérêt (surtout pendant les mises à jour) ; bref, ils doivent être de bons citoyens.

Ces scripts n'ont pas à configurer toutes les options possibles d'un paquet, mais seulement celles qui sont nécessaires à son bon fonctionnement sur un système donné. Idéalement, un sysadmin ne devrait faire aucune autre configuration que celle faite presque automatiquement par le script postinst.

Une manière commune de faire est de créer un script package-configure qu'appellera le script postinst du paquet si et seulement si le fichier de configuration n'existe pas déjà. Parfois, il est bon d'avoir un fichier d'exemple ou un fichier modèle utilisable par les scripts du responsable. On mettra les fichiers d'exemple dans /usr/share/doc et les fichiers de modèle dans /usr/lib ; ces fichiers sont des fichiers parfaitement ordinaires pour dpkg (ce ne sont pas des conffiles).

On ne doit pas mélanger ces deux manières de gérer les fichiers de configuration car alors la folie guette : dpkg voudra remplacer le fichier à chaque mise à jour du paquet.

Le partage des fichiers de configuration

Les paquets qui ne sont pas en conflit ne doivent pas spécifier le même fichier conffile.

Les scripts d'un responsable de paquet ne doivent modifier le conffile d'aucun paquet, même celui du paquet auquel ils appartiennent.

Quand deux paquets ou plus ont le même fichier de configuration et qu'il est raisonnable d'installer les deux paquets, on doit définir l'un des paquets comme le propriétaire du fichier de configuration, et ce sera le paquet qui distribue ce fichier et le répertorie comme un conffile. Les autres paquets qui utilisent le fichier de configuration doivent déclarer une dépendance envers ce paquet s'ils ont besoin de ce fichier de configuration pour leur fonctionnement. Quand ils ne l'utilisent que s'il est présent et qu'ils sont capables de fonctionner sans lui, ces paquets n'ont pas besoin de déclarer de dépendance.

Si l'on veut que deux ou plusieurs paquets apparentés partagent un fichier de configuration et que chacun d'eux soit capable de le modifier, il faut faire ce qui suit :

l'un des paquets apparentés (le « coeur ») doit gérer le fichier de configuration avec les scripts du responsable de paquet comme c'est décrit dans les sections précédentes :

le « coeur » fournira aussi un programme que les autres paquets utiliseront pour modifier le fichier de configuration ;

les paquets apparentés doivent se servir de ce programme pour faire des modifications sur le fichier de configuration. Ils dépendront alors de la garantie donnée quant à la disponibilité de ce programme, ou bien ils accepteront avec élégance de ne pouvoir modifier le fichier de configuration si ce programme n'est pas disponible.

Quelques fois, il convient de créer un nouveau paquet qui fournit l'infrastructure de base pour les autres paquets et qui gère les fichiers de configuration partagés (on peut consulter le paquet sgml-base comme exemple).

Les fichiers de configuration de l'utilisateur (« dotfiles »)

Les fichiers dans /etc/skel sont copiés automatiquement dans les comptes des nouveaux utilisateurs par adduser. Aucun programme ne renverra à la présence de ces fichiers dans ces comptes.

Ainsi, quand un programme, pour fonctionner correctement, a besoin qu'un fichier « .fichier » existe par avance dans $HOME, le paquet installera ce fichier dans /etc/skel (et le déclarera dans le fichier « conffiles » s'il n'est pas crée et modifié automatiquement par les scripts d'installation).

Cependant, avoir un programme qui, pour fonctionner correctement, a besoin de fichiers « .fichier » (des fichiers qu'il ne crée pas lui même, j'entends), est une mauvaise idée. Et l'installation par défaut de Debian devrait configurer les programmes d'une manière aussi raisonnable que possible.

Ainsi, le programme d'un paquet Debian, qui a besoin d'une quelconque configuration pour fonctionner correctement, sera configuré globalement pour le système à l'aide d'un fichier placé dans /etc. C'est uniquement dans le cas où le programme n'accepte pas de configuration globale au site, et si le responsable du paquet n'a pas le temps d'ajouter un fichier de configuration par défaut qu'un tel fichier pourra être placé dans /etc/skel.

/etc/skel sera aussi vide que possible. C'est d'autant plus nécessaire qu'il n'existe pas de mécanisme simple pour s'assurer que les fichiers « .fichier » nécessaires sont copiés dans les comptes des utilisateurs existants à l'installation du paquet.

Les fichiers d'écoute (« log file »)

L'approche traditionnelle pour les fichiers d'écoute était d'utiliser « cron » et de simples shell scripts pour monter des combines ad hoc pour la rotation des fichiers d'écoute. Cette approche, grandement paramétrable, demandait beaucoup de travail au « sysadmin ». Bien que le premier système Debian ait apporté une aide en installant automatiquement un système qui pouvait être pris comme modèle, cela ne fut pas considéré comme suffisant.

Une meilleure idée est d'utiliser « logrotate », un programme « GPL », développé par Red Hat, qui centralise la gestion de l'écoute. Il possède à la fois un fichier de configuration (/etc/logrotate.conf) et un répertoire où les paquets peuvent déposer les résultats de leur écoute, (/etc/logrotate.d).

Les fichiers d'écoute se nomment habituellement /var/log/package.log. Si vous avez de nombreux fichiers d'écoute ou si vous avez besoin d'un répertoire pour des raisons de droits (/var/log ne peut être modifié que par root), vous créerez habituellement un répertoire nommé /var/log/package.

Une rotation des fichiers d'écoute doit être assurée de manière qu'ils ne grandissent pas indéfiniment ; la meilleure façon de procéder est de mettre un script dans le répertoire /etc/logrotate.d et d'utiliser les facilités apportées par « logrotate ». Voici un bon exemple de fichier de configuration de « logrotate » (pour plus de renseignements voir ) : /var/log/foo/* { rotate 12 weekly compress postrotate /etc/init.d/foo force-reload endscript } qui fait tourner tous les fichiers sous « /var/log/foo », sauve 12 compressions, et envoie un signal HUP à la fin de la rotation.

Les fichiers d'écoute seront supprimés quand le paquet est « purgé » (mais pas quand le paquet est simplement supprimé) en testant le paramètre du script postrm (voir le Debian Packaging Manual pour plus de détails).

Permissions et propriétaires

Les règles de cette section sont des directives pour une utilisation commune. Quand c'est nécessaire, vous pouvez vous écarter de certains détails ci-après. Cependant, dans ce cas, sécurisez ce que vous faites et restez aussi cohérent que possible avec le système. Vous devriez probablement en discuter aussi dans debian-devel.

Les fichiers appartiendront à root.root. Ils seront modifiables uniquement par le propriétaire et seront lisibles par tous (exécutables si nécessaire).

Les répertoires auront le mode 755 ou, pour ceux qui doivent être modifiables par un groupe, le mode 2775. La propriété du répertoire sera cohérente avec le mode -- si le répertoire a comme mode 2775, il appartiendra au groupe qui a besoin d'y accéder.

Les exécutables qui sont « setuid » et « setgid » auront respectivement les modes 4755 et 2755, et ils appartiendront à l'utilisateur ou au groupe approprié. On n'interdira leur lecture (par des modes comme 4711 ou 2711 ou même 4111) ; en effet cela n'apporte aucun gain de sécurité puisque n'importe qui peut obtenir les binaires dans les paquets Debian qui sont librement disponibles -- c'est simplement gênant. Pour la même raison vous ne restreindrez pas les droits en lecture ou en exécution des exécutables « non-set-id ».

Certains programmes « setuid » doivent être restreints à certains groupes d'utilisateurs en se servant des permissions sur les fichiers. Dans ce cas, ils appartiendront à « l'uid » pour lesquels ils sont « set-id » et au groupe qui aura des droits d'exécution. Ils auront le mode 4754 ; cela ne sert à rien de les rendre illisibles aux utilisateurs qui n'ont pas les droits d'exécution.

Vous devez évitez que l'administrateur système ne puisse reconfigurer un paquet selon sa politique locale de sécurité qu'en changeant les permissions des fichiers binaires. Les fichiers ordinaires installés par dpkg (à l'exception des conffiles et d'autres fichiers similaires) auront leurs droits réinitialisés avec les droits de la distribution lors de la réinstallation d'un paquet. Vous penserez plutôt à créer un groupe d'utilisateurs autorisés à utiliser les programmes et à rendre les exécutables « setuid » exécutables uniquement par ce groupe.

Si vous avez besoin d'un nouvel utilisateur ou groupe pour votre paquet, vous avez deux possibilités. La première est de rendre cet utilisateur ou ce groupe propriétaire d'un ou plusieurs fichiers de votre paquet. La deuxième est de compiler l'identifiant (plutôt que le nom) d'utilisateur ou de groupe dans le binaire. Dans ce cas vous avez besoin d'un identifiant attribué de façon fixe.

Si vous avez besoin d'un identifiant attribué de façon fixe, vous devez alors demander un identifiant d'utilisateur ou de groupe au responsable du système de base. Vous ne devez pas livrer votre paquet avant d'avoir reçu un tel identifiant. Quand vous l'avez reçu, vous devez faire dépendre votre paquet d'une version du système de base dans laquelle l'identifiant est présent dans /etc/passwd ou dans /etc/group. Alternativement, vous pouvez modifier votre paquet pour qu'il crée lui-même l'utilisateur ou le groupe avec le bon identifiant (en utilisant adduser) dans les scripts de pré ou post-installation (ces derniers seront choisis quand c'est possible).

D'un autre coté, un programme peut être capable, en fonctionnement, de déterminer l'« uid » ou le « gid » à partir du nom d'un groupe de façon à utiliser un identifiant attribué de façon dynamique. Dans ce cas vous choisirez un nom d'utilisateur ou de groupe approprié, vous en discuterez dans debian-devel, vous vérifierez avec le responsable du système de base que ce nom est unique et vous vous assurerez qu'ils (la liste debian-devel) ne préfèrent pas un identifiant attribué de manière fixe. Quand tout cela a été vérifié, vous devez modifier votre paquet pour qu'il crée, si nécessaire, l'utilisateur ou le groupe avec adduser dans les scripts de pré ou post-installation (à nouveau, ces derniers sont préférables si c'est possible).

Il faut noter que changer la valeur numérique d'un identifiant associé à un nom est une opération très difficile. Elle implique de rechercher dans le système de fichier tous les fichiers concernés. Réfléchissez sérieusement au meilleur choix entre « id » statique ou dynamique, car modifier votre choix ultérieurement posera des problèmes.

Programmes personnalisés Les chaînes de spécification d'architecture

Quand un programme doit fournir une chaîne de spécification d'architecture, le format suivant sera utilisé : <arch>-<os> où « <arch> » est l'une des valeurs suivantes : i386, alpha, arm, m68k, powerpc, sparc et où « <os> » est linux ou gnu. L'emploi de gnu dans cette chaîne est réservé pour le système d'exploitation « GNU-Hurd ».

On remarquera que nous n'utilisons pas « <arch>-debian-linux » dans la chaîne « architecture-vendor-os » car cela rendrait nos programmes incompatibles avec les autres distributions Linux. Notez aussi que nous n'utilisons pas « <arch>-unknown-linux », car « unknown » ne sonne pas très bien.

Les « démons »

Les fichiers de configuration /etc/services, /etc/protocols et /etc/rpc sont gérés par le paquet netbase et ne doivent pas être modifiés par d'autres paquets.

Quand un paquet a besoin d'une nouvelle entrée dans l'un de ces fichiers, son responsable contactera le responsable du paquet netbase, qui ajoutera cette entrée et produira une nouvelle version du paquet netbase.

Le fichier de configuration /etc/inetd.conf ne doit pas être modifié par les scripts d'un paquet sauf si c'est via le script update-inetd ou le module Perl DebianNet.pm.

Quand un paquet veut ajouter un exemple d'entrée dans /etc/inetd.conf, cette entrée doit être précédée par un seul caractère « # ». De telles lignes sont traitées comme des commentaires de l'utilisateur par le script update-inetd et ne seront pas modifiées ou activées lors des mises à jour des paquets.

L'utilisation des pseudo-ttys et la modification de « wtmp », « utmp » et « lastlog »

Certains programmes ont besoin de créer des pseudo-ttys. On doit le faire avec les « Unix98 » ptys si la bibliothèque « C » le permet. Le programme résultant ne doit pas être installé « setuid root », à moins que d'autres fonctions ne le demandent.

Les fichiers /var/run/utmp, /var/log/wtmp et /var/log/lastlog doivent être modifiables par le groupe utmp. Les programmes qui ont besoin de modifier ces fichiers doivent appartenir au groupe utmp.

Les éditeurs de texte et les pagineurs

Certains programmes appellent un éditeur ou un pagineur pour modifier ou afficher un document texte. Comme de nombreux éditeurs et pagineurs sont disponibles dans la distribution Debian, l'administrateur système et les utilisateurs pourront choisir leur éditeur ou leur pagineur préféré.

De plus, chaque programme choisira un éditeur et/ou un pagineur par défaut si l'utilisateur ou l'administrateur système n'en a pas choisi un.

Ainsi chaque programme qui appelle un éditeur ou un pagineur doit utiliser les variables d'environnement EDITOR ou PAGER pour déterminer l'éditeur et/ou le pagineur que l'utilisateur souhaite employer. Si ces variables ne sont pas définies, les programmes /usr/bin/editor et /usr/bin/pager seront, respectivement, utilisés.

Ces deux fichiers sont gérés par « alternatives ». Tout paquet, fournissant un éditeur ou un pagineur, doit employer le script « update-alternatives » pour déclarer ces programmes.

Lorsqu'il est très difficile d'adapter un programme pour qu'il utilise les variables EDITOR et PAGER, ce programme peut être configuré pour utiliser respectivement /usr/bin/sensible-editor et /usr/bin/sensible-pager comme éditeur ou pagineur. Ce sont deux scripts fournis par le système Debian de base qui testent les variables EDITOR ou PAGER et lancent les programmes appropriés ou bien exécutent par défaut /usr/bin/editor ou /usr/bin/pager automatiquement.

Un programme peut aussi se servir de la variable d'environnement VISUAL pour connaître l'éditeur choisi par l'utilisateur. Si elle existe, elle prend le pas sur la variable EDITOR. Et c'est ce que fait /usr/bin/sensible-editor.

Comme le système Debian de base fournit déjà un éditeur et un pagineur, un paquet n'a pas besoin de dépendre d'un éditeur ou d'un pagineur, et il n'y a pas besoin de paquets virtuels pour cela.

Serveurs et applications Web

Cette section décrit les emplacements et les « URL » qui seront employés par tous les serveurs et applications Web dans le système Debian.

Les fichiers exécutables cgi-bin sont installés dans le répertoire /usr/lib/cgi-bin/<cgi-bin-name> et seront référencés par http://localhost/cgi-bin/<cgi-bin-name>

L'accès aux documents HTML

Les documents HTML d'un paquet sont conservés dans /usr/share/doc/package et doivent être accessibles dans /usr/doc/package Pour des raisons de compatibilité descendante, voir. et peuvent être référencés par http://localhost/doc/<package>/<filename>

La racine des documents Web

Les applications Web éviteront de conserver des fichiers dans la racine des documents Web. Il faut utiliser, à la place, le répertoire /usr/share/doc/<package> pour les documents et déclarer l'application Web via le paquet menu. Si l'accès à la racine des documents Web est indispensable alors il faut utiliser /var/www comme racine des documents. Cela peut être juste un lien symbolique vers l'emplacement où l'administrateur a mis la véritable racine des documents.

Les agents de transport des courriers électroniques

Les paquets Debian qui traitent le courrier électronique, que ce soient les agents utilisateurs (MUA: Mail User Agents) ou les agents de transport (MTA: Mail Transport Agent), doivent respecter les directives de configuration qui suivent. Le non respect de celles-ci peut entraîner la perte de messages, la présence de lignes From : incorrectes et d'autres dommages sérieux !

La file d'attente du courrier est /var/spool/mail et l'interface pour envoyer des courriers est /usr/sbin/sendmail (conformément au FHS). La file d'attente du courrier fait partie du système de base et non du paquet MTA.

Dans le système Debian, tous les MUAs, MTAs, MDAs et autres programmes de gestions des boites aux lettres (comme les démons IMAP) doivent verrouiller les boites aux lettres de façon à permettre l'usage de NFS. Cela signifie que le verrouillage de type fcntl() doit être associé avec celui de type point (« dot locking »). Pour éviter les situations inextricables, un programme utilisera d'abord fcntl() et ensuite le verrouillage « point » ou bien implantera si possible les deux méthodes à la fois

Quand il n'est pas possible d'établir les deux modes de verrouillage, le système ne doit pas attendre que le second mode soit mis en place, mais doit enlever le premier mode, attendre un certain temps et recommencer le verrouillage.. Pour faire cela, il est conseillé d'employer les fonctions maillock et mailunlock données dans le paquet liblockfile*

liblockfile version >>1.01

.

Les boîtes aux lettres ont généralement le mode 660 utilisateur.mail à moins que l'utilisateur n'en ait décidé autrement. Un MUA peut supprimer une boîte aux lettres (sauf si elle n'a pas les permissions standards). Dans ce cas, le MTA ou un autre MUA doit la recréer au besoin. Le groupe « mail » doit pouvoir modifier les boîtes aux lettres.

La file d'attente du courrier a le mode 2775 root.mail et les MUAs doivent appartenir au groupe mail pour effectuer le verrouillage mentionné précédemment (et doivent évidemment s'interdire l'accès aux boîtes aux lettres des autres utilisateurs en employant ce privilège).

/etc/aliases est le fichier contenant les alias du système de messagerie (par exemple postmaster, usenet, etc.) -- c'est l'un des fichiers que l'administrateur système et les scripts postinst peuvent modifier. Après avoir modifié /etc/aliases, le programme ou l'administrateur doit exécuter newaliases. Tous les paquets MTAs doivent contenir un programme newaliases, même s'il ne fait rien. Cependant les anciens paquets MTA ne le faisant pas, les programmes ne doivent pas échouer si newaliases ne peut être trouvé.

La convention consistant à écrire forward to adresse dans la boîte aux lettres elle-même n'est pas supportée. Utilisez un fichier .forward à la place.

L'emplacement du programme rmail utilisé par UUCP pour les messages entrants sera /usr/sbin/rmail, conformément au FHS. De même le programme rsmtp, qui reçoit des lots SMTP via UUCP, sera placé dans /usr/sbin/rsmtp s'il est supporté.

Quand un programme veut savoir quel nom employer, par exemple, pour les messages sortants (mail et news) qui sont crées localement, il utilisera le fichier /etc/mailname. Il contient la partie située après le nom d'utilisateur et le signe @ (at) des adresses électroniques des utilisateurs de la machine (suivi par un retour à la ligne).

Tout paquet s'assurera de l'existence de ce fichier. S'il existe, il sera employé sans commentaire (le script de configuration d'un MTA peut vouloir interroger l'utilisateur même s'il trouve ce fichier). S'il n'existe pas, il demandera une valeur à l'utilisateur et la stockera dans /etc/mailname puis l'emploiera pour la configuration du paquet. Le message d'invite sera explicite afin d'indiquer que ce nom ne sera pas utilisé seulement par ce paquet. Par exemple dans cette situation, le paquet INN dit: Please enter the `mail name' of your system. This is the hostname portion of the address to be shown on outgoing news and mail messages. The default is syshostname, your system's host name. Mail name [`syshostname']: syshostname est la sortie de hostname --fqdn.

La configuration du système de « News »

Tous les fichiers de configuration relatifs aux serveurs et aux clients NNTP (news) seront placés dans le répertoire /etc/news.

Quelques points de configuration s'appliquent à de nombreux paquets concernant les news (clients et serveurs) sur la machine : /etc/news/organization

c'est une chaîne qui apparaîtra dans le champ organisation de l'en-tête de chaque message posté par les clients NNTP de la machine.

/etc/news/server

Contient soit le FQDN du serveur NNTP principal soit localhost si la machine locale est un serveur NNTP.

D'autres fichiers de portée générale peuvent être ajoutés s'ils sont requis pour la configuration commune à plusieurs paquets concernant les news.

Les programmes pour le système X Window

On doit configurer pour le système X Window les programmes qui peuvent l'être, et on doit déclarer toutes les dépendances nécessaires à leur fonctionnement sous « X », à moins que ces dépendances ne soient pour un paquet dont la priorité est « standard » ou une priorité supérieure ; dans ce cas les binaires spécifiques à « X » peuvent être mis dans un paquet distinct, ou bien des versions alternatives du paquet avec support de « X » peuvent être fournies

NOTE : la prochaine grande version du système X Window va certainement bouleverser cela. Et c'est ce que les gens semblent vouloir. Des paquets comme vim-tty seront licites s'ils obtiennent la priorité « standard ». Et aussi tel client « X » dans « mtools » pourra être mis dans un paquet avec une priorité « optional ». Cela ouvre la voie pour un changement des priorités de « standard » à « optional » pour les paquets « xlib6g » et « xfree-common », si tous les paquets dépendant de « xlib6g » passent d'une priorité « standard » à une priorité « optional » (ou bien si les versions non liées avec « xlib » restent avec une priorité « standard »). Cela, cependant, reste l'affaire des responsables des paquets concernés et des responsables de l'archive et n'est pas exigé par cette charte..

Les paquets qui fournissent un serveur « X » et qui, directement ou indirectement, communiquent avec le matériel d'entrée et d'affichage, déclareront dans leurs données de contrôle qu'ils fournissent le paquet virtuel xserver

Argument : cela met en oeuvre la pratique actuelle, et cela offre une vraie politique pour l'utilisation du paquet virtuel xserver, lequel apparaît dans la liste des paquets virtuels. En résumé, les serveurs « X » qui communiquent directement avec le matériel d'entrée et d'affichage ou via un autre sous-système (p.ex. GGI) fourniront xserver. Des choses comme « Xvfb », « Xnest » et « Xprt » ne doivent pas le faire. NOTE : la prochaine grande version du système X Window va certainement bouleverser cela.

Les paquets qui fournissent un émulateur de terminal pour le système X Window, émulateur qui offre un type de terminal avec une description « terminfo » fourni avec le paquet ncurses-base, déclareront dans leurs données de contrôle qu'ils fournissent le paquet virtuel x-terminal-emulator. Ils se déclareront comme une alternative pour /usr/bin/x-terminal-emulator, avec une priorité égale à 20.

Les paquets qui fournissent des gestionnaires de fenêtres déclareront dans leurs données de contrôle qu'ils fournissent le paquet virtuel x-window-manager. Ils se déclareront comme une alternative pour /usr/bin/x-window-manager, avec une priorité qu'on calculera ainsi : Commencez avec une priorité égale à 20. Si le gestionnaire de fenêtres permet le système des menus de Debian, on ajoutera 20 points si cela se fait avec la configuration par défaut du paquet (c.-à-d. qu'il n'y a pas besoin, pour obtenir cette fonctionnalité, de modifier des fichiers de configuration appartenant au système ou à l' utilisateur) ; si l'on doit modifier des fichiers de configuration , on ajoutera seulement 10 points. Si le gestionnaire de fenêtres autorise, dans sa configuration par défaut, le ré-démarrage d'une session X avec un nouveau gestionnaire de fenêtres (sans tuer le serveur X), on ajoutera 10 points ; sinon, rien.

Les paquets qui fournissent des fontes pour le système X Window doivent faire un certain nombre de choses pour s'assurer à la fois qu'ils sont disponibles sans avoir à modifier la configuration du serveur X ou du serveur de fontes, et qu'ils n'abîment pas les fichiers qu'utilisent d'autres paquets pour déclarer les renseignements qui les concernent. Les fontes de tout type offert par le système X Window seront dans des paquets distincts des binaires, bibliothèques ou de la documentation (sauf celle liée à la fonte fournie). Quand un programme ou une bibliothèque est inutilisable en l'absence d'une ou plusieurs fontes, le paquet qui contient ce programme ou cette bibliothèque déclarera une dépendance envers le(s) paquet(s) contenant la(les) fonte(s) qu'il demande. Les fontes BDF seront converties en fontes PCF avec le programme bdftopcf (disponible dans le paquet xbase-clients), gzipées, et placées dans un répertoire qui correspond à leur définition : Les fontes à 100 dpi seront mises dans /usr/X11R6/lib/X11/fonts/100dpi/ ; Les fontes à 75 dpi seront mises dans /usr/X11R6/lib/X11/fonts/75dpi/ ; les fontes à chasse fixe, les fontes pour le curseur, ainsi que d'autres fontes de faible définition seront mises dans /usr/X11R6/lib/X11/fonts/misc/. les fontes « Speedo » seront mises dans /usr/X11R6/lib/X11/fonts/Speedo/. les fontes « Type 1 » seront mises dans /usr/X11R6/lib/X11/fonts/Type1/. Si des fichiers de métrique sont disponibles, ils peuvent aussi être placés là. On ne doit pas créer ni utiliser d'autres répertoires dans /usr/X11R6/lib/X11/fonts/ que ceux répertoriés dans la liste qui précède. (Les répertoires PEX et cyrillic font exceptions pour des raisons historiques, mais l'installation de fichiers dans ces répertoires reste déconseillée.) Au lieu de mettre directement des fichiers dans les répertoires cités dans la liste qui précède, les paquets peuvent fournir des liens symboliques dans le répertoire des fontes pointant vers l'emplacement réels des fichiers dans l'arborescence. Un tel emplacement se conformera au « FHS ». Les paquets ne contiendront pas à la fois les versions à 75dpi et les versions à 100dpi d'une fonte. Si les deux sont disponibles, elles seront fournies dans des paquets distincts dont les noms seront étiquetés « -75dpi » ou « -100dpi ». Les fontes destinées au répertoire misc ne doivent pas être mises dans les mêmes paquets que ceux des fontes à 75dpi ou 100dpi mais elles seront fournies dans un paquet distinct étiqueté « -misc ». Les paquets ne doivent pas fournir les fichiers fonts.dir, fonts.alias ou fonts.scale dans un répertoire de fontes. les fichiers fonts.dir ne doivent en aucun cas être fournis ; si besoin est, les fichiers fonts.alias et fonts.scale seront fournis dans le répertoire /etc/X11/fonts/fontdir/package.extensionfontdir est le nom du répertoire de /usr/X11R6/lib/X11/fonts/ dans lequel sont conservées les fontes du paquet correspondant (p.ex.75dpi ou misc), où package est le nom du paquet qui fournit ces fontes, et où extension correspond au contenu du fichier, soit scale soit alias. Les paquets doivent déclarer une dépendance envers le paquet xbase-clients et lancer, dans les scripts de post-installation et de post-désinstallation du paquet, la commande mkfontdir pour chaque répertoire où est installée une fonte. Les paquets qui fournissent un ou plusieurs de ces fichiers fonts.scale dont on vient de parler, doivent déclarer une dépendance de version pour xbase-clients (>=3.3.3.1-5) et doivent appeler update-fonts-scale pour chaque répertoire où est installée une fonte avant d'appeler mkfontdir pour ce répertoire. On doit faire cet appel à la fois dans les scripts de post-installation et ceux de post-désinstallation. Les paquets qui fournissent un ou plusieurs de ces fichiers fonts.alias dont on vient de parler, doivent déclarer une dépendance de version pour xbase-clients (>=3.3.3.1-5) et doivent appeler, dans les scripts de post-installation et ceux de post-désinstallation , update-fonts-alias pour chaque répertoire où est installée une fonte. Les paquets ne doivent pas proposer, pour les noms des fontes qu'ils fournissent, des alias qui entrent en conflit avec les alias déjà en usage de noms de fontes déjà fournies. Les paquets ne doivent pas fournir des fontes qui ont le même nom pour l'enregistrement XLFD que celui donné par une fonte déjà en usage.

Les fichiers « application defaults » doivent être installés dans le répertoire /usr/X11R6/lib/X11/app-defaults/

Note : Cela changera très prochainement.

. On ne les déclarera pas comme des conffiles et on ne les traitera pas non plus comme des fichiers de configuration. Un fichier, dont le nom sera le même que celui du paquet et qui sera mis dans le répertoire /etc/X11/Xresources/, pourra assurer la paramétrisation des ressources X d'un paquet ; il doit être déclarer comme conffile. Important : les paquets qui installent des fichiers dans le répertoire /etc/X11/Xresources/ doivent déclarer un conflit avec le paquet xbase (<<3.3.2.3a-2) ; si ce n'est pas fait, le paquet peut détruire un fichier /etc/X11/Xresources pré-existant qui a pu être paramétré par l'administrateur système

Argument : cela clarifie le langage pour s'adresser au responsable de paquet et non pas à l'administrateur système pour savoir comment gérer /etc/X11/Xresources.

.

Les paquets qui utilisent le système X Window s'en tiendront autant que possible au « FHS ». Ils installeront autant que possible les binaires, les bibliothèques, les pages de manuel ou d'autres fichiers aux endroits demandés par le « FHS ». Cela signifie qu'on ne doit pas installer de fichiers dans /usr/X11R6/bin/, /usr/X11R6/lib/, ou /usr/X11R6/man/ à moins que le fonctionnement correct d'un paquet ne l'exige. On placera les fichiers de configuration des gestionnaires de fenêtres et des gestionnaires d'affichage dans un sous-répertoire de /etc/X11/ correspondant au nom du paquet ; cela est du à l'interpénétration étroite de ces programmes et du mécanisme du système X Window. Les programmes applicatifs utiliseront le répertoire /etc/ sauf si cette charte impose autre chose. L'installation de fichiers dans des sous-répertoires de /usr/X11R6/include/X11/ et de /usr/X11R6/lib/X11/ est autorisée mais déconseillée ; les responsables de paquet détermineront s'ils peuvent utiliser des sous- répertoires de /usr/lib/ et de /usr/share/. (On encourage l'usage de liens symboliques des répertoires de X11R6 vers des endroits conformes au « FHS » si les programmes ne sont pas facilement configurables pour chercher ailleurs leurs fichiers.) Les paquets ne doivent pas fournir -- ou y installer des fichiers -- les répertoires /usr/bin/X11/, /usr/include/X11/ ou /usr/lib/X11/. Les fichiers d'un paquet feront cependant référence à ces répertoires plutôt qu'à leurs homologues de X11R6, /usr/X11R6/bin/, /usr/X11R6/include/X11/ et /usr/X11R6/lib/X11/ quand les ressources qui sont référencées n'ont pas été placées dans des endroits conformes au « FHS ».

Les programmes qui demandent la bibliothèque « OSF-Motif », bibliothèque non conforme aux « DFSG », seront compilés et testés avec « LessTif » (une libre ré-implémentation de « Motif »). Quand le responsable du paquet juge que le programme ne fonctionne pas suffisamment bien avec « LessTif » pour être distribué et supporté, mais qu'il fonctionne correctement quand il est compilé avec « Motif », il créera alors deux versions du paquet ; l'une qui sera liée de façon statique à « Motif » et dont le nom sera étiqueté « -smotif », et l'autre qui sera liée de façon dynamique à « Motif » et dont le nom sera étiqueté « -dmotif ». Les deux versions liées à « Motif » sont dépendantes de logiciels non conformes aux « DFSG » et donc ne peuvent être mis dans la section « main » de la distribution ; si le logiciel lui-même est conforme aux « DFSG » il peut être mis dans la section « contrib ».Toutes les versions connues de « OSF-Motif » autorisent la redistribution sans restrictions de binaires liés de façon statique ou dynamique à cette bibliothèque, mais c'est au responsable de paquet de déterminer si la licence de la version de « OSF-Motif » qu'il possède le permet.

Les programmes emacs lisp

Veuillez consulter le « Debian Emacs Policy » (documenté dans debian-emacs-policy.gz du paquet emacsen-common) pour les détails concernant la création de paquets de programmes emacs lisp.

Les jeux

Les permissions de /var/lib/games sont 755 root.root.

Chaque jeu décide de ses propres règles de sécurité.

Les jeux qui demandent des accès privilégiés et protégés à des fichiers de scores, de sauvegardes de parties, etc., peuvent appartenir à root.games et être exécutables par le groupe games (mode 2755) et doivent utiliser des fichiers et des répertoires avec des permissions appropriées (770 root.games par exemple). Ils ne doivent pas être exécutable par un utilisateur (set-user-id), car cela entraîne des problèmes de sécurité. (Si un attaquant arrive à corrompre un jeu « set-user-id :», il peut alors remplacer l'exécutable d'autres utilisateurs, forçant les autres joueurs de ces jeux à exécuter un cheval de Troie. Avec un programme « set-group-id :», l'attaquant n'a accès qu'à des données de jeu moins importantes. S'il veut accéder aux comptes des autres joueurs, cela lui demandera des efforts beaucoup plus importants).

Certains paquets, comme les programmes « fortune », sont configurés par leurs auteurs originaux pour interdire la lecture de leurs fichiers de données ou d'autres informations statiques, de manière qu'ils ne puissent être accessibles que par les programmes « set-id » fournis. Vous ne ferez pas de même dans un paquet Debian : n'importe qui peut télécharger le fichier .deb et y lire les données, cela n'a donc pas de sens d'avoir des fichiers non lisibles. Créer des fichiers accessibles en lecture implique aussi que vous n'avez pas à construire des programmes « set-id », ce qui réduit le risque de trous de sécurité.

Conformément au « FHS », les binaires des jeux seront installés dans le répertoire /usr/games. Cela s'applique aussi aux jeux utilisant le système X Window. On installera les pages de manuel des jeux (« X » et « non-X ») dans /usr/share/man/man6.

La documentation Les pages du manuel

On installera les pages de manuel sous la forme d'un source nroff, à l'emplacement approprié dans /usr/share/man. Vous utiliserez uniquement les sections 1 à 9 (voir le FHS pour plus de détails). Vous ne devez pas installer de pages « cat » préformatées.

Chaque programme, utilitaire ou fonction aura une page de manuel associée dans le même paquet. On suggère aussi que chaque fichier de configuration ait une page de manuel associée.

Quand il n'y a pas de page de manuel pour un programme, un utilitaire, une fonction particulière ou un fichier de configuration et qu'un bogue a été rapporté sur « debian-bugs », on créera un lien symbolique de cette page vers la page de manuel . Ce lien symbolique peut être créé à partir de debian/rules comme suit : ln -s ../man7/undocumented.7.gz \ debian/tmp/usr/share/man/man[1-9]/the_requested_manpage.[1-9].gz Cette page de manuel indique que l'absence de page de manuel a déjà été signalée comme un bogue, ainsi vous ne pouvez faire le lien que si tel est le cas (vous pouvez le rapporter vous même si vous le souhaitez). Ne fermez pas le rapport de bogue tant qu'une page de manuel adéquate n'est pas disponible.

Vous pouvez faire suivre une plainte concernant l'absence d'une page du manuel aux auteurs originaux, et signaler qu'un rapport de bogue a été envoyé au système Debian de suivi des bogues. Même si le projet GNU ne considère pas en général l'absence d'une page du manuel comme un bogue, nous oui. S'ils vous répondent qu'ils ne considèrent pas cela comme un bogue, laissez quand même le bogue ouvert dans notre système de suivi.

Les pages de manuel seront installées comprimées via gzip -9.

Si une page de manuel doit être accessible via différents noms, il est préférable d'utiliser un lien symbolique plutôt que la fonctionnalité .so, mais il est inutile de bricoler les parties incriminées dans les sources originaux pour changer les .so en liens symboliques (à moins que ce soit trivial). Ne créez pas de lien physique dans les répertoires des pages du manuel et ne mettez pas de chemin absolu dans les directives .so. Le nom du fichier dans le .so d'une page du manuel sera relatif à la racine des pages (habituellement /usr/share/man).

Les documents « Info »

On installera les documents « Info » dans /usr/share/info. Ils seront comprimés avec gzip -9.

Votre paquet appellera install-info dans son script d'installation pour mettre à jour le fichier dir de « Info » : install-info --quiet --section Development Development \ /usr/share/info/foobar.info

Il est judicieux de spécifier une section pour l'emplacement de votre programme ; cela se fait avec l'option --section. Pour déterminer la section à utiliser, vous devez consulter /usr/share/info/dir sur votre système et choisir la plus adéquate (ou créer une nouvelle section si aucune des sections actuelles n'est adaptée). Notez que l'option --section prend deux arguments ; le premier est une expression régulière pour rechercher une section existante (indépendamment de la casse), le second est utilisé pour la création d'une nouvelle section.

Vous retirerez les entrées dans le script de pré-désintallation : install-info --quiet --remove /usr/share/info/foobar.info

Si install-info ne trouve pas une entrée descriptive dans le fichier Info, vous devrez en fournir une. Voir pour plus de détails.

Documentations supplémentaires

Le responsable d'un paquet peut installer toute documentation supplémentaire qui viendrait avec ce paquet. Les documents texte seront placés dans le répertoire /usr/share/doc/package, et comprimés avec gzip -9 à moins qu'ils soient petits.

Si un paquet contient une importante documentation dont la majorité des utilisateurs du paquet n'a pas besoin, vous la mettrez dans un paquet binaire distinct. Ainsi elle ne prendra pas d'espace disque sur les machines d'utilisateurs qui n'en ont pas besoin ou qui ne veulent pas l'installer.

Il est souvent judicieux de mettre les fichiers texte d'informations (README, changelogs et autres) provenant du paquet source dans /usr/share/doc/package au sein des paquets binaires. Bien entendu, vous n'avez pas besoin de fournir les instructions de compilation et d'installation.

L'accès à la documentation

Les précédentes versions de Debian placaient toute la documentation supplémentaire dans /usr/doc/package. Afin de migrer en douceur vers /usr/share/doc/package, chaque paquet doit maintenir un lien symbolique /usr/doc/package qui pointe vers /usr/share/doc/package, qui est la place réelle de sa documentation Ces liens symboliques seront détruits un jour, mais ils doivent exister pour des raisons de compatibilité jusqu'à ce que tous les paquets aient pris en compte cette règle et que la charte debian soit changée en conséquence.. Le lien symbolique doit être crée au moment de l'installation du paquet ; il ne peut être contenu dans le paquet lui même à cause de problèmes avec dpkg. Une façon raisonnable de faire est de mettre, dans le script postinst, ce qui suit : if [ "$1" = "configure" ]; then if [ -d /usr/doc -a ! -e /usr/doc/#PACKAGE# \ -a -d /usr/share/doc/#PACKAGE# ]; then ln -sf ../share/doc/#PACKAGE# /usr/doc/#PACKAGE# fi fi et dans le script prerm: if [ \( "$1" = "upgrade" -o "$1" = "remove" \) \ -a -L /usr/doc/#PACKAGE# ]; then rm -f /usr/doc/#PACKAGE# fi

Les formats préférés pour la documentation

L'unification de la documentation Debian se fait autour d'HTML.

Si votre paquet comprend une importante documentation dans un format balisé qui peut être converti en d'autres formats, vous livrerez si possible la version HTML dans le paquet binaire, dans le répertoire /usr/doc/package ou un de ces sous-répertoires

Le raisonnement: ce qui importe ici, c'est que les documents HTML soient disponibles dans certains paquets, et pas nécessairement dans le paquet binaire principal.

.

Vous pouvez fournir d'autres formats comme PostScript.

Les informations de copyright

Chaque paquet doit être accompagné d'une copie verbatim de son copyright ainsi que de sa licence de distribution dans le fichier /usr/share/doc/package-name/copyright. Ce fichier ne doit pas être comprimé ni être un lien symbolique.

De plus, le fichier de copyright doit préciser où ont été obtenus les fichiers sources originaux (s'ils existent) et expliquera brièvement quelles modifications ont été faites à ces fichiers dans la version Debian. Il nommera les auteurs originaux et le(s) responsable(s) Debian qui ont oeuvré à la création du paquet.

/usr/share/doc/package-name peut être un lien symbolique vers un répertoire de /usr/share/doc seulement si, de deux paquets provenant tous les deux de la même source, le premier possède une relation « Depends » avec le second. Ces règles sont importantes car on doit pouvoir extraire les copyrights par des moyens automatiques.

Les paquets distribués sous la licence « UCB BSD », la licence « Artistic », la licence « GNU GPL » ou la licence « GNU LGPL » feront référence aux fichiers </usr/share/common-licenses/BSD, /usr/share/common-licenses/Artistic, /usr/share/common-licenses/GPL et /usr/share/common-licenses/LGPL

Pourquoi « licence » et pas « copyright » ? Parce que jusqu'à présent /usr/doc/copyright contenait tous les fichiers de copyright, plus les quatre licences classiques GPL, LGPL, Artistic et BSD. Maintenant les fichiers qui donnent aux paquets des copyrights particuliers ne sont plus dans un répertoire commun. Une fois que /usr/doc/copyright est presque vide, il est sensé de changer « copyright » en « license ». Pourquoi « licences communes » et pas « licenses » ? Parce que si je mets simplement « licenses », je suis sûr de recevoir un rapport de bogue disant « la licence foo n'est pas dans le répertoire des licences. » Il n'y a pas toutes les licences, seulement les plus communes. Je pourrais utiliser /usr/share/doc/common-licenses, mais je pense que c'est trop long, et puis, la licence GPL ne dit pas tout, c'est simplement une licence.

.

Vous ne devez pas utiliser le fichier copyright comme un fichier README général. Si votre paquet possède un tel fichier, vous l'installerez dans /usr/doc/package/README ou README.Debian ou dans un autre endroit approprié.

Exemples

On installera tous les exemples (configuration, fichiers source, autres) dans un répertoire /usr/share/doc/package/examples. Ces fichiers ne seront pas utilisés par un quelconque programme. Ils ne sont là qu'en tant que documentation, et pour le seul bénéfice de l'administrateur système et des utilisateurs. On installera les exemples concernant une architecture particulière dans un répertoire /usr/lib/package/examples et les fichiers dans /usr/share/doc/package/examples seront des liens symboliques. Ou bien, ce dernier répertoire sera un lien vers le premier.

Les fichiers « Changelog »

Les paquets qui ne sont pas originaires de Debian doivent contenir, dans /usr/share/doc/package, une copie nommée changelog.Debian.gz du fichier debian/changelog qui est dans l'arborescence des sources. S'il existe un « changelog » original, il sera accessible en fichier texte comme /usr/share/doc/package/changelog.gz. Si le « changelog » original est distribué comme fichier HTML, il sera rendu disponible en tant que /usr/share/doc/package/changelog.html.gz et le changelog.gz sera produit en utilisant p.ex. lynx -dump -nolist. Si le changelog original n'est pas déjà conforme à cette convention, alors cela peut être réalisé soit en renommant ce fichier soit en créant un lien symbolique, c'est à la convenance du responsable du paquet

Argument : on n'a pas à chercher dans deux endroits les « changelogs » originaux simplement parce qu'ils sont dans un format HTML..

Ces fichiers seront installés comprimés par gzip -9, car ils grossissent avec le temps même s'ils commencent petitement.

Quand un paquet a un seul changelog, utilisé à la fois comme changelog Debian et changelog original car le responsable principal est le même que le responsable Debian, on appellera alors ce changelog de façon ordinaire : /usr/share/doc/package/changelog.gz. S'il y a un responsable principal mais pas de changelog source, on appellera toujours le changelog Debian changelog.Debian.gz.