Come eseguire uno script solo durante la prima installazione di un pacchetto e durante gli aggiornamenti?


14

Di recente ho iniziato a impacchettare parte del mio software e pubblicarlo su Launchpad. L'installazione e la rimozione funzionano correttamente, ma l'aggiornamento del pacchetto da una versione alla versione successiva è problematico.

Il problema è che ci sono alcuni script che devono essere eseguiti solo durante la prima installazione del pacchetto. Questi script popolano il DB, creano un utente, ecc. Attualmente sono chiamati nella configure)sezione package.postinst . Tuttavia, ciò comporta che vengano richiamati durante un aggiornamento e mostrati nel diagramma .

Esiste un modo per includere uno script di manutenzione in un pacchetto .deb che viene eseguito solo durante la prima installazione del pacchetto e non durante un aggiornamento? O quale sarebbe un modo elegante per includere alcuni script di installazione iniziale in un pacchetto .deb?

Risposte:


15

Con un debian/preinstfile è possibile eseguire azioni durante l'installazione ma non l'aggiornamento.

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

Sebbene, come suggerisce il nome, questo viene eseguito prima dell'installazione del pacchetto. Quindi potresti non essere in grado di fare ciò di cui hai bisogno qui. La maggior parte dei pacchetti verifica semplicemente nella fase di configurazione postinstse l'utente è già stato creato. Eccocolord

$ 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

28

Dai un'occhiata a questo diagramma dal wiki di Debian su come vengono chiamati gli script del manutentore: Diagramma di flusso degli script del manutentore Debian

Se segui il lato sinistro (il percorso "Va tutto bene") vedrai che lo postinstscript viene chiamato con l'ultima versione configurata. Questo ti dà la possibilità di distinguere tra un aggiornamento e una nuova installazione: nel caso dell'aggiornamento, il tuo postinst verrà chiamato come

postinst configure 1.23-0ubuntu1

dove si 1.23-0ubuntu1trova la versione precedentemente installata del pacchetto, mentre per una nuova installazione verrà chiamata come

postinst configure

Ciò consente anche di gestire il caso in cui è necessario eseguire un'azione durante l'aggiornamento da una versione particolare: è possibile verificare la presenza postinstdi quella versione.

Ciò semplifica il controllo se lo script viene eseguito su un 'installazione' o un 'aggiornamento'. Se $ 2 è null, allora è un'installazione. così:

if [ -z "$2" ]; then
  do install stuff
else
  do upgrade stuff
fi

1
Si noti che il parametro aggiuntivo viene anche passato nel caso in cui il pacchetto sia stato rimosso (ma non rimosso) e lo si installi nuovamente.
skyking

3

Potresti essere in grado di usare uno script debian / preinst in combinazione con postinst.

Nello script preinst, cerca un file che il tuo pkg installa definitivamente. Se è presente, non eseguire alcuna operazione (poiché il pacchetto è stato precedentemente installato), altrimenti eseguire i passaggi di installazione.

Se i passaggi di installazione richiedono l'installazione di pkg (nel qual caso quanto sopra non funzionerà perché preinst viene eseguito prima dell'installazione), lo script preinst potrebbe scrivere un file, ad esempio: / tmp / setupmypkg. Lo script postinst potrebbe semplicemente verificare se quel file è presente e in tal caso fare due cose:

  • i tuoi passi iniziali di configurazione
  • elimina il file / tmp / setupmypkg

1
Sì, questo funzionerebbe e attualmente sto facendo qualcosa di simile. Ma sembra ancora un po 'confuso ... Speravo in un modo più nativo per farlo. Non sembra una richiesta così esotica, giusto?
Jeroen,

1

Ho scoperto che il test per $ 2 nel tuo script "postinst configure" non funziona correttamente se hai già installato il tuo pacchetto una volta prima, quindi lo hai disinstallato (ma senza eliminare), quindi prova di nuovo a reinstallare. In questo caso, lo script postinst ottiene ancora un argomento versione per il passaggio "postinst configure".

Tuttavia, se il pacchetto è stato installato in precedenza, quindi rimuoverlo ED eliminarlo, quindi reinstallare nuovamente, lo script "postinst configure" NON riceverà un argomento versione in $ 2


0

Non credo, ma puoi facilmente modificare gli script preinst / postinst per verificare se il pacchetto viene installato per la prima volta e intraprendere azioni standard.

Potrebbe essere qualcosa del genere,

in preinst.

if not is_package_istalled():
    export MY_PACKAGE_FIRST_INSTALL

in postinst,

if MY_PACKAGE_FIRST_INSTALL:
    Do First Install Setup 

modificare

Forse, puoi semplicemente controllare tutto questo direttamente in PostInst perché penso che dpkg non imposterà lo stato del pacchetto come installato prima di eseguire PostInst, ma non ne sono sicuro. Quindi potrebbe succedere quanto sopra

in postinst,

if not is_package_istalled():
    Do First Install Setup 

Dove, is_package_installed può essere la tua funzione per rilevare lo stato dell'installazione. Potrebbe essere qualcosa come "dpkg --status nomepacchetto"

O

Perché non semplicemente controllare se le modifiche che si desidera apportare sono già lì e procedere solo se non lo sono.


Non capisco. Da dove viene IS_INSTALLED?
Jeroen,

Non esiste IS_INSTALLED, è solo uno pseudo codice. Solo un esempio IS_INSTALLED potrebbe essere l'output di un comando come 'dpkg --status nome_pacchetto'. Ciò che intendevo era che potresti verificare se il pacchetto è installato in preinst, impostare uno stato var e quindi in base a questo stato var agire in postinst.
Owais Lone,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.