[CentOS] RPM: any better way to reinstall only certain files? [(UN?)SOLVED]

Wed Jul 12 13:36:35 UTC 2006
William L. Maltby <BillsCentOS at triad.rr.com>

On Tue, 2006-07-11 at 16:15 -0400, William L. Maltby wrote:
> <snip>

Since Jim went out of his way helping to hunt for a good solution, I
thought I would summarize here for folks that might have a similar need
down the road. Experienced rpmers/bashers/perlers/pythoners/.... should
probably skip this.

Thanks Jim Perrin!

Situation was that rpm --verify showed lots of missing files. Most due
to a bad spot that developed on my former boot drive. After a little
thought, I suspect some had been removed by me because they were
internationalization files (*/locale/* and */i18n/*) and it is the sort
of thing I would do... sometimes and forget to log! :-(

Anyway, none of the rpm params we tried seemed to "recover" missing
files, whether we tried --install ("... package already installed ...")
--update or --freshen (both just did nothing since I was up-to-date).
The --replacefiles also did not help.

While this was going on, I was scripting (Q & D for sure) to utilize the
rpm2cpio utility. We could easily expand the rudimentary Q&D crap I
started here into a fairly automated assistant, if so desired. I suspect
that it might be better done in something other than bash though.

I had a basic file which was an annotated list of missing files (and
other errors) from my "rpm --verify ..." run. It looked similar to this.

   missing   d /usr/share/doc/redhat-logos-1.1.26/COPYING

   #############################################################
   # Owned by Apache Runtime Development                       #
   missing     /usr/share/doc/apr-devel-0.9.4
   missing   d /usr/share/doc/apr-devel-0.9.4/APRDesign.html

Ownership was determined manually by running an rpm query using selected
files, thusly.

   # rpm --query --file /var/spool/mqueue
   sendmail-8.13.1-3.RHEL4.5.i386
   #

The results were (eventually) saved in a list of all the needed rpm
files.

To help determine that I didn't miss any rpm packages, I would also run
something similar to this.

   # rpm --query sendmail --filesbypkg
   sendmail                  /etc/aliases.db
   sendmail                  /etc/mail
   sendmail                  /etc/mail/Makefile
   sendmail                  /etc/mail/access

So that I could visually make sure I knew where the next package missing
file was in my original list of missing files.

Once I had the complete list of needed rpm files, a simple script did a
wget of the files from a CentOS (and Extras) mirror. The rpms were
converted to cpio files using the utility "rpm2cpio".

I wrote another slightly less simple script that operated over that
list, running cpio extract, and prompted me for glob patterns to select
files to be re-installed for each package. I could manually enter up to
25 match patterns (TG only glibc-common used them all) so that I could
re-install a set of files almost no larger than needed. Since I did not
provide the "u" flag to cpio, it would not replace files that had a
later/equal time stamp, thereby freeing me from worry about locally
modified configuration files. This allowed a more liberal glob pattern,
in many cases, saving some typing.

A short note about the pattern matching: most of the converted cpio
files had relative paths that began "./", while a *few* had just the
relative path name (e.g. "usr/share", no leading "./"). This caused some
delay as multiple extract runs had to be made after investigating
failures. Fortunately, I was logging to files so even vary large
extracts did not scroll off-screen and vanish into the ether.

I'd be glad to annotate and provide my shells if anyone wants them. Keep
in mind they are Q&D status only and no shame or pride is associated
with them.

A recent rpm --verify shows just the normal stuff now, so success was
had (hmm... as long as it took, *I* was had ;-)

HTH someone down the road.
-- 
Bill
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
URL: <http://lists.centos.org/pipermail/centos/attachments/20060712/4b5cde8f/attachment-0005.sig>