def digestCheck(self, pkg): """ Verify digests for the given package and raise DigestException if verification fails. @rtype: bool @returns: True if digests could be located, False otherwise. """ cpv = pkg if not isinstance(cpv, basestring): cpv = pkg.cpv pkg = None pkg_path = self.getname(cpv) metadata = None if self._remotepkgs is None or cpv not in self._remotepkgs: for d in self._load_pkgindex().packages: if d["CPV"] == cpv: metadata = d break else: metadata = self._remotepkgs[cpv] if metadata is None: return False digests = {} from portage.checksum import hashfunc_map, verify_all for k in hashfunc_map: v = metadata.get(k) if not v: continue digests[k] = v if "SIZE" in metadata: try: digests["size"] = int(metadata["SIZE"]) except ValueError: writemsg(_("!!! Malformed SIZE attribute in remote " \ "metadata for '%s'\n") % cpv) if not digests: return False eout = EOutput() eout.quiet = self.settings.get("PORTAGE_QUIET") == "1" ok, st = _check_distfile(pkg_path, digests, eout, show_errors=0) if not ok: ok, reason = verify_all(pkg_path, digests) if not ok: raise portage.exception.DigestException( (pkg_path,) + tuple(reason)) return True
def _check_already_fetched(self, settings, uri_map): digests = self._get_digests() distdir = settings["DISTDIR"] allow_missing = self._get_manifest().allow_missing for filename in uri_map: # Use stat rather than lstat since fetch() creates # symlinks when PORTAGE_RO_DISTDIRS is used. try: st = os.stat(os.path.join(distdir, filename)) except OSError: return False if st.st_size == 0: return False expected_size = digests.get(filename, {}).get('size') if expected_size is None: continue if st.st_size != expected_size: return False hash_filter = _hash_filter(settings.get("PORTAGE_CHECKSUM_FILTER", "")) if hash_filter.transparent: hash_filter = None stdout_orig = sys.stdout stderr_orig = sys.stderr global_havecolor = portage.output.havecolor out = io.StringIO() eout = portage.output.EOutput() eout.quiet = settings.get("PORTAGE_QUIET") == "1" success = True try: sys.stdout = out sys.stderr = out if portage.output.havecolor: portage.output.havecolor = not self.background for filename in uri_map: mydigests = digests.get(filename) if mydigests is None: if not allow_missing: success = False break continue ok, st = _check_distfile(os.path.join(distdir, filename), mydigests, eout, show_errors=False, hash_filter=hash_filter) if not ok: success = False break except portage.exception.FileNotFound: # A file disappeared unexpectedly. return False finally: sys.stdout = stdout_orig sys.stderr = stderr_orig portage.output.havecolor = global_havecolor if success: # When returning unsuccessfully, no messages are produced, since # we assume that a fetcher process will later be executed in order # to produce such messages. msg = out.getvalue() if msg: self.scheduler.output(msg, log_path=self.logfile) return success
def already_fetched(self, settings): """ Returns True if all files already exist locally and have correct digests, otherwise return False. When returning True, appropriate digest checking messages are produced for display and/or logging. When returning False, no messages are produced, since we assume that a fetcher process will later be executed in order to produce such messages. This will raise InvalidDependString if SRC_URI is invalid. """ uri_map = self._get_uri_map() if not uri_map: return True digests = self._get_digests() distdir = settings["DISTDIR"] allow_missing = self._get_manifest().allow_missing for filename in uri_map: # Use stat rather than lstat since fetch() creates # symlinks when PORTAGE_RO_DISTDIRS is used. try: st = os.stat(os.path.join(distdir, filename)) except OSError: return False if st.st_size == 0: return False expected_size = digests.get(filename, {}).get('size') if expected_size is None: continue if st.st_size != expected_size: return False hash_filter = _hash_filter(settings.get("PORTAGE_CHECKSUM_FILTER", "")) if hash_filter.transparent: hash_filter = None stdout_orig = sys.stdout stderr_orig = sys.stderr global_havecolor = portage.output.havecolor out = io.StringIO() eout = portage.output.EOutput() eout.quiet = settings.get("PORTAGE_QUIET") == "1" success = True try: sys.stdout = out sys.stderr = out if portage.output.havecolor: portage.output.havecolor = not self.background for filename in uri_map: mydigests = digests.get(filename) if mydigests is None: if not allow_missing: success = False break continue ok, st = _check_distfile(os.path.join(distdir, filename), mydigests, eout, show_errors=False, hash_filter=hash_filter) if not ok: success = False break except portage.exception.FileNotFound: # A file disappeared unexpectedly. return False finally: sys.stdout = stdout_orig sys.stderr = stderr_orig portage.output.havecolor = global_havecolor if success: # When returning unsuccessfully, no messages are produced, since # we assume that a fetcher process will later be executed in order # to produce such messages. msg = out.getvalue() if msg: self.scheduler.output(msg, log_path=self.logfile) return success
def already_fetched(self, settings): """ Returns True if all files already exist locally and have correct digests, otherwise return False. When returning True, appropriate digest checking messages are produced for display and/or logging. When returning False, no messages are produced, since we assume that a fetcher process will later be executed in order to produce such messages. This will raise InvalidDependString if SRC_URI is invalid. """ uri_map = self._get_uri_map() if not uri_map: return True digests = self._get_digests() distdir = settings["DISTDIR"] allow_missing = self._get_manifest().allow_missing for filename in uri_map: # Use stat rather than lstat since fetch() creates # symlinks when PORTAGE_RO_DISTDIRS is used. try: st = os.stat(os.path.join(distdir, filename)) except OSError: return False if st.st_size == 0: return False expected_size = digests.get(filename, {}).get('size') if expected_size is None: continue if st.st_size != expected_size: return False stdout_orig = sys.stdout stderr_orig = sys.stderr global_havecolor = portage.output.havecolor out = io.StringIO() eout = portage.output.EOutput() eout.quiet = settings.get("PORTAGE_QUIET") == "1" success = True try: sys.stdout = out sys.stderr = out if portage.output.havecolor: portage.output.havecolor = not self.background for filename in uri_map: mydigests = digests.get(filename) if mydigests is None: if not allow_missing: success = False break continue ok, st = _check_distfile(os.path.join(distdir, filename), mydigests, eout, show_errors=False) if not ok: success = False break except portage.exception.FileNotFound: # A file disappeared unexpectedly. return False finally: sys.stdout = stdout_orig sys.stderr = stderr_orig portage.output.havecolor = global_havecolor if success: # When returning unsuccessfully, no messages are produced, since # we assume that a fetcher process will later be executed in order # to produce such messages. msg = out.getvalue() if msg: self.scheduler.output(msg, log_path=self.logfile) return success