def display(self, value: FilterHTTPVariables) -> None: html.text_input(self._varprefix + "name") html.br() display_filter_radiobuttons( varname=self._varprefix + "match", options=[ ("exact", _("exact match")), ("regex", _("regular expression, substring match")), ], default="exact", value=value, ) html.br() html.open_span(class_="min_max_row") html.write_text(_("Min. Version: ")) html.text_input( self._varprefix + "version_from", default_value=value.get(self._varprefix + "version_from", ""), size=9, ) html.write_text(" ") html.write_text(_("Max. Vers.: ")) html.text_input( self._varprefix + "version_to", default_value=value.get(self._varprefix + "version_from", ""), size=9, ) html.close_span() html.br() html.checkbox( self._varprefix + "negate", False, label=_("Negate: find hosts <b>not</b> having this package"), )
def filter(self, value: FilterHTTPVariables) -> FilterHeader: headers = [] # Do not restrict to a certain number, because we'd like to link to this # via an URL, e.g. from the virtual host tree snapin num = 0 column = livestatus.lqencode(self.object_type) + "_tags" while value.get("%s%d_grp" % (self.var_prefix, num)): prefix = "%s%d" % (self.var_prefix, num) num += 1 op = value.get(prefix + "_op") tag_group = config.tags.get_tag_group( value.get(prefix + "_grp", "")) tag = value.get(prefix + "_val", "") if not tag_group or not op: continue headers.append( encode_label_for_livestatus(column, tag_group.id, tag, negate=op != "is")) if headers: return "\n".join(headers) + "\n" return ""
def get_bound(self, var: str, value: FilterHTTPVariables) -> Union[int, float, None]: try: if isinstance(self.bound_rescaling, int): return int(value.get(var, "")) * self.bound_rescaling return float(value.get(var, "")) * self.bound_rescaling except ValueError: return None
def display(self, value: FilterHTTPVariables) -> None: html.write_text(_("Min. Version:")) html.text_input(self.htmlvars[0], default_value=value.get(self.htmlvars[0], ""), size=7) html.write_text(" ") html.write_text(_("Max. Version:")) html.text_input(self.htmlvars[1], default_value=value.get(self.htmlvars[1], ""), size=7)
def display(self, value: FilterHTTPVariables) -> None: html.write_text(_("from:") + " ") html.text_input(self.ident + "_from", default_value=value.get(self.ident + "_from", ""), size=8, cssclass="number") html.write_text(" %s: " % _("to")) html.text_input(self.ident + "_to", default_value=value.get(self.ident + "_to", ""), size=8, cssclass="number")
def parse_value(self, value: FilterHTTPVariables) -> Labels: # Do not restrict to a certain number, because we'd like to link to this # via an URL, e.g. from the virtual host tree snapin num = 0 while (this_tag := value.get("%s_%d" % (self.var_prefix, num))) is not None: if this_tag: negate = bool(value.get("%s_%d_neg" % (self.var_prefix, num))) yield Label(this_tag, this_tag, negate) num += 1
def filter(self, value: FilterHTTPVariables) -> FilterHeader: if filter_value := value.get(self.request_vars[0]): return encode_labels_for_livestatus( column=self.column, labels=[ Label( f"cmk/kubernetes/{self._kubernetes_object_type}", filter_value, False, ) ], )
def host_aux_tags_lq(prefix: str, value: FilterHTTPVariables) -> FilterHeader: headers = [] # Do not restrict to a certain number, because we'd like to link to this # via an URL, e.g. from the virtual host tree snapin num = 0 while (this_tag := value.get("%s_%d" % (prefix, num))) is not None: if this_tag: negate = bool(value.get("%s_%d_neg" % (prefix, num))) headers.append( encode_label_for_livestatus("host_tags", this_tag, this_tag, negate)) num += 1
def filter(self, value: FilterHTTPVariables) -> FilterHeader: address_val = value.get(self.htmlvars[0]) if not address_val: return "" if value.get(self.htmlvars[1]) == "yes": op = "~" address = "^" + livestatus.lqencode(address_val) else: op = "=" address = livestatus.lqencode(address_val) if self._what == "primary": return "Filter: host_address %s %s\n" % (op, address) varname = "ADDRESS_4" if self._what == "ipv4" else "ADDRESS_6" return "Filter: host_custom_variables %s %s %s\n" % (op, varname, address)
def display(self, value: FilterHTTPVariables) -> None: html.write_text(_("From: ")) htmlvar = self.htmlvars[0] current_value = value.get(htmlvar, "") html.text_input(htmlvar, default_value=current_value, size=8, cssclass="number") if self._unit: html.write_text(" %s" % self._unit) html.write_text(" " + _("To: ")) htmlvar = self.htmlvars[1] current_value = value.get(htmlvar, "") html.text_input(htmlvar, default_value=current_value, size=8, cssclass="number") if self._unit: html.write_text(" %s" % self._unit)
def display(self, value: FilterHTTPVariables) -> None: html.write_text(_("From:") + " ") html.text_input( self.htmlvars[0], default_value=value.get(self.htmlvars[0], ""), style="width: 80px;" ) if self.unit: html.write_text(" %s " % self.unit) html.write_text(" " + _("To:") + " ") html.text_input( self.htmlvars[1], default_value=value.get(self.htmlvars[1], ""), style="width: 80px;" ) if self.unit: html.write_text(" %s " % self.unit)
def parse_value(self, value: FilterHTTPVariables) -> Labels: # Do not restrict to a certain number, because we'd like to link to this # via an URL, e.g. from the virtual host tree snapin num = 0 while value.get("%s_%d_grp" % (self.var_prefix, num)): prefix = "%s_%d" % (self.var_prefix, num) num += 1 op = value.get(prefix + "_op") tag_group = active_config.tags.get_tag_group( value.get(prefix + "_grp", "")) if tag_group and op: tag = value.get(prefix + "_val", "") yield Label(tag_group.id, tag, negate=op != "is")
def _get_time_range_of(self, value: FilterHTTPVariables, what: str) -> Union[None, int, float]: varprefix = self.ident + "_" + what rangename = value.get(varprefix + "_range") if rangename == "abs": try: return time.mktime(time.strptime(value[varprefix], "%Y-%m-%d")) except Exception: user_errors.add( MKUserError( varprefix, _("Please enter the date in the format YYYY-MM-DD."))) return None if rangename == "unix": return int(value[varprefix]) if rangename is None: return None try: count = int(value[varprefix]) secs = count * int(rangename) return int(time.time()) - secs except Exception: return None
def display_filter_radiobuttons(*, varname: str, options: List[Tuple[str, str]], default: str, value: FilterHTTPVariables) -> None: pick = value.get(varname, default) html.begin_radio_group(horizontal=True) for state, text in options: html.radiobutton(varname, state, pick == state, text + " ") html.end_radio_group()
def hostgroup_problems_filter(value: FilterHTTPVariables) -> FilterHeader: headers = [] for svc_var in ["warn", "crit", "pending", "unknown"]: if value.get("hostgroups_having_services_%s" % svc_var): headers.append("num_services_%s > 0\n" % svc_var) for host_var in ["down", "unreach", "pending"]: if value.get("hostgroups_having_hosts_%s" % host_var): headers.append("num_hosts_%s > 0\n" % host_var) if value.get("hostgroups_show_unhandled_host"): headers.append("num_hosts_unhandled_problems > 0\n") if value.get("hostgroups_show_unhandled_svc"): headers.append("num_services_unhandled_problems > 0\n") return lq_logic("Filter:", headers, "Or")
def display(self, value: FilterHTTPVariables) -> None: current_value = value.get(self.query_filter.request_vars[0], "") html.text_input( self.htmlvars[0], current_value, self.query_filter.negateable and "neg" or "" ) if self.query_filter.negateable: checkbox_component(self.query_filter.request_vars[1], value, _("negate"))
def host_having_svc_problems_filter( value: FilterHTTPVariables) -> FilterHeader: conditions = [ "host_num_services_%s > 0" % var for var in ["warn", "crit", "pending", "unknown"] if value.get("hosts_having_services_%s" % var) ] return lq_logic("Filter:", conditions, "Or")
def display(self, value: FilterHTTPVariables): html.open_table(class_="filtertime") for what, whatname in [("from", _("From")), ("until", _("Until"))]: varprefix = self.ident + "_" + what html.open_tr() html.td("%s:" % whatname) html.open_td() html.text_input(varprefix, default_value=value.get(varprefix, "")) html.close_td() html.open_td() html.dropdown( varprefix + "_range", query_filters.time_filter_options(), deflt=value.get(varprefix + "_range", "3600"), ) html.close_td() html.close_tr() html.close_table()
def filter(self, value: FilterHTTPVariables) -> FilterHeader: # not (A or B) => (not A) and (not B) if value.get(self.htmlvars[1]): negate = "!" op = "And" else: negate = "" op = "Or" return lq_logic(f"Filter: {self.column} {negate}>=", self.selection(value), op)
def checkbox_row( options: List[Tuple[str, str]], value: FilterHTTPVariables, title: Optional[str] = None ) -> None: html.begin_checkbox_group() if title: html.write_text(title) checkbox_default = not any(value.values()) for var, text in options: html.checkbox(var, bool(value.get(var, checkbox_default)), label=text) html.end_checkbox_group()
def display(self, value: FilterHTTPVariables) -> None: html.begin_checkbox_group() for state, state_name in sorted(defines.interface_oper_states().items()): if not isinstance(state, int): # needed because of silly types continue if state >= 8: continue # skip artificial state 8 (degraded) and 9 (admin down) varname = self.ident + "_" + str(state) html.checkbox(varname, bool(value.get(varname, True)), label=state_name) if state in (4, 7): html.br() html.end_checkbox_group()
def heading_info(self, value: FilterHTTPVariables) -> Optional[str]: # FIXME: There is a problem with caching data and changing titles of WATO files # Everything is changed correctly but the filter object is stored in the # global multisite_filters var and self.path_to_tree is not refreshed when # rendering this title. Thus the threads might have old information about the # file titles and so on. # The call below needs to use some sort of indicator wether the cache needs # to be renewed or not. self.check_wato_data_update() current = value.get(self.ident) if current and current != "/": return self.path_to_tree.get(current) return None
def display(self, value: FilterHTTPVariables) -> None: actual_value = value.get(self._filter_range_config.column, self._filter_range_config.default) html.add_form_var(self._filter_range_config.column) html.write_html( HTML(f""" <input id={self._filter_range_config.column} name={self._filter_range_config.column} style="pointer-events: all; width: 80%%;" oninput="{self._update_label()}" type="range" step="{self._filter_range_config.step}" min="{self._filter_range_config.min}" max="{self._filter_range_config.max}" value="{actual_value}"> <label id={self._filter_range_config.column}_label>{actual_value}</> """))
def display(self, value: FilterHTTPVariables) -> None: html.open_table() from_value, to_value = (self._days_to_seconds(value.get(v, "")) for v in self.htmlvars) html.open_tr() html.td("%s:" % _("from"), style="vertical-align: middle;") html.open_td() self._valuespec().render_input(self._from_varprefix, from_value) html.close_td() html.close_tr() html.open_tr() html.td("%s:" % _("to"), style="vertical-align: middle;") html.open_td() self._valuespec().render_input(self._to_varprefix, to_value) html.close_td() html.close_tr() html.close_table()
def get_bound(var: str, value: FilterHTTPVariables) -> Optional[int]: rangename = value.get(var + "_range") if rangename == "abs": try: return int(time.mktime(time.strptime(value[var], "%Y-%m-%d"))) except Exception: user_errors.add( MKUserError( var, _("Please enter the date in the format YYYY-MM-DD."))) return None if rangename == "unix": return int(value[var]) if rangename is None: return None try: count = int(value[var]) secs = count * int(rangename) return int(time.time()) - secs except Exception: return None
def filter(self, value: FilterHTTPVariables) -> FilterHeader: self.check_wato_data_update() if folder := value.get(self.ident): return "Filter: host_filename %s\n" % _wato_folders_to_lq_regex( folder)
def display(self, value: FilterHTTPVariables) -> None: html.dropdown(self.ident, self.choices(), deflt=value.get(self.htmlvars[0], ""))
def _to_list(self, value: FilterHTTPVariables) -> List[str]: if folders := value.get(self.htmlvars[0], ""): return folders.split("|")
def need_inventory(self, value: FilterHTTPVariables) -> bool: return bool(value.get(self._varprefix + "name"))
def parse_value(self, value: FilterHTTPVariables) -> Labels: return parse_labels_value(value.get(self.request_vars[0], ""))