yumcmd methods

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all, 

working through yumcmd with func over the last couple of days, I've
written an 'install' method, so as skvidal suggested I'm posting it
here. This is the first time I've worked with yum using python so it may
be a tad rough around the edges. At the moment the intent is to have a
yumcmd.install method that takes a 'pattern'  argument, which is split
on whitespace.

I'm not entirely sure what should be returned from such a method.
Ideally I'd like to see it return  
1. The list of packages successfully installed (including deps)
or/and possibly 
2. Those that could not be installed because they are already there!
with optional args to suppress output (kind of like yum does when run
manually)

I'm not sure how to approach the returned info parts (perhaps
yum.tsInfo.pkgdict?).
The current (working) version of yumcmd.py is attached for those more
expert to rip it to bits :)

be nice :)


Stuart
# Copyright 2007, Red Hat, Inc
# James Bowes <jbowes@xxxxxxxxxx>
# Alex Wood <awood@xxxxxxxxxx>
#
# This software may be freely redistributed under the terms of the GNU
# general public license.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

import func_module

import yum

# XXX Use internal yum callback or write a useful one.
class DummyCallback(object):

    def event(self, state, data=None):
        pass

class Yum(func_module.FuncModule):

    version = "0.0.1"
    api_version = "0.1.0"
    description = "Package updates through yum."
    def fake(self):
        return "fake method called"

    def update(self, pkg=None):
        ayum = yum.YumBase()
        ayum.doGenericSetup()
        ayum.doRepoSetup()
        try:
            ayum.doLock()
            if pkg != None:
                tx_result = ayum.update(pattern=pkg)
            else:
                tx_result = ayum.update()

            ayum.buildTransaction()
            ayum.processTransaction(
                    callback=DummyCallback())
        finally:
            ayum.closeRpmDB()
            ayum.doUnlock()
        return map(str, tx_result)

    def check_update(self, filter=[], repo=None):
        """Returns a list of packages due to be updated
           You can specify a filter using the standard yum wildcards
        """
        # parsePackages expects a list and doesn't react well if you send in a plain string with a wildcard in it
        # (the string is broken into a list and one of the list elements is "*" which matches every package)
        if type(filter) not in [list, tuple]:
            filter = [filter]

        ayum = yum.YumBase()
        ayum.doConfigSetup()
        ayum.doTsSetup()
        if repo is not None:
            ayum.repos.enableRepo(repo)

        pkg_list = ayum.doPackageLists('updates').updates

        if filter:
            # exactmatch are all the packages with exactly the same name as one in the filter list
            # matched are all the packages that matched under any wildcards
            # unmatched are all the items in the filter list that didn't match anything
            exactmatch, matched, unmatched = yum.packages.parsePackages(pkg_list, filter)
            pkg_list = exactmatch + matched

        return map(str, pkg_list)

    def install(self, pattern, repo=None):
        """
        Add all packages matching pattern to an installation transaction
        and attempt to run it.
        returns: 'success' or list of packages not installed
        """
        # parse pattern into a list:
        if type(pattern) == str:
            pkgs = pattern.split()
        else:
            return 'invalid pattern. Please provide a space-separated string'

        # set up yum session
        ayum = yum.YumBase()
        ayum.doGenericSetup()
        ayum.doLock()
        
        # if we specified a specific repo, make sure it is enabled:
        if repo is not None:
            ayum.repos.enableRepo(repo)
        # 
        errors = []

        try:
            for pkg in pkgs:
                try:
                    ayum.install(pattern=pkg)
                except YumTestTransactionError, E:
                    errors.append(E)
        # okay, now we have built our transaction set
        # let's do depsolving etc:

            ayum.buildTransaction()
            ayum.processTransaction()

        finally:
            ayum.closeRpmDB()
            ayum.doUnlock()

        if len(errors) > 0:
            return map(str,errors)
        else:
            return 'success!'


    def register_method_args(self):
        """
        Implementing the argument getter
        """

        return {
                'fake' : {
                },
                'update':{
                    'args':{
                        'pkg':{
                            'type':'string',
                            'optional':True,
                            'description':"The yum pattern for updating package"
                            }
                        },
                    'description':"Updating system according to a specified pattern"
                    },
                'check_update':{
                    'args':{
                        'filter':{
                            'type':'list',
                            'optional':True,
                            'description':"A list of what you want to update"
                            },
                        'repo':{
                            'type':'string',
                            'optional':True,
                            'description':'Repo name to use for that update'
                            }
                        },
                    'description':"Cheking for updates with supplied filter patterns and repo"
                    },
                'install' : {
                    'args' : {
                        'pattern' : {
                            'type' : 'string',
                            'optional' : False,
                            'description' : "space separated patterns representing packages to install"
                        },
                        'repo':{
                            'type':'string',
                            'optional':True,
                            'description':'Repo name to use for that update'
                            }
                    },
                'description' : "install packages matching the given patterns"
                }
                }
_______________________________________________
Func-list mailing list
Func-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/func-list

[Index of Archives]     [Fedora Users]     [Linux Networking]     [Fedora Legacy List]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]

  Powered by Linux