def handle_end(self): """Handle the end of the section.""" tmpl = "%s missing for the %s addon" # check provided data if not self.policy_data.content_type: raise KickstartValueError(tmpl % ("content-type", self.name)) if ( self.policy_data.content_type != "scap-security-guide" and not self.policy_data.content_url): raise KickstartValueError(tmpl % ("content-url", self.name)) if not self.policy_data.profile_id: self.policy_data.profile_id = "default" if ( self.policy_data.content_type in ("rpm", "archive") and not self.policy_data.content_path): msg = "Path to the XCCDF file has to be given if content in RPM "\ "or archive is used" raise KickstartValueError(msg) if ( self.policy_data.content_type == "rpm" and not self.policy_data.content_url.endswith(".rpm")): msg = "Content type set to RPM, but the content URL doesn't end "\ "with '.rpm'" raise KickstartValueError(msg) if self.policy_data.content_type == "archive": supported_archive = any( self.policy_data.content_url.endswith(arch_type) for arch_type in common.SUPPORTED_ARCHIVES ) if not supported_archive: msg = "Unsupported archive type of the content "\ "file '%s'" % self.policy_data.content_url raise KickstartValueError(msg) # do some initialization magic in case of SSG if self.policy_data.content_type == "scap-security-guide": if not common.ssg_available(): msg = "SCAP Security Guide not found on the system" raise KickstartValueError(msg) self.policy_data.content_path = common.SSG_DIR + common.SSG_CONTENT
def finalize(self): """ The finalize method that is called when the end of the %addon section (the %end line) is reached. It means no more kickstart data will come. """ tmpl = "%s missing for the %s addon" ## check provided data if not self.content_type: raise KickstartValueError(tmpl % ("content-type", self.name)) if self.content_type != "scap-security-guide" and not self.content_url: raise KickstartValueError(tmpl % ("content-url", self.name)) if not self.profile_id: self.profile_id = "default" if self.content_type in ("rpm", "archive") and not self.xccdf_path: msg = "Path to the XCCDF file has to be given if content in RPM "\ "or archive is used" raise KickstartValueError(msg) if self.content_type == "rpm" and not self.content_url.endswith( ".rpm"): msg = "Content type set to RPM, but the content URL doesn't end "\ "with '.rpm'" raise KickstartValueError(msg) if self.content_type == "archive": supported_archive = any( self.content_url.endswith(arch_type) for arch_type in SUPPORTED_ARCHIVES) if not supported_archive: msg = "Unsupported archive type of the content "\ "file '%s'" % self.content_url raise KickstartValueError(msg) ## do some initialization magic in case of SSG if self.content_type == "scap-security-guide": if not common.ssg_available(): msg = "SCAP Security Guide not found on the system" raise KickstartValueError(msg) self.xccdf_path = common.SSG_DIR + common.SSG_XCCDF
def finalize(self): """ The finalize method that is called when the end of the %addon section (the %end line) is reached. It means no more kickstart data will come. """ tmpl = "%s missing for the %s addon" ## check provided data if not self.content_type: raise KickstartValueError(tmpl % ("content-type", self.name)) if self.content_type != "scap-security-guide" and not self.content_url: raise KickstartValueError(tmpl % ("content-url", self.name)) if not self.profile_id: self.profile_id = "default" if self.content_type in ("rpm", "archive") and not self.xccdf_path: msg = "Path to the XCCDF file has to be given if content in RPM "\ "or archive is used" raise KickstartValueError(msg) if self.content_type == "rpm" and not self.content_url.endswith(".rpm"): msg = "Content type set to RPM, but the content URL doesn't end "\ "with '.rpm'" raise KickstartValueError(msg) if self.content_type == "archive": supported_archive = any(self.content_url.endswith(arch_type) for arch_type in SUPPORTED_ARCHIVES) if not supported_archive: msg = "Unsupported archive type of the content "\ "file '%s'" % self.content_url raise KickstartValueError(msg) ## do some initialization magic in case of SSG if self.content_type == "scap-security-guide": if not common.ssg_available(): msg = "SCAP Security Guide not found on the system" raise KickstartValueError(msg) self.xccdf_path = common.SSG_DIR + common.SSG_XCCDF
def refresh(self): """ The refresh method that is called every time the spoke is displayed. It should update the UI elements according to the contents of self.data. :see: pyanaconda.ui.common.UIObject.refresh """ if not self._addon_data.content_defined: # hide the control buttons really_hide(self._control_buttons) # provide SSG if available if common.ssg_available(): # show the SSG button and tweak the rest of the line # (the label) really_show(self._ssg_button) # TRANSLATORS: the other choice if SCAP Security Guide is also # available tip = _(" or enter data stream content or archive URL below:") else: # hide the SSG button really_hide(self._ssg_button) tip = _( "No content found. Please enter data stream content or " "archive URL below:") self._no_content_label.set_text(tip) # hide the progress box, no progress now with self._fetch_flag_lock: if not self._fetching: really_hide(self._progress_box) self._content_url_entry.set_sensitive(True) self._fetch_button.set_sensitive(True) if not self._content_url_entry.get_text(): # no text -> no info/warning self._progress_label.set_text("") # switch to the page allowing user to enter content URL and fetch # it self._main_notebook.set_current_page(GET_CONTENT_PAGE) self._content_url_entry.grab_focus() # nothing more to do here return else: # show control buttons really_show(self._control_buttons) self._main_notebook.set_current_page(SET_PARAMS_PAGE) self._active_profile = self._addon_data.profile_id self._update_ids_visibility() if self._using_ds: if self._addon_data.datastream_id: set_combo_selection(self._ds_combo, self._addon_data.datastream_id, unset_first=True) else: try: default_ds = next(iter(self._ds_checklists.keys())) set_combo_selection(self._ds_combo, default_ds, unset_first=True) except StopIteration: # no data stream available pass if self._addon_data.datastream_id and self._addon_data.xccdf_id: set_combo_selection(self._xccdf_combo, self._addon_data.xccdf_id, unset_first=True) else: # no combobox changes --> need to update profiles store manually self._update_profiles_store() if self._addon_data.profile_id: set_treeview_selection(self._profiles_view, self._addon_data.profile_id) self._rule_data = self._addon_data.rule_data self._update_message_store()
def initialize(self): """ The initialize method that is called after the instance is created. The difference between __init__ and this method is that this may take a long time and thus could be called in a separated thread. :see: pyanaconda.ui.common.UIObject.initialize """ NormalSpoke.initialize(self) column = self.builder.get_object("messageTypeColumn") renderer = self.builder.get_object("messageTypeRenderer") column.set_cell_data_func(renderer, render_message_type) # the main notebook containing two pages -- for settings parameters and # for entering content URL self._main_notebook = self.builder.get_object("mainNotebook") # the store that holds the messages that come from the rules evaluation self._message_store = self.builder.get_object("changesStore") # stores with data streams, checklists and profiles self._ds_store = self.builder.get_object("dsStore") self._xccdf_store = self.builder.get_object("xccdfStore") self._profiles_store = self.builder.get_object("profilesStore") # comboboxes for data streams and checklists self._ids_box = self.builder.get_object("idsBox") self._ds_combo = self.builder.get_object("dsCombo") self._xccdf_combo = self.builder.get_object("xccdfCombo") # profiles view and selection self._profiles_view = self.builder.get_object("profilesView") self._profiles_selection = self.builder.get_object("profilesSelection") selected_column = self.builder.get_object("selectedColumn") selected_renderer = self.builder.get_object("selectedRenderer") selected_column.set_cell_data_func(selected_renderer, self._render_selected) # button for switching profiles self._choose_button = self.builder.get_object("chooseProfileButton") # toggle switching the dry-run mode self._dry_run_switch = self.builder.get_object("dryRunSwitch") # control buttons self._control_buttons = self.builder.get_object("controlButtons") # content URL entering, content fetching, ... self._no_content_label = self.builder.get_object("noContentLabel") self._content_url_entry = self.builder.get_object("urlEntry") self._fetch_button = self.builder.get_object("fetchButton") self._progress_box = self.builder.get_object("progressBox") self._progress_spinner = self.builder.get_object("progressSpinner") self._progress_label = self.builder.get_object("progressLabel") self._ssg_button = self.builder.get_object("ssgButton") # if no content was specified and SSG is available, use it if not self._addon_data.content_type and common.ssg_available(): self._addon_data.content_type = "scap-security-guide" self._addon_data.content_path = common.SSG_DIR + common.SSG_CONTENT if not self._addon_data.content_defined: # nothing more to be done now, the spoke is ready self._ready = True # no more being unitialized self._unitialized_status = None # user is going to enter the content URL self._content_url_entry.grab_focus() # pylint: disable-msg=E1101 hubQ.send_ready(self.__class__.__name__, True) else: # else fetch data self._fetch_data_and_initialize()
def refresh(self): """ The refresh method that is called every time the spoke is displayed. It should update the UI elements according to the contents of self.data. :see: pyanaconda.ui.common.UIObject.refresh """ if not self._addon_data.content_defined: # hide the control buttons really_hide(self._control_buttons) # provide SSG if available if common.ssg_available(): # show the SSG button and tweak the rest of the line # (the label) really_show(self._ssg_button) # TRANSLATORS: the other choice if SCAP Security Guide is also # available tip = _(" or enter data stream content or archive URL below:") else: # hide the SSG button really_hide(self._ssg_button) tip = _("No content found. Please enter data stream content or " "archive URL below:") self._no_content_label.set_text(tip) # hide the progress box, no progress now with self._fetch_flag_lock: if not self._fetching: really_hide(self._progress_box) self._content_url_entry.set_sensitive(True) self._fetch_button.set_sensitive(True) if not self._content_url_entry.get_text(): # no text -> no info/warning self._progress_label.set_text("") # switch to the page allowing user to enter content URL and fetch # it self._main_notebook.set_current_page(GET_CONTENT_PAGE) self._content_url_entry.grab_focus() # nothing more to do here return else: # show control buttons really_show(self._control_buttons) self._main_notebook.set_current_page(SET_PARAMS_PAGE) self._active_profile = self._addon_data.profile_id self._update_ids_visibility() if self._using_ds: if self._addon_data.datastream_id: set_combo_selection(self._ds_combo, self._addon_data.datastream_id, unset_first=True) else: try: default_ds = next(iter(self._ds_checklists.keys())) set_combo_selection(self._ds_combo, default_ds, unset_first=True) except StopIteration: # no data stream available pass if self._addon_data.datastream_id and self._addon_data.xccdf_id: set_combo_selection(self._xccdf_combo, self._addon_data.xccdf_id, unset_first=True) else: # no combobox changes --> need to update profiles store manually self._update_profiles_store() if self._addon_data.profile_id: set_treeview_selection(self._profiles_view, self._addon_data.profile_id) self._rule_data = self._addon_data.rule_data self._update_message_store()