17.3.4 Дополнительные функции поиска

Процедура find_by_name_iter ищет пакет по имени. Модуль RPM2 также поддерживает ряд функций для повышения информативности запросов. Описание функций приводится в таблице ниже.

Функция

Использование

find_all()

Возвращает список всех пакетов из БД RPM

find_all_iter()

Возвращает итератор для обхода всех пакетов в БД RPM

find_by_file($filename)

Возвращает список пакетов, каждый из которых содержит данный файл

find_by_file_iter($filename)

Возвращает итератор для обхода пакетов, каждый из которых содержит данный файл

find_by_name($package_name)

Возвращает список пакетов, имена которых соответствуют шаблону имени

find_by_name_iter($package_name)

Возвращает итератор для обхода пакетов, имена которых соответствуют шаблону имени

find_by_provides($capability)

Возвращает список пакетов, предоставляющих заданную возможность

find_by_provides_iter($capability)

Возвращает итератор для обхода пакетов, предоставляющих заданную возможность

find_by_requires($capability)

Возвращает список пакетов, имеющих данную зависимость

find_by_requires_iter($capability)

Возвращает итератор для обхода пакетов, имеющих данную зависимость

Для демонстрации возможностей этих функций предлагается следующий скрипт (rpmprovides.pl), результат работы которого можно сравнить с результатом работы команды rpm с соответствующими ключами. Скрипт ищет пакеты, предоставляющие определенную возможность и пакеты, которые зависят от нее.

#!/usr/bin/perl

#

# Queries RPM database for given package,

# listing what it provides and what other

# packages require the capability.

#

# Usage:

# rpmprovides.pl package_name

#

use strict;

use RPM2;

my $rpm_db = RPM2->open_rpm_db();

my $pkg_iter = $rpm_db->find_by_provides_iter( $ARGV[0] );

print "Provides: ", $ARGV[0], "\n";

while (my $pkg = $pkg_iter->next() ) {

print "\t", $pkg->as_nvre(), "\n";

}

# Now, what packages require this capability.

my $pkg_iter2 = $rpm_db->find_by_requires_iter( $ARGV[0] );

print "Requires: ", $ARGV[0], "\n";

while (my $pkg2 = $pkg_iter2->next() ) {

print "\t", $pkg2->as_nvre(), "\n";

}

$rpm_db->close_rpm_db();

При запуске скрипта с именем зависимости в качестве параметра, получим следующий вывод:

$ ./rpmprovides.pl httpd

Provides: httpd

httpd-2.0.40-8

Requires: httpd

mod_perl-1.99_05-3

5:redhat-config-httpd-1.0.1-13

mod_python-3.0.0-10

1:mod_ssl-2.0.40-8

Для проверки работы скрипта выполним команду rpm -q для сравнения полученных списков:

$ rpm -q --whatprovides httpd

httpd-2.0.40-8

$ rpm -q --whatrequires httpd

mod_perl-1.99_05-3

redhat-config-httpd-1.0.1-13

mod_python-3.0.0-10

mod_ssl-2.0.40-8

В обоих случаях увидим одинаковые списки пакетов.

Процедура find_by_provides_iter возвращает имя пакета, например, bash. Нет возможности передать имя файла, такое как /bin/bash, для получения имени пакета, предоставляющего этот файл.

Далее - Получение информации о пакетах
Назад - Обход списка пакетов
Содержание