]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
kresctl: get API socket from environment variable
authorAleš Mrázek <ales.mrazek@nic.cz>
Mon, 18 Sep 2023 13:19:22 +0000 (15:19 +0200)
committerOto Šťáva <oto.stava@nic.cz>
Mon, 25 Sep 2023 10:58:17 +0000 (12:58 +0200)
- interface and unix_socket validation

manager/knot_resolver_manager/cli/command.py
manager/scripts/run

index c8752d6737fb93fea7a7a28632f16374f4436b1f..5f794e24c6bb7b6fc6484bbe94162bac452c4c9d 100644 (file)
@@ -5,8 +5,11 @@ from pathlib import Path
 from typing import Dict, List, Optional, Tuple, Type, TypeVar
 from urllib.parse import quote
 
-from knot_resolver_manager.constants import DEFAULT_MANAGER_CONFIG_FILE, CONFIG_FILE_ENV_VAR
+from knot_resolver_manager.constants import CONFIG_FILE_ENV_VAR, DEFAULT_MANAGER_CONFIG_FILE, MANAGER_API_SOCK_ENV_VAR
+from knot_resolver_manager.datamodel.config_schema import DEFAULT_MANAGER_API_SOCK
+from knot_resolver_manager.datamodel.types import FilePath, IPAddressPort
 from knot_resolver_manager.utils.modeling import parsing
+from knot_resolver_manager.utils.modeling.exceptions import DataValidationError
 
 T = TypeVar("T", bound=Type["Command"])
 
@@ -14,9 +17,6 @@ CompWords = Dict[str, Optional[str]]
 
 _registered_commands: List[Type["Command"]] = []
 
-# FIXME ostava: Someone put a FIXME on this value without an explanation, so who knows what is wrong with it?
-DEFAULT_SOCKET = "http+unix://%2Fvar%2Frun%2Fknot-resolver%2Fmanager.sock"
-
 
 def register_command(cls: T) -> T:
     _registered_commands.append(cls)
@@ -41,16 +41,17 @@ def get_socket_from_config(config: Path, optional_file: bool) -> Optional[str]:
     try:
         with open(config, "r") as f:
             data = parsing.try_to_parse(f.read())
-        if "management" in data:
-            management = data["management"]
+        mkey = "management"
+        if mkey in data:
+            management = data[mkey]
             if "unix_socket" in management:
-                return management["unix_socket"]
+                return str(FilePath(management["unix_socket"], object_path=f"/{mkey}/unix-socket"))
             elif "interface" in management:
-                split = management["interface"].split("@")
-                host = split[0]
-                port = split[1] if len(split) >= 2 else 80
-                return f"http://{host}:{port}"
+                ip = IPAddressPort(management["interface"], object_path=f"/{mkey}/interface")
+                return f"http://{ip.addr}:{ip.port}"
         return None
+    except ValueError as e:
+        raise DataValidationError(*e.args)
     except OSError as e:
         if not optional_file:
             raise e
@@ -58,26 +59,31 @@ def get_socket_from_config(config: Path, optional_file: bool) -> Optional[str]:
 
 
 def determine_socket(namespace: argparse.Namespace) -> str:
+    # 1) socket from 'kresctl --socket' argument
     if len(namespace.socket) > 0:
         return namespace.socket[0]
 
+    config_path = os.getenv(CONFIG_FILE_ENV_VAR)
+    socket_env = os.getenv(MANAGER_API_SOCK_ENV_VAR)
+
     socket: Optional[str] = None
+    # 2) socket from config file ('kresctl --config' argument)
     if len(namespace.config) > 0:
         socket = get_socket_from_config(namespace.config[0], False)
-        if socket is not None:
-            return socket
+    # 3) socket from config file (environment variable)
+    elif config_path:
+        socket = get_socket_from_config(Path(config_path), False)
+    # 4) socket from environment variable
+    elif socket_env:
+        socket = socket_env
+    # 5) socket from config file (default config file constant)
     else:
-        config_env = os.getenv(CONFIG_FILE_ENV_VAR)
-        if config_env is not None:
-            socket = get_socket_from_config(Path(config_env), False)
-            if socket is not None:
-                return socket
-        else:
-            socket = get_socket_from_config(DEFAULT_MANAGER_CONFIG_FILE, True)
-            if socket is not None:
-                return socket
-
-    return DEFAULT_SOCKET
+        socket = get_socket_from_config(DEFAULT_MANAGER_CONFIG_FILE, True)
+
+    if socket:
+        return socket
+    # 6) socket default
+    return DEFAULT_MANAGER_API_SOCK
 
 
 class CommandArgs:
index 23ed2458afcc7022a22f5dd96e586ea94e79a1c8..4b96aa9a5e50711e1801c843a04579e4be568c3e 100755 (executable)
@@ -34,5 +34,11 @@ mkdir -p "$KRES_MANAGER_RUNTIME/runtime" "$KRES_MANAGER_RUNTIME/cache"
 if [ -z "${KRES_MANAGER_CONFIG:-}" ]; then
     KRES_MANAGER_CONFIG="$KRES_MANAGER_RUNTIME/config.dev.yaml"
 fi
+
+if [ -z "${MANAGER_API_SOCK:-}" ]; then
+    MANAGER_API_SOCK="$KRES_MANAGER_RUNTIME/manager.sock"
+fi
+
 export KRES_MANAGER_CONFIG
+export MANAGER_API_SOCK
 python3 -m knot_resolver_manager $@