示例#1
0
    def rename_host_in_folder_rules(folder):
        rulesets = FolderRulesets(folder)
        rulesets.load()

        changed_folder_rulesets = []
        for varname, ruleset in rulesets.get_rulesets().items():
            for _rule_folder, _rulenr, rule in ruleset.get_rules():
                orig_rule = rule.clone(preserve_id=True)
                if rule.replace_explicit_host_condition(oldname, newname):
                    changed_folder_rulesets.append(varname)

                    log_audit(
                        "edit-rule",
                        _('Renamed host condition from "%s" to "%s"') %
                        (oldname, newname),
                        diff_text=make_diff_text(orig_rule.to_log(),
                                                 rule.to_log()),
                        object_ref=rule.object_ref(),
                    )

        if changed_folder_rulesets:
            add_change(
                "edit-ruleset",
                _("Renamed host in %d rulesets of folder %s") %
                (len(changed_folder_rulesets), folder.title()),
                object_ref=folder.object_ref(),
                sites=folder.all_site_ids(),
            )
            rulesets.save()

        changed_rulesets.extend(changed_folder_rulesets)

        for subfolder in folder.subfolders():
            rename_host_in_folder_rules(subfolder)
    def _rewrite_rules_for(self, conditions: RuleConditions) -> None:
        """Apply changed predefined condition to rules

        After updating a predefined condition it is necessary to rewrite the
        rules.mk the predefined condition refers to. Rules in this file may refer to
        the changed predefined condition. Since the conditions are only applied to the
        rules while saving them this step is needed.
        """
        folder = Folder.folder(conditions.host_folder)
        rulesets = FolderRulesets(folder)
        rulesets.load()

        for ruleset in rulesets.get_rulesets().values():
            for rule in ruleset.get_folder_rules(folder):
                if rule.predefined_condition_id() == self._ident:
                    rule.update_conditions(conditions)

        rulesets.save()
示例#3
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()
示例#4
0
def _change_host_tags_in_rules(operation, mode, folder):
    """Update tags in all rules

    The function parses all rules in all rulesets and looks for host tags that
    have been removed or renamed. If tags are removed then the depending on the
    mode affected rules are either deleted ("delete") or the vanished tags are
    removed from the rule ("remove").

    See _rename_tags_after_confirmation() doc string for additional information.
    """
    affected_rulesets = set()

    rulesets = FolderRulesets(folder)
    rulesets.load()

    for ruleset in rulesets.get_rulesets().values():
        for _folder, _rulenr, rule in ruleset.get_rules():
            affected_rulesets.update(_change_host_tags_in_rule(operation, mode, ruleset, rule))

    if affected_rulesets and mode != TagCleanupMode.CHECK:
        rulesets.save()

    return sorted(affected_rulesets, key=lambda x: x.title())