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()
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
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
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
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()
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)
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)
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
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
def _unregister(self): self.scheduler.remove_reader(self._files.ebuild) SubProcess._unregister(self)
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
def _set_returncode(self, wait_retval): SubProcess._set_returncode(self, wait_retval) self._cgroup_cleanup()
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()
def _unregister(self): SubProcess._unregister(self) if self.cgroup is not None: self._cgroup_cleanup() self.cgroup = None
def _cancel(self): SubProcess._cancel(self) self._cgroup_cleanup()
def _unregister(self): if self._files is not None: self.scheduler.remove_reader(self._files.ebuild) SubProcess._unregister(self)
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