""":term:`GSO` settings. Ensuring that the required parameters are set correctly. An example file ``oss-params-example.json`` is present in the :term:`GSO` package itself. """ import ipaddress import json import logging import os from pathlib import Path from pydantic import BaseSettings, NonNegativeInt logger = logging.getLogger(__name__) class GeneralParams(BaseSettings): """General parameters for a :term:`GSO` configuration file.""" public_hostname: str """The hostname that :term:`GSO` is publicly served at, used for building the callback URL that the provisioning proxy uses.""" isis_high_metric: int class CeleryParams(BaseSettings): """Parameters for Celery.""" broker_url: str result_backend: str timezone: str = "Europe/Amsterdam" enable_utc: bool = True result_expires: int = 3600 class InfoBloxParams(BaseSettings): """Parameters related to InfoBlox.""" scheme: str wapi_version: str host: str username: str password: str class V4Netmask(NonNegativeInt): """A valid netmask for an IPv4 network or address.""" le = 32 class V6Netmask(NonNegativeInt): """A valid netmask for an IPv6 network or address.""" le = 128 class V4NetworkParams(BaseSettings): """A set of parameters that describe an IPv4 network in InfoBlox.""" containers: list[ipaddress.IPv4Network] networks: list[ipaddress.IPv4Network] mask: V4Netmask class V6NetworkParams(BaseSettings): """A set of parameters that describe an IPv6 network in InfoBlox.""" containers: list[ipaddress.IPv6Network] networks: list[ipaddress.IPv6Network] mask: V6Netmask class ServiceNetworkParams(BaseSettings): """Parameters for InfoBlox. The parameters describe IPv4 and v6 networks, and the corresponding domain name that should be used as a suffix. """ V4: V4NetworkParams V6: V6NetworkParams domain_name: str dns_view: str network_view: str class IPAMParams(BaseSettings): """A set of parameters related to :term:`IPAM`.""" INFOBLOX: InfoBloxParams LO: ServiceNetworkParams TRUNK: ServiceNetworkParams GEANT_IP: ServiceNetworkParams SI: ServiceNetworkParams LT_IAS: ServiceNetworkParams class MonitoringSNMPV2Params(BaseSettings): """Parameters related to SNMPv2.""" community: str class MonitoringSNMPV3Params(BaseSettings): """Parameters related to SNMPv3.""" authlevel: str authname: str authpass: str authalgo: str cryptopass: str cryptoalgo: str class MonitoringLibreNMSParams(BaseSettings): """Parameters related to LibreNMS.""" base_url: str token: str class SNMPParams(BaseSettings): """Parameters for SNMP in LibreNMS.""" v2c: MonitoringSNMPV2Params #: .. versionadded :: 2.0 #: Support for :term:`SNMP` v3 will get added in a later version of :term:`GSO`. Parameters are optional for now. v3: MonitoringSNMPV3Params | None class MonitoringParams(BaseSettings): """Parameters related to the monitoring.""" LIBRENMS: MonitoringLibreNMSParams SNMP: SNMPParams class ProvisioningProxyParams(BaseSettings): """Parameters for the provisioning proxy.""" scheme: str api_base: str #: .. deprecated:: 0.1 #: Not used anymore, may be left out from config file. auth: str | None api_version: int class NetBoxParams(BaseSettings): """Parameters for NetBox.""" token: str api: str class EmailParams(BaseSettings): """Parameters for the email service.""" # TODO: Use more strict types after we've migrated to Pydantic 2.x from_address: str smtp_host: str smtp_port: int starttls_enabled: bool smtp_username: str | None smtp_password: str | None class OSSParams(BaseSettings): """The set of parameters required for running :term:`GSO`.""" GENERAL: GeneralParams IPAM: IPAMParams NETBOX: NetBoxParams MONITORING: MonitoringParams PROVISIONING_PROXY: ProvisioningProxyParams CELERY: CeleryParams THIRD_PARTY_API_KEYS: dict[str, str] EMAIL: EmailParams def load_oss_params() -> OSSParams: """Look for ``OSS_PARAMS_FILENAME`` in the environment and load the parameters from that file.""" with Path(os.environ["OSS_PARAMS_FILENAME"]).open(encoding="utf-8") as file: return OSSParams(**json.loads(file.read())) if __name__ == "__main__": logger.debug(load_oss_params())