4.2.10 Создание пользовательских запросов

Опция --qf (не путать с сочетанием первичных ключей -qf) или --queryformat в длинном варианте позволяет создавать запросы собственных конструкций любой сложности, хотя этот путь сравнительно более сложен, чем использование атомарных опций. Для создания запроса опции --qf необходимо передать форматную строку, синтаксис которой сходен с C-функцией printf. Базовый синтаксис формата запроса:

%{tag_name}

Можно комбинировать имена полей (тегов) для вывода более чем одного значения поля для указанного пакета. Также можно добавлять опции форматирования в соответствии с соглашениями C.

Например, для вывода имен всех пакетов используется команда, подобная указанной ниже:

# rpm -qa --qf "%{NAME}"
redhat-menusglibccracklibgdbmgmplibacllibjpeglincpcreshadow-
utilslibtermcapfreetypeinfofileutilspsmiscntpmountcracklib-dictskrb5-libscyrus-saslusermodeXftlibpnglibxmllibbonobopythonpygtk2pyxf86configredhat-config-usersredhat-config-keyboardrpm404-pythongnome-vfs2libgnomeuiashbind-utilscyrus-
sasl-plaindos2unixethtoolfingergroffautofskbdconfiglesslibtool-
libslockdevmailcapMAKEDEVmouseconfignetpbmntsysvORBitpartedppppsutilsrdaterhnlibrp
mrshsetuptoolstatserialtarlilopciutilstimeconfigunzipkernel-pcmcia-
csanacronXFree86

В этой команде использовался наиболее простой формат и запрашивались только имена пакетов. Для форматирования вывода необходимо добавить символ новой строки после каждого имени в конце форматной строки:

# rpm -qa --qf "%{NAME}\n"

redhat-menus

glibc

cracklib

gdbm

gmp

libacl

libjpeg

linc

pcre

shadow-utils

libtermcap

freetype

info

fileutils

psmisc

ntp

mount

cracklib-dicts

krb5-libs

cyrus-sasl

usermode

Xft

Для экономии места почти весь вывод опущен. Данная команда выводит то же, что и команда rpm -qa, поэтому взята лишь для примера, как конструируются пользовательские запросы.

В примере ниже показывается, как для каждого запрашиваемого пакета вывести имя и платформу (показано только несколько строк вывода, на каждое поле выделяется 20 символов):

# rpm -qa --qf "%-20{NAME} %-20{PLATFORM}\n"

redhat-menus noarch-redhat-linux-gnu

glibc i686-redhat-linux-gnu

cracklib i386-redhat-linux

gdbm i386-redhat-linux-gnu

gmp i386-redhat-linux-gnu

libacl i386-redhat-linux-gnu

libjpeg i386-redhat-linux

linc i386-redhat-linux-gnu

pcre i386-redhat-linux

shadow-utils i386-redhat-linux-gnu

libtermcap i386-redhat-linux

freetype i386-redhat-linux-gnu

info i386-redhat-linux-gnu

fileutils i386-redhat-linux-gnu

psmisc i386-redhat-linux

ntp i386-redhat-linux-gnu

mount i386-redhat-linux-gnu

cracklib-dicts i386-redhat-linux

krb5-libs i386-redhat-linux-gnu

cyrus-sasl i386-redhat-linux-gnu

usermode i386-redhat-linux-gnu

Xft i386-redhat-linux-gnu

4.2.10.1 Работа с полями формата запроса
Для построения запроса с помощью опции --queryformat необходимо знать, какие имена полей нам доступны в принципе. Для вывода списка имен доступных тегов используется опция --querytags. В примере ниже показано только несколько строк вывода:

# rpm --querytags

NAME

VERSION

RELEASE

SUMMARY

DESCRIPTION

BUILDTIME

Каждый из этих тегов имеет также вариант с префиксом, например, RPMTAG_NAME. Вы можете использовать имена полей как с префиксом, так и без оного.

$ rpm -q --qf "%{RPMTAG_NAME}\n" sendmail

sendmail

Эта команда использует опцию -q для запроса одного пакета вместо -qa (для запроса всех пакетов).

4.2.10.2 Запрос информации о пакете
Множество тегов отвечают за информацию о пакете, которая хранится в хэдере пакета. Таблица ниже содержит список таких полей.

Поле

Содержит

NAME

Имя пакета

VERSION

Номер версии

RELEASE

Номер релиза

SUMMARY

Однострочный коментарий содержимого пакета

DESCRIPTION

Текст описания пакета (многострочный)

BUILDTIME

Время создания пакета

BUILDHOST

Хост, на котором собран пакет

SIZE

Размер всех обычных файлов в нагрузке

LICENSE

Лицензия, под которой выпущен пакет

GROUP

Группа или категория пакета

OS

Операционная система, под которой пакет собирался

ARCH

Процессорная архитектура, например i386

SOURCERPM

Пакет с исходным кодом из которого собирался бинарный пакет

CHANGELOGTIME

Массив времен изменений журнала

CHANGELOGNAME

Массив имен записей журнала

CHANGELOGTEXT

Массив содержимого записей журнала

PREIN

Скрипт перед установкой

POSTIN

Скрипт после установки

PREUN

Скрипт перед удалением

POSTUN

Скрипт после удаления

PLATFORM

Платформа

Все поля, за исключением CHANGELOGTIME, CHANGELOGTEXT и CHANGELOGNAME, это поля, имеющие одно значение. Запросы многозначных полей осуществляются с помощью форматирования массивов.

4.2.10.3 Форматирование массивов
Некоторые записи хэдера представляют собой массивы, то есть содержат более чем одно значение. Для задания запроса каждой записи в массиве используются квадратные скобки. Например:

$ rpm -q --queryformat "[%-50{FILENAMES} %{FILESIZES}\n]" sendmail
/etc/aliases 1295

/etc/aliases.db 12288

/etc/mail 4096

/etc/mail/Makefile 748

/etc/mail/access 331

/etc/mail/access.db 12288

/etc/mail/domaintable 0

/etc/mail/domaintable.db 12288

/etc/mail/helpfile 5588

/etc/mail/local-host-names 64

Этот пример выводит файлы и размеры файлов пакета sendmail (вывод сокращен для экономии места).

Если в одном запросе необходимо запросить как массивы, так и поля с единственным значением, используется знак равенства в начале тега для указания того, что данный тег должен быть повторен для каждой записи массива. Например:

$ rpm -q --queryformat "[%-15{=NAME} %-50{FILENAMES}\n]" sendmail jikes

sendmail /usr/lib/sendmail

sendmail /usr/sbin/mailstats

sendmail /usr/sbin/makemap

sendmail /usr/sbin/praliases

sendmail /usr/sbin/sendmail.sendmail

sendmail /usr/sbin/smrsh

sendmail /usr/share/man/man1/mailq.sendmail.1.gz

sendmail /usr/share/man/man1/newaliases.sendmail.1.gz

sendmail /usr/share/man/man5/aliases.sendmail.5.gz

sendmail /usr/share/man/man8/mailstats.8.gz

sendmail /usr/share/man/man8/makemap.8.gz

sendmail /usr/share/man/man8/praliases.8.gz

sendmail /usr/share/man/man8/rmail.8.gz

sendmail /usr/share/man/man8/sendmail.8.gz

sendmail /usr/share/man/man8/smrsh.8.gz

sendmail /var/spool/clientmqueue

sendmail /var/spool/mqueue

jikes /usr/bin/jikes

jikes /usr/doc/jikes-1.18/license.htm

jikes /usr/man/man1/jikes.1.gz

В этом примере за именем пакета следуют имена файлов пакета.

4.2.10.4 Специальные форматы
Некоторые поля содержат специальную информацию в бинарном виде, которую не имеет смысла выводить в том виде, в каком она есть. Для обработки подобных случаев используется такой синтаксис:

%{tag:special_format}

Например, для вывода INSTALLTIME применяется %{INSTALLTIME:date}, спецификация для вывода значения времени в формате date. Например:

$ rpm -q --qf "%{NAME}-%{VERSION}-%{RELEASE} %{INSTALLTIME:date}\n" jikes

jikes-1.18-1 Fri 06 Dec 2002 09:19:30 PM CST

Этот пример выводит Имя-Версию-Релиз вместе с датой установки.

Большая часть тегов в хэдере является опциональной. Можно выводить их значения, но если тег не задан, команда не выведет ничего. Для обработки этого случая можно использовать условный оператор, базирующийся на синтаксисе C:

%|tag?{print_if_present}:{print_if_absent}|

Если использовать обычный синтаксис %{tag}, этот условный синтаксис будет очень быстро усложняться. Следует разделять элементы. Например:

$ rpm -q --qf "%{NAME} %|EPOCH?{%{EPOCH}}:{(no Epoch)}|\n" perl
perl 1

Если пакет имеет не пустое поле EPOCH, мы увидим вывод как в примере. Большая часть пакетов не имеет этого поля. В случае, когда EPOCH не определено, мы увидим пустой вывод perl (no Epoch).

4.2.10.5 Запрос зависимостей пакета
Ряд тегов отвечает за информацию о зависимостях пакета. Каждый из этих тегов существует в рамках триплетов, которые форматируются сходным образом. Например, для возможностей, которые требует пакет, имеются поля REQUIRENAME, REQUIREVERSION и REQUIREFLAGS.
REQUIRENAME хранит имя требуемой возможности, REQUIREVERSION - массив подходящих версий, REQUIREFLAGS соединяет значения двух предыдущих полей на основании битовых флагов, которые задают статус зависимости в терминах "имеющаяся версия больше нужной", "имеющаяся версия равна нужной", "имеющаяся версия меньше нужной".

В таблице ниже перечислены теги зависимостей.

Поле

Содержит

CONFLICTFLAGS

Массив флагов для возможностей, с которыми пакет конфликтует

CONFLICTNAME

Массив имен возможностей, с которыми пакет конфликтует

CONFLICTVERSION

Массив номеров версий возможностей, с которыми пакет конфликтует

REQUIREFLAGS

Массив флагов возможностей, в которых пакет нуждается

REQUIRENAME

Массив имен возможностей, в которых пакет нуждается

REQUIREVERSION

Массив номеров версий возможностей, в котрых пакет нуждается

OBSOLETENAME

Массив имен возможностей, которые пакет делает неактуальными

OBSOLETEFLAGS

Массив флагов возможностей, которые пакет делает неактуальными

OBSOLETEVERSION

Массив номеров версий возможностей, которые пакет делает неактуальными

PROVIDENAME

Массив имен возможностей, которые пакет предоставляет

PROVIDEFLAGS

Массив флагов возможностей, которые пакет предоставляет

PROVIDEVERSION

Массив номеров версий возможностей, которые пакет предоставляет

Каждый из этих тегов - массив. Специальная опция форматирования флагов depflags представляет бинарные флаги в удобочитаемом формате. Например, следующая команда выводит зависимости пакета:

$ rpm -q --qf \
"[%{REQUIRENAME} %{REQUIREFLAGS:depflags} %{REQUIREVERSION}\n]" sendmail

rpmlib(VersionedDependencies) <= 3.0.3-1

chkconfig >= 1.3

/usr/sbin/useradd

/bin/mktemp

fileutils

gawk

sed

sh-utils

procmail

bash >= 2.0

/bin/sh

rpmlib(PayloadFilesHavePrefix) <= 4.0-1

rpmlib(CompressedFileNames) <= 3.0.4-1

Для тех зависимостей, которые имеют конкретную версию, эта команда выведет номер версии, предшествуемый оператором сравнения. Обратите внимание, что многие зависимости не имеют специфических требований по версии.

Кроме обычных зависимостей пакеты также могут зависеть от специфической версии RPM, поскольку зависят от какой-либо специфической возможности, например, rpmlib, предоставляющей CompressedFileNames.

4.2.10.6 Запрос информации о файлах
Поля данных о файлах содержат информацию, касающуюся файлов нагрузки, то есть тех файлов, которые будут установлены в систему. Это массивы, содержащие по одному значению на файл.

Поле

Содержит

OLDFILENAMES

Массив полных имен файлов, использовавшихся в старых версиях пакета

FILESIZES

Массив размеров файлов

FILEMODES

Массив прав доступа на каждый файл

FILERDEVS

Массив значений rdev на каждый файл

FILEMTIMES

Массив времени последнего изменения каждого файла

FILEMD5S

Даджест MD5 для каждого файла

FILELINKTOS

Массив информации о ссылках для каждого файла

FILEFLAGS

Массив флагов для каждого файла

FILEUSERNAME

Массив имен владельцев каждого файла

FILEGROUPNAME

Массив имен групп владельцев каждого файла

FILEDEVICES

Массив устройств каждого файла

FILEINODES

Массив индексных дескрипторов каждого файла

FILELANGS

Массив флагов языка каждого файла

DIRINDEXES

Массив индексов каталогов каждого файла (ассоциируют DIRNAMES и BASENBAMES)

BASENAMES

Массив базовых имен

DIRNAMES

Массив каталогов, которые ассоциируются с BASENAMES

OLDFILENAMES, в том случае, если REQUIRENAME не указывает на rpmlib(CompressedFileNames), используется, если имеют место несжатые файлы.
FILESIZES задает размер всех файлов в нагрузке, в то время как FILEMODES специфицирует права доступа. FILEMTIMES хранит время последней модификации каждого файла.
BASENAMES хранит массив базовых имен файлов в нагрузке, а DIRNAMES - имена каталогов для этих файлов. DIRINDEXES содержит индексы для каталогов из DIRNAMES.
Каждый rpm-пакет должен иметь или OLDFILENAMES или триплет BASENAMES, DIRNAMES, DIRINDEXES, но не то и другое вместе.

4.2.10.7 Прочие теги для форматирования запроса
Кроме вышеперечисленных, существует еще ряд полей различного назначения, большая часть которых показана в таблице ниже.

Поле

Содержит

ARCHIVESIZE

Размер несжатой секции нагрузки

COOKIE

Скрытая строка специального назначения

RPMVERSION

Версия RPM, с помощью которой пакет был собран

OPTFLAGS

Флаги оптимизации компилятора при сборке пакета

PAYLOADFORMAT

Must be cpio for LSB-compliant packages

PAYLOADCOMPRESSOR

Для совместимости с LSB всегда имеет значение gzip

PAYLOADFLAGS

Для совметсимости с LSB должно иметь значение 9

RHNPLATFORM

Скрытая строка специального назначения

FILEVERIFYFLAGS

Битовая маска, указывающая, какие тесты должны проводится для проверки файлов после установки

С помощью этих тегов можно, например, запросить, с помощью каких версий RPM создавались пакеты:

$ rpm -qp --qf "%{name} - rpm %{rpmversion}\n" *.rpm

acroread - rpm 2.5.5

canvas - rpm 3.0.3

jikes - rpm 4.0.2

SDL - rpm 2.5.1

ted - rpm 2.5.5

-p указывает на файлы rpm-пакетов в текущем каталоге, а не на установленные пакеты.

Далее - Прочие запросы
Назад - Комбинирование запросов
Содержание