web-dev-qa-db-fra.com

Comment exécuter un script uniquement lors de la première installation d'un package et lors des mises à niveau?

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?

14
Jeroen

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
15
andrewsomething

Consultez ce diagramme à partir de wiki Debian pour savoir comment les scripts de responsable sont appelés: Debian maintainer script flowchart

Si vous suivez le côté gauche (le chemin "tout va bien"), vous verrez que le script postinstest 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

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 postinstpour 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
27
RAOF

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:

  • vos étapes de configuration initiales
  • supprimer le fichier/tmp/setupmypkg
3
kyleN

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.

1
robvdl

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.

0
Owais Lone