2009-04-03 8 views
10

Per il Debian Policy Manual, il mio script postinst è sempre chiamato a aggiornamento e configurare il tempo, come "postinst configure vecchia versione", dove vecchia versione è la versione precedentemente installata (eventualmente null). Voglio determinare la nuova versione, ovvero la versione attualmente configurata (aggiornata a).Come ottenere la versione appena installata all'interno di uno script postinst Debian?

La variabile di ambiente $DPKG_MAINTSCRIPT_PACKAGE contiene il nome del pacchetto; non sembra essere un campo equivalente _VERSION. /var/lib/dpkg/status viene aggiornato DOPO le esecuzioni postinst, quindi non riesco nemmeno a analizzarlo.

Qualche idea?

risposta

1

Perché non è possibile codificare la versione nello script postinst al momento dell'imballaggio?

+0

+1: sembra ragionevole per me. – Powerlord

+5

Hardcoding questo in uno script ha bisogno di cambiarlo ogni volta ... Non è una buona idea, a mio parere. –

3

Io uso il seguente comando un po 'sporca nello script postinst:

NewVersion=$(zcat /usr/share/doc/$DPKG_MAINTSCRIPT_PACKAGE/changelog.gz | \ 
    head -1 | perl -ne '$_=~ /.*\((.*)\).*/; print $1;') 
+0

brutto, ma funziona per me. Di certo non rendono facile fare qualcosa che dovrebbe essere semplice, vero? –

+0

Funziona solo se il changelog è effettivamente compresso:/ – Flimzy

+0

Questo fallisce anche per ~ versioni che non sono riflesse nel registro modifiche. – Flimzy

5

Questo è il metodo migliore che ho trovato per risolvere questo problema è quello di utilizzare una variabile segnaposto nel vostro .postinst (o un altro controllo file):

case "$1" in 
    configure) 
     new_version="__NEW_VERSION__" 
     # Do something interesting interesting with $new_version... 
     ;; 
    abort-upgrade|abort-remove|abort-deconfigure) 
     # Do nothing 
     ;; 
    *) 
     echo "Unrecognized postinst argument '$1'" 
     ;; 
esac 

Poi, nel debian/rules, sostituire la variabile segnaposto con il corretto numero di versione in fase di compilazione:

# Must not depend on anything. This is to be called by 
# binary-arch/binary-indep in another 'make' thread. 
binary-common: 
    dh_testdir 
    dh_testroot 
    dh_lintian 
    < ... snip ... > 

    # Replace __NEW_VERSION__ with the actual new version in any control files 
    for pkg in $$(dh_listpackages -i); do \ 
     sed -i -e 's/__NEW_VERSION__/$(shell $(SHELL) debian/gen_deb_version)/' debian/$$pkg/DEBIAN/*; \ 
    done 

    # Note dh_builddeb *must* come after the above code 
    dh_builddeb 

La risultante .postinst frammento, trovato in debian/<package-name>/DEBIAN/postinst, sarà simile:

case "$1" in 
    configure) 
     new_version="1.2.3" 
     # Do something interesting interesting with $new_version... 
     ;; 
    abort-upgrade|abort-remove|abort-deconfigure) 
     # Do nothing 
     ;; 
    *) 
     echo "Unrecognized postinst argument '$1'" 
     ;; 
esac 
+0

Per un pacchetto di distutils Python ho dovuto aggiungere la versione al postinst. Ho aggiunto un hook in setup.py per cercare e sostituire il file postinst durante la fase di compilazione. –

2
VERSION=$(zless /usr/share/doc/$DPKG_MAINTSCRIPT_PACKAGE/changelog* \ 
    | dpkg-parsechangelog -l- -SVersion') 

Vantaggi rispetto ad altre soluzioni qui:

  • funziona indipendentemente dal fatto changelog è compresso o no
  • Utilizza parser per il changelog di dpkg anziché espressioni regolari, awk, ecc.
+0

Bello, ma richiede una dipendenza aggiuntiva per 'dpkg-dev' nel pacchetto.(e tu hai un "}" troppo nel tuo esempio, penso) – Tonin

+0

Grazie, aggiornato. –

2

Aggiungere il seguente alla debian/rules:

override_dh_installdeb: 
    dh_installdeb 
    for pkg in $$(dh_listpackages -i); do \ 
     sed -i -e 's/__DEB_VERSION__/$(DEB_VERSION)/' debian/$$pkg/DEBIAN/*; \ 
    done 

andrà a sostituire ogni occorrenza di __DEB_VERSION__ negli script debian con il numero di versione.

0

Prova questa:

VERSION=`dpkg -s $DPKG_MAINTSCRIPT_PACKAGE | sed -n 's/^Version: //p'` 
Problemi correlati