Initial curated Unraid-AppOps-Gateway source from 3bd6f6fee310125bfbb4d4650389a817f498724d

This commit is contained in:
Public Source Publisher committed 2026-10-01 01:35:57 +02:00
commit 1dfbca08a1
528 files changed
+131054

No files matched your search

+91
View File
@@ -0,0 +1,91 @@
from __future__ import annotations
from collections.abc import Callable
from typing import Any
from sqlmodel import Session, select
from ..connectors.authentik import AuthentikConnector
from ..connectors.deluge import DelugeConnector
from ..connectors.nginx_proxy_manager import NginxProxyManagerConnector
from ..connectors.plex import PlexConnector
from ..connectors.portainer import PortainerConnector
from ..connectors.prowlarr import ProwlarrConnector
from ..connectors.radarr import RadarrConnector
from ..connectors.sonarr import SonarrConnector
from ..connectors.tautulli import TautulliConnector
from ..connectors.unraid import UnraidConnector
from ..connectors.widefrog import WidefrogConnector
from ..core.time import utc_now
from ..db.models import App, Connector, NotificationChannel
from . import notification_service, safety_center_service
from .setup_service import apply_stored_connector_settings
_TESTERS: dict[str, Callable[[], Any]] = {
'authentik': AuthentikConnector,
'deluge': DelugeConnector,
'nginx_proxy_manager': NginxProxyManagerConnector,
'plex': PlexConnector,
'portainer': PortainerConnector,
'prowlarr': ProwlarrConnector,
'radarr': RadarrConnector,
'sonarr': SonarrConnector,
'tautulli': TautulliConnector,
'unraid': UnraidConnector,
'widefrog': WidefrogConnector,
}
def _stored_status(status: str) -> str:
return 'error' if status == 'unreachable' else status
def test_and_persist_connector(session: Session, connector_id: str) -> dict[str, Any]:
connector = session.get(Connector, connector_id)
if not connector:
return {'status': 'disconnected', 'reason': 'connector_not_found'}
apply_stored_connector_settings(session, {connector_id})
if connector_id == 'home_assistant':
channel = session.get(NotificationChannel, 'home_assistant')
result = (
notification_service.test_channel_connection(session, 'home_assistant')
if channel
else {'status': 'missing_config', 'reason': 'notification_channel_not_found'}
)
else:
factory = _TESTERS.get(connector_id)
result = factory().test_connection() if factory else {'status': 'error', 'reason': 'test_not_implemented'}
status = str(result.get('status') or 'disconnected')
persisted_status = _stored_status(status)
connector.status = persisted_status
connector.last_test = utc_now().isoformat()
session.add(connector)
app = session.get(App, connector_id)
if app and app.connector_status != persisted_status:
app.connector_status = persisted_status
session.add(app)
session.commit()
safety_center_service.invalidate_cache()
return {**result, 'status': status}
def refresh_connector_statuses(session: Session) -> dict[str, Any]:
connector_ids = list(session.exec(select(Connector.id).order_by(Connector.id)).all())
results: dict[str, str] = {}
for connector_id in connector_ids:
if connector_id not in _TESTERS and connector_id != 'home_assistant':
continue
result = test_and_persist_connector(session, connector_id)
results[connector_id] = str(result.get('status') or 'disconnected')
return {
'success': True,
'status': 'ok',
'tested': len(results),
'connected': sum(status == 'connected' for status in results.values()),
'results': results,
}