示例#1
0
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()