def action(self) -> ActionResult: if not transactions.check_transaction(): return None test_id = request.var("_test_id") site_id = request.var("_site_id") status_id = request.get_integer_input_mandatory("_status_id", 0) if not test_id: raise MKUserError("_ack_test_id", _("Needed variable missing")) if request.var("_do") in ["ack", "unack"]: if not site_id: raise MKUserError("_ack_site_id", _("Needed variable missing")) if site_id not in activation_sites(): raise MKUserError("_ack_site_id", _("Invalid site given")) if request.var("_do") == "ack": self._acknowledge_test(test_id, site_id, status_id) elif request.var("_do") == "unack": self._unacknowledge_test(test_id, site_id, status_id) elif request.var("_do") == "disable": self._disable_test(test_id) elif request.var("_do") == "enable": self._enable_test(test_id) else: raise NotImplementedError() return None
def action(self) -> ActionResult: if request.var("_action") != "discard": return None if not transactions.check_transaction(): return None if not self._may_discard_changes(): return None if not self.has_changes(): return None # Now remove all currently pending changes by simply restoring the last automatically # taken snapshot. Then activate the configuration. This should revert all pending changes. file_to_restore = self._get_last_wato_snapshot_file() if not file_to_restore: raise MKUserError(None, _("There is no WATO snapshot to be restored.")) msg = _("Discarded pending changes (Restored %s)") % file_to_restore # All sites and domains can be affected by a restore: Better restart everything. _changes.add_change( "changes-discarded", msg, domains=ABCConfigDomain.enabled_domains(), need_restart=True, ) self._extract_snapshot(file_to_restore) activate_changes.execute_activate_changes([ d.get_domain_request([]) for d in ABCConfigDomain.enabled_domains() ]) for site_id in activation_sites(): self.confirm_site_changes(site_id) build_index_background() make_header( html, self.title(), breadcrumb=self.breadcrumb(), show_body_start=display_options.enabled(display_options.H), show_top_heading=display_options.enabled(display_options.T), ) html.open_div(class_="wato") html.show_message(_("Successfully discarded all pending changes.")) html.javascript("hide_changes_buttons();") html.footer() return FinalizeRequest(code=200)
def add_change( self, action_name: str, text: LogMessage, object_ref: Optional[ObjectRef], add_user: bool, need_sync: Optional[bool], need_restart: Optional[bool], domains: Optional[List[Type[ABCConfigDomain]]], sites: Optional[Iterable[SiteId]], domain_settings: Optional[DomainSettings], ) -> None: if not ActivateChangesWriter._enabled: return # Default to a core only change if domains is None: domains = [config_domain_registry["check_mk"]] # All replication sites in case no specific site is given if sites is None: sites = activation_sites().keys() change_id = self._new_change_id() for site_id in sites: self._add_change_to_site( site_id, change_id, action_name, text, object_ref, add_user, need_sync, need_restart, domains, domain_settings, )
def _activation_status(self): with table_element( "site-status", title=_("Activation status"), searchable=False, sortable=False, css="activation", foldable=Foldable.FOLDABLE_STATELESS, ) as table: for site_id, site in sort_sites(activation_sites()): table.row() site_status, status = self._get_site_status(site_id, site) is_online = self._site_is_online(status) is_logged_in = self._site_is_logged_in(site_id, site) has_foreign = self._site_has_foreign_changes(site_id) can_activate_all = not has_foreign or user.may( "wato.activateforeign") # Disable actions for offline sites and not logged in sites if not is_online or not is_logged_in: can_activate_all = False need_restart = self._is_activate_needed(site_id) need_sync = self.is_sync_needed(site_id) need_action = need_restart or need_sync nr_changes = len(self._changes_of_site(site_id)) # Activation checkbox table.cell("", css=["buttons"]) if can_activate_all and nr_changes: html.checkbox("site_%s" % site_id, need_action, cssclass="site_checkbox") # Iconbuttons table.cell(_("Actions"), css=["buttons"]) if user.may("wato.sites"): edit_url = folder_preserving_link([("mode", "edit_site"), ("site", site_id)]) html.icon_button(edit_url, _("Edit the properties of this site"), "edit") # State if can_activate_all and need_sync: html.icon_button( url="javascript:void(0)", id_="activate_%s" % site_id, cssclass="activate_site", title= _("This site is not update and needs a replication. Start it now." ), icon="need_replicate", onclick='cmk.activation.activate_changes("site", "%s")' % site_id, ) if can_activate_all and need_restart: html.icon_button( url="javascript:void(0)", id_="activate_%s" % site_id, cssclass="activate_site", title= _("This site needs a restart for activating the changes. Start it now." ), icon="need_restart", onclick='cmk.activation.activate_changes("site", "%s")' % site_id, ) if can_activate_all and not need_action: html.icon("siteuptodate", _("This site is up-to-date.")) site_url = site.get("multisiteurl") if site_url: html.icon_button( site_url, _("Open this site's local web user interface"), "url", target="_blank", ) table.cell(_("Site"), site.get("alias", site_id), css=["narrow nobr"]) # Livestatus table.cell(_("Status"), css=["narrow nobr"]) html.status_label(content=status, status=status, title=_("This site is %s") % status) # Livestatus-/Checkmk-Version table.cell(_("Version"), site_status.get("livestatus_version", ""), css=["narrow nobr"]) table.cell(_("Changes"), "%d" % nr_changes, css=["number narrow nobr"]) table.cell(_("Progress"), css=["repprogress"]) html.open_div(id_="site_%s_status" % site_id, class_=["msg"]) html.close_div() html.open_div(id_="site_%s_progress" % site_id, class_=["progress"]) html.close_div() table.cell(_("Details"), css=["details"]) html.open_div(id_="site_%s_details" % site_id) last_state = self._last_activation_state(site_id) if not is_logged_in: html.write_text(_("Is not logged in.") + " ") if not last_state: html.write_text(_("Has never been activated")) elif need_action and last_state[ "_state"] == activate_changes.STATE_SUCCESS: html.write_text(_("Activation needed")) else: html.javascript( "cmk.activation.update_site_activation_state(%s);" % json.dumps(last_state)) html.close_div()
def _get_amount_changes(self) -> int: return sum( len(self._changes_of_site(site_id)) for site_id in activation_sites())
def _analyze_sites(self): return activation_sites()