Conventions pour le développement
Procédure de modification d'un paquet
Voici les étapes que l'on fait habituellement lorsqu'on fait une modification dans un paquet pour SLIS :
- faire les modifications proprement dites ;
- documenter les modifications (
dch), cela créera une nouvelle version automatiquement sidchest correctement configuré (voir ci-dessous), il convient d'ajouter un suffixe~1à la version dans ce cas pour indiquer qu'il s'agit encore d'une préversion à ce stade ; - construire le paquet (
svn-buildpackage -us -uc --svn-ignore) ; - tester le paquet ;
- si la modification fonctionne, envoyer (
debcommit) la modification dans le dépôt SVN ; - faire d'autres modifications de la même manière (incrémenter le suffixe
~Xà chaque nouvelle modification substantielle) ; - une fois la nouvelle version du paquet prête, le noter dans le changelog (
dch -r) ; - construire le paquet (
svn-buildpackage --svn-tag) ; - relire ses modifications (
debdiff) ; - envoyer le paquet dans l'archive (
dput).
Pour avoir un dch correctement configuré il faut mettre les lignes suivantes dans ~/.devscripts :
DEBCHANGE_RELEASE_HEURISTIC=changelog DEBCHANGE_MULTIMAINT_MERGE=yes DEBCHANGE_PRESERVE=yes
Les pages svn-buildpackage et dput détaillent l'usage et la configuration de ces deux outils.
Placement et nommage des exécutables
Les scripts exécutables doivent être placés dans les répertoires /bin, /sbin, /usr/bin, et /usr/sbin pour être en conformité avec le FHS (File Hierarchy Standard).
Pour éviter toute confusion, les exécutables devraient :
- avoir comme préfixe
slis- - respecter les schémas de nommage existants:
slis-test-servicepour un script de test d'un serviceslis-service-configpour un script de configuration initiale d'un service (qui respecte les conventions d'appel imposées parhandle_initial_configde slis-common)slis-mk-servicepour un script regénérant la configuration du service
Exemple :
/usr/bin/slis-mk-squidconfbinaire qui crée un fichier de conf/usr/bin/slis-test-squidbinaire qui teste un service/usr/sbin/slis-firewallbinaire avec de multiples actions possibles
Documentation des scripts
Tous les scripts shell et Perl doivent être documentés avec du POD (Plain Old Documentation). Ce POD est ensuite exploité par pod2man pour générer la page de manuel correspondante. L'interpréteur perl sait ignorer le POD de manière native mais ce n'est pas le cas des interpréteurs shell. Il faut donc exploiter une petite astuce pour pouvoir intégrer du POD n'importe où dans un tel script :
: <<=cut =head1 NAME script - short description of the script =head1 SYNOPSIS B<script> [options] I<file> =head1 DESCRIPTION Here's some normal text. It includes text that is B<bolded>, I<italicized>, U<underlined>, and C<$code>-formatted. =head1 OPTIONS =over 4 =item B<--option1> Description of the option one. =item B<--option2> Another description. =back =head1 SEE ALSO L<manpage>, L<another-script>. =head1 AUTHOR J. Random Hacker <jrh@example.com>. =cut
Cet exemple reprend la structure basique nécessaire. Les sections NAME, SYNOPSIS et DESCRIPTION sont standardisées et nécessaires, cela permet de générer des pages de manuel correctes et d'afficher des informations pertinentes en lançant script --help.
Guide de style pour le code
- Indentation de 4 caractères par défaut (mais une tabulation fait toujours 8 caractères).
- Voir les exemples ci-dessous pour chaque langage.
Shell
do_something() { echo "blabla" } result=0 while true; do if [ "$1" = "yes" ]; then # Short comment do_something $2 elif [ "$1" = "no" ]; then touch /tmp/bla else touch /tmp/else fi done case "$var" in remove) find /tmp -type f | xargs echo rm -f ;; add) date ;; esac
Perl
sub do_something { print "blabla\n"; } my $result = 0; while (1) { if ($ARGV[1] eq "yes") { do_something(); } else { do_something_else(); } }
PHP
<?php function do_something() { echo "blabla\n"; } $result = 0; while(true) { if ($_GET["do"] == "yes") { do_something(); } else { do_something_else(); } } ?>