2023-06-17 20:07:50 +03:00
|
|
|
import os
|
|
|
|
import tomllib
|
2023-07-22 23:59:49 +03:00
|
|
|
from pathlib import Path
|
|
|
|
from collections import UserDict
|
2023-06-17 20:07:50 +03:00
|
|
|
|
|
|
|
|
2023-07-22 23:59:49 +03:00
|
|
|
NODEAGENT_CONFIG_FILE = os.getenv('NODEAGENT_CONFIG_FILE')
|
|
|
|
NODEAGENT_DEFAULT_CONFIG_FILE = '/etc/node-agent/config.toml'
|
2023-06-17 20:07:50 +03:00
|
|
|
|
|
|
|
|
2023-07-29 15:35:36 +03:00
|
|
|
class ConfigLoadError(Exception):
|
|
|
|
"""Bad config file syntax, unreachable file or bad data."""
|
|
|
|
|
|
|
|
|
2023-07-22 23:59:49 +03:00
|
|
|
class ConfigLoader(UserDict):
|
|
|
|
def __init__(self, file: Path | None = None):
|
|
|
|
if file is None:
|
|
|
|
file = NODEAGENT_CONFIG_FILE or NODEAGENT_DEFAULT_CONFIG_FILE
|
|
|
|
self.file = Path(file)
|
|
|
|
self.data = self._load()
|
2023-07-28 01:01:32 +03:00
|
|
|
# todo: load deafult configuration
|
2023-06-17 20:07:50 +03:00
|
|
|
|
2023-07-22 23:59:49 +03:00
|
|
|
def _load(self):
|
|
|
|
try:
|
|
|
|
with open(self.file, 'rb') as config:
|
|
|
|
return tomllib.load(config)
|
2023-07-28 01:01:32 +03:00
|
|
|
# todo: config schema validation
|
2023-07-22 23:59:49 +03:00
|
|
|
except tomllib.TOMLDecodeError as tomlerr:
|
2023-07-28 01:01:32 +03:00
|
|
|
raise ConfigLoadError(f'Bad TOML syntax in config file: {self.file}: {tomlerr}') from tomlerr
|
2023-07-29 14:29:37 +03:00
|
|
|
except (OSError, ValueError) as readerr:
|
|
|
|
raise ConfigLoadError(f'Cannot read config file: {self.file}: {readerr}') from readerr
|