diff --git a/src/opnsense/scripts/filter/lib/alias/__init__.py b/src/opnsense/scripts/filter/lib/alias/__init__.py index 75dd3fc55e..5345d2e635 100755 --- a/src/opnsense/scripts/filter/lib/alias/__init__.py +++ b/src/opnsense/scripts/filter/lib/alias/__init__.py @@ -396,3 +396,23 @@ class AliasParser(object): """ for alias in self._aliases: yield self._aliases[alias] + + def get_affected_aliases(self, alias_names): + """ quick impact analysis on aliases to update given a certain list of names (recursive dig) + :param alias_names: list of names + :return: list Alias objects + """ + dep_lists = {} + names = set(alias_names) + retval = [] + has_changed = True + while has_changed: + has_changed = False + for alias in self._aliases.values(): + if alias.get_name() not in dep_lists: + dep_lists = set(alias.get_deps()) + if (alias.get_name() in names or len(names.intersection(dep_lists)) > 0) and alias not in retval: + retval.append(alias) + names.add(alias.get_name()) + has_changed = True + return retval diff --git a/src/opnsense/scripts/filter/update_tables.py b/src/opnsense/scripts/filter/update_tables.py index dc686c9e74..b8d9561eeb 100755 --- a/src/opnsense/scripts/filter/update_tables.py +++ b/src/opnsense/scripts/filter/update_tables.py @@ -79,8 +79,15 @@ if __name__ == '__main__': if alias.get_type() in inputargs.types: to_update.append(alias.get_name()) + query_aliases = aliases.get_affected_aliases(to_update) + if len(query_aliases) == 0: + # no selected target + sys.exit(0) + else: + query_aliases = list(aliases) + use_cached = lambda x: to_update is not None and x not in to_update - for alias in aliases: + for alias in query_aliases: # determine if an alias has expired or updated and collect full chain of dependencies (so we can resolve them). alias_changed_or_expired = max(alias.changed(), alias.expired()) alias_resolve_list = [alias]