Rice University logo
 
Top blue bar image
A place to post stuff
 

Posts Tagged ‘yum’


Abusing Yum to Downgrade to a Specific Update in RHEL

January 28th, 2013 by chwilk

Sometimes it just doesn’t pay to keep your machines up to date…

In the case that you must force a machine back to a previous update of RHEL (e.g. latest X.Y introduces a bug, and you want to revert to X.(Y-1) ), it isn’t easy to drop an update.

In Fedora, (and copied to RHEL, but somewhat useless by default) you can use something to the effect of

yum --releasever=X-1 distro-sync

Unfortunately, this only works for major version shifts.

If you want to do this in RHEL to hit a specific point release, you must play with some repos.

These instructions assume you have a satellite and can create kickstart profiles therein.

Edit a kickstart profile and set it back to the release you want. Also select any extra repositories you may have access to (e.g. supplementary, optional) then look at the kickstart script it generates. Find the URL for install and any repo you’ve added, then create a .repo file in /etc/yum.repos.d/ for those repositories. Name each repo in a globbable format, e.g. rhel-downgrade-X-Y rhel-downgrade-X-Y-optional…

Now the moment of truth.

yum --disablerepo \* --enablerepo rhel-downgrade-X-Y\* distro-sync

You can also specify specific yum groups and individual rpms on the command line to just downgrade a particular subsystem, as long as it doesn’t have firm dependencies into the rest of the OS.

Python Yum Fun 2: Kickstart List

May 29th, 2012 by chwilk

Need to create a Red Hat kickstart config to duplicate the installed packages off an existing system? Want to do this without having to create a giant file listing each RPM by hand?

Here’s a python script that will pull your installed packages list and prune it down by dependencies and yum groups, and give you a (hopefully) concise list of yum groups and RPMs that will work in a kickstart config file. The only complication is that you’ll need to ensure all your yum repositories are available at kickstart time, else you may run into some RPMs that are not available.

#!/usr/bin/env python
import yum

yb = yum.YumBase()
yb.doConfigSetup()
yb.doTsSetup()
yb.doRpmDBSetup()
    
# Grab Installed Package List (ipl)
ipl=set([pkg[0] for pkg in yb.rpmdb.pkglist])
grppkgs = set([])
# Grab Group List (gl)
gl=yb.doGroupLists()
# First index of gl is Installed Group List (igl)
igl=gl[0]

# Make sure we still are accounting for Core (sometimes packages get removed)
gotcore = False
for grp in igl:
    if grp.groupid == 'core': gotcore = True

if not gotcore:
    for grp in gl[1]:
        if grp.groupid == 'core':
           igl.append(grp)

# Find leaves of dependency tree
loners = ipl.copy()
for pkg in list(loners):
    deps= yb.findDeps(yb.returnInstalledPackagesByDep(pkg)).values()[0].keys()
    for dep in [d[0] for d in deps] :
        if dep in loners:
            loners.remove(pkg)
            break

# Print a kickstartable group list first
for grp in igl:
    for pkg in grp.mandatory_packages:
        if pkg in loners:
            loners.remove(pkg)
    for pkg in grp.default_packages:
        if pkg in loners:
            loners.remove(pkg)
    print '@'+grp.groupid

# Print rpms not pruned already
for pkg in loners:
   print pkg

Python Yum Fun 1: Kickstartable Grouplist

May 17th, 2012 by chwilk

Here’s a short python code to load up the local yum database, grab the list of yum groups, and print installed and available groups by short names (which can be used in kickstart scripts more easily than the output of yum grouplist.)

#!/usr/bin/env python
import yum
import sys

if __name__ == "__main__":
    yb = yum.YumBase()
    yb.doConfigSetup()
    yb.doTsSetup()
    yb.doRpmDBSetup()
    
    # Grab Group List (gl)
    gl=yb.doGroupLists()
    # First index of gl is Installed Group List (igl)
    igl=gl[0]
    # Second index of gl is Available Group List (agl)
    agl=gl[1]
    
    # Print a kickstartable group list
    print "Installed groups:\n"
    for grp in igl:
        print "@" + grp.groupid + ": '" + grp.name + "'"

    print "Available groups:\n"
    for grp in agl:
        print "@" + grp.groupid + ": '" + grp.name + "'"


Thanks to the for publishing a great starting point to yum python programming.