def dumpMetalink(self, packages, output=None): if output is None: output = sys.stderr metalink = Metalink() msys = self._fetcher.getMirrorSystem() for pkg in packages: loaders = [x for x in pkg.loaders if not x.getInstalled()] if not loaders: raise Error, _("Package %s is not available for downloading") \ % pkg info = loaders[0].getInfo(pkg) if not info.getURLs(): raise Error, _("Package %s is not available for downloading") \ % pkg for url in info.getURLs(): metafile = Metafile(pkg.name, pkg.version, info.getSummary()) mirror = msys.get(url) mirrorurls = [] mirrorurl = mirror.getNext() while mirrorurl: mirrorurls.append(mirrorurl) mirrorurl = mirror.getNext() metafile.append(mirrorurls, size=info.getSize(url), md5=info.getMD5(url), sha=info.getSHA(url), sha256=info.getSHA256(url)) metalink.append(metafile) if packages: metalink.write(output)
def downloadMetalink(self, metalink, what=None, caching=NEVER, targetdir=None): fetcher = self._fetcher fetcher.reset() self.reloadMirrors() if targetdir is None: localdir = os.path.join(sysconf.get("data-dir"), "tmp/") if not os.path.isdir(localdir): os.makedirs(localdir) fetcher.setLocalDir(localdir, mangle=True) else: fetcher.setLocalDir(targetdir, mangle=False) fetcher.setCaching(caching) for metafile in Metalink.parse(open(metalink)).files(): urls = metafile.urls() info = metafile.info() # TODO: use random url fetcher.enqueue(urls[0], **info) fetcher.run(what=what) return fetcher.getSucceededSet(), fetcher.getFailedSet()