J'ai récemment commencé à empaqueter certains de mes logiciels et à les publier sur Launchpad. L'installation et la suppression fonctionnent correctement, mais la mise à niveau du package d'une version à une autre est problématique.
Le problème est que certains scripts doivent uniquement être exécutés lors de la première installation du package. Ces scripts remplissent la base de données, créent un utilisateur, etc. Ils sont actuellement appelés dans la section package.postinst configure)
. Cependant, ils sont appelés lors de la mise à niveau, comme indiqué dans le diagramme .
Existe-t-il un moyen d'inclure un script de responsable dans un package .deb qui ne s'exécute que lors de la première installation du package et non lors d'une mise à niveau? Ou quel serait un moyen élégant d’inclure des scripts de configuration initiale dans un paquet .deb?
Avec un fichier debian/preinst
, vous pouvez effectuer des actions lors de l'installation mais pas de la mise à niveau.
#!/bin/sh
set -e
case "$1" in
install)
# do some magic
;;
upgrade|abort-upgrade)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 0
;;
esac
#DEBHELPER#
exit 0
Comme son nom l'indique, il est exécuté avant l'installation de votre paquet. Vous ne pourrez donc peut-être pas faire ce dont vous avez besoin ici. La plupart des paquets testent simplement à l'étape de configuration de postinst
si l'utilisateur a déjà été créé. Voici colord
$ cat /var/lib/dpkg/info/colord.postinst
#!/bin/sh
set -e
case "$1" in
configure)
# create colord group if it isn't already there
if ! getent group colord >/dev/null; then
addgroup --quiet --system colord
fi
# create the scanner group if it isn't already there
if ! getent group scanner >/dev/null; then
addgroup --quiet --system scanner
fi
# create colord user if it isn't already there
if ! getent passwd colord >/dev/null; then
adduser --system --ingroup colord --home /var/lib/colord colord \
--gecos "colord colour management daemon"
# Add colord user to scanner group
adduser --quiet colord scanner
fi
# ensure /var/lib/colord has appropriate permissions
chown -R colord:colord /var/lib/colord
;;
esac
exit 0
Consultez ce diagramme à partir de wiki Debian pour savoir comment les scripts de responsable sont appelés:
Si vous suivez le côté gauche (le chemin "tout va bien"), vous verrez que le script postinst
est appelé avec la version la plus récemment configurée. Cela vous donne une chance de faire la distinction entre une mise à niveau et une nouvelle installation - dans le cas de la mise à niveau, votre postinst sera appelé comme
postinst configure 1.23-0ubuntu1
où 1.23-0ubuntu1
est la version précédemment installée de votre paquet, alors que pour une nouvelle installation, elle s'appellera comme
postinst configure
Cela vous permet également de gérer le cas où vous devez effectuer une action lors de la mise à niveau à partir d'une version particulière - vous pouvez archiver le postinst
pour cette version.
Cela facilite la vérification du script lors d'une installation ou d'une mise à niveau. Si $ 2 est nul, c'est une installation. alors:
if [ -z "$2" ]; then
do install stuff
else
do upgrade stuff
fi
Vous pourrez peut-être utiliser un script debian/preinst en combinaison avec postinst.
Dans le script preinst, recherchez un fichier que votre pkg installe définitivement. S'il est présent, ne faites rien (car votre paquet a déjà été installé), sinon, suivez les étapes de votre configuration.
Si vos étapes d'installation nécessitent l'installation de pkg (dans ce cas, la procédure ci-dessus ne fonctionnera pas, car preinst s'exécutera avant l'installation), votre script preinst pourrait alors écrire un fichier, par exemple:/tmp/setupmypkg. Votre script postinst pourrait simplement vérifier si ce fichier est présent et si c'est le cas, faites deux choses:
J'ai constaté que le test de 2 $ dans votre script "postinst configure" ne fonctionnait pas correctement si vous aviez déjà installé votre paquet une fois auparavant, que vous l'aviez désinstallé (mais sans le purger), puis essayez à nouveau de le réinstaller. Dans ce cas, le script postinst obtient toujours un argument de version pour l'étape "postinst configure".
Cependant, si vous avez déjà installé le paquet, supprimez ET purgez-le, puis réinstallez-le, le script "postinst configure" n'obtiendra PAS un argument de version dans $ 2.
Je ne le pense pas, mais vous pouvez facilement modifier les scripts preinst/postinst pour vérifier si le paquet est en cours d'installation pour la première fois et entreprendre une action standard.
Peut-être quelque chose comme ça,
dans preinst.
if not is_package_istalled():
export MY_PACKAGE_FIRST_INSTALL
en postinst,
if MY_PACKAGE_FIRST_INSTALL:
Do First Install Setup
Éditer
Hmm, vous pouvez peut-être vérifier tout cela directement dans postinst car je pense que dpkg ne définirait pas le statut du paquet comme étant installé avant d'exécuter postinst mais je ne suis pas sûr. Donc, ce qui précède pourrait être venu,
en postinst,
if not is_package_istalled():
Do First Install Setup
Où, is_package_installed peut être votre fonction pour détecter l’état de l’installation. Peut-être quelque chose comme 'dpkg --status packagename'
OR
Pourquoi ne pas simplement vérifier si les modifications que vous souhaitez apporter sont déjà présentes et ne procéder que si elles ne le sont pas.