check-rpms - compare installed rpms with up-to-date distribution
check-rpms compares installed RPM packages (listed by the command
``rpm -qa'') on a Linux system with an up-to-date distribution. That
distribution may either reside in a local directory (possibly NFS
mounted) or on a ftp server. If the -ftp option is specified,
check-rpms retrieves directory listings from the ftpserver's
directory/<arch> directories, where <arch> is set to noarch, i386,
i586, i686, and athlon consecutively. If ftpserver/directory is
not specified, $FTPSERVER/$FTPUPDATES is used. The $FTPSERVER and
$FTPUPDATES variables can be set in the configuration file. If
either of the two is not set, the default server ``updates.redhat.com''
and the default directory ``$RHversion/en/os'' is used,
where $RHversion is obtained from the /etc/redhat-release file. If
run with the -ftp option, all rpm packages that need to be downloaded
(see the --download, --recheck, and --update options) will
be downloaded into the directory specified by the -d directory
option. If that option is omitted the $RPMDIR directory is used.
The $RPMDIR variable that can be set in the configuration file. If
$RPMDIR variable is not set either, the default directory
``/mnt/redhat/RedHat/RPMS'' is used.
If the -ftp is omitted, it is assumed that -d directory specifies
a local directory that contains up-to-date rpm packages. If -d
directory is omitted as well, the $RPMDIR directory is used. If
$RPMDIR is not set, the default directory ``/mnt/redhat/Red-
Hat/RPMS'' is used.
check-rpms uses a lexical sort on the version string and the
release string of the package in order to decide whether the
installed package or the package form the distribution is newer.
check-rpms lists packages of the distribution that are found to be
newer than the installed packages or, if --update is specified,
will update the packages using the ``rpm -Fvh <list of packages>''
command. In the latter case check-rpms must be run as root. Fur-
thermore, the $RPMUSER variable should be set to a non-root user-
name (see the -c option below). check-rpms will switch to that
user and run most of the script under that user id.Only the
final ``rpm -Fvh ...'' command will be run as root. If $RPMUSER is
not set, the ``nobody'' user id will be used. It is recommended to
set $RPMUSER to an ordinary username (such as yourself). Further-
more, if a ftp server is used, create the download directory
(which is specified in the -d directory option or in the $RPMDIR
variable), change the owner ship of that directory to that user,
and set the permissions to 700 before running check-rpms with the
--update option. Note, that --update implies the --no-kernel
option, i.e., check-rpms refuses to update the kernel directly.
- -v --verbose
-
verbose mode: prints additional progress information on
standard output
- -ftp [ftpserver/directory]
-
compare the installed packages with the rpm packages found
on the ftp server ftpserver in the directories directory/<arch>,
where arch is set to noarch, i386, i586, i686,
and athlon consecutively. If ftpserver/directory is not
specified, the $FTPSERVER and $FTPUPDATES variables are
checked. These variables can be set in the configuration
file (see the -c option below). If those variables are not
set either, the default server ``updates.redhat.com'' and the
default directory ``$RHversion/en/os'' is used, where $RHversion
is obtained from the /etc/redhat-release file.
- -noftp
-
use a local directory as the source for new rpm packages
even if the $FTP veriable is set to 1 in the configuration
file.
- -d directory --rpm-directory directory
-
if -ftp is specified download all rpm packages that need to
be downloaded into directory. If -ftp is not specified,
regard the rpm packages found in directory as an up-to-date
distribution against which the installed packages are
compared to.
- -lm --list-missing
-
list installed packages that do not have an equivalent in
the up-to-date distribution. This will generate lots of
output when the comparison is made with the updates directory
of a ftp server.
- -lq --list-questionable
-
list packages for which the lexical sort algorithm does not
give a conclusive result on whether the installed package
is older than the package in the distribution. These are
packages that have version and/or release strings that contain
letters. For example, it is not absolutely clear
whether the version 1.2.3b is actually newer or older than
1.2.3. The lexical sort would classify 1.2.3b to be newer
than 1.2.3; with -lq specified the package would be listed
in any case. See also --recheck below.
- -dl --download
-
download packages from the remote ftp server that are found
to be newer than installed packages into the directory that
is specified in the -d directory option or in the $RPMDIR
variable or, if neither of the two are specified, into
``/mnt/redhat/RedHat/RPMS''. If the download directory does
not exist, check-rpms will create it.
- -r --recheck
-
Use the ``rpm -Uvh --test --nodeps <package>'' command to
check all packages that have letters in their version
and/or release string; --recheck implies --list-questionable
(see above). At the time of writing (Feb. 2002) there
is one known case for which the lexical sort algorithm
fails to detect a new package: mutt-1.2.5.1 was released to
replace mutt-1.2.5i, however, the lexical sort algorithm
incorrectly classifies mutt-1.2.5i to be newer than
mutt-1.2.5.1. In this case using the --recheck option is
essential. In all other cases it is not. It is nevertheless
probably a good idea to use --recheck at least once in a
while. --recheck can increase the run-time of check-rpms
substantially, particularly if a ftp server is used. In
that case the questionable packages must be downloaded from
the server into a directory directory (as specified in the
-d option or the $RPMDIR variable) which will be created,
if it does not exist.
- -nk --no-kernel
-
do not list kernel packages. That is, kernel, kernel-smp,
kernel-enterprise, kernel-BOOT, and kernel-debug will not
be checked and listed. However, kernel-headers and kernel-source
will be checked. The --update option (see below)
implies --no-kernel.
- --update
-
update all packages that were found to have newer versions.
For this to work check-rpms must be run as root and a suitable
$RPMUSER must exist (see DESCRIPTION above). It is
strongly advisable to do a dry run check-rpms -v -lq before
running check-rpms --update.
- -c configurationfile
-
The optional configuration file to use. This file can be
used to specify the $RPMDIR variable, the $FTP, $FTPSERVER,
and $FTPUPDATES, variables, and the $RPMUSER variable. An
example configuration file is given below. If the -c option
is omitted, check-rpms will use the default configuration
file /usr/local/etc/check-rpms.conf, if it exists.
- --rpmuser user name
-
Specifying $RPMUSER on the command line.
- check-rpms
-
will 1) check whether /usr/local/etc/check-rpms.conf exists; 2) if
it does it will read the variables specified in that file, if it
doesn't exist, $RPMDIR is set to /mnt/redhat/RedHat/RPMS; 3) if
$RPMDIR is set, this directory will be regarded as the source of
the up-to-date distribution, unless $FTP is set to 1. In that latter
case the $FTPSERVER and $FTPUPDATES are used, if those variables are
set. Otherwise ``updates.redhat.com'' and ``<RHversion>/en/os''
will be used; 4) the installed packages are compared
- check-rpms -v -lq -d /mnt/redhat/7.1/RedHat/RPMS
-
will use the distribution in the directory /mnt/redhat/7.1/RedHat/RPMS
for comparison with the installed packages. The command
will give more detailed information on its progress and will list
the packages that need upgrading and in another section it will
list packages they may need to be upgraded.
- check-rpms -v -lq -ftp updates.redhat.com/7.1/en/os
-
same as above, but the directories 7.1/en/os/noarch,
7.1/en/os/i386, 7.1/en/os/i586, 7.1/en/os/i686, and
7.1/en/os/athlon on updates.redhat.com will be searched for new
packages.
- check-rpms -v -r --updates
-
will use the default location for updated packages (determined as
indicated in the first example); if a ftp server is used, it will
download all newer and all packages with letters in the version
and/or release strings (i.e., ``questionable'' packages) from that
ftp server, recheck the questionable packages, and finally update
all packages that need to be updated.
All variables must be defined using perl syntax, i.e., in the form
$variable = value;
(do not forget the semicolon at the end of a line). Comments
start with ``#'' and blank lines may be included as well.
Example configuration file:
# check-rpms configuration file
# $RPMDIR is the directory where up-to-date RPMs can be found and/or
# rpm packages are downloaded into.
$RPMDIR = "/mnt/redhat/RedHat/RPMS";
# $RPMUSER is the user name that check-rpms switches to for most of
# the script when run as root
$RPMUSER = "adminjoe";
# $FTPSERVER and $FTPUPDATES are the hostname of a ftp server and the
# directory where RPM updates can be found without the <arch> directory.
# I.e., $FTPUPDATES should be set to something like pub/7.2, if the RPMs
# are located in pub/7.2/i386, pub/7.2/i686, etc.
# $FTPSERVER and $FTPUPDATES are used if -ftp is specified or if the following
# line is uncommented.
# $FTP = 1;
$FTPSERVER = "updates.redhat.com";
$FTPUPDATES = "7.2/en/os";
rpm(8), ncftpls(1), ncftpget(1)
Martin Siegert, Simon Fraser University, siegert@sfu.ca