Процедуры tag, as_nvre и is_source_package, работающие с объектом хэдера, полученным из файла (как было показано ранее), также умеют работать и с записями, полученными из БД RPM.
Скрипт, приведенный ниже (rpminfo.pl), распечатывает описательную информацию о заданном пакете.
#!/usr/bin/perl
#
# Queries RPM database for given package and prints info.
# Usage:
# rpminfo.pl package_name
#
use strict;
use RPM2;
my $rpm_db = RPM2->open_rpm_db( "-path" => "/var/lib/rpm" );
my $pkg_iter = $rpm_db->find_by_name_iter( $ARGV[0] );
while (my $pkg = $pkg_iter->next() ) {
printInfo( $pkg );
}
$rpm_db->close_rpm_db();
# Prints info on one package.
sub printInfo {
my($pkg) = shift;
print $pkg->as_nvre(), ", ", $pkg->tag("ARCH"), ", ",
$pkg->tag("OS"), ", ", $pkg->tag("PLATFORM"), "\n";
print $pkg->tag("SUMMARY"), "\n";
print "Group: ", $pkg->tag("GROUP"), "\n";
print $pkg->tag("DESCRIPTION"), "\n";
print "Vendor: ", $pkg->tag("VENDOR"), ", ", $pkg->tag("URL"), "\n";
print "Size: ", $pkg->tag("SIZE"), "\n";
}
|
Запуская скрипт, увидим вывод, подобный следующему:
$ ./rpminfo.pl XFree86
XFree86-4.2.0-72, i386, linux, i386-redhat-linux-gnu
The basic fonts, programs and docs for an X workstation.
Group: User Interface/X
XFree86 is an open source implementation of the X Window System. It provides the basic low level functionality which full fledged
graphical user interfaces (GUIs) such as GNOME and KDE are designed upon.
Vendor: Red Hat, Inc., http://www.xfree86.org
Size: 30552239
|
17.3.5.1 Вывод даты установки
Дата установки - это поле числового типа, представляющее количество секунд, прошедших со времени начала эпохи UNIX (1 января 1970 года) до момента установки пакета. Для придания этому значению (тег INSTALLTIME) человекочитаемого смысла используется функция Perl localtime. Скрипт rpmdate.pl показывает реализацию ее использования:
#!/usr/bin/perl
#
# Queries RPM database for given package,
# prints out name, vendor, and date installed.
# Usage:
# rpmdate.pl package_name
#
use strict;
use RPM2;
my $rpm_db = RPM2->open_rpm_db();
my $pkg_iter = $rpm_db->find_by_name_iter( $ARGV[0] );
while (my $pkg = $pkg_iter->next() ) {
printDate( $pkg );
}
$rpm_db->close_rpm_db();
# Prints installation data for one package.
sub printDate {
my($pkg) = shift;
my $date = localtime( $pkg->tag("INSTALLTIME") );
printf("%-20s %-17s %s\n", $pkg->as_nvre(), $pkg->tag("VENDOR"), $date);
}
|
Функция printf в этом скрипте умеет нечто, чего команда rpm делать не умеет. Даже используя опцию --queryformat, мы не можем сгруппировать значения нескольких полей в одну строку, задавая формат вывода, с Perl это возможно. Просто ассоциируйте несколько значений в строку, используя имена полей или такие процедуры, как as_nvre.
Передав имя пакета скрипту в качестве параметра, увидим дату установки пакета:
$ ./rpmdate.pl kernel
kernel-2.4.18-14 Red Hat, Inc. Sat Oct 5 12:29:58 2002
|
17.3.5.2 Обработка полей, представляющих собой массивы строк
Не только формат даты может вызвать сложности. Ряд тегов (полей хэдера) представляют собой массивы строк. Это означает, что необходимо предусмотреть, каким образом эти массивы будут выводится в консолидированном виде.
Для помощи в обработке таких ситуаций процедура, показанная ниже, получает на вход массив строк, возвращая одну строку с заданным разделителем между частями строки:
sub arrayToString {
my($sep) = shift;
my(@array) = @_;
my($str);
$str = $array[0];
for ( $i = 1; $i < $#array; $i++ )
{
$str = $str . $sep . $array[$i];
}
return $str;
}
|
Следующий список показывает имена полей, значения которых являются массивами строк:
*BASENAMES
*CHANGELOGNAME
*CHANGELOGTEXT
*DIRNAMES
*FILEGROUPNAME
*FILELANGS
*FILELINKTOS
*FILEMD5S
*FILEUSERNAME
*OLDFILENAMES
*PROVIDENAME
*PROVIDEVERSION
*REQUIRENAME
*REQUIREVERSION
|
17.3.5.3 Получение списка файлов в пакете
Процедура files предоставляет список файлов, содержащихся в данном пакете. Нижеследующий листинг показывает, как с помощью скрипта rpmfiles.pl получить доступ к такому списку:
#!/usr/bin/perl
#
# Queries RPM database for given package,
# prints out the files in the package.
# Usage:
# rpmfiles.pl package_name
#
use strict;
use RPM2;
my $rpm_db = RPM2->open_rpm_db();
my $pkg_iter = $rpm_db->find_by_name_iter( $ARGV[0] );
while (my $pkg = $pkg_iter->next() ) {
printFiles( $pkg );
}
$rpm_db->close_rpm_db();
# Prints installation data for one package.
sub printFiles {
my($pkg) = shift;
my $files = arrayToString("\n", $pkg->files() );
print "Files:\n", $files, "\n";
}
sub arrayToString {
my($sep) = shift;
my(@array) = @_;
my($str);
$str = $array[0];
for ( my $i = 1; $i < $#array; $i++ )
{
$str = $str . $sep . $array[$i];
}
return $str;
}
|
Запустив скрипт, увидим следующее:
$ ./rpmfiles.pl jikes
Files:
/usr/bin/jikes
/usr/doc/jikes-1.17/license.htm
|
Далее - Сравнение версий
Назад - Дополнительные функции поиска
Содержание