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

14

Recentemente ho iniziato a confezionare alcuni dei miei software e pubblicarli su Launchpad. L'installazione e la rimozione funzionano bene, ma l'aggiornamento del pacchetto da una versione alla 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 sezione package.postinst configure) . Tuttavia, ciò comporta che vengano richiamati durante un aggiornamento e visualizzati in il diagramma .

C'è un modo per includere uno script del maintainer 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 iniziali in un pacchetto .deb?

    
posta Jeroen 06.02.2012 - 20:27
fonte

5 risposte

14

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

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

Anche se come suggerisce il nome, questo viene eseguito prima che il pacchetto sia installato. Quindi potresti non essere in grado di fare ciò di cui hai bisogno qui. La maggior parte dei pacchetti semplicemente verifica nella fase di configurazione di postinst se l'utente è già stato creato. Ecco 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
    
risposta data andrewsomething 07.02.2012 - 03:46
fonte
25

Dai un'occhiata a questo diagramma dalla wiki di Debian su come vengono chiamati gli script del manutentore:

Se segui il lato sinistro (il percorso "tutto va bene") vedrai che lo script postinst viene chiamato con la versione configurata più di recente. Questo ti dà la possibilità di distinguere tra un aggiornamento e una nuova installazione - nel caso dell'aggiornamento, il tuo postinst sarà chiamato come

postinst configure 1.23-0ubuntu1

dove 1.23-0ubuntu1 è la versione del pacchetto precedentemente installata, mentre per una nuova installazione sarà chiamata come

postinst configure

Ciò consente anche di gestire il caso quando è necessario eseguire un'azione quando si aggiorna da una versione specifica - è possibile effettuare il check-in di postinst per quella versione.

In questo modo è facile verificare se lo script viene eseguito su un '' installazione 'o' aggiornamento '. Se $ 2 è nullo, allora è un'installazione. così:

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

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

Nello script preinst, controlla la presenza di un file che il tuo pkg installa definitivamente. Se è presente, non fare nulla (perché il pacchetto è stato precedentemente installato), altrimenti, fare i passaggi di installazione.

Se la procedura di installazione richiede che il pacchetto pkg sia installato (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 passaggi iniziali di configurazione
  • cancella il file / tmp / setupmypkg
risposta data kyleN 06.02.2012 - 22:43
fonte
0

Non credo, ma puoi facilmente modificare gli script preinst / postinst per verificare se il pacchetto viene installato per la prima volta e intraprendere un'azione 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 

Modifica

Hmm, potrebbe essere possibile controllare tutto direttamente in postinst perché penso che dpkg non avrebbe impostato lo stato del pacchetto come installato prima di eseguire postinst, ma non ne sono sicuro. Quindi quanto sopra potrebbe venire,

in postinst,

if not is_package_istalled():
    Do First Install Setup 

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

OR

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

    
risposta data Owais Lone 06.02.2012 - 22:15
fonte
0

Ho riscontrato che il test per $ 2 nel tuo script "postinst configure" non funziona correttamente se hai già installato il pacchetto una volta prima, quindi disinstallato (ma senza eliminare), quindi riprova ad eseguire nuovamente la reinstallazione. In questo caso, lo script postinst ottiene ancora un argomento di versione per il passaggio "postinst configure".

Tuttavia, se hai già installato il pacchetto, quindi rimuovi E pulisci, quindi reinstallalo di nuovo, lo script "postinst configure" NON otterrà un argomento versione in $ 2

    
risposta data robvdl 15.05.2014 - 14:25
fonte

Leggi altre domande sui tag