Compare commits

...

139 Commits

Author SHA1 Message Date
shamoon
5af01d2436 Merge pull request #887 from Zlendy/immich
Add Immich Widget
2023-01-28 21:50:55 -08:00
shamoon
19cf9969b9 Fix immich widget error catching & awaiting data 2023-01-28 21:49:31 -08:00
Zlendy
dbcd6f5df7 Fix: Immich API no longer has an "error" property 2023-01-28 21:49:31 -08:00
Zlendy
6b5e8ab0c7 Add Immich Widget 2023-01-28 21:49:31 -08:00
shamoon
e5d65f410c Merge pull request #893 from benphelps/fix-892
Fix nzbget download rate units
2023-01-28 21:18:37 -08:00
shamoon
f2b3a12569 Fix nzbget download rate units 2023-01-28 21:17:39 -08:00
Anonymous
3df03ecaab Translated using Weblate (Latvian)
Currently translated at 39.0% (119 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-29 01:46:40 +01:00
Anonymous
0fdab8cffc Translated using Weblate (Japanese)
Currently translated at 4.9% (15 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-29 01:46:39 +01:00
Anonymous
7d23b0199c Translated using Weblate (Ukrainian)
Currently translated at 98.6% (301 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-29 01:46:39 +01:00
Anonymous
0ae6d7e182 Translated using Weblate (Esperanto)
Currently translated at 33.7% (103 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-29 01:46:39 +01:00
Anonymous
2b8af9546f Translated using Weblate (Hindi)
Currently translated at 2.9% (9 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-29 01:46:39 +01:00
Anonymous
8713ef4d6a Translated using Weblate (Malay)
Currently translated at 82.9% (253 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-29 01:46:38 +01:00
Anonymous
0d5c878c29 Translated using Weblate (Danish)
Currently translated at 64.9% (198 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-29 01:46:38 +01:00
Anonymous
bb823140e1 Translated using Weblate (Czech)
Currently translated at 73.7% (225 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-29 01:46:38 +01:00
Anonymous
749e78864e Translated using Weblate (Arabic)
Currently translated at 85.2% (260 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-29 01:46:37 +01:00
Anonymous
6199c2e3b0 Translated using Weblate (Serbian)
Currently translated at 2.9% (9 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-29 01:46:37 +01:00
Anonymous
935681bd70 Translated using Weblate (Turkish)
Currently translated at 75.7% (231 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-29 01:46:37 +01:00
Anonymous
dc7f563fff Translated using Weblate (Bulgarian)
Currently translated at 15.0% (46 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-29 01:46:36 +01:00
Anonymous
8c3b8e2cbc Translated using Weblate (Telugu)
Currently translated at 71.1% (217 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-29 01:46:36 +01:00
Anonymous
60df0ab4ff Translated using Weblate (Finnish)
Currently translated at 58.3% (178 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-29 01:46:36 +01:00
Anonymous
436650d8ef Translated using Weblate (Yue)
Currently translated at 38.6% (118 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-29 01:46:35 +01:00
Anonymous
6e6fcb33ce Translated using Weblate (Portuguese (Brazil))
Currently translated at 38.3% (117 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-29 01:46:35 +01:00
Anonymous
ba25e74add Translated using Weblate (Romanian)
Currently translated at 44.9% (137 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-29 01:46:35 +01:00
Anonymous
59c524726a Translated using Weblate (Hebrew)
Currently translated at 33.1% (101 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-29 01:46:34 +01:00
Anonymous
7e3620f86f Translated using Weblate (Hungarian)
Currently translated at 35.4% (108 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-29 01:46:34 +01:00
Anonymous
b11fa21d4a Translated using Weblate (Croatian)
Currently translated at 93.7% (286 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-29 01:46:33 +01:00
Anonymous
3fdae79c88 Translated using Weblate (Swedish)
Currently translated at 43.2% (132 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-29 01:46:33 +01:00
Anonymous
933619aa8e Translated using Weblate (Polish)
Currently translated at 93.4% (285 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-29 01:46:33 +01:00
Anonymous
63616e0a79 Translated using Weblate (Catalan)
Currently translated at 84.5% (258 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-29 01:46:33 +01:00
Anonymous
c933e40e92 Translated using Weblate (Chinese (Traditional))
Currently translated at 94.4% (288 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-29 01:46:32 +01:00
Anonymous
347e28ea3f Translated using Weblate (Dutch)
Currently translated at 28.8% (88 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-29 01:46:32 +01:00
Anonymous
f6fdbd0426 Translated using Weblate (Vietnamese)
Currently translated at 14.4% (44 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-29 01:46:31 +01:00
Anonymous
5d82f5f7d8 Translated using Weblate (Norwegian Bokmål)
Currently translated at 25.9% (79 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-29 01:46:31 +01:00
Anonymous
4c9f1041ef Translated using Weblate (Italian)
Currently translated at 94.4% (288 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-29 01:46:31 +01:00
Anonymous
6d133b3889 Translated using Weblate (Chinese (Simplified))
Currently translated at 55.0% (168 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-29 01:46:31 +01:00
Anonymous
d94f1ce3e7 Translated using Weblate (Russian)
Currently translated at 15.7% (48 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-29 01:46:30 +01:00
Anonymous
1e8b257dbe Translated using Weblate (Portuguese)
Currently translated at 83.9% (256 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-29 01:46:30 +01:00
Anonymous
0190c18a6b Translated using Weblate (French)
Currently translated at 98.6% (301 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-29 01:46:29 +01:00
Anonymous
56331b3efd Translated using Weblate (Spanish)
Currently translated at 98.6% (301 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-29 01:46:29 +01:00
Anonymous
c3561e8fce Translated using Weblate (German)
Currently translated at 74.7% (228 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-29 01:46:29 +01:00
azzam
910582fbc0 Translated using Weblate (Arabic)
Currently translated at 86.3% (260 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-29 01:45:53 +01:00
Eizock
2a42d89d08 Add Proxmox Backup Server Widget (#879)
* Add Proxmox Backup Server Widget

* Clarification added to Failed Tasks

* Refactor pbs to proxmoxbackupserver

* Removing property instead of recreating object

* minor code styling of proxmoxbackupserver widget

---------

Co-authored-by: Eizock <>
Co-authored-by: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
2023-01-28 16:32:47 -08:00
Jason Fischer
b0f16f6612 Merge pull request #889 from benphelps/fix-864
Don't include LXC templates in LXC count
2023-01-28 13:09:48 -08:00
Jason Fischer
0d5f8f6e7c Don't include LXC templates in LXC count
fixes #864
2023-01-28 12:59:20 -08:00
Kai Huuhko
e368717c70 Translated using Weblate (Finnish)
Currently translated at 59.1% (178 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-27 13:45:04 +01:00
Dan
1e5a6f8eff Translated using Weblate (Ukrainian)
Currently translated at 100.0% (301 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-26 11:54:36 +01:00
Chun Chi Hsieh
945d13ee3c Translated using Weblate (Chinese (Traditional))
Currently translated at 95.6% (288 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-26 11:54:36 +01:00
Nonoss117
cc09e44890 Translated using Weblate (French)
Currently translated at 100.0% (301 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-26 11:54:36 +01:00
gallegonovato
29b6fefdff Translated using Weblate (Spanish)
Currently translated at 100.0% (301 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-26 11:54:36 +01:00
Jason Fischer
e96036e076 Merge pull request #873 from jameswynn/sort-services-by-weight
Services are now sorted by a new 'weight' field
2023-01-24 17:52:08 -08:00
James Wynn
8d016629d3 Services are now sorted by the 'weight' field.
* Default for discovered services is 0
* Default weight for configured services is their index within their
  group scaled by 100, i.e. (index + 1) * 100
* Should be backwards compatible with current loose ordering
2023-01-24 12:48:49 -06:00
shamoon
555f9f7b14 Merge pull request #871 from jameswynn/fix-discovered-widget-fields-parsing
Discovered services need widget field list parsed
2023-01-24 08:36:20 -08:00
James Wynn
02e9df8f28 Parse widget field list if is a string 2023-01-24 09:31:20 -06:00
Anonymous
5ecb9466ae Translated using Weblate (Latvian)
Currently translated at 39.5% (119 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-24 04:55:03 +01:00
Anonymous
9c9c0e2b64 Translated using Weblate (Japanese)
Currently translated at 4.9% (15 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-24 04:55:02 +01:00
Anonymous
2d87c7c1d2 Translated using Weblate (Ukrainian)
Currently translated at 98.0% (295 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-24 04:55:02 +01:00
Anonymous
cdbf02edae Translated using Weblate (Esperanto)
Currently translated at 34.2% (103 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-24 04:55:02 +01:00
Anonymous
b630b14504 Translated using Weblate (Hindi)
Currently translated at 2.9% (9 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-24 04:55:02 +01:00
Anonymous
e0bf277741 Translated using Weblate (Malay)
Currently translated at 84.0% (253 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-24 04:55:02 +01:00
Anonymous
351993234e Translated using Weblate (Danish)
Currently translated at 65.7% (198 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-24 04:55:01 +01:00
Anonymous
192a4f4d14 Translated using Weblate (Czech)
Currently translated at 74.7% (225 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-24 04:55:01 +01:00
Anonymous
bfb882d03d Translated using Weblate (Arabic)
Currently translated at 14.6% (44 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-24 04:55:01 +01:00
Anonymous
9ee86f1c5a Translated using Weblate (Serbian)
Currently translated at 2.9% (9 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-24 04:55:01 +01:00
Anonymous
6d3c71a72e Translated using Weblate (Turkish)
Currently translated at 76.7% (231 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-24 04:55:01 +01:00
Anonymous
ad273ce5ad Translated using Weblate (Bulgarian)
Currently translated at 15.2% (46 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-24 04:55:00 +01:00
Anonymous
799c9ecb17 Translated using Weblate (Telugu)
Currently translated at 72.0% (217 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-24 04:55:00 +01:00
Anonymous
a5c8f08f4b Translated using Weblate (Finnish)
Currently translated at 57.8% (174 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-24 04:55:00 +01:00
Anonymous
9f2476f419 Translated using Weblate (Yue)
Currently translated at 39.2% (118 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-24 04:55:00 +01:00
Anonymous
942a61aa4b Translated using Weblate (Portuguese (Brazil))
Currently translated at 38.8% (117 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-24 04:54:59 +01:00
Anonymous
099f3726e8 Translated using Weblate (Romanian)
Currently translated at 45.5% (137 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-24 04:54:59 +01:00
Anonymous
14310bf2ed Translated using Weblate (Hebrew)
Currently translated at 33.5% (101 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-24 04:54:59 +01:00
Anonymous
176811da9b Translated using Weblate (Hungarian)
Currently translated at 35.8% (108 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-24 04:54:59 +01:00
Anonymous
f8d35e7f5d Translated using Weblate (Croatian)
Currently translated at 95.0% (286 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-24 04:54:59 +01:00
Anonymous
ce94636a54 Translated using Weblate (Swedish)
Currently translated at 43.8% (132 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-24 04:54:58 +01:00
Anonymous
7e659b2dbc Translated using Weblate (Polish)
Currently translated at 94.6% (285 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-24 04:54:58 +01:00
Anonymous
cb92e82fd0 Translated using Weblate (Catalan)
Currently translated at 85.7% (258 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-24 04:54:58 +01:00
Anonymous
d7d5f46820 Translated using Weblate (Chinese (Traditional))
Currently translated at 95.6% (288 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-24 04:54:58 +01:00
Anonymous
23b8f25f07 Translated using Weblate (Dutch)
Currently translated at 29.2% (88 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-24 04:54:57 +01:00
Anonymous
dc55da38c6 Translated using Weblate (Vietnamese)
Currently translated at 14.6% (44 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-24 04:54:57 +01:00
Anonymous
aa35eb5c5e Translated using Weblate (Norwegian Bokmål)
Currently translated at 26.2% (79 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-24 04:54:57 +01:00
Anonymous
8c800eb032 Translated using Weblate (Italian)
Currently translated at 95.6% (288 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-24 04:54:57 +01:00
Anonymous
cdfb7e7d73 Translated using Weblate (Chinese (Simplified))
Currently translated at 55.8% (168 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-24 04:54:56 +01:00
Anonymous
48298cc4e8 Translated using Weblate (Russian)
Currently translated at 15.9% (48 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-24 04:54:56 +01:00
Anonymous
ce786fb765 Translated using Weblate (Portuguese)
Currently translated at 85.0% (256 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-24 04:54:56 +01:00
Anonymous
50939069af Translated using Weblate (French)
Currently translated at 99.3% (299 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-24 04:54:56 +01:00
Anonymous
ec8a73751c Translated using Weblate (Spanish)
Currently translated at 99.3% (299 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-24 04:54:55 +01:00
Anonymous
a994d5379e Translated using Weblate (German)
Currently translated at 75.7% (228 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-24 04:54:55 +01:00
shamoon
f9e27a6bb5 Merge pull request #868 from KillahB33/main
Cloudflared Widget
2023-01-23 19:54:34 -08:00
Pacux
6d61cb5aaa Translated using Weblate (Catalan)
Currently translated at 86.2% (258 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-23 23:52:33 +01:00
Michael Shamoon
89c6528f24 cloudflare widget validation, handle multiple connections, fix translation file error, capitalize status 2023-01-23 10:31:08 -08:00
KillahBee
2836ee1f3b cloudflared widget working locally 2023-01-23 12:06:35 -05:00
shamoon
d71a1f9345 Merge pull request #861 from benphelps/fix-opnsense-no-wan
Fix: Handle opnsense no wan interface
2023-01-22 14:29:49 -08:00
Michael Shamoon
c8116fc9e8 Better error output for docker integration 2023-01-22 14:23:14 -08:00
Michael Shamoon
ca4b5b131d Allow specifying wan interface on opnsense widget 2023-01-22 11:02:52 -08:00
Hosted Weblate
c74b46712b Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
2023-01-22 18:30:38 +01:00
Michael Shamoon
794f22d373 Re-merge "use unprivileged user in a container"
This reverts commit 67e72fb96a.
2023-01-22 09:30:29 -08:00
KillahBee
fa1792cd5f adding cloudflare widget 2023-01-20 11:43:19 -05:00
Anonymous
cdbdb86c9e Translated using Weblate (Latvian)
Currently translated at 39.7% (119 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-20 17:09:01 +01:00
Anonymous
71669b295d Translated using Weblate (Japanese)
Currently translated at 5.0% (15 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-20 17:09:01 +01:00
Anonymous
9f68f3b3f4 Translated using Weblate (Ukrainian)
Currently translated at 98.6% (295 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-20 17:09:01 +01:00
Anonymous
0b41c1d686 Translated using Weblate (Esperanto)
Currently translated at 34.4% (103 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-20 17:09:01 +01:00
Anonymous
85073629ad Translated using Weblate (Hindi)
Currently translated at 3.0% (9 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-20 17:09:00 +01:00
Anonymous
680d889228 Translated using Weblate (Malay)
Currently translated at 84.6% (253 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-20 17:09:00 +01:00
Anonymous
e4c2eec7ee Translated using Weblate (Danish)
Currently translated at 66.2% (198 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-20 17:09:00 +01:00
Anonymous
0642999826 Translated using Weblate (Czech)
Currently translated at 75.2% (225 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-20 17:09:00 +01:00
Anonymous
1a1194acf8 Translated using Weblate (Arabic)
Currently translated at 14.7% (44 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-20 17:08:59 +01:00
Anonymous
e6f9d6fd1d Translated using Weblate (Serbian)
Currently translated at 3.0% (9 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-20 17:08:59 +01:00
Anonymous
ec4dcd0663 Translated using Weblate (Turkish)
Currently translated at 77.2% (231 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-20 17:08:59 +01:00
Anonymous
1993a1660a Translated using Weblate (Bulgarian)
Currently translated at 15.3% (46 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-20 17:08:59 +01:00
Anonymous
530495d804 Translated using Weblate (Telugu)
Currently translated at 72.5% (217 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-20 17:08:58 +01:00
Anonymous
c490d2467f Translated using Weblate (Finnish)
Currently translated at 41.1% (123 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-20 17:08:58 +01:00
Anonymous
c7771033c6 Translated using Weblate (Yue)
Currently translated at 39.4% (118 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-20 17:08:58 +01:00
Anonymous
ccb227366d Translated using Weblate (Portuguese (Brazil))
Currently translated at 39.1% (117 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-20 17:08:58 +01:00
Anonymous
0d4b4ef65c Translated using Weblate (Romanian)
Currently translated at 45.8% (137 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-20 17:08:58 +01:00
Anonymous
45b59cd336 Translated using Weblate (Hebrew)
Currently translated at 33.7% (101 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-20 17:08:57 +01:00
Anonymous
8dcc25f68f Translated using Weblate (Hungarian)
Currently translated at 36.1% (108 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-20 17:08:57 +01:00
Anonymous
f0557d0a9c Translated using Weblate (Croatian)
Currently translated at 95.6% (286 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-20 17:08:56 +01:00
Anonymous
f1baafe9a1 Translated using Weblate (Swedish)
Currently translated at 44.1% (132 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-20 17:08:56 +01:00
Anonymous
940b6098d4 Translated using Weblate (Polish)
Currently translated at 95.3% (285 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-20 17:08:56 +01:00
Anonymous
580c6adfb1 Translated using Weblate (Catalan)
Currently translated at 86.2% (258 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-20 17:08:56 +01:00
Anonymous
c9cb975265 Translated using Weblate (Chinese (Traditional))
Currently translated at 94.9% (284 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-20 17:08:56 +01:00
Anonymous
3f887a7e26 Translated using Weblate (Dutch)
Currently translated at 29.4% (88 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-20 17:08:55 +01:00
Anonymous
3d5bb9d9eb Translated using Weblate (Vietnamese)
Currently translated at 14.7% (44 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-20 17:08:55 +01:00
Anonymous
6cd9d76892 Translated using Weblate (Norwegian Bokmål)
Currently translated at 26.4% (79 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-20 17:08:55 +01:00
Anonymous
cc073ea23c Translated using Weblate (Italian)
Currently translated at 96.3% (288 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-20 17:08:54 +01:00
Anonymous
b6a2421a64 Translated using Weblate (Chinese (Simplified))
Currently translated at 56.1% (168 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-20 17:08:54 +01:00
Anonymous
300fce5f17 Translated using Weblate (Russian)
Currently translated at 16.0% (48 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-20 17:08:54 +01:00
Anonymous
19e654656f Translated using Weblate (Portuguese)
Currently translated at 85.6% (256 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-20 17:08:54 +01:00
Anonymous
3add3a57d2 Translated using Weblate (French)
Currently translated at 98.6% (295 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-20 17:08:54 +01:00
Anonymous
e850abbaec Translated using Weblate (Spanish)
Currently translated at 98.6% (295 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-20 17:08:53 +01:00
Anonymous
d4b3885139 Translated using Weblate (German)
Currently translated at 76.2% (228 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-20 17:08:53 +01:00
Hosted Weblate
3737ce704e Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
2023-01-20 17:08:30 +01:00
Dan
43d781f1f9 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (299 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-20 17:08:28 +01:00
retmas-gh
fc01c6b428 Translated using Weblate (Polish)
Currently translated at 95.9% (287 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-20 17:08:28 +01:00
Chun Chi Hsieh
592848f42f Translated using Weblate (Chinese (Traditional))
Currently translated at 96.3% (288 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-20 17:08:27 +01:00
Nonoss117
6634909f5b Translated using Weblate (French)
Currently translated at 100.0% (299 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-20 17:08:27 +01:00
gallegonovato
6c5f27cd87 Translated using Weblate (Spanish)
Currently translated at 100.0% (299 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-20 17:08:27 +01:00
shamoon
995ebb1941 Merge pull request #851 from benphelps/rename-octoprint
Remove capital from octoprint widget
2023-01-20 08:08:20 -08:00
Michael Shamoon
d27b795d81 Remove capital from octoprint widget
remove

add
2023-01-20 07:09:00 -08:00
55 changed files with 972 additions and 389 deletions

View File

@@ -7,12 +7,10 @@ WORKDIR /app
COPY --link package.json pnpm-lock.yaml* ./ COPY --link package.json pnpm-lock.yaml* ./
RUN <<EOF SHELL ["/bin/ash", "-xeo", "pipefail", "-c"]
set -xe RUN apk add --no-cache libc6-compat \
apk add libc6-compat && apk add --no-cache --virtual .gyp python3 make g++ \
apk add --virtual .gyp python3 make g++ && npm install -g pnpm
npm install -g pnpm
EOF
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm fetch | grep -v "cross-device link not permitted\|Falling back to copying packages from store" RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm fetch | grep -v "cross-device link not permitted\|Falling back to copying packages from store"
@@ -29,12 +27,10 @@ ARG REVISION
COPY --link --from=deps /app/node_modules ./node_modules/ COPY --link --from=deps /app/node_modules ./node_modules/
COPY . . COPY . .
RUN <<EOF SHELL ["/bin/ash", "-xeo", "pipefail", "-c"]
set -xe RUN npm run telemetry \
npm run telemetry && mkdir config && echo '---' > config/settings.yaml \
mkdir config && echo '-' > config/settings.yaml && NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION npm run build
NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION npm run build
EOF
# Production image, copy all the files and run next # Production image, copy all the files and run next
FROM docker.io/node:18-alpine AS runner FROM docker.io/node:18-alpine AS runner
@@ -50,12 +46,15 @@ ENV NODE_ENV production
WORKDIR /app WORKDIR /app
# Copy files from context (this allows the files to copy before the builder stage is done). # Copy files from context (this allows the files to copy before the builder stage is done).
COPY --link package.json next.config.js ./ COPY --link --chown=1000:1000 package.json next.config.js ./
COPY --link /public ./public COPY --link --chown=1000:1000 /public ./public/
# Copy files from builder # Copy files from builder
COPY --link --from=builder /app/.next/standalone ./ COPY --link --from=builder --chown=1000:1000 /app/.next/standalone ./
COPY --link --from=builder /app/.next/static/ ./.next/static/ COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static/
COPY --link --chmod=755 docker-entrypoint.sh /usr/local/bin/
RUN apk add --no-cache su-exec
ENV PORT 3000 ENV PORT 3000
EXPOSE $PORT EXPOSE $PORT
@@ -63,4 +62,5 @@ EXPOSE $PORT
HEALTHCHECK --interval=10s --timeout=3s --start-period=20s \ HEALTHCHECK --interval=10s --timeout=3s --start-period=20s \
CMD wget --no-verbose --tries=1 --spider --no-check-certificate http://localhost:$PORT/api/healthcheck || exit 1 CMD wget --no-verbose --tries=1 --spider --no-check-certificate http://localhost:$PORT/api/healthcheck || exit 1
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["node", "server.js"] CMD ["node", "server.js"]

View File

@@ -2,8 +2,22 @@
set -e set -e
# Default to root, so old installations won't break
export PUID=${PUID:-0}
export PGID=${PGID:-0}
# This is in attempt to preserve the original behavior of the Dockerfile, # This is in attempt to preserve the original behavior of the Dockerfile,
# while also supporting the lscr.io /config directory # while also supporting the lscr.io /config directory
[ ! -d "/app/config" ] && ln -s /config /app/config [ ! -d "/app/config" ] && ln -s /config /app/config
node server.js # Set privileges for /app but only if pid 1 user is root and we are dropping privileges.
# If container is run as an unprivileged user, it means owner already handled ownership setup on their own.
# Running chown in that case (as non-root) will cause error
[ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ] && chown -R ${PUID}:${PGID} /app
# Drop privileges (when asked to) if root, otherwise run as current user
if [ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ]; then
su-exec ${PUID}:${PGID} "$@"
else
exec "$@"
fi

View File

@@ -3,16 +3,16 @@
"missing_type": "نوع القطعة مفقود: {{type}}", "missing_type": "نوع القطعة مفقود: {{type}}",
"api_error": "API خطأ", "api_error": "API خطأ",
"status": "الحالة", "status": "الحالة",
"information": "Information", "information": "معلومات",
"url": "URL", "url": "URL",
"raw_error": "Raw Error", "raw_error": "Raw Error",
"response_data": "Response Data" "response_data": "بيانات الاستجابة"
}, },
"weather": { "weather": {
"current": "الموقع الحالي", "current": "الموقع الحالي",
"allow": "اضغط للسماح", "allow": "أنقر للسماح",
"updating": "جاري التحديث", "updating": "جاري التحديث",
"wait": "الرجاء الانتظار" "wait": "الرجاء الإنتظار"
}, },
"search": { "search": {
"placeholder": "بحث …" "placeholder": "بحث …"
@@ -27,88 +27,88 @@
"unifi": { "unifi": {
"users": "المستخدمون", "users": "المستخدمون",
"uptime": "مدة تشغيل النظام", "uptime": "مدة تشغيل النظام",
"days": "ايام", "days": "أيام",
"wan": "WAN", "wan": "WAN",
"lan": "LAN", "lan": "LAN",
"wlan": "WLAN", "wlan": "WLAN",
"devices": "الاجهزة", "devices": "الأجهزة",
"lan_devices": "LAN اجهزة", "lan_devices": "LAN أجهزة",
"wlan_devices": "WLAN احهزة", "wlan_devices": "WLAN أجهزة",
"lan_users": "LAN مستخدمين", "lan_users": "LAN مستخدمين",
"wlan_users": "WLAN مستخدمين", "wlan_users": "WLAN مستخدمين",
"up": "اعلي", "up": عمل",
"down": "اسفل", "down": "لا يعمل",
"wait": "الرجاء الانتظار" "wait": "الرجاء الإنتظار"
}, },
"wmo": { "wmo": {
"73-day": "Snow", "73-day": "ثلج",
"0-day": "Sunny", "0-day": "مشمس",
"0-night": "Clear", "0-night": "صافي",
"1-day": "Mainly Sunny", "1-day": "مشمس غالباً",
"1-night": "Mainly Clear", "1-night": "صافي غالباً",
"2-day": "Partly Cloudy", "2-day": "غائم جزئياً",
"2-night": "Partly Cloudy", "2-night": "غائم جزئياً",
"3-day": "Cloudy", "3-day": "غائم",
"3-night": "Cloudy", "3-night": "غائم",
"45-day": "Foggy", "45-day": "ضبابي",
"45-night": "Foggy", "45-night": "ضبابي",
"48-day": "Foggy", "48-day": "ضبابي",
"48-night": "Foggy", "48-night": "ضبابي",
"51-day": "Light Drizzle", "51-day": "رذاذ خفيف",
"51-night": "Light Drizzle", "51-night": "رذاذ خفيف",
"53-day": "Drizzle", "53-day": "رذاذ",
"53-night": "Drizzle", "53-night": "رذاذ",
"55-day": "Heavy Drizzle", "55-day": "رذاذ كثيف",
"55-night": "Heavy Drizzle", "55-night": "رذاذ كثيف",
"56-day": "Light Freezing Drizzle", "56-day": "رذاذ متجمد خفيف",
"56-night": "Light Freezing Drizzle", "56-night": "رذاذ متجمد خفيف",
"57-day": "Freezing Drizzle", "57-day": "رذاذ متجمد",
"57-night": "Freezing Drizzle", "57-night": "رذاذ متجمد",
"61-day": "Light Rain", "61-day": "مطر خفيف",
"61-night": "Light Rain", "61-night": "مطر خفيف",
"63-day": "Rain", "63-day": "مطر",
"63-night": "Rain", "63-night": "مطر",
"65-day": "Heavy Rain", "65-day": "مطر شديد",
"65-night": "Heavy Rain", "65-night": "مطر شديد",
"66-day": "Freezing Rain", "66-day": "مطر متجمد",
"66-night": "Freezing Rain", "66-night": "مطر متجمد",
"67-day": "Freezing Rain", "67-day": "مطر متجمد",
"67-night": "Freezing Rain", "67-night": "مطر متجمد",
"71-day": "Light Snow", "71-day": "ثلج خفيف",
"71-night": "Light Snow", "71-night": "ثلج خفيف",
"73-night": "Snow", "73-night": "ثلج",
"75-day": "Heavy Snow", "75-day": "ثلج شديد",
"75-night": "Heavy Snow", "75-night": "ثلج شديد",
"77-day": "Snow Grains", "77-day": "حبيبات الثلج",
"77-night": "Snow Grains", "77-night": "حبيبات الثلج",
"80-day": "Light Showers", "80-day": "أمطار خفيفة",
"80-night": "Light Showers", "80-night": "أمطار خفيفة",
"81-day": "Showers", "81-day": "أمطار",
"81-night": "Showers", "81-night": "أمطار",
"82-day": "Heavy Showers", "82-day": "أمطار شديدة",
"82-night": "Heavy Showers", "82-night": "أمطار شديدة",
"85-day": "Snow Showers", "85-day": "زخات الثلوج",
"85-night": "Snow Showers", "85-night": "زخات الثلوج",
"86-day": "Snow Showers", "86-day": "زخات الثلوج",
"86-night": "Snow Showers", "86-night": "زخات الثلوج",
"95-day": "Thunderstorm", "95-day": "عاصفة رعدية",
"95-night": "Thunderstorm", "95-night": "‬عاصفة رعدية",
"96-day": "Thunderstorm With Hail", "96-day": "عاصفة رعدية مع مطر",
"96-night": "Thunderstorm With Hail", "96-night": "عاصفة رعدية مع مطر",
"99-day": "Thunderstorm With Hail", "99-day": "عاصفة رعدية مع مطر",
"99-night": "Thunderstorm With Hail" "99-night": "عاصفة رعدية مع مطر"
}, },
"docker": { "docker": {
"rx": "RX", "rx": "RX",
"tx": "TX", "tx": "TX",
"mem": "الرام", "mem": "الذاكرة",
"cpu": "المعالج", "cpu": "المعالج",
"offline": "غير متصل", "offline": "غير متصل",
"error": "Error", "error": "خطأ",
"unknown": "Unknown" "unknown": "مجهول"
}, },
"emby": { "emby": {
"playing": "يعمل الان", "playing": "يعمل الآن",
"transcoding": "التحويل", "transcoding": "التحويل",
"bitrate": "معدل البت", "bitrate": "معدل البت",
"no_active": "No Active Streams" "no_active": "No Active Streams"
@@ -118,307 +118,317 @@
"diffsDetected": "Diffs Detected" "diffsDetected": "Diffs Detected"
}, },
"tautulli": { "tautulli": {
"playing": "Playing", "playing": "يشتغل",
"transcoding": "Transcoding", "transcoding": "التحويل",
"bitrate": "Bitrate", "bitrate": "معدل البت",
"no_active": "No Active Streams" "no_active": "No Active Streams"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "معدل",
"remaining": "Remaining", "remaining": "متبقي",
"downloaded": "Downloaded" "downloaded": "مُنزل"
}, },
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "أفلام",
"tv": "TV Shows" "tv": "مسلسلات"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "معدل",
"queue": "Queue", "queue": "إنتظار",
"timeleft": "Time Left" "timeleft": "الوقت المتبقي"
}, },
"rutorrent": { "rutorrent": {
"active": "Active", "active": "نشط",
"upload": "Upload", "upload": "تحميل",
"download": "Download" "download": "تنزيل"
}, },
"transmission": { "transmission": {
"download": "Download", "download": "تنزيل",
"upload": "Upload", "upload": "تحميل",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qbittorrent": { "qbittorrent": {
"download": "Download", "download": "تنزيل",
"upload": "Upload", "upload": "تحميل",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "مطلوب",
"queued": "Queued", "queued": "في الإنتظار",
"series": "Series" "series": "سلسلة"
}, },
"radarr": { "radarr": {
"wanted": "Wanted", "wanted": "مطلوب",
"missing": "Missing", "missing": "مفقود",
"queued": "Queued", "queued": "في الإنتظار",
"movies": "Movies" "movies": "أفلام"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "مطلوب",
"queued": "Queued", "queued": "في الإنتظار",
"albums": "Albums" "albums": "ألبومات"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "مطلوب",
"queued": "Queued", "queued": "في الإنتظار",
"books": "Books" "books": "كتب"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "Missing Episodes", "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": "معلق",
"approved": "Approved", "approved": "مصدق",
"available": "Available", "available": "متاح",
"processing": "Processing" "processing": "معالجة"
}, },
"pihole": { "pihole": {
"queries": "Queries", "queries": "الاستعلامات",
"blocked": "Blocked", "blocked": "محظور",
"gravity": "Gravity" "gravity": "الجاذبية"
}, },
"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": "يعمل",
"stopped": "Stopped", "stopped": "متوقف",
"total": "Total" "total": "مجموع"
}, },
"traefik": { "traefik": {
"routers": "Routers", "routers": "راوتر",
"services": "Services", "services": "خدمات",
"middleware": "Middleware" "middleware": "الوسيطة"
}, },
"npm": { "npm": {
"enabled": "Enabled", "enabled": "مفعل",
"disabled": "Disabled", "disabled": "معطل",
"total": "Total" "total": "مجموع"
}, },
"coinmarketcap": { "coinmarketcap": {
"configure": "Configure one or more crypto currencies to track", "configure": "قم بأنشاء عملة تشفير واحدة أو أكثر للتتبع",
"1hour": "1 Hour", "1hour": "١ ساعة",
"1day": "1 Day", "1day": "١ يوم",
"7days": "7 Days", "7days": "٧ أيام",
"30days": "30 Days" "30days": "٣٠ يوم"
}, },
"gotify": { "gotify": {
"apps": "Applications", "apps": "التطبيقات",
"clients": "Clients", "clients": "العملاء",
"messages": "Messages" "messages": "الرسائل"
}, },
"prowlarr": { "prowlarr": {
"enableIndexers": "Indexers", "enableIndexers": "مفهرسات",
"numberOfGrabs": "Grabs", "numberOfGrabs": "Grabs",
"numberOfQueries": "Queries", "numberOfQueries": "الاستعلامات",
"numberOfFailGrabs": "Fail Grabs", "numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries" "numberOfFailQueries": "فشل الاستعلامات"
}, },
"jackett": { "jackett": {
"configured": "Configured", "configured": "Configured",
"errored": "Errored" "errored": "خطأ"
}, },
"strelaysrv": { "strelaysrv": {
"numActiveSessions": "Sessions", "numActiveSessions": "الجلسات",
"numConnections": "Connections", "numConnections": "التوصيلات",
"dataRelayed": "Relayed", "dataRelayed": "Relayed",
"transferRate": "Rate" "transferRate": "معدل"
}, },
"mastodon": { "mastodon": {
"user_count": "Users", "user_count": "المستخدمين",
"status_count": "Posts", "status_count": "Posts",
"domain_count": "Domains" "domain_count": "Domains"
}, },
"authentik": { "authentik": {
"users": "Users", "users": "المستخدمين",
"loginsLast24H": "Logins (24h)", "loginsLast24H": "تسجيلات الدخول (٢٤س)",
"failedLoginsLast24H": "Failed Logins (24h)" "failedLoginsLast24H": "فشل تسجيلات الدخول (٢٤س)"
}, },
"proxmox": { "proxmox": {
"mem": "MEM", "mem": "الذاكرة",
"cpu": "CPU", "cpu": "المعالج",
"lxc": "LXC", "lxc": "LXC",
"vms": "VMs" "vms": "VMs"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "معالج",
"mem": "MEM", "mem": "الذاكرة",
"wait": "Please wait" "wait": "الرجاء الإنتظار"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Bookmark", "bookmark": "مفضلة",
"service": "Service" "service": "خدمة"
}, },
"homebridge": { "homebridge": {
"available_update": "System", "available_update": "نظام",
"updates": "Updates", "updates": "تحديثات",
"update_available": "Update Available", "update_available": "تحديث متاح",
"up_to_date": "Up to Date", "up_to_date": "حتى الآن",
"child_bridges": "Child Bridges", "child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}" "child_bridges_status": "{{ok}}/{{total}}"
}, },
"watchtower": { "watchtower": {
"containers_scanned": "Scanned", "containers_scanned": "Scanned",
"containers_updated": "Updated", "containers_updated": "محدث",
"containers_failed": "Failed" "containers_failed": "فشل"
}, },
"autobrr": { "autobrr": {
"approvedPushes": "Approved", "approvedPushes": "مصدق",
"rejectedPushes": "Rejected", "rejectedPushes": "مرفوض",
"filters": "Filters", "filters": "المرشحات",
"indexers": "Indexers" "indexers": "مفهرسات"
}, },
"tubearchivist": { "tubearchivist": {
"downloads": "Queue", "downloads": "إنتظار",
"videos": "Videos", "videos": "الفيديوهات",
"channels": "Channels", "channels": "القنوات",
"playlists": "Playlists" "playlists": "قوائم التشغيل"
}, },
"truenas": { "truenas": {
"load": "System Load", "load": "حمل النظام",
"uptime": "Uptime", "uptime": "مدة التشغيل",
"alerts": "Alerts", "alerts": "تنبيهات",
"time": "{{value, number(style: unit; unitDisplay: long;)}}" "time": "{{value, number(style: unit; unitDisplay: long;)}}"
}, },
"navidrome": { "navidrome": {
"nothing_streaming": "No Active Streams", "nothing_streaming": "No Active Streams",
"please_wait": "Please Wait" "please_wait": "الرجاء الإنتظار"
}, },
"pyload": { "pyload": {
"speed": "Speed", "speed": "السرعة",
"active": "Active", "active": "نشط",
"queue": "Queue", "queue": "إنتظار",
"total": "Total" "total": "مجموع"
}, },
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "العام IP",
"region": "Region", "region": "منطقة",
"country": "Country" "country": "الدولة"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "قنوات",
"hd": "HD" "hd": "HD"
}, },
"ping": { "ping": {
"error": "Error", "error": "خطأ",
"ping": "Ping" "ping": "Ping"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "إجتاز",
"failed": "Failed", "failed": "فشل",
"unknown": "Unknown" "unknown": "مجهول"
}, },
"paperlessngx": { "paperlessngx": {
"inbox": "Inbox", "inbox": "صندوق الوارد",
"total": "Total" "total": "المجموع"
}, },
"deluge": { "deluge": {
"download": "Download", "download": "تنزيل",
"upload": "Upload", "upload": "تحميل",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"flood": { "flood": {
"download": "Download", "download": "التنزيل",
"upload": "Upload", "upload": "التحميل",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"tdarr": { "tdarr": {
"queue": "Queue", "queue": "إنتظار",
"processed": "Processed", "processed": "معالجة",
"errored": "Errored", "errored": "خطأ",
"saved": "Saved" "saved": "حفظ"
}, },
"miniflux": { "miniflux": {
"read": "Read", "read": "قراءة",
"unread": "Unread" "unread": "غير مقروء"
}, },
"nextdns": { "nextdns": {
"wait": "Please Wait", "wait": "الرجاء الإنتظار",
"no_devices": "No Device Data Received" "no_devices": "لم يتم استلام بيانات الجهاز"
}, },
"common": { "common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}", "bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}" "bibitrate": "{{value, rate(bits: true; binary: true)}}"
}, },
"omada": { "omada": {
"connectedAp": "Connected APs", "connectedAp": "المتصلة APs",
"activeUser": "Active devices", "activeUser": "الأجهزة النشطة",
"alerts": "Alerts", "alerts": "تنبيهات",
"connectedGateway": "Connected gateways", "connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches" "connectedSwitches": "Connected switches"
}, },
"downloadstation": { "downloadstation": {
"download": "Download", "download": "تنزيل",
"upload": "Upload", "upload": "تحميل",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"mikrotik": { "mikrotik": {
"cpuLoad": "CPU Load", "cpuLoad": "حمل المعالج",
"memoryUsed": "Memory Used", "memoryUsed": "الذاكرة الستخدمة",
"uptime": "Uptime", "uptime": "مدة التشغيل",
"numberOfLeases": "Leases" "numberOfLeases": "Leases"
}, },
"xteve": { "xteve": {
"streams_all": "All Streams", "streams_all": "All Streams",
"streams_active": "Active Streams", "streams_active": "Active Streams",
"streams_xepg": "XEPG Channels" "streams_xepg": "XEPG قنوات"
}, },
"opnsense": { "opnsense": {
"cpu": "CPU Load", "cpu": "حمل المعالج",
"memory": "Active Memory", "memory": "الذاكرة النشطة",
"wanUpload": "WAN Upload", "wanUpload": "WAN التحميل",
"wanDownload": "WAN Download" "wanDownload": "WAN التنزيل"
}, },
"moonraker": { "moonraker": {
"printer_state": "Printer State", "printer_state": "حالة الطابعة",
"print_status": "Print Status", "print_status": "حالة الطابعة",
"print_progress": "Progress", "print_progress": "تقدم",
"layers": "Layers" "layers": "طبقات"
}, },
"medusa": { "medusa": {
"wanted": "Wanted", "wanted": "مطلوب",
"queued": "Queued", "queued": "في الإنتظار",
"series": "Series" "series": "سلسلة"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "حالة",
"temp_tool": "Tool temp", "temp_tool": "أداة درجة الحرارة",
"temp_bed": "Bed temp", "temp_bed": "درجة حرارة السرير",
"job_completion": "Completion" "job_completion": "إتمام"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "حالة"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -184,7 +184,7 @@
"failedLoginsLast24H": "Errors d'inici de sessió (24h)" "failedLoginsLast24H": "Errors d'inici de sessió (24h)"
}, },
"proxmox": { "proxmox": {
"vms": "Màquines Virtuals", "vms": "VMs",
"mem": "Memòria", "mem": "Memòria",
"cpu": "Processador", "cpu": "Processador",
"lxc": "LXC" "lxc": "LXC"
@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"cpu_usage": "CPU",
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"memory_usage": "Memory"
} }
} }

View File

@@ -424,10 +424,26 @@
"print_progress": "Progress", "print_progress": "Progress",
"layers": "Layers" "layers": "Layers"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "A la espera", "queued": "A la espera",
"series": "Serie" "series": "Serie"
}, },
"octoPrint": { "octoprint": {
"temp_bed": "Bed temp",
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "IP de origen",
"status": "Estado"
},
"proxmoxbackupserver": {
"cpu_usage": "CPU",
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"memory_usage": "Memory"
} }
} }

View File

@@ -194,7 +194,7 @@
"uptime": "System Uptime", "uptime": "System Uptime",
"lan_users": "LAN Users", "lan_users": "LAN Users",
"wlan_users": "WLAN Users", "wlan_users": "WLAN Users",
"wait": "Please wait", "wait": "Odota, ole hyvä",
"days": "Days", "days": "Days",
"wan": "WAN", "wan": "WAN",
"up": "UP", "up": "UP",
@@ -314,7 +314,7 @@
}, },
"navidrome": { "navidrome": {
"nothing_streaming": "No Active Streams", "nothing_streaming": "No Active Streams",
"please_wait": "Please Wait" "please_wait": "Odota, ole hyvä"
}, },
"pyload": { "pyload": {
"speed": "Speed", "speed": "Speed",
@@ -411,14 +411,24 @@
"layers": "Layers" "layers": "Layers"
}, },
"medusa": { "medusa": {
"wanted": "Wanted", "wanted": "Haluttu",
"queued": "Queued", "queued": "Jonossa",
"series": "Series" "series": "Sarja"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "En attente", "queued": "En attente",
"series": "Séries" "series": "Séries"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Achèvement"
},
"cloudflared": {
"origin_ip": "IP Publique",
"status": "Statut"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"temp_bed": "Bed temp",
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"print_progress": "Progress", "print_progress": "Progress",
"layers": "Layers" "layers": "Layers"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -394,31 +394,41 @@
"numberOfLeases": "Dzierżawy" "numberOfLeases": "Dzierżawy"
}, },
"xteve": { "xteve": {
"streams_all": "All Streams", "streams_all": "Wszystkie strumienie",
"streams_active": "Active Streams", "streams_active": "Aktywne strumienie",
"streams_xepg": "XEPG Channels" "streams_xepg": "Kanały XEPG"
}, },
"opnsense": { "opnsense": {
"cpu": "CPU Load", "cpu": "Obciążenie procesora",
"memory": "Active Memory", "memory": "Pamięć rzeczywista",
"wanUpload": "WAN Upload", "wanUpload": "WAN wysyłanie",
"wanDownload": "WAN Download" "wanDownload": "WAN pobieranie"
}, },
"moonraker": { "moonraker": {
"printer_state": "Printer State", "printer_state": "Stan drukarki",
"print_status": "Print Status", "print_status": "Status wydruku",
"print_progress": "Progress", "print_progress": "Postęp",
"layers": "Layers" "layers": "Warstwy"
}, },
"medusa": { "medusa": {
"wanted": "Wanted", "wanted": "Poszukiwane",
"queued": "Queued", "queued": "Zakolejkowane",
"series": "Series" "series": "Seria"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -424,10 +424,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "У черзі", "queued": "У черзі",
"series": "Серії" "series": "Серії"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Стан",
"temp_tool": "Tool temp", "temp_tool": "Температура інструменту",
"temp_bed": "Bed temp", "temp_bed": "Температура ліжка",
"job_completion": "Completion" "job_completion": "Завершення"
},
"cloudflared": {
"origin_ip": "Походження IP",
"status": "Стан"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -415,10 +415,20 @@
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -61,20 +61,20 @@
"timeleft": "剩餘時間" "timeleft": "剩餘時間"
}, },
"rutorrent": { "rutorrent": {
"active": "Active", "active": "活動中",
"upload": "上", "upload": "上行速率",
"download": "下" "download": "下行速率"
}, },
"radarr": { "radarr": {
"movies": "電影", "movies": "電影",
"wanted": "關注中", "wanted": "關注中",
"queued": "已加入佇列", "queued": "已加入佇列",
"missing": "遺失" "missing": "缺少"
}, },
"sonarr": { "sonarr": {
"wanted": "關注中", "wanted": "關注中",
"queued": "已加入佇列", "queued": "已加入佇列",
"series": "系列" "series": "影集"
}, },
"readarr": { "readarr": {
"wanted": "關注中", "wanted": "關注中",
@@ -93,13 +93,13 @@
"processing": "處理中" "processing": "處理中"
}, },
"pihole": { "pihole": {
"queries": "查詢", "queries": "查詢",
"blocked": "已阻擋", "blocked": "已阻擋",
"gravity": "Gravity" "gravity": "Gravity"
}, },
"speedtest": { "speedtest": {
"upload": "上行", "upload": "上行速率",
"download": "下行", "download": "下行速率",
"ping": "Ping" "ping": "Ping"
}, },
"portainer": { "portainer": {
@@ -132,23 +132,23 @@
"prowlarr": { "prowlarr": {
"enableIndexers": "索引器", "enableIndexers": "索引器",
"numberOfGrabs": "抓取", "numberOfGrabs": "抓取",
"numberOfQueries": "查詢", "numberOfQueries": "查詢",
"numberOfFailGrabs": "抓取失敗", "numberOfFailGrabs": "抓取失敗",
"numberOfFailQueries": "查詢失敗" "numberOfFailQueries": "查詢失敗"
}, },
"transmission": { "transmission": {
"download": "下", "download": "下行速率",
"upload": "上", "upload": "上行速率",
"leech": "Leech", "leech": "未完成下載",
"seed": "Seed" "seed": "已完成下載"
}, },
"jackett": { "jackett": {
"configured": "已配置", "configured": "已配置",
"errored": "發生錯誤" "errored": "發生錯誤"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "缺的劇集", "missingEpisodes": "缺的劇集",
"missingMovies": "缺的電影" "missingMovies": "缺的電影"
}, },
"lidarr": { "lidarr": {
"wanted": "關注中", "wanted": "關注中",
@@ -156,16 +156,16 @@
"albums": "專輯" "albums": "專輯"
}, },
"adguard": { "adguard": {
"queries": "查詢", "queries": "查詢",
"blocked": "已阻擋", "blocked": "已阻擋",
"filtered": "已過濾", "filtered": "已過濾",
"latency": "延遲" "latency": "延遲"
}, },
"qbittorrent": { "qbittorrent": {
"download": "下", "download": "下行速率",
"upload": "上", "upload": "上行速率",
"leech": "Leech", "leech": "未完成下載",
"seed": "Seed" "seed": "已完成下載"
}, },
"mastodon": { "mastodon": {
"user_count": "使用者", "user_count": "使用者",
@@ -216,8 +216,8 @@
"wait": "請稍後" "wait": "請稍後"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "總監測數",
"diffsDetected": "Diffs Detected" "diffsDetected": "偵測到的變更"
}, },
"wmo": { "wmo": {
"0-day": "晴", "0-day": "晴",
@@ -345,16 +345,16 @@
"total": "全部" "total": "全部"
}, },
"deluge": { "deluge": {
"download": "下", "download": "下行速率",
"upload": "上", "upload": "上行速率",
"leech": "Leech", "leech": "未完成下載",
"seed": "Seed" "seed": "已完成下載"
}, },
"flood": { "flood": {
"download": "下", "download": "下行速率",
"upload": "上", "upload": "上行速率",
"leech": "Leech", "leech": "未完成下載",
"seed": "Seed" "seed": "已完成下載"
}, },
"tdarr": { "tdarr": {
"queue": "佇列", "queue": "佇列",
@@ -382,10 +382,10 @@
"connectedSwitches": "已連接的交換器" "connectedSwitches": "已連接的交換器"
}, },
"downloadstation": { "downloadstation": {
"download": "下", "download": "下行速率",
"upload": "上", "upload": "上行速率",
"leech": "Leech", "leech": "未完成下載",
"seed": "Seed" "seed": "已完成下載"
}, },
"mikrotik": { "mikrotik": {
"cpuLoad": "CPU負載", "cpuLoad": "CPU負載",
@@ -405,20 +405,30 @@
"wanDownload": "WAN下載" "wanDownload": "WAN下載"
}, },
"moonraker": { "moonraker": {
"printer_state": "Printer State", "printer_state": "列印機狀態",
"print_status": "Print Status", "print_status": "列印狀態",
"print_progress": "Progress", "print_progress": "進度",
"layers": "Layers" "layers": ""
}, },
"medusa": { "medusa": {
"wanted": "Wanted", "wanted": "關注中",
"queued": "Queued", "queued": "已加入佇列",
"series": "Series" "series": "影集"
}, },
"octoPrint": { "octoprint": {
"printer_state": "Status", "printer_state": "狀態",
"temp_tool": "Tool temp", "temp_tool": "噴頭溫度",
"temp_bed": "Bed temp", "temp_bed": "平台溫度",
"job_completion": "Completion" "job_completion": "完成度"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
} }
} }

View File

@@ -1,16 +1,18 @@
import Docker from "dockerode"; import Docker from "dockerode";
import getDockerArguments from "utils/config/docker"; import getDockerArguments from "utils/config/docker";
import createLogger from "utils/logger";
const logger = createLogger("dockerStatsService");
export default async function handler(req, res) { export default async function handler(req, res) {
const { service } = req.query; const { service } = req.query;
const [containerName, containerServer] = service; const [containerName, containerServer] = service;
if (!containerName && !containerServer) { if (!containerName && !containerServer) {
res.status(400).send({ return res.status(400).send({
error: "docker query parameters are required", error: "docker query parameters are required",
}); });
return;
} }
try { try {
@@ -23,10 +25,9 @@ export default async function handler(req, res) {
// bad docker connections can result in a <Buffer ...> object? // bad docker connections can result in a <Buffer ...> object?
// in any case, this ensures the result is the expected array // in any case, this ensures the result is the expected array
if (!Array.isArray(containers)) { if (!Array.isArray(containers)) {
res.status(500).send({ return res.status(500).send({
error: "query failed", error: "query failed",
}); });
return;
} }
const containerNames = containers.map((container) => container.Names[0].replace(/^\//, "")); const containerNames = containers.map((container) => container.Names[0].replace(/^\//, ""));
@@ -36,10 +37,9 @@ export default async function handler(req, res) {
const container = docker.getContainer(containerName); const container = docker.getContainer(containerName);
const stats = await container.stats({ stream: false }); const stats = await container.stats({ stream: false });
res.status(200).json({ return res.status(200).json({
stats, stats,
}); });
return;
} }
// Try with a service deployed in Docker Swarm, if enabled // Try with a service deployed in Docker Swarm, if enabled
@@ -61,19 +61,19 @@ export default async function handler(req, res) {
const container = docker.getContainer(taskContainerId); const container = docker.getContainer(taskContainerId);
const stats = await container.stats({ stream: false }); const stats = await container.stats({ stream: false });
res.status(200).json({ return res.status(200).json({
stats, stats,
}); });
return;
} }
} }
res.status(200).send({ return res.status(200).send({
error: "not found", error: "not found",
}); });
} catch { } catch (e) {
res.status(500).send({ logger.error(e);
error: {message: "Unknown error"}, return res.status(500).send({
error: {message: e?.message ?? "Unknown error"},
}); });
} }
} }

View File

@@ -1,6 +1,9 @@
import Docker from "dockerode"; import Docker from "dockerode";
import getDockerArguments from "utils/config/docker"; import getDockerArguments from "utils/config/docker";
import createLogger from "utils/logger";
const logger = createLogger("dockerStatusService");
export default async function handler(req, res) { export default async function handler(req, res) {
const { service } = req.query; const { service } = req.query;
@@ -68,9 +71,10 @@ export default async function handler(req, res) {
return res.status(200).send({ return res.status(200).send({
error: "not found", error: "not found",
}); });
} catch { } catch (e) {
logger.error(e);
return res.status(500).send({ return res.status(500).send({
error: "unknown error", error: {message: e?.message ?? "Unknown error"},
}); });
} }
} }

View File

@@ -13,6 +13,17 @@ import {
} from "utils/config/service-helpers"; } from "utils/config/service-helpers";
import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers"; import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers";
/**
* Compares services by weight then by name.
*/
function compareServices(service1, service2) {
const comp = service1.weight - service2.weight;
if (comp !== 0) {
return comp;
}
return service1.name.localeCompare(service2.name);
}
export async function bookmarksResponse() { export async function bookmarksResponse() {
checkAndCopyConfig("bookmarks.yaml"); checkAndCopyConfig("bookmarks.yaml");
@@ -112,7 +123,8 @@ export async function servicesResponse() {
...discoveredDockerGroup.services, ...discoveredDockerGroup.services,
...discoveredKubernetesGroup.services, ...discoveredKubernetesGroup.services,
...configuredGroup.services ...configuredGroup.services
].filter((service) => service), ].filter((service) => service)
.sort(compareServices),
}; };
if (definedLayouts) { if (definedLayouts) {

View File

@@ -33,6 +33,15 @@ export async function servicesFromConfig() {
})), })),
})); }));
// add default weight to services based on their position in the configuration
servicesArray.forEach((group, groupIndex) => {
group.services.forEach((service, serviceIndex) => {
if(!service.weight) {
servicesArray[groupIndex].services[serviceIndex].weight = (serviceIndex + 1) * 100;
}
});
});
return servicesArray; return servicesArray;
} }
@@ -152,6 +161,7 @@ export async function servicesFromKubernetes() {
href: ingress.metadata.annotations[`${ANNOTATION_BASE}/href`] || getUrlFromIngress(ingress), href: ingress.metadata.annotations[`${ANNOTATION_BASE}/href`] || getUrlFromIngress(ingress),
name: ingress.metadata.annotations[`${ANNOTATION_BASE}/name`] || ingress.metadata.name, name: ingress.metadata.annotations[`${ANNOTATION_BASE}/name`] || ingress.metadata.name,
group: ingress.metadata.annotations[`${ANNOTATION_BASE}/group`] || "Kubernetes", group: ingress.metadata.annotations[`${ANNOTATION_BASE}/group`] || "Kubernetes",
weight: ingress.metadata.annotations[`${ANNOTATION_BASE}/weight`] || '0',
icon: ingress.metadata.annotations[`${ANNOTATION_BASE}/icon`] || '', icon: ingress.metadata.annotations[`${ANNOTATION_BASE}/icon`] || '',
description: ingress.metadata.annotations[`${ANNOTATION_BASE}/description`] || '', description: ingress.metadata.annotations[`${ANNOTATION_BASE}/description`] || '',
}; };
@@ -201,6 +211,17 @@ export function cleanServiceGroups(groups) {
name: serviceGroup.name, name: serviceGroup.name,
services: serviceGroup.services.map((service) => { services: serviceGroup.services.map((service) => {
const cleanedService = { ...service }; const cleanedService = { ...service };
if (typeof service.weight === 'string') {
const weight = parseInt(service.weight, 10);
if (Number.isNaN(weight)) {
cleanedService.weight = 0;
} else {
cleanedService.weight = weight;
}
}
if (typeof cleanedService.weight !== "number") {
cleanedService.weight = 0;
}
if (cleanedService.widget) { if (cleanedService.widget) {
// whitelisted set of keys to pass to the frontend // whitelisted set of keys to pass to the frontend
@@ -214,12 +235,15 @@ export function cleanServiceGroups(groups) {
defaultinterval, defaultinterval,
namespace, // kubernetes widget namespace, // kubernetes widget
app, app,
podSelector podSelector,
wan // opnsense widget
} = cleanedService.widget; } = cleanedService.widget;
const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields;
cleanedService.widget = { cleanedService.widget = {
type, type,
fields: fields || null, fields: fieldsList || null,
service_name: service.name, service_name: service.name,
service_group: serviceGroup.name, service_group: serviceGroup.name,
}; };
@@ -237,6 +261,9 @@ export function cleanServiceGroups(groups) {
if (app) cleanedService.widget.app = app; if (app) cleanedService.widget.app = app;
if (podSelector) cleanedService.widget.podSelector = podSelector; if (podSelector) cleanedService.widget.podSelector = podSelector;
} }
if (type === "opnsense") {
if (wan) cleanedService.widget.wan = wan;
}
} }
return cleanedService; return cleanedService;

View File

@@ -34,12 +34,18 @@ export default async function credentialedProxyHandler(req, res, map) {
headers.Authorization = `Bearer ${widget.key}`; headers.Authorization = `Bearer ${widget.key}`;
} else if (widget.type === "proxmox") { } else if (widget.type === "proxmox") {
headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`; headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`;
} else if (widget.type === "proxmoxbackupserver") {
delete headers["Content-Type"];
headers.Authorization = `PBSAPIToken=${widget.username}:${widget.password}`;
} else if (widget.type === "autobrr") { } else if (widget.type === "autobrr") {
headers["X-API-Token"] = `${widget.key}`; headers["X-API-Token"] = `${widget.key}`;
} else if (widget.type === "tubearchivist") { } else if (widget.type === "tubearchivist") {
headers.Authorization = `Token ${widget.key}`; headers.Authorization = `Token ${widget.key}`;
} else if (widget.type === "miniflux") { } else if (widget.type === "miniflux") {
headers["X-Auth-Token"] = `${widget.key}`; headers["X-Auth-Token"] = `${widget.key}`;
} else if (widget.type === "cloudflared") {
headers["X-Auth-Email"] = `${widget.email}`;
headers["X-Auth-Key"] = `${widget.key}`;
} else { } else {
headers["X-API-Key"] = `${widget.key}`; headers["X-API-Key"] = `${widget.key}`;
} }

View File

@@ -0,0 +1,31 @@
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { widget } = service;
const { data: statsData, error: statsError } = useWidgetAPI(widget, "cfd_tunnel");
if (statsError) {
return <Container error={statsError} />;
}
if (!statsData) {
return (
<Container service={service}>
<Block label="cloudflared.status" />
<Block label="cloudflared.origin_ip" />
</Container>
);
}
const originIP = statsData.result.connections?.origin_ip ?? statsData.result.connections[0]?.origin_ip;
return (
<Container service={service}>
<Block label="cloudflared.status" value={statsData.result.status.charAt(0).toUpperCase() + statsData.result.status.slice(1)} />
<Block label="cloudflared.origin_ip" value={originIP} />
</Container>
);
}

View File

@@ -0,0 +1,18 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "https://api.cloudflare.com/client/v4/accounts/{accountid}/{endpoint}/{tunnelid}",
proxyHandler: credentialedProxyHandler,
mappings: {
"cfd_tunnel": {
endpoint: "cfd_tunnel",
validate: [
"success",
"result"
]
},
},
};
export default widget;

View File

@@ -6,6 +6,7 @@ const components = {
autobrr: dynamic(() => import("./autobrr/component")), autobrr: dynamic(() => import("./autobrr/component")),
bazarr: dynamic(() => import("./bazarr/component")), bazarr: dynamic(() => import("./bazarr/component")),
changedetectionio: dynamic(() => import("./changedetectionio/component")), changedetectionio: dynamic(() => import("./changedetectionio/component")),
cloudflared: dynamic(() => import("./cloudflared/component")),
coinmarketcap: dynamic(() => import("./coinmarketcap/component")), coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
deluge: dynamic(() => import("./deluge/component")), deluge: dynamic(() => import("./deluge/component")),
downloadstation: dynamic(() => import("./downloadstation/component")), downloadstation: dynamic(() => import("./downloadstation/component")),
@@ -30,12 +31,13 @@ const components = {
nextdns: dynamic(() => import("./nextdns/component")), nextdns: dynamic(() => import("./nextdns/component")),
npm: dynamic(() => import("./npm/component")), npm: dynamic(() => import("./npm/component")),
nzbget: dynamic(() => import("./nzbget/component")), nzbget: dynamic(() => import("./nzbget/component")),
octoPrint: dynamic(() => import("./octoPrint/component")), octoprint: dynamic(() => import("./octoprint/component")),
omada: dynamic(() => import("./omada/component")), omada: dynamic(() => import("./omada/component")),
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")),
paperlessngx: dynamic(() => import("./paperlessngx/component")), paperlessngx: dynamic(() => import("./paperlessngx/component")),
proxmoxbackupserver: dynamic(() => import("./proxmoxbackupserver/component")),
pihole: dynamic(() => import("./pihole/component")), pihole: dynamic(() => import("./pihole/component")),
plex: dynamic(() => import("./plex/component")), plex: dynamic(() => import("./plex/component")),
portainer: dynamic(() => import("./portainer/component")), portainer: dynamic(() => import("./portainer/component")),
@@ -60,6 +62,7 @@ const components = {
unifi: dynamic(() => import("./unifi/component")), unifi: dynamic(() => import("./unifi/component")),
watchtower: dynamic(() => import("./watchtower/component")), watchtower: dynamic(() => import("./watchtower/component")),
xteve: dynamic(() => import("./xteve/component")), xteve: dynamic(() => import("./xteve/component")),
immich: dynamic(() => import("./immich/component")),
}; };
export default components; export default components;

View File

@@ -0,0 +1,33 @@
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { widget } = service;
const { data: immichData, error: immichError } = useWidgetAPI(widget);
if (immichError || immichData?.statusCode === 401) {
return <Container error={immichError ?? immichData} />;
}
if (!immichData) {
return (
<Container service={service}>
<Block label="immich.users" />
<Block label="immich.photos" />
<Block label="immich.videos" />
<Block label="immich.storage" />
</Container>
);
}
return (
<Container service={service}>
<Block label="immich.users" value={immichData.usageByUser.length} />
<Block label="immich.photos" value={immichData.photos} />
<Block label="immich.videos" value={immichData.videos} />
<Block label="immich.storage" value={immichData.usage} />
</Container>
);
}

View File

@@ -0,0 +1,8 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/api/server-info/stats",
proxyHandler: credentialedProxyHandler,
};
export default widget;

View File

@@ -27,7 +27,7 @@ export default function Component({ service }) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="nzbget.rate" value={t("common.bitrate", { value: statusData.DownloadRate })} /> <Block label="nzbget.rate" value={t("common.byterate", { value: statusData.DownloadRate })} />
<Block <Block
label="nzbget.remaining" label="nzbget.remaining"
value={t("common.bytes", { value: statusData.RemainingSizeMB * 1024 * 1024 })} value={t("common.bytes", { value: statusData.RemainingSizeMB * 1024 * 1024 })}

View File

@@ -23,7 +23,7 @@ export default function Component({ service }) {
if (!printerStats || !state || !tempTool || !tempBed) { if (!printerStats || !state || !tempTool || !tempBed) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="octoPrint.printer_state" /> <Block label="octoprint.printer_state" />
</Container> </Container>
); );
} }
@@ -36,29 +36,29 @@ export default function Component({ service }) {
if (!jobStats || !completion) { if (!jobStats || !completion) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="octoPrint.printer_state" /> <Block label="octoprint.printer_state" />
<Block label="octoPrint.temp_tool" /> <Block label="octoprint.temp_tool" />
<Block label="octoPrint.temp_bed" /> <Block label="octoprint.temp_bed" />
<Block label="octoPrint.job_completion" /> <Block label="octoprint.job_completion" />
</Container> </Container>
); );
} }
return ( return (
<Container service={service}> <Container service={service}>
<Block label="octoPrint.printer_state" value={printerStats.state.text} /> <Block label="octoprint.printer_state" value={printerStats.state.text} />
<Block label="octoPrint.temp_tool" value={`${printerStats.temperature.tool0.actual} °C`} /> <Block label="octoprint.temp_tool" value={`${printerStats.temperature.tool0.actual} °C`} />
<Block label="octoPrint.temp_bed" value={`${printerStats.temperature.bed.actual} °C`} /> <Block label="octoprint.temp_bed" value={`${printerStats.temperature.bed.actual} °C`} />
<Block label="octoPrint.job_completion" value={`${completion.toFixed(2)}%`} /> <Block label="octoprint.job_completion" value={`${completion.toFixed(2)}%`} />
</Container> </Container>
); );
} }
return ( return (
<Container service={service}> <Container service={service}>
<Block label="octoPrint.printer_state" value={printerStats.state.text} /> <Block label="octoprint.printer_state" value={printerStats.state.text} />
<Block label="octoPrint.temp_tool" value={`${printerStats.temperature.tool0.actual} °C`} /> <Block label="octoprint.temp_tool" value={`${printerStats.temperature.tool0.actual} °C`} />
<Block label="octoPrint.temp_bed" value={`${printerStats.temperature.bed.actual} °C`} /> <Block label="octoprint.temp_bed" value={`${printerStats.temperature.bed.actual} °C`} />
</Container> </Container>
); );
} }

View File

@@ -33,16 +33,14 @@ export default function Component({ service }) {
const cpu = 100 - parseFloat(cpuIdle); const cpu = 100 - parseFloat(cpuIdle);
const memory = activityData.headers[3].match(/Mem: (.+) Active,/)[1]; const memory = activityData.headers[3].match(/Mem: (.+) Active,/)[1];
const wanUpload = interfaceData.interfaces.wan['bytes transmitted']; const wan = widget.wan ? interfaceData.interfaces[widget.wan] : interfaceData.interfaces.wan;
const wanDownload = interfaceData.interfaces.wan['bytes received'];
return ( return (
<Container service={service}> <Container service={service}>
<Block label="opnsense.cpu" value={t("common.percent", { value: cpu.toFixed(2) })} /> <Block label="opnsense.cpu" value={t("common.percent", { value: cpu.toFixed(2) })} />
<Block label="opnsense.memory" value={memory} /> <Block label="opnsense.memory" value={memory} />
<Block label="opnsense.wanUpload" value={t("common.bytes", { value: wanUpload })} /> {wan && <Block label="opnsense.wanUpload" value={t("common.bytes", { value: wan['bytes transmitted'] })} />}
<Block label="opnsense.wanDownload" value={t("common.bytes", { value: wanDownload })} /> {wan && <Block label="opnsense.wanDownload" value={t("common.bytes", { value: wan['bytes received'] })} />}
</Container> </Container>
); );
} }

View File

@@ -32,7 +32,7 @@ export default function Component({ service }) {
const { data } = clusterData ; const { data } = clusterData ;
const vms = data.filter(item => item.type === "qemu") || []; const vms = data.filter(item => item.type === "qemu") || [];
const lxc = data.filter(item => item.type === "lxc") || []; const lxc = data.filter(item => item.type === "lxc" && item.template === 0) || [];
const nodes = data.filter(item => item.type === "node") || []; const nodes = data.filter(item => item.type === "node") || [];
const runningVMs = vms.reduce(calcRunning, 0); const runningVMs = vms.reduce(calcRunning, 0);

View File

@@ -0,0 +1,45 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: datastoreData, error: datastoreError } = useWidgetAPI(widget, "status/datastore-usage");
const { data: tasksData, error: tasksError } = useWidgetAPI(widget, "nodes/localhost/tasks");
const { data: hostData, error: hostError } = useWidgetAPI(widget, "nodes/localhost/status");
if (datastoreError || tasksError || hostError) {
const finalError = tasksError ?? datastoreError ?? hostError;
return <Container error={finalError} />;
}
if (!datastoreData || !tasksData || !hostData) {
return (
<Container service={service}>
<Block label="proxmoxbackupserver.datastore_usage" />
<Block label="proxmoxbackupserver.failed_tasks" />
<Block label="proxmoxbackupserver.cpu_usage" />
<Block label="proxmoxbackupserver.memory_usage" />
</Container>
);
}
const datastoreUsage = datastoreData.data[0].used / datastoreData.data[0].total * 100;
const cpuUsage = hostData.data.cpu * 100;
const memoryUsage = hostData.data.memory.used / hostData.data.memory.total * 100;
const failedTasks = tasksData.total >= 100 ? "99+" : tasksData.total;
return (
<Container service={service}>
<Block label="proxmoxbackupserver.datastore_usage" value={t("common.percent", { value: datastoreUsage })} />
<Block label="proxmoxbackupserver.failed_tasks_24h" value={failedTasks} />
<Block label="proxmoxbackupserver.cpu_usage" value={t("common.percent", { value: cpuUsage })} />
<Block label="proxmoxbackupserver.memory_usage" value={t("common.percent", { value: memoryUsage })} />
</Container>
);
}

View File

@@ -0,0 +1,22 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const since = Date.now() - (24 * 60 * 60 * 1000);
const widget = {
api: "{url}/api2/json/{endpoint}",
proxyHandler: credentialedProxyHandler,
mappings: {
"status/datastore-usage": {
endpoint: "status/datastore-usage",
},
"nodes/localhost/tasks": {
endpoint: `nodes/localhost/tasks?errors=true&limit=100&since=${since}`,
},
"nodes/localhost/status": {
endpoint: "nodes/localhost/status",
},
},
};
export default widget;

View File

@@ -3,6 +3,7 @@ import authentik from "./authentik/widget";
import autobrr from "./autobrr/widget"; import autobrr from "./autobrr/widget";
import bazarr from "./bazarr/widget"; import bazarr from "./bazarr/widget";
import changedetectionio from "./changedetectionio/widget"; import changedetectionio from "./changedetectionio/widget";
import cloudflared from "./cloudflared/widget";
import coinmarketcap from "./coinmarketcap/widget"; import coinmarketcap from "./coinmarketcap/widget";
import deluge from "./deluge/widget"; import deluge from "./deluge/widget";
import downloadstation from "./downloadstation/widget"; import downloadstation from "./downloadstation/widget";
@@ -24,12 +25,13 @@ import navidrome from "./navidrome/widget";
import nextdns from "./nextdns/widget"; import nextdns from "./nextdns/widget";
import npm from "./npm/widget"; import npm from "./npm/widget";
import nzbget from "./nzbget/widget"; import nzbget from "./nzbget/widget";
import octoPrint from "./octoPrint/widget"; import octoprint from "./octoprint/widget";
import omada from "./omada/widget"; 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 paperlessngx from "./paperlessngx/widget"; import paperlessngx from "./paperlessngx/widget";
import proxmoxbackupserver from "./proxmoxbackupserver/widget";
import pihole from "./pihole/widget"; import pihole from "./pihole/widget";
import plex from "./plex/widget"; import plex from "./plex/widget";
import portainer from "./portainer/widget"; import portainer from "./portainer/widget";
@@ -54,6 +56,7 @@ import truenas from "./truenas/widget";
import unifi from "./unifi/widget"; import unifi from "./unifi/widget";
import watchtower from "./watchtower/widget"; import watchtower from "./watchtower/widget";
import xteve from "./xteve/widget"; import xteve from "./xteve/widget";
import immich from "./immich/widget";
const widgets = { const widgets = {
adguard, adguard,
@@ -61,6 +64,7 @@ const widgets = {
autobrr, autobrr,
bazarr, bazarr,
changedetectionio, changedetectionio,
cloudflared,
coinmarketcap, coinmarketcap,
deluge, deluge,
diskstation: downloadstation, diskstation: downloadstation,
@@ -84,12 +88,13 @@ const widgets = {
nextdns, nextdns,
npm, npm,
nzbget, nzbget,
octoPrint, octoprint,
omada, omada,
ombi, ombi,
opnsense, opnsense,
overseerr, overseerr,
paperlessngx, paperlessngx,
proxmoxbackupserver,
pihole, pihole,
plex, plex,
portainer, portainer,
@@ -115,6 +120,7 @@ const widgets = {
unifi_console: unifi, unifi_console: unifi,
watchtower, watchtower,
xteve, xteve,
immich,
}; };
export default widgets; export default widgets;