- předchozí článek - následující článek - obsah -

Linuxové noviny Březen 1998

Získávání informací z databáze RPM

Jan "Yenya" Kasprzak, 10. února 1998

V předchozích dílech našeho seriálu jsme viděli, že systém RPM udržuje množství informací o nainstalovaných balících i o jednotlivých souborech v nich. Tyto informace pak používá při další práci s RPM balíky - při jejich instalaci, rušení a povyšování. Systém RPM ale také umí tyto informace zpřístupnit uživateli pomocí několika druhů dotazů. A o dotazech na databázi RPM bude řeč v tomto dílu.

K čemu lze tyto dotazy použít?

Dotazování se provádí příkazem rpm -q. Uvedu zde několik příkladů situací, které řeší dotaz do RPM databáze:

  • Na vašem stroji je soubor /usr/include/pthread.h, ale nevíte, ze kterého balíku tento soubor pochází.

  • Nedávno jste si nainstaloval Secure Shell a chcete k němu najít nějakou dokumentaci.

  • Získáte software, o němž autor tvrdí, že potřebuje libc verze aspoň 5.4.30. Chcete zjistit, jaká je vlastně verze libc na vašem systému.

  • Narazili jste na síti na RPM balík a chcete zjistit, co obsahuje.

  • Právě jste upgradovali systém na libc verze 6 a chcete zjistit, které balíky na vašem systému stále ještě potřebují starší verzi libc 5.

Toto je ovšem jen několik příkladů. Nyní podrobně k jednotlivým částem dotazu. Dotaz se skládá ze dvou hlavních částí - první určuje množinu balíků, o nichž chcete informace zjistit, druhá říká, jaké informace se o těchto balících chcete dovědět.

Část první - výběr balíků

  • Dotaz můžete omezit na balík určitého jména. Takto například zjistíte aktuální verzi nainstalovaného balíku:

    $ rpm -q squid
    squid-1.NOVM.20-3
    

    $ rpm -q postgresql package postgresql is not installed

    Je vidět, že pokud specifikujeme jen část dotazu pro výběr balíků, ale nikoli část specifikující požadované informace, dostane se nám odpovědi ve formě jména balíku, jeho verze a jeho release (oddělěno pomlčkami) a nového řádku.

  • Na druhé straně můžeme vypsat všechny balíky v systému. K tomu slouží přepínač -a:

    $ rpm -qa|sort  
    ElectricFence-2.0.5-5
    MAKEDEV-2.3.1-1
    ...
    zlib-devel-1.0.4-2
    

  • Dále lze dotaz omezit na balíky, kterým patří nějaký soubor v systému pomocí přepínače -f soubor:

    $ rpm -qf /etc/printcap 
    setup-1.9-2
    

    Zde je nutno dát pozor na to, že RPM si v databázi ukládá balíky s absolutní cestou, a že tedy dotazy mohou být zodpovězeny rozdílně, přestože se jedná o tentýž soubor:

    $ rpm -qf /etc/X11/xdm/Xaccess 
    XFree86-3.3.1-14
    $ rpm -qf /usr/lib/X11/xdm/Xaccess 
    file /usr/lib/X11/xdm/Xaccess is not owned by any package
    

  • Lze se také dotazovat na RPM soubor, který nemusí být zatím nainstalovaný. Jak víme, v RPM souboru je přímo uložen jeho název, takže jej lze zjistit i po přejmenování:

    $ rpm -qp trubka 
    passwd-0.50-10
    

  • Jak již bylo řečeno na začátku tohoto seriálu, jsou RPM balíky sdružovány do tematických skupin. Chceme-li si vypsat všechny aplikace, které se týkají práce se zvukem, použijeme následující příkaz:

    $ rpm -qg Applications/Sound 
    cdp-0.33-8
    maplay-1.2-6
    sox-11g-6
    timidity-0.2i-2
    

  • Někdy potřebujeme zjistit, který balík poskytuje určitou vlastnost, kterou mohou jiné balíky vyžadovat - například chceme zjistit, který balík poskytuje libc verze 6:

    $ rpm -q --whatprovides libc.so.6 
    glibc-2.0.6-9
    

  • Duálním problémem k předchozímu je zjištění seznamu balíků, které vyžadují danou vlastnost - například v úvodu zmiňovaný dotaz na balíky, které ještě vyžadují starší verzi libc:

    $ rpm -q --whatrequires libc.so.5 
    xpdf-0.7-2
    snd-1-1
    timidity-0.2i-2
    

Část druhá - výběr informací

V předchozí části jsme viděli, že implicitně se vypisuje jméno balíku, jeho verze a release. Můžeme ale zjišťovat také množství jiných informací. Nejprve si ukážeme některé přepínače pro podrobnější výpis, a v závěru popíšeme konstrukci jakkoli obecného výpisu informací.

  • Přepínačem -i získáme výpis souhrnných informací o daném balíku. Předpokládejme například, že nám někdo dal nějaký RPM soubor, a my o něm chceme zjistit podrobnosti (viz výpis Informace o RPM balíku).


 $ rpm -qpi soubor.rpm 
 Name        : squid                     Distribution: (none)
 Version     : 1.NOVM.20                 Vendor: (none)
 Release     : 3                         Build Date: Sun Feb  1 00:50:11 1998
 Install date: Sun Feb  1 09:19:37 1998  Build Host: gloin
 Group       : Networking/Daemons        Source RPM: squid-1.NOVM.20-3.src.rpm
 Size        : 693576
 Packager    : Jan "Yenya" Kasprzak <kas@fi.muni.cz>
 URL         : http://squid.nlanr.net/
 Summary     : Squid Internet Object Cache
 Description :
 Squid is a caching proxy for www/ftp/gopher
 Please read the documentation-Files!!

Výpis 15: Informace o RPM balíku

    Výpis obsahuje množství informací. Lze z něj například zjistit, že někteří lidé dokáží v neděli v jednu hodinu v noci vyrábět RPM balíky :-). Myslím, že výše uvedený výpis nepotřebuje podrobnější komentář k jednotlivým položkám.

  • Přepínač -l - seznam souborů v balíku:

    $ rpm -ql ncftp 
    /etc/X11/wmconfig/ncftp
    /usr/bin/ncftp
    /usr/man/man1/ncftp.1
    

  • V předchozí části tohoto seriálu jsme viděli, že RPM může dělat rozdíly mezi jednotlivými soubory v balíku. Rozeznává soubory běžné, konfigurační a dokumentaci. Příslušný typ souboru můžeme zjišťovat - seznam konfiguračních souborů přes přepínač -c a seznam dokumentace pomocí -d. Například seznam dokumentace k programu /bin/bash můžeme získat takto:

    $ rpm -qdf /bin/bash 
    /usr/doc/bash-1.14.7
    /usr/doc/bash-1.14.7/NEWS
    /usr/doc/bash-1.14.7/README
    /usr/doc/bash-1.14.7/RELEASE
    /usr/info/bash.info.gz
    /usr/man/man1/bash.1
    /usr/man/man1/sh.1
    

    Jak přepínač -l, tak přepínače -c a -d mohou o souborech vypsat detailní informace pomocí klíče -v.

  • Získání stavu jednotlivých souborů. Každý soubor daného balíku může být v jednom ze čtyř stavů:

    • normal: soubor je nainstalován v systému.
    • replaced: soubor byl přepsán souborem z jiného RPM balíku použitím --replacefiles (resp. --force).
    • not installed: balík byl nainstalován, ale tento soubor ne (například při použití parametru --excludedocs).
    • net shared: soubor se nachází na svazku, který byl v /etc/rpmrc označen jako síťový. Takovýto soubor není spravován RPM databází (resp. je spravován RPM databází na síťovém serveru).
    Příslušný stav ke každému souboru lze zjistit pomocí přepínače -s.

  • Informace o tom, jaké vlastnosti daný balík poskytuje do systému. Balík například může obsahovat sdílené knihovny a podobně:

    $ rpm -q --provides db  
    libdb.so.2
    

  • Naopak můžeme zjistit informaci o tom, které vlastnosti (včetně verzí) daný balík vyžaduje ke správnému běhu:

    $ rpm -q --requires glint 
    /usr/bin/python  
    /bin/sh  
    tkinter  
    pythonlib >= 1.12
    python >= 1.4
    

  • Lze vypsat i pre/post-install a pre/post-uninstall skripty, které k balíku patří. Dosáhneme toho volbou --scripts.

Konstrukce obecných dotazů

Výše uvedené příklady popisovaly určité speciální typy dotazů. RPM ale umožňuje vypisovat odpovědi v úplně obecné formě. Nebudeme zde podávat vyčerpávající výpis, jen v krátkosti a na několika příkladech vysvětlíme logiku tohoto systému.

Základem obecného dotazu je volba --queryformat řetězec. Tento řetězec je vypsán pro každý dotazovaný balík s tím, že některé zvláštní konstrukce se nahradí příslušnými informacemi o RPM balíku. Je to trochu podobné nahrazování řetězců s procenty v knihovní funkci printf(3). RPM podporuje substituci zpětného lomítka podobně jako printf(3), takže je například možné psát následující konstrukce:

$ rpm -qa --queryformat 'Ahoj, babi!\n' 

Tento příkaz vypíše jmenovaný řetězec tolikrát, kolik je v systému nainstalovaných balíků.

Pokračujme v příkladech. Následující příkaz ukazuje implicitní formát výpisu odpovědi a jeho výstup je stejný, jako když část --queryformat neuvedeme:

$ rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}\n' squid 

Z příkladu je vidět, že RPM nahrazuje konstrukci %{atribut} obsahem daného atributu z databáze. Nebudu zde rozebírat všechny dostupné atributy, jen uvedu, že pomocí následujícího příkazu získáme seznam všech atributů platných v dané verzi RPM:

$ rpm --querytags |sort 
ARCH
ARCHIVESIZE
...
VERSION
XPM

Některé atributy jsou v databázi ukládány ve formě čísla, ale uživatel by mohl chtít toto číslo zobrazit nějak jinak. Například datum se ukládá jako počet sekund od 1. ledna 1970, ale textový výpis je čitelnější. Výpisu v jiném formátu dosáhneme například takto:

$ rpm -q --queryformat '%{INSTALLTIME:date}\n' bash 
Sat Jan 31 17:53:00 1998

Kromě formátovacího řetězce :date pro výpis času existují ještě tyto:

  • :perms - výpis přístupových práv.
  • :deflags - výpis závislostí mezi balíky.
  • :fflags - konverze čísla na c, d nebo mezeru podle toho, jestli jde o konfigurační, dokumentační nebo běžný soubor.

Dále lze jednotlivé položky zarovnávat a vypisovat na určitý počet znaků podobně jako v printf(3):

$ rpm -q --queryformat '%4{RELEASE}\n' squid 
   5

Některé položky v databázi lze vyhodnotit vícekrát pro jeden balík (například %{FILENAMES} - jména souborů v balíku). Můžeme proto chtít například jeden řádek pro každý soubor v balíku. Nebudu se pouštět do syntaktických podrobností, jen uvedu příklad:

$ rpm -q --queryformat '%{NAME} obsahuje \
soubory:\n[%{FILENAMES} (%{FILESIZES} bytes)\n]' bash 
bash obsahuje soubory:
/bin/bash (301580 bytes)
/bin/sh (4 bytes)
...
/usr/man/man1/sh.1 (6 bytes)

To je k dotazům do RPM databáze všechno. Příště se budeme věnovat kontrole integrity balíků a dalším vlastnostem. *


- předchozí článek - následující článek - obsah -