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

14

Ich habe vor kurzem begonnen, einige meiner Software zu verpacken und auf Launchpad zu veröffentlichen. Die Installation und Deinstallation funktioniert gut, aber ein Upgrade des Pakets von einer Version auf die nächste Version ist problematisch.

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

Gibt es eine Möglichkeit, ein Betreuerskript in ein .deb-Paket aufzunehmen, das nur während der Erstinstallation des Pakets und nicht während eines Upgrades ausgeführt wird? Oder was wäre eine elegante Möglichkeit, einige Skripts für die Ersteinrichtung in ein .deb-Paket aufzunehmen?

    
Jeroen 06.02.2012, 20:27
quelle

5 Antworten

14

Mit einer Datei debian/preinst können Sie Aktionen bei der Installation ausführen, aber nicht bei der Aktualisierung.

#!/bin/sh
set -e

case "" in
    install)
        # do some magic
        ;;

    upgrade|abort-upgrade)
        ;;

    *)
        echo "postinst called with unknown argument \''" >&2
        exit 0
        ;;
esac

#DEBHELPER#

exit 0

Wie der Name schon sagt, wird dies vor der Installation Ihres Pakets ausgeführt. Sie können also möglicherweise nicht das tun, was Sie hier brauchen. Die meisten Pakete testen einfach in der Konfigurationsphase von postinst , wenn der Benutzer bereits erstellt wurde. Hier ist colord

$ cat  /var/lib/dpkg/info/colord.postinst
#!/bin/sh

set -e

case "" 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
    
andrewsomething 07.02.2012, 03:46
quelle
25

Sieh dir dieses Diagramm im Debian-Wiki an, wie die Betreuerskripte aufgerufen werden:

Wenn Sie auf der linken Seite nach unten gehen (der Pfad "alles geht gut"), sehen Sie, dass das Skript postinst mit der zuletzt konfigurierten Version aufgerufen wird. Dies gibt Ihnen die Möglichkeit, zwischen einem Upgrade und einer Neuinstallation zu unterscheiden - im Upgrade-Fall wird Ihr Postinst wie

aufgerufen
postinst configure 1.23-0ubuntu1

Dabei ist 1.23-0ubuntu1 die zuvor installierte Version Ihres Pakets, während es bei einer Neuinstallation wie

aufgerufen wird
postinst configure

Damit können Sie auch den Fall behandeln, wenn Sie beim Upgrade von einer bestimmten Version eine Aktion ausführen müssen - Sie können postinst für diese Version einchecken.

Dies macht es einfach zu überprüfen, ob das Skript auf einer "Installation" oder einem "Upgrade" ausgeführt wird. Wenn $ 2 null ist, dann ist es eine Installation. Also:

if [ -z "" ]; then
  do install stuff
else
  do upgrade stuff
fi
    
RAOF 07.02.2012 07:54
quelle
2

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

Suchen Sie im preinst-Skript nach einer Datei, die Ihr Paket auf jeden Fall installiert. Wenn es vorhanden ist, tun Sie nichts (weil Ihr Paket zuvor installiert wurde), ansonsten führen Sie Ihre Einrichtungsschritte aus.

Wenn Ihre Setup-Schritte erfordern, dass Ihr Paket installiert ist (in diesem Fall funktioniert das obige 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, tun Sie zwei Dinge:

  • Ihre anfänglichen Einrichtungsschritte
  • Löschen Sie die Datei / tmp / setupmypkg
kyleN 06.02.2012 22:43
quelle
0

Ich denke nicht, aber Sie können die preinst / postinst-Skripte leicht ändern, um zu überprüfen, ob das Paket zum ersten Mal installiert wird und Standardaktionen durchführen.

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, vielleicht kannst du das alles direkt in postinst überprüfen, weil ich denke, dass dpkg den Status des Pakets nicht als installiert festlegen würde, bevor postinst ausgeführt wird, aber ich bin mir nicht sicher. Also könnte das obige kommen,

in postinst,

if not is_package_istalled():
    Do First Install Setup 

Wo is_package_installed ist, können Sie den Installationsstatus erkennen. Kann etwas wie 'dpkg --status Paketname'

sein

ODER

Überprüfen Sie einfach, ob die Änderungen, die Sie vornehmen möchten, bereits vorhanden sind, und fahren Sie nur fort, wenn dies nicht der Fall ist.

    
Owais Lone 06.02.2012 22:15
quelle
0

Ich habe festgestellt, dass das Testen für $ 2 in Ihrem "postinst configure" -Skript nicht ordnungsgemäß funktioniert, wenn Sie Ihr Paket bereits einmal installiert und dann deinstalliert haben (aber ohne zu bereinigen) und dann erneut versuchen, es erneut zu installieren. In diesem Fall erhält das postinst-Skript immer noch ein Versionsargument für den Schritt "postinst configure".

Wenn Sie jedoch das Paket zuvor installiert haben, entfernen Sie es, löschen Sie es und installieren Sie es erneut. Das Skript "postinst configure" erhält kein Versionsargument in $ 2

    
robvdl 15.05.2014 14:25
quelle