Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/10/2015, à 13:54

JujuLand

Fabrication d'un paquet deb

bonjour,
Je ne suis pas sûr d'être dans le bon forum.

Je suis en train de mettre en place un logiciel de mon cru, et je veux créer un deb pour avoir une installation facile à proposer(cas 2).
J'ai procédé comme indique dans ce tutoriel.

Ca fonctionne très bien (avec l'exemple notamment), mais je me posais quelques questions:

1) Est-il possible avec le deb d'installer un dossier dans /home/$SUSER, et comment ?
2) Est-il possible de modifier les droits (chown) du répertoire, ou d'un sous-répertoire créé dans /opt (par exemple), pour les positionner avec les droits de $USER, et comment ? Ou cela est-il à la charge du programme et devra donc être effectué au premier lancement de l'appli ?

Merci
A+

Dernière modification par JujuLand (Le 19/10/2015, à 13:55)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#2 Le 19/10/2015, à 14:20

jplemoine

Re : Fabrication d'un paquet deb

JujuLand a écrit :

1) Est-il possible avec le deb d'installer un dossier dans /home/$SUSER, et comment ?

A priori, non. puisque $USER est root dans le cas d'un installation "dans le système".
Peut-être s'il est installé dans le home (installation non conforme à la méthode habituelle)

JujuLand a écrit :

2) Est-il possible de modifier les droits (chown) du répertoire, ou d'un sous-répertoire créé dans /opt (par exemple), pour les positionner avec les droits de $USER, et comment ? Ou cela est-il à la charge du programme et devra donc être effectué au premier lancement de l'appli ?

Il est possible de faire beaucoup de chose avec le script de post installation : on doit pouvoir changer les propriétaires/droits d'un répertoire et/ou un fichier.
Attention : normalement, les sous-répertoires de 1er niveau de /opt appartiennent à root et ne sont accessible qu'en lecture (+ exécution pour certains fichiers).
                   Tu peux avoir un sous répertoire (typiquement upload) qui est accessible en écrtiture pour tout un chacun.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#3 Le 19/10/2015, à 14:42

JujuLand

Re : Fabrication d'un paquet deb

Bonjour,

ok, je limiterai donc la création de dossier dans le home/$user au strict minimim, et à partir du premier lancement de l'appli.

Quand au droits dans /opt, , je vais procéder comme j'ai fait manuellement sur mon ordi (et çà fonctionne très bien), et je verrai ensuite quels sous dossiers  dont je devrai modifier les droits, bien sûr dans le script de post-install.
Je n'ai pas vu encore comment et où il était positionné, mais en visualisant un deb, je devrai bien trouver.
Concernant les droits des dossiers sis dans opt, je suppose que c'est un principe avant tout, non ?

Merci
A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#4 Le 20/10/2015, à 17:50

JujuLand

Re : Fabrication d'un paquet deb

Bon, j'ai trouvé une doc en ligne très complète qui m'a permis d'avancer.
Pourtant, j'ai quelques problèmes:

1) Lors de l'install avec gdebi-gtk, quand l'install est terminée, gdebi-gtk n'ajoute pas le bouton Reinstaller, ou lorsque je quitte et relance gdebi-gtk, il ne semble pas voir que la version est déjà installée, et ne me propose pas le bouton Désinstaller.
Je pense que j'ai sans doute oublié quelque chose, mais je ne vois pas quoi ...

2) Lors de la désinstallation avec dpkg, il me donne un message d'avertissement, et ne me supprime pas le dossier de l'appli :

Suppression de maintsys-client ...
dpkg : avertissement : lors de la suppression de maintsys-client, le répertoire « /opt/Maintsys » n'était pas vide, donc il n'a pas été supprimé.
Traitement des actions différées (« triggers ») pour « desktop-file-utils »...
Traitement des actions différées (« triggers ») pour « bamfdaemon »...
Rebuilding /usr/share/applications/bamf.index...
Traitement des actions différées (« triggers ») pour « gnome-menus »...

La aussi, j'ai sans doute oublié quelque chose (peut-être la même raison que pour le premier problème).
Ou tout simplement à cause de mon postinst qui modifie les droits de suelsues sous-répertoires ?

3) Je n'ai trouvé nulle part comment générer le fichier md5sums dans DEBIAN

Merci de vos lumières.
A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#5 Le 20/10/2015, à 19:05

JujuLand

Re : Fabrication d'un paquet deb

Pour le problème de suppression avec dpkg, j'ai trouvé :
Il faut mettre le contenu complet du dossier applicatif en root:root avant création du deb.

Pour le reste, je cherche encore ...

Autre problème :

Avec le paquet j'installe des outils qui sont utilisés par plusieurs programmes que j'utilise.
Comment les préserver lors de la désinstallation du paquet ?

Merci

Dernière modification par JujuLand (Le 20/10/2015, à 19:06)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#6 Le 20/10/2015, à 21:27

JujuLand

Re : Fabrication d'un paquet deb

Pour l'install, j'ai trouvé çà :

Remplacements : champ Replaces
Le champ Replaces indique que le paquet contient des fichiers également présents dans un autre
paquet, mais qu'il a légitimement le droit de les remplacer. En l'absence de cette précision, dpkg
échoue en précisant qu'il ne peut pas écraser les fichiers d'un autre paquet (en fait, il est possible
de lui forcer la main avec l'option --force-overwrite). Cela permet d'identifier les problèmes
potentiels et contraint le mainteneur à étudier la question avant de choisir d'ajouter ou non ce
champ.
L'emploi de ce champ se justifie dans le cas de changements de noms de paquets ou lorsqu'un
paquet est intégré dans un autre. Cela se produit également quand le mainteneur a décidé de
répartir différemment les fichiers entre divers paquets binaires produits depuis le même paquet
source : un fichier remplacé n'appartient plus à l'ancien paquet, mais uniquement au nouveau.
Si tous les fichiers d'un paquet installé ont été remplacés, il est considéré comme supprimé.
Enfin, ce champ incite aussi dpkg à supprimer le paquet remplacé en cas de conflit.

par contre, je n'ai rien trouvé pour la désinstallation.
Est-ce que çà existe ?

A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#7 Le 20/10/2015, à 22:10

JujuLand

Re : Fabrication d'un paquet deb

Bon, c'est bon pour la préservation.
un script prerm que preserve les fichiers dans /tmp
un script postrm qui remet çà
et le tour est joué wink

Il me reste çà :

1) Lors de l'install avec gdebi-gtk, quand l'install est terminée, gdebi-gtk n'ajoute pas le bouton Reinstaller, ou lorsque je quitte et relance gdebi-gtk, il ne semble pas voir que la version est déjà installée, et ne me propose pas le bouton Désinstaller.

3) Je n'ai trouvé nulle part comment générer le fichier md5sums dans DEBIAN

Merci
A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#8 Le 20/10/2015, à 22:19

JujuLand

Re : Fabrication d'un paquet deb

C'est ok pour md5sums ... j'avais du mal chercher. Les sites en anglais sont très fournis smile

Exécuter çà depuis le répertoire de travail:

$ find . -type f ! -regex '.*.hg.*' ! -regex '.*?debian-binary.*' ! -regex '.*?DEBIAN.*' -printf '%P ' | xargs md5sum > DEBIAN/md5sums

Plus que çà :

1) Lors de l'install avec gdebi-gtk, quand l'install est terminée, gdebi-gtk n'ajoute pas le bouton Reinstaller, ou lorsque je quitte et relance gdebi-gtk, il ne semble pas voir que la version est déjà installée, et ne me propose pas le bouton Désinstaller.

Merci
A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#9 Le 20/10/2015, à 22:40

jplemoine

Re : Fabrication d'un paquet deb

il y a un utilitaire qui permet de s'assurer que le paquet est de bonne qualité : lintian <nom_du_fichier.deb>


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#10 Le 21/10/2015, à 13:22

JujuLand

Re : Fabrication d'un paquet deb

Bon, en passant lintian, et en corrigeant un maximum d'erreurs:
        - droits
        - contenus
        - ajouts de certains fichiers (changelog, copyright, ...)
je suis arrivé à mes fins.

Lintian me jette beaucoup moins d'injures tongue, et gedbi-gtk me propose bien les boutons réinstaller et supprimer smile


Reste juste quelques types d'erreurs ou warning:

E: maintsys-client: unstripped-binary-or-object opt/Maintsys/MaintHelp
E: maintsys-client: unstripped-binary-or-object opt/Maintsys/Maintsys-client
E: maintsys-client: unstripped-binary-or-object opt/Maintsys/maintntx
E: maintsys-client: unstripped-binary-or-object usr/local/bin/Gradients
E: maintsys-client: unstripped-binary-or-object usr/local/bin/splash

Je ne comprends pas trop le terme de 'unstripped' et je ne vois pas trop ce que je peux y faire, vu que ce sont des fichiers compilés avec harbour.


E: maintsys-client: missing-dependency-on-libc needed by opt/Maintsys/MaintHelp and 4 others

De plus, ils sont linkés en mode static, et donc embarquant les fonctions (sans liens dynamiques avec des librairies).
Je ne vois donc pas trop le sens de ce message.


E: maintsys-client: dir-or-file-in-opt opt/Maintsys/

A lire la doc de lintian, il est dit qu'un paquet debian ne doit pas être positionner dans /opt, qui est réservé aux logiciels additionels.
C'est pourtant le cas ici ...


E: maintsys-client: dir-in-usr-local usr/local/bin/
E: maintsys-client: file-in-usr-local usr/local/bin/Maintsys-client.sh
W: maintsys-client: file-in-unusual-dir usr/local/bin/Maintsys-client.sh
E: maintsys-client: file-in-usr-local usr/local/bin/colors
W: maintsys-client: file-in-unusual-dir usr/local/bin/colors

A lire la doc de lintian, il est dit que les fichiers programmes dans être mis dans /usr/bin et non dans /usr/local/bin, en pointant le risque que /usr/local ne soit monté en lecture seule sur des serveurs distants ... mouais ...
Et dans la doc debian, qu'il est préférable de déposer une archive et de la décompacter ensuite dans postinst
C'est pas un peu neuneu, car le résultat sera bien le même, non ?


Merci de vos commentaires
A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#11 Le 22/10/2015, à 09:15

JujuLand

Re : Fabrication d'un paquet deb

Bon, je progresse ...

J'ai ajouté libc6 dans les 'depends', çà enlève donc cette erreur ...

Ayant eu quelques problèmes lors de tests d'install, réinstall et suppression, j'ai généré deux paquets pour éviter ce postrm, et je les mets dans /usr/bin pour éviter les file-in-usr-local.

Enfin, je considère les erreurs de file-in-opt comme normales, vu que c'est un produit additionnel.

En fin de compte, il ne me reste que les 'unstripped-binary' dont je n'ai toujours pas compris le sens.

A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#12 Le 22/10/2015, à 14:10

JujuLand

Re : Fabrication d'un paquet deb

Pour ne pas à avoir à taper des commandes en pagaille, j'ai fait un petit script (make-dev) à mettre dans /usr/bin ou /usr/local/bin ou ~/bin  (si vous avez ca défini dans votre .profile) et qui permet de construire un paquet de manière assez simple.

Il fut evidemment en préalable avoir créé la structure qui devra recevoir le projet.

#!/bin/bash

export version="1.00"
export make_root=""                          # Répertoire racine d'où sera exécuté ce script

. colors
if [ "x$gBlu" == "x" ]; then
   color="0"
else
   color="1"
fi

if [ "x"$make_root == "x" ]; then
#   clear
   echo " "
   if [ "$color" == "0" ]; then
      echo " make-deb v $version"
      echo " "
      echo -e " Vous avez oublié de paramétrer la variable nécessaire à l'exécution de ce script."
   else
      echo -e "$gBlu make-deb$noColor v$gGre $version$noColor"
      echo " "
      echo -e " Vous avez oublié de$gRed paramétrer la variable$noColor nécessaire à l'exécution de ce script."
   fi
   echo " Veuillez procéder à ce paramétrage, avant de relancer ce script."
   echo " "
   echo " Après, vous pourrez lancer $0 de nouveau ..."
   echo
   echo "Appuyez sur une touche pour continuer ..."
   read
   sudo nano $(which $0)
   exit
fi

error="n"
if [ "x"$1 == "x" ]; then
   error="o"
fi
if [ "y"$5 == "y" ]; then
   error="o"
fi
if [ $error == "o" ]; then
   echo " "
   if [ "$color" == "0" ]; then
      echo "Syntaxe : make-deb <root-folder> <deb-name> <version> <architecture> <dossier appli> [<dossier appli>] [<dossier appli>]"
      echo " "
      echo "     où : <root-folder> est le dossier de travail"
      echo "          <deb-name> est le nom du paquet sans la version, ni le type d'install"
      echo "          <version> est la version"
      echo "          <architecture> est l'architecture de destination (amd64, i386, all)"
      echo "          <dossier-appli> est le dossier ou sera installé l'application (exemple: /opt/Maintsys)"
   else
      echo -e "Syntaxe :$gBlu make-deb$gGre <root-folder>$gCya <deb-name> $gBlu <version>$gCyan <architecture>$gRed <dossier appli> [<dossier appli>] [<dossier appli>]$noColor"
      echo " "
      echo -e "     où :$gGre <root-folder>$noColor est le dossier de travail"
      echo -e "         $gCya <deb-name>$noColor est le nom du paquet sans la version, ni le type d'install"
      echo -e "         $gBlu <version>$noColor est la version"
      echo -e "         $gCya <architecture>$noColor est l'architecture de destination (amd64, i386, all)"
      echo -e "         $gRed <dossier-appli>$noColor est le dossier ou sera installé l'application (exemple: /opt/Maintsys)"
   fi
   echo "          avec possibilité des trois dossiers maximum"
   echo " "
   exit
fi

cd $make_root
cd $1

echo " "
echo -e "$gBlu make-deb$noColor v$gGre $version$noColor"
echo "make-deb v $version - JujuLand"                   > ../lintian.log
echo $2_$3_$4                                  |tee -a ../lintian.log
LANG=C date -R                                         >> ../lintian.log
echo " "
echo Vous pouvez copier la date, en cas de besoin dans le changelog ...
if [ "$color" == "0" ]; then
   echo " "
else
   echo -e $gGre
fi
LANG=C date -R
if [ "$color" == "0" ]; then
   echo " "
else
   echo -e $noColor
fi
read
echo -----------------------------------
echo Edition de control
sudo nano DEBIAN/control

echo -----------------------------------
echo Edition de preinst
ok="n"
if [ -e DEBIAN/preinst ]; then
   ok="o"
else
   echo "Ajoute-t-on un preinst ? (o/N) "
   read ok
fi
if [ "$ok" == "o" ]; then
   sudo nano DEBIAN/preinst
fi

echo -----------------------------------
echo Edition de postinst
ok="n"
if [ -e DEBIAN/postinst ]; then
   ok="o"
else
   echo "Ajoute-t-on un postinst ? (o/N) "
   read ok
fi
if [ "$ok" == "o" ]; then
   sudo nano DEBIAN/postinst
fi

echo -----------------------------------
echo Edition de prerm
ok="n"
if [ -e DEBIAN/prerm ]; then
   ok="o"
else
   echo "Ajoute-t-on un prerm ? (o/N) "
   read ok
fi
if [ "$ok" == "o" ]; then
   sudo nano DEBIAN/prerm
fi

echo -----------------------------------
echo Edition de postrm
ok="n"
if [ -e DEBIAN/postrm ]; then
   ok="o"
else
   echo "Ajoute-t-on un postrm ? (o/N) "
   read ok
fi
if [ "$ok" == "o" ]; then
   sudo nano DEBIAN/postrm
fi

echo -----------------------------------
echo Edition de changelog
gzip -d -c usr/share/doc/$2/changelog.gz > DEBIAN/changelog
sudo rm usr/share/doc/$2/changelog.gz

sudo nano DEBIAN/changelog
sudo chown $USER:$USER usr/share/doc/$2
gzip -c -9 DEBIAN/changelog > usr/share/doc/$2/changelog.gz
sudo chown -R root:root usr/share/doc/$2
sudo chmod 644 usr/share/doc/$2/changelog.gz
sudo rm DEBIAN/changelog

echo -----------------------------------
echo Edition de copyright
sudo nano usr/share/doc/$2/copyright

echo -----------------------------------
if [ -e usr/share/applications/$2.desktop ]; then
   echo Edition de $2.desktop
   sudo nano usr/share/applications/$2.desktop
fi

echo -----------------------------------
echo Edition de readme.txt
sudo nano $5/readme.txt

if [ "x"$6 != "x" ]; then
   echo -----------------------------------
   echo Edition de readme.txt
   sudo nano $6/readme.txt
fi

if [ "x"$7 != "x" ]; then
   echo -----------------------------------
   echo Edition de readme.txt
   sudo nano $7/readme.txt
fi

echo -----------------------------------
echo Génération de md5sums ...
sudo chown $USER:$USER DEBIAN/md5sums
sudo find . -type f ! -regex '.*.hg.*' ! -regex '.*?debian-binary.*' ! -regex '.*?DEBIAN.*' -printf '%P ' | xargs md5sum > DEBIAN/md5sums
sudo chown root:root DEBIAN/md5sums
cd ..

echo -----------------------------------           |tee -a lintian.log
echo Création de $2_$3_$4.deb ...                  |tee -a lintian.log
dpkg -b $1/ $2_$3_$4.deb                           |tee -a lintian.log
echo " "                                           |tee -a lintian.log

echo -----------------------------------           |tee -a lintian.log
echo Vérification par lintian ...                  |tee -a lintian.log
lintian $2_$3_$4.deb                               >> lintian.log

cat lintian.log |grep -v "dir-or-file-in-" |grep -v "dir-in-" |grep -v "file-in-" > $2_$3_$4.log
rm lintian.log
echo " "

echo -----------------------------------
echo Affichage du log ...
echo " "
gedit $2_$3_$4.log &

PS : Je masque certaines erreurs dans le log (dir-or-file-in-, dir-in-, file-in-)

Ce script utilise colors, un autre script qui permet colorier les textes dans un terminal.
A déposer comme le script précédent sans /usr/bin, /usr/local/bin ou ~/bin
Ajouter çà dans .profile pour ne pas avoir à le répéter :
. colors (point, expace, colors)

#!/bin/bash

# Définition des couleurs
# Arrière-plan
export bBla='\033[40m'
export bRed='\033[41m'
export bGre='\033[42m'
export bYel='\033[43m'
export bBlu='\033[44m'
export bMag='\033[45m'
export bCya='\033[46m'
export bWhi='\033[47m'
# Encre Normal
export fBla='\033[30m'
export fRed='\033[31m'
export fGre='\033[32m'
export fYel='\033[33m'
export fBlu='\033[34m'
export fMag='\033[35m'
export fCya='\033[36m'
export fWhi='\033[37m'
# Encre gras
export gBla='\033[1;30m'
export gRed='\033[1;31m'
export gGre='\033[1;32m'
export gYel='\033[1;33m'
export gBlu='\033[1;34m'
export gMag='\033[1;35m'
export gCya='\033[1;36m'
export gWhi='\033[1;37m'
# Sans couleur
export noColor='\033[0m'
# Déplacements sur l'écran:
export mho='\033[0H'
export men='\033[0F'
export mle='\033[0D'
export mri='\033[0C'
export mup='\033[0A'
export mdo='\033[0B'

A+

Dernière modification par JujuLand (Le 22/10/2015, à 14:13)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne