Пример #1
0
    def verify(self, checksum=None):
        _dlsize = getsize(self._destination)
        if self.get_size() != -1 and _dlsize != self.get_size():
            raise PackageException(
                ("The size ({0:d} bytes) of downloaded file '{1}' "
                 "is not equal to remote size ({2:d} bytes)").format(
                     _dlsize, self._fname, self.get_size()))
        if not checksum:
            return True

        checksum_len = len(checksum)
        hash_algo = None
        if checksum_len == 32:
            hash_algo = "md5"
        elif checksum_len == 40:
            hash_algo = "sha1"
        elif checksum_len == 64:
            hash_algo = "sha256"

        if not hash_algo:
            raise PackageException(
                "Could not determine checksum algorithm by %s" % checksum)

        dl_checksum = fs.calculate_file_hashsum(hash_algo, self._destination)
        if checksum.lower() != dl_checksum.lower():
            raise PackageException(
                "The checksum '{0}' of the downloaded file '{1}' "
                "does not match to the remote '{2}'".format(
                    dl_checksum, self._fname, checksum))
        return True
Пример #2
0
 def _init_archiver(self):
     magic_map = {
         b"\x1f\x8b\x08": TARArchiver,
         b"\x42\x5a\x68": TARArchiver,
         b"\x50\x4b\x03\x04": ZIPArchiver,
     }
     magic_len = max(len(k) for k in magic_map)
     with open(self.path, "rb") as fp:
         data = fp.read(magic_len)
         for magic, archiver in magic_map.items():
             if data.startswith(magic):
                 return archiver(self.path)
     raise PackageException("Unknown archive type '%s'" % self.path)
Пример #3
0
    def find_source_root(self, src):
        if self.manifest_uri:
            mp = (ManifestParserFactory.new_from_file(self.manifest_uri[5:])
                  if self.manifest_uri.startswith("file:") else
                  ManifestParserFactory.new_from_url(self.manifest_uri))
            manifest = ManifestSchema().load_manifest(mp.as_dict())
            include = manifest.get("export", {}).get("include", [])
            if len(include) == 1:
                if not os.path.isdir(os.path.join(src, include[0])):
                    raise PackageException(
                        "Non existing `include` directory `%s` in a package" %
                        include[0])
                return os.path.join(src, include[0])

        for root, _, __ in os.walk(src):
            if ManifestFileType.from_dir(root):
                return root

        return src
Пример #4
0
    def __init__(self, url, dest_dir=None):
        self._request = None
        # make connection
        self._request = requests.get(
            url,
            stream=True,
            headers={"User-Agent": app.get_user_agent()},
            timeout=__default_requests_timeout__,
        )
        if self._request.status_code != 200:
            raise PackageException(
                "Got the unrecognized status code '{0}' when downloaded {1}".
                format(self._request.status_code, url))

        disposition = self._request.headers.get("content-disposition")
        if disposition and "filename=" in disposition:
            self._fname = (disposition[disposition.index("filename=") +
                                       9:].replace('"', "").replace("'", ""))
        else:
            self._fname = [p for p in url.split("/") if p][-1]
        self._fname = str(self._fname)
        self._destination = self._fname
        if dest_dir:
            self.set_destination(join(dest_dir, self._fname))
Пример #5
0
    def _install(  # pylint: disable=too-many-arguments
        self,
        spec,
        search_filters=None,
        silent=False,
        skip_dependencies=False,
        force=False,
    ):
        spec = self.ensure_spec(spec)

        # avoid circle dependencies
        if not self._INSTALL_HISTORY:
            self._INSTALL_HISTORY = {}
        if spec in self._INSTALL_HISTORY:
            return self._INSTALL_HISTORY[spec]

        # check if package is already installed
        pkg = self.get_package(spec)

        # if a forced installation
        if pkg and force:
            self.uninstall(pkg, silent=silent)
            pkg = None

        if pkg:
            if not silent:
                self.print_message(
                    "{name} @ {version} is already installed".format(
                        **pkg.metadata.as_dict()),
                    fg="yellow",
                )
            return pkg

        if not silent:
            self.print_message("Installing %s" %
                               click.style(spec.humanize(), fg="cyan"))

        if spec.external:
            pkg = self.install_from_url(spec.url, spec, silent=silent)
        else:
            pkg = self.install_from_registry(spec,
                                             search_filters,
                                             silent=silent)

        if not pkg or not pkg.metadata:
            raise PackageException(
                "Could not install package '%s' for '%s' system" %
                (spec.humanize(), util.get_systype()))

        if not silent:
            self.print_message(
                "{name} @ {version} has been installed!".format(
                    **pkg.metadata.as_dict()),
                fg="green",
            )

        self.memcache_reset()
        if not skip_dependencies:
            self.install_dependencies(pkg, silent)
        self._INSTALL_HISTORY[spec] = pkg
        return pkg
Пример #6
0
    def _install_tmp_pkg(self, tmp_pkg):
        assert isinstance(tmp_pkg, PackageItem)
        # validate package version and declared requirements
        if (tmp_pkg.metadata.spec.requirements and tmp_pkg.metadata.version
                not in tmp_pkg.metadata.spec.requirements):
            raise PackageException(
                "Package version %s doesn't satisfy requirements %s based on %s"
                % (
                    tmp_pkg.metadata.version,
                    tmp_pkg.metadata.spec.requirements,
                    tmp_pkg.metadata,
                ))
        dst_pkg = PackageItem(
            os.path.join(self.package_dir, tmp_pkg.get_safe_dirname()))

        # what to do with existing package?
        action = "overwrite"
        if tmp_pkg.metadata.spec.has_custom_name():
            action = "overwrite"
            dst_pkg = PackageItem(
                os.path.join(self.package_dir, tmp_pkg.metadata.spec.name))
        elif dst_pkg.metadata:
            if dst_pkg.metadata.spec.external:
                if dst_pkg.metadata.spec.url != tmp_pkg.metadata.spec.url:
                    action = "detach-existing"
            elif (dst_pkg.metadata.version != tmp_pkg.metadata.version or
                  dst_pkg.metadata.spec.owner != tmp_pkg.metadata.spec.owner):
                action = ("detach-existing" if
                          tmp_pkg.metadata.version > dst_pkg.metadata.version
                          else "detach-new")

        def _cleanup_dir(path):
            if os.path.isdir(path):
                fs.rmtree(path)

        if action == "detach-existing":
            target_dirname = "%s@%s" % (
                tmp_pkg.get_safe_dirname(),
                dst_pkg.metadata.version,
            )
            if dst_pkg.metadata.spec.url:
                target_dirname = "%s@src-%s" % (
                    tmp_pkg.get_safe_dirname(),
                    hashlib.md5(
                        compat.hashlib_encode_data(
                            dst_pkg.metadata.spec.url)).hexdigest(),
                )
            # move existing into the new place
            pkg_dir = os.path.join(self.package_dir, target_dirname)
            _cleanup_dir(pkg_dir)
            shutil.move(dst_pkg.path, pkg_dir)
            # move new source to the destination location
            _cleanup_dir(dst_pkg.path)
            shutil.move(tmp_pkg.path, dst_pkg.path)
            return PackageItem(dst_pkg.path)

        if action == "detach-new":
            target_dirname = "%s@%s" % (
                tmp_pkg.get_safe_dirname(),
                tmp_pkg.metadata.version,
            )
            if tmp_pkg.metadata.spec.external:
                target_dirname = "%s@src-%s" % (
                    tmp_pkg.get_safe_dirname(),
                    hashlib.md5(
                        compat.hashlib_encode_data(
                            tmp_pkg.metadata.spec.url)).hexdigest(),
                )
            pkg_dir = os.path.join(self.package_dir, target_dirname)
            _cleanup_dir(pkg_dir)
            shutil.move(tmp_pkg.path, pkg_dir)
            return PackageItem(pkg_dir)

        # otherwise, overwrite existing
        _cleanup_dir(dst_pkg.path)
        shutil.move(tmp_pkg.path, dst_pkg.path)
        return PackageItem(dst_pkg.path)