Description of problem: Pup's handling of network unavailability is poor. When trying to run updates today, I didn't realize my network cable was unplugged, and Pup gave me the following error when I tried running it: Component: Software Updater Summary: TB429a3a99 yumRepo.py:593:setup:RepoError: Cannot open/read repomd.xml file for repository: extras-development Traceback (most recent call last): File "/usr/sbin/pup", line 647, in <module> main() File "/usr/sbin/pup", line 640, in main pup = PackageUpdater(not options.autoapply) File "/usr/sbin/pup", line 88, in __init__ GraphicalYumBase.__init__(self, False) File "/usr/lib/python2.5/site-packages/pirut/__init__.py", line 120, in __init__ plugin_types=(yum.plugins.TYPE_CORE,)) File "/usr/lib/python2.5/site-packages/yum/__init__.py", line 103, in doConfigSetup errorlevel=errorlevel) File "/usr/lib/python2.5/site-packages/yum/__init__.py", line 158, in _getConfig self.plugins.run('init') File "/usr/lib/python2.5/site-packages/yum/plugins.py", line 162, in run func(conduitcls(self, self.base, conf, **kwargs)) File "/usr/lib/yum-plugins/dellsysidplugin.py", line 40, in init_hook repos = conduit.getRepos() File "/usr/lib/python2.5/site-packages/yum/plugins.py", line 426, in getRepos return self._base.repos File "/usr/lib/python2.5/site-packages/yum/__init__.py", line 493, in <lambda> repos = property(fget=lambda self: self._getRepos(), File "/usr/lib/python2.5/site-packages/yum/__init__.py", line 335, in _getRepos repo.setup(self.conf.cache, self.mediagrabber) File "/usr/lib/python2.5/site-packages/yum/yumRepo.py", line 593, in setup raise Errors.RepoError, ('Cannot open/read repomd.xml file for repository: %s' % self) RepoError: Cannot open/read repomd.xml file for repository: extras-development Local variables in innermost frame: self: extras-development cache: 0 e: failure: repodata/repomd.xml from extras-development: [Errno 256] No more mirrors to try. mediafunc: None Version-Release number of selected component (if applicable): 1.3.6-1 How reproducible: 100% Steps to Reproduce: 1.Disconnect from the network 2.Run pup Actual results: Get user-worthless error message Expected results: A user-useful error message saying, "Your network connection appears to be offline - updates cannot be made while offline" or some such. Additional info: This is just a cheerleader aside, but it seems like Pirut and Pup get a lot of mud slung at them, so I wanted to say that the UNBELIEVABLE speed increases and actually-updating-UI in the recent pirut releases have been awesome. You guys rock! :)
Hrmm... it looks like this is because the dellsysid plugin does repo initialization really early and without any explicit request for the setup. Michael -- is there a reason that the plugin has to set up repos in its init hook? I'd look, but CVS seems down at the moment.
I have asked for a 'yumvar' hook. This would vastly simplify my plugin, and eliminate the need for 'getRepos()'. With the current yum design, I *must* do this loop in order to update the cached copy of 'yumvars' that is held in each repo. I also must manually fixup the mirrorlist because my plugin runs too late. This all goes away if I get a 'yumvars' plugin hook, as described on the mailing list.
If you can suggest an alternate way, I would be happy to also change the current code. Current code does this: repos = conduit.getRepos() for repo in repos.findRepos('*'): repo.yumvar.update(conf.yumvar) # re-process mirrorlist (it isnt varReplaced like baseUrl is) for repo in repos.findRepos('*'): try: # yum 3.0+ if repo.mirrorlist: for (key, value) in conf.yumvar.items(): repo.mirrorlist = repo.mirrorlist.replace("$%s" % key, value) except AttributeError: pass try: # yum 2.4.3 if repo.mirrorlistfn: for (key, value) in conf.yumvar.items(): repo.mirrorlistfn = repo.mirrorlistfn.replace("$%s" % key, value) except AttributeError: pass
Added a hook for the plugin which should let the plugin do its setup differently and thus not set up repos before expected.