Пример #1
0
 def _unregister(self):
     SubProcess._unregister(self)
     if self.cgroup is not None:
         self._cgroup_cleanup()
         self.cgroup = None
     if self._main_task is not None:
         self._main_task.done() or self._main_task.cancel()
Пример #2
0
    def _async_waitpid_cb(self, *args, **kwargs):
        """
        Override _async_waitpid_cb to perform cleanup that is
        not necessarily idempotent.
        """
        SubProcess._async_waitpid_cb(self, *args, **kwargs)
        # self._raw_metadata is None when _start returns
        # early due to an unsupported EAPI
        if self.returncode == os.EX_OK and self._raw_metadata is not None:
            metadata_lines = _unicode_decode(
                b"".join(self._raw_metadata),
                encoding=_encodings["repo.content"],
                errors="replace",
            ).splitlines()
            metadata = {}
            metadata_valid = True
            for l in metadata_lines:
                if "=" not in l:
                    metadata_valid = False
                    break
                key, value = l.split("=", 1)
                metadata[key] = value

            if metadata_valid:
                parsed_eapi = self._eapi
                if parsed_eapi is None:
                    parsed_eapi = "0"
                self.eapi_supported = portage.eapi_is_supported(
                    metadata["EAPI"])
                if (not metadata["EAPI"] or self.eapi_supported
                    ) and metadata["EAPI"] != parsed_eapi:
                    self._eapi_invalid(metadata)
                    metadata_valid = False

            if metadata_valid:
                # Since we're supposed to be able to efficiently obtain the
                # EAPI from _parse_eapi_ebuild_head, we don't write cache
                # entries for unsupported EAPIs.
                if self.eapi_supported:

                    if metadata.get("INHERITED", False):
                        metadata[
                            "_eclasses_"] = self.portdb.repositories.get_repo_for_location(
                                self.repo_path).eclass_db.get_eclass_data(
                                    metadata["INHERITED"].split())
                    else:
                        metadata["_eclasses_"] = {}
                    metadata.pop("INHERITED", None)

                    # If called by egencache, this cache write is
                    # undesirable when metadata-transfer is disabled.
                    if self.write_auxdb is not False:
                        self.portdb._write_cache(self.cpv, self.repo_path,
                                                 metadata, self.ebuild_hash)
                else:
                    metadata = {"EAPI": metadata["EAPI"]}
                self.metadata = metadata
            else:
                self.returncode = 1
Пример #3
0
 def _unregister(self):
     SubProcess._unregister(self)
     if self.cgroup is not None:
         self._cgroup_cleanup()
         self.cgroup = None
     if self._pipe_logger is not None:
         self._pipe_logger.cancel()
         self._pipe_logger = None
Пример #4
0
	def _unregister(self):
		SubProcess._unregister(self)
		if self.cgroup is not None:
			self._cgroup_cleanup()
			self.cgroup = None
		if self._pipe_logger is not None:
			self._pipe_logger.cancel()
			self._pipe_logger = None
Пример #5
0
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)
		# self._raw_metadata is None when _start returns
		# early due to an unsupported EAPI
		if self.returncode == os.EX_OK and \
			self._raw_metadata is not None:
			metadata_lines = _unicode_decode(b''.join(self._raw_metadata),
				encoding=_encodings['repo.content'],
				errors='replace').splitlines()
			metadata_valid = True
			if len(portage.auxdbkeys) != len(metadata_lines):
				# Don't trust bash's returncode if the
				# number of lines is incorrect.
				metadata_valid = False
			else:
				metadata = dict(zip(portage.auxdbkeys, metadata_lines))
				parsed_eapi = self._eapi
				if parsed_eapi is None:
					parsed_eapi = "0"
				self.eapi_supported = \
					portage.eapi_is_supported(metadata["EAPI"])
				if (not metadata["EAPI"] or self.eapi_supported) and \
					metadata["EAPI"] != parsed_eapi:
					self._eapi_invalid(metadata)
					metadata_valid = False

			if metadata_valid:
				# Since we're supposed to be able to efficiently obtain the
				# EAPI from _parse_eapi_ebuild_head, we don't write cache
				# entries for unsupported EAPIs.
				if self.eapi_supported:

					if metadata.get("INHERITED", False):
						metadata["_eclasses_"] = \
							self.portdb.repositories.get_repo_for_location(
							self.repo_path).eclass_db.get_eclass_data(
							metadata["INHERITED"].split())
					else:
						metadata["_eclasses_"] = {}
					metadata.pop("INHERITED", None)

					if eapi_has_automatic_unpack_dependencies(metadata["EAPI"]):
						repo = self.portdb.repositories.get_name_for_location(self.repo_path)
						unpackers = self.settings.unpack_dependencies.get(repo, {}).get(metadata["EAPI"], {})
						unpack_dependencies = extract_unpack_dependencies(metadata["SRC_URI"], unpackers)
						if unpack_dependencies:
							metadata["DEPEND"] += (" " if metadata["DEPEND"] else "") + unpack_dependencies

					# If called by egencache, this cache write is
					# undesirable when metadata-transfer is disabled.
					if self.write_auxdb is not False:
						self.portdb._write_cache(self.cpv,
							self.repo_path, metadata, self.ebuild_hash)
				else:
					metadata = {"EAPI": metadata["EAPI"]}
				self.metadata = metadata
			else:
				self.returncode = 1
Пример #6
0
	def _cancel(self):
		if self._main_task is not None:
			if not self._main_task.done():
				if self._main_task_cancel is not None:
					self._main_task_cancel()
					self._main_task_cancel = None
				self._main_task.cancel()
		SubProcess._cancel(self)
		self._cgroup_cleanup()
Пример #7
0
	def _waitpid_loop(self):
		SubProcess._waitpid_loop(self)

		pipe_logger = self._pipe_logger
		if pipe_logger is not None:
			self._pipe_logger = None
			pipe_logger.removeExitListener(self._pipe_logger_exit)
			pipe_logger.cancel()
			pipe_logger.wait()
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)
		if self.returncode == os.EX_OK:
			metadata_lines = ''.join(_unicode_decode(chunk,
				encoding=_encodings['repo.content'], errors='replace')
				for chunk in self._raw_metadata).splitlines()
			if len(portage.auxdbkeys) != len(metadata_lines):
				# Don't trust bash's returncode if the
				# number of lines is incorrect.
				self.returncode = 1
			else:
				metadata = zip(portage.auxdbkeys, metadata_lines)
				self.metadata = self.metadata_callback(self.cpv,
					self.ebuild_path, self.repo_path, metadata,
					self.ebuild_mtime)
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)
		# self._raw_metadata is None when _start returns
		# early due to an unsupported EAPI detected with
		# FEATURES=parse-eapi-ebuild-head
		if self.returncode == os.EX_OK and \
			self._raw_metadata is not None:
			metadata_lines = _unicode_decode(b''.join(self._raw_metadata),
				encoding=_encodings['repo.content'],
				errors='replace').splitlines()
			if len(portage.auxdbkeys) != len(metadata_lines):
				# Don't trust bash's returncode if the
				# number of lines is incorrect.
				self.returncode = 1
			else:
				metadata = zip(portage.auxdbkeys, metadata_lines)
				self.metadata = self.metadata_callback(self.cpv,
					self.repo_path, metadata, self.ebuild_hash)
Пример #10
0
 def _set_returncode(self, wait_retval):
     SubProcess._set_returncode(self, wait_retval)
     if self.returncode == os.EX_OK:
         metadata_lines = ''.join(
             _unicode_decode(chunk,
                             encoding=_encodings['repo.content'],
                             errors='replace')
             for chunk in self._raw_metadata).splitlines()
         if len(portage.auxdbkeys) != len(metadata_lines):
             # Don't trust bash's returncode if the
             # number of lines is incorrect.
             self.returncode = 1
         else:
             metadata = zip(portage.auxdbkeys, metadata_lines)
             self.metadata = self.metadata_callback(self.cpv,
                                                    self.ebuild_path,
                                                    self.repo_path,
                                                    metadata,
                                                    self.ebuild_mtime)
Пример #11
0
 def _set_returncode(self, wait_retval):
     SubProcess._set_returncode(self, wait_retval)
     # self._raw_metadata is None when _start returns
     # early due to an unsupported EAPI detected with
     # FEATURES=parse-eapi-ebuild-head
     if self.returncode == os.EX_OK and \
      self._raw_metadata is not None:
         metadata_lines = _unicode_decode(
             b''.join(self._raw_metadata),
             encoding=_encodings['repo.content'],
             errors='replace').splitlines()
         if len(portage.auxdbkeys) != len(metadata_lines):
             # Don't trust bash's returncode if the
             # number of lines is incorrect.
             self.returncode = 1
         else:
             metadata = zip(portage.auxdbkeys, metadata_lines)
             self.metadata = self.metadata_callback(self.cpv,
                                                    self.repo_path,
                                                    metadata,
                                                    self.ebuild_hash)
Пример #12
0
    def _set_returncode(self, wait_retval):
        SubProcess._set_returncode(self, wait_retval)

        if self.cgroup:

            def get_pids(cgroup):
                try:
                    with open(os.path.join(cgroup, 'cgroup.procs'), 'r') as f:
                        return [int(p) for p in f.read().split()]
                except OSError:
                    # cgroup removed already?
                    return []

            def kill_all(pids, sig):
                for p in pids:
                    try:
                        os.kill(p, sig)
                    except OSError as e:
                        if e.errno == errno.EPERM:
                            # Reported with hardened kernel (bug #358211).
                            writemsg_level(
                                "!!! kill: (%i) - Operation not permitted\n" %
                                (p, ),
                                level=logging.ERROR,
                                noiselevel=-1)
                        elif e.errno != errno.ESRCH:
                            raise

            # step 1: kill all orphans
            pids = get_pids(self.cgroup)
            if pids:
                kill_all(pids, signal.SIGKILL)

            # step 2: remove the cgroup
            try:
                os.rmdir(self.cgroup)
            except OSError:
                # it may be removed already, or busy
                # we can't do anything good about it
                pass
Пример #13
0
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)

		if self.cgroup:
			def get_pids(cgroup):
				try:
					with open(os.path.join(cgroup, 'cgroup.procs'), 'r') as f:
						return [int(p) for p in f.read().split()]
				except OSError:
					# cgroup removed already?
					return []

			def kill_all(pids, sig):
				for p in pids:
					try:
						os.kill(p, sig)
					except OSError as e:
						if e.errno == errno.EPERM:
							# Reported with hardened kernel (bug #358211).
							writemsg_level(
								"!!! kill: (%i) - Operation not permitted\n" %
								(p,), level=logging.ERROR,
								noiselevel=-1)
						elif e.errno != errno.ESRCH:
							raise

			# step 1: kill all orphans
			pids = get_pids(self.cgroup)
			if pids:
				kill_all(pids, signal.SIGKILL)

			# step 2: remove the cgroup
			try:
				os.rmdir(self.cgroup)
			except OSError:
				# it may be removed already, or busy
				# we can't do anything good about it
				pass
Пример #14
0
	def _unregister(self):
		self.scheduler.remove_reader(self._files.ebuild)
		SubProcess._unregister(self)
Пример #15
0
 def _async_waitpid_cb(self, *args, **kwargs):
     SubProcess._async_waitpid_cb(self, *args, **kwargs)
     if self.proc.returncode is None:
         # Suppress warning messages like this:
         # ResourceWarning: subprocess 1234 is still running
         self.proc.returncode = self.returncode
Пример #16
0
 def _set_returncode(self, wait_retval):
     SubProcess._set_returncode(self, wait_retval)
     self._cgroup_cleanup()
Пример #17
0
	def _cancel(self):
		SubProcess._cancel(self)
		if self._main_task is not None:
			self._main_task.done() or self._main_task.cancel()
		self._cgroup_cleanup()
Пример #18
0
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)
		self._cgroup_cleanup()
Пример #19
0
 def _unregister(self):
     SubProcess._unregister(self)
     if self.cgroup is not None:
         self._cgroup_cleanup()
         self.cgroup = None
Пример #20
0
	def _cancel(self):
		SubProcess._cancel(self)
		self._cgroup_cleanup()
Пример #21
0
 def _unregister(self):
     if self._files is not None:
         self.scheduler.remove_reader(self._files.ebuild)
     SubProcess._unregister(self)
Пример #22
0
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)
		if self.proc.returncode is None:
			# Suppress warning messages like this:
			# ResourceWarning: subprocess 1234 is still running
			self.proc.returncode = self.returncode
Пример #23
0
 def _cancel(self):
     SubProcess._cancel(self)
     self._cgroup_cleanup()