Files
guarddog-nexus/guarddog_nexus/config.py

83 lines
2.7 KiB
Python

"""Configuration via environment variables."""
import os
from dataclasses import dataclass, field
from urllib.parse import urlparse
from guarddog_nexus.constants import (
DEFAULT_MAX_CONCURRENT_SCANS,
GUARDDOG_BINARY_FALLBACK,
HTTP_TIMEOUT_API,
HTTP_TIMEOUT_DOWNLOAD,
LLM_DEFAULT_API_BASE,
LLM_DEFAULT_MODEL,
LLM_DEFAULT_TIMEOUT,
)
def _env_int(name: str, default: int) -> int:
val = os.getenv(name)
if val is None:
return default
try:
return int(val)
except ValueError:
import logging
logging.getLogger("guarddog_nexus").warning(
"Invalid value for %s=%r, using default %d", name, val, default
)
return default
def _resolve_allowed_hosts() -> list[str]:
raw = os.getenv("NEXUS_ALLOWED_HOSTS")
if raw:
return [h.strip() for h in raw.split(",") if h.strip()]
parsed = urlparse(os.getenv("NEXUS_URL", "http://localhost:8081"))
host = parsed.hostname or "localhost"
return [host]
@dataclass
class Config:
# Nexus connection
nexus_url: str = os.getenv("NEXUS_URL", "http://localhost:8081")
nexus_allowed_hosts: list[str] = field(default_factory=lambda: _resolve_allowed_hosts())
nexus_download_timeout: int = _env_int("NEXUS_DOWNLOAD_TIMEOUT_SECONDS", HTTP_TIMEOUT_DOWNLOAD)
nexus_api_timeout: int = _env_int("NEXUS_API_TIMEOUT_SECONDS", HTTP_TIMEOUT_API)
# Database
database_path: str = os.getenv("DATABASE_PATH", "data/guarddog.db")
# Server
host: str = os.getenv("HOST", "0.0.0.0")
port: int = _env_int("PORT", 8080)
# Logging
log_level: str = os.getenv("LOG_LEVEL", "INFO")
log_syslog_host: str = os.getenv("LOG_SYSLOG_HOST", "")
log_syslog_port: int = _env_int("LOG_SYSLOG_PORT", 514)
log_syslog_facility: str = os.getenv("LOG_SYSLOG_FACILITY", "")
# Webhooks
webhook_secret: str = os.getenv("WEBHOOK_SECRET", "")
# Scanner
scan_timeout_seconds: int = _env_int("SCAN_TIMEOUT_SECONDS", 300)
temp_dir: str = os.getenv("TEMP_DIR", "/tmp/guarddog-nexus")
guarddog_binary: str = os.getenv("GUARDDOG_BINARY", GUARDDOG_BINARY_FALLBACK)
max_concurrent_scans: int = _env_int("MAX_CONCURRENT_SCANS", DEFAULT_MAX_CONCURRENT_SCANS)
# LLM analysis
llm_enabled: bool = os.getenv("LLM_ENABLED", "").lower() in ("1", "true", "yes")
llm_auto_analyze: bool = os.getenv("LLM_AUTO_ANALYZE", "").lower() in ("1", "true", "yes")
llm_api_base: str = os.getenv("LLM_API_BASE", LLM_DEFAULT_API_BASE)
llm_api_key: str = os.getenv("LLM_API_KEY", "")
llm_model: str = os.getenv("LLM_MODEL", LLM_DEFAULT_MODEL)
llm_timeout: int = _env_int("LLM_TIMEOUT_SECONDS", LLM_DEFAULT_TIMEOUT)
llm_max_concurrent: int = _env_int("LLM_MAX_CONCURRENT_ANALYSES", 2)
config = Config()