Exemplo n.º 1
0
    def _move_rules_for_conditions(self, conditions, old_path):
        # type (RuleConditions, str) -> None
        """Apply changed folder of predefined condition to rules"""
        old_folder = Folder.folder(old_path)
        old_rulesets = FolderRulesets(old_folder)
        old_rulesets.load()

        new_folder = Folder.folder(conditions.host_folder)
        new_rulesets = FolderRulesets(new_folder)
        new_rulesets.load()

        for old_ruleset in old_rulesets.get_rulesets().values():
            for rule in old_ruleset.get_folder_rules(old_folder):
                if rule.predefined_condition_id() == self._ident:
                    old_ruleset.delete_rule(rule)

                    new_ruleset = new_rulesets.get(old_ruleset.name)
                    new_ruleset.append_rule(new_folder, rule)

        new_rulesets.save()
        old_rulesets.save()
Exemplo n.º 2
0
def create_rule(param):
    """Create rule"""
    user.need_permission("wato.edit")
    user.need_permission("wato.rulesets")
    body = param["body"]
    folder: CREFolder = body["folder"]
    value = body["value_raw"]
    ruleset_name = body["ruleset"]

    folder.need_permission("write")

    rulesets = FolderRulesets(folder)
    rulesets.load()
    try:
        ruleset = rulesets.get(ruleset_name)
    except KeyError:
        return problem(
            status=400,
            detail=f"Ruleset {ruleset_name!r} could not be found.",
        )

    try:
        ruleset.valuespec().validate_value(value, "")
    except exceptions.MKUserError as exc:
        if exc.varname is None:
            title = "A field has a problem"
        else:
            field_name = strip_tags(exc.varname.replace("_p_", ""))
            title = f"Problem in (sub-)field {field_name!r}"

        return problem(
            status=400,
            detail=strip_tags(exc.message),
            title=title,
        )

    rule = Rule(
        gen_id(),
        folder,
        ruleset,
        RuleConditions(
            host_folder=folder.path(),
            host_tags=body["conditions"].get("host_tags"),
            host_labels=body["conditions"].get("host_labels"),
            host_name=body["conditions"].get("host_name"),
            service_description=body["conditions"].get("service_description"),
            service_labels=body["conditions"].get("service_labels"),
        ),
        RuleOptions.from_config(body["properties"]),
        value,
    )
    index = ruleset.append_rule(folder, rule)
    rulesets.save()
    # TODO Duplicated code is in pages/rulesets.py:2670-
    # TODO Move to
    add_change(
        "new-rule",
        _l('Created new rule #%d in ruleset "%s" in folder "%s"') %
        (index, ruleset.title(), folder.alias_path()),
        sites=folder.all_site_ids(),
        diff_text=make_diff_text({}, rule.to_log()),
        object_ref=rule.object_ref(),
    )
    rule_entry = _get_rule_by_id(rule.id)
    return serve_json(_serialize_rule(rule_entry))