- předchozí článek - následující článek - obsah - úvodní stránka - - předchozí část - následující část - první část -

Linuxové noviny 08-09/98

Tvorba RPM balíků - pokračujeme

Jan Kasprzak, 25. srpna 1998

V minulých číslech Linuxových novin jsme si ukázali základní sekce spec-souboru. Nyní budeme pokračovat popisem skriptů, které ve spec-souborech mohou být.

Instalační skripty

Jak již bylo několikrát řečeno, RPM balík může obsahovat skripty, které se spustí před instalací balíku, po instalaci, případně před nebo po odinstalování balíku. Všechny tyto skripty dostanou od RPM proměnnou prostředí RPM_INSTALL_PREFIX udávající, do kterého adresáře se balík instaluje. Tato proměnná se použije pouze u balíků, které nemusí být instalovány v pevné adresářové struktuře (mohou bez problémů být například v /usr/local nebo v /opt. Příslušné skripty jsou ve spec-souboru uvozeny jedním z následujících slov podle toho, o který typ jde:

%pre
%preun
%post
%postun

Samozřejmě ne všechny čtyři skripty je nutno uvést. Tyto skripty jsou jen jako výpomoc pro případy, kdy nestačí pouze nainstalovat soubory daného balíku, ale je ještě potřeba udělat něco dalšího (například přidat resp. odebrat záznam z /etc/shells, jde-li o balík shellu).

Pokud upgradujeme daný balík, jsou spuštěny nejprve pre- a post-instalační skripty z nové verze, a potom teprve pre- a post-uninstall skripty ze starší verze, jak lze poznat například napsáním malého RPM balíku s testovacími výpisy v těchto skriptech:

# rpm -U a-2-2.noarch.rpm
Here is a pre v2 script 2.
Here is a post v2 script 2.
Here is a preun v1 script 1.
Here is a postun v1 script 1.

Jak rozpoznat instalaci od upgrade?

Často ve zmiňovaných skriptech chceme vykonat nějakou akci pouze v případě, kdy jde o první instalaci daného balíku (tedy nikoliv při upgradu). Příkladem může být přidání (pseudo)uživatele, kterého náš balík potřebuje ke své činnosti. V tomto konkrétním případě je sice možné podívat se do /etc/passwd, jestli tam už tento uživatel není, ale jsou i případy, kdy tato detekce není možná nebo je příliš náročná. Pro příklad nemusíme chodit daleko - stačí vzít post-uninstall skript, ve kterém chceme zrušit uživatele z /etc/passwd. Jak zjistit, jestli jde o skutečné rušení balíku, nebo jestli se jen post-uninstall skript volá proto, že je systém právě upgradován na novější verzi balíku?

Systém RPM pro tento případ nabízí skriptům číselný argument (dostupný ze shellu jako $1), který říká, kolik instancí daného balíku bude v systému po dokončení akce nad aktuálním balíkem. V případě instalace tedy %post a %pre skripty dostanou parametr 1, zatímco v případě upgrade je parametr 2. Obdobně skripty %postun a %preun dostanou v případě upgrade parametr 1, zatímco v případě úplného rušení balíku parametr 0. Náš testovací balík z předchozího odstavce vypisuje parametr skriptu jako poslední slovo. Pokud tento balík odinstalujeme, dostáváme následující:

# rpm -e a
Here is a preun v2 script 0.
Here is a postun v2 script 0.

Verifikační skript

Tento skript, uvozený slovem %verifyscript je spouštěn v okamžiku kontroly daného balíku (rpm -V). Je zde možné například kontrolovat, jestli je správně konfigurace balíku, jestli je (například) náš shell uveden v /etc/shells, jsou-li vytvořeni příslušní uživatelé a podobně.

Verifikační skript, stejně jako čtyři předchozí skripty, je spouštěn programem /bin/sh. Pokud chceme mít skript v jiném programovacím jazyce, je možno použít přepínač -p interpret, například:

%pre -n /usr/bin/perl
print "Just another perl hacker.\n";

Spouště

Pod slovem v nadpisu se skrývá překlad anglického triggers. Z databází známe spouště jako procedury, které se spustí v okamžiku modifikace některé určité databázové položky. V RPM je tato vlastnost horkou novinkou (a není ani popsána v Maximum RPM). Podrobné informace se lze dočíst na adrese http://www.rpm.org/support/RPM-Changes-6.html.

Co jsou spouště a k čemu je lze použít? Jde o skript, který je součástí nějakého balíku, a který se spouští v případě, že systém RPM nějakým způsobem manipuluje (instaluje, upgraduje, ruší) s jiným balíkem. Ve zmiňované dokumentaci je příklad, kdy nějaký hypotetický poštovní klient má svůj symbolický link /etc/mymail/mymailer, který ukazuje na příslušný MTA (mail transport agent), nainstalovaný v systému. A jsou zde uvedeny dvě spouště - jedna pro balík sendmail http://www.sendmail.org a druhá pro vmailer http://www.porcupine.org/vmailer. A tyto skripty mají právě na starost vytváření onoho linku.

Tento příklad je dosti umělý, protože poštovní klienti umějí buďto SMTP, nebo umějí nový mail dát na vstup programu /usr/sbin/sendmail. A MTA zase obsahuje program, link nebo skript /usr/sbin/sendmail, který slouží pro odeslání pošty, a MTA umí i SMTP. Já jsem s úspěchem použil spoušť v balíku groff-latin2, kdy je potřeba modifikovat konfigurační soubor groffu. Takže mám skript, který toto udělá vždy, když je groff instalován nebo upgradován. Mechanismus spouští se vůbec dobře hodí pro balíky, které modifikují soubory, patřící jiným balíkům.

Jak se použije spoušť? Jde o shellovský (nebo i jiný) skript, uvozený jedním z následujících slov:

%trigger
%triggerin
%triggerun
%triggerpostun

Za tímto slovem jsou uvedeny přepínače (například -p interpret), následují dva mínusy (--) a pak specifikace tzv. "cílového" balíku, tedy balíku, pro který se má daná spoušť spustit. Specifikace má stejnou syntaxi jako tag Requires: v hlavičce spec-souboru. Můj balík groff-latin2 například má tuto spoušť:

%trigger -- groff

Složitější spoušť by mohla být uvozena takto:

%trigger -p /usr/bin/perl -- balík2 >= 2.1.117

Kdy se spoušť spustí?

  • %trigger

    • zdrojový balík se instaluje nebo upgraduje a cílový je již nainstalován. Spouští se po %post skriptu (nového) zdrojového balíku.
    • cílový balík se instaluje nebo upgraduje a zdrojový je již nainstalován. Spouští se po %post skriptu (nového) cílového balíku.

  • %triggerin

    • je ekvivalentní s %trigger

  • %triggerun

    • zdrojový balík se právě ruší nebo upgraduje a cílový je nainstalován. Spouští se před %preun skriptem (původního) zdrojového balíku.
    • cílový balík se ruší nebo upgraduje a zdrojový je nainstalován. Spouští se před %preun skriptem (původního) cílového balíku.

  • %triggerpostun

    • cílový balík se ruší nebo upgraduje a zdrojový je nainstalován. Spouští se po %postun skriptu (původního) cílového balíku.

V příští části si povíme o tom, jak vytvářet seznam souborů obsažených v RPM balíku a také o problematice maker. *


- předchozí část - následující část - první část - - předchozí článek - následující článek - obsah - úvodní stránka -