class YumRepoGrinder(object): """ Driver module to initiate the repo fetching """ def __init__(self, repo_label, repo_url, parallel, mirrors=None, \ cacert=None, clicert=None, clikey=None): self.repo_label = repo_label self.repo_url = repo_url self.mirrors = mirrors self.numThreads = int(parallel) self.fetchPkgs = None self.downloadinfo = [] self.yumFetch = None self.sslcacert = cacert self.sslclientcert = clicert self.sslclientkey = clikey def prepareRPMS(self): pkglist = self.yumFetch.getPackageList() for pkg in pkglist: info = {} #urljoin doesnt like epoch in rpm name so using string concat info['fileName'] = pkg.__str__() + ".rpm" info['downloadurl'] = self.yumFetch.repourl + '/' + pkg.relativepath info['savepath'] = self.yumFetch.repo_dir + '/' + os.path.dirname(pkg.relativepath) info['checksumtype'], info['checksum'], status = pkg.checksums[0] info['size'] = pkg.size self.downloadinfo.append(info) LOG.info("%s packages have been marked to be fetched" % len(pkglist)) def prepareDRPMS(self): deltarpms = self.yumFetch.getDeltaPackageList() if not deltarpms: return for dpkg in deltarpms: info = {} relativepath = dpkg.deltas.values()[0].filename info['fileName'] = dpkg.deltas.values()[0].filename info['downloadurl'] = self.yumFetch.repourl + '/' + relativepath info['savepath'] = self.yumFetch.repo_dir + '/' + os.path.dirname(relativepath) info['checksumtype'] = dpkg.deltas.values()[0].checksum_type info['checksum'] = dpkg.deltas.values()[0].checksum info['size'] = dpkg.deltas.values()[0].size self.downloadinfo.append(info) LOG.info("%s delta rpms have been marked to be fetched" % len(deltarpms)) def fetchYumRepo(self, basepath="./"): startTime = time.time() self.yumFetch = RepoFetch(self.repo_label, repourl=self.repo_url, \ cacert=self.sslcacert, clicert=self.sslclientcert, \ clikey=self.sslclientkey, mirrorlist=self.mirrors, \ download_dir=basepath) self.yumFetch.setupRepo() LOG.info("Fetching repo metadata...") # first fetch the metadata self.yumFetch.getRepoData() LOG.info("Determining downloadable Content bits...") # get rpms to fetch self.prepareRPMS() # get drpms to fetch self.prepareDRPMS() # prepare for download self.fetchPkgs = ParallelFetch(self.yumFetch, self.numThreads) self.fetchPkgs.addItemList(self.downloadinfo) self.fetchPkgs.start() report = self.fetchPkgs.waitForFinish() endTime = time.time() LOG.info("Processed <%s> packages in [%d] seconds" % (len(self.downloadinfo), \ (endTime - startTime))) return report def stop(self): if self.fetchPkgs: self.fetchPkgs.stop()