dpkg-maintscript-helper(1) obchodzi znane ograniczenia dpkg w skryptach

SKŁADNIA

dpkg-maintscript-helper polecenie [parametr...] -- parametr-skryptu-opiekuna...

POLECENIA I PARAMETRY

rm_conffile plik-konf [uprzednia-wersja [pakiet]]

mv_conffile stary-plik-konf nowy-plik-konf [uprzednia-wersja [pakiet]]

OPIS

Program jest przeznaczony do wykonywania wewnątrz skryptów opiekuna, aby wykonać pewne zadania, których dpkg nie potrafi (jeszcze) obsłużyć w sposób natywny albo ze względu na decyzje projektowe, albo z powodu obecnych ograniczeń.

Wiele z tych zadań wymaga skoordynowanych działań z kilku skryptów opiekuna (preinst, postinst, prerm, postrm). Aby uniknąć pomyłek, to samo wywołanie musi być umieszczone we wszystkich skryptach, a program automatycznie adaptuje swe zachowanie w oparciu o zmienną środowiskową DPKG_MAINTSCRIPT_NAME i argumenty skryptów opiekuna jakie przekazano mu po podwójnym myślniku.

ZADANIA ZWIĄZANE Z PLIKAMI CONFILE

Podczas aktualizacji pakietu, dpkg nie usuwa automatycznie plików conffile (pliku konfiguracyjnego, dla którego dpkg powinien zachowywać zmiany dokonane przez użytkownika. Wynika to z dwóch głównych powodów, po pierwsze conffile mógł być usunięty przez przypadek, a gdy następna wersja przywróci go, użytkownicy nie chcą usunięcia swoich zmian. Drugim jest umożliwienie pakietom na przejście z plików conffile zarządzanych przez dpkg na pliki zarządzane przez skrypty opiekuna pakietu, zwykle za pomocą narzędzia takiego jak debconf lub ucf.

Oznacza to, że gdy pakiet ma zamiar zmienić nazwę lub usunąć conffile, musi wykonać to jawnie, a dpkg-maintscript-helper może zostać wykorzystany do płynnego usunięcia i przeniesienia plików conffile w skryptach opiekuna.

USUWANIE PLIKU CONFFILE

Jeśli plik conffile jest całkowicie usuwany, powinien być usunięty z dysku, chyba że użytkownik go zmodyfikował. Jeśli istnieją lokalne modyfikacje, powinny pozostać zachowane. Jeśli aktualizacja pakietu zostanie przerwana, nowo zdezaktualizowany plik conffile nie powinien zniknąć.

Wszystko to jest zaimplementowane za pomocą następującego fragmentu skryptu w skryptach opiekuna: preinst, postinst i postrm:


    dpkg-maintscript-helper rm_conffile \
        conffile uprzednia-wersja pakiet -- "[email protected]"

conffile jest nazwą pliku conffile do usunięcia.

uprzednia-wersja definiuje ostatnią wersją pakietu, której aktualizacja powinna wyzwolić usunięcie. Ważne jest, aby obliczyć uprzednią-wersję poprawnie, dzięki czemu pliki conffile są poprawnie usunięte nawet, gdy użytkownik przebuduje pakiet z lokalną wersją, np. dla pliku conffile usuniętego w wersji 2.0-1 pakietu, uprzednia-wersja powinna być ustawiona na 2.0-1~. Spowoduje to, że conffile zostanie usunięty nawet, jeśli użytkownik przebuduje poprzednią wersję 1.0-1 jako 1.0-1local1.

Jeśli conffile nie jest już dostarczany dla kilku wersji i modyfikuje się właśnie skrypty opiekuna w celu wyczyszczenia przestarzałego pliku, uprzednia-wersja powinna być oparta na wersji pakietu, która jest obecnie przygotowywana, a nie na pierwszej wersji pakietu nieposiadającej conffile.

pakiet jest nazwą pakietu. Jeśli jest pusta lub opuszczona, używana jest zmienna środowiskowa DPKG_MAINTSCRIPT_PACKAGE (jak ustawiana przez dpkg).

Wszystkie parametry skryptów opiekuna podane za "--" są przekazywane do programu.

Obecna implementacja: w preinst sprawdzane jest, czy conffile został zmodyfikowany i zmienia się jego nazwę na conffile.dpkg-remove (jeśli nie został zmodyfikowany) lub na conffile.dpkg-backup (jeśli został). W postinst, drugiemu plikowi zmienia się nazwę na conffile.dpkg-bak i zachowuje się go do porównania, jako że zawiera on modyfikacje użytkownika, natomiast pierwszego - usuwa się. Jeśli aktualizacja pakietu zostanie przerwana, postrm instaluje ponownie oryginalny conffile. Podczas czyszczenia postrm usuwa również zachowywany dotąd plik .dpkg-bak.

ZMIANA NAZWY PLIKU CONFFILE

Jeśli conffile jest przenoszony z jednego położenia do innego, konieczne jest upewnienie się, że przenoszone są wszystkie zmiany dokonane przez użytkownika. Może to początkowo wyglądać na prostą zmianę w skrypcie preinst, lecz spowoduje to zapytanie użytkownika przez dpkg, dotyczące zaakceptowania edycji conffile, nawet jeśli użytkownik nie jest za nią odpowiedzialny.

Zgrabniejsza zmiana nazwy może być zaimplementowana za pomocą następującego fragmentu skryptu w skryptach opiekuna: preinst, postinst i postrm:


    dpkg-maintscript-helper mv_conffile \
        stary-conffile nowy-conffile uprzednia-wersja pakiet -- "[email protected]"

Stary-conffile i nowy-conffile to stara i nowa nazwa pliku conffile.

Uprzednia-wersja definiuje ostatnią wersję pakietu, którego aktualizacja powinna wyzwolić zmianę nazwy pliku conffile (patrz uwagi do rm_conffile powyżej, nt. poprawnej wartości). Jeśli uprzednia-wersja jest pusta lub pominięta, próba tej operacji jest przeprowadzana przy każdym uaktualnieniu (uwaga: bezpieczniej jest podać wersję i spróbować przeprowadzić tę operację jedynie jednokrotnie).

pakiet jest nazwą pakietu. Jeśli jest pusta lub opuszczona, używana jest zmienna środowiskowa DPKG_MAINTSCRIPT_PACKAGE (jak ustawiana przez dpkg).

Wszystkie parametry skryptów opiekuna podane za "--" są przekazywane do programu.

Obecna implementacja: preinst sprawdza, czy conffile został zmodyfikowany - jeśli tak, to pozostawia go, w przeciwnym wypadku nazwa jest zmieniana na stary-conffile.dpkg-remove. Przy konfiguracji, postinst usuwa stary-conffile.dpkg-remove i zmienia stary-conffile na nowy-conffile, jeśli stary-conffile jest wciąż obecny. Przy przerwanej aktualizacji lub instalacji postrm zmienia stary-conffile.dpkg-remove z powrotem na stary-conffile, jeśli to konieczne.

INTEGRACJA W PAKIETACH

Zakładając, że dpkg-maintscript-helper jest używane w preinst, używanie go bezwarunkowo wymaga zależności wstępnej, upewniającej się, że wymagana wersja dpkg została wcześniej rozpakowana. Wymagana wersja zależy od użytego polecenia, do rm_conffile i mv_conffile jest to 1.15.7.2:


    Pre-Depends: dpkg (>= 1.15.7.2)

W wielu przypadkach operacja wykonywana przez program nie jest krytyczna dla pakietu i wówczas zamiast używać zależności wstępnej można wywołać program jedynie, jeśli wiemy że żądane polecenie jest obsługiwane przez aktualnie zainstalowany dpkg:


    if dpkg-maintscript-helper supports command; then
        dpkg-maintscript-helper command ...
    fi

TŁUMACZE

Piotr Roszatycki <[email protected]>, 1999
Bartosz Feński <[email protected]>, 2004-2005
Robert Luberda <[email protected]>, 2006-2008
Wiktor Wandachowicz <[email protected]>, 2008
Michał Kułach <[email protected]>, 2012