include("site.inc"); $template = new Page; $template->initCommon(); $template->displayHeader(); ?>
The query options for the rpm command include a whole set of options that return information about the files that make up a package, the scripts, and other parts of the original package. The following sections cover these options.
The –i option with an rpm query command tells the rpm command to output descriptive information about the package. You can also use the longer option, --info, in place of –i. The basic syntax is:
rpm -qi package
Warning
The order of the command-line options is very important. Remember that the rpm command has the following general syntax:
rpm –MajorOperation –extra_options packages_or_files
The rpm –i command installs packages. The rpm –q command queries packages. The rpm –qi command outputs the descriptive information on packages. If you make a mistake and place the i in front of the q, you are telling the rpm command to perform a different operation.
When you run this command, being very careful with the order of the options, you’ll see output like the following, which describes the tcsh shell package.
# rpm -qi tcsh-6.10-6
Name : tcsh Relocations: (not relocateable)
Version : 6.10 Vendor: Red Hat, Inc.
Release : 6 Build Date: Sun 24 Jun 2001 10:45:29
PM CDT
Install date: Fri 14 Dec 2001 10:45:39 AM CST Build
Host: porky.devel.redhat.com
Group : System Environment/Shells Source RPM: tcsh-6.10-6.src.rpm
Size : 764000 License: distributable
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
URL : http://www.primate.wisc.edu/software/csh-tcsh-book/
Summary : An enhanced version of csh, the C shell.
Description :
Tcsh is an enhanced but completely compatible version of csh, the C
shell. Tcsh is a command language interpreter which can be used both
as an interactive login shell and as a shell script command processor.
Tcsh includes a command line editor, programmable word completion,
spelling correction, a history mechanism, job control and a C language
like syntax.
From this description, you can find out a lot about a package, such as where it comes from. Note how the description also names the source RPM used to build the package programs.
Cross Reference
The sections on custom queries following in this chapter show how you can query for any information stored in a package header, including all of the information shown with the rpm –qi command, as well as any other header tag.
RPM packages can be placed into groups, merely arbitrary names for a set of packages. The rpm –qi command, shown previously, lists the group for a package, if there is one. For the tcsh package shown in the previous example, the package is System Environment/Shells.
The –g option to the rpm –q command tells the rpm command to list all the packages in a given group. You can also use the longer option, --group, in place of –g. The basic syntax follows:
rpm –qg group_name
For example:
# rpm -qg "System Environment/Shells"
bash-2.05b-5
sh-utils-2.0.12-3
ash-0.3.8-5
tcsh-6.12-2
Note
This group has a space in its name, so you need quotation marks to pass the group name as one parameter to the rpm command.
The –l (ell) option queries all the files in a package. You can also use the longer option, --list, in place of –l. The basic syntax is:
rpm –ql package
For example, to query the files in the tcsh package, you’ll see the following:
# rpm -ql tcsh
/bin/csh
/bin/tcsh
/usr/share/doc/tcsh-6.10
/usr/share/doc/tcsh-6.10/FAQ
/usr/share/doc/tcsh-6.10/Fixes
/usr/share/doc/tcsh-6.10/NewThings
/usr/share/doc/tcsh-6.10/complete.tcsh
/usr/share/doc/tcsh-6.10/eight-bit.txt
/usr/share/doc/tcsh-6.10/tcsh.html
/usr/share/doc/tcsh-6.10/tcsh.html/header.html
/usr/share/doc/tcsh-6.10/tcsh.html/index.php
/usr/share/doc/tcsh-6.10/tcsh.html/lists.html
/usr/share/doc/tcsh-6.10/tcsh.html/tcsh.man
/usr/share/doc/tcsh-6.10/tcsh.html/tcsh.man2html
/usr/share/doc/tcsh-6.10/tcsh.html/top.html
/usr/share/locale/de/LC_MESSAGES/tcsh
/usr/share/locale/el/LC_MESSAGES/tcsh
/usr/share/locale/es/LC_MESSAGES/tcsh
/usr/share/locale/fr/LC_MESSAGES/tcsh
/usr/share/locale/it/LC_MESSAGES/tcsh
/usr/share/locale/ja/LC_MESSAGES/tcsh
/usr/share/man/man1/tcsh.1.gz
Note
You can pass more than one package name to this option, but it won’t tell you which package owns which file. Use the --filesbypkg option to list files by package (see the related sidebar).
Listing Files By Package
The --filesbypkg option outputs the files by package, so you can make some sense of a list of files from more than one package.
For example:
# rpm -q --filesbypkg file openssh-clients
file /usr/bin/file
file /usr/share/magic
file /usr/share/magic.mgc
file /usr/share/magic.mime
file /usr/share/man/man1/file.1.gz
file /usr/share/man/man5/magic.5.gz
openssh-clients /etc/ssh/ssh_config
openssh-clients /usr/bin/sftp
openssh-clients /usr/bin/slogin
openssh-clients /usr/bin/ssh
openssh-clients /usr/bin/ssh-add
openssh-clients /usr/bin/ssh-agent
openssh-clients /usr/bin/ssh-keyscan
openssh-clients /usr/share/man/man1/sftp.1.gz
openssh-clients /usr/share/man/man1/slogin.1.gz
openssh-clients /usr/share/man/man1/ssh-add.1.gz
openssh-clients /usr/share/man/man1/ssh-agent.1.gz
openssh-clients /usr/share/man/man1/ssh-keyscan.1.gz
openssh-clients /usr/share/man/man1/ssh.1.gz
Use this option without –l, because the –l option will also list the files alone, without any package name.
The –v (verbose) option can give you more information on the files when used with the various query options. For example:
# rpm -qlv tcsh
lrwxrwxrwx 1 root root 4 Jun 24 2001 /bin/csh -> tcsh
-rwxr-xr-x 1 root root 288604 Jun 24 2001 /bin/tcsh
drwxr-xr-x 2 root root 0 Jun 24 2001 /usr/share/doc/tcsh-6.10
-rw-r--r-- 1 root root 8306 Aug 25 2000 /usr/share/doc/tcsh-6.10/FAQ
-rw-r--r-- 1 root root 64761 Nov 19 2000 /usr/share/doc/tcsh-6.10/Fixes
-rw-r--r-- 1 root root 6518 Oct 2 1998 /usr/share/doc/tcsh-6.10/NewThings
-rw-r--r-- 1 root root 41328 Nov 19 2000 /usr/share/doc/tcsh-6.10/complete.tcsh
-rw-r--r-- 1 root root 4668 Jun 24 2001 /usr/share/doc/tcsh-6.10/eight-bit.txt
drwxr-xr-x 2 root root 0 Jun 24 2001 /usr/share/doc/tcsh-6.10/tcsh.html
-rw-r--r-- 1 root root 124 Jun 24 2001 /usr/share/doc/tcsh-6.10/tcsh.html/header.html
lrwxrwxrwx 1 root root 8 Jun 24 2001 /usr/share/doc/tcsh-6.10/tcsh.html/index.php -> top.html
-rw-r--r-- 1 root root 911 Jun 24 2001 /usr/share/doc/tcsh-6.10/tcsh.html/lists.html
-rw-r--r-- 1 root root 0 Jun 24 2001 /usr/share/doc/tcsh-6.10/tcsh.html/tcsh.man
-rw-r--r-- 1 root root 22542 Jun 24 2001 /usr/share/doc/tcsh-6.10/tcsh.html/tcsh.man2html
-rw-r--r-- 1 root root 693 Jun 24 2001 /usr/share/doc/tcsh-6.10/tcsh.html/top.html
-rw-r--r-- 1 root root 45861 Jun 24 2001 /usr/share/locale/de/LC_MESSAGES/tcsh
-rw-r--r-- 1 root root 47566 Jun 24 2001 /usr/share/locale/el/LC_MESSAGES/tcsh
-rw-r--r-- 1 root root 47413 Jun 24 2001 /usr/share/locale/es/LC_MESSAGES/tcsh
-rw-r--r-- 1 root root 47156 Jun 24 2001 /usr/share/locale/fr/LC_MESSAGES/tcsh
-rw-r--r-- 1 root root 48264 Jun 24 2001 /usr/share/locale/it/LC_MESSAGES/tcsh
-rw-r--r-- 1 root root 18682 Jun 24 2001 /usr/share/locale/ja/LC_MESSAGES/tcsh
-rw-r--r-- 1 root root 62399 Jun 24 2001 /usr/share/man/man1/tcsh.1.gz
This information is the same as a long listing on the files.
As you can see, the –l option results in quite a lot of output. In some cases, though, you aren’t interested in documentation and other miscellaneous files in the package. It’s the commands and libraries that cause the most package-related problems. To help with this, you can use a series of rpm options to list only certain types of files.
The –c option tells the rpm –q command to list the configuration files for a package. You can also use the longer option, --configfiles, in place of –c. The basic syntax is:
rpm –qc package_name
For example:
# rpm -qc bash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
This command lists the configuration files for the bash package.
Some packages don’t have configuration files, as shown following:
# rpm -qc python
#
In this case, the rpm command provides no output. Other packages have a lot of configuration files, such as the sendmail mail transfer agent, as shown following:
# rpm -qc sendmail
/etc/aliases
/etc/mail/Makefile
/etc/mail/access
/etc/mail/domaintable
/etc/mail/helpfile
/etc/mail/local-host-names
/etc/mail/mailertable
/etc/mail/sendmail.mc
/etc/mail/statistics
/etc/mail/trusted-users
/etc/mail/virtusertable
/etc/rc.d/init.d/sendmail
/etc/sendmail.cf
/etc/sysconfig/sendmail
/usr/lib/sasl/Sendmail.conf
As with the –l option, the –v option provides more information on each file, as shown following:
#rpm -qcv bash
-rw-r--r-- 1 root root 24 Jul 9 2001 /etc/skel/.bash_logout
-rw-r--r-- 1 root root 191 Jul 9 2001 /etc/skel/.bash_profile
-rw-r--r-- 1 root root 124 Jul 9 2001 /etc/skel/.bashrc
Similarly to the –c option, the –d option tells the rpm –q command to list just the documentation files for a package. The basic syntax is:
rpm –qd package_name
For example:
# rpm -qd tcsh
/usr/share/doc/tcsh-6.10/FAQ
/usr/share/doc/tcsh-6.10/Fixes
/usr/share/doc/tcsh-6.10/NewThings
/usr/share/doc/tcsh-6.10/complete.tcsh
/usr/share/doc/tcsh-6.10/eight-bit.txt
/usr/share/doc/tcsh-6.10/tcsh.html/header.html
/usr/share/doc/tcsh-6.10/tcsh.html/index.php
/usr/share/doc/tcsh-6.10/tcsh.html/lists.html
/usr/share/doc/tcsh-6.10/tcsh.html/tcsh.man
/usr/share/doc/tcsh-6.10/tcsh.html/tcsh.man2html
/usr/share/doc/tcsh-6.10/tcsh.html/top.html
/usr/share/man/man1/tcsh.1.gz
Note
You can add the –v option to all of the file-listing options to get more information.
You can also use the longer option, --docfiles, in place of –d.
The –s option to the rpm –q command lists the state of each file in a package. The basic syntax follows.
rpm –qs package_name
For example:
# rpm -qs tcsh
normal /bin/csh
normal /bin/tcsh
normal /usr/share/doc/tcsh-6.10
normal /usr/share/doc/tcsh-6.10/FAQ
normal /usr/share/doc/tcsh-6.10/Fixes
normal /usr/share/doc/tcsh-6.10/NewThings
normal /usr/share/doc/tcsh-6.10/complete.tcsh
normal /usr/share/doc/tcsh-6.10/eight-bit.txt
normal /usr/share/doc/tcsh-6.10/tcsh.html
normal /usr/share/doc/tcsh-6.10/tcsh.html/header.html
normal /usr/share/doc/tcsh-6.10/tcsh.html/index.php
normal /usr/share/doc/tcsh-6.10/tcsh.html/lists.html
normal /usr/share/doc/tcsh-6.10/tcsh.html/tcsh.man
normal /usr/share/doc/tcsh-6.10/tcsh.html/tcsh.man2html
normal /usr/share/doc/tcsh-6.10/tcsh.html/top.html
not installed /usr/share/locale/de/LC_MESSAGES/tcsh
not installed /usr/share/locale/el/LC_MESSAGES/tcsh
not installed /usr/share/locale/es/LC_MESSAGES/tcsh
not installed /usr/share/locale/fr/LC_MESSAGES/tcsh
not installed /usr/share/locale/it/LC_MESSAGES/tcsh
not installed /usr/share/locale/ja/LC_MESSAGES/tcsh
normal /usr/share/man/man1/tcsh.1.gz
You can also use the longer option, --state, in place of –s.
You can combine the –s option with other file filters, such as –d, for listing only the documentation files for a package.
Table 5-2 lists the states that the rpm command supports.
Table 5-2 RPM File States
State | Usage |
normal | The file has been installed. |
not installed | The file from the package is not installed. |
replaced | The file has been replaced. |
Sometimes files in a package may have been skipped during installation with options such as --excludedocs. This can lead to non-normal states. You may have also modified files installed from a given package.
Cross Reference
See Chapter 4 for more on installing RPMs.
RPM packages can have preinstallation, postinstallation, preuninstallation, and postuninstallation scripts. These are scripts that the rpm command will execute before and after installing a package, as well as before and after removing the package. The --scripts option to the rpm –q command lists the scripts associated with a package. The basic syntax follows:
rpm -q --scripts package_name
For example:
# rpm -q --scripts tcsh
postinstall scriptlet (through /bin/sh):
if [ ! -f /etc/shells ]; then
echo "/bin/tcsh" >> /etc/shells
echo "/bin/csh" >> /etc/shells
else
grep '^/bin/tcsh$' /etc/shells > /dev/null || echo "/bin/tcsh" >> /etc/shell
s
grep '^/bin/csh$' /etc/shells > /dev/null || echo "/bin/csh" >> /etc/shells
fi
postuninstall scriptlet (through /bin/sh):
if [ ! -x /bin/tcsh ]; then
grep -v '^/bin/tcsh$' /etc/shells | grep -v '^/bin/csh$'> /etc/shells.rpm
mv /etc/shells.rpm /etc/shells
fi
PRODUCTION: NOTE THE “fi” on a line by itself at the end of this listing. Thanks, -Eric
The simple scripts shown here add an entry to the /etc/shells file and clean up the entry when uninstalled.
Cross Reference
Cleaning up any changes your package makes on uninstallation is a very good idea. See the chapters in Part II, Creating RPMs, for details on making your own well-behaved packages.
Other packages have more complex scripts, as shown following:
# rpm -q --scripts sendmail
preinstall scriptlet (through /bin/sh):
/usr/sbin/useradd -u 47 -d /var/spool/mqueue -r -s /dev/null mailnull >/dev/null
2>&1 || :
postinstall scriptlet (through /bin/sh):
#
# Convert old format to new
#
if [ -f /etc/mail/deny ] ; then
cat /etc/mail/deny | \
awk 'BEGIN{ print "# Entries from obsoleted /etc/mail/deny"} \
{print $1" REJECT"}' >> /etc/mail/access
cp /etc/mail/deny /etc/mail/deny.rpmorig
fi
for oldfile in relay_allow ip_allow name_allow ; do
if [ -f /etc/mail/$oldfile ] ; then
cat /etc/mail/$oldfile | \
awk "BEGIN { print \"# Entries from obsoleted /etc/mail/$oldfile
\" ;} \
{ print \$1\" RELAY\" }" >> /etc/mail/access
cp /etc/mail/$oldfile /etc/mail/$oldfile.rpmorig
fi
done
#
# Oops, these files moved
#
if [ -f /etc/sendmail.cw ] ; then
cat /etc/sendmail.cw | \
awk 'BEGIN { print "# Entries from obsoleted /etc/sendmail.cw" ;} \
{ print $1 }' >> /etc/mail/local-host-names
cp /etc/sendmail.cw /etc/sendmail.cw.rpmorig
fi
#
# Rebuild maps (next reboot will rebuild also)
#
{ /usr/bin/newaliases
for map in virtusertable access domaintable mailertable
do
if [ -f /etc/mail/${map} ] ; then
/usr/bin/makemap hash /etc/mail/${map} < /etc/mail/${map}
sleep 1
fi
done
} > /dev/null 2>&1
/sbin/chkconfig --add sendmail
preuninstall scriptlet (through /bin/sh):
if [ $1 = 0 ]; then
/etc/rc.d/init.d/sendmail stop >/dev/null 2>&1
/sbin/chkconfig --del sendmail
fi
postuninstall scriptlet (through /bin/sh):
if [ "$1" -ge "1" ]; then
/etc/rc.d/init.d/sendmail condrestart >/dev/null 2>&1
fi
exit 0
In this case, the main script is the post-install script, which tries to convert old-format data into the new format, thereby helping users upgrade to the newer release.
The --changelog option lists what has changed, as described in a file that logs changes, from previous versions of a given package. The change log is just a convention, so not all packages will sport this nifty feature. In addition, the change log for many packages documents the changes in the RPM packaging, not the changes in the underlying application. If a change log is available, however, this can prove a very good way to help determine whether you want to upgrade to a new version of a package.
For example, a network server application may have been updated to fix some security problems. In that case, you likely want to upgrade. Other changes may not affect your site, leading you to decide not to upgrade.
The basic format of the command is:
rpm –q --changelog package_name
For example, the following shows the beginning of the log-change log for the bash package, with names and e-mail addresses changed to protect the innocent:
# rpm -q --changelog bash
* Fri Aug 23 2002 Bob Marley <bob@marley.com.>
- re-bzip the docs, something was corrupted
* Thu Aug 22 2002 Peter Tosh <peter@tosh.com> 2.05b-4
- Fix history substitution modifiers in UTF-8 (bug #70294, bug #71186).
- Fix ADVANCE_CHAR at end of string (bug #70819).
- docs: CWRU/POSIX.NOTES no longer exists, but ship POSIX.
* Wed Aug 07 2002 Jimmy Cliff <jimmy@cliff.com> 2.05b-3
- Fixed out of memory problem with readline.
* Tue Jul 23 2002 Jimmy Cliff <jimmy@cliff.com> 2.05b-2
- Added symlink for sh.1 in man1 section so that man sh works (#44039).
The rpm command is very flexible in allowing you to combine queries. Just start the command with rpm –q and add the various options either on their own, such as –q with –s and –f, or together, such as –qsf.
The following sections show a few handy combinations of the options you can use for real-world package-management tasks.
To find information on a package and where it is documented, use the –qdi option to the rpm command (a combination of the –q, –d, and –i options):
# rpm -qdi grep
Name : grep Relocations: /usr
Version : 2.5.1 Vendor: Red Hat,
Inc.
Release : 4 Build Date: Sat 20 Jul
2002 01:08:48 AM CDT
Install date: Sat 05 Oct 2002 12:21:58 PM CDT Build
Host: stripples.devel.redhat.com
Group : Applications/Text Source RPM: grep-2.5.1-
4.src.rpm
Size : 475770 License: GPL
Signature : DSA/SHA1, Tue 03 Sep 2002 04:17:47 PM CDT, Key ID
219180cddb42a60ePackager : Red Hat, Inc.
<http://bugzilla.redhat.com/bugzilla>
Summary : The GNU versions of grep pattern matching utilities.
Description :
The GNU versions of commonly used grep utilities. Grep searches
through textual input for lines which contain a match to a specified
pattern and then prints the matching lines. GNU's grep utilities
include grep, egrep, and fgrep.
You should install grep on your system, because it is a very useful
utility for searching text.
/usr/share/doc/grep-2.5.1/ABOUT-NLS
/usr/share/doc/grep-2.5.1/AUTHORS
/usr/share/doc/grep-2.5.1/ChangeLog
/usr/share/doc/grep-2.5.1/NEWS
/usr/share/doc/grep-2.5.1/README
/usr/share/doc/grep-2.5.1/THANKS
/usr/share/doc/grep-2.5.1/TODO
/usr/share/info/grep.info-1.gz
/usr/share/info/grep.info-2.gz
/usr/share/info/grep.info-3.gz
/usr/share/info/grep.info.gz
/usr/share/man/man1/egrep.1.gz
/usr/share/man/man1/fgrep.1.gz
/usr/share/man/man1/grep.1.gz
It's often hard to track down the documentation for a given package. Some packages use Unix manual pages; others use info files, and still others provide HTML for other formatted manuals. Some have no real documentation at all.
To find the state of all the configuration files for a given Linux command, use a command with the –qcsf option with the name of the file, as shown here, or the -qcs option with the name of a package.
For example:
# rpm -qcsf /bin/bash
normal /etc/skel/.bash_logout
normal /etc/skel/.bash_profile
normal /etc/skel/.bashrc
To list the most recently installed packages, use the following command with the --last option. This is very useful if you recently installed or upgraded a number of packages and something unexpected happens. If you cannot remember the package names, you can use the --last option to list out packages in reverse order of installation.
You can pipe the output of a query to the head command to show only the last ten packages that were installed or upgraded, as shown following:
# rpm -qa --last | head
comps-8.0-0.20020910 Sat 05 Oct 2002 01:17:30 PM CDT
tkinter-2.2.1-17 Sat 05 Oct 2002 01:16:58 PM CDT
tix-8.2.0b1-74 Sat 05 Oct 2002 01:16:52 PM CDT
tclx-8.3-74 Sat 05 Oct 2002 01:16:44 PM CDT
python-tools-2.2.1-17 Sat 05 Oct 2002 01:16:41 PM CDT
mx-2.0.3-6 Sat 05 Oct 2002 01:16:34 PM CDT
libxslt-python-1.0.19-1 Sat 05 Oct 2002 01:16:31 PM CDT
librpm404-devel-4.0.4-8x.27 Sat 05 Oct 2002 01:16:27 PM CDT
itcl-3.2-74 Sat 05 Oct 2002 01:16:12 PM CDT
gnumeric-1.0.9-2 Sat 05 Oct 2002 01:15:46 PM CDT
You can pass options to the head command to show more or fewer than ten lines. In general, starting with the last ten packages can help you track down something you installed the day before.
The --qf or --queryformat option allows you to create custom queries with the rpm command, although in a rather difficult manner. You need to pass a query format string, the syntax of which originates with the C printf function and requires precision.
The basic syntax of the query format is %{tag_name}. (The percent sign is about the only part that comes from the C printf function.) You can combine tag names to display more than one item per package. You can also add formatting options following C language conventions.
For example, to list all package names, use a command like the following:
# rpm -qa --qf "%{NAME}"
redhat-menusglibccracklibgdbmgmplibacllibjpeglincpcreshadow-
utilslibtermcapfreetypeinfofileutilspsmiscntpmountcracklib-dictskrb5-libscyrus-
saslusermodeXftlibpnglibxmllibbonobopythonpygtk2pyxf86configredhat-config-
usersredhat-config-keyboardrpm404-pythongnome-vfs2libgnomeuiashbind-utilscyrus-
sasl-plaindos2unixethtoolfingergroffautofskbdconfiglesslibtool-
libslockdevmailcapMAKEDEVmouseconfignetpbmntsysvORBitpartedppppsutilsrdaterhnlibrp
mrshsetuptoolstatserialtarlilopciutilstimeconfigunzipkernel-pcmcia-
csanacronXFree86
This command used the simplest format, which is just the value of the tag in the package headers, in this case the package names. Because we used no other formatting, this command outputs all the package names smashed together. To deal with this problem in the output, you can place a \n, the C language convention for a newline character, at the end of the format string. This fixes the output considerably.
For example (showing just the first few entries):
# 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
This command provides a custom query that is essentially the same as the rpm -qa command. You’ll likely not use this command in favor of the simpler rpm option, but you can use this example as a guide for creating your own custom queries.
Cross Reference
A great many of the command-line options to the rpm command are defined as popt aliases. These popt aliases define the rpm command-line options in terms of longer query format strings. See Chapter 21 for more information on popt.
You can add items to the query string and use C language conventions for formatting and controlling the amount of space provided for each item output.
For example, the following command prints the name and platform for all packages, showing the first few entries, formatted with 20 characters for each item:
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
To build queries with the --queryformat option, you need to know what tags you can use. To list the names of the available query format tags, use the --querytags option, which returns a large set of tags, truncated here for space:
# rpm --querytags
NAME
VERSION
RELEASE
SUMMARY
DESCRIPTION
BUILDTIME
Each of these tags also has a version with a RPMTAG_ prefix, such as RPMTAG_NAME. You can use this tags with or without the RPMTAG_ prefix. For example:
$ rpm -q --qf "%{RPMTAG_NAME}\n" sendmail
sendmail
Note how this command uses the –q option to query for one package, instead of –qa to query for all packages. You can use query formats with any of the rpm queries.
The next sections cover the available tags based on the type of the information stored in the tag.
Many of the query format tags refer to package-information data stored in the RPM header, introduced in Chapter 3. Table 5-3 lists the package-information tags.
Table 5-3 Package-information query tags
Tag | Holds |
NAME | Package name |
VERSION | Version number |
RELEASE | Release number |
SUMMARY | One-line summary of the package contents |
DESCRIPTION | Descriptive text about the package |
BUILDTIME | Time package was built |
BUILDHOST | Host package was built on |
SIZE | Size of all the regular files in the payload |
LICENSE | License package was released under |
GROUP | Descriptive group or category name for the package |
OS | Operating system package was built for |
ARCH | Architecture, such as i386 |
SOURCERPM | The associated source RPM |
CHANGELOGTIME | Array of changelog times |
CHANGELOGNAME | Array of changelog names |
CHANGELOGTEXT | Array of changelog text entries |
PREIN | Pre-install script |
POSTIN | Post-install script |
PREUN | Pre-uninstall script |
POSTUN | Post uninstall script |
PLATFORM | Platform |
All of these tags, except for the CHANGELOGTIME, CHANGELOGTEXT and CHANGELOGNAME tags, are single-value tags. You can query for these tag values using
Many of the header entries are arrays, so the header tags can hold more than one item. For example, RPM packages can have more than one file in the payload.
To specify a format for each item in an array, use square brackets. For example:
$ 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
This example lists the files and file sizes within a package, with the listing of files truncated for size.
If you want to mix array tags with non-array tags, you can use an equals sign, =, in front of the tag name to specify that the given tag should be repeated for each item in the array. For example:
$ 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
This example, also truncated for size, lists the package name along with the file name for the files contained in these two packages.
Some of the tags within an RPM package header contain special binary information that usually makes no sense when printed out. To help with these header tags, you can use special RPM formatting options, using a syntax like the following:
%{tag:special_format}
For example, to print the INSTALLTIME tag, use %{INSTALLTIME:date}, which specifies to print the INSTALLTIME tag in date format. For example:
$ rpm -q --qf "%{NAME}-%{VERSION}-%{RELEASE} %{INSTALLTIME:date}\n" jikes
jikes-1.18-1 Fri 06 Dec 2002 09:19:30 PM CST
This example prints the NAME-VERSION-RELEASE of the package, along with the INSTALLTIME in date format.
Most tags in a header are optional. You can print the value of these tags, but you may get nothing. To help deal with this, you can use a conditional operator based loosely on the C language ternary operator. The basic syntax is:
%|tag?{print_if_present}:{print_if_absent}|
With the normal %{tag} syntax, this conditional syntax gets complicated really fast. You need to break the elements down. For example:
$ rpm -q --qf "%{NAME} %|EPOCH?{%{EPOCH}}:{(no Epoch)}|\n" perl
perl 1
If the package has a value for the EPOCH tag, you will see output as shown in this example. Most packages do not have an EPOCH defined, in which case, you will see output like the following:
RPM files likely hold packages that are not installed. If you query one of these packages, you will get the alternative text, as shown following:
$ rpm -q --qf "%{NAME} %|EPOCH?{%{EPOCH}}:{(no Epoch)}|\n" sendmail
sendmail (no Epoch)
Cross Reference
See the "Getting Information on Package Files" section in this chapter for more on querying RPM package files.
Other special-formatting options are described in the following sections on the dependency and file information tags.
A number of tags provide package dependency information. Each of these tags comes in triples, which are formatted similarly. For example, for the capabilities a package requires, you have the REQUIRENAME, REQUIREVERSION, and REQUIREFLAGS tags.
The REQUIRENAME tag holds an array of required capability names. The REQUIREVERSION tag holds an array of the versions of the required capabilities. The REQUIREFLAGS tag ties the two together with a set of bit flags that specify whether the requirement is for a version less than the given number, equal to the given number, greater than or equal to the given number, and so on.
Table 5-4 lists the dependency tags.
Table 5-4 Dependency query tags
Tag | Holds |
CONFLICTFLAGS | Array of flags for the capabilities this package conflicts |
CONFLICTNAME | Array of capabilities that this package conflicts |
CONFLICTVERSION | Array of version numbers that this package conflicts |
REQUIREFLAGS | Array of flags for the capabilities this package requires |
REQUIRENAME | Array of capabilities that this package requires |
REQUIREVERSION | Array of version numbers that this package requires |
OBSOLETENAME | Array of capabilities that this package obsoletes |
OBSOLETEFLAGS | Array of flags for the capabilities this package obsoletes |
OBSOLETEVERSION | Array of version numbers that this package obsoletes |
PROVIDENAME | Array of capabilities that this package provides |
PROVIDEFLAGS | Array of flags for the capabilities this package provides |
PROVIDEVERSION | Array of version numbers that this package provides |
Each of these tags is an array. The PROVIDENAME, PROVIDEVERSION, and PROVIDEFLAGS tags work similarly for the capabilities this package provides. The CONFLICTNAME, CONFLICTVERSION, and CONFLICTFLAGS tags specify the conflicts, and, the OBSOLETENAME, OBSOLETEVERSION, and OBSOLETEFLAGS tags specify the obsolete dependencies.
The depflags special-formatting option prints out the flag tags, such as REQUIREFLAGS, in human-readable format. For example, the following command lists the requirements for a package:
$ 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
For those requirements that have specific version numbers, this command prints out the version number along with the operator, such as >= for a version greater than or equal to the given number.
Note that for many of the requirements, there is no specific version information.
Note
In addition to normal capabilities, most packages will have some RPM-related requirements as well, which specify any required RPM versions, for example, rpmlib(CompressedFileNames).
The file-information tags hold data on the files within the package payload, that is, the files the rpm command installs when you install the package. These tags are arrays, with one value per file.
Table 5-5 lists the file-information tags.
Table 5-5 File-information query tags
Tag | Holds |
OLDFILENAMES | Array of full file names, used in older packages |
FILESIZES | Array of sizes for each file |
FILEMODES | Array of permissions for each file |
FILERDEVS | Array of rdev values for each file |
FILEMTIMES | Array of modified times for each file |
FILEMD5S | MD5 checksum for each file |
FILELINKTOS | Array of link information for each file |
FILEFLAGS | Array of flags for each file |
FILEUSERNAME | Array of user names for the file owners |
FILEGROUPNAME | Array of group names for the file owners |
FILEDEVICES | Array of devices for each file |
FILEINODES | Array of inodes for each file |
FILELANGS | Array of language flags for each file |
DIRINDEXES | Array of values that matches the DIRNAMES with the BASENBAMES |
BASENAMES | Array of file base names |
DIRNAMES | Array of directories that matches up with BASENAMES |
The OLDFILENAMES tag is used when the files are not compressed, when the REQUIRENAME tag does not indicate rpmlib(CompressedFileNames).
The FILESIZES tag specifies the size of each file in the payload, while the FILEMODES tag specifies the file modes (permissions) and the FILEMTIMES tag holds the last modification time for each file.
The BASENAMES tag holds an array of the base file names for the files in the payload. The DIRNAMES tag holds an array of the directories for the files. The DIRINDEXES tag contains an index into the DIRNAMES for the directory. Each RPM must have either OLDFILENAMES or the triple of BASENAMES, DIRNAMES, and DIRINDEXES, but not both.
When listing file information, use the square bracket array syntax with your query formats. You can use the perms special formatting option for the file modes. For example:
$ rpm -q --qf "[%-15{=NAME} %-36{FILENAMES} %{FILEMODES:perms}\n]" jikes
jikes /usr/bin/jikes -rwxr-xr-x
jikes /usr/doc/jikes-1.18/license.htm -rw-r--r--
jikes /usr/man/man1/jikes.1.gz -rw-r--r--
In addition to all these tags, there are a number of other miscellaneous tags, many of which are listed in Table 5-6.
Table 5-6 Other query tags
Tag | Holds |
ARCHIVESIZE | Uncompressed size of the payload section |
COOKIE | Holds an opaque string |
RPMVERSION | Holds the version of the RPM tool used to create the package |
OPTFLAGS | Compiler optimization flags used to build the package |
PAYLOADFORMAT | Must be cpio for LSB-compliant packages |
PAYLOADCOMPRESSOR | Must be gzip for LSB-compliant packages |
PAYLOADFLAGS | Must be 9 for LSB-compliant packages |
RHNPLATFORM | Holds an opaque string |
FILEVERIFYFLAGS | Bitmask that specifies which tests to perform to verify the files after an install |
For example, you can list the version of RPM that created a package with a command like the following:
$ 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
Cross Reference
See Appendix D for a listing of all the tags in an RPM file.
If what you’ve seen so far isn’t enough, the rpm command supports a number of extra queries, mostly of use to developers at Red Hat.
Table 5-7 summarizes these extra queries.
Table 5-7 Extra Queries
Option | Meaning |
--dump | Dumps out extra information on files |
--fileid md5_id | Queries for the package with the given MD5 digest |
--hdrid sha1_header_id | Queries for the package with the given header identifier number, in SHA1 format |
--last | Reorders the output of the rpm command to show the most recently-installed packages first |
--pkgid md5_id | Queries for the package with the given MD5 package ID |
--querybynumber number | Queries for the given entry, by number, in the RPM database |
--tid transaction_id | Queries for the package or packages with the given transaction ID |