131 lines
5.0 KiB
Python
131 lines
5.0 KiB
Python
"""Nextcloud maintenance task implementation."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from ..k8s.exec import ExecError
|
|
from ..k8s.pods import PodSelectionError
|
|
from ..settings import settings
|
|
|
|
|
|
def _run_shell(service: Any, script: str, check: bool = True) -> None:
|
|
service._executor.exec(
|
|
script,
|
|
timeout_sec=settings.nextcloud_exec_timeout_sec,
|
|
check=check,
|
|
)
|
|
|
|
|
|
def run_maintenance(service: Any) -> dict[str, Any]:
|
|
"""Run theming, app-link, quota, and filesystem maintenance for Nextcloud."""
|
|
|
|
if not settings.nextcloud_namespace:
|
|
raise RuntimeError("nextcloud maintenance not configured")
|
|
|
|
try:
|
|
_run_shell(
|
|
service,
|
|
"""
|
|
set -euo pipefail
|
|
if [ ! -d /var/www/html/lib ] && [ -d /usr/src/nextcloud/lib ]; then
|
|
if command -v rsync >/dev/null 2>&1; then
|
|
rsync -a --delete --exclude config --exclude data /usr/src/nextcloud/ /var/www/html/
|
|
else
|
|
cp -a /usr/src/nextcloud/. /var/www/html/
|
|
fi
|
|
fi
|
|
mkdir -p /var/www/html/data
|
|
chown 33:33 /var/www/html || true
|
|
chmod 775 /var/www/html || true
|
|
chown -R 33:33 /var/www/html/apps /var/www/html/custom_apps /var/www/html/data /var/www/html/config 2>/dev/null || true
|
|
""",
|
|
check=False,
|
|
)
|
|
|
|
service._occ(["config:app:set", "theming", "name", "--value", "Atlas Cloud"])
|
|
service._occ(["config:app:set", "theming", "slogan", "--value", "Unified access to Atlas services"])
|
|
theming_url = settings.nextcloud_url or "https://cloud.bstein.dev"
|
|
service._occ(["config:app:set", "theming", "url", "--value", theming_url])
|
|
service._occ(["config:app:set", "theming", "color", "--value", "#0f172a"])
|
|
service._occ(["config:app:set", "theming", "disable-user-theming", "--value", "yes"])
|
|
|
|
service._executor.exec(
|
|
["runuser", "-u", "www-data", "--", "php", "/var/www/html/occ", "app:install", "customcss"],
|
|
timeout_sec=settings.nextcloud_exec_timeout_sec,
|
|
check=False,
|
|
)
|
|
service._executor.exec(
|
|
["runuser", "-u", "www-data", "--", "php", "/var/www/html/occ", "app:enable", "customcss"],
|
|
timeout_sec=settings.nextcloud_exec_timeout_sec,
|
|
check=False,
|
|
)
|
|
|
|
mail_css = (
|
|
".mail-message-body, .mail-message-body pre, .mail-message-body code, .mail-message-body table {\n"
|
|
" font-family: \"Inter\", \"Source Sans 3\", \"Helvetica Neue\", Arial, sans-serif;\n"
|
|
" font-size: 14px;\n"
|
|
" line-height: 1.6;\n"
|
|
" color: var(--color-main-text);\n"
|
|
"}\n"
|
|
".mail-message-body pre {\n"
|
|
" background: rgba(15, 23, 42, 0.06);\n"
|
|
" padding: 12px;\n"
|
|
" border-radius: 8px;\n"
|
|
"}\n"
|
|
".mail-message-body blockquote {\n"
|
|
" border-left: 3px solid var(--color-border);\n"
|
|
" padding-left: 12px;\n"
|
|
" margin: 8px 0;\n"
|
|
" color: var(--color-text-lighter);\n"
|
|
"}\n"
|
|
".mail-message-body img {\n"
|
|
" max-width: 100%;\n"
|
|
" border-radius: 6px;\n"
|
|
"}\n"
|
|
)
|
|
service._occ(["config:app:set", "customcss", "css", "--value", mail_css])
|
|
service._occ(["config:app:set", "files", "default_quota", "--value", "250 GB"])
|
|
|
|
payload = service._external_api("GET", "?format=json")
|
|
links = payload.get("ocs", {}).get("data", []) if isinstance(payload, dict) else []
|
|
for link in links:
|
|
link_id = link.get("id") if isinstance(link, dict) else None
|
|
if link_id is not None:
|
|
service._external_api("DELETE", f"/sites/{link_id}?format=json")
|
|
|
|
sites = [
|
|
("Vaultwarden", "https://vault.bstein.dev"),
|
|
("Jellyfin", "https://stream.bstein.dev"),
|
|
("Gitea", "https://scm.bstein.dev"),
|
|
("Jenkins", "https://ci.bstein.dev"),
|
|
("Harbor", "https://registry.bstein.dev"),
|
|
("Vault", "https://secret.bstein.dev"),
|
|
("Jitsi", "https://meet.bstein.dev"),
|
|
("Grafana", "https://metrics.bstein.dev"),
|
|
("Chat LLM", "https://chat.ai.bstein.dev"),
|
|
("Vision", "https://draw.ai.bstein.dev"),
|
|
("STT/TTS", "https://talk.ai.bstein.dev"),
|
|
]
|
|
for name, url in sites:
|
|
service._external_api(
|
|
"POST",
|
|
"/sites?format=json",
|
|
data={
|
|
"name": name,
|
|
"url": url,
|
|
"lang": "",
|
|
"type": "link",
|
|
"device": "",
|
|
"icon": "",
|
|
"groups[]": "",
|
|
"redirect": "1",
|
|
},
|
|
)
|
|
except (ExecError, PodSelectionError, TimeoutError) as exc:
|
|
return {"status": "error", "detail": str(exc)}
|
|
except Exception as exc: # noqa: BLE001
|
|
return {"status": "error", "detail": str(exc)}
|
|
|
|
return {"status": "ok", "detail": "maintenance complete"}
|