Bagaimana cara menjalankan skrip hanya saat instalasi pertama dari suatu paket dan selama peningkatan?

14

Baru-baru ini saya mulai mengemas beberapa perangkat lunak saya dan menerbitkannya di Launchpad. Instalasi dan penghapusan berfungsi dengan baik, tetapi memutakhirkan paket dari satu versi ke versi berikutnya bermasalah.

Masalahnya adalah bahwa ada beberapa skrip yang hanya perlu dijalankan saat instalasi pertama dari paket. Script-script ini mengisi DB, membuat pengguna, dll. Mereka saat ini dipanggil di bagian package.postinst configure). Namun ini menghasilkan mereka dipanggil saat upgrade serta ditunjukkan dalam diagram .

Apakah ada cara untuk memasukkan skrip pengelola ke dalam paket .deb yang hanya dijalankan saat instalasi pertama dari paket dan tidak selama pembaruan? Atau apa yang akan menjadi cara yang elegan untuk memasukkan beberapa skrip pengaturan awal dalam paket .deb?

Jeroen
sumber

Jawaban:

15

Dengan debian/preinstfile, Anda dapat melakukan tindakan saat menginstal tetapi tidak memutakhirkan.

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

Meskipun seperti namanya, ini dijalankan sebelum paket Anda diinstal. Jadi, Anda mungkin tidak dapat melakukan apa yang Anda butuhkan di sini. Sebagian besar paket hanya menguji pada tahap konfigurasi postinstjika pengguna telah dibuat. Ini diacolord

$ 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
andrewsomething
sumber
28

Lihat diagram ini dari wiki Debian tentang bagaimana skrip pengelola disebut: Diagram alur skrip pengelola Debian

Jika Anda mengikuti sisi kiri (jalur "semuanya berjalan ok") Anda akan melihat bahwa postinstskrip dipanggil dengan versi yang paling baru dikonfigurasi. Ini memberi Anda kesempatan untuk membedakan antara peningkatan dan pemasangan baru - dalam kasus peningkatan, postinst Anda akan dipanggil seperti

postinst configure 1.23-0ubuntu1

di mana 1.23-0ubuntu1versi yang sebelumnya diinstal dari paket Anda, sedangkan untuk instalasi baru akan disebut seperti

postinst configure

Ini juga memungkinkan Anda untuk menangani kasus ketika Anda perlu melakukan tindakan saat memutakhirkan dari versi tertentu - Anda dapat memeriksa postinstversi itu.

Ini memudahkan untuk memeriksa apakah skrip dilakukan pada 'instal' atau 'upgrade'. Jika $ 2 adalah nol, maka itu adalah instalasi. begitu:

if [ -z "$2" ]; then
  do install stuff
else
  do upgrade stuff
fi
RAOF
sumber
1
Perhatikan bahwa parameter tambahan juga diteruskan jika Anda telah menghapus paket (tetapi tidak membersihkannya) dan menginstalnya lagi.
skyking
3

Anda mungkin dapat menggunakan skrip debian / preinst dalam kombinasi dengan postinst.

Di skrip awal, periksa file yang pasti diinstal pkg Anda. Jika ada, jangan lakukan apa pun (karena paket Anda sebelumnya diinstal), jika tidak, lakukan langkah-langkah pengaturan Anda.

Jika langkah-langkah setup Anda mengharuskan pkg Anda diinstal (dalam hal ini di atas tidak akan berfungsi karena preinst berjalan sebelum instalasi), maka skrip preinst Anda dapat menulis file, misalnya: / tmp / setupmypkg. Skrip postinst Anda dapat dengan mudah menguji apakah file itu ada dan jika demikian lakukan dua hal:

  • langkah pengaturan awal Anda
  • hapus file / tmp / setupmypkg
kyleN
sumber
1
Ya ini akan berhasil dan saya sedang melakukan hal yang serupa. Tapi itu masih terlihat agak berantakan ... Saya berharap cara yang lebih asli untuk melakukannya. Sepertinya itu bukan permintaan yang eksotik, bukan?
Jeroen
1

Saya menemukan bahwa pengujian untuk $ 2 dalam skrip "postinst configure" Anda tidak berfungsi dengan baik jika Anda telah menginstal paket Anda sebelumnya, lalu mencopotnya (tetapi tanpa membersihkan), kemudian coba instal ulang lagi. Dalam hal ini, skrip postinst masih mendapatkan argumen versi untuk langkah "postinst configure".

Namun jika Anda telah menginstal paket sebelumnya, kemudian hapus DAN bersihkan, lalu instal kembali, skrip "konfigurasi postinst" TIDAK akan mendapatkan argumen versi dalam $ 2

robvdl
sumber
0

Saya rasa tidak, tetapi Anda dapat dengan mudah memodifikasi skrip preinst / postinst untuk memeriksa apakah paket sedang diinstal untuk pertama kalinya dan mengambil tindakan standar.

Mungkin seperti ini,

di awal

if not is_package_istalled():
    export MY_PACKAGE_FIRST_INSTALL

di postinst,

if MY_PACKAGE_FIRST_INSTALL:
    Do First Install Setup 

Edit

Hmm, mungkin Anda bisa langsung memeriksa semua ini di postinst karena saya pikir dpkg tidak akan mengatur status paket sebagai diinstal sebelum menjalankan postinst tapi saya tidak yakin. Jadi di atas bisa datang,

di postinst,

if not is_package_istalled():
    Do First Install Setup 

Di mana, is_package_installed dapat Anda fungsikan untuk mendeteksi status instalasi. Mungkin seperti 'dpkg --status packagename'

ATAU

Mengapa tidak sekadar memeriksa apakah perubahan yang ingin Anda lakukan sudah ada dan hanya melanjutkan jika tidak.

Owais Lone
sumber
Saya tidak mengerti. Dari mana IS_INSTALLED berasal?
Jeroen
Tidak ada IS_INSTALLED, itu hanya kode semu. Contoh saja. IS_INSTALLED dapat berupa output dari perintah seperti 'dpkg --status package_name' Apa yang saya maksud adalah Anda dapat memeriksa apakah paket diinstal di awal, mengatur keadaan var dan kemudian berdasarkan keadaan ini var mengambil tindakan di postinst.
Owais Lone