import argparse
+import os
from abc import ABC, abstractmethod # pylint: disable=[no-name-in-module]
from pathlib import Path
from typing import Dict, List, Optional, Tuple, Type, TypeVar
from urllib.parse import quote
+from knot_resolver_manager.constants import CONFIG_FILE_ENV_VAR
+from knot_resolver_manager.utils.modeling import parsing
+
T = TypeVar("T", bound=Type["Command"])
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)
self.subparser: argparse.ArgumentParser = namespace.subparser
self.command: Type["Command"] = namespace.command
- self.socket: str = namespace.socket[0]
+ config_env = os.getenv(CONFIG_FILE_ENV_VAR)
+ if len(namespace.socket) == 0 and len(namespace.config) == 0 and config_env is not None:
+ namespace.config = [config_env]
+
+ self.socket: str = DEFAULT_SOCKET
+ if len(namespace.socket) > 0:
+ self.socket = namespace.socket[0]
+ elif len(namespace.config) > 0:
+ with open(namespace.config[0], "r") as f:
+ config = parsing.try_to_parse(f.read())
+ if "management" in config:
+ management = config["management"]
+ if "unix_socket" in management:
+ self.socket = management["unix_socket"]
+ elif "interface" in management:
+ split = management["interface"].split("@")
+ host = split[0]
+ port = split[1] if len(split) >= 2 else 80
+ self.socket = f"http://{host}:{port}"
+
if Path(self.socket).exists():
self.socket = f'http+unix://{quote(self.socket, safe="")}/'
if self.socket.endswith("/"):
# default=False,
# required=False,
# )
- parser.add_argument(
+ config_or_socket = parser.add_mutually_exclusive_group()
+ config_or_socket.add_argument(
"-s",
"--socket",
action="store",
type=str,
- help="Optional, path to Unix-domain socket or network interface of the management API.",
- default=["http+unix://%2Fvar%2Frun%2Fknot-resolver%2Fmanager.sock"], # FIXME
+ help="Optional, path to Unix-domain socket or network interface of the management API. "
+ "Cannot be used together with '--config'.",
+ default=[],
+ nargs=1,
+ required=False,
+ )
+ config_or_socket.add_argument(
+ "-c",
+ "--config",
+ action="store",
+ type=str,
+ help="Optional, path to Knot Resolver declarative configuration to retrieve socket or network "
+ "interface of the management API from. Cannot be used together with '--socket'.",
+ default=[],
nargs=1,
required=False,
)
STARTUP_LOG_LEVEL = logging.DEBUG
DEFAULT_MANAGER_CONFIG_FILE = Path("/etc/knot-resolver/config.yaml")
+CONFIG_FILE_ENV_VAR = "KRES_MANAGER_CONFIG"
MANAGER_FIX_ATTEMPT_MAX_COUNTER = 2
FIX_COUNTER_DECREASE_INTERVAL_SEC = 30 * 60
PID_FILE_NAME = "manager.pid"
"""
import argparse
+import os
import sys
from pathlib import Path
from typing import NoReturn
from knot_resolver_manager import compat
-from knot_resolver_manager.constants import DEFAULT_MANAGER_CONFIG_FILE
+from knot_resolver_manager.constants import DEFAULT_MANAGER_CONFIG_FILE, CONFIG_FILE_ENV_VAR
from knot_resolver_manager.log import logger_startup
from knot_resolver_manager.server import start_server
args = parse_args()
# where to look for config
- config_path = DEFAULT_MANAGER_CONFIG_FILE if args.config is None else Path(args.config[0])
+ config_env = os.getenv(CONFIG_FILE_ENV_VAR)
+ if args.config is not None:
+ config_path = Path(args.config[0])
+ elif config_env is not None:
+ config_path = Path(config_env)
+ else:
+ config_path = DEFAULT_MANAGER_CONFIG_FILE
exit_code = compat.asyncio.run(start_server(config=config_path))
sys.exit(exit_code)
echo -------------------------------------------------------
# create runtime directories
-mkdir -p etc/knot-resolver/runtime etc/knot-resolver/cache
+if [ -z "${KRES_MANAGER_RUNTIME:-}" ]; then
+ KRES_MANAGER_RUNTIME="etc/knot-resolver"
+fi
+mkdir -p "$KRES_MANAGER_RUNTIME/runtime" "$KRES_MANAGER_RUNTIME/cache"
-python3 -m knot_resolver_manager -c etc/knot-resolver/config.dev.yaml $@
+if [ -z "${KRES_MANAGER_CONFIG:-}" ]; then
+ KRES_MANAGER_CONFIG="$KRES_MANAGER_RUNTIME/config.dev.yaml"
+fi
+export KRES_MANAGER_CONFIG
+python3 -m knot_resolver_manager $@