mirror of
https://github.com/checktheroads/hyperglass
synced 2024-05-11 05:55:08 +00:00
144 lines
4.5 KiB
Python
144 lines
4.5 KiB
Python
"""Import configuration files and run validation."""
|
|
|
|
# Third Party
|
|
from pydantic import ValidationError
|
|
|
|
# Project
|
|
from hyperglass.log import log, enable_file_logging, enable_syslog_logging
|
|
from hyperglass.settings import Settings
|
|
from hyperglass.models.ui import UIParameters
|
|
from hyperglass.models.directive import Directive, Directives
|
|
from hyperglass.exceptions.private import ConfigError, ConfigInvalid
|
|
from hyperglass.models.config.params import Params
|
|
from hyperglass.models.config.devices import Devices
|
|
|
|
# Local
|
|
from .load import load_config
|
|
from .markdown import get_markdown
|
|
|
|
__all__ = (
|
|
"init_devices",
|
|
"init_directives",
|
|
"init_files",
|
|
"init_params",
|
|
"init_ui_params",
|
|
)
|
|
|
|
|
|
def init_files() -> None:
|
|
"""Check if required directories exist and if not, create them."""
|
|
for directory in ("plugins", "static/images"):
|
|
path = Settings.app_path / directory
|
|
if not path.exists():
|
|
path.mkdir(parents=True)
|
|
log.debug("Created directory {!s}", path)
|
|
|
|
|
|
def init_params() -> "Params":
|
|
"""Validate & initialize configuration parameters."""
|
|
user_config = load_config("config", required=False)
|
|
# Map imported user configuration to expected schema.
|
|
params = Params(**user_config)
|
|
|
|
# Set up file logging once configuration parameters are initialized.
|
|
enable_file_logging(
|
|
log_directory=params.logging.directory,
|
|
log_format=params.logging.format,
|
|
log_max_size=params.logging.max_size,
|
|
debug=Settings.debug,
|
|
)
|
|
|
|
# Set up syslog logging if enabled.
|
|
if params.logging.syslog is not None and params.logging.syslog.enable:
|
|
enable_syslog_logging(
|
|
syslog_host=params.logging.syslog.host,
|
|
syslog_port=params.logging.syslog.port,
|
|
)
|
|
|
|
if params.logging.http is not None and params.logging.http.enable:
|
|
log.debug("HTTP logging is enabled")
|
|
|
|
# Perform post-config initialization string formatting or other
|
|
# functions that require access to other config levels. E.g.,
|
|
# something in 'params.web.text' needs to be formatted with a value
|
|
# from params.
|
|
try:
|
|
params.web.text.subtitle = params.web.text.subtitle.format(
|
|
**params.dict(exclude={"web", "queries", "messages"})
|
|
)
|
|
|
|
# If keywords are unmodified (default), add the org name &
|
|
# site_title.
|
|
if Params().site_keywords == params.site_keywords:
|
|
params.site_keywords = sorted(
|
|
{*params.site_keywords, params.org_name, params.site_title}
|
|
)
|
|
except KeyError:
|
|
pass
|
|
|
|
return params
|
|
|
|
|
|
def init_directives() -> "Directives":
|
|
"""Validate & initialize directives."""
|
|
# Map imported user directives to expected schema.
|
|
directives = load_config("directives", required=False)
|
|
try:
|
|
directives = (
|
|
Directive(id=name, **directive)
|
|
for name, directive in load_config("directives", required=False).items()
|
|
)
|
|
|
|
except ValidationError as err:
|
|
raise ConfigInvalid(errors=err.errors()) from err
|
|
|
|
return Directives(*directives)
|
|
|
|
|
|
def init_devices() -> "Devices":
|
|
"""Validate & initialize devices."""
|
|
devices_config = load_config("devices", required=True)
|
|
items = []
|
|
|
|
# Support first matching main key name.
|
|
for key in ("main", "devices", "routers"):
|
|
if key in devices_config:
|
|
items = devices_config[key]
|
|
break
|
|
|
|
if len(items) < 1:
|
|
raise ConfigError("No devices are defined in devices file")
|
|
|
|
devices = Devices(*items)
|
|
log.debug("Initialized devices {!r}", devices)
|
|
|
|
return devices
|
|
|
|
|
|
def init_ui_params(*, params: "Params", devices: "Devices") -> "UIParameters":
|
|
"""Validate & initialize UI parameters."""
|
|
|
|
# Project
|
|
from hyperglass.defaults import CREDIT
|
|
from hyperglass.constants import PARSED_RESPONSE_FIELDS, __version__
|
|
|
|
content_greeting = get_markdown(
|
|
config=params.web.greeting,
|
|
default="",
|
|
params={"title": params.web.greeting.title},
|
|
)
|
|
content_credit = CREDIT.format(version=__version__)
|
|
|
|
_ui_params = params.frontend()
|
|
_ui_params["web"]["logo"]["light_format"] = params.web.logo.light.suffix
|
|
_ui_params["web"]["logo"]["dark_format"] = params.web.logo.dark.suffix
|
|
|
|
return UIParameters(
|
|
**_ui_params,
|
|
version=__version__,
|
|
devices=devices.frontend(),
|
|
developer_mode=Settings.dev_mode,
|
|
parsed_data_fields=PARSED_RESPONSE_FIELDS,
|
|
content={"credit": content_credit, "greeting": content_greeting},
|
|
)
|