[CentOS] rpm --freshen issue

ken gebser at mousecar.com
Wed Oct 21 23:18:38 UTC 2009

On 10/21/2009 10:03 AM Barry Brimer wrote:
> On Wed, 21 Oct 2009, ken wrote:
>> On 10/20/2009 12:15 PM Benjamin Franz wrote:
>>> ken wrote:
>>>> Okay, here's one. Maybe someone here can figure it out.
>>>> Upgrading from 4.5 to 4.5.  From a 4.6 ISO I copied all the RPMs into a
>>>> directory... let's call it c:/install :).   Now the oracle dba has
>>>> strict parameters on what versions can be installed and which can't.
>>>> The rpms in c:/install meet those requirements.  In addition, since this
>>>> is a production machine, it can be down at most for one day.  So all I
>>>> want to do is upgrade what's currently on the system.  Moreover, if
>>>> something horks, I want two chances to back out (the second being asking
>>>> the backup guy to put the system back to yesterday).  The command to do
>>>> this would be
>>>> rpm --freshen --repackage *
>>>> run in that crazy c:/install directory (or what the redhat guy called, a
>>>> "folder").  This command runs fine for one file which has no
>>>> dependencies (i.e., change '*' to a specific rpm).  It also upgrades
>>>> three or four co-dependent rpms if they're narrowly specified.  But if
>>>> the file/rpm spec is '*', rpm complains about two missing dependencies
>>>> and stops.
>>>> Yeah, this directory contains 1507 rpms (IIRC)... which is a lot, but it
>>>> should still work.  This is Linux, after all.  And there's plenty enough
>>>> memory and cpu to handle it.
>>> Running
>>> rpm --freshen --repackage *
>>> for 1500+ rpms  probably exceeds the maximum character length for some
>>> part of the system after expansion of the '*'  by the shell.
>> That was my first suspicion too.  The redhat tech didn't bring that up
>> though.  (That doesn't mean I'm going to ignore that as a possible
>> workaround; the original conversation here was about tech support per
>> se.  Of course I'm still seeking ways to do the job.  And so thanks for
>> the suggestion.)
>> I, too, recall reading some years back about a bash line length limit.
>> Back then, a long time ago, it was 2048 characters.  So I ran "echo *"
>> in that same install/ directory and the output included all 1507 files.
>> So the problem's not with a bash command line length limit, but still
>> pointing to the "rpm" command.
>>> Try breaking it up into smaller chunks (say two or three hundred at a
>>> time). You can match subsets of the files using shell expansions like
>>> rpm --freshen --repackage [a-g]*
>>> and tweak the line for any dependency complaints manually.
>> This solution occurred to me also.  And right now it's a top contender
>> (along with another I'll mention shortly).  If the job environment were
>> different, I'd go with it.  But my boss is making me jump through a lot
>> of hoops for this project.  This upgrade from v.4.5 to v.4.6 needs to
>> happen in a single, specified day *and* my boss needs to know how long
>> it will take me to accomplish, this so the Oracle dba knows when he can
>> start to on what he's got to do for this upgrade.  And I have at most
>> fifteen hours (i.e., two working days) to come up with this fool-proof
>> plan.  Plus, I don't have a test box to try things out on.  But I've had
>> to do trickier stuff than this in the past with not dissimilar time
>> constraints, so though I should be taking extra boxers to work, I'm not
>> (yet).
>> So what I was thinking of doing is scripting the solution you suggest
>> above.  But then, if I'm going to script something, I might as well
>> write a script that will take on the entire task wholistically.  I mean
>> something like this:
>> ls -1 install/ > what-to-upgrade.list  # create package list
>> while read package | {upgrade package}  #just quasi-code here. Loop.
>> if {there's nothing to upgrade}
>>  remove pkg from what-to-upgrade.list
>>  log this
>>  continue
>> fi
>> if {there are dependencies}
>> then for {each dependency} {upgrade package}  # yep, recursion
>> fi
>> else [upgrade package}         # simplest case, just upgrade one pkg
>> The {upgrade package} function would be fairly simple (I think):
>> - Find the correct package in the install/ directory (containing the
>> RPMs for v.4.6).
>> - Upgrade the 4.5 package with that correct 4.6 package.
>> - Confirm that the 4.6 is installed.
>> - Remove that package name from what-to-upgrade.list
>> - Log that this package has been upgraded.
>> I already see some bogus stuff here, but I'm writing this on the fly.
>> Point is, it seems do-able, and probably within the time constraints.
>> And then, what are the alternatives?
>> One, suggested by the redhat tech (about whom there's more news...
>> later), is to use up2date.  I read the manpage on it and it's pretty
>> vague.  I'm sure I have, but I don't recall using it before, so I can't
>> fill in the details which the manpage lacks.  Lastly, I don't see a way
>> to test up2date to see if it will work within my (dba's) specific
>> parameters.
> If you add --aid on the end of your rpm command, and you are in the 
> directory with the rpms, it should solve any dependency issues for you 
> provided that the rpms that are needed are in the local directory.  If a 
> pendency is resolved by something that you later try to upgrade i *think* 
> rpm will just tell you that that particular package is already installed. 
> I could be wrong.  Either way .. try the --aid.  Also, don't forget that 
> you can add the --test flag to rpm to find out if rpm will work or not.
> Hope this helps,
> Barry


In fact I tried that at work today (at the suggestion of a redhat tech),
but no go.  I don't understand why.  According to the docs, it should...
but it simply didn't.  But you are correct about the --test option.
It's worked fine for days (at least :).  Good thing too, as I don't have
a development box to do any testing on.

Thanks for the reply though.  People on this list are really great folk.


More information about the CentOS mailing list