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.
|