diff --git a/ifupdown2/ifupdown/ifupdownmain.py b/ifupdown2/ifupdown/ifupdownmain.py index 46eee7b..d1b651e 100644 --- a/ifupdown2/ifupdown/ifupdownmain.py +++ b/ifupdown2/ifupdown/ifupdownmain.py @@ -10,6 +10,7 @@ import re import os import logging +import itertools import traceback import pprint @@ -1484,8 +1485,21 @@ class ifupdownMain: # continue reading pass + + def _schedule_addon_translate(self): + merged_ifaceobjs = list(itertools.chain.from_iterable(self.ifaceobjdict.values())) + + for addon in self.modules.values(): + try: + addon.translate(merged_ifaceobjs) + except AttributeError: + pass + def _sched_ifaces(self, ifacenames, ops, skipupperifaces=False, followdependents=True, sort=False): + + self._schedule_addon_translate() + self.logger.debug('scheduling \'%s\' for %s' %(str(ops), str(ifacenames))) self._pretty_print_ordered_dict('dependency graph', diff --git a/ifupdown2/lib/addon.py b/ifupdown2/lib/addon.py index b4e258e..29b6921 100644 --- a/ifupdown2/lib/addon.py +++ b/ifupdown2/lib/addon.py @@ -24,6 +24,8 @@ import logging +from collections import OrderedDict + try: from ifupdown2.lib.io import IO from ifupdown2.lib.sysfs import Sysfs @@ -52,3 +54,29 @@ class Addon(Netlink, Cache): self.sysfs = Sysfs self.iproute2 = IPRoute2() self.requirements = Requirements() + + self.__alias_to_attribute = {} + + for attribute_name, attribute_object in self.__get_modinfo().get("attrs", {}).items(): + for alias in attribute_object.get("aliases", []): + self.__alias_to_attribute[alias] = attribute_name + + def __get_modinfo(self) -> dict: + try: + return self._modinfo + except AttributeError: + return {} + + def translate(self, ifaceobjs): + """ + Replace attribute aliases from user configuration with real attribute name + """ + for ifaceobj in ifaceobjs: + ifaceobj.config = OrderedDict( + [ + (self.__alias_to_attribute[user_attr], user_value) + if user_attr in self.__alias_to_attribute + else (user_attr, user_value) + for user_attr, user_value in ifaceobj.config.items() + ] + )