def _gather_available_files(self, actually_fetched_content, dest_filename): fpaths = [] if not actually_fetched_content: if not dest_filename: # using scap-security-guide fpaths = [self.DEFAULT_SSG_DATA_STREAM_PATH] else: # Using downloaded XCCDF/OVAL/DS/tailoring fpaths = pathlib.Path( self.CONTENT_DOWNLOAD_LOCATION).rglob("*") fpaths = [str(p) for p in fpaths if p.is_file()] else: dest_filename = pathlib.Path(dest_filename) # RPM is an archive at this phase content_type = self.get_content_type(str(dest_filename)) if content_type in ("archive", "rpm"): try: fpaths = common.extract_data(str(dest_filename), str(dest_filename.parent)) except common.ExtractionError as err: msg = f"Failed to extract the '{dest_filename}' archive: {str(err)}" log.error("OSCAP Addon: " + msg) raise err elif content_type == "file": fpaths = [str(dest_filename)] else: raise common.OSCAPaddonError("Unsupported content type") return fpaths
def _init_after_data_fetch(self, wait_for): """ Waits for data fetching to be finished, extracts it (if needed), populates the stores and evaluates pre-installation fixes from the content and marks the spoke as ready in the end. :param wait_for: name of the thread to wait for (if any) :type wait_for: str or None """ try: threadMgr.wait(wait_for) except data_fetch.DataFetchError: self._data_fetch_failed() with self._fetch_flag_lock: self._fetching = False return finally: # stop the spinner in any case fire_gtk_action(self._progress_spinner.stop) if self._addon_data.fingerprint: hash_obj = utils.get_hashing_algorithm( self._addon_data.fingerprint) digest = utils.get_file_fingerprint( self._addon_data.raw_preinst_content_path, hash_obj) if digest != self._addon_data.fingerprint: self._integrity_check_failed() # fetching done with self._fetch_flag_lock: self._fetching = False return # RPM is an archive at this phase if self._addon_data.content_type in ("archive", "rpm"): # extract the content try: fpaths = common.extract_data( self._addon_data.raw_preinst_content_path, common.INSTALLATION_CONTENT_DIR, [self._addon_data.content_path]) except common.ExtractionError as err: self._extraction_failed(err.message) # fetching done with self._fetch_flag_lock: self._fetching = False return # and populate missing fields self._content_handling_cls, files = content_handling.explore_content_files( fpaths) files = common.strip_content_dir(files) # pylint: disable-msg=E1103 self._addon_data.content_path = self._addon_data.content_path or files.xccdf self._addon_data.cpe_path = self._addon_data.cpe_path or files.cpe self._addon_data.tailoring_path = (self._addon_data.tailoring_path or files.tailoring) elif self._addon_data.content_type == "datastream": self._content_handling_cls = content_handling.DataStreamHandler elif self._addon_data.content_type == "scap-security-guide": self._content_handling_cls = content_handling.BenchmarkHandler else: raise common.OSCAPaddonError("Unsupported content type") try: self._content_handler = self._content_handling_cls( self._addon_data.preinst_content_path, self._addon_data.preinst_tailoring_path) except content_handling.ContentHandlingError: self._invalid_content() # fetching done with self._fetch_flag_lock: self._fetching = False return if self._using_ds: # populate the stores from items from the content self._ds_checklists = self._content_handler.get_data_streams_checklists( ) add_ds_ids = GtkActionList() add_ds_ids.add_action(self._ds_store.clear) for dstream in self._ds_checklists.keys(): add_ds_ids.add_action(self._add_ds_id, dstream) add_ds_ids.fire() self._update_ids_visibility() # refresh UI elements self.refresh() # let all initialization and configuration happen before we evaluate # the setup if not self._anaconda_spokes_initialized.is_set(): # only wait (and log the messages) if the event is not set yet log.debug( "OSCAP addon: waiting for all Anaconda spokes to be initialized" ) self._anaconda_spokes_initialized.wait() log.debug( "OSCAP addon: all Anaconda spokes have been initialized - continuing" ) # try to switch to the chosen profile (if any) selected = self._switch_profile() if self._addon_data.profile_id and not selected: # profile ID given, but it was impossible to select it -> invalid # profile ID given self._invalid_profile_id() return # initialize the self._addon_data.rule_data self._addon_data.rule_data = self._rule_data # update the message store with the messages self._update_message_store() # all initialized, we can now let user set parameters fire_gtk_action(self._main_notebook.set_current_page, SET_PARAMS_PAGE) # and use control buttons fire_gtk_action(really_show, self._control_buttons) # fetching done with self._fetch_flag_lock: self._fetching = False # no error self._set_error(None)
def _init_after_data_fetch(self, wait_for): """ Waits for data fetching to be finished, extracts it (if needed), populates the stores and evaluates pre-installation fixes from the content and marks the spoke as ready in the end. :param wait_for: name of the thread to wait for (if any) :type wait_for: str or None """ try: threadMgr.wait(wait_for) except data_fetch.DataFetchError: self._data_fetch_failed() with self._fetch_flag_lock: self._fetching = False return finally: # stop the spinner in any case fire_gtk_action(self._progress_spinner.stop) if self._addon_data.fingerprint: hash_obj = utils.get_hashing_algorithm(self._addon_data.fingerprint) digest = utils.get_file_fingerprint(\ self._addon_data.raw_preinst_content_path, hash_obj) if digest != self._addon_data.fingerprint: msg = _("Integrity check failed") raise content_handling.ContentCheckError(msg) # RPM is an archive at this phase if self._addon_data.content_type in ("archive", "rpm"): # extract the content try: fpaths = common.extract_data(\ self._addon_data.raw_preinst_content_path, common.INSTALLATION_CONTENT_DIR, [self._addon_data.xccdf_path]) except common.ExtractionError as err: self._extraction_failed(err.message) # fetching done with self._fetch_flag_lock: self._fetching = False return # and populate missing fields self._content_handling_cls, files = \ content_handling.explore_content_files(fpaths) files = common.strip_content_dir(files) # pylint: disable-msg=E1103 self._addon_data.xccdf_path = self._addon_data.xccdf_path or files.xccdf self._addon_data.cpe_path = self._addon_data.cpe_path or files.cpe self._addon_data.tailoring_path = (self._addon_data.tailoring_path or files.tailoring) elif self._addon_data.content_type == "datastream": self._content_handling_cls = content_handling.DataStreamHandler elif self._addon_data.content_type == "scap-security-guide": self._content_handling_cls = content_handling.BenchmarkHandler else: raise common.OSCAPaddonError("Unsupported content type") try: self._content_handler = self._content_handling_cls(\ self._addon_data.preinst_content_path, self._addon_data.preinst_tailoring_path) except content_handling.ContentHandlingError: self._invalid_content() # fetching done with self._fetch_flag_lock: self._fetching = False return if self._using_ds: # populate the stores from items from the content self._ds_checklists = self._content_handler.get_data_streams_checklists() for dstream in self._ds_checklists.iterkeys(): self._add_ds_id(dstream) else: # hide the labels and comboboxes for datastream-id and xccdf-id # selection fire_gtk_action(really_hide, self._ids_box) # refresh UI elements self.refresh() # try to switch to the chosen profile (if any) self._switch_profile() # initialize the self._addon_data.rule_data self._addon_data.rule_data = self._rule_data # update the message store with the messages self._update_message_store() # no more being unitialized self._unitialized_status = None self._ready = True # all initialized, we can now let user set parameters self._main_notebook.set_current_page(SET_PARAMS_PAGE) # and use control buttons really_show(self._control_buttons) # pylint: disable-msg=E1101 hubQ.send_ready(self.__class__.__name__, True) hubQ.send_message(self.__class__.__name__, self.status) # fetching done with self._fetch_flag_lock: self._fetching = False