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()
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()
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())