diff --git a/fieldpoc/config.py b/fieldpoc/config.py index 21a8609..9eae96b 100644 --- a/fieldpoc/config.py +++ b/fieldpoc/config.py @@ -40,22 +40,3 @@ class Config: def check(self): return self.dect.check() - - -class ExtensionConfig(ConfigBase): - def __init__(self, c): - self.num = c[0] - self._c = c[1] - - -class Extensions: - def __init__(self, c): - self._c = c - self.extensions = [] - for e in self._c.get("extensions", {}).items(): - self.extensions.append(ExtensionConfig(e)) - - def extensions_by_type(self, t): - for e in self.extensions: - if e.type == t: - yield e diff --git a/fieldpoc/extensions.py b/fieldpoc/extensions.py new file mode 100644 index 0000000..b0fac2e --- /dev/null +++ b/fieldpoc/extensions.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 + +class ExtensionConfig: + num = None + + callgroup_members = [] + dect_claim_token = None + dect_ipei = None + dialout_allowed = False + name = None + outgoing_extension = None + sip_password = None + static_target = None + trunk = False + type = None + + def __init__(self, **kwargs): + for name, value in kwargs.items(): + if hasattr(type(self), name): + self.__setattr__(name, value) + else: + raise Exception("Invalid config option {}".format(name)) + + if self.type is None: + raise Exception("Type field for extension {} is required".format(self.num)) + elif self.type == "dect": + if self.dect_ipei is None and self.dect_claim_token is None: + raise Exception("dect_ipei can't be used together with dect_claim_token in extension {}".format(self.num)) + elif self.type == "sip": + if self.sip_password is None: + raise Exception("sip_password is required for sip extension {}".format(self.num)) + elif self.type == "static": + if self.static_target is None: + raise Exception("static_target is required for static extension {}".format(self.num)) + + def check_global(self, extensions): + if self.type == "callgroup": + for member in self.callgroup_members: + if member not in extensions.extensions_by_num.keys(): + raise Exception("Callgroup member {} of callgroup {} does not exist as extension".format(member, self.num)) + + +class Extensions: + extensions = [] + extensions_by_num = {} + + def __init__(self, c): + for num, e in c.get("extensions", {}).items(): + extension_config = ExtensionConfig(**{ + "num": num, + } | e) + + self.extensions.append(extension_config) + + if extension_config.num in self.extensions_by_num.keys(): + raise Exception("Extension num already used {}".format(num)) + + self.extensions_by_num[num] = extension_config + + for e in self.extensions: + e.check_global(self) + + + def extensions_by_type(self, t): + for e in self.extensions: + if e.type == t: + yield e diff --git a/fieldpoc/fieldpoc.py b/fieldpoc/fieldpoc.py index 72f5f39..434a854 100644 --- a/fieldpoc/fieldpoc.py +++ b/fieldpoc/fieldpoc.py @@ -8,6 +8,7 @@ import threading from . import config from . import controller +from . import extensions from . import dect from . import routing from . import ywsd @@ -91,4 +92,4 @@ class FieldPOC: self.config = config.Config(json.loads(self.config_file_path.read_text())) def _load_extensions(self): - self.extensions = config.Extensions(json.loads(self.extensions_file_path.read_text())) + self.extensions = extensions.Extensions(json.loads(self.extensions_file_path.read_text()))