import base64 import logging import os from typing import List from urllib import parse from pydantic import BaseModel from starlette.config import Config from starlette.datastructures import CommaSeparatedStrings log = logging.getLogger(__name__) class BaseConfigurationModel(BaseModel): """Base configuration model used by all config options.""" pass def get_env_tags(tag_list: List[str]) -> dict: """Create dictionary of available env tags.""" tags = {} for t in tag_list: tag_key, env_key = t.split(":") env_value = os.environ.get(env_key) if env_value: tags.update({tag_key: env_value}) return tags def get_config(): try: # Try to load from .env file first config = Config(".env") except FileNotFoundError: # If .env doesn't exist, use environment variables config = Config(environ=os.environ) return config config = get_config() LOG_LEVEL = config("LOG_LEVEL", default="INFO") ENV = config("ENV", default="local") PORT = config("PORT", cast=int, default=8000) HOST = config("HOST", default="localhost") # database DATABASE_HOSTNAME = config("DATABASE_HOSTNAME") _DATABASE_CREDENTIAL_USER = config("DATABASE_CREDENTIAL_USER") _DATABASE_CREDENTIAL_PASSWORD = config("DATABASE_CREDENTIAL_PASSWORD") _QUOTED_DATABASE_PASSWORD = parse.quote(str(_DATABASE_CREDENTIAL_PASSWORD)) DATABASE_NAME = config("DATABASE_NAME", default="digital_twin") DATABASE_PORT = config("DATABASE_PORT", default="5432") DATABASE_ENGINE_POOL_SIZE = config("DATABASE_ENGINE_POOL_SIZE", cast=int, default=20) DATABASE_ENGINE_MAX_OVERFLOW = config( "DATABASE_ENGINE_MAX_OVERFLOW", cast=int, default=0 ) COLLECTOR_HOSTNAME = config("COLLECTOR_HOSTNAME") COLLECTOR_PORT = config("COLLECTOR_PORT", default="5432") COLLECTOR_CREDENTIAL_USER = config("COLLECTOR_CREDENTIAL_USER") COLLECTOR_CREDENTIAL_PASSWORD = config("COLLECTOR_CREDENTIAL_PASSWORD") QUOTED_COLLECTOR_CREDENTIAL_PASSWORD = parse.quote(str(COLLECTOR_CREDENTIAL_PASSWORD)) COLLECTOR_NAME = config("COLLECTOR_NAME") # Deal with DB disconnects # https://docs.sqlalchemy.org/en/20/core/pooling.html#pool-disconnects DATABASE_ENGINE_POOL_PING = config("DATABASE_ENGINE_POOL_PING", default=False) SQLALCHEMY_DATABASE_URI = f"postgresql+asyncpg://{_DATABASE_CREDENTIAL_USER}:{_QUOTED_DATABASE_PASSWORD}@{DATABASE_HOSTNAME}:{DATABASE_PORT}/{DATABASE_NAME}" SQLALCHEMY_COLLECTOR_URI = f"postgresql+asyncpg://{COLLECTOR_CREDENTIAL_USER}:{QUOTED_COLLECTOR_CREDENTIAL_PASSWORD}@{COLLECTOR_HOSTNAME}:{COLLECTOR_PORT}/{COLLECTOR_NAME}" TIMEZONE = "Asia/Jakarta" MAXIMO_BASE_URL = config("MAXIMO_BASE_URL", default="http://example.com") MAXIMO_API_KEY = config("MAXIMO_API_KEY", default="keys") AUTH_SERVICE_API = config("AUTH_SERVICE_API", default="http://192.168.1.82:8000/auth") AEROS_BASE_URL = config("AEROS_BASE_URL", default="http://192.168.1.102") AEROS_BASE_URL_OLD = config("AEROS_BASE_URL_OLD", default="http://192.168.1.87") WINDOWS_AEROS_BASE_URL = config("WINDOWS_AEROS_BASE_URL", default="http://192.168.1.102:8800") DEFAULT_PROJECT_NAME = config("DEFAULT_PROJECT_NAME", default="RBD TJB") TEMPORAL_URL = config("TEMPORAL_URL", default="http://192.168.1.86:7233") RELIABILITY_SERVICE_API = config("RELIABILITY_SERVICE_API", default="http://192.168.1.82:8000/reliability") CLAMAV_HOST = config("CLAMAV_HOST", default="192.168.1.82") CLAMAV_PORT = config("CLAMAV_PORT", cast=int, default=3310) # AEROS_LICENSE_ID = config("AEROS_LICENSE_ID", default="") # AEROS_LICENSE_SECRET = config("AEROS_LICENSE_SECRET", default="") VAULT_URL=config('VAULT_URL') ROLE_ID=config('ROLE_ID') SECRET_ID=config('SECRET_ID') AEROS_SECRET_PATH=config('AEROS_SECRET_PATH')