Bir komut dosyasını yalnızca bir paketin ilk yüklemesi sırasında ve yükseltmeler sırasında nasıl çalıştırırım?


14

Kısa süre önce bazı yazılımlarımı paketlemeye ve Launchpad'de yayınlamaya başladım. Yükleme ve kaldırma iyi çalışıyor, ancak paketin bir sürümden bir sonraki sürüme yükseltilmesi sorunlu.

Sorun, yalnızca paketin ilk yüklemesi sırasında çalıştırılması gereken bazı komut dosyaları olmasıdır. Bu komut dosyaları DB'yi doldurur, bir kullanıcı oluşturur, vb. Şu anda package.postinst configure)bölümünde çağrılırlar . Ancak bu, bir yükseltme sırasında çağrılmaları ve şemada gösterilmeleri ile sonuçlanır .

Yükseltme sırasında değil, yalnızca paketin ilk yüklemesi sırasında çalışan bir .deb paketine bir sürdürücü komut dosyası eklemenin bir yolu var mı? Ya da .deb paketine bazı başlangıç ​​kurulum komut dosyalarını dahil etmenin zarif bir yolu ne olabilir?

Yanıtlar:


15

Bir debian/preinstdosya ile yükleme sırasında eylemler gerçekleştirebilir ancak yükseltme yapamazsınız.

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

Adından da anlaşılacağı gibi, bu paket yüklenmeden önce çalıştırılır. Yani burada ihtiyacınız olanı yapamayabilirsiniz. Çoğu paket postinst, kullanıcının zaten oluşturulmuş olup olmadığını yapılandırma aşamasında test eder . İştecolord

$ 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

Debian wiki'deki sürdürücü komut dosyalarının nasıl çağrıldığına ilişkin bu şemaya göz atın : Debian sürdürücü komut dosyası akış şeması

Sol tarafı takip ederseniz ("her şey yolunda gider" yolu), postinstkomut dosyasının en son yapılandırılmış sürümle çağrıldığını görürsünüz . Bu, bir yükseltme ve yeni bir yükleme arasında ayrım yapma şansı verir - yükseltme durumunda, postinst'iniz şöyle adlandırılır

postinst configure 1.23-0ubuntu1

nerede 1.23-0ubuntu1Paketinizin önceden yüklenmiş sürümü taze için böyle çağrılacak yüklemek oysa olduğunu

postinst configure

Bu ayrıca belirli bir sürümden yükseltme yaparken bir eylem gerçekleştirmeniz gerektiğinde davanın üstesinden gelmenizi sağlar - postinstbu sürümü kontrol edebilirsiniz .

Bu, komut dosyasının bir 'yükleme' veya 'yükseltme' üzerinde yapılıp yapılmadığını kontrol etmeyi kolaylaştırır. $ 2 null ise, o zaman bir yükleme. yani:

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

1
Paketi kaldırmanız (ancak temizlememeniz) ve yeniden kurmanız durumunda ekstra parametrenin de geçtiğini unutmayın.
1919'da 18

3

Bir debian / preinst betiğini postinst ile birlikte kullanabilirsiniz.

Preinst betiğinde, pkg'nizin kesinlikle yüklediği bir dosyayı kontrol edin. Varsa, hiçbir şey yapmayın (paketiniz daha önce yüklenmiş olduğundan), aksi takdirde kurulum adımlarınızı yapın.

Kurulum adımlarınızda pkg'nızın yüklenmesi gerekiyorsa (bu durumda, yükleme öncesi yükleme öncesi çalıştığı için yukarıdakiler çalışmaz), preinst komut dosyanız bir dosya yazabilir, örneğin: / tmp / setupmypkg. Postinst betiğiniz bu dosyanın mevcut olup olmadığını test edebilir ve eğer öyleyse iki şey yapabilir:

  • ilk kurulum adımlarınız
  • / tmp / setupmypkg dosyasını sil

1
Evet bu işe yarar ve şu anda benzer bir şey yapıyorum. Ama yine de biraz acayip görünüyor ... Bunu yapmanın daha doğal bir yolunu umuyordum. Böyle egzotik bir istek gibi görünmüyor değil mi?
Jeroen

1

Paketinizi daha önce bir kez kurduysanız, daha sonra kaldırdıktan sonra (ancak temizlemeden) 2 $ 'lık testin düzgün çalışmadığını gördüm, sonra tekrar yüklemeyi deneyin. Bu durumda, postinst betiği hala "postinst configure" adımı için bir sürüm argümanı alır.

Ancak paketi daha önce yüklediyseniz, kaldırın ve temizleyin, ardından yeniden yükleyin, "postinst configure" betiği 2 $ 'lık bir sürüm argümanı ALMAZ


0

Ben öyle düşünmüyorum ama paketin ilk kez yüklenip yüklenmediğini kontrol etmek ve standart işlem yapmak için kolayca preinst / postinst komut dosyalarını değiştirebilirsiniz.

Böyle bir şey olabilir,

önceden.

if not is_package_istalled():
    export MY_PACKAGE_FIRST_INSTALL

postinst'te,

if MY_PACKAGE_FIRST_INSTALL:
    Do First Install Setup 

Düzenle

Hmm, sadece postinst'te tüm bunları doğrudan kontrol edebilirsiniz, çünkü dpkg postinst'i çalıştırmadan önce paketin durumunu yüklü olarak ayarlamayacağını düşünüyorum ama emin değilim. Yukarıdakiler gelebilir,

postinst'te,

if not is_package_istalled():
    Do First Install Setup 

Burada, is_package_installed, kurulum durumunu saptama işleviniz olabilir. 'Dpkg - durum paket adı' gibi bir şey olabilir

VEYA

Neden sadece yapmak istediğiniz değişikliklerin zaten orada olup olmadığını kontrol etmiyor ve sadece yapmıyorsanız devam ediyor.


Anlamıyorum. IS_INSTALLED nereden geliyor?
Jeroen

IS_INSTALLED yok, sadece sözde kod. Sadece bir örnek. IS_INSTALLED, 'dpkg --status package_name' gibi bir komutun çıktısı olabilir. Demek istediğim, paketin preinst'e yüklenip yüklenmediğini kontrol edebilir, bir durum var'ı ayarlayabilir ve daha sonra bu duruma bağlı olarak postinst'te harekete geçebilirsiniz.
Owais Lone
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.