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