mirror of
https://github.com/karl0ss/homepage.git
synced 2025-05-06 23:33:41 +01:00
Merge branch 'main' into feature/mealie-widget
This commit is contained in:
commit
39a94190cf
@ -16,6 +16,7 @@
|
|||||||
**/compose*
|
**/compose*
|
||||||
**/Dockerfile*
|
**/Dockerfile*
|
||||||
**/node_modules
|
**/node_modules
|
||||||
|
!**/node_modules/.pnpm/compressjs@*/**
|
||||||
**/npm-debug.log
|
**/npm-debug.log
|
||||||
**/obj
|
**/obj
|
||||||
**/secrets.dev.yaml
|
**/secrets.dev.yaml
|
||||||
|
@ -52,6 +52,8 @@ COPY --link --chown=1000:1000 /public ./public/
|
|||||||
# Copy files from builder
|
# Copy files from builder
|
||||||
COPY --link --from=builder --chown=1000:1000 /app/.next/standalone ./
|
COPY --link --from=builder --chown=1000:1000 /app/.next/standalone ./
|
||||||
COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static/
|
COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static/
|
||||||
|
# see https://github.com/benphelps/homepage/issues/1795
|
||||||
|
COPY --link --from=builder /app/node_modules/.pnpm/compressjs@1.0.3/node_modules/compressjs/lib/ ./node_modules/.pnpm/compressjs@1.0.3/node_modules/compressjs/lib/
|
||||||
COPY --link --chmod=755 docker-entrypoint.sh /usr/local/bin/
|
COPY --link --chmod=755 docker-entrypoint.sh /usr/local/bin/
|
||||||
|
|
||||||
RUN apk add --no-cache su-exec
|
RUN apk add --no-cache su-exec
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"totalUsed": "Used Storage",
|
"totalUsed": "Used Storage",
|
||||||
"noRecent": "Out of Date"
|
"noRecent": "Out of Date"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -237,17 +237,17 @@
|
|||||||
},
|
},
|
||||||
"bazarr": {
|
"bazarr": {
|
||||||
"missingEpisodes": "Επεισόδια που λείπουν",
|
"missingEpisodes": "Επεισόδια που λείπουν",
|
||||||
"missingMovies": "Missing Movies"
|
"missingMovies": "Ταινίες που Λείπουν"
|
||||||
},
|
},
|
||||||
"ombi": {
|
"ombi": {
|
||||||
"pending": "Pending",
|
"pending": "Σε εκκρεμότητα",
|
||||||
"approved": "Approved",
|
"approved": "Εγκρίθηκε",
|
||||||
"available": "Available"
|
"available": "Διαθέσιμο"
|
||||||
},
|
},
|
||||||
"jellyseerr": {
|
"jellyseerr": {
|
||||||
"pending": "Pending",
|
"pending": "Σε εκκρεμότητα",
|
||||||
"approved": "Approved",
|
"approved": "Εγκρίθηκε",
|
||||||
"available": "Available"
|
"available": "Διαθέσιμο"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
@ -257,25 +257,25 @@
|
|||||||
},
|
},
|
||||||
"pihole": {
|
"pihole": {
|
||||||
"queries": "Queries",
|
"queries": "Queries",
|
||||||
"blocked": "Blocked",
|
"blocked": "Αποκλεισμένο",
|
||||||
"gravity": "Gravity",
|
"gravity": "Gravity",
|
||||||
"blocked_percent": "Blocked %"
|
"blocked_percent": "Αποκλεισμένο %"
|
||||||
},
|
},
|
||||||
"adguard": {
|
"adguard": {
|
||||||
"queries": "Queries",
|
"queries": "Αναζητήσεις",
|
||||||
"blocked": "Blocked",
|
"blocked": "Αποκλεισμένο",
|
||||||
"filtered": "Filtered",
|
"filtered": "Φιλτραρισμένα",
|
||||||
"latency": "Latency"
|
"latency": "Καθυστέρηση"
|
||||||
},
|
},
|
||||||
"speedtest": {
|
"speedtest": {
|
||||||
"upload": "Upload",
|
"upload": "Ανέβασμα",
|
||||||
"download": "Download",
|
"download": "Λήψη",
|
||||||
"ping": "Ping"
|
"ping": "Ping"
|
||||||
},
|
},
|
||||||
"portainer": {
|
"portainer": {
|
||||||
"running": "Running",
|
"running": "Running",
|
||||||
"stopped": "Stopped",
|
"stopped": "Σταματημένο",
|
||||||
"total": "Total"
|
"total": "Σύνολο"
|
||||||
},
|
},
|
||||||
"tdarr": {
|
"tdarr": {
|
||||||
"queue": "Queue",
|
"queue": "Queue",
|
||||||
@ -563,7 +563,7 @@
|
|||||||
"records_total": "Queue Length"
|
"records_total": "Queue Length"
|
||||||
},
|
},
|
||||||
"pterodactyl": {
|
"pterodactyl": {
|
||||||
"servers": "Servers",
|
"servers": "Διακομιστές",
|
||||||
"nodes": "Nodes"
|
"nodes": "Nodes"
|
||||||
},
|
},
|
||||||
"prometheus": {
|
"prometheus": {
|
||||||
@ -595,22 +595,22 @@
|
|||||||
"shows": "Εκπομπές",
|
"shows": "Εκπομπές",
|
||||||
"recordings": "Εγγραφές",
|
"recordings": "Εγγραφές",
|
||||||
"scheduled": "Προγραμματισμένα",
|
"scheduled": "Προγραμματισμένα",
|
||||||
"passes": "Passes"
|
"passes": "Περάσματα"
|
||||||
},
|
},
|
||||||
"whatsupdocker": {
|
"whatsupdocker": {
|
||||||
"monitoring": "Monitoring",
|
"monitoring": "Monitoring",
|
||||||
"updates": "Updates"
|
"updates": "Updates"
|
||||||
},
|
},
|
||||||
"tailscale": {
|
"tailscale": {
|
||||||
"address": "Address",
|
"address": "Διεύθυνση",
|
||||||
"never": "Never",
|
"never": "Ποτέ",
|
||||||
"years": "{{number}}y",
|
"years": "{{number}}y",
|
||||||
"weeks": "{{number}}w",
|
"weeks": "{{number}}w",
|
||||||
"days": "{{number}}d",
|
"days": "{{number}}d",
|
||||||
"hours": "{{number}}h",
|
"hours": "{{number}}h",
|
||||||
"expires": "Expires",
|
"expires": "Λήγει",
|
||||||
"last_seen": "Last Seen",
|
"last_seen": "Last Seen",
|
||||||
"now": "Now",
|
"now": "Τώρα",
|
||||||
"minutes": "{{number}}m",
|
"minutes": "{{number}}m",
|
||||||
"seconds": "{{number}}s",
|
"seconds": "{{number}}s",
|
||||||
"ago": "{{value}} Ago"
|
"ago": "{{value}} Ago"
|
||||||
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -703,9 +703,17 @@
|
|||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
},
|
},
|
||||||
"mealie": {
|
"mealie": {
|
||||||
"recipes": "Recipes",
|
"recipes": "Recipes",
|
||||||
"users": "Users",
|
"users": "Users",
|
||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"tags": "Tags"
|
"tags": "Tags"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errores",
|
"errored": "Errores",
|
||||||
"noRecent": "Caducado",
|
"noRecent": "Caducado",
|
||||||
"totalUsed": "Almacenamiento usado"
|
"totalUsed": "Almacenamiento usado"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"running": "Ejecutando",
|
||||||
|
"downloading": "Descargando",
|
||||||
|
"total": "Total",
|
||||||
|
"stopped": "Detenido",
|
||||||
|
"passed": "Aprobado",
|
||||||
|
"failed": "Fallido"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Erreur",
|
"errored": "Erreur",
|
||||||
"noRecent": "Obsolète",
|
"noRecent": "Obsolète",
|
||||||
"totalUsed": "Esp. Utilisé"
|
"totalUsed": "Esp. Utilisé"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Téléchargement",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Démarré",
|
||||||
|
"stopped": "Arrêté",
|
||||||
|
"passed": "Réussi",
|
||||||
|
"failed": "Échoué"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"totalUsed": "Used Storage",
|
"totalUsed": "Used Storage",
|
||||||
"ok": "Ok",
|
"ok": "Ok",
|
||||||
"errored": "Errors"
|
"errored": "Errors"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -701,5 +701,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,11 +16,11 @@
|
|||||||
"free": "Свободно",
|
"free": "Свободно",
|
||||||
"used": "Использовано",
|
"used": "Использовано",
|
||||||
"load": "Загрузка",
|
"load": "Загрузка",
|
||||||
"cpu": "Процессор",
|
"cpu": "ЦП",
|
||||||
"mem": "Память",
|
"mem": "ОЗУ",
|
||||||
"temp": "Температура",
|
"temp": "Темпер.",
|
||||||
"max": "Макс.",
|
"max": "Макс.",
|
||||||
"uptime": "UP",
|
"uptime": "Работает",
|
||||||
"months": "мес",
|
"months": "мес",
|
||||||
"days": "д",
|
"days": "д",
|
||||||
"hours": "ч",
|
"hours": "ч",
|
||||||
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"total": "Total",
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed",
|
||||||
|
"downloading": "Downloading"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"failed": "Failed",
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -670,9 +670,9 @@
|
|||||||
"maxPlayers": "Максимум гравців",
|
"maxPlayers": "Максимум гравців",
|
||||||
"bots": "Ботів",
|
"bots": "Ботів",
|
||||||
"ping": "Пінг",
|
"ping": "Пінг",
|
||||||
"status": "Status",
|
"status": "Статус",
|
||||||
"online": "Online",
|
"online": "В мережі",
|
||||||
"offline": "Offline"
|
"offline": "Не в мережі"
|
||||||
},
|
},
|
||||||
"azuredevops": {
|
"azuredevops": {
|
||||||
"result": "Результат",
|
"result": "Результат",
|
||||||
@ -692,5 +692,13 @@
|
|||||||
"errored": "Помилки",
|
"errored": "Помилки",
|
||||||
"noRecent": "Застарілий",
|
"noRecent": "Застарілий",
|
||||||
"totalUsed": "Використовувана пам'ять"
|
"totalUsed": "Використовувана пам'ять"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "Errors",
|
"errored": "Errors",
|
||||||
"noRecent": "Out of Date",
|
"noRecent": "Out of Date",
|
||||||
"totalUsed": "Used Storage"
|
"totalUsed": "Used Storage"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,5 +692,13 @@
|
|||||||
"errored": "錯誤",
|
"errored": "錯誤",
|
||||||
"noRecent": "已過時",
|
"noRecent": "已過時",
|
||||||
"totalUsed": "已使用空間"
|
"totalUsed": "已使用空間"
|
||||||
|
},
|
||||||
|
"openmediavault": {
|
||||||
|
"downloading": "Downloading",
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"passed": "Passed",
|
||||||
|
"failed": "Failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -298,6 +298,7 @@ export function cleanServiceGroups(groups) {
|
|||||||
metric, // glances
|
metric, // glances
|
||||||
stream, // mjpeg
|
stream, // mjpeg
|
||||||
fit,
|
fit,
|
||||||
|
method, // openmediavault widget
|
||||||
} = cleanedService.widget;
|
} = cleanedService.widget;
|
||||||
|
|
||||||
let fieldsList = fields;
|
let fieldsList = fields;
|
||||||
@ -368,6 +369,9 @@ export function cleanServiceGroups(groups) {
|
|||||||
if (stream) cleanedService.widget.stream = stream;
|
if (stream) cleanedService.widget.stream = stream;
|
||||||
if (fit) cleanedService.widget.fit = fit;
|
if (fit) cleanedService.widget.fit = fit;
|
||||||
}
|
}
|
||||||
|
if (type === "openmediavault") {
|
||||||
|
if (method) cleanedService.widget.method = method;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return cleanedService;
|
return cleanedService;
|
||||||
|
@ -60,6 +60,7 @@ const components = {
|
|||||||
ombi: dynamic(() => import("./ombi/component")),
|
ombi: dynamic(() => import("./ombi/component")),
|
||||||
opnsense: dynamic(() => import("./opnsense/component")),
|
opnsense: dynamic(() => import("./opnsense/component")),
|
||||||
overseerr: dynamic(() => import("./overseerr/component")),
|
overseerr: dynamic(() => import("./overseerr/component")),
|
||||||
|
openmediavault: dynamic(() => import("./openmediavault/component")),
|
||||||
paperlessngx: dynamic(() => import("./paperlessngx/component")),
|
paperlessngx: dynamic(() => import("./paperlessngx/component")),
|
||||||
pfsense: dynamic(() => import("./pfsense/component")),
|
pfsense: dynamic(() => import("./pfsense/component")),
|
||||||
photoprism: dynamic(() => import("./photoprism/component")),
|
photoprism: dynamic(() => import("./photoprism/component")),
|
||||||
|
16
src/widgets/openmediavault/component.jsx
Normal file
16
src/widgets/openmediavault/component.jsx
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import ServicesGetStatus from "./methods/services_get_status";
|
||||||
|
import SmartGetList from "./methods/smart_get_list";
|
||||||
|
import DownloaderGetDownloadList from "./methods/downloader_get_downloadlist";
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
switch (service.widget.method) {
|
||||||
|
case "services.getStatus":
|
||||||
|
return <ServicesGetStatus service={service} />;
|
||||||
|
case "smart.getListBg":
|
||||||
|
return <SmartGetList service={service} />;
|
||||||
|
case "downloader.getDownloadList":
|
||||||
|
return <DownloaderGetDownloadList service={service} />;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
import Container from "components/services/widget/container";
|
||||||
|
import Block from "components/services/widget/block";
|
||||||
|
|
||||||
|
const downloadReduce = (acc, e) => {
|
||||||
|
if (e.downloading) {
|
||||||
|
return acc + 1;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
};
|
||||||
|
|
||||||
|
const items = [
|
||||||
|
{ label: "openmediavault.downloading", getNumber: (data) => (!data ? null : data.reduce(downloadReduce, 0)) },
|
||||||
|
{ label: "openmediavault.total", getNumber: (data) => (!data ? null : data?.length) },
|
||||||
|
];
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { data, error } = useWidgetAPI(service.widget);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return <Container service={service} error={error} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
const itemsWithData = items.map((item) => ({
|
||||||
|
...item,
|
||||||
|
number: item.getNumber(data?.response?.data),
|
||||||
|
}));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
{itemsWithData.map((e) => (
|
||||||
|
<Block key={e.label} label={e.label} value={e.number} />
|
||||||
|
))}
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
43
src/widgets/openmediavault/methods/services_get_status.jsx
Normal file
43
src/widgets/openmediavault/methods/services_get_status.jsx
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
import Container from "components/services/widget/container";
|
||||||
|
import Block from "components/services/widget/block";
|
||||||
|
|
||||||
|
const isRunningReduce = (acc, e) => {
|
||||||
|
if (e.running) {
|
||||||
|
return acc + 1;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
};
|
||||||
|
const notRunningReduce = (acc, e) => {
|
||||||
|
if (!e.running) {
|
||||||
|
return acc + 1;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
};
|
||||||
|
|
||||||
|
const items = [
|
||||||
|
{ label: "openmediavault.running", getNumber: (data) => (!data ? null : data.reduce(isRunningReduce, 0)) },
|
||||||
|
{ label: "openmediavault.stopped", getNumber: (data) => (!data ? null : data.reduce(notRunningReduce, 0)) },
|
||||||
|
{ label: "openmediavault.total", getNumber: (data) => (!data ? null : data?.length) },
|
||||||
|
];
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { data, error } = useWidgetAPI(service.widget);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return <Container service={service} error={error} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
const itemsWithData = items.map((item) => ({
|
||||||
|
...item,
|
||||||
|
number: item.getNumber(data?.response?.data),
|
||||||
|
}));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
{itemsWithData.map((e) => (
|
||||||
|
<Block key={e.label} label={e.label} value={e.number} />
|
||||||
|
))}
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
42
src/widgets/openmediavault/methods/smart_get_list.jsx
Normal file
42
src/widgets/openmediavault/methods/smart_get_list.jsx
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
import Container from "components/services/widget/container";
|
||||||
|
import Block from "components/services/widget/block";
|
||||||
|
|
||||||
|
const passedReduce = (acc, e) => {
|
||||||
|
if (e.overallstatus === "GOOD") {
|
||||||
|
return acc + 1;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
};
|
||||||
|
const failedReduce = (acc, e) => {
|
||||||
|
if (e.overallstatus !== "GOOD") {
|
||||||
|
return acc + 1;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
};
|
||||||
|
|
||||||
|
const items = [
|
||||||
|
{ label: "openmediavault.passed", getNumber: (data) => (!data ? null : data.reduce(passedReduce, 0)) },
|
||||||
|
{ label: "openmediavault.failed", getNumber: (data) => (!data ? null : data.reduce(failedReduce, 0)) },
|
||||||
|
];
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { data, error } = useWidgetAPI(service.widget);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return <Container service={service} error={error} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
const itemsWithData = items.map((item) => ({
|
||||||
|
...item,
|
||||||
|
number: item.getNumber(JSON.parse(data?.response?.output || "{}")?.data),
|
||||||
|
}));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
{itemsWithData.map((e) => (
|
||||||
|
<Block key={e.label} label={e.label} value={e.number} />
|
||||||
|
))}
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
151
src/widgets/openmediavault/proxy.js
Normal file
151
src/widgets/openmediavault/proxy.js
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||||
|
import { httpProxy } from "utils/proxy/http";
|
||||||
|
import getServiceWidget from "utils/config/service-helpers";
|
||||||
|
import { addCookieToJar, setCookieHeader } from "utils/proxy/cookie-jar";
|
||||||
|
import createLogger from "utils/logger";
|
||||||
|
import widgets from "widgets/widgets";
|
||||||
|
|
||||||
|
const PROXY_NAME = "OMVProxyHandler";
|
||||||
|
const BG_MAX_RETRIES = 50;
|
||||||
|
const BG_POLL_PERIOD = 500;
|
||||||
|
|
||||||
|
const logger = createLogger(PROXY_NAME);
|
||||||
|
|
||||||
|
async function getWidget(req) {
|
||||||
|
const { group, service } = req.query;
|
||||||
|
|
||||||
|
if (!group || !service) {
|
||||||
|
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const widget = await getServiceWidget(group, service);
|
||||||
|
|
||||||
|
if (!widget) {
|
||||||
|
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function rpc(url, request) {
|
||||||
|
const params = {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify(request),
|
||||||
|
};
|
||||||
|
setCookieHeader(url, params);
|
||||||
|
const [status, contentType, data, headers] = await httpProxy(url, params);
|
||||||
|
|
||||||
|
return { status, contentType, data, headers };
|
||||||
|
}
|
||||||
|
|
||||||
|
async function poll(attemptsLeft, makeReqByPos, pos = 0) {
|
||||||
|
if (attemptsLeft <= 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const resp = await makeReqByPos(pos);
|
||||||
|
|
||||||
|
const data = JSON.parse(resp.data.toString()).response;
|
||||||
|
if (data.running === true || data.outputPending) {
|
||||||
|
await new Promise((resolve) => {
|
||||||
|
setTimeout(resolve, BG_POLL_PERIOD);
|
||||||
|
});
|
||||||
|
return poll(attemptsLeft - 1, makeReqByPos, data.pos);
|
||||||
|
}
|
||||||
|
return resp;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function tryLogin(widget) {
|
||||||
|
const url = new URL(formatApiCall(widgets?.[widget.type]?.api, { ...widget }));
|
||||||
|
const { username, password } = widget;
|
||||||
|
const resp = await rpc(url, {
|
||||||
|
method: "login",
|
||||||
|
service: "session",
|
||||||
|
params: { username, password },
|
||||||
|
});
|
||||||
|
|
||||||
|
if (resp.status !== 200) {
|
||||||
|
logger.error("HTTP %d logging in to OpenMediaVault. Data: %s", resp.status, resp.data);
|
||||||
|
return [false, resp];
|
||||||
|
}
|
||||||
|
|
||||||
|
const json = JSON.parse(resp.data.toString());
|
||||||
|
if (json.response.authenticated !== true) {
|
||||||
|
logger.error("Login error in OpenMediaVault. Data: %s", resp.data);
|
||||||
|
resp.status = 401;
|
||||||
|
return [false, resp];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [true, resp];
|
||||||
|
}
|
||||||
|
async function processBg(url, filename) {
|
||||||
|
const resp = await poll(BG_MAX_RETRIES, (pos) =>
|
||||||
|
rpc(url, {
|
||||||
|
service: "exec",
|
||||||
|
method: "getOutput",
|
||||||
|
params: { pos, filename },
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
if (resp == null) {
|
||||||
|
const errText = "The maximum number of attempts to receive a response from Bg data has been exceeded.";
|
||||||
|
logger.error(errText);
|
||||||
|
return errText;
|
||||||
|
}
|
||||||
|
if (resp.status !== 200) {
|
||||||
|
logger.error("HTTP %d getting Bg data from OpenMediaVault RPC. Data: %s", resp.status, resp.data);
|
||||||
|
}
|
||||||
|
return resp;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function proxyHandler(req, res) {
|
||||||
|
const widget = await getWidget(req);
|
||||||
|
if (!widget) {
|
||||||
|
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||||
|
}
|
||||||
|
|
||||||
|
const api = widgets?.[widget.type]?.api;
|
||||||
|
if (!api) {
|
||||||
|
return res.status(403).json({ error: "Service does not support RPC calls" });
|
||||||
|
}
|
||||||
|
|
||||||
|
const url = new URL(formatApiCall(api, { ...widget }));
|
||||||
|
const [service, method] = widget.method.split(".");
|
||||||
|
const rpcReq = { params: { limit: -1, start: 0 }, service, method };
|
||||||
|
|
||||||
|
let resp = await rpc(url, rpcReq);
|
||||||
|
|
||||||
|
if (resp.status === 401) {
|
||||||
|
logger.debug("Session not authenticated.");
|
||||||
|
const [success, lResp] = await tryLogin(widget);
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
addCookieToJar(url, lResp.headers);
|
||||||
|
} else {
|
||||||
|
res.status(lResp.status).json({ error: { message: `HTTP Error ${lResp.status}`, url, data: lResp.data } });
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug("Retrying OpenMediaVault request after login.");
|
||||||
|
resp = await rpc(url, rpcReq);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resp.status !== 200) {
|
||||||
|
logger.error("HTTP %d getting data from OpenMediaVault RPC. Data: %s", resp.status, resp.data);
|
||||||
|
return res.status(resp.status).json({ error: { message: `HTTP Error ${resp.status}`, url, data: resp.data } });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (method.endsWith("Bg")) {
|
||||||
|
const json = JSON.parse(resp.data.toString());
|
||||||
|
const bgResp = await processBg(url, json.response);
|
||||||
|
|
||||||
|
if (typeof bgResp === "string") {
|
||||||
|
return res.status(400).json({ error: bgResp });
|
||||||
|
}
|
||||||
|
return res.status(bgResp.status).send(bgResp.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.status(resp.status).send(resp.data);
|
||||||
|
}
|
8
src/widgets/openmediavault/widget.js
Normal file
8
src/widgets/openmediavault/widget.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import proxyHandler from "./proxy";
|
||||||
|
|
||||||
|
const widget = {
|
||||||
|
api: "{url}/rpc.php",
|
||||||
|
proxyHandler,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default widget;
|
@ -54,6 +54,7 @@ import omada from "./omada/widget";
|
|||||||
import ombi from "./ombi/widget";
|
import ombi from "./ombi/widget";
|
||||||
import opnsense from "./opnsense/widget";
|
import opnsense from "./opnsense/widget";
|
||||||
import overseerr from "./overseerr/widget";
|
import overseerr from "./overseerr/widget";
|
||||||
|
import openmediavault from "./openmediavault/widget";
|
||||||
import paperlessngx from "./paperlessngx/widget";
|
import paperlessngx from "./paperlessngx/widget";
|
||||||
import pfsense from "./pfsense/widget";
|
import pfsense from "./pfsense/widget";
|
||||||
import photoprism from "./photoprism/widget";
|
import photoprism from "./photoprism/widget";
|
||||||
@ -150,6 +151,7 @@ const widgets = {
|
|||||||
ombi,
|
ombi,
|
||||||
opnsense,
|
opnsense,
|
||||||
overseerr,
|
overseerr,
|
||||||
|
openmediavault,
|
||||||
paperlessngx,
|
paperlessngx,
|
||||||
pfsense,
|
pfsense,
|
||||||
photoprism,
|
photoprism,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user