mirror of
https://github.com/mgeeky/decode-spam-headers.git
synced 2026-02-22 13:33:30 +01:00
76 lines
1.9 KiB
Python
76 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
import time
|
|
import tomllib
|
|
from importlib import metadata
|
|
from pathlib import Path
|
|
|
|
from fastapi import APIRouter
|
|
|
|
from app.engine.scanner_registry import ScannerRegistry
|
|
from app.schemas.health import HealthResponse
|
|
|
|
router = APIRouter(prefix="/api", tags=["health"])
|
|
|
|
_START_TIME = time.monotonic()
|
|
_PROJECT_NAME = "web-header-analyzer-backend"
|
|
|
|
|
|
@router.get("/health", response_model=HealthResponse)
|
|
def health_check() -> HealthResponse:
|
|
status = "up"
|
|
scanner_count = 0
|
|
|
|
try:
|
|
registry = ScannerRegistry()
|
|
scanner_count = len(registry.list_tests())
|
|
if scanner_count == 0:
|
|
status = "degraded"
|
|
except Exception:
|
|
status = "down"
|
|
scanner_count = 0
|
|
|
|
return HealthResponse(
|
|
status=status,
|
|
version=_resolve_version(),
|
|
uptime=_uptime_seconds(),
|
|
scanner_count=scanner_count,
|
|
)
|
|
|
|
|
|
def _uptime_seconds() -> float:
|
|
return max(0.0, time.monotonic() - _START_TIME)
|
|
|
|
|
|
def _resolve_version() -> str:
|
|
env_version = os.getenv("WHA_VERSION", "").strip()
|
|
if env_version:
|
|
return env_version
|
|
|
|
try:
|
|
return metadata.version(_PROJECT_NAME)
|
|
except metadata.PackageNotFoundError:
|
|
pass
|
|
|
|
pyproject_path = Path(__file__).resolve().parents[2] / "pyproject.toml"
|
|
if pyproject_path.exists():
|
|
try:
|
|
data = pyproject_path.read_text(encoding="utf-8")
|
|
except OSError:
|
|
data = ""
|
|
if data:
|
|
try:
|
|
parsed = tomllib.loads(data)
|
|
except ValueError:
|
|
parsed = {}
|
|
version = (
|
|
parsed.get("project", {}).get("version")
|
|
if isinstance(parsed, dict)
|
|
else None
|
|
)
|
|
if isinstance(version, str) and version.strip():
|
|
return version.strip()
|
|
|
|
return "unknown"
|