66 lines
2.9 KiB
Python
66 lines
2.9 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime, timezone
|
|
from pathlib import Path
|
|
|
|
from app.core.db import get_db
|
|
from app.core.files import tail_lines
|
|
from app.services.runtime_settings_service import get_runtime_settings
|
|
from app.services.settings_service import get_settings_payload
|
|
from app.services.worker_control_service import detect_worker_runtime
|
|
|
|
|
|
def get_detect_status() -> dict:
|
|
queries = {
|
|
"pending": "select count(*) from domains where detect_status = 0",
|
|
"completed": "select count(*) from domains where detect_status = 1",
|
|
"running": "select count(*) from domains where detect_status = 2",
|
|
"blacklisted": "select count(*) from domains where detect_status = 3",
|
|
"failed": "select count(*) from domains where detect_status = 4",
|
|
}
|
|
progress: dict[str, int] = {}
|
|
with get_db() as conn:
|
|
with conn.cursor() as cur:
|
|
for key, query in queries.items():
|
|
cur.execute(query)
|
|
progress[key] = cur.fetchone()[0]
|
|
|
|
settings_payload = get_settings_payload()
|
|
worker_log = Path(__file__).resolve().parents[3] / "domainCheck" / "detect_worker.log"
|
|
if not worker_log.exists():
|
|
worker_log = Path(__file__).resolve().parents[3] / "domainCheck" / "logs" / "detect_worker.log"
|
|
|
|
worker_online = False
|
|
last_log_time = None
|
|
if worker_log.exists():
|
|
modified = datetime.fromtimestamp(worker_log.stat().st_mtime, tz=timezone.utc)
|
|
last_log_time = modified.isoformat()
|
|
worker_online = (datetime.now(timezone.utc) - modified).total_seconds() < 180
|
|
|
|
recent_lines = tail_lines("detect_worker.log", max_lines=80)
|
|
recent_proxy_warning = next(
|
|
(line for line in reversed(recent_lines) if "代理" in line or "Redis订阅失败" in line),
|
|
"",
|
|
)
|
|
runtime = detect_worker_runtime()
|
|
runtime_settings = get_runtime_settings()
|
|
worker_online = worker_online or runtime.get("running", False)
|
|
|
|
return {
|
|
"worker_online": worker_online,
|
|
"worker_mode": runtime.get("mode", "windows-local"),
|
|
"worker_service_name": runtime_settings.get("worker_service_name", ""),
|
|
"api_service_name": runtime_settings.get("api_service_name", ""),
|
|
"worker_process_count": runtime.get("process_count", 0),
|
|
"worker_latest_start_time": runtime.get("latest_start_time", ""),
|
|
"worker_runtime_message": runtime.get("message", ""),
|
|
"thread_count": settings_payload["thread_count"],
|
|
"proxy_enable": settings_payload["proxy_config"].get("proxy_enable", False),
|
|
"allow_direct": settings_payload["proxy_config"].get("allow_direct", False),
|
|
"proxy_pool_count": len(settings_payload["proxy_config"].get("proxy_urls", [])),
|
|
"available_proxy_count": 0,
|
|
"last_worker_log_time": last_log_time,
|
|
"progress": progress,
|
|
"recent_warning": recent_proxy_warning,
|
|
}
|