4.2.10 Создание пользовательских запросов
Индекс4.2.10 Создание пользовательских запросов
Опция --qf (не путать с сочетанием первичных ключей -qf) или --queryformat в длинном варианте позволяет создавать запросы собственных конструкций любой сложности, хотя этот путь сравнительно более сложен, чем использование атомарных опций. Для создания запроса опции --qf необходимо передать форматную строку, синтаксис которой сходен с C-функцией printf. Базовый синтаксис формата запроса:
%{tag_name} |
Можно комбинировать имена полей (тегов) для вывода более чем одного значения поля для указанного пакета. Также можно добавлять опции форматирования в соответствии с соглашениями C.
Например, для вывода имен всех пакетов используется команда, подобная указанной ниже:
# rpm -qa --qf "%{NAME}" |
В этой команде использовался наиболее простой формат и запрашивались только имена пакетов. Для форматирования вывода необходимо добавить символ новой строки после каждого имени в конце форматной строки:
# rpm -qa --qf "%{NAME}\n" |
Для экономии места почти весь вывод опущен. Данная команда выводит то же, что и команда rpm -qa, поэтому взята лишь для примера, как конструируются пользовательские запросы.
В примере ниже показывается, как для каждого запрашиваемого пакета вывести имя и платформу (показано только несколько строк вывода, на каждое поле выделяется 20 символов):
# rpm -qa --qf "%-20{NAME} %-20{PLATFORM}\n" |
4.2.10.1 Работа с полями формата запроса
Для построения запроса с помощью опции --queryformat необходимо знать, какие имена полей нам доступны в принципе. Для вывода списка имен доступных тегов используется опция --querytags. В примере ниже показано только несколько строк вывода:
# rpm --querytags |
Каждый из этих тегов имеет также вариант с префиксом, например, RPMTAG_NAME. Вы можете использовать имена полей как с префиксом, так и без оного.
$ rpm -q --qf "%{RPMTAG_NAME}\n" 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 |
Этот пример выводит файлы и размеры файлов пакета sendmail (вывод сокращен для экономии места).
Если в одном запросе необходимо запросить как массивы, так и поля с единственным значением, используется знак равенства в начале тега для указания того, что данный тег должен быть повторен для каждой записи массива. Например:
$ rpm -q --queryformat "[%-15{=NAME} %-50{FILENAMES}\n]" sendmail jikes |
В этом примере за именем пакета следуют имена файлов пакета.
4.2.10.4 Специальные форматы
Некоторые поля содержат специальную информацию в бинарном виде, которую не имеет смысла выводить в том виде, в каком она есть. Для обработки подобных случаев используется такой синтаксис:
%{tag:special_format} |
Например, для вывода INSTALLTIME применяется %{INSTALLTIME:date}, спецификация для вывода значения времени в формате date. Например:
$ rpm -q --qf "%{NAME}-%{VERSION}-%{RELEASE} %{INSTALLTIME:date}\n" jikes |
Этот пример выводит Имя-Версию-Релиз вместе с датой установки.
Большая часть тегов в хэдере является опциональной. Можно выводить их значения, но если тег не задан, команда не выведет ничего. Для обработки этого случая можно использовать условный оператор, базирующийся на синтаксисе C:
%|tag?{print_if_present}:{print_if_absent}| |
Если использовать обычный синтаксис %{tag}, этот условный синтаксис будет очень быстро усложняться. Следует разделять элементы. Например:
$ rpm -q --qf "%{NAME} %|EPOCH?{%{EPOCH}}:{(no Epoch)}|\n" perl |
Если пакет имеет не пустое поле 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 \ |
Для тех зависимостей, которые имеют конкретную версию, эта команда выведет номер версии, предшествуемый оператором сравнения. Обратите внимание, что многие зависимости не имеют специфических требований по версии.
Кроме обычных зависимостей пакеты также могут зависеть от специфической версии 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 |
-p указывает на файлы rpm-пакетов в текущем каталоге, а не на установленные пакеты.
Далее - Прочие запросы
Назад - Комбинирование запросов
Содержание