Ejemplo n.º 1
0
    def update_caches(self):
        for r in self.config['releases']:
            fedora_release = str(r['version'])
            cachedir = os.path.join(self.get_cache_path(), "tmp",
                                    fedora_release)
            metadatadir = os.path.join(self.get_metadata_path(),
                                       fedora_release)

            if r.get('development'):
                repo_url = "http://dl.fedoraproject.org/pub/fedora/linux/development/%s/x86_64/os/" % (
                    fedora_release)
            else:
                repo_url = "http://dl.fedoraproject.org/pub/fedora/linux/releases/%s/Fedora/x86_64/os/" % (
                    fedora_release)

            metadata = RpmMd(repo_url, cachedir)
            try:
                metadata.fetch_and_parse()
            except RpmMdException as e:
                metadata.cleanup()
                print(e)
                sys.exit(2)

            outdir = os.path.join(self.get_cache_path(), "packages",
                                  fedora_release)
            metadata.export_data(fedora_release, "fedora", outdir=outdir)
            metadata.cleanup(keep_cache=True)

            # download AppStream data
            urlpath = urlopen(os.path.join(repo_url, "Packages/a/"))
            p_index = urlpath.read().decode('utf-8')

            pattern = re.compile('appstream-data.*.noarch.rpm"')
            filelist = pattern.findall(p_index)
            if not filelist:
                continue

            filename = filelist[0][:-1]
            remotefile = urlopen(
                os.path.join(repo_url, "Packages/a/", filename))

            tmpfile = os.path.join(cachedir, filename)
            localfile = open(tmpfile, 'w')
            localfile.write(remotefile.read())
            remotefile.close()
            localfile.close()

            common_prefix = "./usr/share/app-info/"
            with libarchive.SeekableArchive(tmpfile) as a:
                for entry in a:
                    path = os.path.join(
                        metadatadir,
                        os.path.relpath(entry.pathname, common_prefix))
                    if entry.isdir():
                        if not os.path.exists(path):
                            os.makedirs(path)
                    else:
                        f = open(path, 'wb')
                        f.write(a.read(entry.pathname))
                        f.close()
Ejemplo n.º 2
0
    def __init__(self, f, mode='r', format=None, thread_synchronize=True):
        """Create a FS that maps on to an archive file.

        :param f: a (system) path, or a file-like object
        :param format: required for 'w' mode. The archive format ('zip, 'tar', etc)
        :param thread_synchronize: set to True (default) to enable thread-safety
        """
        super(ArchiveFS, self).__init__(thread_synchronize=thread_synchronize)
        if isinstance(f, str):
            self.fileobj = None
            self.root_path = f
        else:
            self.fileobj = f
            self.root_path = getattr(f, 'name', None)
        self.contents = PathMap()
        self.archive = libarchive.SeekableArchive(f, format=format, mode=mode)
        if 'r' in mode:
            for item in self.archive:
                for part in recursepath(item.pathname)[1:]:
                    part = relpath(part)
                    if part == item.pathname:
                        self.contents[part] = item
                    else:
                        self.contents[part] = libarchive.Entry(
                            pathname=part,
                            mode=stat.S_IFDIR,
                            size=0,
                            mtime=item.mtime)