Wie führe ich ein Skript nur während der Erstinstallation eines Pakets und während eines Upgrades aus?

14

Ich habe kürzlich begonnen, einige meiner Software zu packen und auf Launchpad zu veröffentlichen. Die Installation und Deinstallation funktioniert einwandfrei, aber ein Upgrade des Pakets von einer Version auf die nächste ist problematisch.

Das Problem ist, dass es einige Skripte gibt, die nur während der ersten Installation des Pakets ausgeführt werden müssen. Diese Skripte füllen die Datenbank, erstellen einen Benutzer usw. Sie werden derzeit im configure)Abschnitt package.postinst aufgerufen . Dies führt jedoch dazu, dass sie während eines Upgrades aufgerufen werden und im Diagramm angezeigt werden .

Gibt es eine Möglichkeit, ein Betreuerskript in ein .deb-Paket aufzunehmen, das nur während der ersten Installation des Pakets und nicht während eines Upgrades ausgeführt wird? Oder was wäre ein eleganter Weg, um einige anfängliche Setup-Skripte in ein .deb-Paket aufzunehmen?

Jeroen
quelle

Antworten:

15

Mit einer debian/preinstDatei können Sie Aktionen bei der Installation ausführen, jedoch nicht aktualisieren.

#!/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

Wie der Name schon sagt, wird dies ausgeführt, bevor Ihr Paket installiert wird. Vielleicht können Sie hier also nicht das tun, was Sie brauchen. Die meisten Pakete testen einfach in der Konfigurationsphase, postinstob der Benutzer bereits erstellt wurde. Hier istcolord

$ 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
undetwas
quelle
28

Sehen Sie sich dieses Diagramm aus dem Debian-Wiki an, um zu erfahren, wie die Betreuerskripte aufgerufen werden: Flussdiagramm des Debian-Betreuerskripts

Wenn Sie der linken Seite folgen (der Pfad "Alles geht in Ordnung"), werden Sie feststellen, dass das postinstSkript mit der zuletzt konfigurierten Version aufgerufen wird. Dies gibt Ihnen die Möglichkeit, zwischen einem Upgrade und einer Neuinstallation zu unterscheiden - im Falle eines Upgrades wird Ihre postinst wie folgt bezeichnet

postinst configure 1.23-0ubuntu1

Wo 1.23-0ubuntu1ist die zuvor installierte Version Ihres Pakets, während es bei einer Neuinstallation so heißt?

postinst configure

Auf diese Weise können Sie auch den Fall behandeln, dass Sie beim Upgrade von einer bestimmten Version eine Aktion ausführen müssen - Sie können die postinstfür diese Version einchecken .

Auf diese Weise können Sie leicht überprüfen, ob das Skript bei einer 'Installation' oder einem 'Upgrade' ausgeführt wird. Wenn $ 2 null ist, handelt es sich um eine Installation. so:

if [ -z "$2" ]; then
  do install stuff
else
  do upgrade stuff
fi
RAOF
quelle
Beachten Sie, dass der zusätzliche Parameter auch für den Fall übergeben wird, dass Sie das Paket entfernt (aber nicht gelöscht) und erneut installiert haben.
Skyking
3

Möglicherweise können Sie ein debian / preinst-Skript in Kombination mit postinst verwenden.

Suchen Sie im Skript vor der Installation nach einer Datei, die Ihr pkg definitiv installiert. Wenn es vorhanden ist, führen Sie nichts aus (da Ihr Paket zuvor installiert wurde), andernfalls führen Sie Ihre Setup-Schritte aus.

Wenn Ihre Installationsschritte erfordern, dass Ihr pkg installiert ist (in diesem Fall funktioniert das oben Genannte nicht, da preinst vor der Installation ausgeführt wird), könnte Ihr preinst-Skript eine Datei schreiben, zum Beispiel: / tmp / setupmypkg. Ihr Postinst-Skript könnte einfach testen, ob diese Datei vorhanden ist, und wenn ja, zwei Dinge tun:

  • Ihre ersten Schritte zur Einrichtung
  • Löschen Sie die Datei / tmp / setupmypkg
kyleN
quelle
1
Ja das würde funktionieren und ich mache gerade etwas ähnliches. Aber es sieht immer noch ein bisschen abgedreht aus ... Ich hatte gehofft, dass es einheimischer wird. Es scheint nicht so eine exotische Bitte zu sein, oder?
Jeroen
1

Ich habe festgestellt, dass das Testen von $ 2 in Ihrem "postinst configure" -Skript nicht richtig funktioniert, wenn Sie Ihr Paket bereits einmal installiert, dann deinstalliert (aber ohne zu löschen) und dann erneut versucht haben, es erneut zu installieren. In diesem Fall erhält das postinst-Skript weiterhin ein Versionsargument für den Schritt "postinst configure".

Wenn Sie das Paket jedoch zuvor installiert haben, es dann entfernen UND bereinigen und erneut installieren, erhält das Skript "postinst configure" KEIN Versionsargument in $ 2

robvdl
quelle
0

Ich glaube nicht, aber Sie können die Skripte vor und nach der Installation einfach ändern, um zu überprüfen, ob das Paket zum ersten Mal installiert wird, und Standardmaßnahmen ergreifen.

Kann so etwas sein,

in preinst.

if not is_package_istalled():
    export MY_PACKAGE_FIRST_INSTALL

in postinst,

if MY_PACKAGE_FIRST_INSTALL:
    Do First Install Setup 

Bearbeiten

Hmm, kann sein, dass Sie dies alles direkt in postinst überprüfen können, da ich denke, dass dpkg den Status des Pakets vor der Ausführung von postinst nicht als installiert festlegen würde, aber ich bin nicht sicher. So könnte das Obige kommen,

in postinst,

if not is_package_istalled():
    Do First Install Setup 

Mit is_package_installed können Sie den Installationsstatus ermitteln. Kann so etwas wie 'dpkg --status packagename' sein

ODER

Prüfen Sie einfach, ob die gewünschten Änderungen bereits vorhanden sind, und fahren Sie fort, wenn dies nicht der Fall ist.

Owais Lone
quelle
Ich verstehe nicht Woher kommt IS_INSTALLED?
Jeroen,
Es gibt kein IS_INSTALLED, es ist nur Pseudocode. Nur ein Beispiel. IS_INSTALLED könnte die Ausgabe eines Befehls wie 'dpkg --status paketname' sein. Ich meinte, Sie könnten überprüfen, ob das Paket in preinst installiert ist, eine Zustandsvariable setzen und dann basierend auf dieser Zustandsvariable in postinst Maßnahmen ergreifen.
Owais Lone