Compare commits

...

280 Commits

Author SHA1 Message Date
jokob-sk
38b525f0b8 Mobile CSS fixes 2024-06-09 00:00:20 +10:00
jokob-sk
931155ea25 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-06-08 23:45:08 +10:00
jokob-sk
35cae3a7d4 🔃 Sync Hub v1.0 + Mobile CSS fixes 2024-06-08 23:44:51 +10:00
github-actions[bot]
72bccd0098 [🤖Automation] Update README with sponsors information 2024-06-08 11:54:00 +00:00
jokob-sk
b743e68155 🔃 Sync Hub v0.8.2 - 📚docs 2024-06-08 18:52:07 +10:00
jokob-sk
1d525cb84c 🔃 Sync Hub v0.8.1 + CSS fixes + Empty settings sanity check + JSON linting + docs 2024-06-08 18:01:58 +10:00
jokob-sk
bbd69c60bf 🔃 Sync Hub v0.8 2024-06-08 12:42:11 +10:00
jokob-sk
c591ab9ce3 🔃 Sync Hub v0.8 2024-06-08 12:29:03 +10:00
jokob-sk
b613775031 🔽HW install fixes 2024-06-08 10:56:24 +10:00
jokob-sk
bd3b15dedc 🔃 Sync Hub v0.7.3 2024-06-08 10:39:53 +10:00
jokob-sk
0d83ed3179 🔃 Sync Hub v0.7.2 2024-06-08 09:34:07 +10:00
jokob-sk
f077c85c2d Weblate 2024-06-08 08:54:58 +10:00
jokob-sk
2eb3f9347a Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-06-08 08:48:58 +10:00
jokob-sk
9daa4491a1 🔃 Sync Hub v0.7.1 2024-06-08 08:48:39 +10:00
Massimo Pissarello
02f882b105 Translated using Weblate (Italian)
Currently translated at 100.0% (676 of 676 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-06-07 16:09:23 +02:00
gallegonovato
5203d4959b Translated using Weblate (Spanish)
Currently translated at 100.0% (676 of 676 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2024-06-07 16:09:22 +02:00
github-actions[bot]
9e264f7a9f [🤖Automation] Update README with sponsors information 2024-06-07 11:53:49 +00:00
jokob-sk
26e4249f5c 🔃 Sync Hub v0.7 - Devices working 2024-06-07 21:23:49 +10:00
jokob-sk
d63e0d9fd2 🔃 Sync Hub v0.6.51 - Devices table + Permissions fixes 2024-06-07 20:48:44 +10:00
jokob-sk
ebe41ab384 ▶ First/Last session sent in MQTT #697 2024-06-07 20:22:47 +10:00
jokob-sk
1e3cea0f7f 🔃 Sync Hub v0.6.5 - Devices table + Permissions fixes 2024-06-07 20:10:05 +10:00
jokob-sk
b2d38c1c55 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-06-06 23:00:30 +10:00
jokob-sk
23703e4e22 🔃 Sync Hub v0.6.4 - Guid, SyncHubNodeName added 2024-06-06 23:00:05 +10:00
github-actions[bot]
ff6d728dee [🤖Automation] Update README with sponsors information 2024-06-06 11:53:47 +00:00
jokob-sk
73db99fe2f 🔃 Sync Hub v0.6.31 2024-06-06 20:38:12 +10:00
jokob-sk
302a687d41 📅 Remove +timezone offset from First/:ast session columns #695 2024-06-06 18:58:09 +10:00
jokob-sk
6133c2c937 🔃 Sync Hub v0.6.3 2024-06-06 18:52:22 +10:00
jokob-sk
ac8bbca37f 🔃 Sync Hub v0.6.2 2024-06-06 18:50:15 +10:00
Anonymous
be4ca42803 Translated using Weblate (Italian)
Currently translated at 99.1% (670 of 676 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-06-05 23:54:05 +02:00
Anonymous
0355d9214d Translated using Weblate (Russian)
Currently translated at 98.9% (669 of 676 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
2024-06-05 23:54:05 +02:00
Anonymous
d2badf4b51 Translated using Weblate (Spanish)
Currently translated at 99.1% (670 of 676 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2024-06-05 23:54:05 +02:00
Anonymous
c3e9e84cde Translated using Weblate (German)
Currently translated at 92.3% (624 of 676 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2024-06-05 23:54:05 +02:00
jokob-sk
09b3f44e23 Weblate 2024-06-06 07:52:49 +10:00
jokob-sk
205cbcf9eb Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-06-06 07:34:30 +10:00
jokob-sk
b7b1a9eb48 🔃 Sync Hub v0.6.1 2024-06-06 07:34:13 +10:00
github-actions[bot]
19eb375da1 [🤖Automation] Update README with sponsors information 2024-06-05 11:53:50 +00:00
jokob-sk
5f59097b0d 🔃 Sync Hub v0.6 2024-06-05 12:57:29 +10:00
jokob-sk
96f18b40d1 🔃 Sync Hub v0.57 2024-06-05 08:16:28 +10:00
jokob-sk
da169c1173 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-06-05 08:05:37 +10:00
jokob-sk
bd11c2ecdf 🔃 Sync Hub v0.56 2024-06-05 08:05:20 +10:00
github-actions[bot]
c636bf1914 [🤖Automation] Update README with sponsors information 2024-06-04 11:53:39 +00:00
jokob-sk
0f724e6a1d 🔃 Sync Hub v0.55 2024-06-04 20:16:30 +10:00
jokob-sk
2599e47121 🔃 Sync Hub v0.54 2024-06-04 20:08:04 +10:00
jokob-sk
bac8ac30aa 🔃 Sync Hub v0.53 2024-06-04 19:58:48 +10:00
jokob-sk
2c8c998a97 🔃 Sync Hub v0.52 2024-06-04 18:39:39 +10:00
jokob-sk
4b577109c8 🔃 Sync Hub v0.51 2024-06-04 18:32:19 +10:00
jokob-sk
a07e5b59c3 🔃 Sync Hub v0.5 2024-06-04 18:22:47 +10:00
jokob-sk
44bf47edc2 🔃 Sync Hub v0.41 2024-06-04 17:47:00 +10:00
jokob-sk
02eafadf15 🔃 Sync Hub v0.4 2024-06-04 17:36:10 +10:00
jokob-sk
46e7e7bc01 🔃 Sync Hub v0.3 2024-06-03 23:06:25 +10:00
jokob-sk
8c96f61b54 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-06-03 22:24:28 +10:00
jokob-sk
8a8df3c7b8 🔃 Node sync v0.2 2024-06-03 22:24:06 +10:00
github-actions[bot]
4cd8aa209b [🤖Automation] Update README with sponsors information 2024-06-03 11:53:53 +00:00
jokob-sk
e3557ad7d2 🔃 Node sync v0.1 2024-06-03 07:56:05 +10:00
jokob-sk
3a7ff90ce1 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-06-03 07:39:52 +10:00
jokob-sk
8a0b8b8a10 🔔 User Notifications v0.6 2024-06-03 07:39:27 +10:00
github-actions[bot]
93e6cc339e [🤖Automation] Update README with sponsors information 2024-06-02 11:53:56 +00:00
jokob-sk
91ff13df27 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-06-01 22:09:38 +10:00
jokob-sk
e49432aee7 🔔 User Notifications v0.6 2024-06-01 22:09:19 +10:00
github-actions[bot]
7ae4465522 [🤖Automation] Update README with sponsors information 2024-06-01 11:53:44 +00:00
jokob-sk
d14fc6586a 🔔 User Notifications v0.5 2024-06-01 20:59:54 +10:00
jokob-sk
cb3c0ecee7 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-06-01 20:05:39 +10:00
jokob-sk
de561e1ad0 🔒DB lock v0.4 #685 + 🔔userNotifications 2024-06-01 20:05:15 +10:00
github-actions[bot]
09f7b1e394 [🤖Automation] Update README with sponsors information 2024-05-31 11:53:35 +00:00
jokob-sk
2e9aa37cd2 🔒DB lock v0.3 #685 + cleanup 2024-05-31 19:30:11 +10:00
jokob-sk
29c3a46170 Merge pull request #692 from vladaurosh/main
upgrading base image to Alpine 3.20, upgrading php to 8.3
2024-05-31 18:53:22 +10:00
Hosted Weblate
9f2e3ae397 Merge branch 'origin/main' into Weblate. 2024-05-31 04:09:17 +02:00
Massimo Pissarello
32a43881dd Translated using Weblate (Italian)
Currently translated at 100.0% (672 of 672 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-05-31 04:09:15 +02:00
Safeguard
c5ed0e92e8 Translated using Weblate (Russian)
Currently translated at 99.8% (671 of 672 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
2024-05-31 04:09:14 +02:00
gallegonovato
a5d120b0d3 Translated using Weblate (Spanish)
Currently translated at 100.0% (672 of 672 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2024-05-31 04:09:13 +02:00
root
d80bd48294 upgrading base image to Alpine 3.20, upgrading php to 8.3 2024-05-31 00:30:46 +01:00
github-actions[bot]
45c5ee24c7 [🤖Automation] Update README with sponsors information 2024-05-30 11:53:55 +00:00
jokob-sk
ff4b1a16a2 Alpine 3.19 rollback 2024-05-30 17:32:17 +10:00
jokob-sk
74f1177ec6 DB lock v0.2 #685 2024-05-30 16:43:15 +10:00
Anonymous
79b81b8bc2 Translated using Weblate (Italian)
Currently translated at 98.9% (665 of 672 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-05-30 02:38:13 +02:00
Anonymous
c06c4e2ae7 Translated using Weblate (Russian)
Currently translated at 98.8% (664 of 672 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
2024-05-30 02:38:13 +02:00
Anonymous
a2b9ce9c25 Translated using Weblate (Spanish)
Currently translated at 99.1% (666 of 672 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2024-05-30 02:38:13 +02:00
Anonymous
0a6c11bdaa Translated using Weblate (German)
Currently translated at 92.8% (624 of 672 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2024-05-30 02:38:12 +02:00
jokob-sk
b682b7cc2f Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-30 10:35:16 +10:00
jokob-sk
2dadae1762 Weblate 2024-05-30 10:34:34 +10:00
Massimo Pissarello
ce09ded979 Translated using Weblate (Italian)
Currently translated at 100.0% (670 of 670 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-05-30 02:09:18 +02:00
jokob-sk
9589cfb2cb Merge pull request #688 from vladaurosh/main
Update base docker image to alpine 3.20
2024-05-29 22:29:47 +10:00
github-actions[bot]
d604591162 [🤖Automation] Update README with sponsors information 2024-05-29 11:53:58 +00:00
jokob-sk
bb2beda12a ⚙ settings saving improvements + refactor - DB lock v0.1 #685 2024-05-29 19:24:43 +10:00
jokob-sk
3853b8a4ec ⚙ settings saving improvements - Inline editing bug 🐛 2024-05-29 17:34:51 +10:00
jokob-sk
b0c47e824d 🔍SNMP bugfix #690 + ⚙ settings saving improvemnts 2024-05-29 17:06:35 +10:00
jokob-sk
e138840ecf Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-29 13:47:03 +10:00
jokob-sk
43e2e7c11f 📚 docs + ⚙settings saving improvemnts 2024-05-29 13:46:37 +10:00
github-actions[bot]
3118f4324a [🤖Automation] Update README with sponsors information 2024-05-28 11:53:44 +00:00
vladaurosh
667b3b6262 Update base docker image to alpine 3.20
Updating base docker image to alpine 3.20
2024-05-28 01:42:50 +01:00
github-actions[bot]
5cd75b96be [🤖Automation] Update README with sponsors information 2024-05-27 11:53:46 +00:00
jokob-sk
6be2ba967e Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-27 19:25:49 +10:00
jokob-sk
bef7f87706 📚 file permissions guide #652 2024-05-27 19:25:24 +10:00
github-actions[bot]
57c0d590be [🤖Automation] Update README with sponsors information 2024-05-26 11:53:47 +00:00
jokob-sk
0cf525bd30 💠down_reconnected support v0.75 #611 2024-05-26 16:52:07 +10:00
jokob-sk
b3f81967c6 💠down_reconnected support v0.7 #611 2024-05-26 15:50:26 +10:00
jokob-sk
df071c0835 🆕 db locked icon #685 2024-05-26 15:28:37 +10:00
jokob-sk
2c7d71d13c 💠down_reconnected support v0.6 #611 2024-05-26 13:54:49 +10:00
jokob-sk
f9b16081d6 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-25 23:29:22 +10:00
jokob-sk
3102b8a76e 💠down_reconnected support v0.5 #611 2024-05-25 23:28:48 +10:00
github-actions[bot]
b42cf07b21 [🤖Automation] Update README with sponsors information 2024-05-25 11:53:55 +00:00
jokob-sk
2f4423481d Retry support for INTRNT #667 2024-05-25 12:18:59 +10:00
jokob-sk
fb88f5f722 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-25 09:54:33 +10:00
jokob-sk
23ef5759f6 Removed Pholus Dependency in DBCLNP #681 2024-05-25 09:54:23 +10:00
github-actions[bot]
0781c77ce2 [🤖Automation] Update README with sponsors information 2024-05-24 11:53:40 +00:00
jokob-sk
10b3e91b8a Loading plugins v 0.6 🔌 + Show only Down #676 + Docs📚 + Settings page work ⚙ 2024-05-24 08:01:48 +10:00
github-actions[bot]
5e45bf6d4a [🤖Automation] Update README with sponsors information 2024-05-23 11:53:51 +00:00
Hosted Weblate
21ae76e77e Merge branch 'origin/main' into Weblate. 2024-05-22 23:02:30 +02:00
SirAfino
a6b6617fcd Translated using Weblate (Italian)
Currently translated at 97.7% (655 of 670 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-05-22 23:02:06 +02:00
github-actions[bot]
edd81527d5 [🤖Automation] Update README with sponsors information 2024-05-22 11:53:55 +00:00
github-actions[bot]
395d0a7723 [🤖Automation] Update README with sponsors information 2024-05-21 11:53:41 +00:00
github-actions[bot]
e4f2e1ac4c [🤖Automation] Update README with sponsors information 2024-05-20 11:53:42 +00:00
jokob-sk
a04bef9b31 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-20 08:14:58 +10:00
jokob-sk
03f82d9510 Loading plugins v 0.5 🔌 2024-05-20 08:14:36 +10:00
Hosted Weblate
8c1a7fb828 Merge branch 'origin/main' into Weblate. 2024-05-19 21:01:57 +02:00
gallegonovato
67651acfc3 Translated using Weblate (Spanish)
Currently translated at 100.0% (670 of 670 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2024-05-19 21:01:54 +02:00
github-actions[bot]
da1090dd7a [🤖Automation] Update README with sponsors information 2024-05-19 11:53:35 +00:00
github-actions[bot]
f4960f5793 [🤖Automation] Update README with sponsors information 2024-05-18 11:53:47 +00:00
jokob-sk
924ac72401 Loading plugins v 0.36 🔌 2024-05-18 11:27:35 +10:00
jokob-sk
862b1e7a08 Weblate 2024-05-18 11:21:54 +10:00
jokob-sk
6f4ae1d29f Loading plugins v 0.35 🔌 2024-05-18 11:16:28 +10:00
jokob-sk
315921873d Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-18 10:14:15 +10:00
jokob-sk
c5211eb8ed Loading plugins v 0.31 🔌 2024-05-18 10:14:07 +10:00
SirAfino
572aaacf20 Translated using Weblate (Italian)
Currently translated at 91.0% (608 of 668 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-05-18 00:01:54 +02:00
github-actions[bot]
960d74640d [🤖Automation] Update README with sponsors information 2024-05-17 11:54:00 +00:00
jokob-sk
e01125c5cb Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-16 22:51:46 +10:00
jokob-sk
01d96cb60b Loading plugins v 0.3 🔌 2024-05-16 22:51:28 +10:00
github-actions[bot]
3519e4b680 [🤖Automation] Update README with sponsors information 2024-05-16 11:53:38 +00:00
jokob-sk
ecc6eb5c5d Loading plugins v 0.2 🔌 2024-05-16 21:46:02 +10:00
jokob-sk
f97339020c template 2024-05-16 20:59:38 +10:00
jokob-sk
d38691e131 template 2024-05-16 20:57:22 +10:00
Hosted Weblate
4cf02c451b Merge branch 'origin/main' into Weblate. 2024-05-16 08:02:12 +00:00
SirAfino
03713aae11 Translated using Weblate (Italian)
Currently translated at 83.9% (561 of 668 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-05-16 08:02:06 +00:00
Safeguard
f5770f4cce Translated using Weblate (Russian)
Currently translated at 99.8% (667 of 668 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
2024-05-16 08:02:05 +00:00
github-actions[bot]
155cf61e2b [🤖Automation] Update README with sponsors information 2024-05-15 11:54:03 +00:00
github-actions[bot]
1bca1095a8 [🤖Automation] Update README with sponsors information 2024-05-14 11:53:56 +00:00
github-actions[bot]
0064955533 [🤖Automation] Update README with sponsors information 2024-05-13 11:54:00 +00:00
Hosted Weblate
9ac82c9269 Merge branch 'origin/main' into Weblate. 2024-05-13 02:08:41 +02:00
Cesar Osvaldo Müller
aeb90e8143 Translated using Weblate (Portuguese (Brazil))
Currently translated at 10.6% (71 of 668 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/pt_BR/
2024-05-13 02:02:28 +02:00
SirAfino
8d57c53d0b Translated using Weblate (Italian)
Currently translated at 82.0% (548 of 668 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-05-13 02:02:27 +02:00
jokob-sk
7ab503efd2 Update feature_request.yml 2024-05-13 08:26:14 +10:00
github-actions[bot]
fdf9626498 [🤖Automation] Update README with sponsors information 2024-05-12 11:53:49 +00:00
github-actions[bot]
1ddbeb751e [🤖Automation] Update README with sponsors information 2024-05-11 11:53:35 +00:00
jokob-sk
0ad3d33402 Update feature_request.yml 2024-05-11 12:39:42 +10:00
jokob-sk
035ec80f3d Loading plugins v 0.1 🔌 2024-05-11 12:37:32 +10:00
jokob-sk
36af285c0a Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-11 09:00:28 +10:00
jokob-sk
c4fc968d2a MQTT device_tracker sensor fix #664 🚑 2024-05-11 09:00:22 +10:00
github-actions[bot]
563343b94d [🤖Automation] Update README with sponsors information 2024-05-10 11:53:42 +00:00
Hosted Weblate
2d8a5d283f Merge branch 'origin/main' into Weblate. 2024-05-10 09:33:27 +02:00
Szymon Niewczas
13efc0a29c Translated using Weblate (Polish)
Currently translated at 56.7% (379 of 668 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/pl/
2024-05-10 09:31:20 +02:00
Mehdi
8eef4b6390 Translated using Weblate (French)
Currently translated at 45.2% (302 of 668 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/fr/
2024-05-10 09:31:19 +02:00
github-actions[bot]
3c633b4b71 [🤖Automation] Update README with sponsors information 2024-05-09 11:53:51 +00:00
jokob-sk
645a4e68f0 Multi-edit urlencode #660 2024-05-09 07:53:43 +10:00
github-actions[bot]
9007658e40 [🤖Automation] Update README with sponsors information 2024-05-08 11:53:51 +00:00
jokob-sk
316cb9ca57 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-08 07:49:33 +10:00
jokob-sk
bfddccddec Work on settings #655 🔃 2024-05-08 07:49:28 +10:00
github-actions[bot]
77f46417a9 [🤖Automation] Update README with sponsors information 2024-05-07 11:53:46 +00:00
jokob-sk
d5c0f898df Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-07 08:03:46 +10:00
jokob-sk
28e403356b Work on settings styles & #618 2024-05-07 08:03:41 +10:00
github-actions[bot]
07546bc7df [🤖Automation] Update README with sponsors information 2024-05-06 11:53:38 +00:00
github-actions[bot]
bf054dfc3f [🤖Automation] Update README with sponsors information 2024-05-05 11:53:43 +00:00
jokob-sk
78b3228159 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-05 09:06:42 +10:00
jokob-sk
6fc73aa2eb MQTT config update 2024-05-05 09:06:36 +10:00
github-actions[bot]
9537de7361 [🤖Automation] Update README with sponsors information 2024-05-04 11:53:33 +00:00
Hosted Weblate
059cc4a162 Merge branch 'origin/main' into Weblate. 2024-05-04 04:07:15 +02:00
onebest1
72d7996315 Translated using Weblate (Chinese (Simplified))
Currently translated at 8.3% (56 of 668 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/zh_Hans/
2024-05-04 04:07:13 +02:00
Massimo Pissarello
ecbbcba6aa Translated using Weblate (Italian)
Currently translated at 78.4% (524 of 668 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-05-04 04:07:12 +02:00
jokob-sk
427c0f9d80 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-04 11:17:59 +10:00
jokob-sk
1524bbd23c MQTT docs and presence sensor type #664 2024-05-04 11:17:55 +10:00
github-actions[bot]
ea080dde8c [🤖Automation] Update README with sponsors information 2024-05-03 11:54:06 +00:00
jokob-sk
45be8a0dbb Chinese 🌏 2024-05-03 08:18:56 +10:00
Hosted Weblate
a0166f58e9 Merge branch 'origin/main' into Weblate. 2024-05-03 00:14:43 +02:00
SirAfino
296525f390 Translated using Weblate (Italian)
Currently translated at 77.2% (516 of 668 strings)

Co-authored-by: SirAfino <serafino.9966@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
Translation: NetAlertX/core
2024-05-03 00:14:40 +02:00
jokob-sk
9040591ae7 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-03 08:10:59 +10:00
jokob-sk
95fd7435d2 Refreshing the settings page cache #663 2024-05-03 08:10:39 +10:00
Hosted Weblate
0a58cca5c3 Merge branch 'origin/main' into Weblate. 2024-05-02 20:07:36 +02:00
Massimo Pissarello
71686aeab5 Translated using Weblate (Italian)
Currently translated at 70.6% (472 of 668 strings)

Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
Translation: NetAlertX/core
2024-05-02 20:07:28 +02:00
Safeguard
152729724c Translated using Weblate (Russian)
Currently translated at 99.7% (666 of 668 strings)

Co-authored-by: Safeguard <yo-safeguard@yandex.ru>
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
Translation: NetAlertX/core
2024-05-02 20:07:26 +02:00
github-actions[bot]
e347454802 [🤖Automation] Update README with sponsors information 2024-05-02 11:53:37 +00:00
jokob-sk
0b6071a272 dnsmasq dhcp.leases v0.1 #661 2024-05-02 20:57:55 +10:00
jokob-sk
5d761e8687 Vendors update work v0.1 #618 2024-05-02 20:33:19 +10:00
jokob-sk
9435cd3081 Vendors update work #618 2024-05-02 20:18:24 +10:00
jokob-sk
ef725103aa Loading cleanup in Maintenance + case insensitive vendor MAC matching #618 🔄 2024-05-02 08:39:16 +10:00
jokob-sk
7568071ce8 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-02 07:24:50 +10:00
jokob-sk
96f90fa5c9 Startup helper fix 2024-05-02 07:24:10 +10:00
Massimo Pissarello
323ca5a8a9 Translated using Weblate (Italian)
Currently translated at 68.5% (458 of 668 strings)

Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
Translation: NetAlertX/core
2024-05-01 19:21:14 +02:00
SirAfino
09549b1922 Translated using Weblate (Italian)
Currently translated at 68.5% (458 of 668 strings)

Co-authored-by: SirAfino <serafino.9966@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
Translation: NetAlertX/core
2024-05-01 19:21:13 +02:00
Massimo Pissarello
09339b9b6d Translated using Weblate (Italian)
Currently translated at 68.5% (458 of 668 strings)

Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
Translation: NetAlertX/core
2024-05-01 19:21:13 +02:00
github-actions[bot]
1fb46add24 [🤖Automation] Update README with sponsors information 2024-05-01 11:53:55 +00:00
jokob-sk
1dcca191d9 Loading cleanup #660 🔄 2024-05-01 20:47:54 +10:00
jokob-sk
584fdb7734 Add version to JS files to flush cache #659 2024-05-01 18:25:48 +10:00
jokob-sk
525b05db5a Merge pull request #650 from ulrichwisser/main
cleanDeviceName rewritten to remove all _ labels and remove search list and local domain
2024-05-01 08:25:25 +10:00
jokob-sk
5d8561818f Merge branch 'main' into main 2024-05-01 08:24:43 +10:00
jokob-sk
d3d019b487 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-05-01 08:12:14 +10:00
jokob-sk
2fbbf220fb Sanity check before settings are saved #655 2024-05-01 08:11:58 +10:00
Hosted Weblate
dbfb49d03d Merge branch 'origin/main' into Weblate. 2024-04-30 22:07:29 +02:00
Szymon Niewczas
c52a615720 Translated using Weblate (Polish)
Currently translated at 53.2% (356 of 668 strings)

Co-authored-by: Szymon Niewczas <szymon.other@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pialert/core/pl/
Translation: NetAlertX/core
2024-04-30 22:07:23 +02:00
SirAfino
51365f82b8 Translated using Weblate (Italian)
Currently translated at 60.3% (403 of 668 strings)

Co-authored-by: SirAfino <serafino.9966@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
Translation: NetAlertX/core
2024-04-30 22:07:21 +02:00
jokob-sk
0e02b1beec Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-04-30 23:37:25 +10:00
jokob-sk
cc9b08ad04 NMAPDEV plugin work v0.7 #645 🆕🔎 2024-04-30 23:37:05 +10:00
Ulrich Wisser
aad1bcede3 Merge branch 'jokob-sk:main' into main 2024-04-30 14:47:01 +02:00
Ulrich Wisser
aa28fe2b0e - update dependencies for docker and debian install
- follow project naming guidelines
2024-04-30 14:44:53 +02:00
github-actions[bot]
c9a297b72a [🤖Automation] Update README with sponsors information 2024-04-30 11:53:53 +00:00
Hosted Weblate
e0cff6b81a Merge branch 'origin/main' into Weblate. 2024-04-29 16:07:13 +02:00
gallegonovato
6262f874a3 Translated using Weblate (Spanish)
Currently translated at 100.0% (668 of 668 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2024-04-29 16:07:08 +02:00
github-actions[bot]
eb81d0a1e3 [🤖Automation] Update README with sponsors information 2024-04-29 11:53:50 +00:00
github-actions[bot]
f4d13f3fb6 [🤖Automation] Update README with sponsors information 2024-04-28 11:53:47 +00:00
Hosted Weblate
1dbfa7dc0a Merge branch 'origin/main' into Weblate. 2024-04-28 06:29:18 +02:00
Massimo Pissarello
c6fbf0dd0e Translated using Weblate (Italian)
Currently translated at 48.8% (326 of 668 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-04-28 06:29:15 +02:00
jokob-sk
ab0d4fe259 NMAPDEV plugin work v0.6 #645 🆕🔎 2024-04-28 10:47:31 +10:00
jokob-sk
ecf6c1848d NMAPDEV plugin work v0.6 #645 🆕🔎 2024-04-28 10:17:02 +10:00
github-actions[bot]
8647bf2699 [🤖Automation] Update README with sponsors information 2024-04-27 11:53:42 +00:00
jokob-sk
87b114604c NMAPDEV plugin work v0.6 #645 🆕🔎 2024-04-27 10:30:40 +10:00
jokob-sk
fbbe4dc64b Notification docs 📚 2024-04-27 09:09:32 +10:00
jokob-sk
1a78810691 Notification docs 📚 2024-04-27 09:04:14 +10:00
jokob-sk
f45717cee4 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-04-27 08:21:41 +10:00
jokob-sk
31e358280c Weblate 2024-04-27 08:21:36 +10:00
gallegonovato
444333d44f Translated using Weblate (Spanish)
Currently translated at 100.0% (664 of 664 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2024-04-26 22:07:13 +02:00
github-actions[bot]
4d85c77738 [🤖Automation] Update README with sponsors information 2024-04-26 11:53:52 +00:00
jokob-sk
d26d6c8b0b Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-04-26 07:37:33 +10:00
jokob-sk
944619af81 Settings filter v0.4 + docs for #653 🔍 2024-04-26 07:37:19 +10:00
github-actions[bot]
1332b73a92 [🤖Automation] Update README with sponsors information 2024-04-25 11:53:58 +00:00
jokob-sk
c11deeb57f Settings filter v0.3 🔍 2024-04-25 18:05:16 +10:00
jokob-sk
294518b146 Settings filter v0.2 🔍 2024-04-25 14:14:19 +10:00
jokob-sk
b5be221aec Settings filter 🔍 2024-04-25 13:09:53 +10:00
jokob-sk
8ab3945871 Modals refactor, autofocus support, ESC/ENTER support⌨ 2024-04-25 12:30:05 +10:00
jokob-sk
73732a7d0c Remove all/last on Settings 2024-04-25 10:22:54 +10:00
jokob-sk
5599bbdf31 1x📝|2x🚮 click list edit options in Settings 2024-04-25 10:00:14 +10:00
jokob-sk
2a085f5703 Inline edit list item data in Settings 🚑 2024-04-25 09:04:32 +10:00
Hosted Weblate
2943da7c07 Merge branch 'origin/main' into Weblate. 2024-04-25 00:51:24 +02:00
SirAfino
e1e4a1da07 Translated using Weblate (Italian)
Currently translated at 48.5% (321 of 661 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-04-25 00:51:21 +02:00
Ulrich Wisser
8bb9328201 make new cleanDeviceName configurable, fix debug logging 2024-04-24 18:02:33 +02:00
jokob-sk
9d54273947 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-04-24 23:19:32 +10:00
jokob-sk
141ba5d6c1 NMAPDEV plugin work v0.5 #645 🆕🔎 2024-04-24 23:19:23 +10:00
github-actions[bot]
ebd514e278 [🤖Automation] Update README with sponsors information 2024-04-24 11:53:50 +00:00
Anonymous
aa1468af34 Translated using Weblate (Russian)
Currently translated at 99.3% (657 of 661 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
2024-04-23 23:39:57 +02:00
Anonymous
003732c20d Translated using Weblate (Spanish)
Currently translated at 99.5% (658 of 661 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2024-04-23 23:39:57 +02:00
Anonymous
d762e2b6ae Translated using Weblate (German)
Currently translated at 94.8% (627 of 661 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2024-04-23 23:39:56 +02:00
jokob-sk
c7cb69c914 Weblate 2024-04-24 07:38:08 +10:00
Szymon Niewczas
663e5539c8 Translated using Weblate (Polish)
Currently translated at 48.8% (322 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/pl/
2024-04-23 17:07:28 +02:00
SirAfino
52b130d812 Translated using Weblate (Italian)
Currently translated at 42.6% (281 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-04-23 17:07:24 +02:00
Ulrich Wisser
788f23b955 cleanDeviceName rewritten to remove all _ labels and remove search list and local domain 2024-04-23 15:28:53 +02:00
jokob-sk
047f6a1ed2 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-04-23 22:57:43 +10:00
jokob-sk
a8fad6ac74 Double-click to remove in Settings lists 2024-04-23 22:57:24 +10:00
github-actions[bot]
3ed406021c [🤖Automation] Update README with sponsors information 2024-04-23 11:53:45 +00:00
jokob-sk
f600398353 Seelct all / Remove all in multi-edit 2024-04-23 20:15:20 +10:00
jokob-sk
3af04246d0 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-04-22 23:48:09 +10:00
jokob-sk
95d7856978 NMAPDEV plugin work #645 🆕🔎 2024-04-22 23:47:50 +10:00
github-actions[bot]
fd10379c7f [🤖Automation] Update README with sponsors information 2024-04-22 11:53:50 +00:00
Hosted Weblate
fe776a1443 Merge branch 'origin/main' into Weblate. 2024-04-22 13:07:30 +02:00
Massimo Pissarello
81842b8521 Translated using Weblate (Italian)
Currently translated at 26.4% (174 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-04-22 13:07:22 +02:00
SirAfino
dc7ff4c94d Translated using Weblate (Italian)
Currently translated at 26.4% (174 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-04-22 13:07:21 +02:00
gallegonovato
c13df2e0c8 Translated using Weblate (Spanish)
Currently translated at 100.0% (659 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2024-04-22 13:07:19 +02:00
jokob-sk
0846c3914a UI Settings refresh improvements + remove last button on subnets 2024-04-22 20:43:05 +10:00
jokob-sk
5a2616800f Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-04-22 07:37:36 +10:00
jokob-sk
9cef7848c5 encode special characters when saving device details #644🚑 2024-04-22 07:37:31 +10:00
github-actions[bot]
b14345f390 [🤖Automation] Update README with sponsors information 2024-04-21 11:53:46 +00:00
jokob-sk
b0f1f581dc 🌍 Init empty Polish language 2024-04-21 08:59:15 +10:00
Hosted Weblate
e97a63b814 Merge branch 'origin/main' into Weblate. 2024-04-21 00:53:14 +02:00
SirAfino
45afc4ee1f Translated using Weblate (Italian)
Currently translated at 17.6% (116 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-04-21 00:53:11 +02:00
Massimo Pissarello
ec0b1d18ca Translated using Weblate (Italian)
Currently translated at 17.6% (116 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-04-21 00:53:11 +02:00
jokob-sk
07b0cfdd7b Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-04-21 08:26:22 +10:00
jokob-sk
44408c8cfc MQTT new settings 2024-04-21 08:26:13 +10:00
github-actions[bot]
01d3d0523e [🤖Automation] Update README with sponsors information 2024-04-20 11:53:36 +00:00
jokob-sk
436669173b 🌎 Portuguese (Brazil) empty file init 2024-04-20 11:41:35 +10:00
jokob-sk
003fc557cd 🔐PWD work #634 2024-04-20 10:14:22 +10:00
jokob-sk
c1b5a2684b Missed rename 2024-04-19 22:11:56 +10:00
github-actions[bot]
2b6cc1f8c7 [🤖Automation] Update README with sponsors information 2024-04-19 11:53:41 +00:00
Hosted Weblate
820dc023e8 Merge branch 'origin/main' into Weblate. 2024-04-18 18:03:31 +02:00
SirAfino
a0544368fb Translated using Weblate (Italian)
Currently translated at 10.3% (68 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2024-04-18 18:03:22 +02:00
Safeguard
f2c6778574 Translated using Weblate (Russian)
Currently translated at 99.8% (658 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
2024-04-18 18:03:21 +02:00
Antonio Sanchez Castellón
62dffc4ac3 Translated using Weblate (Spanish)
Currently translated at 99.8% (658 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2024-04-18 18:03:21 +02:00
gallegonovato
847fefcc46 Translated using Weblate (Spanish)
Currently translated at 99.8% (658 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2024-04-18 18:03:21 +02:00
Techsider
47680fc64e Translated using Weblate (German)
Currently translated at 95.2% (628 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2024-04-18 18:03:21 +02:00
github-actions[bot]
277cfd3a03 [🤖Automation] Update README with sponsors information 2024-04-18 11:53:59 +00:00
jokob-sk
6ffceee3ca Docs 📚 2024-04-18 08:11:16 +10:00
jokob-sk
fd00db7886 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2024-04-18 07:32:34 +10:00
jokob-sk
c86aa276b9 Docs 📚 2024-04-18 07:32:26 +10:00
github-actions[bot]
dc36709297 [🤖Automation] Update README with sponsors information 2024-04-17 11:53:58 +00:00
jokob-sk
b63fb6c966 Translated using Weblate (English (United States))
Currently translated at 100.0% (659 of 659 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/en_US/
2024-04-17 13:20:20 +02:00
148 changed files with 19381 additions and 12593 deletions

View File

@@ -9,6 +9,20 @@ body:
options:
- label: I have searched the existing open and closed issues
required: true
- type: checkboxes
attributes:
label: Am I willing to test this? 🧪
description: I rely on the community to test unreleased features. If you are requesting a feature, please be willing to test it within 48h of test request. Otherwise, the feature might be pulled from the code base.
options:
- label: I will do my best to test this feature on the `netlertx-dev` image when requested within 48h and report bugs to help deliver a great user experience for everyone and not to break existing installations.
required: true
- type: checkboxes
attributes:
label: Can I help implement this? 👩‍💻👨‍💻
description: The maintainer will provide guidance and help. The implementer will read the PR guidelines https://github.com/jokob-sk/NetAlertX/tree/main/docs#-pull-requests-prs
options:
- label: "Yes"
- label: "No"
- type: textarea
attributes:
label: Is your feature request related to a problem? Please describe
@@ -35,4 +49,4 @@ body:
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
validations:
required: true
required: true

View File

@@ -1,24 +1,27 @@
FROM alpine:3.19 as builder
FROM alpine:3.20 as builder
ARG INSTALL_DIR=/app
ENV PYTHONUNBUFFERED 1
RUN apk add --no-cache bash python3 \
# Install build dependencies
RUN apk add --no-cache bash python3 python3-dev gcc musl-dev libffi-dev openssl-dev \
&& python -m venv /opt/venv
# Enable venv
ENV PATH="/opt/venv/bin:$PATH"
COPY . ${INSTALL_DIR}/
RUN pip install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet \
RUN pip install pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython \
&& bash -c "find ${INSTALL_DIR} -type d -exec chmod 750 {} \;" \
&& bash -c "find ${INSTALL_DIR} -type f -exec chmod 640 {} \;" \
&& bash -c "find ${INSTALL_DIR} -type f \( -name '*.sh' -o -name '*.py' -o -name 'pialert-cli' -o -name 'speedtest-cli' \) -exec chmod 750 {} \;"
&& bash -c "find ${INSTALL_DIR} -type f \( -name '*.sh' -o -name '*.py' -o -name 'speedtest-cli' \) -exec chmod 750 {} \;"
# second stage
FROM alpine:3.19 as runner
FROM alpine:3.20 as runner
ARG INSTALL_DIR=/app
@@ -37,8 +40,8 @@ ENV S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0
RUN apk update --no-cache \
&& apk add --no-cache bash zip lsblk gettext-envsubst sudo mtr tzdata s6-overlay \
&& apk add --no-cache curl arp-scan iproute2 iproute2-ss nmap nmap-scripts traceroute net-tools net-snmp-tools bind-tools awake ca-certificates \
&& apk add --no-cache sqlite php82 php82-fpm php82-cgi php82-curl php82-sqlite3 php82-session \
&& apk add --no-cache curl arp-scan iproute2 iproute2-ss nmap nmap-scripts traceroute net-tools net-snmp-tools bind-tools awake ca-certificates \
&& apk add --no-cache sqlite php83 php83-fpm php83-cgi php83-curl php83-sqlite3 php83-session \
&& apk add --no-cache python3 nginx \
&& ln -s /usr/bin/awake /usr/bin/wakeonlan \
&& bash -c "install -d -m 750 -o nginx -g www-data ${INSTALL_DIR} ${INSTALL_DIR}" \

View File

@@ -29,10 +29,11 @@ COPY --chmod=775 --chown=${USER_ID}:${USER_GID} . ${INSTALL_DIR}/
# ❗ IMPORTANT - if you modify this file modify the /install/install_dependecies.debian.sh file as well ❗
RUN apt-get install -y \
tini snmp ca-certificates curl libwww-perl arp-scan perl apt-utils cron sudo \
nginx-light php php-cgi php-fpm php-sqlite3 php-curl sqlite3 dnsutils net-tools \
python3 iproute2 nmap python3-pip zip systemctl usbutils traceroute
nginx-light php php-cgi php-fpm php-sqlite3 php-curl sqlite3 dnsutils net-tools php-openssl \
python3 python3-dev iproute2 nmap python3-pip zip systemctl usbutils traceroute
# Alternate dependencies
RUN apt-get install nginx nginx-core mtr php-fpm php8.2-fpm php-cli php8.2 php8.2-sqlite3 -y
@@ -41,7 +42,8 @@ RUN phpenmod -v 8.2 sqlite3
# Setup virtual python environment and use pip3 to install packages
RUN apt-get install -y python3-venv
RUN python3 -m venv myenv
RUN /bin/bash -c "source myenv/bin/activate && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 && pip3 install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet"
RUN /bin/bash -c "source myenv/bin/activate && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 && pip3 install pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython cryptography "
# Create a buildtimestamp.txt to later check if a new version was released
RUN date +%s > ${INSTALL_DIR}/front/buildtimestamp.txt

View File

@@ -47,7 +47,7 @@ Get visibility of what's going on on your WIFI/LAN network. Schedule scans for d
| Features | Details |
|-------------|-------------|
| 🔍 | The app scans your network for, **New devices**, **New connections** (re-connections), **Disconnections**, **"Always Connected" devices down**, Devices **IP changes** and **Internet IP address changes**. Discovery & scan methods include: **arp-scan**. **Pi-hole - DB import**, **Pi-hole - DHCP leases import**, **Generic DHCP leases import**. **UNIFI controller import**, **SNMP-enabled router import**. Check the [Plugins](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins#readme) docs for more info on individual scans. |
| 🔍 | The app scans your network for, **New devices**, **New connections** (re-connections), **Disconnections**, **"Always Connected" devices down**, Devices **IP changes** and **Internet IP address changes**. Discovery & scan methods include: **arp-scan**, **Pi-hole - DB import**, **Pi-hole - DHCP leases import**, **Generic DHCP leases import**. **UNIFI controller import**, **SNMP-enabled router import**. Check the [Plugins](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins#readme) docs for more info on individual scans. |
|📧 | Send notifications to more than 80+ services, including Telegram via [Apprise](https://hub.docker.com/r/caronc/apprise), or use [Pushsafer](https://www.pushsafer.com/), [Pushover](https://www.pushover.net/), or [NTFY](https://ntfy.sh/). |
|🧩 | Feed your data and device changes into [Home Assistant](https://github.com/jokob-sk/NetAlertX/blob/main/docs/HOME_ASSISTANT.md), read [API endpoints](https://github.com/jokob-sk/NetAlertX/blob/main/docs/API.md), or use [Webhooks](https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_N8N.md) to setup custom automation flows. |
| | Build your own scanners with the [Plugin system](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins#readme) |
@@ -60,16 +60,22 @@ Get visibility of what's going on on your WIFI/LAN network. Schedule scans for d
|-------------|-------------|
| 📥🐳 | [Docker instructions](https://github.com/jokob-sk/NetAlertX/blob/main/dockerfiles/README.md)
| 📥💻 | [HW install (experimental 🧪)](https://github.com/jokob-sk/NetAlertX/blob/main/docs/HW_INSTALL.md) |
| 📥🟧 | [Unraid App](https://unraid.net/community/apps) |
| 📚 | [All Documentation](https://github.com/jokob-sk/NetAlertX/blob/main/docs/README.md) (App Usage and Configuration) |
> Other Alternatives
>
> - Check out [leiweibau's on HW installed fork](https://github.com/leiweibau/Pi.Alert/) (maintained)
> - Check instructions for [pucherot's original code](https://github.com/pucherot/Pi.Alert/) (unmaintained)
> - [WatchYourLAN](https://github.com/aceberg/WatchYourLAN) - Lightweight network IP scanner with web GUI (Open source)
> - [Fing](https://www.fing.com/) - Network scanner app for your Internet security (Commercial, Phone App, Proprietary hardware)
> - [NetBox](https://netboxlabs.com/) - Network management software (Commercial)
## 🔔 Get notified what's new
Get notified about a new release, what new functionality you can use and about breaking changes.
![Follow and star][follow_star]
### ⭐ Sponsors
[![GitHub Sponsors](https://img.shields.io/github/sponsors/jokob-sk?style=social)](https://github.com/sponsors/jokob-sk)
@@ -81,7 +87,6 @@ Thank you to all the wonderful people who are sponsoring this project.
<!-- SPONSORS-LIST DO NOT MODIFY BELOW -->
| All Sponsors |
|---|
| [Tony Hanratty](https://github.com/thanratty) |
<!-- SPONSORS-LIST DO NOT MODIFY ABOVE -->
@@ -106,11 +111,6 @@ This project would be nothing without the amazing work of the community, with sp
> [pucherot/Pi.Alert](https://github.com/pucherot/Pi.Alert) (the original creator of PiAlert), [leiweibau](https://github.com/leiweibau/Pi.Alert): Dark mode (and much more), [Macleykun](https://github.com/Macleykun) (Help with Dockerfile clean-up) [Final-Hawk](https://github.com/Final-Hawk) (Help with NTFY, styling and other fixes), [TeroRERO](https://github.com/terorero) (Spanish translations), [Data-Monkey](https://github.com/Data-Monkey), (Split-up of the python.py file and more), [cvc90](https://github.com/cvc90) (Spanish translation and various UI work) to name a few...
Here is everyone that helped and contributed to this project:
<a href="https://github.com/jokob-sk/netalertx/graphs/contributors">
<img src="https://contri-graphy.yourselfhosted.com/graph?repo=jokob-sk/netalertx&format=svg" />
</a>
## Everything else
<!--- --------------------------------------------------------------------- --->
@@ -131,18 +131,19 @@ Help out and suggest languages in the [online portal of Weblate](https://hosted.
<!--- --------------------------------------------------------------------- --->
[main]: ./docs/img/devices_split.png "Main screen"
[screen1]: ./docs/img/device_details.png "Screen 1"
[screen2]: ./docs/img/events.png "Screen 2"
[screen3]: ./docs/img/presence.png "Screen 3"
[screen4]: ./docs/img/maintenance.png "Screen 4"
[screen5]: ./docs/img/network.png "Screen 5"
[screen6]: ./docs/img/settings.png "Screen 6"
[screen7]: ./docs/img/help_faq.png "Screen 7"
[screen8]: ./docs/img/plugins_rogue_dhcp.png "Screen 8"
[screen9]: ./docs/img/device_nmap.png "Screen 9"
[report1]: ./docs/img/4_report_1.jpg "Report sample 1"
[report2]: ./docs/img/4_report_2.jpg "Report sample 2"
[main_dark]: /docs/img/1_devices_dark.jpg "Main screen dark"
[maintain_dark]: /docs/img/5_maintain.jpg "Maintain screen dark"
[main]: ./docs/img/devices_split.png "Main screen"
[screen1]: ./docs/img/device_details.png "Screen 1"
[screen2]: ./docs/img/events.png "Screen 2"
[screen3]: ./docs/img/presence.png "Screen 3"
[screen4]: ./docs/img/maintenance.png "Screen 4"
[screen5]: ./docs/img/network.png "Screen 5"
[screen6]: ./docs/img/settings.png "Screen 6"
[screen7]: ./docs/img/help_faq.png "Screen 7"
[screen8]: ./docs/img/plugins_rogue_dhcp.png "Screen 8"
[screen9]: ./docs/img/device_nmap.png "Screen 9"
[report1]: ./docs/img/4_report_1.jpg "Report sample 1"
[report2]: ./docs/img/4_report_2.jpg "Report sample 2"
[main_dark]: /docs/img/1_devices_dark.jpg "Main screen dark"
[maintain_dark]: /docs/img/5_maintain.jpg "Maintain screen dark"
[follow_star]: /docs/img/Follow_Releases_and_Star.gif "Follow and Star"

View File

@@ -21,8 +21,6 @@
SCAN_SUBNETS=['192.168.1.0/24 --interface=eth1']
TIMEZONE='Europe/Berlin'
PIALERT_WEB_PROTECTION=False
PIALERT_WEB_PASSWORD='8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92'
DAYS_TO_KEEP_EVENTS=90
# Used for generating links in emails. Make sure not to add a trailing slash!
REPORT_DASHBOARD_URL='http://netalertx'

View File

@@ -1,125 +0,0 @@
#!/bin/bash
SCRIPT=$(readlink -f $0)
SCRIPTPATH=$(dirname $SCRIPT)
CONFFILENAME="app.conf"
SETTING_NAME_TOGGLE="PIALERT_WEB_PROTECTION"
SETTING_NAME_PWD="PIALERT_WEB_PASSWORD"
PIA_CONF_FILE=${SCRIPTPATH}'/../config/${CONFFILENAME}'
case $1 in
help)
echo "pialert-cli v0.1 (https://github.com/leiweibau/Pi.Alert)"
echo "Usage: pialert-cli <command>"
echo ""
echo "The is a list of supported commands:"
echo ""
echo " set_login - Sets the parameter $SETTING_NAME_TOGGLE in the config file to TRUE"
echo " - If the parameter is not present, it will be created. Additionally the"
echo " default password '123456' is set."
echo ""
echo " unset_login - Sets the parameter $SETTING_NAME_TOGGLE in the config file to FALSE"
echo " - If the parameter is not present, it will be created. Additionally the"
echo " default password '123456' is set."
echo ""
echo " set_password <password> - Sets the new password as a hashed value."
echo " - If the $SETTING_NAME_TOGGLE parameter does not exist yet, it will be"
echo " created and set to 'True' (login enabled)"
echo ""
echo " set_autopassword - Sets a new random password as a hashed value and show it plaintext in"
echo " the console."
echo " - If the $SETTING_NAME_TOGGLE parameter does not exist yet, it will be"
echo " created and set to 'True' (login enabled)"
echo ""
echo ""
echo ""
;;
set_login)
## Check if $SETTING_NAME_TOGGLE exists
CHECK_PROT=$(grep "$SETTING_NAME_TOGGLE" $PIA_CONF_FILE | wc -l)
if [ $CHECK_PROT -eq 0 ]
then
## Create $SETTING_NAME_TOGGLE and enable it
sed -i "/^VENDORS_DB.*/a $SETTING_NAME_TOGGLE = True" $PIA_CONF_FILE
sed -i "/^$SETTING_NAME_TOGGLE.*/a $SETTING_NAME_PWD = '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92'" $PIA_CONF_FILE
else
## Switch $SETTING_NAME_TOGGLE to enable
sed -i "/$SETTING_NAME_TOGGLE/c\$SETTING_NAME_TOGGLE = True" $PIA_CONF_FILE
fi
echo "Login is now enabled"
;;
unset_login)
## Check if $SETTING_NAME_TOGGLE exists
CHECK_PROT=$(grep "$SETTING_NAME_TOGGLE" $PIA_CONF_FILE | wc -l)
if [ $CHECK_PROT -eq 0 ]
then
## Create $SETTING_NAME_TOGGLE and disable it
sed -i "/^VENDORS_DB.*/a $SETTING_NAME_TOGGLE = False" $PIA_CONF_FILE
sed -i "/^$SETTING_NAME_TOGGLE.*/a $SETTING_NAME_PWD = '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92'" $PIA_CONF_FILE
else
## Switch $SETTING_NAME_TOGGLE to disable
sed -i "/$SETTING_NAME_TOGGLE/c\$SETTING_NAME_TOGGLE = False" $PIA_CONF_FILE
fi
echo "Login is now disabled"
;;
set_password)
PIA_PASS=$2
## Check if $SETTING_NAME_TOGGLE exists
CHECK_PROT=$(grep "$SETTING_NAME_TOGGLE" $PIA_CONF_FILE | wc -l)
if [ $CHECK_PROT -eq 0 ]
then
## Create $SETTING_NAME_TOGGLE and enable it
sed -i "/^VENDORS_DB.*/a $SETTING_NAME_TOGGLE = True" $PIA_CONF_FILE
fi
## Prepare Hash
PIA_PASS_HASH=$(echo -n $PIA_PASS | sha256sum | awk '{print $1}')
echo " The hashed password is:"
echo " $PIA_PASS_HASH"
## Check if the password parameter is set
CHECK_PWD=$(grep "$SETTING_NAME_PWD" $PIA_CONF_FILE | wc -l)
if [ $CHECK_PWD -eq 0 ]
then
sed -i "/^$SETTING_NAME_TOGGLE.*/a $SETTING_NAME_PWD = '$PIA_PASS_HASH'" $PIA_CONF_FILE
else
sed -i "/$SETTING_NAME_PWD/c\$SETTING_NAME_PWD = '$PIA_PASS_HASH'" $PIA_CONF_FILE
fi
echo ""
echo "The new password is set"
;;
set_autopassword)
## Check if $SETTING_NAME_TOGGLE exists
CHECK_PROT=$(grep "$SETTING_NAME_TOGGLE" $PIA_CONF_FILE | wc -l)
if [ $CHECK_PROT -eq 0 ]
then
## Create $SETTING_NAME_TOGGLE and enable it
sed -i "/^VENDORS_DB.*/a $SETTING_NAME_TOGGLE = True" $PIA_CONF_FILE
fi
## Create autopassword
PIA_AUTOPASS=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1)
echo " The password is: $PIA_AUTOPASS"
## Prepare Hash
PIA_AUTOPASS_HASH=$(echo -n $PIA_AUTOPASS | sha256sum | awk '{print $1}')
echo " The hashed password is:"
echo " $PIA_AUTOPASS_HASH"
## Check if the password parameter is set
CHECK_PWD=$(grep "$SETTING_NAME_PWD" $PIA_CONF_FILE | wc -l)
if [ $CHECK_PWD -eq 0 ]
then
## Create password parameter
sed -i "/^$SETTING_NAME_TOGGLE.*/a $SETTING_NAME_PWD = '$PIA_AUTOPASS_HASH'" $PIA_CONF_FILE
else
## Overwrite password parameter
sed -i "/$SETTING_NAME_PWD/c\$SETTING_NAME_PWD = '$PIA_AUTOPASS_HASH'" $PIA_CONF_FILE
fi
echo ""
echo "The new password is set"
;;
*)
echo "pialert-cli v0.1 (https://github.com/leiweibau/Pi.Alert)"
echo "Use \"pialert-cli help\" for a list of supported commands."
esac

View File

@@ -12,56 +12,31 @@
# ----------------------------------------------------------------------
# Main directories to update:
# /usr/share/arp-scan
# /usr/share/ieee-data
# /var/lib/ieee-data
# ----------------------------------------------------------------------
echo "---------------------------------------------------------"
echo "[INSTALL] Run update_vendors.sh"
echo "---------------------------------------------------------"
# ----------------------------------------------------------------------
echo Updating... /usr/share/ieee-data/
cd /usr/share/ieee-data/ || { echo "could not enter /usr/share/ieee-data directory"; exit 1; }
sudo mkdir -p 2_backup
sudo cp -- *.txt 2_backup
sudo cp -- *.csv 2_backup
echo ""
echo Download Start
echo ""
sudo curl "$1" -LO https://standards-oui.ieee.org/oui28/mam.csv \
-LO https://standards-oui.ieee.org/oui28/mam.csv \
-LO https://standards-oui.ieee.org/oui28/mam.txt \
-LO https://standards-oui.ieee.org/oui36/oui36.csv \
-LO https://standards-oui.ieee.org/oui36/oui36.txt \
-LO https://standards-oui.ieee.org/oui/oui.csv \
-LO https://standards-oui.ieee.org/oui/oui.txt
echo ""
echo Download Finished
DL_DIR=/usr/share/arp-scan
# ----------------------------------------------------------------------
echo ""
echo Updating... /usr/share/arp-scan/
cd /usr/share/arp-scan || { echo "could not enter /usr/share/arp-scan directory"; exit 1; }
echo Updating... $DL_DIR
cd $DL_DIR || { echo "could not enter $DL_DIR directory"; exit 1; }
sudo mkdir -p 2_backup
sudo cp -- *.txt 2_backup
# Define the URL of the IEEE OUI file
IEEE_OUI_URL="http://standards-oui.ieee.org/oui/oui.txt"
# Update from /usb/lib/ieee-data
sudo get-iab -v
sudo get-oui -v
# Download the file using wget
wget "$IEEE_OUI_URL" -O ieee-oui_dl.txt
# make files readable
sudo chmod +r /usr/share/arp-scan/ieee-oui.txt
# Filter lines containing "(base 16)" and remove the "(base 16)" string
grep "(base 16)" ieee-oui_dl.txt | sed 's/ *(base 16)//' > ieee-oui_new.txt
# Update from ieee website
# sudo get-iab -v -u http://standards-oui.ieee.org/iab/iab.txt
# sudo get-oui -v -u http://standards-oui.ieee.org/oui/oui.txt
# Combine ieee-oui_new.txt and ieee-oui.txt, and extract unique MAC start values along with vendor names
# Update from ieee website develop
# sudo get-iab -v -u http://standards.ieee.org/develop/regauth/iab/iab.txt
# sudo get-oui -v -u http://standards.ieee.org/develop/regauth/oui/oui.txt
cat ieee-oui.txt ieee-oui_new.txt >> ieee-oui_all.txt
sort ieee-oui_all.txt > ieee-oui_all_sort.txt
awk '{$1=$1; print}' ieee-oui_all_sort.txt | sort -u > ieee-oui_all_filtered.txt
# Update from Sanitized oui (linuxnet.ca)
# sudo get-oui -v -u https://linuxnet.ca/ieee/oui.txt

View File

@@ -12,11 +12,9 @@ services:
# restart: unless-stopped
volumes:
# - ${APP_DATA_LOCATION}/netalertx_dev/config:/app/config
# - ${APP_DATA_LOCATION}/netalertx/config:/app/config
- ${APP_DATA_LOCATION}/netalertx/config:/home/pi/pialert/config
- ${APP_DATA_LOCATION}/netalertx/config:/app/config
# - ${APP_DATA_LOCATION}/netalertx_dev/db:/app/db
# - ${APP_DATA_LOCATION}/netalertx/db:/app/db
- ${APP_DATA_LOCATION}/netalertx/db:/home/pi/pialert/db
- ${APP_DATA_LOCATION}/netalertx/db:/app/db
# (optional) useful for debugging if you have issues setting up the container
# - ${LOGS_LOCATION}:/app/front/log
# ---------------------------------------------------------------------------
@@ -28,13 +26,14 @@ services:
- ${APP_DATA_LOCATION}/pihole/etc-pihole/pihole-FTL.db:/etc/pihole/pihole-FTL.db
- ${DEV_LOCATION}/server:/app/server
- ${DEV_LOCATION}/dockerfiles:/app/dockerfiles
- ${APP_DATA_LOCATION}/netalertx/php.ini:/etc/php/8.2/fpm/php.ini
# - ${APP_DATA_LOCATION}/netalertx/php.ini:/etc/php/8.2/fpm/php.ini
- ${DEV_LOCATION}/install:/app/install
- ${DEV_LOCATION}/front/css:/app/front/css
- ${DEV_LOCATION}/front/img:/app/front/img
- ${DEV_LOCATION}/back/update_vendors.sh:/app/back/update_vendors.sh
- ${DEV_LOCATION}/front/lib/AdminLTE:/app/front/lib/AdminLTE
- ${DEV_LOCATION}/front/lib:/app/front/lib
- ${DEV_LOCATION}/front/js:/app/front/js
- ${DEV_LOCATION}/front/report_templates:/front/report_templates
- ${DEV_LOCATION}/install/start.debian.sh:/app/install/start.debian.sh
- ${DEV_LOCATION}/install/user-mapping.debian.sh:/app/install/user-mapping.debian.sh
- ${DEV_LOCATION}/install/install.debian.sh:/app/install/install.debian.sh
@@ -42,6 +41,7 @@ services:
- ${DEV_LOCATION}/front/api:/app/front/api
- ${DEV_LOCATION}/front/php:/app/front/php
- ${DEV_LOCATION}/front/deviceDetails.php:/app/front/deviceDetails.php
- ${DEV_LOCATION}/front/userNotifications.php:/app/front/userNotifications.php
- ${DEV_LOCATION}/front/deviceDetailsTools.php:/app/front/deviceDetailsTools.php
- ${DEV_LOCATION}/front/devices.php:/app/front/devices.php
- ${DEV_LOCATION}/front/events.php:/app/front/events.php

View File

@@ -9,11 +9,8 @@
| 🐳 [Docker hub](https://registry.hub.docker.com/r/jokobsk/netalertx) | 📑 [Docker guide](https://github.com/jokob-sk/NetAlertX/blob/main/dockerfiles/README.md) |🆕 [Release notes](https://github.com/jokob-sk/NetAlertX/releases) | 📚 [All Docs](https://github.com/jokob-sk/NetAlertX/tree/main/docs) |
|----------------------|----------------------| ----------------------| ----------------------|
<a href="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/devices_split.png" target="_blank">
<img src="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/devices_split.png" width="300px" />
</a>
<a href="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/network.png" target="_blank">
<img src="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/network.png" width="300px" />
<a href="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/GENERAL/github_social_image.jpg" target="_blank">
<img src="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/GENERAL/github_social_image.jpg" width="1000px" />
</a>
> [!NOTE]
@@ -21,7 +18,8 @@
## 📕 Basic Usage
- You will have to run the container on the `host` network, e.g:
> [!WARNING]
> You will have to run the container on the `host` network.
```yaml
docker run -d --rm --network=host \
@@ -66,26 +64,16 @@ docker run -d --rm --network=host \
- You can modify [app.conf](https://github.com/jokob-sk/NetAlertX/tree/main/config) directly, if needed.
- If unavailable, the app generates a default `app.conf` and `app.db` file on the first run.
#### Important settings
### Important settings
These are the most important settings to get at least some output in your Devices screen. Usually, only one approach is used, but you should be able to combine these approaches.
These are the most important settings to get at least some output in your Devices screen. Usually, only one approach is used, but you can combine these approaches.
##### For arp-scan: ARPSCAN_RUN, SCAN_SUBNETS
| Scan method | Setting | Description |
| :------------- | :------------- | :-------------|
| arp-scan, nmap-scan | `SCAN_SUBNETS` | See the documentation on how [to setup SUBNETS, VLANs & limitations](https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md) |
| PiHole | `PIHOLE_RUN` | There are 2 approaches how to get PiHole devices imported. Via the PiHole import (`PIHOLE`) plugin or DHCP leases (`DHCPLSS`) plugin. The `PIHOLE` plugin requires you to map the PiHole database, as mentioned above. |
| dhcp.leases | `DHCPLSS_RUN` | You need to map `:/etc/myfiles/dhcp.leases` in the `docker-compose.yml` file if you enable this setting. This path has to be matched with a corresponding `DHCPLSS_paths_to_check` setting entry (check the [DHCPLSS plugin readme](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dhcp_leases#overview) for details). |
- ❗ To use the arp-scan method, you need to set the `SCAN_SUBNETS` variable. See the documentation on how [to setup SUBNETS, VLANs & limitations](https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md)
##### For pihole: PIHOLE_RUN, DHCPLSS_RUN
There are 2 approaches how to get PiHole devices imported. Via the PiHole import (PIHOLE) plugin or DHCP leases (DHCPLSS) plugin.
**PiHole (Device sync)**
* `PIHOLE_RUN`: You need to map `:/etc/pihole/pihole-FTL.db` in the `docker-compose.yml` file if you enable this setting.
**DHCP Leases (Device import)**
* `DHCPLSS_RUN`: You need to map `:/etc/pihole/dhcp.leases` in the `docker-compose.yml` file if you enable this setting.
* The above setting has to be matched with a corresponding `DHCPLSS_paths_to_check` setting entry (the path in the container must contain `pihole` as PiHole uses a different format of the `dhcp.leases` file).
> [!NOTE]
> It's recommended to use the same schedule interval for all plugins responsible for discovering new devices.

View File

@@ -5,12 +5,12 @@ export APP_NAME=netalertx
# php-fpm setup
install -d -o nginx -g www-data /run/php/
sed -i "/^;pid/c\pid = /run/php/php8.2-fpm.pid" /etc/php82/php-fpm.conf
sed -i "/^listen/c\listen = /run/php/php8.2-fpm.sock" /etc/php82/php-fpm.d/www.conf
sed -i "/^;listen.owner/c\listen.owner = nginx" /etc/php82/php-fpm.d/www.conf
sed -i "/^;listen.group/c\listen.group = www-data" /etc/php82/php-fpm.d/www.conf
sed -i "/^user/c\user = nginx" /etc/php82/php-fpm.d/www.conf
sed -i "/^group/c\group = www-data" /etc/php82/php-fpm.d/www.conf
sed -i "/^;pid/c\pid = /run/php/php8.3-fpm.pid" /etc/php83/php-fpm.conf
sed -i "/^listen/c\listen = /run/php/php8.3-fpm.sock" /etc/php83/php-fpm.d/www.conf
sed -i "/^;listen.owner/c\listen.owner = nginx" /etc/php83/php-fpm.d/www.conf
sed -i "/^;listen.group/c\listen.group = www-data" /etc/php83/php-fpm.d/www.conf
sed -i "/^user/c\user = nginx" /etc/php83/php-fpm.d/www.conf
sed -i "/^group/c\group = www-data" /etc/php83/php-fpm.d/www.conf
# s6 overlay setup
mkdir -p /etc/s6-overlay/s6-rc.d/{SetupOneshot,php-fpm/dependencies.d,nginx/dependencies.d}
@@ -20,17 +20,17 @@ echo "longrun" > /etc/s6-overlay/s6-rc.d/php-fpm/type
echo "longrun" > /etc/s6-overlay/s6-rc.d/nginx/type
echo "longrun" > /etc/s6-overlay/s6-rc.d/$APP_NAME/type
echo -e "${INSTALL_DIR}/dockerfiles/setup.sh" > /etc/s6-overlay/s6-rc.d/SetupOneshot/up
echo -e "#!/bin/execlineb -P\n/usr/sbin/php-fpm82 -F" > /etc/s6-overlay/s6-rc.d/php-fpm/run
echo -e "#!/bin/execlineb -P\n/usr/sbin/php-fpm83 -F" > /etc/s6-overlay/s6-rc.d/php-fpm/run
echo -e '#!/bin/execlineb -P\nnginx -g "daemon off;"' > /etc/s6-overlay/s6-rc.d/nginx/run
echo -e '#!/bin/execlineb -P
with-contenv
importas -u PORT PORT
if { echo
if { echo
"
[INSTALL] 🚀 Starting app (:${PORT})
" }' > /etc/s6-overlay/s6-rc.d/$APP_NAME/run
echo -e "python ${INSTALL_DIR}/server" >> /etc/s6-overlay/s6-rc.d/$APP_NAME/run
touch /etc/s6-overlay/s6-rc.d/user/contents.d/{SetupOneshot,php-fpm,nginx} /etc/s6-overlay/s6-rc.d/{php-fpm,nginx}/dependencies.d/SetupOneshot

View File

@@ -8,7 +8,7 @@ export INSTALL_DIR=/app # Specify the installation directory here
# DO NOT CHANGE ANYTHING BELOW THIS LINE!
CONF_FILE="app.conf"
CONF_FILE="app.conf"
NGINX_CONF_FILE=netalertx.conf
DB_FILE="app.db"
FULL_FILEDB_PATH="${INSTALL_DIR}/db/${DB_FILE}"
@@ -28,14 +28,14 @@ fi
echo "[INSTALL] Copy starter ${DB_FILE} and ${CONF_FILE} if they don't exist"
# DANGER ZONE: ALWAYS_FRESH_INSTALL
# DANGER ZONE: ALWAYS_FRESH_INSTALL
if [ "$ALWAYS_FRESH_INSTALL" = true ]; then
echo "[INSTALL] ❗ ALERT /db and /config folders are cleared because the ALWAYS_FRESH_INSTALL is set to: $ALWAYS_FRESH_INSTALL"
# Delete content of "$INSTALL_DIR/config/"
rm -rf "$INSTALL_DIR/config/"*
rm -rf "$INSTALL_DIR_OLD/config/"*
# Delete content of "$INSTALL_DIR/db/"
rm -rf "$INSTALL_DIR/db/"*
rm -rf "$INSTALL_DIR_OLD/db/"*
@@ -61,11 +61,11 @@ cp -na "${INSTALL_DIR}/back/${DB_FILE}" "${FULL_FILEDB_PATH}"
# if custom variables not set we do not need to do anything
if [ -n "${TZ}" ]; then
FILECONF="${INSTALL_DIR}/config/${CONF_FILE}"
echo "[INSTALL] Setup timezone"
echo "[INSTALL] Setup timezone"
sed -i "\#^TIMEZONE=#c\TIMEZONE='${TZ}'" "${FILECONF}"
# set TimeZone in container
cp /usr/share/zoneinfo/$TZ /etc/localtime
cp /usr/share/zoneinfo/$TZ /etc/localtime
echo $TZ > /etc/timezone
fi
@@ -92,10 +92,13 @@ fi
# Create an empty log files
# Create the execution_queue.log and app_front.log files if they don't exist
touch "${INSTALL_DIR}"/front/log/{app.log,execution_queue.log,app_front.log,app.php_errors.log,stderr.log,stdout.log}
touch "${INSTALL_DIR}"/front/log/{app.log,execution_queue.log,app_front.log,app.php_errors.log,stderr.log,stdout.log,db_is_locked.log}
touch "${INSTALL_DIR}"/front/api/user_notifications.json
echo "[INSTALL] Fixing permissions after copied starter config & DB"
chown -R nginx:www-data "${INSTALL_DIR}"/{config,front/log,db}
chown -R nginx:www-data "${INSTALL_DIR}"/{config,front/log,db,front/api}
chown -R nginx:www-data "${INSTALL_DIR}"/front/api/user_notifications.json
chmod 750 "${INSTALL_DIR}"/{config,front/log,db}
find "${INSTALL_DIR}"/{config,front/log,db} -type f -exec chmod 640 {} \;
@@ -107,9 +110,9 @@ if [ ! -f "${INSTALL_DIR}/front/buildtimestamp.txt" ]; then
fi
echo -e "
[ENV] PATH is ${PATH}
[ENV] PORT is ${PORT}
[ENV] TZ is ${TZ}
[ENV] LISTEN_ADDR is ${LISTEN_ADDR}
[ENV] ALWAYS_FRESH_INSTALL is ${ALWAYS_FRESH_INSTALL}
[ENV] PATH is ${PATH}
[ENV] PORT is ${PORT}
[ENV] TZ is ${TZ}
[ENV] LISTEN_ADDR is ${LISTEN_ADDR}
[ENV] ALWAYS_FRESH_INSTALL is ${ALWAYS_FRESH_INSTALL}
"

33
docs/FILE_PERMISSIONS.md Executable file
View File

@@ -0,0 +1,33 @@
# Managing File Permissions for NetAlertX on Nginx with Docker
NetAlertX runs on an Nginx web server. On Alpine Linux, Nginx operates as the `nginx` user (user ID 101, group ID 82 - `www-data`). Consequently, files accessed or written by the NetAlertX application are owned by `nginx:www-data`.
Upon starting, NetAlertX changes the ownership of files on the host system mapped to `/app/config` and `/app/db` in the container to `nginx:www-data`. This ensures that Nginx can access and write to these files. Since the user in the Docker container is mapped to a user on the host system by ID:GID, the files in `/app/config` and `/app/db` on the host system are owned by a user with the same ID and GID (ID 101 and GID 82). On different systems, this ID:GID may belong to different users (on Debian, the user with ID 82 is `uuidd`), or there may not be a user with ID 82 at all.
While this generally isn't problematic, it can cause issues for host system users needing to access these files (e.g., backup scripts). If users other than root need access to these files, it is recommended to add those users to the group with GID 82. If that group doesn't exist, it should be created.
### Permissions Table for Individual Folders
| Folder | User | User ID | Group | Group ID | Permissions | Notes |
|----------------|--------|---------|-----------|----------|-------------|---------------------------------------------------------------------|
| `/app/config` | nginx | 101 | www-data | 82 | rwxr-xr-x | Ensure `nginx` can read/write; other users can read if in `www-data` |
| `/app/db` | nginx | 101 | www-data | 82 | rwxr-xr-x | Same as above |
### Steps to Add Users to Group
1. **Check if group exists:**
```sh
getent group www-data
```
2. **Create group if it does not exist:**
```sh
sudo groupadd -g 82 www-data
```
3. **Add user to group:**
```sh
sudo usermod -aG www-data <username>
```
Replace `<username>` with the actual username that requires access.

View File

@@ -1,9 +1,27 @@
# Migration form PiAlert to NetAlertX
> [!TIP]
> In short: The application will auto-migrate the database, config, and all device information. A ticker message on top will be displayed until you update your docker mount points. Even so, it's always good to have a [backup strategy](https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md) in place.
> [!WARNING]
> Follow this guide only after you you downloaded and started NetAlert X at least once after previously using the PiAlert image.
The migration should be pretty straightforward. The application installation folder in the docker container has changed from `/home/pi/pialert` to `/app`. That means the new mount points are:
## STEPS:
> [!TIP]
> In short: The application will auto-migrate the database, config, and all device information. A ticker message on top will be displayed until you update your docker mount points. It's always good to have a [backup strategy](https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md) in place.
1. Backup your current config and database (optional `devices.csv` to have a backup) (See bellow tip if facing issues)
2. Stop the container
2. Update the Docker file mount locations in your `docker-compose.yml` or docker run command (See bellow **New Docker mount locations**).
3. Rename the DB and conf files to `app.db` and `app.conf` and place them in the appropriate location.
4. Start the Container
> [!TIP]
> If you have troubles accessing past backups, config or database files you can copy them into the newly mapped directories, for example by running this command in the container: `cp -r /app/config /home/pi/pialert/config/old_backup_files`. This should create a folder in the `config` directory called `old_backup_files` conatining all the files in that location. Another approach is to map the old location and the new one at the same time to copy things over.
### New Docker mount locations
The application installation folder in the docker container has changed from `/home/pi/pialert` to `/app`. That means the new mount points are:
| Old mount point | New mount point |
|----------------------|---------------|
@@ -22,8 +40,10 @@ The migration should be pretty straightforward. The application installation fol
> [!NOTE]
> The application uses symlinks linking the old db and config locations to the new ones, so data loss should not occur. [Backup strategies](https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md) are still recommended to backup your setup.
In summary, docker file mount locations in your `docker-compose.yml` or docker run command have changed. Examples follow.
# Examples
Exmaples of docker files with the new mount points.
## Example 1: Mapping folders

53
docs/NOTIFICATIONS.md Executable file
View File

@@ -0,0 +1,53 @@
# Notifications 📧
There are 4 ways how to influence notifications:
1. On the device itself
2. On the settings of the plugin
3. Globally
4. Ignoring devices
> [!NOTE]
> It's recommended to use the same schedule interval for all plugins responsible for scanning devices, otherwise false positives might be reported if different devices are discovered by different plugins. Check the **Settings** > **Enabled settings** section for a warning:
> ![Schedules out-of-sync](/docs/img/NOTIFICATIONS/Schedules_out-of-sync.png)
## Device settings 💻
![Device notification settings](/docs/img/NOTIFICATIONS/Device-notification-settings.png)
There are 4 settings on the device for influencing notifications. You can:
1. Completely disable the scanning of the device
2. **Alert all events**, connections, disconnections, IP changes (noisy, usually not recommended)
3. **Alert down** - alerts when a device goes down. This setting overrides disabled Alert All Events, so you will get a notification of a device going down even if you don't have Alert All Events ticked.
4. **Skip repeated notifications**, if for example you know there is a temporary issue and want to pause the same notification for this device for a given time.
## Plugin settings 🔌
![Plugin notification settings](/docs/img/NOTIFICATIONS/Plugin-notification-settings.png)
On almost all plugins there are 2 core settings, `<plugin>_WATCH` and `<plugin>_REPORT_ON`.
1. `<plugin>_WATCH` specifies the columns which the app should watch. If watched columns change the device state is considered changed. This changed status is then used to decide to send out notifications based on the `<plugin>_REPORT_ON` setting.
2. `<plugin>_REPORT_ON` let's you specify on which events the app should notify you. This is related to the `<plugin>_WATCH` setting. So if you select `watched-changed` and in `<plugin>_WATCH` you only select `Watched_Value1`, then a notification is triggered if `Watched_Value1` is changed from the previous value, but no notification is send if `Watched_Value2` changes.
## Global settings ⚙
![Global notification settings](/docs/img/NOTIFICATIONS/Global-notification-settings.png)
In the Notification Processing section, you can specify blanket rules. These allow you to specify exceptions to the Plugin and Device settings and will override those.
1. Notify on (`NTFPRCS_INCLUDED_SECTIONS`) allows you to specify which events trigger notifications. Usual setups will have `new_devices`, `down_devices`, and possibly `events` set. Setting `plugin` might be too noisy for most setups.
2. Alert down after (`NTFPRCS_alert_down_time`) is useful if you want to wait for some time before the system sends out a down notification for a device. This is related to the on-device **Alert down** setting and only devices with this checked will trigger a down notification.
3. A filter to allow you to set device-specific exceptions to New devices being added to the app.
4. A filter to allow you to set device-specific exceptions to generated Events.
## Ignoring devices 🔕
![Ignoring new devices](/docs/img/NOTIFICATIONS/NEWDEV_ignores.png)
You can completely ignore detected devices globally. This could be because your instance detects docker containers, you want to ignore devices from a specific manufacturer via MAC rules or you want to ignore devices on a specific IP range.
1. Ignored MACs (`NEWDEV_ignored_MACs`) - List of MACs to ignore.
2. Ignored IPs (`NEWDEV_ignored_MACs`) - List of IPs to ignore.

729
docs/PLUGINS_DEV.md Executable file
View File

@@ -0,0 +1,729 @@
## 🌟 Create a custom plugin: Overview
| ![Screen 1][screen1] | ![Screen 2][screen2] | ![Screen 3][screen3] |
|----------------------|----------------------| ----------------------|
| ![Screen 4][screen4] | ![Screen 5][screen5] |
NetAlertX comes with a plugin system to feed events from third-party scripts into the UI and then send notifications, if desired. The highlighted core functionality this plugin system supports, is:
* dynamic creation of a simple UI to interact with the discovered objects,
* filtering of displayed values in the Devices UI
* surface settings of plugins in the UI,
* different column types for reported values to e.g. link back to a device
* import objects into existing NetAlertX database tables
> (Currently, update/overwriting of existing objects is not supported.)
Example use cases for plugins could be:
* Monitor a web service and alert me if it's down
* Import devices from dhcp.leases files instead/complementary to using PiHole or arp-scans
* Creating ad-hoc UI tables from existing data in the NetAlertX database, e.g. to show all open ports on devices, to list devices that disconnected in the last hour, etc.
* Using other device discovery methods on the network and importing the data as new devices
* Creating a script to create FAKE devices based on user input via custom settings
* ...at this point the limitation is mostly the creativity rather than the capability (there might be edge cases and a need to support more form controls for user input off custom settings, but you probably get the idea)
If you wish to develop a plugin, please check the existing plugin structure. Once the settings are saved by the user they need to be removed from the `app.conf` file manually if you want to re-initialize them from the `config.json` of the plugin.
Again, please read the below carefully if you'd like to contribute with a plugin yourself. This documentation file might be outdated, so double-check the sample plugins as well.
## ⚠ Disclaimer
Follow the below very carefully and check example plugin(s) if you'd like to write one yourself. Plugin UI is not my priority right now, happy to approve PRs if you are interested in extending/improving the UI experience (See [Frontend guidelines](/docs/FRONTEND_DEVELOPMENT.md)). Example improvements for the taking:
* Making the tables sortable/filterable
* Using the same approach to display table data as in the Devices section (solves above)
* Adding form controls supported to display the data (Currently supported ones are listed in the section "UI settings in database_column_definitions" below)
* ...
## ❗ Known limitations:
These issues will be hopefully fixed with time, so please don't report them. Instead, if you know how, feel free to investigate and submit a PR to fix the below. Keep the PRs small as it's easier to approve them:
* Existing plugin objects are sometimes not interpreted correctly and a new object is created instead, resulting in duplicate entries. (race condition?)
* Occasional (experienced twice) hanging of processing plugin script file.
* UI displays outdated values until the API endpoints get refreshed.
## Plugin file structure overview
> Folder name must be the same as the code name value in: `"code_name": "<value>"`
> Unique prefix needs to be unique compared to the other settings prefixes, e.g.: the prefix `APPRISE` is already in use.
| File | Required (plugin type) | Description |
|----------------------|----------------------|----------------------|
| `config.json` | yes | Contains the plugin configuration (manifest) including the settings available to the user. |
| `script.py` | no | The Python script itself. You may call any valid linux command. |
| `last_result.log` | no | The file used to interface between NetAlertX and the plugin. Required for a script plugin if you want to feed data into the app. |
| `script.log` | no | Logging output (recommended) |
| `README.md` | yes | Any setup considerations or overview |
More on specifics below.
### Column order and values
> [!IMPORTANT]
> Spend some time reading and trying to understand the below table. This is the interface between the Plugins and the core application.
| Order | Represented Column | Value Required | Description |
|----------------------|----------------------|----------------------|----------------------|
| 0 | `Object_PrimaryID` | yes | The primary ID used to group Events under. |
| 1 | `Object_SecondaryID` | no | Optional secondary ID to create a relationship beween other entities, such as a MAC address |
| 2 | `DateTime` | yes | When the event occured in the format `2023-01-02 15:56:30` |
| 3 | `Watched_Value1` | yes | A value that is watched and users can receive notifications if it changed compared to the previously saved entry. For example IP address |
| 4 | `Watched_Value2` | no | As above |
| 5 | `Watched_Value3` | no | As above |
| 6 | `Watched_Value4` | no | As above |
| 7 | `Extra` | no | Any other data you want to pass and display in NetAlertX and the notifications |
| 8 | `ForeignKey` | no | A foreign key that can be used to link to the parent object (usually a MAC address) |
> [!NOTE]
> De-duplication is run once an hour on the `Plugins_Objects` database table and duplicate entries with the same value in columns `Object_PrimaryID`, `Object_SecondaryID`, `Plugin` (auto-filled based on `unique_prefix` of the plugin), `UserData` (can be populated with the `"type": "textbox_save"` column type) are removed.
# config.json structure
The `config.json` file is the manifest of the plugin. It contains mainly settings definitions and the mapping of Plugin objects to NetAlertX objects.
## Supported data sources
Currently, these data sources are supported (valid `data_source` value).
| Name | `data_source` value | Needs to return a "table"* | Overview (more details on this page below) |
|----------------------|----------------------|----------------------|----------------------|
| Script | `script` | no | Executes any linux command in the `CMD` setting. |
| NetAlertX DB query | `app-db-query` | yes | Executes a SQL query on the NetAlertX database in the `CMD` setting. |
| Template | `template` | no | Used to generate internal settings, such as default values. |
| External SQLite DB query | `sqlite-db-query` | yes | Executes a SQL query from the `CMD` setting on an external SQLite database mapped in the `DB_PATH` setting. |
| Plugin type | `plugin_type` | no | Specifies the type of the plugin and in which section the Plugin settings are displayed ( one of `general/system/scanner/other/publisher` ). |
> * "Needs to return a "table" means that the application expects a `last_result.log` file with some results. It's not a blocker, however warnings in the `app.log` might be logged.
> 🔎Example
>```json
>"data_source": "app-db-query"
>```
If you want to display plugin objects or import devices into the app, data sources have to return a "table" of the exact structure as outlined above.
You can show or hide the UI on the "Plugins" page and "Plugins" tab for a plugin on devices via the `show_ui` property:
> 🔎Example
>```json
> "show_ui": true,
> ```
### "data_source": "script"
If the `data_source` is set to `script` the `CMD` setting (that you specify in the `settings` array section in the `config.json`) contains an executable Linux command, that usually generates a `last_result.log` file (not required if you don't import any data into the app). The `last_result.log` file needs to be saved in the same folder as the plugin.
> [!IMPORTANT]
> A lot of the work is taken care of by the [`plugin_helper.py` library](/front/plugins/plugin_helper.py). You don't need to manage the `last_result.log` file if using the helper objects. Check other `script.py` of other plugins for details (The [Undicoverables plugins `script.py` file](/front/plugins/undiscoverables/script.py) is a good example).
The content of the `last_result.log` file needs to contain the columns as defined in the "Column order and values" section above. The order of columns can't be changed. After every scan it should contain only the results from the latest scan/execution.
- The format of the `last_result.log` is a `csv`-like file with the pipe `|` as a separator.
- 9 (nine) values need to be supplied, so every line needs to contain 8 pipe separators. Empty values are represented by `null`.
- Don't render "headers" for these "columns".
Every scan result/event entry needs to be on a new line.
- You can find which "columns" need to be present, and if the value is required or optional, in the "Column order and values" section.
- The order of these "columns" can't be changed.
#### 🔎 last_result.log examples
Valid CSV:
```csv
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|null|null|null|null
https://www.duckduckgo.com|192.168.0.1|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|ff:ee:ff:11:ff:11
```
Invalid CSV with different errors on each line:
```csv
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898||null|null|null
https://www.duckduckgo.com|null|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|
|https://www.duckduckgo.com|null|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|null
null|192.168.1.1|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine
https://www.duckduckgo.com|192.168.1.1|2023-01-02 15:56:30|null|0.9898|null|null|Best search engine
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|||
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|
```
### "data_source": "app-db-query"
If the `data_source` is set to `app-db-query`, the `CMD` setting needs to contain a SQL query rendering the columns as defined in the "Column order and values" section above. The order of columns is important.
This SQL query is executed on the `app.db` SQLite database file.
> 🔎Example
>
> SQL query example:
>
> ```SQL
> SELECT dv.dev_Name as Object_PrimaryID,
> cast(dv.dev_LastIP as VARCHAR(100)) || ':' || cast( SUBSTR(ns.Port ,0, INSTR(ns.Port , '/')) as VARCHAR(100)) as Object_SecondaryID,
> datetime() as DateTime,
> ns.Service as Watched_Value1,
> ns.State as Watched_Value2,
> 'null' as Watched_Value3,
> 'null' as Watched_Value4,
> ns.Extra as Extra,
> dv.dev_MAC as ForeignKey
> FROM
> (SELECT * FROM Nmap_Scan) ns
> LEFT JOIN
> (SELECT dev_Name, dev_MAC, dev_LastIP FROM Devices) dv
> ON ns.MAC = dv.dev_MAC
> ```
>
> Required `CMD` setting example with above query (you can set `"type": "label"` if you want it to make uneditable in the UI):
>
> ```json
> {
> "function": "CMD",
> "type": "text",
> "default_value":"SELECT dv.dev_Name as Object_PrimaryID, cast(dv.dev_LastIP as VARCHAR(100)) || ':' || cast( SUBSTR(ns.Port ,0, INSTR(ns.Port , '/')) as VARCHAR(100)) as Object_SecondaryID, datetime() as DateTime, ns.Service as Watched_Value1, ns.State as Watched_Value2, 'null' as Watched_Value3, 'null' as Watched_Value4, ns.Extra as Extra FROM (SELECT * FROM Nmap_Scan) ns LEFT JOIN (SELECT dev_Name, dev_MAC, dev_LastIP FROM Devices) dv ON ns.MAC = dv.dev_MAC",
> "options": [],
> "localized": ["name", "description"],
> "name" : [{
> "language_code":"en_us",
> "string" : "SQL to run"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "This SQL query is used to populate the coresponding UI tables under the Plugins section."
> }]
> }
> ```
### "data_source": "template"
In most cases, it is used to initialize settings. Check the `newdev_template` plugin for details.
### "data_source": "sqlite-db-query"
You can execute a SQL query on an external database connected to the current NetAlertX database via a temporary `EXTERNAL_<unique prefix>.` prefix.
For example for `PIHOLE` (`"unique_prefix": "PIHOLE"`) it is `EXTERNAL_PIHOLE.`. The external SQLite database file has to be mapped in the container to the path specified in the `DB_PATH` setting:
> 🔎Example
>
>```json
> ...
>{
> "function": "DB_PATH",
> "type": "readonly",
> "default_value":"/etc/pihole/pihole-FTL.db",
> "options": [],
> "localized": ["name", "description"],
> "name" : [{
> "language_code":"en_us",
> "string" : "DB Path"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "Required setting for the <code>sqlite-db-query</code> plugin type. Is used to mount an external SQLite database and execute the SQL query stored in the <code>CMD</code> setting."
> }]
> }
> ...
>```
The actual SQL query you want to execute is then stored as a `CMD` setting, similar to a Plugin of the `app-db-query` plugin type. The format has to adhere to the format outlined in the "Column order and values" section above.
> 🔎Example
>
> Notice the `EXTERNAL_PIHOLE.` prefix.
>
>```json
>{
> "function": "CMD",
> "type": "text",
> "default_value":"SELECT hwaddr as Object_PrimaryID, cast('http://' || (SELECT ip FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1) as VARCHAR(100)) || ':' || cast( SUBSTR((SELECT name FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1), 0, INSTR((SELECT name FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1), '/')) as VARCHAR(100)) as Object_SecondaryID, datetime() as DateTime, macVendor as Watched_Value1, lastQuery as Watched_Value2, (SELECT name FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1) as Watched_Value3, 'null' as Watched_Value4, '' as Extra, hwaddr as ForeignKey FROM EXTERNAL_PIHOLE.network WHERE hwaddr NOT LIKE 'ip-%' AND hwaddr <> '00:00:00:00:00:00'; ",
> "options": [],
> "localized": ["name", "description"],
> "name" : [{
> "language_code":"en_us",
> "string" : "SQL to run"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "This SQL query is used to populate the coresponding UI tables under the Plugins section. This particular one selects data from a mapped PiHole SQLite database and maps it to the corresponding Plugin columns."
> }]
> }
> ```
## 🕳 Filters
Plugin entries can be filtered in the UI based on values entered into filter fields. The `txtMacFilter` textbox/field contains the Mac address of the currently viewed device, or simply a Mac address that's available in the `mac` query string (`<url>?mac=aa:22:aa:22:aa:22:aa`).
| Property | Required | Description |
|----------------------|----------------------|----------------------|
| `compare_column` | yes | Plugin column name that's value is used for comparison (**Left** side of the equation) |
| `compare_operator` | yes | JavaScript comparison operator |
| `compare_field_id` | yes | The `id` of a input text field containing a value is used for comparison (**Right** side of the equation)|
| `compare_js_template` | yes | JavaScript code used to convert left and right side of the equation. `{value}` is replaced with input values. |
| `compare_use_quotes` | yes | If `true` then the end result of the `compare_js_template` i swrapped in `"` quotes. Use to compare strings. |
Filters are only applied if a filter is specified, and the `txtMacFilter` is not `undefined`, or empty (`--`).
> 🔎Example:
>
> ```json
> "data_filters": [
> {
> "compare_column" : "Object_PrimaryID",
> "compare_operator" : "==",
> "compare_field_id": "txtMacFilter",
> "compare_js_template": "'{value}'.toString()",
> "compare_use_quotes": true
> }
> ],
> ```
>
>1. On the `pluginsCore.php` page is an input field with the id `txtMacFilter`:
>
>```html
><input class="form-control" id="txtMacFilter" type="text" value="--">
>```
>
>2. This input field is initialized via the `&mac=` query string.
>
>3. The app then proceeds to use this Mac value from this field and compares it to the value of the `Object_PrimaryID` database field. The `compare_operator` is `==`.
>
>4. Both values, from the database field `Object_PrimaryID` and from the `txtMacFilter` are wrapped and evaluated with the `compare_js_template`, that is `'{value}.toString()'`.
>
>5. `compare_use_quotes` is set to `true` so `'{value}'.toString()` is wrappe dinto `"` quotes.
>
>6. This results in for example this code:
>
>```javascript
> // left part of the expression coming from compare_column and right from the input field
> // notice the added quotes ()") around the left and right part of teh expression
> "eval('ac:82:ac:82:ac:82".toString()')" == "eval('ac:82:ac:82:ac:82".toString()')"
>```
>
### 🗺 Mapping the plugin results into a database table
Plugin results are always inserted into the standard `Plugin_Objects` database table. Optionally, NetAlertX can take the results of the plugin execution, and insert these results into an additional database table. This is enabled by with the property `"mapped_to_table"` in the `config.json` file. The mapping of the columns is defined in the `database_column_definitions` array.
> [!NOTE]
> If results are mapped to the `CurrentScan` table, the data is then included into the regular scan loop, so for example notification for devices are sent out.
>🔍 Example:
>
>For example, this approach is used to implement the `DHCPLSS` plugin. The script parses all supplied "dhcp.leases" files, gets the results in the generic table format outlined in the "Column order and values" section above, takes individual values, and inserts them into the `CurrentScan` database table in the NetAlertX database. All this is achieved by:
>
>1. Specifying the database table into which the results are inserted by defining `"mapped_to_table": "CurrentScan"` in the root of the `config.json` file as shown below:
>
>```json
>{
> "code_name": "dhcp_leases",
> "unique_prefix": "DHCPLSS",
> ...
> "data_source": "script",
> "localized": ["display_name", "description", "icon"],
> "mapped_to_table": "CurrentScan",
> ...
>}
>```
>2. Defining the target column with the `mapped_to_column` property for individual columns in the `database_column_definitions` array of the `config.json` file. For example in the `DHCPLSS` plugin, I needed to map the value of the `Object_PrimaryID` column returned by the plugin, to the `cur_MAC` column in the NetAlertX database table `CurrentScan`. Notice the `"mapped_to_column": "cur_MAC"` key-value pair in the sample below.
>
>```json
>{
> "column": "Object_PrimaryID",
> "mapped_to_column": "cur_MAC",
> "css_classes": "col-sm-2",
> "show": true,
> "type": "device_mac",
> "default_value":"",
> "options": [],
> "localized": ["name"],
> "name":[{
> "language_code":"en_us",
> "string" : "MAC address"
> }]
> }
>```
>
>3. That's it. The app takes care of the rest. It loops thru the objects discovered by the plugin, takes the results line-by-line, and inserts them into the database table specified in `"mapped_to_table"`. The columns are translated from the generic plugin columns to the target table columns via the `"mapped_to_column"` property in the column definitions.
> [!NOTE]
> You can create a column mapping with a default value via the `mapped_to_column_data` property. This means that the value of the given column will always be this value. That also menas that the `"column": "NameDoesntMatter"` is not important as there is no database source column.
>🔍 Example:
>
>```json
>{
> "column": "NameDoesntMatter",
> "mapped_to_column": "cur_ScanMethod",
> "mapped_to_column_data": {
> "value": "DHCPLSS"
> },
> "css_classes": "col-sm-2",
> "show": true,
> "type": "device_mac",
> "default_value":"",
> "options": [],
> "localized": ["name"],
> "name":[{
> "language_code":"en_us",
> "string" : "MAC address"
> }]
> }
>```
#### params
> [!IMPORTANT]
> An esier way to access settings in scripts is the `get_setting_value` method.
> ```python
> from helper import get_setting_value
>
> ...
> NTFY_TOPIC = get_setting_value('NTFY_TOPIC')
> ...
>
> ```
The `params` array in the `config.json` is used to enable the user to change the parameters of the executed script. For example, the user wants to monitor a specific URL.
> 🔎 Example:
> Passing user-defined settings to a command. Let's say, you want to have a script, that is called with a user-defined parameter called `urls`:
>
> ```bash
> root@server# python3 /app/front/plugins/website_monitor/script.py urls=https://google.com,https://duck.com
> ```
* You can allow the user to add URLs to a setting with the `function` property set to a custom name, such as `urls_to_check` (this is not a reserved name from the section "Supported settings `function` values" below).
* You specify the parameter `urls` in the `params` section of the `config.json` the following way (`WEBMON_` is the plugin prefix automatically added to all the settings):
```json
{
"params" : [
{
"name" : "urls",
"type" : "setting",
"value" : "WEBMON_urls_to_check"
}]
}
```
* Then you use this setting as an input parameter for your command in the `CMD` setting. Notice `urls={urls}` in the below json:
```json
{
"function": "CMD",
"type": "text",
"default_value":"python3 /app/front/plugins/website_monitor/script.py urls={urls}",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Command"
}],
"description": [{
"language_code":"en_us",
"string" : "Command to run"
}]
}
```
During script execution, the app will take the command `"python3 /app/front/plugins/website_monitor/script.py urls={urls}"`, take the `{urls}` wildcard and replace it with the value from the `WEBMON_urls_to_check` setting. This is because:
1. The app checks the `params` entries
2. It finds `"name" : "urls"`
3. Checks the type of the `urls` params and finds `"type" : "setting"`
4. Gets the setting name from `"value" : "WEBMON_urls_to_check"`
- IMPORTANT: in the `config.json` this setting is identified by `"function":"urls_to_check"`, not `"function":"WEBMON_urls_to_check"`
- You can also use a global setting, or a setting from a different plugin
5. The app gets the user defined value from the setting with the code name `WEBMON_urls_to_check`
- let's say the setting with the code name `WEBMON_urls_to_check` contains 2 values entered by the user:
- `WEBMON_urls_to_check=['https://google.com','https://duck.com']`
6. The app takes the value from `WEBMON_urls_to_check` and replaces the `{urls}` wildcard in the setting where `"function":"CMD"`, so you go from:
- `python3 /app/front/plugins/website_monitor/script.py urls={urls}`
- to
- `python3 /app/front/plugins/website_monitor/script.py urls=https://google.com,https://duck.com`
Below are some general additional notes, when defining `params`:
- `"name":"name_value"` - is used as a wildcard replacement in the `CMD` setting value by using curly brackets `{name_value}`. The wildcard is replaced by the result of the `"value" : "param_value"` and `"type":"type_value"` combo configuration below.
- `"type":"<sql|setting>"` - is used to specify the type of the params, currently only 2 supported (`sql`,`setting`).
- `"type":"sql"` - will execute the SQL query specified in the `value` property. The sql query needs to return only one column. The column is flattened and separated by commas (`,`), e.g: `SELECT dev_MAC from DEVICES` -> `Internet,74:ac:74:ac:74:ac,44:44:74:ac:74:ac`. This is then used to replace the wildcards in the `CMD` setting.
- `"type":"setting"` - The setting code name. A combination of the value from `unique_prefix` + `_` + `function` value, or otherwise the code name you can find in the Settings page under the Setting display name, e.g. `PIHOLE_RUN`.
- `"value": "param_value"` - Needs to contain a setting code name or SQL query without wildcards.
- `"timeoutMultiplier" : true` - used to indicate if the value should multiply the max timeout for the whole script run by the number of values in the given parameter.
- `"base64": true` - use base64 encoding to pass the value to the script (e.g. if there are spaces)
> 🔎Example:
>
> ```json
> {
> "params" : [{
> "name" : "ips",
> "type" : "sql",
> "value" : "SELECT dev_LastIP from DEVICES",
> "timeoutMultiplier" : true
> },
> {
> "name" : "macs",
> "type" : "sql",
> "value" : "SELECT dev_MAC from DEVICES"
> },
> {
> "name" : "timeout",
> "type" : "setting",
> "value" : "NMAP_RUN_TIMEOUT"
> },
> {
> "name" : "args",
> "type" : "setting",
> "value" : "NMAP_ARGS",
> "base64" : true
> }]
> }
> ```
#### ⚙ Setting object structure
> [!NOTE]
> The settings flow and when Plugin specific settings are applied is described under the [Settings system](/docs/SETTINGS_SYSTEM.md).
Required attributes are:
| Property | Description |
| -------- | ----------- |
| `"function"` | Specifies the function the setting drives or a simple unique code name. See Supported settings function values for options. |
| `"type"` | Specifies the form control used for the setting displayed in the Settings page and what values are accepted. Supported options include: |
| | - `text` |
| | - `integer` |
| | - `boolean` |
| | - `password` |
| | - `readonly` |
| | - `integer.select` |
| | - `text.select` |
| | - `text.multiselect` |
| | - `list` |
| | - `list.select` |
| | - `integer.checkbox` |
| | - `text.template` |
| `"localized"` | A list of properties on the current JSON level that need to be localized. |
| `"name"` | Displayed on the Settings page. An array of localized strings. See Localized strings below. |
| `"description"` | Displayed on the Settings page. An array of localized strings. See Localized strings below. |
| (optional) `"events"` | Specifies whether to generate an execution button next to the input field of the setting. Supported values: |
| | - `"test"` - For notification plugins testing |
| | - `"run"` - Regular plugins testing |
| (optional) `"override_value"` | Used to determine a user-defined override for the setting. Useful for template-based plugins, where you can choose to leave the current value or override it with the value defined in the setting. (Work in progress) |
| (optional) `"events"` | Used to trigger the plugin. Usually used on the `RUN` setting. Not fully tested in all scenarios. Will show a play button next to the setting. After clicking, an event is generated for the backend in the `Parameters` database table to process the front-end event on the next run. |
##### Supported settings `function` values
You can have any `"function": "my_custom_name"` custom name, however, the ones listed below have a specific functionality attached to them. If you use a custom name, then the setting is mostly used as an input parameter for the `params` section.
| Setting | Description |
| ------- | ----------- |
| `RUN` | (required) Specifies when the service is executed. |
| | Supported Options: |
| | - "disabled" - do not run |
| | - "once" - run on app start or on settings saved |
| | - "schedule" - if included, then a `RUN_SCHD` setting needs to be specified to determine the schedule |
| | - "always_after_scan" - run always after a scan is finished |
| | - "before_name_updates" - run before device names are updated (for name discovery plugins) |
| | - "on_new_device" - run when a new device is detected |
| | - "before_config_save" - run before the config is marked as saved. Useful if your plugin needs to modify the `app.conf` file. |
| `RUN_SCHD` | (required if you include "schedule" in the above `RUN` function) Cron-like scheduling is used if the `RUN` setting is set to `schedule`. |
| `CMD` | (required) Specifies the command that should be executed. |
| `API_SQL` | (not implemented) Generates a `table_` + `code_name` + `.json` file as per [API docs](https://github.com/jokob-sk/NetAlertX/blob/main/docs/API.md). |
| `RUN_TIMEOUT` | (optional) Specifies the maximum execution time of the script. If not specified, a default value of 10 seconds is used to prevent hanging. |
| `WATCH` | (optional) Specifies which database columns are watched for changes for this particular plugin. If not specified, no notifications are sent. |
| `REPORT_ON` | (optional) Specifies when to send a notification. Supported options are: |
| | - `new` means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. |
| | - `watched-changed` - means that selected `Watched_ValueN` columns changed |
| | - `watched-not-changed` - reports even on events where selected `Watched_ValueN` did not change |
| | - `missing-in-last-scan` - if the object is missing compared to previous scans |
> 🔎 Example:
>
> ```json
> {
> "function": "RUN",
> "type": "text.select",
> "default_value":"disabled",
> "options": ["disabled", "once", "schedule", "always_after_scan", "on_new_device"],
> "localized": ["name", "description"],
> "name" :[{
> "language_code":"en_us",
> "string" : "When to run"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "Enable a regular scan of your services. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) for the time specified in <a href=\"#WEBMON_RUN_TIMEOUT\"><code>WEBMON_RUN_TIMEOUT</code> setting</a>."
> }]
> }
> ```
##### 🌍Localized strings
- `"language_code":"<en_us|es_es|de_de>"` - code name of the language string. Only these three are currently supported. At least the `"language_code":"en_us"` variant has to be defined.
- `"string"` - The string to be displayed in the given language.
> 🔎 Example:
>
> ```json
>
> {
> "language_code":"en_us",
> "string" : "When to run"
> }
>
> ```
##### UI settings in database_column_definitions
The UI will adjust how columns are displayed in the UI based on the resolvers definition of the `database_column_definitions` object. These are the supported form controls and related functionality:
- Only columns with `"show": true` and also with at least an English translation will be shown in the UI.
| Supported Types | Description |
| -------------- | ----------- |
| `label` | Displays a column only. |
| `textarea_readonly` | Generates a read only text area and cleans up the text to display it somewhat formatted with new lines preserved. |
| See below for information on `threshold`, `replace`. | |
| | |
| `options` Property | Used in conjunction with types like `threshold`, `replace`, `regex`. |
| `options_params` Property | Used in conjunction with a `"options": "[{value}]"` template and `text.select`/`list.select`. Can specify SQL query (needs to return 2 columns `SELECT dev_Name as name, dev_Mac as id`) or Setting (not tested) to populate the dropdown. Check example below or have a look at the `NEWDEV` plugin `config.json` file. |
| `threshold` | The `options` array contains objects ordered from the lowest `maximum` to the highest. The corresponding `hexColor` is used for the value background color if it's less than the specified `maximum` but more than the previous one in the `options` array. |
| `replace` | The `options` array contains objects with an `equals` property, which is compared to the "value." If the values are the same, the string in `replacement` is displayed in the UI instead of the actual "value". |
| `regex` | Applies a regex to the value. The `options` array contains objects with an `type` (must be set to `regex`) and `param` (must contain the regex itself) property. |
| | |
| Type Definitions | |
| `device_mac` | The value is considered to be a MAC address, and a link pointing to the device with the given MAC address is generated. |
| `device_ip` | The value is considered to be an IP address. A link pointing to the device with the given IP is generated. The IP is checked against the last detected IP address and translated into a MAC address, which is then used for the link itself. |
| `device_name_mac` | The value is considered to be a MAC address, and a link pointing to the device with the given IP is generated. The link label is resolved as the target device name. |
| `url` | The value is considered to be a URL, so a link is generated. |
| `textbox_save` | Generates an editable and saveable text box that saves values in the database. Primarily intended for the `UserData` database column in the `Plugins_Objects` table. |
| `url_http_https` | Generates two links with the `https` and `http` prefix as lock icons. |
| `eval` | Evaluates as JavaScript. Use the variable `value` to use the given column value as input (e.g. `'<b>${value}<b>'` (replace ' with ` in your code) ) |
> [!NOTE]
> Supports chaining. You can chain multiple resolvers with `.`. For example `regex.url_http_https`. This will apply the `regex` resolver and then the `url_http_https` resolver.
```json
"function": "dev_DeviceType",
"type": "text.select",
"maxLength": 30,
"default_value": "",
"options": ["{value}"],
"options_params" : [
{
"name" : "value",
"type" : "sql",
"value" : "SELECT '' as id, '' as name UNION SELECT dev_DeviceType as id, dev_DeviceType as name FROM (SELECT dev_DeviceType FROM Devices UNION SELECT 'Smartphone' UNION SELECT 'Tablet' UNION SELECT 'Laptop' UNION SELECT 'PC' UNION SELECT 'Printer' UNION SELECT 'Server' UNION SELECT 'NAS' UNION SELECT 'Domotic' UNION SELECT 'Game Console' UNION SELECT 'SmartTV' UNION SELECT 'Clock' UNION SELECT 'House Appliance' UNION SELECT 'Phone' UNION SELECT 'AP' UNION SELECT 'Gateway' UNION SELECT 'Firewall' UNION SELECT 'Switch' UNION SELECT 'WLAN' UNION SELECT 'Router' UNION SELECT 'Other') AS all_devices ORDER BY id;"
},
{
"name" : "uilang",
"type" : "setting",
"value" : "UI_LANG"
}
]
```
```json
{
"column": "Watched_Value1",
"css_classes": "col-sm-2",
"show": true,
"type": "threshold",
"default_value":"",
"options": [
{
"maximum": 199,
"hexColor": "#792D86"
},
{
"maximum": 299,
"hexColor": "#5B862D"
},
{
"maximum": 399,
"hexColor": "#7D862D"
},
{
"maximum": 499,
"hexColor": "#BF6440"
},
{
"maximum": 599,
"hexColor": "#D33115"
}
],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Status code"
}]
},
{
"column": "Status",
"show": true,
"type": "replace",
"default_value":"",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<i class='fa-solid fa-square-check'></i>"
},
{
"equals": "watched-changed",
"replacement": "<i class='fa-solid fa-triangle-exclamation'></i>"
},
{
"equals": "new",
"replacement": "<i class='fa-solid fa-circle-plus'></i>"
}
],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Status"
}]
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-1",
"show": true,
"type": "regex.url_http_https",
"default_value":"",
"options": [
{
"type": "regex",
"param": "([\\d.:]+)"
}
],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "HTTP/s links"
},
{
"language_code":"es_es",
"string" : "N/A"
}]
}
```
[screen1]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins.png "Screen 1"
[screen2]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_settings.png "Screen 2"
[screen3]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_json_settings.png "Screen 3"
[screen4]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_json_ui.png "Screen 4"
[screen5]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_device_details.png "Screen 5"

View File

@@ -30,9 +30,11 @@ There is also an in-app Help / FAQ section that should be answering frequently a
- [Subnets and VLANs configuration for arp-scan](/docs/SUBNETS.md)
- [SMTP server config](/docs/SMTP.md)
- [Custom Icon configuration and support](/docs/ICONS.md)
- [Notifications](/docs/NOTIFICATIONS.md)
- [Better name resolution with Reverse DNS](/docs/REVERSE_DNS.md)
- [Network treemap configuration](/docs/NETWORK_TREE.md)
- [Backups](/docs/BACKUPS.md)
- [Plugins overview](/front/plugins/README.md)
#### 🐛 Debugging help & tips
@@ -40,6 +42,7 @@ There is also an in-app Help / FAQ section that should be answering frequently a
- [Debugging UI not showing](/docs/WEB_UI_PORT_DEBUG.md)
- [Invalid JSON errors debug help](/docs/DEBUG_INVALID_JSON.md)
- [Troubleshooting Plugins](/docs/DEBUG_PLUGINS.md)
- [File Permissions](/docs/FILE_PERMISSIONS.md)
#### 🔝 Popular/Suggested
@@ -66,7 +69,7 @@ There is also an in-app Help / FAQ section that should be answering frequently a
- [Server APP code structure](/server/README.md)
- [Database structure](/docs/DATABASE.md)
- [API endpoints details](/docs/API.md)
- [Plugin system details and how to develop your own](/front/plugins/README.md)
- [Plugin development guide](/docs/PLUGINS_DEV.md)
- [Settings system](/docs/SETTINGS_SYSTEM.md)
- [New Version notifications](/docs/VERSIONS.md)
- [Frontend development tips](/docs/FRONTEND_DEVELOPMENT.md)

View File

@@ -1,19 +1,19 @@
# Subnets configuration for arp-scan
# Subnets configuration
You need to specify the network interface and the network mask. You can also configure multiple subnets and specify VLANS (see exceptions below).
> [!TIP]
> You may need to increase the time between scans `ARPSCAN_RUN_SCHD` and the timeout `ARPSCAN_RUN_TIMEOUT` settings when adding more subnets. If the timeout setting is exceeded, the scan is cancelled to prevent application hanging from rogue plugins. Check [debugging plugins](/docs/DEBUG_PLUGINS.md) for more tips.
> You may need to increase the time between scans `ARPSCAN_RUN_SCHD` and the timeout `ARPSCAN_RUN_TIMEOUT` (and similar setting on related plugins) when adding more subnets. If the timeout setting is exceeded, the scan is cancelled to prevent application hanging from rogue plugins. Check [debugging plugins](/docs/DEBUG_PLUGINS.md) for more tips.
## Examples
> [!NOTE]
> Please use the UI to configure settings as that ensures that the config file is in the correct format. Edit `app.conf` directly only when really necessary.
> ![settings](/front/plugins/arp_scan/arp-scan-settings.png)
> ![settings](/docs/img/SUBNETS/subnets-setting-location.png)
* Examples for one and two subnets (❗ Note the `['...', '...']` format):
* One subnet: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0']`
* Two subnets: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0', '192.168.1.0/24 --interface=eth1 -vlan=107']`
* Examples for one and two subnets (❗ Note the `['...','...']` format):
* One subnet: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0']`
* Two subnets: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0','192.168.1.0/24 --interface=eth1 -vlan=107']`
## Explanation
@@ -27,7 +27,7 @@ The arp-scan time itself depends on the number of IP addresses to check.
> The number of IPs to check depends on the [network mask](https://www.calculator.net/ip-subnet-calculator.html) you set on the `SCAN_SUBNETS` setting.
> For example, a `/24` mask results in 256 IPs to check, whereas a `/16` mask checks around 65,536. Every IP takes a couple of seconds. This means that with an incorrect configuration, the arp-scan will take hours to complete instead of seconds.
Specify the network filter (which **significantly** speeds up the scan process). For example, the filter `192.168.1.0/24` covers IP ranges 192.168.1.0 to 192.168.1.255.
Specify the network filter (which **significantly** speeds up the scan process). For example, the filter `192.168.1.0/24` covers IP ranges `192.168.1.0` to `192.168.1.255`.
### Network interface (adapter)

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -144,6 +144,32 @@
{
background-color: rgba(0, 0, 0, 0);
}
.unread-notifications-bell
{
position: absolute;
top: 3px;
margin-left: 15px;
display: none;
}
.navbar-custom-menu .bg-yellow
{
color: white !important;
}
.header-status-locked-db
{
width: 25px;
height: 25px;
color: red;
position: absolute;
top: 12px;
right: -17px;
display: none;
}
.navbar-nav > li > a
{
line-height: 30px;
@@ -481,28 +507,41 @@
/* -----------------------------------------------------------------------------
Notification float banner
----------------------------------------------------------------------------- */
.pa_alert_notification {
.notification_modal {
text-align: center;
font-size: large;
font-weight: bold;
color: #258744;
background-color: #d4edda;
border-color: #c3e6cb;
border-radius: 5px;
max-width: 1000px;
/* 80% wrapper 1250px */
left: 0;
right: 0;
width: 80%;
z-index: 9999;
position: fixed;
top: 30px;
margin: auto;
transform: translate(0, 0);
top: 100px;
display: none;
margin-left: auto;
margin-right: auto;
}
.modal_green
{
color: #258744;
background-color: #d4edda;
border-color: #c3e6cb;
}
.modal_red
{
color: rgb(245, 245, 245);
background-color: #e2acaa;
border-color: #d41001;
}
.modal_grey
{
color: white;
background-color: darkgrey;
border-color: #000000;
}
/* ticker setup */
.ticker-li
{
@@ -672,6 +711,11 @@ height: 50px;
/* report */
/* --------------------------------------------------------- */
#notificationData
{
margin-bottom: 10px;
}
#notificationData textarea{
width: 100%;
}
@@ -718,6 +762,11 @@ height: 50px;
}
}
.settingswrap
{
margin-bottom: 100px;
}
.settingswrap .metadata
{
display: none;
@@ -728,11 +777,16 @@ height: 50px;
float: right;
}
.padding-bottom
{
padding-bottom: 100px;
}
.settings-group
{
font-size: 20px;
padding-top: 7px;
padding-bottom: 9px;
padding-bottom: 9px;
}
.overview-section .small-box .icon
@@ -743,12 +797,12 @@ height: 50px;
.overview-section
{
border: solid;
/* border-top: solid;
border-width: medium;
border-width: medium;
border-width: 1px;
border-radius: 15px;
margin-bottom: 3px;
border-radius: 15px;
margin-bottom: 3px; */
}
@@ -761,6 +815,7 @@ height: 50px;
font-size: 20px;
padding-top: 7px;
padding-bottom: 9px;
margin-left: -20px;
}
@@ -820,7 +875,28 @@ height: 50px;
#settingsPage .overview-setting-value{
display:unset;
}
.overview-setting-value-wrap
{
padding-left: 1px;
text-overflow: clip ;
overflow: hidden;
}
#settingsPage .small-box
{
padding-left: 10px;
padding-right: 10px;
}
#settingsPage .small-box .inner
{
padding-left: 0px;
padding-right: 0px;
}
#settingsPage .panel-title{
/* display: inline-block; */
/* width: 120px; */
@@ -829,6 +905,17 @@ height: 50px;
text-overflow: ellipsis;
}
.padding-5px
{
padding: 5px;
}
.text-overflow-hidden
{
overflow: hidden;
text-overflow: clip;
}
.settings_content {
padding: 10px;
@@ -875,6 +962,84 @@ input[readonly] {
cursor: not-allowed;
}
.interactable-option:hover::before {
opacity: 1;
}
.interactable-option::before {
content: '1x 📝 | 2x 🚮';
position: sticky;
right: 0px;
top: 0;
color: white;
float: right;
background-color: rgb(0, 0, 0);
transition: opacity 0.5s;
opacity: 0.1;
border-radius: 3px;
}
.interactable-option:hover {
transition: background-color 2s;
cursor: pointer;
}
.settingsImportedTimestamp
{
padding: 25px;
}
.settingsSearchWrap
{
padding:10px;
}
.settings-sticky-bottom-section {
position: fixed;
z-index: 999;
background-color: #5B5B66;
/* opacity: 0.8; */
bottom: 30px;
border-radius: 5px;
margin:1px;
border-width: 1px;
border-style: solid;
border-color: inherit;
/* width: 87%; */
}
.settings-sticky-bottom-section:hover {
border-color: #258744;
}
.settings-sticky-bottom-section .form-group
{
margin-bottom: 0px;
}
.clear-filter
{
opacity: 0.5;
cursor: pointer;
width: 14px;
position: absolute;
right: -6px;
top: 6px;
}
.clear-filter:hover
{
opacity: 1;
}
.saveSettingsWrapper button
{
width:70%;
margin-top:20px;
margin-left:15%;
margin-bottom:20px;
}
/* ----------------------------------------------------------------- */
/* Devices page */
@@ -942,11 +1107,23 @@ input[readonly] {
height: 1.5em !important;
}
/* ----------------------------------------------------------------- */
/* MODAL popups */
/* ----------------------------------------------------------------- */
#modal-input-textarea
{
width: 100%;
}
.modal-field-input
{
margin: 4%;
width: 92%;
}
/* ----------------------------------------------------------------- */
/* NETWORK page */

View File

@@ -17,9 +17,10 @@ html {
background-color: #353c42;
}
body {
background-color: #353c42;
color: #bec5cb;
body, .bg-yellow, .callout.callout-warning, .alert-warning, .label-warning, .modal-warning .modal-body {
background-color: #353c42 !important;
color: #bec5cb !important;
}
h4 {
color: #44def1;

View File

@@ -500,14 +500,10 @@
<!-- Buttons -->
<div class="col-xs-12">
<div class="pull-right">
<button type="button" class="btn btn-default pa-btn pa-btn-delete" style="margin-left:0px;"
id="btnDeleteEvents" onclick="askDeleteDeviceEvents()"> <?= lang('DevDetail_button_DeleteEvents');?> </button>
<button type="button" class="btn btn-default pa-btn pa-btn-delete" style="margin-left:0px;"
id="btnDelete" onclick="askDeleteDevice()"> <?= lang('DevDetail_button_Delete');?> </button>
<button type="button" class="btn btn-default pa-btn" style="margin-left:6px;"
id="btnRestore" onclick="getDeviceData(true)"> <?= lang('DevDetail_button_Reset');?> </button>
<button type="button" disabled class="btn btn-primary pa-btn" style="margin-left:6px; "
id="btnSave" onclick="setDeviceData()" > <?= lang('DevDetail_button_Save');?> </button>
<button type="button" class="btn btn-default pa-btn pa-btn-delete" style="margin-left:0px;" id="btnDeleteEvents" onclick="askDeleteDeviceEvents()"> <?= lang('DevDetail_button_DeleteEvents');?> </button>
<button type="button" class="btn btn-default pa-btn pa-btn-delete" style="margin-left:0px;" id="btnDelete" onclick="askDeleteDevice()"> <?= lang('DevDetail_button_Delete');?> </button>
<!-- <button type="button" class="btn btn-default pa-btn" style="margin-left:6px;" id="btnRestore" onclick="getDeviceData(true)"> <?= lang('DevDetail_button_Reset');?> </button> -->
<button type="button" disabled class="btn btn-primary pa-btn" style="margin-left:6px; " id="btnSave" onclick="setDeviceData()" > <?= lang('DevDetail_button_Save');?> </button>
</div>
</div>
@@ -627,8 +623,8 @@
<script src="lib/AdminLTE/bower_components/fullcalendar/dist/fullcalendar.min.js"></script>
<script src="lib/AdminLTE/bower_components/fullcalendar/dist/locale-all.js"></script>
<!-- ----------------------------------------------------------------------- -->
<script src="js/ui_components.js"></script>
<script src="js/db_methods.js"></script>
<!-- ----------------------------------------------------------------------- -->
<!-- Dark-Mode Patch -->
@@ -1441,17 +1437,19 @@ function setDeviceData (direction='', refreshCallback='') {
return;
}
showSpinner()
// update data to server
$.get('php/server/devices.php?action=setDeviceData&mac='+ mac
+ '&name=' + $('#txtName').val()
+ '&owner=' + $('#txtOwner').val()
+ '&name=' + encodeURIComponent($('#txtName').val())
+ '&owner=' + encodeURIComponent($('#txtOwner').val())
+ '&type=' + $('#txtDeviceType').val()
+ '&vendor=' + $('#txtVendor').val()
+ '&vendor=' + encodeURIComponent($('#txtVendor').val())
+ '&icon=' + encodeURIComponent($('#txtIcon').val())
+ '&favorite=' + ($('#chkFavorite')[0].checked * 1)
+ '&group=' + $('#txtGroup').val()
+ '&location=' + $('#txtLocation').val()
+ '&comments=' + $('#txtComments').val()
+ '&group=' + encodeURIComponent($('#txtGroup').val())
+ '&location=' + encodeURIComponent($('#txtLocation').val())
+ '&comments=' + encodeURIComponent($('#txtComments').val())
+ '&networknode=' + $('#txtNetworkNodeMac').attr('data-mynodemac')
+ '&networknodeport=' + $('#txtNetworkPort').val()
+ '&staticIP=' + ($('#chkStaticIP')[0].checked * 1)
@@ -1463,32 +1461,37 @@ function setDeviceData (direction='', refreshCallback='') {
+ '&archived=' + ($('#chkArchived')[0].checked * 1)
, function(msg) {
showMessage (msg);
showMessage (msg);
// clear session storage
setCache("#dropdownOwner","");
setCache("#dropdownDeviceType","");
setCache("#dropdownGroup","");
setCache("#dropdownLocation","");
setCache("#dropdownNetworkNodeMac","");
// clear session storage
setCache("#dropdownOwner","");
setCache("#dropdownDeviceType","");
setCache("#dropdownGroup","");
setCache("#dropdownLocation","");
setCache("#dropdownNetworkNodeMac","");
// Remove navigation prompt "Are you sure you want to leave..."
window.onbeforeunload = null;
somethingChanged = false;
// Remove navigation prompt "Are you sure you want to leave..."
window.onbeforeunload = null;
somethingChanged = false;
// refresh API
updateApi()
// refresh API
updateApi()
// Callback fuction
if (typeof refreshCallback == 'function') {
refreshCallback(direction);
}
hideSpinner()
// Callback fuction
if (typeof refreshCallback == 'function') {
refreshCallback(direction);
}
});
}
// -----------------------------------------------------------------------------
function askSkipNotifications () {
// Check MAC

View File

@@ -25,7 +25,6 @@
checkPermissions([$dbPath, $confPath]);
?>
<script src="js/ui_components.js"></script>
<!-- Page ------------------------------------------------------------------ -->
<div class="content-wrapper">
@@ -96,7 +95,7 @@
<a href="#" onclick="javascript: initializeDatatable('down');">
<div class="small-box bg-red">
<div class="inner"><h3 id="devicesDown"> -- </h3>
<p class="infobox_label"><?= lang('Device_Shortcut_DownAlerts');?></p>
<p class="infobox_label"><?= lang('Device_Shortcut_DownOnly');?></p>
</div>
<div class="icon"><i class="fa fa-warning text-red-40"></i></div>
</div>
@@ -127,7 +126,7 @@
</div>
<div class="box-body">
<div class="chart">
<script src="lib/AdminLTE/bower_components/chart.js/Chart.js"></script>
<script src="lib/AdminLTE/bower_components/chart.js/Chart.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<canvas id="OnlineChart" style="width:100%; height: 150px; margin-bottom: 15px;"></canvas>
</div>
</div>
@@ -214,8 +213,8 @@
var tableOrder = [[3,'desc'], [0,'asc']];
var tableColumnHide = [];
var columnsStr = '[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]';
var tableColumnOrder = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18];
var columnsStr = '[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]';
var tableColumnOrder = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var tableColumnVisible = tableColumnOrder;
//initialize the table headers in the correct order
var headersDefaultOrder = [
@@ -237,7 +236,9 @@
getString('Device_TableHead_Connected_Devices'),
getString('Device_TableHead_Location'),
getString('Device_TableHead_Vendor'),
getString('Device_TableHead_Port')
getString('Device_TableHead_Port'),
getString('Device_TableHead_GUID'),
getString('Device_TableHead_SyncHubNodeName')
];
// Read parameters & Initialize components
@@ -251,7 +252,11 @@ function main () {
handleLoadingDialog()
// Hide UI elements as per settings
hideUIelements("UI_DEV_SECTIONS")
// setTimeout(() => {
hideUIelements("UI_DEV_SECTIONS")
// }, 10);
// get from cookie if available (need to use decodeURI as saved as part of URI in PHP)
cookieColumnsVisibleStr = decodeURI(getCookie("Front_Devices_Columns_Visible")).replaceAll('%2C',',')
@@ -400,9 +405,9 @@ function filterDataByStatus(data, status) {
return item.dev_Favorite === 1;
case 'new':
return item.dev_NewDevice === 1;
case 'offline':
return item.dev_PresentLastScan === 0;
case 'down':
return (item.dev_PresentLastScan === 0 && item.dev_AlertDeviceDown !== 0) || item.dev_PresentLastScan === 0;
case 'down_only':
return (item.dev_PresentLastScan === 0 && item.dev_AlertDeviceDown !== 0);
case 'archived':
return item.dev_Archived === 1;
@@ -457,7 +462,7 @@ function initializeDatatable (status) {
case 'connected': tableTitle = getString('Device_Shortcut_Connected'); color = 'green'; break;
case 'favorites': tableTitle = getString('Device_Shortcut_Favorites'); color = 'yellow'; break;
case 'new': tableTitle = getString('Device_Shortcut_NewDevices'); color = 'yellow'; break;
case 'down': tableTitle = getString('Device_Shortcut_DownAlerts'); color = 'red'; break;
case 'down': tableTitle = getString('Device_Shortcut_DownOnly'); color = 'red'; break;
case 'archived': tableTitle = getString('Device_Shortcut_Archived'); color = 'gray'; break;
default: tableTitle = getString('Device_Shortcut_Devices'); color = 'gray'; break;
}
@@ -508,7 +513,9 @@ function initializeDatatable (status) {
getNumberOfChildren(item.dev_MAC, result.data) || 0,
item.dev_Location || "",
item.dev_Vendor || "",
item.dev_Network_Node_port || 0
item.dev_Network_Node_port || 0,
item.dev_GUID || "",
item.dev_SyncHubNodeName || ""
];
var newRow = [];
@@ -623,7 +630,11 @@ function initializeDatatable (status) {
// Dates
{targets: [mapIndx(6), mapIndx(7)],
'createdCell': function (td, cellData, rowData, row, col) {
$(td).html (translateHTMLcodes (cellData));
var result = cellData.toString(); // Convert to string
if (result.includes("+")) { // Check if timezone offset is present
result = result.split('+')[0]; // Remove timezone offset
}
$(td).html (translateHTMLcodes (result));
} },
// Random MAC

View File

@@ -145,6 +145,9 @@
<th><?= lang('Events_TableHead_IP');?></th>
<th><?= lang('Events_TableHead_IPOrder');?></th>
<th><?= lang('Events_TableHead_AdditionalInfo');?></th>
<th>N/A</th>
<th>MAC</th>
<th><?= lang('Events_TableHead_PendingAlert');?></th>
</tr>
</thead>
</table>
@@ -236,7 +239,7 @@ function initializeDatatable () {
'pageLength' : tableRows,
'columnDefs' : [
{visible: false, targets: [0,5,6,7,8,10] },
{visible: false, targets: [0,5,6,7,8,10,11,12,13] },
{className: 'text-center', targets: [] },
{orderData: [8], targets: 7 },
{orderData: [10], targets: 9 },
@@ -251,6 +254,13 @@ function initializeDatatable () {
{targets: [3,4,5,6,7],
"createdCell": function (td, cellData, rowData, row, col) {
$(td).html (translateHTMLcodes (cellData));
} },
// PendingAlert
{targets: [14],
"createdCell": function (td, cellData, rowData, row, col) {
// console.log(cellData);
$(td).html (cellData);
} }
],
@@ -331,7 +341,7 @@ function getEvents (p_eventsType) {
$('#tableEventsBox')[0].className = 'box box-' + color;
$('#tableEventsTitle').html (tableTitle);
// Coluumns Visibility
// Columns Visibility
$('#tableEvents').DataTable().column(3).visible (!sesionCols);
$('#tableEvents').DataTable().column(4).visible (!sesionCols);
$('#tableEvents').DataTable().column(5).visible (sesionCols);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

BIN
front/img/NetAlertX_logo_red.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -78,7 +78,7 @@ if (isset ($_SESSION["login"]) == FALSE || $_SESSION["login"] != 1)
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Pi-Alert | Log in</title>
<title>Net Alert X | Log in</title>
<!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<!-- Bootstrap 3.3.7 -->
@@ -147,7 +147,6 @@ if ($ENABLED_DARKMODE === True) {
<button type="button" class="close" data-dismiss="alert" aria-hidden="true"><3E></button>
<h4><i class="icon fa <?php echo $login_icon;?>"></i><?php echo $login_headline;?></h4>
<p><?php echo $login_info;?></p>
<p><?= lang('Login_Psw_run');?><br><span style="border: solid 1px yellow; padding: 2px;"> /app/back/pialert-cli set_password <?= lang('Login_Psw_new');?></span><br><?= lang('Login_Psw_folder');?></p>
</div>
</div>

View File

@@ -9,7 +9,7 @@
// -----------------------------------------------------------------------------
var timerRefreshData = ''
var modalCallbackFunction = '';
var emptyArr = ['undefined', "", undefined, null, 'null'];
var UI_LANG = "English";
var settingsJSON = {}
@@ -144,7 +144,16 @@ function cacheSettings()
if(options_params != [])
{
// handles only strings of length == 1
resolvedOptions = `["${resolveParams(options_params, resolvedOptions[0])}"]`
resolved = resolveParams(options_params, resolvedOptions[0])
if(resolved.includes('"')) // check if list of strings
{
resolvedOptions = `[${resolved}]`
} else // one value only
{
resolvedOptions = `["${resolved}"]`
}
}
}
}
@@ -201,7 +210,7 @@ function cacheStrings()
if(!getCache('completedCalls').includes('cacheStrings'))
{
// handle core strings and translations
var allLanguages = ["en_us", "es_es", "de_de", "fr_fr", "it_it", "ru_ru", "nb_no"]; // needs to be same as in lang.php
var allLanguages = ["en_us", "es_es", "de_de", "fr_fr", "it_it", "ru_ru", "nb_no", "pl_pl", "zh_cn"]; // needs to be same as in lang.php
allLanguages.forEach(function (language_code) {
$.get(`php/templates/language/${language_code}.json?nocache=${Date.now()}`, function (res) {
@@ -230,7 +239,7 @@ function cacheStrings()
// Get translated language string
function getString (key) {
// handle initial laod to make sure everything is set-up and cached
// handle initial load to make sure everything is set-up and cached
handleFirstLoad(getString)
UI_LANG = getSetting("UI_LANG");
@@ -254,12 +263,24 @@ function getString (key) {
case 'Norwegian':
lang_code = 'nb_no';
break;
case 'Italian':
case 'Polish (pl_pl)':
lang_code = 'pl_pl';
break;
case 'Portuguese (pt_br)':
lang_code = 'pt_br';
break;
case 'Turkish (tr_tr)':
lang_code = 'tr_tr';
break;
case 'Italian (it_it)':
lang_code = 'it_it';
break;
case 'Russian':
lang_code = 'ru_ru';
break;
case 'Chinese (zh_cn)':
lang_code = 'zh_cn';
break;
}
result = getCache(`pia_lang_${key}_${lang_code}`, true);
@@ -272,162 +293,7 @@ function getString (key) {
return result;
}
// -----------------------------------------------------------------------------
// Modal dialog handling
// -----------------------------------------------------------------------------
function showModalOK (title, message, callbackFunction) {
showModalOk (title, message, callbackFunction)
}
function showModalOk (title, message, callbackFunction) {
// set captions
$('#modal-ok-title').html (title);
$('#modal-ok-message').html (message);
if(callbackFunction!= null)
{
$("#modal-ok-OK").click(function()
{
callbackFunction()
});
}
// Show modal
$('#modal-ok').modal('show');
}
// -----------------------------------------------------------------------------
function showModalDefault (title, message, btnCancel, btnOK, callbackFunction) {
// set captions
$('#modal-default-title').html (title);
$('#modal-default-message').html (message);
$('#modal-default-cancel').html (btnCancel);
$('#modal-default-OK').html (btnOK);
modalCallbackFunction = callbackFunction;
// Show modal
$('#modal-default').modal('show');
}
// -----------------------------------------------------------------------------
function showModalDefaultStrParam (title, message, btnCancel, btnOK, callbackFunction, param='') {
// set captions
$('#modal-str-title').html (title);
$('#modal-str-message').html (message);
$('#modal-str-cancel').html (btnCancel);
$('#modal-str-OK').html (btnOK);
$("#modal-str-OK").off("click"); //remove existing handlers
$('#modal-str-OK').on('click', function (){
$('#modal-str').modal('hide');
callbackFunction(param)
})
// Show modal
$('#modal-str').modal('show');
}
// -----------------------------------------------------------------------------
function showModalWarning (title, message, btnCancel=getString('Gen_Cancel'), btnOK=getString('Gen_Okay'), callbackFunction=null) {
// set captions
$('#modal-warning-title').html (title);
$('#modal-warning-message').html (message);
$('#modal-warning-cancel').html (btnCancel);
$('#modal-warning-OK').html (btnOK);
if ( callbackFunction != null)
{
modalCallbackFunction = callbackFunction;
}
// Show modal
$('#modal-warning').modal('show');
}
// -----------------------------------------------------------------------------
function showModalInput (title, message, btnCancel=getString('Gen_Cancel'), btnOK=getString('Gen_Okay'), callbackFunction=null) {
// set captions
$('#modal-input-title').html (title);
$('#modal-input-message').html (message);
$('#modal-input-cancel').html (btnCancel);
$('#modal-input-OK').html (btnOK);
if ( callbackFunction != null)
{
modalCallbackFunction = callbackFunction;
}
// Show modal
$('#modal-input').modal('show');
}
// -----------------------------------------------------------------------------
function modalDefaultOK () {
// Hide modal
$('#modal-default').modal('hide');
// timer to execute function
window.setTimeout( function() {
window[modalCallbackFunction]();
}, 100);
}
// -----------------------------------------------------------------------------
function modalDefaultInput () {
// Hide modal
$('#modal-input').modal('hide');
// timer to execute function
window.setTimeout( function() {
window[modalCallbackFunction]();
}, 100);
}
// -----------------------------------------------------------------------------
function modalWarningOK () {
// Hide modal
$('#modal-warning').modal('hide');
// timer to execute function
window.setTimeout( function() {
window[modalCallbackFunction]();
}, 100);
}
// -----------------------------------------------------------------------------
function showMessage (textMessage="") {
if (textMessage.toLowerCase().includes("error") ) {
// show error
alert (textMessage);
} else {
// show temporal notification
$("#alert-message").html (textMessage);
$("#notification").fadeIn(1, function () {
window.setTimeout( function() {
$("#notification").fadeOut(500)
}, 3000);
} );
}
}
// -----------------------------------------------------------------------------
function showTickerAnnouncement(textMessage = "") {
if (textMessage.toLowerCase().includes("error")) {
// show error
alert(textMessage);
} else {
// show permanent notification
$("#ticker-message").html(textMessage);
$("#tickerAnnouncement").removeClass("myhidden");
// Move the tickerAnnouncement element to ticker_announcement_plc
$("#tickerAnnouncement").appendTo("#ticker_announcement_plc");
// var $ticker = $('#tickerAnnouncement');
// var $tickerMessage = $('#ticker-message');
// Clone the ticker message to create continuous scrolling effect
// $tickerMessage.clone().appendTo($ticker);
}
}
// -----------------------------------------------------------------------------
@@ -709,6 +575,22 @@ function debugTimer () {
$('#pageTitle').html (new Date().getSeconds());
}
// -----------------------------------------------------------------------------
function secondsSincePageLoad() {
// Get the current time
var currentTime = Date.now();
// Get the time when the page was loaded
var pageLoadTime = performance.timeOrigin;
// Calculate the difference in milliseconds
var timeDifference = currentTime - pageLoadTime;
// Convert milliseconds to seconds
var secondsAgo = Math.floor(timeDifference / 1000);
return secondsAgo;
}
// -----------------------------------------------------------------------------
// Open url in new tab
@@ -1013,6 +895,15 @@ function getGuid() {
// -----------------------------------------------------------------------------
function showSpinner(stringKey='Loading')
{
if(stringKey == "")
{
text = ''
} else
{
text = getString(stringKey)
}
if($("#loadingSpinner").length)
{
$("#loadingSpinner").show();
@@ -1024,7 +915,7 @@ function showSpinner(stringKey='Loading')
<div class="pa_semitransparent-panel"></div>
<div class="panel panel-default pa_spinner">
<table>
<td width="130px" align="middle">${getString(stringKey)}</td>
<td width="130px" align="middle">${text}</td>
<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td>
</table>
</div>
@@ -1148,8 +1039,18 @@ function resolveParams(params, template) {
// If the parameter type is 'setting', retrieve setting value
if (param.type == "setting") {
var value = getSetting(param.value);
// Remove brackets and single quotes, replace them with double quotes
value = value.replace('[','').replace(']','').replace(/'/g, '"');
// Split the string into an array, remove empty elements
const arr = value.split(',').filter(Boolean);
// Join the array elements with commas
const result = arr.join(', ');
// Replace placeholder with setting value
template = template.replace("{" + param.name + "}", value);
template = template.replace("{" + param.name + "}", result);
} else {
// If the parameter type is not 'setting', use the provided value
template = template.replace("{" + param.name + "}", param.value);
@@ -1183,155 +1084,131 @@ function arraysContainSameValues(arr1, arr2) {
// -----------------------------------------------------------------------------
// Define a unique key for storing the flag in sessionStorage
var sessionStorageKey = "myScriptExecuted_common_js";
// -----------------------------------------------------------------------------
// Clearing all the caches
function clearCache()
{
showSpinner()
resetInitializedFlag()
window.location.reload()
}
// -----------------------------------------------------------------------------
function resetInitializedFlag()
{
// Clear local storage
localStorage.clear();
// Set the flag in sessionStorage to indicate that the code and cahce needs to be reloaded
sessionStorage.setItem(sessionStorageKey, "false");
}
// -----------------------------------------------------------------------------
// check if cache needs to be refreshed because of setting changes
$.get('api/app_state.json?nocache=' + Date.now(), function(appState) {
console.log(appState["settingsImported"]*1000)
importedMiliseconds = parseInt((appState["settingsImported"]*1000));
lastReloaded = parseInt(sessionStorage.getItem(sessionStorageKey + '_time'));
if(importedMiliseconds > lastReloaded)
{
console.log("Cache needs to be refreshed because of setting changes");
setTimeout(() => {
resetInitializedFlag()
location.reload();
}, 500);
}
});
// -----------------------------------------------------------------------------
// Display spinner and reload page if not yet initialized
function handleFirstLoad(callback)
{
if(!app_common_init)
{
setTimeout(function() {
callback();
}, 1000);
}
}
// -----------------------------------------------------------------------------
// Check if the code has been executed before by checking sessionStorage
var app_common_init = sessionStorage.getItem(sessionStorageKey) === "true";
const sessionStorageKey = "myScriptExecuted_common_js";
var completedCalls = []
var completedCalls_final = ['cacheSettings', 'cacheStrings', 'cacheDevices'];
// Define a function that will execute the code only once
function executeOnce() {
// -----------------------------------------------------------------------------
// Clearing all the caches
function clearCache() {
showSpinner();
sessionStorage.clear();
localStorage.clear();
setTimeout(() => {
window.location.reload();
}, 500);
}
if (!arraysContainSameValues(getCache(completedCalls), completedCalls_final)) {
// -----------------------------------------------------------------------------
// Function to check if cache needs to be refreshed because of setting changes
function checkSettingChanges() {
$.get('api/app_state.json?nocache=' + Date.now(), function(appState) {
const importedMilliseconds = parseInt(appState["settingsImported"] * 1000);
const lastReloaded = parseInt(sessionStorage.getItem(sessionStorageKey + '_time'));
showSpinner()
// Use cache to keep track of completed AJAX calls
var tmp_completedCalls = getCache("completedCalls")
// initialize from cache if values present
if(tmp_completedCalls != "")
{
completedCalls = tmp_completedCalls.split(',');
if (importedMilliseconds > lastReloaded) {
console.log("Cache needs to be refreshed because of setting changes");
setTimeout(() => {
clearCache();
}, 500);
}
});
}
// cache everything in the right order
cacheStrings()
.then(cacheSettings)
.then(cacheDevices)
.then(() => {
// All callbacks have completed
console.log("✅ All AJAX callbacks have completed");
// location.reload()
onAllCallsComplete();
})
.catch((error) => {
console.error("Error:", error);
});
// -----------------------------------------------------------------------------
// Display spinner and reload page if not yet initialized
async function handleFirstLoad(callback) {
if (!isAppInitialized()) {
await new Promise(resolve => setTimeout(resolve, 1000));
callback();
}
}
// -----------------------------------------------------------------------------
// Check if the code has been executed before by checking sessionStorage
function isAppInitialized() {
return arraysContainSameValues(getCache("completedCalls").split(',').filter(Boolean), completedCalls_final);
}
// Define a function that will execute the code only once
async function executeOnce() {
showSpinner();
if (!isAppInitialized()) {
try {
await cacheStrings();
await cacheSettings();
await cacheDevices();
console.log("✅ All AJAX callbacks have completed");
onAllCallsComplete();
} catch (error) {
console.error("Error:", error);
}
}
}
// -----------------------------------------------------------------------------
// Function to handle successful completion of an AJAX call
const handleSuccess = (callName) => {
console.log(`AJAX call successful: ${callName} `);
// store completed call
completedCalls.push(callName)
setCache('completedCalls', mergeUniqueArrays(getCache('completedCalls').split(','), [callName]))
console.log(`AJAX call successful: ${callName}`);
completedCalls.push(callName);
setCache('completedCalls', mergeUniqueArrays(getCache('completedCalls').split(','), [callName]));
};
// -----------------------------------------------------------------------------
// Function to handle failure of an AJAX call
const handleFailure = (callName, callback) => {
// Handle AJAX call failure here
console.error(`AJAX call ${callName} failed`);
// try until successful
// callback()
// Implement retry logic here if needed
};
// -----------------------------------------------------------------------------
// Function to execute when all AJAX calls have completed
const onAllCallsComplete = () => {
// Merge local completedCalls with completedCalls_cached array - ensure uniqueness
// if cache contains values, merge those two arrays
completedCalls = mergeUniqueArrays(getCache('completedCalls').split(','), completedCalls)
// Update cache with merged completedCalls
completedCalls = mergeUniqueArrays(getCache('completedCalls').split(','), completedCalls);
setCache('completedCalls', completedCalls);
// Set the flag in sessionStorage to indicate that the code has been executed
// and save time when last time the page was initialized
sessionStorage.setItem(sessionStorageKey, "true");
const millisecondsNow = Date.now();
sessionStorage.setItem(sessionStorageKey + '_time', millisecondsNow);
// Check if all necessary strings are initialized
if (areAllStringsInitialized()) {
sessionStorage.setItem(sessionStorageKey, "true");
const millisecondsNow = Date.now();
sessionStorage.setItem(sessionStorageKey + '_time', millisecondsNow);
console.log('✔ Cache intialized');
console.log('✔ Cache initialized');
} else {
// If not all strings are initialized, retry initialization
console.log('❌ Not all strings are initialized. Retrying...');
executeOnce();
return;
}
// Call any other initialization functions here if needed
// No need for location.reload() here
};
// Function to check if all necessary strings are initialized
const areAllStringsInitialized = () => {
// Implement logic to check if all necessary strings are initialized
// Return true if all strings are initialized, false otherwise
return getString('UI_LANG') != ""
};
// Call the function to execute the code
executeOnce();
// Set timer for page refresh if configured
// Set timer for regular checks
setTimeout(() => {
// page refresh if configured
const refreshTime = getSetting("UI_REFRESH");
if (refreshTime && refreshTime !== "0" && refreshTime !== "") {
newTimerRefreshData(clearCache, parseInt(refreshTime)*1000);
}
// Check if page needs to refresh due to setting changes
checkSettingChanges()
}, 10000);
@@ -1342,3 +1219,4 @@ console.log("init common.js");

View File

@@ -1,7 +1,9 @@
// -----------------------------------------------------------------------------
// General utilities to interact with teh database
// General utilities to interact with the database
// -----------------------------------------------------------------------------
// --------------------------------------------------
// Read data and place intotarget location, callback processies the results
function readData(sqlQuery, processDataCallback, valuesArray, targetLocation, targetField, nameTransformer) {
var apiUrl = `php/server/dbHelper.php?action=read&rawSql=${encodeURIComponent(sqlQuery)}`;
@@ -15,4 +17,36 @@ function readData(sqlQuery, processDataCallback, valuesArray, targetLocation, ta
// Place the resulting HTML into the specified placeholder div
$("#" + targetLocation).replaceWith(htmlResult);
});
}
}
// --------------------------------------------------
// Check if database is locked
function checkDbLock() {
$.ajax({
url: 'log/db_is_locked.log', // Replace with the actual path to your PHP file
type: 'GET',
success: function(response) {
// console.log(response);
if (response == 0) {
// console.log('Database is not locked');
$(".header-status-locked-db").hide()
} else {
console.log('🟥 Database is locked:');
console.log(response);
$(".header-status-locked-db").show()
}
},
error: function() {
console.log('🟥 Error checking database lock status');
$(".header-status-locked-db").show()
}
});
}
setInterval(checkDbLock(), 1000);

409
front/js/modal.js Executable file
View File

@@ -0,0 +1,409 @@
// -----------------------------------------------------------------------------
// Modal dialog handling
// -----------------------------------------------------------------------------
var modalCallbackFunction = "";
function showModalOK(title, message, callbackFunction) {
showModalOk(title, message, callbackFunction);
}
function showModalOk(title, message, callbackFunction) {
// set captions
$("#modal-ok-title").html(title);
$("#modal-ok-message").html(message);
if (callbackFunction != null) {
$("#modal-ok-OK").click(function () {
callbackFunction();
});
}
// Show modal
$("#modal-ok").modal("show");
}
// -----------------------------------------------------------------------------
function showModalDefault(title, message, btnCancel, btnOK, callbackFunction) {
// set captions
$("#modal-default-title").html(title);
$("#modal-default-message").html(message);
$("#modal-default-cancel").html(btnCancel);
$("#modal-default-OK").html(btnOK);
modalCallbackFunction = callbackFunction;
// Show modal
$("#modal-default").modal("show");
}
// -----------------------------------------------------------------------------
function showModalDefaultStrParam(
title,
message,
btnCancel,
btnOK,
callbackFunction,
param = ""
) {
// set captions
$("#modal-str-title").html(title);
$("#modal-str-message").html(message);
$("#modal-str-cancel").html(btnCancel);
$("#modal-str-OK").html(btnOK);
$("#modal-str-OK").off("click"); //remove existing handlers
$("#modal-str-OK").on("click", function () {
$("#modal-str").modal("hide");
callbackFunction(param);
});
// Show modal
$("#modal-str").modal("show");
}
// -----------------------------------------------------------------------------
function showModalWarning(
title,
message,
btnCancel = getString("Gen_Cancel"),
btnOK = getString("Gen_Okay"),
callbackFunction = null
) {
// set captions
$("#modal-warning-title").html(title);
$("#modal-warning-message").html(message);
$("#modal-warning-cancel").html(btnCancel);
$("#modal-warning-OK").html(btnOK);
if (callbackFunction != null) {
modalCallbackFunction = callbackFunction;
}
// Show modal
$("#modal-warning").modal("show");
}
// -----------------------------------------------------------------------------
function showModalInput(
title,
message,
btnCancel = getString("Gen_Cancel"),
btnOK = getString("Gen_Okay"),
callbackFunction = null
) {
prefix = "modal-input";
// set captions
$(`#${prefix}-title`).html(title);
$(`#${prefix}-message`).html(message);
$(`#${prefix}-cancel`).html(btnCancel);
$(`#${prefix}-OK`).html(btnOK);
if (callbackFunction != null) {
modalCallbackFunction = callbackFunction;
}
// Show modal
$(`#${prefix}`).modal("show");
setTimeout(function () {
$(`#${prefix}-textarea`).focus();
}, 500);
}
// -----------------------------------------------------------------------------
function showModalFieldInput(
title,
message,
btnCancel = getString("Gen_Cancel"),
btnOK = getString("Gen_Okay"),
curValue = "",
callbackFunction = null
) {
// set captions
prefix = "modal-field-input";
$(`#${prefix}-title`).html(title);
$(`#${prefix}-message`).html(message);
$(`#${prefix}-cancel`).html(btnCancel);
$(`#${prefix}-OK`).html(btnOK);
if (callbackFunction != null) {
modalCallbackFunction = callbackFunction;
}
$(`#${prefix}-field`).val(curValue);
setTimeout(function () {
$(`#${prefix}-field`).focus();
}, 500);
// Show modal
$(`#${prefix}`).modal("show");
}
// -----------------------------------------------------------------------------
function modalDefaultOK() {
// Hide modal
$("#modal-default").modal("hide");
// timer to execute function
window.setTimeout(function () {
window[modalCallbackFunction]();
}, 100);
}
// -----------------------------------------------------------------------------
function modalDefaultInput() {
// Hide modal
$("#modal-input").modal("hide");
// timer to execute function
window.setTimeout(function () {
window[modalCallbackFunction]();
}, 100);
}
// -----------------------------------------------------------------------------
function modalDefaultFieldInput() {
// Hide modal
$("#modal-field-input").modal("hide");
// timer to execute function
window.setTimeout(function () {
modalCallbackFunction();
}, 100);
}
// -----------------------------------------------------------------------------
function modalWarningOK() {
// Hide modal
$("#modal-warning").modal("hide");
// timer to execute function
window.setTimeout(function () {
window[modalCallbackFunction]();
}, 100);
}
// -----------------------------------------------------------------------------
function showMessage(textMessage = "", timeout = 3000, colorClass = "modal_green") {
if (textMessage.toLowerCase().includes("error")) {
// show error
alert(textMessage);
} else {
// show temporary notification
$("#notification_modal").removeClass(); // remove all classes
$("#notification_modal").addClass("alert alert-dimissible notification_modal"); // add default ones
$("#notification_modal").addClass(colorClass); // add color modifiers
// message
$("#alert-message").html(textMessage);
// timeout
$("#notification_modal").fadeIn(1, function () {
window.setTimeout(function () {
$("#notification_modal").fadeOut(500);
}, timeout);
});
}
}
// -----------------------------------------------------------------------------
function showTickerAnnouncement(textMessage = "") {
if (textMessage.toLowerCase().includes("error")) {
// show error
alert(textMessage);
} else {
// show permanent notification
$("#ticker-message").html(textMessage);
$("#tickerAnnouncement").removeClass("myhidden");
// Move the tickerAnnouncement element to ticker_announcement_plc
$("#tickerAnnouncement").appendTo("#ticker_announcement_plc");
}
}
// -----------------------------------------------------------------------------
// Keyboard bindings
// -----------------------------------------------------------------------------
$(document).ready(function () {
$(document).on("keydown", function (event) {
// ESC key is pressed
if (event.keyCode === 27) {
// Trigger modal dismissal
$(".modal").modal("hide");
}
// Enter key is pressed
if (event.keyCode === 13) {
$(".modal:visible").find(".btn-modal-submit").click(); // Trigger the click event of the OK button in visible modals
}
});
});
// -----------------------------------------------------------------------------
// Backend notification Polling
// -----------------------------------------------------------------------------
// Function to check for notifications
function checkNotification() {
const notificationEndpoint = 'php/server/utilNotification.php?action=get_unread_notifications';
const phpEndpoint = 'php/server/utilNotification.php';
$.ajax({
url: notificationEndpoint,
type: 'GET',
success: function(response) {
// console.log(response);
if(response != "[]")
{
// Find the oldest unread notification with level "interrupt"
const oldestInterruptNotification = response.find(notification => notification.read === 0 && notification.level === "interrupt");
const allUnreadNotification = response.filter(notification => notification.read === 0 && notification.level === "alert");
if (oldestInterruptNotification) {
// Show modal dialog with the oldest unread notification
const decodedContent = JSON.parse(decodeURIComponent(oldestInterruptNotification.content));
showModalOK("Notification", decodedContent, function() {
// Mark the notification as read
$.ajax({
url: phpEndpoint,
type: 'GET',
data: {
action: 'mark_notification_as_read',
guid: oldestInterruptNotification.guid
},
success: function(response) {
console.log(response);
// After marking the notification as read, check for the next one
checkNotification();
},
error: function(xhr, status, error) {
console.error("Error marking notification as read:", status, error);
},
complete:function() {
hideSpinner();
}
});
});
}
handleUnreadNotifications(allUnreadNotification.length)
}
},
error: function() {
console.warn(`🟥 Error checking ${notificationEndpoint}`)
}
});
}
// Handling unread notifications favicon + bell floating number bublbe
function handleUnreadNotifications(count) {
$('#unread-notifications-bell-count').html(count);
if (count > 0) {
$('#unread-notifications-bell-count').show();
// Change the favicon to show there are notifications
$('#favicon').attr('href', 'img/NetAlertX_logo_notification.png');
// Update the title to include the count
document.title = `(${count}) ` + originalTitle;
} else {
$('#unread-notifications-bell-count').hide();
// Change the favicon back to the original
$('#favicon').attr('href', 'img/NetAlertX_logo.png');
// Revert the title to the original title
document.title = originalTitle;
}
}
// Store the original title of the document
var originalTitle = document.title;
// Start checking for notifications periodically
setInterval(checkNotification, 3000);
// --------------------------------------------------
// User notification handling methods
// --------------------------------------------------
const phpEndpoint = 'php/server/utilNotification.php';
// --------------------------------------------------
// Write a notification
function writeNotification(content, level) {
$.ajax({
url: phpEndpoint, // Change this to the path of your PHP script
type: 'GET',
data: {
action: 'write_notification',
content: content,
level: level
},
success: function(response) {
console.log('Notification written successfully.');
},
error: function(xhr, status, error) {
console.error('Error writing notification:', error);
}
});
}
// --------------------------------------------------
// Write a notification
function markNotificationAsRead(guid) {
$.ajax({
url: phpEndpoint,
type: 'GET',
data: {
action: 'mark_notification_as_read',
guid: guid
},
success: function(response) {
console.log(response);
// Perform any further actions after marking the notification as read here
showMessage(getString("Gen_Okay"))
},
error: function(xhr, status, error) {
console.error("Error marking notification as read:", status, error);
},
complete: function() {
// Perform any cleanup tasks here
}
});
}
// --------------------------------------------------
// Remove a notification
function removeNotification(guid) {
$.ajax({
url: phpEndpoint,
type: 'GET',
data: {
action: 'remove_notification',
guid: guid
},
success: function(response) {
console.log(response);
// Perform any further actions after marking the notification as read here
showMessage(getString("Gen_Okay"))
},
error: function(xhr, status, error) {
console.error("Error removing notification:", status, error);
},
complete: function() {
// Perform any cleanup tasks here
}
});
}

View File

@@ -20,7 +20,7 @@
}
// -------------------------------------------------------------------
// Get plugin type base on prefix
// Get plugin code name base on prefix
function getPluginCodeName(pluginsData, prefix)
{
var result = ""
@@ -58,6 +58,25 @@
return result;
}
// -------------------------------------------------------------------
// Get plugin config based on prefix
function getPluginConfig(pluginsData, prefix)
{
result = ""
pluginsData.forEach((plug) => {
if (plug.unique_prefix == prefix ) {
// console.log(id)
result = plug;
}
});
return result;
}
// -------------------------------------------------------------------
// Generate plugin HTML card based on prefixes in an array
function pluginCards(prefixesOfEnabledPlugins, includeSettings)
@@ -71,26 +90,27 @@
includeSettings.forEach((set) => {
includeSettings_html += `
<a href="#${prefix + '_' + set}" onclick="toggleAllSettings()">
<div class="overview-setting-value pointer" title="${prefix + '_' + set}">
<code>${getSetting(prefix + '_' + set)}</code>
</div>
</a>
<div class="col-sm-6 overview-setting-value-wrap">
<a href="#${prefix + '_' + set}" onclick="toggleAllSettings()">
<div class="overview-setting-value pointer" title="${prefix + '_' + set}">
<code>${getSetting(prefix + '_' + set)}</code>
</div>
</a>
</div>
`
});
html += `
<div class="col-sm-4 ">
<div class="small-box bg-green " >
<div class="inner ">
<a href="#${prefix}_header" onclick="toggleAllSettings('open')">
<h5 class="card-title">
<b>${getString(prefix+"_display_name")}</b>
</h5>
</a>
${includeSettings_html}
</div>
<div class="col-xs-6 col-sm-4 col-md-3 col-lg-2 col-xxl-1 padding-5px">
<div class="small-box bg-green col-sm-12 " >
<div class="inner col-sm-12">
<a href="#${prefix}_header" onclick="toggleAllSettings('open')">
<h5 class="card-title">
<b>${getString(prefix+"_display_name")}</b>
</h5>
</a>
${includeSettings_html}
</div>
<a href="#${prefix}_header" onclick="toggleAllSettings('open')">
<div class="icon"> ${getString(prefix+"_icon")} </div>
</a>
@@ -124,8 +144,7 @@
if(allOpen == false || openOrClose == 'open')
{
// open all
$('div[data-myid="collapsible"]').each(function(){$(this).attr('class', 'panel-collapse collapse in')})
$('div[data-myid="collapsible"]').each(function(){$(this).attr('style', 'height:inherit')})
openAllSettings()
$('#toggleSettings').attr('class', $('#toggleSettings').attr('class').replace(openIcon, closeIcon))
}
@@ -137,6 +156,11 @@
}
function openAllSettings() {
$('div[data-myid="collapsible"]').each(function(){$(this).attr('class', 'panel-collapse collapse in')})
$('div[data-myid="collapsible"]').each(function(){$(this).attr('style', 'height:inherit')})
}
// -------------------------------------------------------------------
// Checks if all schedules are the same
@@ -165,7 +189,376 @@
return true; // Return true if no schedules are found
}
// -------------------------------------------------------------------
// Checks if value is already encoded
function isSHA256(value) {
// Check if the value is a string and has a length of 64 characters
if (typeof value === "string" && value.length === 64) {
// Check if the value contains only hexadecimal characters
return /^[0-9a-fA-F]+$/.test(value);
} else {
return false;
}
}
// -------------------------------------------------------------------
// Validation
// -------------------------------------------------------------------
function settingsCollectedCorrectly(settingsArray, settingsJSON_DB) {
// check if the required UI_LANG setting is in the array - if not something went wrong
$.each(settingsArray, function(index, value) {
if (value[1] == "UI_LANG") {
if(isEmpty(value[3]) == true)
{
console.log(`⚠ Error: Required setting UI_LANG not found`);
showModalOk('ERROR', getString('settings_missing_block'));
return false;
}
}
});
const settingsCodeNames = settingsJSON_DB.map(setting => setting.Code_Name);
const detailedCodeNames = settingsArray.map(item => item[1]);
const missingCodeNamesOnPage = detailedCodeNames.filter(codeName => !settingsCodeNames.includes(codeName));
const missingCodeNamesInDB = settingsCodeNames.filter(codeName => !detailedCodeNames.includes(codeName));
// check if the number of settings on the page and in the DB are the same
if (missingCodeNamesOnPage.length !== missingCodeNamesInDB.length) {
console.log(`⚠ Error: The following settings are missing in the DB or on the page (Reload page to fix):`);
console.log(missingCodeNamesOnPage);
console.log(missingCodeNamesInDB);
showModalOk('ERROR', getString('settings_missing_block'));
return false;
}
// all OK
return true;
}
// -------------------------------------------------------------------
// Manipulating Editable List options
// -------------------------------------------------------------------
// ---------------------------------------------------------
function addList(element)
{
const fromId = $(element).attr('my-input-from');
const toId = $(element).attr('my-input-to');
input = $(`#${fromId}`).val();
$(`#${toId}`).append($("<option ></option>").attr("value", input).text(input));
// clear input
$(`#${fromId}`).val("");
settingsChanged();
}
// ---------------------------------------------------------
function removeFromList(element)
{
settingsChanged();
$(`#${$(element).attr('my-input')}`).find("option:last").remove();
}
// ---------------------------------------------------------
function addInterface()
{
ipMask = $('#ipMask').val();
ipInterface = $('#ipInterface').val();
full = ipMask + " --interface=" + ipInterface;
console.log(full)
if(ipMask == "" || ipInterface == "")
{
showModalOk ('Validation error', 'Specify both, the network mask and the interface');
} else {
$('#SCAN_SUBNETS').append($('<option disabled></option>').attr('value', full).text(full));
$('#ipMask').val('');
$('#ipInterface').val('');
settingsChanged();
}
}
// -------------------------------------------------------------------
// Function to remove an item from the select element
function removeOptionItem(option) {
settingsChanged();
option.remove();
}
// -------------------------------------------------------------------
// Update value of an item from the select element
function updateOptionItem(option, value) {
settingsChanged();
option.html(value);
option.val(value);
}
// -------------------------------------------------------------------
// Remove all options
function removeAllOptions(element)
{
settingsChanged();
$(`#${$(element).attr('my-input')}`).empty();
}
// -------------------------------------------------------------------
// Function to initialize remove functionality on select options
// Counter to track number of clicks
let clickCounter = 0;
// Function to initialize list interaction options
function initListInteractionOptions(selectorId) {
// Select all options within the specified selector
const $options = $(`#${selectorId} option`);
// Add class to make options interactable
$options.addClass('interactable-option');
// Attach click event listener to options
$options.on('click', function() {
const $option = $(this);
// Increment click counter
clickCounter++;
// Delay to capture multiple clicks
setTimeout(() => {
// Perform action based on click count
if (clickCounter === 1) {
// Single-click action
showModalFieldInput(
`<i class="fa-regular fa-pen-to-square"></i> ${getString('Gen_Update_Value')}`,
getString('settings_update_item_warning'),
getString('Gen_Cancel'),
getString('Gen_Update'),
$option.html(),
function() {
updateOptionItem($option, $(`#modal-field-input-field`).val())
}
);
} else if (clickCounter === 2) {
// Double-click action
removeOptionItem($option);
}
// Reset click counter
clickCounter = 0;
}, 300); // Adjust delay as needed
});
}
// -------------------------------------------------------------------
// Function to filter rows based on input text
function filterRows(inputText) {
if(!inputText)
{
inputText = ''
}
$('.table_row').each(function() {
// Check if the row id ends with '__metadata'
var idAttribute = $(this).attr('id');
if (idAttribute && idAttribute.endsWith('__metadata')) {
$(this).hide(); // Hide the row if it ends with '__metadata'
return; // Skip to the next iteration
}
var description = $(this).find('.setting_description').text().toLowerCase();
var codeName = $(this).find('.setting_name code').text().toLowerCase();
if (description.includes(inputText.toLowerCase()) || codeName.includes(inputText.toLowerCase())) {
$(this).show(); // Show the row if it matches the input text
} else {
$(this).hide(); // Hide the row if it doesn't match the input text
}
});
}
setTimeout(() => {
// Event listener for input change
$('#settingsSearch').on('input', function() {
var searchText = $(this).val();
// hide the setting overview dashboard
$('#settingsOverview').collapse('hide');
filterRows(searchText);
});
// Event listener for input focus
// var firstFocus = true;
$('#settingsSearch').on('focus', function() {
openAllSettings()
});
}, 1000);
// -----------------------------------------------------------------------------
// handling events on the backend initiated by the front end START
// -----------------------------------------------------------------------------
modalEventStatusId = 'modal-message-front-event'
// --------------------------------------------------------
// Calls a backend function to add a front-end event (specified by the attributes 'data-myevent' and 'data-myparam-plugin' on the passed element) to an execution queue
function addToExecutionQueue(element)
{
// value has to be in format event|param. e.g. run|ARPSCAN
action = `${getGuid()}|${$(element).attr('data-myevent')}|${$(element).attr('data-myparam-plugin')}`
$.ajax({
method: "POST",
url: "php/server/util.php",
data: { function: "addToExecutionQueue", action: action },
success: function(data, textStatus) {
// showModalOk ('Result', data );
// show message
showModalOk(getString("general_event_title"), `${getString("general_event_description")} <br/> <br/> <code id='${modalEventStatusId}'></code>`);
updateModalState()
}
})
}
// --------------------------------------------------------
// Updating the execution queue in in modal pop-up
function updateModalState() {
setTimeout(function() {
// Fetch the content from the log file using an AJAX request
$.ajax({
url: '/log/execution_queue.log',
type: 'GET',
success: function(data) {
// Update the content of the HTML element (e.g., a div with id 'logContent')
$('#'+modalEventStatusId).html(data);
updateModalState();
},
error: function() {
// Handle error, such as the file not being found
$('#logContent').html('Error: Log file not found.');
}
});
}, 2000);
}
// -----------------------------------------------------------------------------
// handling events on the backend initiated by the front end END
// -----------------------------------------------------------------------------
// ---------------------------------------------------------
// UNUSED?
function getParam(targetId, key, skipCache = false) {
skipCacheQuery = "";
if(skipCache)
{
skipCacheQuery = "&skipcache";
}
// get parameter value
$.get('php/server/parameters.php?action=get&defaultValue=0&parameter='+ key + skipCacheQuery, function(data) {
var result = data;
result = result.replaceAll('"', '');
document.getElementById(targetId).innerHTML = result.replaceAll('"', '');
});
}
// -----------------------------------------------------------------------------
// Show/hide the metadata settings
// -----------------------------------------------------------------------------
function toggleMetadata(element)
{
const id = $(element).attr('my-to-toggle');
$(`#${id}`).toggle();
}
// ---------------------------------------------------------
// Helper methods
// ---------------------------------------------------------
// Toggle readonly mode of the target element specified by the id in the "my-input-toggle-readonly" attribute
function overrideToggle(element) {
settingsChanged();
targetId = $(element).attr("my-input-toggle-readonly");
inputElement = $(`#${targetId}`)[0];
if (!inputElement) {
console.error("Input element not found!");
return;
}
if (inputElement.type === "text" || inputElement.type === "password") {
inputElement.readOnly = !inputElement.readOnly;
} else if (inputElement.type === "checkbox") {
inputElement.disabled = !inputElement.disabled;
} else {
console.warn("Unsupported input type. Only text, password, and checkbox inputs are supported.");
}
}
// ---------------------------------------------------------
// generate a list of options for a input select
function generateInputOptions(pluginsData, set, input, isMultiSelect = false)
{
multi = isMultiSelect ? "multiple" : "";
// optionsArray = getSettingOptions(set['Code_Name'] )
valuesArray = createArray(set['Value']);
// create unique ID
var targetLocation = set['Code_Name'] + "_initSettingDropdown";
// execute AJAX callabck + SQL query resolution
initSettingDropdown(set['Code_Name'] , valuesArray, targetLocation, generateDropdownOptions)
// main selection dropdown wrapper
input += `
<select onChange="settingsChanged()"
my-data-type="${set['Type']}"
class="form-control"
name="${set['Code_Name']}"
id="${set['Code_Name']}" ${multi}>
<option id="${targetLocation}" temporary="temporary"></option>
</select>`;
return input;
}

32
front/js/tests.js Executable file
View File

@@ -0,0 +1,32 @@
// --------------------------------------------------
// Check if database is locked
function lockDatabase(delay=20) {
$.ajax({
url: 'php/server/dbHelper.php', // Replace with the actual path to your PHP file
type: 'GET',
data: { action: 'lockDatabase', delay: delay },
success: function(response) {
console.log('Executed');
},
error: function() {
console.log('Error ocurred');
}
});
let times = delay;
let countdownInterval = setInterval(() => {
times--;
console.log(`Remaining time: ${times} seconds`);
if (times <= 0) {
clearInterval(countdownInterval);
console.log('Countdown finished');
}
}, 1000);
}

View File

@@ -13,13 +13,13 @@
// -----------------------------------------------------------------------------
function initDeviceSelectors() {
console.log(devicesList)
// console.log(devicesList)
// Retrieve device list from session variable
var devicesListAll_JSON = getCache('devicesListAll_JSON');
var devicesList = JSON.parse(devicesListAll_JSON);
console.log(devicesList);
// console.log(devicesList);
// Check if both device list exists
@@ -74,42 +74,9 @@ function initDeviceSelectors() {
}
}, 10);
}
// --------------------------------------------------------
//Initialize Select2 Elements and make them sortable
$(function () {
// Iterate over each Select2 dropdown
$('.select2').each(function() {
var selectEl = $(this).select2();
// Apply sortable functionality to the dropdown's dropdown-container
selectEl.next().children().children().children().sortable({
containment: 'parent',
update: function () {
var sortedValues = $(this).children().map(function() {
return $(this).attr('title');
}).get();
var sortedOptions = selectEl.find('option').sort(function(a, b) {
return sortedValues.indexOf($(a).text()) - sortedValues.indexOf($(b).text());
});
// Replace all options in selectEl
selectEl.empty().append(sortedOptions);
// Trigger change event on Select2
selectEl.trigger('change');
}
});
});
});
// -----------------------------------------------------------------------------
// Initiate dropdown
@@ -123,6 +90,7 @@ function initSettingDropdown(settingKey, // Identifier for the setting
var optionsHtml = ""
// NOTE {value} options to replace with a setting or SQL value are handled in the cacheSettings() function
optionsArray = createArray(getSettingOptions(settingKey))
// check if the result is a SQL query
@@ -177,8 +145,6 @@ function hideUIelements(settingKey) {
}
// -----------------------------------------------------------------------------
// Data processors
// -----------------------------------------------------------------------------
@@ -242,7 +208,7 @@ function genListWithInputSet(data, valuesArray, targetField, nameTransformer) {
let selected = valuesArray.includes(item.id) ? 'selected' : '';
console.log(item);
// console.log(item);
labelName = item.name
@@ -277,10 +243,74 @@ function updateIconPreview (inputId) {
}
// -----------------------------------------------------------------------------
// Generic function to copy text to clipboard
function copyToClipboard(buttonElement) {
const text = $(buttonElement).data('text');
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(() => {
showMessage('Copied to clipboard: ' + text, 1500);
}).catch(err => {
console.error('Failed to copy: ', err);
});
} else {
// Fallback to execCommand if Clipboard API is not available
const tempInput = document.createElement('input');
tempInput.value = text;
document.body.appendChild(tempInput);
tempInput.select();
try {
document.execCommand('copy');
showMessage('Copied to clipboard: ' + text, 1500);
} catch (err) {
console.error('Failed to copy: ', err);
}
document.body.removeChild(tempInput);
}
}
// -----------------------------------------------------------------------------
// initialize
// -----------------------------------------------------------------------------
initDeviceSelectors();
setTimeout(() => {
initDeviceSelectors();
// --------------------------------------------------------
//Initialize Select2 Elements and make them sortable
$(function () {
// Iterate over each Select2 dropdown
$('.select2').each(function() {
var selectEl = $(this).select2();
// Apply sortable functionality to the dropdown's dropdown-container
selectEl.next().children().children().children().sortable({
containment: 'parent',
update: function () {
var sortedValues = $(this).children().map(function() {
return $(this).attr('title');
}).get();
var sortedOptions = selectEl.find('option').sort(function(a, b) {
return sortedValues.indexOf($(a).text()) - sortedValues.indexOf($(b).text());
});
// Replace all options in selectEl
selectEl.empty().append(sortedOptions);
// Trigger change event on Select2
selectEl.trigger('change');
}
});
});
});
}, 500);
console.log("init ui_components.js")

1
front/lib/crypto/crypto-js.min.js vendored Executable file

File diff suppressed because one or more lines are too long

View File

@@ -311,6 +311,8 @@ $db->close();
<option value="16"><?= lang('Device_TableHead_Location');?></option>
<option value="17"><?= lang('Device_TableHead_Vendor');?></option>
<option value="18"><?= lang('Device_TableHead_Port');?></option>
<option value="19"><?= lang('Device_TableHead_GUID');?></option>
<option value="20"><?= lang('Device_TableHead_SyncHubNodeName');?></option>
</select>
<span class="input-group-addon"><i title="<?= lang('Gen_Save');?>" class="fa fa-save pointer" onclick="saveSelectedColumns();"></i></span>
</div>
@@ -327,37 +329,37 @@ $db->close();
<div class="tab-pane" id="tab_DBTools">
<div class="db_info_table">
<div class="db_info_table_row">
<div class="db_tools_table_cell_a" style="">
<div class="db_tools_table_cell_a" >
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteMAC" onclick="askDeleteDevicesWithEmptyMACs()"><?= lang('Maintenance_Tool_del_empty_macs');?></button>
</div>
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_empty_macs_text');?></div>
</div>
<div class="db_info_table_row">
<div class="db_tools_table_cell_a" style="">
<div class="db_tools_table_cell_a" >
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteMAC" onclick="askDeleteAllDevices()"><?= lang('Maintenance_Tool_del_alldev');?></button>
</div>
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_alldev_text');?></div>
</div>
<div class="db_info_table_row">
<div class="db_tools_table_cell_a" style="">
<div class="db_tools_table_cell_a" >
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteUnknown" onclick="askDeleteUnknown()"><?= lang('Maintenance_Tool_del_unknowndev');?></button>
</div>
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_unknowndev_text');?></div>
</div>
<div class="db_info_table_row">
<div class="db_tools_table_cell_a" style="">
<div class="db_tools_table_cell_a" >
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteEvents" onclick="askDeleteEvents()"><?= lang('Maintenance_Tool_del_allevents');?></button>
</div>
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_allevents_text');?></div>
</div>
<div class="db_info_table_row">
<div class="db_tools_table_cell_a" style="">
<div class="db_tools_table_cell_a" >
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteEvents30" onclick="askDeleteEvents30()"><?= lang('Maintenance_Tool_del_allevents30');?></button>
</div>
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_allevents30_text');?></div>
</div>
<div class="db_info_table_row">
<div class="db_tools_table_cell_a" style="">
<div class="db_tools_table_cell_a" >
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteActHistory" onclick="askDeleteActHistory()"><?= lang('Maintenance_Tool_del_ActHistory');?></button>
</div>
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_ActHistory_text');?></div>
@@ -367,31 +369,31 @@ $db->close();
<div class="tab-pane" id="tab_BackupRestore">
<div class="db_info_table">
<div class="db_info_table_row">
<div class="db_tools_table_cell_a" style="">
<div class="db_tools_table_cell_a" >
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnPiaBackupDBtoArchive" onclick="askPiaBackupDBtoArchive()"><?= lang('Maintenance_Tool_backup');?></button>
</div>
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_backup_text');?></div>
</div>
<div class="db_info_table_row">
<div class="db_tools_table_cell_a" style="">
<div class="db_tools_table_cell_a" >
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnPiaRestoreDBfromArchive" onclick="askPiaRestoreDBfromArchive()"><?= lang('Maintenance_Tool_restore');?><br><?php echo $latestbackup_date;?></button>
</div>
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_restore_text');?></div>
</div>
<div class="db_info_table_row">
<div class="db_tools_table_cell_a" style="">
<div class="db_tools_table_cell_a" >
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnPiaPurgeDBBackups" onclick="askPiaPurgeDBBackups()"><?= lang('Maintenance_Tool_purgebackup');?></button>
</div>
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_purgebackup_text');?></div>
</div>
<div class="db_info_table_row">
<div class="db_tools_table_cell_a" style="">
<div class="db_tools_table_cell_a" >
<button type="button" class="btn btn-default pa-btn bg-green dbtools-button" id="btnExportCSV" onclick="askExportCSV()"><?= lang('Maintenance_Tool_ExportCSV');?></button>
</div>
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_ExportCSV_text');?></div>
</div>
<div class="db_info_table_row">
<div class="db_tools_table_cell_a" style="">
<div class="db_tools_table_cell_a" >
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnImportCSV" onclick="askImportCSV()"><?= lang('Maintenance_Tool_ImportCSV');?></button>
</div>
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_ImportCSV_text');?></div>
@@ -467,6 +469,7 @@ $db->close();
<div class="row logs-row" >
<div>
<div class="log-file" title="/var/log/nginx/error.log">nginx/error.log</div>
<span class="span-padding"><a href="/var/log/nginx/error.log"><i class="fa fa-download"></i> </a></span>
</div>
</div>
</div>
@@ -922,8 +925,10 @@ function initializeTabs () {
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
var target = $(e.target).attr("href") // activated tab
});
hideSpinner();
}, 50);
}, 50);
}
@@ -948,8 +953,6 @@ window.onload = function asyncFooter()
</script>
<link rel="stylesheet" href="lib/AdminLTE/bower_components/select2/dist/css/select2.min.css">
<script src="lib/AdminLTE/bower_components/select2/dist/js/select2.full.min.js"></script>
<script src="lib/AdminLTE/bower_components/jquery-ui/jquery-ui.min.js"></script>

View File

@@ -3,25 +3,33 @@
<div class="col-md-12">
<div class="callout callout-warning">
<h4><?= lang('Gen_Warning');?></h4>
<p><?= lang('Device_MultiEdit_Backup');?></p>
</div>
<div class="box box-default">
<div class="box-header">
<h3 class="box-title"><?= lang('Gen_Selected_Devices');?></h3>
</div>
<div class="deviceSelector"></div>
</div>
<div class="deviceSelector col-md-9" style="z-index:5"></div>
<div class="callout callout-warning">
<h4><?= lang('Gen_Warning');?></h4>
<p><?= lang('Device_MultiEdit_Backup');?></p>
<div class="col-md-3">
<button type="button" class="btn btn-default" onclick="markAllSelected()">
<i class="fa-solid fa-circle-check"></i> <?= lang('Gen_Add_All');?>
</button>
<button type="button" class="btn btn-default" onclick="markAllNotSelected()">
<i class="fa-solid fa-circle-xmark"></i> <?= lang('Gen_Remove_All');?>
</button>
</div>
</div>
<div class="col-md-12">
<div class="box box-default">
@@ -65,7 +73,9 @@
// Get plugin and settings data from API endpoints
function getData(){
$.get('api/table_settings.json?nocache=' + Date.now(), function(res) {
// some race condition, need to implement delay
setTimeout(() => {
$.get('api/table_settings.json?nocache=' + Date.now(), function(res) {
settingsData = res["data"];
@@ -181,6 +191,9 @@
})
}, 500);
}
@@ -190,6 +203,39 @@
return $('.deviceSelector select').val().join(',');
}
// -----------------------------------------------------------------------------
// Select All
function markAllSelected() {
// Get the <select> element with the class 'deviceSelector'
var selectElement = $('.deviceSelector select');
// Iterate over each option within the select element
selectElement.find('option').each(function() {
// Mark each option as selected
$(this).prop('selected', true);
});
// Trigger the 'change' event to notify Bootstrap Select of the changes
selectElement.trigger('change');
}
// -----------------------------------------------------------------------------
// UN-Select All
function markAllNotSelected() {
// Get the <select> element with the class 'deviceSelector'
var selectElement = $('.deviceSelector select');
// Iterate over each option within the select element
selectElement.find('option').each(function() {
// Unselect each option
$(this).prop('selected', false);
});
// Trigger the 'change' event to notify Bootstrap Select of the changes
selectElement.trigger('change');
}
// -----------------------------------------------------------------------------
// Update specified field over the specified DB column and selected entry(ies)
@@ -210,7 +256,7 @@
columnValue = inputElement.is(':checked') ? 1 : 0;
} else {
// For other input types (like textboxes), simply retrieve their values
columnValue = inputElement.val();
columnValue = encodeURIComponent(inputElement.val());
}
var targetColumns = inputElement.attr('data-my-targetColumns');
@@ -244,6 +290,8 @@ function executeAction(action, whereColumnName, key, targetColumns, newTargetCol
// update API endpoints to refresh the UI
updateApi()
writeNotification(`[Multi edit] Executed "${action}" on Columns "${targetColumns}" matching "${key}"`, 'info')
} else {
showMessage(getString('Gen_LockedDB'));
}
@@ -267,9 +315,9 @@ function askDeleteSelectedDevices () {
// Delete selected devices
function deleteSelectedDevices()
{
executeAction('delete', 'dev_MAC', selectorMacs() )
macs_tmp = selectorMacs()
executeAction('delete', 'dev_MAC', macs_tmp )
writeNotification('[Multi edit] Manually deleted devices with MACs:' + macs_tmp, 'info')
}
@@ -279,8 +327,7 @@ getData();
</script>
<!-- ----------------------------------------------------------------------- -->
<script src="js/ui_components.js"></script>
<script src="js/db_methods.js"></script>
<!-- ----------------------------------------------------------------------- -->

View File

@@ -5,70 +5,190 @@
//
// db.php - Front module. Server side. DB common file
//------------------------------------------------------------------------------
# Puche 2021 / 2022+ jokob jokob@duck.com GNU GPLv3
# 2022 jokob jokob@duck.com GNU GPLv3
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// DB File Path
$DBFILE = dirname(__FILE__).'/../../../db/app.db';
$DBFILE_LOCKED_FILE = dirname(__FILE__).'/../../../front/log/db_is_locked.log';
$db_locked = false;
//------------------------------------------------------------------------------
// Connect DB
//------------------------------------------------------------------------------
function SQLite3_connect ($trytoreconnect) {
global $DBFILE;
try
{
// connect to database
// return new SQLite3($DBFILE, SQLITE3_OPEN_READONLY);
return new SQLite3($DBFILE, SQLITE3_OPEN_READWRITE);
}
catch (Exception $exception)
{
// sqlite3 throws an exception when it is unable to connect
// try to reconnect one time after 3 seconds
if($trytoreconnect)
{
echo '<script>alert("Error connecting to database, will try in 3s")</script>';
sleep(3);
return SQLite3_connect(false);
function SQLite3_connect($trytoreconnect = true, $retryCount = 0) {
global $DBFILE, $DBFILE_LOCKED_FILE;
$maxRetries = 5; // Maximum number of retries
$baseDelay = 1; // Base delay in seconds
try {
// Connect to database
global $db_locked;
$db_locked = false;
// Write unlock status to the locked file
file_put_contents($DBFILE_LOCKED_FILE, '0');
return new SQLite3($DBFILE, SQLITE3_OPEN_READWRITE);
} catch (Exception $exception) {
// sqlite3 throws an exception when it is unable to connect
global $db_locked;
$db_locked = true;
// Write lock status to the locked file
file_put_contents($DBFILE_LOCKED_FILE, '1');
error_log("Failed to connect to database: " . $exception->getMessage());
// Connection failed, check if we should retry
if ($trytoreconnect && $retryCount < $maxRetries) {
// Calculate exponential backoff delay
$delay = $baseDelay * pow(2, $retryCount);
sleep($delay);
// Retry the connection with an increased retry count
return SQLite3_connect(true, $retryCount + 1);
} else {
// Maximum retries reached, hide loading spinner and show failure alert
$message = 'Failed to connect to database after ' . $retryCount . ' retries.';
write_notification($message);
return false; // Or handle the failure appropriately
}
}
}
}
//------------------------------------------------------------------------------
// ->query override to handle retries
//------------------------------------------------------------------------------
class CustomDatabaseWrapper {
private $sqlite;
private $maxRetries;
private $retryDelay;
public function __construct($filename, $flags = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, $maxRetries = 10, $retryDelay = 1000, $encryptionKey = null) {
$this->sqlite = new SQLite3($filename, $flags, $encryptionKey);
$this->maxRetries = $maxRetries;
$this->retryDelay = $retryDelay;
}
public function query(string $query): SQLite3Result|bool {
global $DBFILE_LOCKED_FILE;
// Check if the query is an UPDATE, DELETE, or INSERT
$queryType = strtoupper(substr(trim($query), 0, strpos(trim($query), ' ')));
$isModificationQuery = in_array($queryType, ['UPDATE', 'DELETE', 'INSERT']);
$attempts = 0;
while ($attempts < $this->maxRetries) {
$result = false;
try {
$result = $this->sqlite->query($query);
} catch (Exception $exception) {
// continue unless maxRetries reached
if($attempts > $this->maxRetries)
{
throw $exception;
}
}
if ($result !== false and $result !== null) {
$this->query_log_remove($query);
return $result;
}
$this->query_log_add($query);
$attempts++;
usleep($this->retryDelay * 1000 * $attempts); // Retry delay in milliseconds
}
// If all retries failed, throw an exception or handle the error as needed
// Add '0' to indicate that the database is not locked/execution failed
file_put_contents($DBFILE_LOCKED_FILE, '0');
$message = 'Error executing query (attempts: ' . $attempts . '), query: ' . $query;
write_notification($message);
error_log("Query failed after {$this->maxRetries} attempts: " . $this->sqlite->lastErrorMsg());
}
public function query_log_add($query)
{
global $DBFILE_LOCKED_FILE;
// Remove new lines from the query
$query = str_replace(array("\r", "\n"), ' ', $query);
// Generate a hash of the query
$queryHash = md5($query);
// Log the query being attempted along with timestamp and query hash
$executionLog = "1|" . date('Y-m-d H:i:s') . "|$queryHash|$query";
error_log("Attempting to write '$executionLog' to execution log file after failed query: $query");
file_put_contents($DBFILE_LOCKED_FILE, $executionLog . PHP_EOL, FILE_APPEND);
error_log("Execution log file content after failed query attempt: " . file_get_contents($DBFILE_LOCKED_FILE));
}
public function query_log_remove($query)
{
global $DBFILE_LOCKED_FILE;
// Remove new lines from the query
$query = str_replace(array("\r", "\n"), ' ', $query);
// Generate a hash of the query
$queryHash = md5($query);
// Remove the entry corresponding to the finished query from the execution log based on query hash
$executionLogs = file($DBFILE_LOCKED_FILE, FILE_IGNORE_NEW_LINES);
$executionLogs = array_filter($executionLogs, function($log) use ($queryHash) {
return strpos($log, $queryHash) === false;
});
file_put_contents($DBFILE_LOCKED_FILE, implode(PHP_EOL, $executionLogs));
}
// Delegate other SQLite3 methods to the $sqlite instance
public function __call($name, $arguments) {
return call_user_func_array([$this->sqlite, $name], $arguments);
}
}
//------------------------------------------------------------------------------
// Open DB
//------------------------------------------------------------------------------
function OpenDB($DBPath = null) {
global $DBFILE;
global $db;
function OpenDB (...$DBPath) {
global $DBFILE;
global $db;
// Use custom path if supplied
if ($DBPath !== null) {
$DBFILE = $DBPath;
}
// use custom path if supplied
foreach ($DBPath as $path) {
$DBFILE = $path;
}
if(strlen($DBFILE) == 0)
{
echo '<script>alert("Database not available")</script>';
die ('<div style="padding-left:150px">Database not available</div>');
}
if (strlen($DBFILE) == 0) {
$message = 'Database not available';
echo '<script>alert('.$message.')</script>';
write_notification($message);
die('<div style="padding-left:150px">'.$message.'</div>');
}
$db = SQLite3_connect(true);
if(!$db)
{
echo '<script>alert("Error connecting to the database")</script>';
die ('<div style="padding-left:150px">Error connecting to the database</div>');
}
try {
$db = new CustomDatabaseWrapper($DBFILE);
} catch (Exception $e) {
$message = "Error connecting to the database";
echo '<script>alert('.$message.'": ' . $e->getMessage() . '")</script>';
write_notification($message);
die('<div style="padding-left:150px">'.$message.'</div>');
}
$db->exec('PRAGMA journal_mode = wal;');
$db->exec('PRAGMA journal_mode = wal;');
}
// # Open DB once and keep open
// # Opening / closing DB frequently actually casues more issues
OpenDB (); // main
// Open DB once and keep open
OpenDB(); // main
?>

View File

@@ -48,6 +48,10 @@
$id = $_REQUEST['id'];
}
if (isset ($_REQUEST['delay'])) {
$delay = $_REQUEST['delay'];
}
if (isset ($_REQUEST['values'])) {
$values = $_REQUEST['values'];
}
@@ -72,6 +76,7 @@
case 'read' : read($rawSql); break;
case 'update': update($columnName, $id, $defaultValue, $expireMinutes, $dbtable, $columns, $values); break;
case 'delete': delete($columnName, $id, $dbtable); break;
case 'lockDatabase': lockDatabase($delay); break;
default: logServerConsole ('Action: '. $action); break;
}
}
@@ -263,5 +268,11 @@ function delete($columnName, $id, $dbtable)
}
// Simulate database locking by starting a transaction
function lockDatabase($delay) {
$db = new SQLite3($GLOBALS['DBFILE']);
$db->exec('BEGIN EXCLUSIVE;');
sleep($delay); // Sleep for N seconds to simulate long-running transaction
}
?>

View File

@@ -26,11 +26,8 @@
case 'setDeviceData': setDeviceData(); break;
case 'deleteDevice': deleteDevice(); break;
case 'deleteAllWithEmptyMACs': deleteAllWithEmptyMACs(); break;
case 'createBackupDB': createBackupDB(); break;
case 'deleteAllDevices': deleteAllDevices(); break;
case 'runScan15min': runScan15min(); break;
case 'runScan1min': runScan1min(); break;
case 'deleteUnknownDevices': deleteUnknownDevices(); break;
case 'deleteEvents': deleteEvents(); break;
case 'deleteEvents30': deleteEvents30(); break;
@@ -593,7 +590,9 @@ function getDevicesList() {
array("connected_devices", 15, 15),
array("dev_Location", 16, 16),
array("dev_Vendor", 17, 17),
array("dev_Network_Node_port", 18, 18)
array("dev_Network_Node_port", 18, 18),
array("dev_GUID", 19, 19),
array("dev_SyncHubNodeName", 20, 20)
);
if($forceDefaultOrder == FALSE)
@@ -662,7 +661,9 @@ function getDevicesList() {
handleNull($row['connected_devices']),
handleNull($row['dev_Location']),
handleNull($row['dev_Vendor']),
handleNull($row['dev_Network_Node_port'])
handleNull($row['dev_Network_Node_port']),
handleNull($row['dev_GUID']),
handleNull($row['dev_SyncHubNodeName'])
);
$newOrder = array();

View File

@@ -105,7 +105,7 @@ function getEvents() {
$periodDate = getDateFromPeriod();
// SQL
$SQL1 = 'SELECT eve_DateTime AS eve_DateTimeOrder, dev_name, dev_owner, eve_DateTime, eve_EventType, NULL, NULL, NULL, NULL, eve_IP, NULL, eve_AdditionalInfo, NULL, Dev_MAC
$SQL1 = 'SELECT eve_DateTime AS eve_DateTimeOrder, dev_name, dev_owner, eve_DateTime, eve_EventType, NULL, NULL, NULL, NULL, eve_IP, NULL, eve_AdditionalInfo, NULL, Dev_MAC, eve_PendingAlertEmail
FROM Events_Devices
WHERE eve_DateTime >= '. $periodDate;

View File

@@ -1,6 +1,8 @@
<?php
ini_set('error_log', '../../log/app.php_errors.log'); // initializing the app.php_errors.log file for the maintenance section
require dirname(__FILE__).'/../templates/timezone.php';
require dirname(__FILE__).'/db.php';
require dirname(__FILE__).'/util.php';
require dirname(__FILE__).'/../templates/language/lang.php';
require dirname(__FILE__).'/utilNotification.php';
?>

View File

@@ -327,8 +327,15 @@ function saveSettings()
$settingType = $setting[2];
$settingValue = $setting[3];
// sanity check
if($settingKey == "UI_LANG" && $settingValue == "")
{
echo "🔴 Error: important settings missing. Refresh the page with 🔃 on the top and try again.";
return;
}
if ($group == $settingGroup) {
if ($settingType == 'text' || $settingType == 'password' || $settingType == 'readonly' || $settingType == 'text.select') {
if ($settingType == 'text' || $settingType == 'password' || $settingType == 'password.SHA256' || $settingType == 'readonly' || $settingType == 'text.select') {
$val = encode_single_quotes($settingValue);
$txt .= $settingKey . "='" . $val . "'\n";
} elseif ($settingType == 'integer' || $settingType == 'integer.select') {
@@ -342,7 +349,7 @@ function saveSettings()
}
$txt .= $settingKey . "=" . $val . "\n";
} elseif ($settingType == 'text.multiselect' || $settingType == 'subnets' || $settingType == 'list') {
} elseif ($settingType == 'text.multiselect' || $settingType == 'subnets' || $settingType == 'list' || $settingType == 'list.select') {
$temp = '';
if(is_array($settingValue) == FALSE)
@@ -387,8 +394,10 @@ function saveSettings()
// Replace the original file with the temporary file
rename($tempConfPath, $fullConfPath);
displayMessage("<br/>Settings saved to the <code>app.conf</code> file.<br/><br/>A time-stamped backup of the previous file created. <br/><br/> Reloading...<br/>",
FALSE, TRUE, TRUE, TRUE);
// displayMessage(lang('settings_saved'),
// FALSE, TRUE, TRUE, TRUE);
echo "OK";
}
@@ -535,7 +544,10 @@ function getDevicesColumns(){
"dev_Archived",
"dev_Network_Node_port",
"dev_Network_Node_MAC_ADDR",
"dev_Icon"];
"dev_Icon",
"dev_GUID",
"dev_SyncHubNodeName"
];
return $columns;
}

View File

@@ -0,0 +1,184 @@
<?php
require dirname(__FILE__).'/../templates/timezone.php';
// Check if the action parameter is set in the GET request
if (isset($_GET['action'])) {
// Collect GUID if provided
$guid = isset($_GET['guid']) ? $_GET['guid'] : null;
// Perform the appropriate action based on the action parameter
switch ($_GET['action']) {
case 'write_notification':
// Call the write_notification function with content and level parameters
if (isset($_GET['content'])) {
$content = $_GET['content'];
$level = isset($_GET['level']) ? $_GET['level'] : "interrupt";
write_notification($content, $level);
}
break;
case 'remove_notification':
// Call the remove_notification function with guid parameter
if ($guid) {
remove_notification($guid);
}
break;
case 'mark_notification_as_read':
// Call the mark_notification_as_read function with guid parameter
if ($guid) {
mark_notification_as_read($guid);
}
break;
case 'notifications_clear':
// Call the notifications_clear function
notifications_clear();
break;
case 'notifications_mark_all_read':
// Call the notifications_mark_all_read function
notifications_mark_all_read();
break;
case 'get_unread_notifications':
// Call the get_unread_notifications function
get_unread_notifications();
break;
}
}
function generate_guid() {
if (function_exists('com_create_guid') === true) {
return trim(com_create_guid(), '{}');
}
return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X',
mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535),
mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535),
mt_rand(0, 65535), mt_rand(0, 65535));
}
function write_notification($content, $level = "interrupt") {
$NOTIFICATION_API_FILE = '/app/front/api/user_notifications.json';
// Generate GUID
$guid = generate_guid();
// Generate timestamp
$timestamp = (new DateTime('now'))->format('Y-m-d H:i:s');
// Escape content to prevent breaking JSON
$escaped_content = json_encode($content);
// Prepare notification array
$notification = array(
'timestamp' => $timestamp,
'guid' => $guid,
'read' => 0,
'level'=> $level,
'content' => $escaped_content,
);
// Read existing notifications
$notifications = json_decode(file_get_contents($NOTIFICATION_API_FILE), true);
// Add new notification
$notifications[] = $notification;
// Write notifications to file
file_put_contents($NOTIFICATION_API_FILE, json_encode($notifications));
}
function remove_notification($guid) {
$NOTIFICATION_API_FILE = '/app/front/api/user_notifications.json';
// Read existing notifications
$notifications = json_decode(file_get_contents($NOTIFICATION_API_FILE), true);
// Filter out the notification with the specified GUID
$filtered_notifications = array_filter($notifications, function($notification) use ($guid) {
return $notification['guid'] !== $guid;
});
// Write filtered notifications back to file
file_put_contents($NOTIFICATION_API_FILE, json_encode(array_values($filtered_notifications)));
}
function notifications_clear() {
$NOTIFICATION_API_FILE = '/app/front/api/user_notifications.json';
// Clear notifications by writing an empty array to the file
file_put_contents($NOTIFICATION_API_FILE, json_encode(array()));
}
function mark_notification_as_read($guid) {
$NOTIFICATION_API_FILE = '/app/front/api/user_notifications.json';
$max_attempts = 3;
$attempts = 0;
do {
// Check if the file exists and is readable
if (file_exists($NOTIFICATION_API_FILE) && is_readable($NOTIFICATION_API_FILE)) {
// Attempt to read existing notifications
$notifications = json_decode(file_get_contents($NOTIFICATION_API_FILE), true);
// Check if reading was successful
if ($notifications !== null) {
// Iterate over notifications to find the one with the specified GUID
foreach ($notifications as &$notification) {
if ($notification['guid'] === $guid) {
// Mark the notification as read
$notification['read'] = 1;
break;
} elseif ($guid == null) // no guid given, mark all read
{
$notification['read'] = 1;
}
}
// Write updated notifications back to file
file_put_contents($NOTIFICATION_API_FILE, json_encode($notifications));
return; // Exit the function after successful operation
}
}
// Increment the attempt count
$attempts++;
// Sleep for a short duration before retrying
usleep(500000); // Sleep for 0.5 seconds (500,000 microseconds) before retrying
} while ($attempts < $max_attempts);
// If maximum attempts reached or file reading failed, handle the error
echo "Failed to read notification file after $max_attempts attempts.";
}
function notifications_mark_all_read() {
mark_notification_as_read(null);
}
function get_unread_notifications() {
$NOTIFICATION_API_FILE = '/app/front/api/user_notifications.json';
// Read existing notifications
if (file_exists($NOTIFICATION_API_FILE) && is_readable($NOTIFICATION_API_FILE)) {
$notifications = json_decode(file_get_contents($NOTIFICATION_API_FILE), true);
if ($notifications !== null) {
// Filter unread notifications
$unread_notifications = array_filter($notifications, function($notification) {
return $notification['read'] === 0;
});
// Return unread notifications as JSON
header('Content-Type: application/json');
echo json_encode(array_values($unread_notifications));
} else {
echo json_encode([]);
}
} else {
echo json_encode([]);
}
}
?>

View File

@@ -22,7 +22,7 @@
<!-- To the right -->
<div class="pull-right no-hidden-xs">
| <a href="https://github.com/jokob-sk/NetAlertX/tree/main/docs" target="_blank">Docs <i class="fa fa-circle-question"></i></a>
| <a href="https://github.com/jokob-sk/NetAlertX/tree/main/docs#documentation-overview" target="_blank">Docs <i class="fa fa-circle-question"></i></a>
| <a href="https://github.com/jokob-sk/NetAlertX/issues"><i class="fa-solid fa-bug"></i></a>
| <a href="https://github.com/jokob-sk/NetAlertX/"><i class="fa-brands fa-github"></i></a>
| <a href="mailto:jokob@duck.com?subject=NetAlertX"><i class="fa-solid fa-envelope"></i></a>
@@ -41,23 +41,25 @@
<!-- ./wrapper -->
<!-- Bootstrap 3.3.7 -->
<script src="lib/AdminLTE/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
<script src="lib/AdminLTE/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
<!-- jQuery UI -->
<script src="lib/AdminLTE/bower_components/jquery-ui/jquery-ui.min.js"></script>
<!-- AdminLTE App -->
<script src="lib/AdminLTE/dist/js/adminlte.min.js"></script>
<script src="lib/AdminLTE/dist/js/adminlte.min.js"></script>
<!-- Optionally, you can add Slimscroll and FastClick plugins.
Both of these plugins are recommended to enhance the
user experience. -->
<!-- Select2 CSS -->
<link rel="stylesheet" href="lib/AdminLTE/bower_components/select2/dist/css/select2.min.css">
<!-- SlimScroll -->
<!-- <script src="lib/AdminLTE/bower_components/jquery-slimscroll/jquery.slimscroll.min.js"></script> -->
<!-- FastClick -->
<!-- <script src="lib/AdminLTE/bower_components/fastclick/lib/fastclick.js"></script> -->
<!-- NetAlertX -->
<script src="js/handle_version.js"></script>
<script src="js/ui_components.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<script src="js/db_methods.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<!-- NetAlertX -------------------------------------------------------------- -->
<!-- Select2 JavaScript -->
<script src="lib/AdminLTE/bower_components/select2/dist/js/select2.full.min.js" defer></script>
<script src="js/handle_version.js"></script>
<?php
require 'migrationCheck.php';

View File

@@ -21,7 +21,7 @@ require dirname(__FILE__).'/security.php';
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="apple-mobile-web-app-capable" content="yes" />
<title>Net Alert - <?php echo gethostname();?></title>
<title>NetAlertX - <?php echo gethostname();?></title>
<!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
@@ -30,7 +30,9 @@ require dirname(__FILE__).'/security.php';
<!-- jQuery 3 -->
<script src="lib/AdminLTE/bower_components/jquery/dist/jquery.min.js"></script>
<script src="js/common.js"></script>
<script src="js/common.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<script src="js/modal.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<script src="js/tests.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<!-- Bootstrap 3.3.7 -->
<link rel="stylesheet" href="lib/AdminLTE/bower_components/bootstrap/dist/css/bootstrap.min.css">
@@ -56,17 +58,11 @@ require dirname(__FILE__).'/security.php';
<!-- NetAlertX CSS -->
<link rel="stylesheet" href="css/app.css">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- Google Font -->
<!-- <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic"> -->
<link rel="stylesheet" href="css/offline-font.css">
<link rel="icon" type="image/x-icon" href="img/NetAlertX_logo.png">
<link id="favicon" rel="icon" type="image/x-icon" href="img/NetAlertX_logo.png">
<!-- For better UX on Mobile Devices using the Shortcut on the Homescreen -->
<link rel="manifest" href="img/manifest.json">
@@ -130,7 +126,7 @@ if ($ENABLED_DARKMODE === True) {
<img src="img/NetAlertX_logo.png" class="pia-top-left-logo" alt="NetAlertX Logo"/>
</span>
<!-- logo for regular state and mobile devices -->
<span class="logo-lg">Net <b>Alert</b><sup>x</sup>
<span class="logo-lg">Net<b>Alert</b><sup>x</sup>
</span>
@@ -152,19 +148,24 @@ if ($ENABLED_DARKMODE === True) {
<ul class="nav navbar-nav">
<!-- Back Button -->
<li>
<a id="back-button" href="javascript:history.go(-1);" role="button" span class='of-bt-icon'><i class='fa fa-arrow-left'></i></a>
<a id="back-button" href="javascript:history.go(-1);" role="button" span class='fa fa-arrow-left'></a>
</li>
<!-- Next Button -->
<li>
<a id="next-button" href="javascript:history.go(1);" role="button" span class='of-bt-icon'><i class='fa fa-arrow-right'></i></a>
<a id="next-button" href="javascript:history.go(1);" role="button" span class='fa fa-arrow-right'></a>
</li>
<!-- Clear cache & Reload -->
<li>
<a id="reload-button" href='#' role="button" span class='of-bt-icon' onclick='clearCache()'><i class='fa fa-repeat'></i></a>
<a id="reload-button" href='#' role="button" span class='fa fa-repeat' onclick='clearCache()'></a>
</li>
<!-- Full Screen -->
<li>
<a id="fullscreen-button" href='#' role="button" span class='of-bt-icon' onclick='toggleFullscreen()'><i class='fa fa-arrows-alt'></i></a>
<a id="fullscreen-button" href='#' role="button" span class='fa fa-arrows-alt' onclick='toggleFullscreen()'></a>
</li>
<!-- Full Screen -->
<li>
<a id="notifications-button" href='userNotifications.php' role="button" span class='fa-solid fa-bell'></a>
<span id="unread-notifications-bell-count" title="" class="badge bg-red unread-notifications-bell" >0</span>
</li>
<!-- Server Status -->
<li>
@@ -172,6 +173,9 @@ if ($ENABLED_DARKMODE === True) {
<div class="header-status">
<code id="state"></code>
</div>
<div class="header-status-locked-db">
<i class="fa-solid fa-database fa-fade"></i>
</div>
</a>
</li>
<!-- Server Name -->
@@ -184,11 +188,11 @@ if ($ENABLED_DARKMODE === True) {
<!-- Header right info -->
<li class="dropdown user user-menu">
<!-- Menu Toggle Button -->
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<!-- The user image in the navbar-->
<a href="#" class="dropdown-toggle" style=" height: 50px;" data-toggle="dropdown">
<span class="hidden-xs" ><!-- The user image in the navbar-->
<img src="img/NetAlertX_logo.png" class="user-image" style="border-radius: initial" alt="NetAlertX Logo">
<!-- hidden-xs hides the username on small devices so only the image appears. -->
<span class="hidden-xs">Net <b>Alert</b><sup>x</sup></span>
<!-- hidden-xs hides the username on small devices so only the image appears. --></span>
</a>
<ul class="dropdown-menu">
<!-- The user image in the menu -->
@@ -253,10 +257,10 @@ if ($ENABLED_DARKMODE === True) {
<a href="devices.php#new" onclick="initializeDatatable('new')" > <?= lang("Device_Shortcut_NewDevices");?> </a>
</li>
<li>
<a href="devices.php#down" onclick="initializeDatatable('down')" > <?= lang("Device_Shortcut_DownAlerts");?> </a>
<a href="devices.php#down" onclick="initializeDatatable('down')" > <?= lang("Device_Shortcut_DownOnly");?> </a>
</li>
<li>
<a href="devices.php#down_only" onclick="initializeDatatable('down_only')" > <?= lang("Device_Shortcut_DownOnly");?> </a>
<a href="devices.php#offline" onclick="initializeDatatable('offline')" > <?= lang("Gen_Offline");?> </a>
</li>
<li>
<a href="devices.php#archived" onclick="initializeDatatable('archived')" > <?= lang("Device_Shortcut_Archived");?> </a>
@@ -267,14 +271,14 @@ if ($ENABLED_DARKMODE === True) {
<!-- Monitoring menu item -->
<li class=" treeview <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('presence.php', 'report.php', 'events.php' ) ) ){ echo 'active menu-open'; } ?>">
<li class=" treeview <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('presence.php', 'report.php', 'events.php', 'userNotifications.php' ) ) ){ echo 'active menu-open'; } ?>">
<a href="#">
<i class="fa fa-fw fa-chart-bar"></i> <span><?= lang('Navigation_Monitoring');?></span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu " style="display: <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('presence.php', 'report.php', 'events.php' ) ) ){ echo 'block'; } else {echo 'none';} ?>;">
<ul class="treeview-menu " style="display: <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('presence.php', 'report.php', 'events.php', 'userNotifications.php' ) ) ){ echo 'block'; } else {echo 'none';} ?>;">
<li>
<a href="presence.php"> <?= lang("Navigation_Presence");?> </a>
</li>
@@ -284,6 +288,9 @@ if ($ENABLED_DARKMODE === True) {
<li>
<a href="report.php"> <?= lang("Navigation_Report");?> </a>
</li>
<li>
<a href="userNotifications.php"> <?= lang("Navigation_Notifications");?> </a>
</li>
</ul>
</li>

View File

@@ -25,13 +25,13 @@
"AppEvents_ObjectIsArchived": "Ist archiviert (Zum Protokoll Zeitpunkt)",
"AppEvents_ObjectIsNew": "Ist neu (Zum Protokoll Zeitpunkt)",
"AppEvents_ObjectPlugin": "Verkn\u00fcpfte Plugins",
"AppEvents_ObjectPrimaryID": "",
"AppEvents_ObjectSecondaryID": "",
"AppEvents_ObjectPrimaryID": "Prim\u00e4r ID",
"AppEvents_ObjectSecondaryID": "Sekund\u00e4r ID",
"AppEvents_ObjectStatus": "",
"AppEvents_ObjectStatusColumn": "",
"AppEvents_ObjectType": "",
"AppEvents_Plugin": "",
"AppEvents_Type": "",
"AppEvents_ObjectType": "Objekttyp",
"AppEvents_Plugin": "Plugin",
"AppEvents_Type": "Typ",
"Apprise_display_name": "Apprise",
"Apprise_icon": "<i class=\"fa fa-bullhorn\"></i>",
"BackDevDetail_Actions_Ask_Run": "Do you want to execute the action?",
@@ -50,9 +50,9 @@
"BackDevices_DBTools_DelActHistoryError": "Fehler beim Zur\u00fccksetzen der Netzwerkaktivit\u00e4tsanzeige.",
"BackDevices_DBTools_DelDevError_a": "Fehler beim L\u00f6schen des Ger\u00e4tes.",
"BackDevices_DBTools_DelDevError_b": "Fehler beim L\u00f6schen der Ger\u00e4te.",
"BackDevices_DBTools_DelDev_a": "Ger\u00e4t erfolgreich gel\u00f6scht.",
"BackDevices_DBTools_DelDev_b": "Ger\u00e4te erfolgreich gel\u00f6scht.",
"BackDevices_DBTools_DelEvents": "Events erfolgreich gel\u00f6scht.",
"BackDevices_DBTools_DelDev_a": "Ger\u00e4t gel\u00f6scht.",
"BackDevices_DBTools_DelDev_b": "Ger\u00e4te gel\u00f6scht.",
"BackDevices_DBTools_DelEvents": "Events gel\u00f6scht.",
"BackDevices_DBTools_DelEventsError": "Fehler beim L\u00f6schen der Ereignisse.",
"BackDevices_DBTools_ImportCSV": "Die Ger\u00e4te aus der CSV-Datei wurden erfolgreich importiert.",
"BackDevices_DBTools_ImportCSVError": "Die CSV-Datei konnte nicht importiert werden. Stellen Sie sicher, dass das Format korrekt ist.",
@@ -175,13 +175,13 @@
"DevDetail_Tab_Tools_Traceroute_Title": "Traceroute",
"DevDetail_Tools_WOL": "Sende Wol Befehl an ",
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
"DevDetail_Tools_WOL_noti_text": "Der Wake-on-LAN Befehl wurd and die Broadcast Adresse gesendet. Wenn sich das zu startende Ger\u00e4t nicht im gleichen Subnet/vlan wie Pi.Alert befindet, wird das Ger\u00e4t nicht reagieren.",
"DevDetail_Tools_WOL_noti_text": "Der Wake-on-LAN Befehl wurde and die Broadcast Adresse gesendet. Wenn sich das zu startende Ger\u00e4t nicht im gleichen Subnet / VLan wie NetAlertX befindet, wird das Ger\u00e4t nicht reagieren.",
"DevDetail_Type_hover": "Der Type des Ger\u00e4tes. If you select any of the pre-defined network devices (e.g.: AP, Firewall, Router, Switch...) they will show up in the Network tree configuration as possible parent network nodes.",
"DevDetail_Vendor_hover": "Vendor should be auto-detected. You can overwrite or add your custom value.",
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
"DevDetail_button_AddIcon": "",
"DevDetail_button_AddIcon_Help": "",
"DevDetail_button_AddIcon_Tooltip": "",
"DevDetail_button_AddIcon": "Neues Symbol Hinzuf\u00fcgen",
"DevDetail_button_AddIcon_Help": "F\u00fcge ein HTML SVG Tag oder Font Awesome HTML Tag ein. Siehe <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">Icon Dokumentation</a> f\u00fcr details.",
"DevDetail_button_AddIcon_Tooltip": "Neues Icon zu diesem Ger\u00e4t hinzuf\u00fcgen, welches es noch nicht im dropdown gibt.",
"DevDetail_button_Delete": "L\u00f6sche Ger\u00e4t",
"DevDetail_button_DeleteEvents": "L\u00f6sche Events",
"DevDetail_button_DeleteEvents_Warning": "Sind Sie sicher, dass Sie alle Ereignisse dieses Ger\u00e4ts l\u00f6schen m\u00f6chten? (dies l\u00f6scht den Ereignisverlauf und die Sitzungen und k\u00f6nnte bei st\u00e4ndigen (anhaltenden) Benachrichtigungen helfen)",
@@ -190,24 +190,25 @@
"DevDetail_button_OverwriteIcons_Warning": "Are you sure you want to overwrite all icons of all devices with the same device type as the current device type?",
"DevDetail_button_Reset": "Verwerfen",
"DevDetail_button_Save": "Speichern",
"Device_MultiEdit": "",
"Device_MultiEdit": "Mehrfach-bearbeiten",
"Device_MultiEdit_Backup": "",
"Device_MultiEdit_Fields": "",
"Device_MultiEdit_MassActions": "",
"Device_MultiEdit_Fields": "Felder bearbeiten:",
"Device_MultiEdit_MassActions": "Massen aktionen:",
"Device_MultiEdit_Tooltip": "",
"Device_Searchbox": "Suche",
"Device_Shortcut_AllDevices": "Alle Ger\u00e4te",
"Device_Shortcut_AllDevices": "Meine Ger\u00e4te",
"Device_Shortcut_Archived": "Archiviert",
"Device_Shortcut_Connected": "Verbunden",
"Device_Shortcut_Devices": "Ger\u00e4te",
"Device_Shortcut_DownAlerts": "Down Meldungen",
"Device_Shortcut_DownOnly": "",
"Device_Shortcut_DownAlerts": "Offline & Nicht erreichbar",
"Device_Shortcut_DownOnly": "Offline",
"Device_Shortcut_Favorites": "Favoriten",
"Device_Shortcut_NewDevices": "Neue Ger\u00e4te",
"Device_Shortcut_OnlineChart": "Ger\u00e4tepr\u00e4senz im Laufe der Zeit",
"Device_TableHead_Connected_Devices": "Verbundene Ger\u00e4te",
"Device_TableHead_Favorite": "Favorit",
"Device_TableHead_FirstSession": "Erste Sitzung",
"Device_TableHead_GUID": "",
"Device_TableHead_Group": "Gruppe",
"Device_TableHead_Icon": "Icon",
"Device_TableHead_LastIP": "Letzte IP",
@@ -220,9 +221,10 @@
"Device_TableHead_Owner": "Eigent\u00fcmer",
"Device_TableHead_Parent_MAC": "\u00dcbergeordnete MAC",
"Device_TableHead_Port": "Port",
"Device_TableHead_RowID": "",
"Device_TableHead_RowID": "Zeilen ID",
"Device_TableHead_Rowid": "Zeilennummer",
"Device_TableHead_Status": "Status",
"Device_TableHead_SyncHubNodeName": "",
"Device_TableHead_Type": "Typ",
"Device_TableHead_Vendor": "Hersteller",
"Device_Table_Not_Network_Device": "Nicht konfiguriert als Netzwerkger\u00e4t",
@@ -266,6 +268,7 @@
"Events_TableHead_IPOrder": "IP Order",
"Events_TableHead_Order": "Order",
"Events_TableHead_Owner": "Eigent\u00fcmer",
"Events_TableHead_PendingAlert": "",
"Events_Table_info": "Zeige _START_ bis _END_ von _TOTAL_ Eintr\u00e4gen",
"Events_Table_nav_next": "N\u00e4chste",
"Events_Table_nav_prev": "Zur\u00fcck",
@@ -273,6 +276,8 @@
"Events_Tablelenght_all": "Alle",
"Events_Title": "Ereignisse",
"Gen_Action": "Action",
"Gen_Add": "",
"Gen_Add_All": "",
"Gen_AreYouSure": "Sind Sie sich sicher?",
"Gen_Backup": "Sichern",
"Gen_Cancel": "Abbrechen",
@@ -280,21 +285,28 @@
"Gen_DataUpdatedUITakesTime": "OK - It may take a while for the UI to update if a scan is runnig",
"Gen_Delete": "L\u00f6schen",
"Gen_DeleteAll": "Delete all",
"Gen_Error": "",
"Gen_Error": "Fehler",
"Gen_Filter": "",
"Gen_LockedDB": "ERROR - DB eventuell gesperrt - Nutze die Konsole in den Entwickler Werkzeugen (F12) zur \u00dcberpr\u00fcfung oder probiere es sp\u00e4ter erneut.",
"Gen_Offline": "",
"Gen_Okay": "Ok",
"Gen_Purge": "Aufr\u00e4umen",
"Gen_ReadDocs": "Mehr in der Dokumentation",
"Gen_Remove_All": "",
"Gen_Remove_Last": "",
"Gen_Restore": "Wiederherstellen",
"Gen_Run": "Run",
"Gen_Save": "Speichern",
"Gen_Saved": "Gespeichert",
"Gen_Selected_Devices": "",
"Gen_Search": "",
"Gen_Selected_Devices": "Ausgew\u00e4hlte Ger\u00e4te:",
"Gen_Switch": "Umschalten",
"Gen_Upd": "Aktualisierung erfolgreich",
"Gen_Upd_Fail": "Aktualisierung fehlgeschlagen",
"Gen_Warning": "",
"Gen_Work_In_Progress": "",
"Gen_Update": "",
"Gen_Update_Value": "",
"Gen_Warning": "Warnung",
"Gen_Work_In_Progress": "Keine Finalversion, feedback bitte unter: https://github.com/jokob-sk/NetAlertX/issues",
"General_display_name": "Allgemein",
"General_icon": "<i class=\"fa fa-gears\"></i>",
"HRS_TO_KEEP_NEWDEV_description": "Dies ist eine Wartungseinstellung. Ger\u00e4te markiert als <b>Neues Ger\u00e4t</b> werden gel\u00f6scht, wenn ihre <b>Erste Sitzung</b> l\u00e4nger her ist als die angegebenen Stunden in dieser Einstellung. <code>0</code> deaktiviert diese Funktion. Nutzen Sie diese Einstellung, um <b>Neue Ger\u00e4te</b> automatisch nach <code>X</code> Stunden zu l\u00f6schen.",
@@ -302,17 +314,17 @@
"HelpFAQ_Cat_Detail": "Detailansicht",
"HelpFAQ_Cat_Detail_300_head": "Was bedeutet ",
"HelpFAQ_Cat_Detail_300_text_a": "meint ein Netzwerkger\u00e4t (welches den typ AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router,USB LAN Adapter, USB WIFI Adapter, or Internet eingestellt hat)",
"HelpFAQ_Cat_Detail_300_text_b": "bezeichnet die Anschlussnummer/Portnummer, an der das gerade bearbeitete Ger\u00e4t mit diesem Netzwerkger\u00e4t verbunden ist.",
"HelpFAQ_Cat_Detail_300_text_b": "bezeichnet die Anschlussnummer/Portnummer, an der das gerade bearbeitete Ger\u00e4t mit diesem Netzwerkger\u00e4t verbunden ist. Siehe <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">diese Dokumentation</a> f\u00fcr mehr informationen.",
"HelpFAQ_Cat_Detail_301_head_a": "Wann wird nun gescannt? Bei ",
"HelpFAQ_Cat_Detail_301_head_b": " steht 1min aber der Graph zeigt 5min - Abst\u00e4nde an.",
"HelpFAQ_Cat_Detail_301_text": "Den zeitlichen Abstand zwischen den Scans legt der \"Cronjob\" fest, welcher standardm\u00e4\u00dfig auf 5min eingestellt ist. Die Benennung \"1min\" bezieht sich auf die zu erwartende Dauer des Scans. Abh\u00e4ngig vor der Netzwerkkonfiguration kann diese Zeitangabe variieren. Um den Cronjob zu bearbeiten, kannst du im Terminal/der Konsole <span class=\"text-danger help_faq_code\">crontab -e</span> eingeben und den Intervall \u00e4ndern.",
"HelpFAQ_Cat_Detail_302_head_a": "Was bedeutet ",
"HelpFAQ_Cat_Detail_302_head_b": " und warum kann ich das nicht ausw\u00e4hlen?",
"HelpFAQ_Cat_Detail_302_text": "Einige moderne Ger\u00e4te generieren aus Datenschutzgr\u00fcnden zuf\u00e4llige MAC-Adressen, die keinem Hersteller mehr zugeordnet werden k\u00f6nnen und welche sich mit jeder neuen Verbindung \u00e4ndern. Pi.Alert erkennt, ob es sich um eine solche zuf\u00e4llige MAC-Adresse handelt und aktiviert dieses \"Feld\" automatisch. Um das Verhalten abzustellen, musst du in deinem Endger\u00e4t schauen, wie du die MAC-Adressen-Generierung deaktivierst.",
"HelpFAQ_Cat_Detail_302_text": "Einige moderne Ger\u00e4te generieren aus Datenschutzgr\u00fcnden zuf\u00e4llige MAC-Adressen, die keinem Hersteller mehr zugeordnet werden k\u00f6nnen und welche sich mit jeder neuen Verbindung \u00e4ndern. NetAlertX erkennt, ob es sich um eine solche zuf\u00e4llige MAC-Adresse handelt und aktiviert dieses \"Feld\" automatisch. Um das Verhalten abzustellen, musst du in deinem Endger\u00e4t schauen, wie du die MAC-Adressen-Generierung deaktivierst.",
"HelpFAQ_Cat_Detail_303_head": "Was ist Nmap und wozu dient es?",
"HelpFAQ_Cat_Detail_303_text": "Nmap ist ein Netzwerkscanner mit vielf\u00e4ltigen M\u00f6glichkeiten.<br> Wenn ein neues Ger\u00e4t in deiner Liste auftaucht, hast du die M\u00f6glichkeit \u00fcber den Nmap-Scan genauere Informationen \u00fcber das Ger\u00e4t zu erhalten.",
"HelpFAQ_Cat_Device_200_head": "Ich habe, mir nicht bekannte, Ger\u00e4te in meiner Liste. Nach dem L\u00f6schen tauchen diese immer wieder auf.",
"HelpFAQ_Cat_Device_200_text": "Wenn du Pi-hole verwendest, beachte bitte, dass Pi.Alert Informationen von Pi-hole abruft. Pausiere Pi.Alert, gehe in Pi-hole auf die Settings-Seite und l\u00f6sche ggf. die betreffende DHCP-Lease. Anschlie\u00dfend schaue, ebenfalls in Pi-hole, unter Tools -> Network, ob sich dort die immer wiederkehrenden Hosts finden lassen. Wenn ja, l\u00f6sche diese dort ebenfalls. Nun kannst du Pi.Alert wieder starten. Jetzt sollte das Ger\u00e4t/die Ger\u00e4te nicht mehr auftauchen.",
"HelpFAQ_Cat_Device_200_text": "Wenn du Pi-hole verwendest, beachte bitte, dass NetAlertX Informationen von Pi-hole abruft. Pausiere NetAlertX, gehe in Pi-hole auf die Settings-Seite und l\u00f6sche ggf. die betreffende DHCP-Lease. Anschlie\u00dfend schaue, ebenfalls in Pi-hole, unter Tools -> Network, ob sich dort die immer wiederkehrenden Hosts finden lassen. Wenn ja, l\u00f6sche diese dort ebenfalls. Nun kannst du NetAlertX wieder starten. Jetzt sollte das Ger\u00e4t/die Ger\u00e4te nicht mehr auftauchen.",
"HelpFAQ_Cat_General": "Allgemein",
"HelpFAQ_Cat_General_100_head": "Die Uhr oben rechts und die Zeiten der Events/Anwesenheit stimmen nicht \u00fcberein (Zeitverschiebung).",
"HelpFAQ_Cat_General_100_text_a": "Auf deinem PC ist f\u00fcr die PHP Umgebung folgende Zeitzone voreingestellt:",
@@ -327,7 +339,7 @@
"HelpFAQ_Cat_General_103_head": "Die Login-Seite erscheint nicht, auch nicht nach der Passwort\u00e4nderung.",
"HelpFAQ_Cat_General_103_text": "Neben dem Passwort, muss in der Konfigurationsdatei <span class=\"text-danger help_faq_code\">/app/config/app.conf</span> auch der Parameter <span class=\"text-danger help_faq_code\">PIALERT_WEB_PROTECTION</span> auf <span class=\"text-danger help_faq_code\">True</span> gesetzt sein.",
"HelpFAQ_Cat_Network_600_head": "Was bringt mir diese Seite?",
"HelpFAQ_Cat_Network_600_text": "Diese Seite soll dir die M\u00f6glichkeit bieten, die Belegung deiner Netzwerkger\u00e4te abzubilden. Dazu kannst du einen oder mehrere Switches, WLANs, Router, etc. erstellen, sie ggf. mit einer Portanzahl versehen und bereits erkannte Ger\u00e4te diesen zuordnen. Diese Zuordnung erfolgt in der Detailansicht, des zuzuordnenden Ger\u00e4tes. So ist es dir m\u00f6glich, schnell festzustellen an welchem Port ein Host angeschlossen und ob er online ist.",
"HelpFAQ_Cat_Network_600_text": "Diese Seite soll dir die M\u00f6glichkeit bieten, die Belegung deiner Netzwerkger\u00e4te abzubilden. Dazu kannst du einen oder mehrere Switches, WLANs, Router, etc. erstellen, sie ggf. mit einer Portanzahl versehen und bereits erkannte Ger\u00e4te diesen zuordnen. Diese Zuordnung erfolgt in der Detailansicht, des zuzuordnenden Ger\u00e4tes. So ist es dir m\u00f6glich, schnell festzustellen an welchem Port ein Host angeschlossen und ob er online ist. Siehe <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.NetAlertX/blob/main/docs/NETWORK_TREE.md\">diese Dokumentation </a> f\u00fcr mehr Infos.",
"HelpFAQ_Cat_Network_601_head": "Gibt es mehr Dokumentation?",
"HelpFAQ_Cat_Network_601_text": "Ja, gibt es! Siehe <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/\">alle Dokumentationen</a> f\u00fcr mehr Infos.",
"HelpFAQ_Cat_Presence_400_head": "Ger\u00e4te werden mit einer gelben Markierung und dem Hinweis \"missing Event\" angezeigt.",
@@ -335,6 +347,8 @@
"HelpFAQ_Cat_Presence_401_head": "Ein Ger\u00e4t wird als Anwesend angezeigt, obwohl es \"Offline\" ist.",
"HelpFAQ_Cat_Presence_401_text": "Wenn dies geschieht hast du die M\u00f6glickeit, bei dem betreffenden Ger\u00e4t (Detailsansicht) die Events zu l\u00f6schen. Eine andere M\u00f6glichkeit w\u00e4re, das Ger\u00e4t einzuschalten und zu warten, bis NetAlertX mit dem n\u00e4chsten Scan das Ger\u00e4t als \"Online\" erkennt und anschlie\u00dfend das Ger\u00e4t einfach wieder ausschalten. Nun sollte NetAlertX mit dem n\u00e4chsten Scan den Zustand des Ger\u00e4tes ordentlich in der Datenbank vermerken.",
"HelpFAQ_Title": "Hilfe / FAQ",
"LOADED_PLUGINS_description": "",
"LOADED_PLUGINS_name": "",
"LOG_LEVEL_description": "Diese Einstellung aktiviert die erweiterte Protokollierung. N\u00fctzlich f\u00fcrs Debuggen von in die Datenbank geschriebenen Events.",
"LOG_LEVEL_name": "Erweiterte Protokollierung",
"Loading": "Laden...",
@@ -409,7 +423,7 @@
"Maintenance_Tool_del_empty_macs_noti": "Ger\u00e4te l\u00f6schen",
"Maintenance_Tool_del_empty_macs_noti_text": "Sind Sie sicher, dass Sie alle Ger\u00e4te ohne MAC-Adresse l\u00f6schen wollen?<br>(Vielleicht bevorzugen Sie eine Archivierung)",
"Maintenance_Tool_del_empty_macs_text": "Machen Sie ein Backup, bevor Sie diese Funk&shy;tion nutzen. Der Vor&shy;gang kann ohne Back&shy;up nicht r\u00fcck&shy;g\u00e4ngig gemacht werden. Alle Ge\u00e4te ohne MAC-Adresse werden aus der Datenbank ge&shy;l\u00f6scht.",
"Maintenance_Tool_del_selecteddev": "",
"Maintenance_Tool_del_selecteddev": "Ausgew\u00e4hlte Ger\u00e4te l\u00f6schen",
"Maintenance_Tool_del_selecteddev_text": "",
"Maintenance_Tool_del_unknowndev": "L\u00f6schen der (unknown) Ger\u00e4te",
"Maintenance_Tool_del_unknowndev_noti": "L\u00f6sche (unknown) Ger\u00e4te",
@@ -474,19 +488,20 @@
"Navigation_Events": "Ereignisse",
"Navigation_Flows": "Flows",
"Navigation_HelpFAQ": "Hilfe / FAQ",
"Navigation_Integrations": "",
"Navigation_Integrations": "Integrationen",
"Navigation_Maintenance": "Wartung",
"Navigation_Monitoring": "",
"Navigation_Monitoring": "\u00dcberwachung",
"Navigation_Network": "Netzwerk",
"Navigation_Notifications": "",
"Navigation_Plugins": "Plugins",
"Navigation_Presence": "Anwesenheit",
"Navigation_Report": "Bericht",
"Navigation_Settings": "Einstellungen",
"Navigation_SystemInfo": "Systeminfo",
"Navigation_Workflows": "",
"Navigation_Workflows": "Arbeitsabl\u00e4ufe",
"Network_Assign": "Zum obigen <i class=\"fa fa-server\"></i> Netzwerkknoten zuweisen",
"Network_Cant_Assign": "Internet-Wurzelknoten kann nicht als \u00e4u\u00dferer Kindknoten zugewiesen werden.",
"Network_Configuration_Error": "",
"Network_Configuration_Error": "Konfigurationsfehler",
"Network_Connected": "Verbundene Ger\u00e4te",
"Network_ManageAdd": "Ger\u00e4t hinzuf\u00fcgen",
"Network_ManageAdd_Name": "Name des Ger\u00e4tes",
@@ -515,7 +530,7 @@
"Network_ManageLeaf": "Zuweisungen verwalten",
"Network_ManageUnassign": "Zuweisung aufheben",
"Network_NoAssignedDevices": "Dieser Netzwerkknoten hat keine zugewiesenen Ger\u00e4te (Kindknoten). Weise eins von unten zu oder gehe in den <b><i class=\"fa fa-info-circle\"></i> Details</b> Tab eines Ger\u00e4tes in <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Ger\u00e4te</b></a>, und weise dort das Ger\u00e4t einem <b><i class=\"fa fa-server\"></i> Netzwerk Knoten</b> und einem <b><i class=\"fa fa-ethernet\"></i> Netzwerk Knoten Port</b> zu.",
"Network_NoDevices": "",
"Network_NoDevices": "Keine Ger\u00e4te zum konfigurieren",
"Network_Node": "Netzwerkknoten",
"Network_Node_Name": "Knotenname",
"Network_Parent": "\u00dcbergeordnetes Netzwerkger\u00e4t",
@@ -527,6 +542,8 @@
"Network_Table_State": "Status",
"Network_Title": "Netzwerk\u00fcbersicht",
"Network_UnassignedDevices": "Nicht zugewiesene Ger\u00e4te",
"Notifications_All": "",
"Notifications_Mark_All_Read": "",
"PIALERT_WEB_PASSWORD_description": "Das Standardpasswort ist <code>123456</code>. Um das Passwort zu \u00e4ndern, entweder <code>/app/back/pialert-cli</code> im Container starten oder <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\"><code>SETPWD_RUN</code> Set password plugin</a> nutzen.",
"PIALERT_WEB_PASSWORD_name": "Login-Passwort",
"PIALERT_WEB_PROTECTION_description": "Ein Loginfenster wird angezeigt wenn aktiviert. Untere Beschreibung genau durchlesen falls Sie sich aus Ihrer Instanz aussperren.",
@@ -552,7 +569,7 @@
"Presence_CalHead_year": "Jahr",
"Presence_CallHead_Devices": "Ger\u00e4te",
"Presence_Loading": "Laden...",
"Presence_Shortcut_AllDevices": "Alle Ger\u00e4te",
"Presence_Shortcut_AllDevices": "Meine Ger\u00e4te",
"Presence_Shortcut_Archived": "Archiviert",
"Presence_Shortcut_Connected": "Verbunden",
"Presence_Shortcut_Devices": "Ger\u00e4te",
@@ -581,6 +598,7 @@
"REPORT_WEBHOOK_description": "Enable webhooks for notifications. Webhooks help you to connect to a lot of 3rd party tools, such as IFTTT, Zapier or <a href=\"https://n8n.io/\" target=\"_blank\">n8n</a> to name a few. Check out this simple <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_N8N.md\" target=\"_blank\">n8n guide here</a> to get started. If enabled, configure related settings below.",
"REPORT_WEBHOOK_name": "Enable Webhooks",
"RandomMAC_hover": "Autodetected - indicates if the device randomizes it's MAC address.",
"Reports_Sent_Log": "",
"SCAN_SUBNETS_description": "Arp-scan is a command-line tool that uses the ARP protocol to discover and fingerprint IP hosts on the local network. An alternative to ARP scan is to enable the <a onclick=\"toggleAllSettings()\" href=\"#PIHOLE_RUN\"><code>PIHOLE_RUN</code>PiHole integration settings</a>. The arp-scan time itself depends on the number of IP addresses to check so set this up carefully with the appropriate network mask and interface. Check the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnets documentation</a> for help on setting up VLANs, what VLANs are supported, or how to figure out the network mask and your interface.",
"SMTP_FORCE_SSL_description": "Force SSL when connecting to your SMTP server.",
"SMTP_FORCE_SSL_name": "Force SSL",
@@ -635,10 +653,10 @@
"Systeminfo_Network_HTTP_Referer": "HTTP-Referer:",
"Systeminfo_Network_HTTP_Referer_String": "Kein HTTP-Referer",
"Systeminfo_Network_Hardware": "Netzwerk Hardware",
"Systeminfo_Network_Hardware_Interface_Mask": "",
"Systeminfo_Network_Hardware_Interface_Name": "",
"Systeminfo_Network_Hardware_Interface_RX": "",
"Systeminfo_Network_Hardware_Interface_TX": "",
"Systeminfo_Network_Hardware_Interface_Mask": "Netzwerkmaske",
"Systeminfo_Network_Hardware_Interface_Name": "Interfacename",
"Systeminfo_Network_Hardware_Interface_RX": "Empfangen",
"Systeminfo_Network_Hardware_Interface_TX": "Gesendet",
"Systeminfo_Network_IP": "IP Internet:",
"Systeminfo_Network_IP_Connection": "IP-Verbindung:",
"Systeminfo_Network_IP_Server": "Server-IP:",
@@ -680,20 +698,20 @@
"TICKER_MIGRATE_TO_NETALERTX": "",
"TIMEZONE_description": "Zeitzone um Statistiken korrekt darzustellen. Finde deine Zeitzone <a target=\"_blank\" href=\"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\" rel=\"nofollow\">hier</a>.",
"TIMEZONE_name": "Zeitzone",
"UI_DEV_SECTIONS_description": "",
"UI_DEV_SECTIONS_name": "",
"UI_DEV_SECTIONS_description": "Ausw\u00e4hlen, welche Elemente in der Ger\u00e4teseite versteckt werden sollen.",
"UI_DEV_SECTIONS_name": "Ger\u00e4teauswahl verstecken",
"UI_ICONS_description": "",
"UI_ICONS_name": "",
"UI_LANG_description": "Bevorzugte Oberfl\u00e4chensprache ausw\u00e4hlen.",
"UI_ICONS_name": "Vorgefertigte Icons",
"UI_LANG_description": "Bevorzugte Oberfl\u00e4chensprache ausw\u00e4hlen. Du m\u00f6chtest beim \u00dcbersetzen helfen? Gerne hier: <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
"UI_LANG_name": "UI Sprache",
"UI_MY_DEVICES_description": "",
"UI_MY_DEVICES_name": "",
"UI_MY_DEVICES_name": "In \"Meine Ger\u00e4te\" anzeigen",
"UI_NOT_RANDOM_MAC_description": "",
"UI_NOT_RANDOM_MAC_name": "",
"UI_PRESENCE_description": "Ausw\u00e4hlen, welche Status im <b>Ger\u00e4tepr\u00e4senz im Laufe der Zeit</b>-Diagramm in der <a href=\"/devices.php\" target=\"_blank\">Ger\u00e4te</a>-Seite angzeigt werden sollen. (<code>STRG + klicken</code> zum aus-/abw\u00e4hlen).",
"UI_PRESENCE_name": "Anzeige im Pr\u00e4senzdiagramm",
"UI_REFRESH_description": "",
"UI_REFRESH_name": "",
"UI_REFRESH_name": "Automatisch Aktualisieren",
"WEBHOOK_PAYLOAD_description": "The Webhook payload data format for the <code>body</code> > <code>attachments</code> > <code>text</code> attribute in the payload json. See an example of the payload <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">here</a>. (e.g.: for discord use <code>text</code>)",
"WEBHOOK_PAYLOAD_name": "Payload type",
"WEBHOOK_REQUEST_METHOD_description": "The HTTP request method to be used for the webhook call.",
@@ -706,37 +724,38 @@
"WEBHOOK_URL_name": "Target URL",
"Webhooks_display_name": "Webhooks",
"Webhooks_icon": "<i class=\"fa fa-circle-nodes\"></i>",
"devices_old": "",
"devices_old": "Aktualisiert...",
"general_event_description": " The event you have triggered might take a while until background processes finish. The execution ended once you see <code>finished</code> below. Check the <a href='/maintenance.php#tab_Logging'>error log</a> if you didn not get the expected result. <br/> <br/> Status: ",
"general_event_title": "Executing an ad-hoc event",
"report_guid": "",
"report_guid_missing": "",
"report_select_format": "",
"report_time": "",
"report_select_format": "Format ausw\u00e4hlen:",
"report_time": "Benachrichtigungszeit:",
"run_event_icon": "fa-play",
"run_event_tooltip": "Enable the setting and save your changes at first before you run it.",
"settings_core_icon": "",
"settings_core_icon": "fa-solid fa-gem",
"settings_core_label": "",
"settings_device_scanners": "",
"settings_device_scanners_icon": "",
"settings_device_scanners_label": "",
"settings_enabled": "",
"settings_enabled_icon": "",
"settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus",
"settings_device_scanners_label": "Ger\u00e4tescanner",
"settings_enabled": "Aktive Einstellungen",
"settings_enabled_icon": "fa-solid fa-toggle-on",
"settings_expand_all": "Expand all",
"settings_imported": "Last time settings were imported from the app.conf file:",
"settings_imported_label": "",
"settings_imported_label": "Einstellungen importiert",
"settings_missing": "Not all settings loaded, refresh the page! This is probably caused by a high load on the database or app startup sequence.",
"settings_missing_block": "You can not save your settings without specifying all setting keys. Refresh the page. This is probably caused by a high load on the database.",
"settings_old": "Importing settings and re-initializing...",
"settings_other_scanners": "",
"settings_other_scanners_icon": "",
"settings_other_scanners_label": "",
"settings_other_scanners_icon": "fa-solid fa-recycle",
"settings_other_scanners_label": "Andere Scanner",
"settings_publishers": "",
"settings_publishers_icon": "",
"settings_publishers_label": "",
"settings_publishers_icon": "fa-solid fa-paper-plane",
"settings_publishers_label": "Ver\u00f6ffentlicher",
"settings_saved": "<br/>Settings saved to the <code>app.conf</code> file.<br/><br/>A time-stamped backup of the previous file created. <br/><br/> Reloading...<br/>",
"settings_system_icon": "",
"settings_system_label": "",
"settings_system_icon": "fa-solid fa-gear",
"settings_system_label": "System",
"settings_update_item_warning": "",
"test_event_icon": "fa-vial-circle-check",
"test_event_tooltip": "Save your changes at first before you test your settings."
}

View File

@@ -196,6 +196,7 @@
"Device_TableHead_Connected_Devices": "Connections",
"Device_TableHead_Favorite": "Favorite",
"Device_TableHead_FirstSession": "First Session",
"Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Group",
"Device_TableHead_Icon": "Icon",
"Device_TableHead_LastIP": "Last IP",
@@ -211,6 +212,7 @@
"Device_TableHead_RowID": "Row ID",
"Device_TableHead_Rowid": "Row ID",
"Device_TableHead_Status": "Status",
"Device_TableHead_SyncHubNodeName": "Sync Node",
"Device_TableHead_Type": "Type",
"Device_TableHead_Vendor": "Vendor",
"Device_Table_Not_Network_Device": "Not configured as a network device",
@@ -254,6 +256,7 @@
"Events_TableHead_IPOrder": "IP Order",
"Events_TableHead_Order": "Order",
"Events_TableHead_Owner": "Owner",
"Events_TableHead_PendingAlert": "Pending Alert",
"Events_Table_info": "Showing _START_ to _END_ of _TOTAL_ entries",
"Events_Table_nav_next": "Next",
"Events_Table_nav_prev": "Previous",
@@ -261,6 +264,8 @@
"Events_Tablelenght_all": "All",
"Events_Title": "Events",
"Gen_Action": "Action",
"Gen_Add": "Add",
"Gen_Add_All": "Add all",
"Gen_AreYouSure": "Are you sure?",
"Gen_Backup": "Run Backup",
"Gen_Cancel": "Cancel",
@@ -269,18 +274,25 @@
"Gen_Delete": "Delete",
"Gen_DeleteAll": "Delete all",
"Gen_Error": "Error",
"Gen_Filter": "Filter",
"Gen_LockedDB": "ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.",
"Gen_Offline": "Offline",
"Gen_Okay": "Ok",
"Gen_Purge": "Purge",
"Gen_ReadDocs": "Read more in the docs.",
"Gen_Remove_All": "Remove all",
"Gen_Remove_Last": "Remove last",
"Gen_Restore": "Run Restore",
"Gen_Run": "Run",
"Gen_Save": "Save",
"Gen_Saved": "Saved",
"Gen_Search": "Search",
"Gen_Selected_Devices": "Selected Devices:",
"Gen_Switch": "Switch",
"Gen_Upd": "Updated successfully",
"Gen_Upd_Fail": "Update failed",
"Gen_Update": "Update",
"Gen_Update_Value": "Update Value",
"Gen_Warning": "Warning",
"Gen_Work_In_Progress": "Work in progress, good time to feedback on https://github.com/jokob-sk/NetAlertX/issues",
"General_display_name": "General",
@@ -323,6 +335,8 @@
"HelpFAQ_Cat_Presence_401_head": "A device is displayed as present although it is \"Offline\".",
"HelpFAQ_Cat_Presence_401_text": "If this happens, you have the possibility to delete the events for the device in question (details view). Another possibility would be to switch on the device and wait until NetAlertX recognizes the device as \"online\" with the next scan and then simply switch the device off again. Now NetAlertX should properly note the state of the device in the database with the next scan.",
"HelpFAQ_Title": "Help / FAQ",
"LOADED_PLUGINS_description": "Which Plugins to load. Adding plugins might slow the application. Read more about which plugins need to be enabled, types, or scanning options in the <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins#readme\">plugins docs</a>. Unloaded plugins will lose your settings. Only <code>disabled</code> plugins can be unloaded.",
"LOADED_PLUGINS_name": "Loaded plugins",
"LOG_LEVEL_description": "This setting will enable more verbose logging. Useful for debugging events writing into the database.",
"LOG_LEVEL_name": "Print additional logging",
"Loading": "Loading...",
@@ -391,7 +405,7 @@
"Maintenance_Tool_del_unknowndev_text": "Before using this function, please make a backup. The deletion cannot be undone. All devices named (unknown) will be deleted from the database.",
"Maintenance_Tool_displayed_columns_text": "Change the visibility and order of the columns in the <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Devices</b></a> page.",
"Maintenance_Tool_drag_me": "Drag me to reorder columns.",
"Maintenance_Tool_order_columns_text": "",
"Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text",
"Maintenance_Tool_purgebackup": "Purge Backups",
"Maintenance_Tool_purgebackup_noti": "Purge Backups",
"Maintenance_Tool_purgebackup_noti_text": "Are you sure you want to delete all backups except the last 3?",
@@ -441,9 +455,10 @@
"Navigation_Maintenance": "Maintenance",
"Navigation_Monitoring": "Monitoring",
"Navigation_Network": "Network",
"Navigation_Notifications": "Notifications",
"Navigation_Plugins": "Plugins",
"Navigation_Presence": "Presence",
"Navigation_Report": "Report",
"Navigation_Report": "Sent Reports",
"Navigation_Settings": "Settings",
"Navigation_SystemInfo": "System info",
"Navigation_Workflows": "Workflows",
@@ -490,6 +505,8 @@
"Network_Table_State": "State",
"Network_Title": "Network overview",
"Network_UnassignedDevices": "Unassigned devices",
"Notifications_All": "All Notifications",
"Notifications_Mark_All_Read": "Mark All Read",
"PIALERT_WEB_PASSWORD_description": "The default password is <code>123456</code>. To change the password run <code>/app/back/pialert-cli</code> in the container or use the <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\"><code>SETPWD_RUN</code> Set password plugin</a>.",
"PIALERT_WEB_PASSWORD_name": "Login password",
"PIALERT_WEB_PROTECTION_description": "When enabled a login dialog is displayed. Read below carefully if you get locked out of your instance.",
@@ -526,7 +543,8 @@
"REPORT_MAIL_name": "Enable email",
"REPORT_TITLE": "Report",
"RandomMAC_hover": "Autodetected - indicates if the device randomizes it's MAC address.",
"SCAN_SUBNETS_description": "Arp-scan is a command-line tool that uses the ARP protocol to discover and fingerprint IP hosts on the local network. An alternative to ARP scan is to enable some other Device scanners. The arp-scan time itself depends on the number of IP addresses to check so set this up carefully with the appropriate network mask and interface. Check the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnets documentation</a> for help on setting up VLANs, what VLANs are supported, or how to figure out the network mask and your interface.",
"Reports_Sent_Log": "Sent Reports Log",
"SCAN_SUBNETS_description": "Most on-network scanners (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) rely on scanning specific network interfaces and subnets. Check the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnets documentation</a> for help on this setting, especially VLANs, what VLANs are supported, or how to figure out the network mask and your interface. <br/> <br/> An alternative to on-network scanners is to enable some other Device scanners/importers that don't rely on NetAlert<sup>X</sup> having access to the network (UNIFI, dhcp.leases, PiHole, etc.). <br/> <br/> Note: The scan time itself depends on the number of IP addresses to check, so set this up carefully with the appropriate network mask and interface.",
"SYSTEM_TITLE": "System Information",
"Setting_Override": "Override value",
"Setting_Override_Description": "Enabling this option will override an App supplied default value with the value specified above.",
@@ -629,7 +647,7 @@
"general_event_description": "The event you have triggered might take a while until background processes finish. The execution ended once the below execution queue empties (Check the <a href='/maintenance.php#tab_Logging'>error log</a> if you encounter issues). <br/> <br/> Execution queue:",
"general_event_title": "Executing an ad-hoc event",
"report_guid": "Notification guid:",
"report_guid_missing": "Linked notification not found. The selected notification might have been deleted during maintenance as specified in the <code>DBCLNP_NOTIFI_HIST</code> setting. The latest notification is displayed instead. The missing notification has the following GUID:",
"report_guid_missing": "Linked notification not found. There is a small delay between recently sent notifications and them being available. Referesh your page and cache after a few seconds. It's also possible the selected notification have been deleted during maintenance as specified in the <code>DBCLNP_NOTIFI_HIST</code> setting. <br/> <br/>The latest notification is displayed instead. The missing notification has the following GUID:",
"report_select_format": "Select Format:",
"report_time": "Notification time:",
"run_event_icon": "fa-play",
@@ -644,18 +662,19 @@
"settings_expand_all": "Expand all",
"settings_imported": "Last time settings were imported from the app.conf file",
"settings_imported_label": "Settings imported",
"settings_missing": "Not all settings loaded, refresh the page! This is probably caused by a high load on the database or app startup sequence.",
"settings_missing_block": "You can not save your settings without specifying all setting keys. Refresh the page. This is probably caused by a high load on the database.",
"settings_missing": "Not all settings loaded! High load on the database or app startup sequence. Click the \ud83d\udd04 reload button in the top.",
"settings_missing_block": "Error: Settings not loaded correctly. Click the reload button \ud83d\udd04 at the top, alternatively, check the browser log for details (F12).",
"settings_old": "Importing settings and re-initializing...",
"settings_other_scanners": "Other, non-device scanner plugins that are currently enabled.",
"settings_other_scanners_icon": "fa-solid fa-recycle",
"settings_other_scanners_label": "Other scanners",
"settings_publishers": "Enabled notification gateways - publishers, that will send a notification depending on your settings.",
"settings_publishers_icon": "fa-solid fa-comment-dots",
"settings_publishers_icon": "fa-solid fa-paper-plane",
"settings_publishers_label": "Publishers",
"settings_saved": "<br/>Settings saved to the <code>app.conf</code> file.<br/><br/>A time-stamped backup of the previous file created. <br/><br/> Reloading...<br/>",
"settings_saved": "<br/>Settings saved. <br/> Reloading... <br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
"settings_system_icon": "fa-solid fa-gear",
"settings_system_label": "System",
"settings_update_item_warning": "Update the value below. Be careful to follow the previous format. <b>Validation is not performed.</b>",
"test_event_icon": "fa-vial-circle-check",
"test_event_tooltip": "Save your changes at first before you test your settings."
}

607
front/php/templates/language/es_es.json Normal file → Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -63,7 +63,7 @@
"DevDetail_EveandAl_AlertAllEvents": "Alerter tous les \u00e9v\u00e9nements",
"DevDetail_EveandAl_AlertDown": "",
"DevDetail_EveandAl_Archived": "Archiv\u00e9s",
"DevDetail_EveandAl_NewDevice": "",
"DevDetail_EveandAl_NewDevice": "Nouvel appareil",
"DevDetail_EveandAl_NewDevice_Tooltip": "",
"DevDetail_EveandAl_RandomMAC": "MAC al\u00e9atoire",
"DevDetail_EveandAl_ScanCycle": "",
@@ -133,7 +133,7 @@
"DevDetail_Tab_EventsTableIP": "IP",
"DevDetail_Tab_EventsTableInfo": "Informations compl\u00e9mentaires",
"DevDetail_Tab_Nmap": "",
"DevDetail_Tab_NmapEmpty": "",
"DevDetail_Tab_NmapEmpty": "Aucun port d\u00e9tect\u00e9 avec Nmap sur cet appareil.",
"DevDetail_Tab_NmapTableExtra": "Extra",
"DevDetail_Tab_NmapTableHeader": "",
"DevDetail_Tab_NmapTableIndex": "Index",
@@ -147,22 +147,22 @@
"DevDetail_Tab_Sessions": "<i class=\"fa fa-list-ol\"></i> Sessions",
"DevDetail_Tab_Tools": "",
"DevDetail_Tab_Tools_Internet_Info_Description": "",
"DevDetail_Tab_Tools_Internet_Info_Error": "",
"DevDetail_Tab_Tools_Internet_Info_Error": "Une erreur est survenue",
"DevDetail_Tab_Tools_Internet_Info_Start": "",
"DevDetail_Tab_Tools_Internet_Info_Title": "",
"DevDetail_Tab_Tools_Nslookup_Description": "",
"DevDetail_Tab_Tools_Nslookup_Error": "",
"DevDetail_Tab_Tools_Nslookup_Error": "Erreur\u202f: adresse IP invalide",
"DevDetail_Tab_Tools_Nslookup_Start": "",
"DevDetail_Tab_Tools_Nslookup_Title": "Nslookup",
"DevDetail_Tab_Tools_Speedtest_Description": "",
"DevDetail_Tab_Tools_Speedtest_Start": "",
"DevDetail_Tab_Tools_Speedtest_Start": "D\u00e9marrer le test de d\u00e9bit",
"DevDetail_Tab_Tools_Speedtest_Title": "Test de d\u00e9bit en ligne",
"DevDetail_Tab_Tools_Traceroute_Description": "",
"DevDetail_Tab_Tools_Traceroute_Error": "",
"DevDetail_Tab_Tools_Traceroute_Start": "",
"DevDetail_Tab_Tools_Traceroute_Title": "Traceroute",
"DevDetail_Tools_WOL": "",
"DevDetail_Tools_WOL_noti": "",
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
"DevDetail_Tools_WOL_noti_text": "",
"DevDetail_Type_hover": "",
"DevDetail_Vendor_hover": "",
@@ -176,7 +176,7 @@
"DevDetail_button_OverwriteIcons": "",
"DevDetail_button_OverwriteIcons_Tooltip": "",
"DevDetail_button_OverwriteIcons_Warning": "",
"DevDetail_button_Reset": "",
"DevDetail_button_Reset": "R\u00e9initialiser les modifications",
"DevDetail_button_Save": "Enregistrer",
"Device_MultiEdit": "",
"Device_MultiEdit_Backup": "",
@@ -196,6 +196,7 @@
"Device_TableHead_Connected_Devices": "Connexions",
"Device_TableHead_Favorite": "Favori",
"Device_TableHead_FirstSession": "Premi\u00e8re session",
"Device_TableHead_GUID": "",
"Device_TableHead_Group": "Groupe",
"Device_TableHead_Icon": "Ic\u00f4ne",
"Device_TableHead_LastIP": "Derni\u00e8re IP",
@@ -211,6 +212,7 @@
"Device_TableHead_RowID": "",
"Device_TableHead_Rowid": "",
"Device_TableHead_Status": "\u00c9tat",
"Device_TableHead_SyncHubNodeName": "",
"Device_TableHead_Type": "Type",
"Device_TableHead_Vendor": "Fabriquant",
"Device_Table_Not_Network_Device": "",
@@ -254,6 +256,7 @@
"Events_TableHead_IPOrder": "",
"Events_TableHead_Order": "",
"Events_TableHead_Owner": "Propri\u00e9taire",
"Events_TableHead_PendingAlert": "",
"Events_Table_info": "Affichage de _START_ \u00e0 _END_ sur _TOTAL_ entr\u00e9es",
"Events_Table_nav_next": "Suivant",
"Events_Table_nav_prev": "Pr\u00e9c\u00e9dent",
@@ -261,6 +264,8 @@
"Events_Tablelenght_all": "",
"Events_Title": "\u00c9v\u00e8nements",
"Gen_Action": "Action",
"Gen_Add": "",
"Gen_Add_All": "",
"Gen_AreYouSure": "",
"Gen_Backup": "",
"Gen_Cancel": "Annuler",
@@ -269,18 +274,25 @@
"Gen_Delete": "Supprimer",
"Gen_DeleteAll": "",
"Gen_Error": "Erreur",
"Gen_Filter": "",
"Gen_LockedDB": "",
"Gen_Offline": "",
"Gen_Okay": "OK",
"Gen_Purge": "Purger",
"Gen_ReadDocs": "",
"Gen_Remove_All": "",
"Gen_Remove_Last": "",
"Gen_Restore": "",
"Gen_Run": "Lancer",
"Gen_Save": "Enregistrer",
"Gen_Saved": "Enregistr\u00e9",
"Gen_Search": "",
"Gen_Selected_Devices": "",
"Gen_Switch": "Basculer",
"Gen_Upd": "",
"Gen_Upd_Fail": "",
"Gen_Update": "",
"Gen_Update_Value": "",
"Gen_Warning": "Avertissement",
"Gen_Work_In_Progress": "",
"General_display_name": "G\u00e9n\u00e9ral",
@@ -323,6 +335,8 @@
"HelpFAQ_Cat_Presence_401_head": "",
"HelpFAQ_Cat_Presence_401_text": "",
"HelpFAQ_Title": "Aide / FAQ",
"LOADED_PLUGINS_description": "",
"LOADED_PLUGINS_name": "",
"LOG_LEVEL_description": "",
"LOG_LEVEL_name": "",
"Loading": "Chargement\u00a0\u2026",
@@ -441,6 +455,7 @@
"Navigation_Maintenance": "",
"Navigation_Monitoring": "Surveillance",
"Navigation_Network": "R\u00e9seau",
"Navigation_Notifications": "",
"Navigation_Plugins": "Greffons",
"Navigation_Presence": "Pr\u00e9sence",
"Navigation_Report": "",
@@ -490,6 +505,8 @@
"Network_Table_State": "\u00c9tat",
"Network_Title": "",
"Network_UnassignedDevices": "",
"Notifications_All": "",
"Notifications_Mark_All_Read": "",
"PIALERT_WEB_PASSWORD_description": "",
"PIALERT_WEB_PASSWORD_name": "",
"PIALERT_WEB_PROTECTION_description": "",
@@ -526,6 +543,7 @@
"REPORT_MAIL_name": "",
"REPORT_TITLE": "",
"RandomMAC_hover": "",
"Reports_Sent_Log": "",
"SCAN_SUBNETS_description": "",
"SYSTEM_TITLE": "Informations syst\u00e8me",
"Setting_Override": "",
@@ -656,6 +674,7 @@
"settings_saved": "",
"settings_system_icon": "",
"settings_system_label": "Syst\u00e8me",
"settings_update_item_warning": "",
"test_event_icon": "",
"test_event_tooltip": ""
}

File diff suppressed because it is too large Load Diff

View File

@@ -5,18 +5,22 @@
// ###################################
$defaultLang = "en_us";
$allLanguages = ["en_us","es_es","de_de", "nb_no", "ru_ru", "fr_fr", "it_it"];
$allLanguages = ["en_us","es_es","de_de", "nb_no", "pl_pl", "pt_br", "ru_ru", "fr_fr", "it_it", "zh_cn"];
global $db;
$result = $db->querySingle("SELECT Value FROM Settings WHERE Code_Name = 'UI_LANG'");
switch($result){
switch($result){
case 'Spanish': $pia_lang_selected = 'es_es'; break;
case 'German': $pia_lang_selected = 'de_de'; break;
case 'Norwegian': $pia_lang_selected = 'nb_no'; break;
case 'Italian': $pia_lang_selected = 'it_it'; break;
case 'Polish (pl_pl)': $pia_lang_selected = 'pl_pl'; break;
case 'Portuguese (pt_br)': $pia_lang_selected = 'pt_br'; break;
case 'Italian (it_it)': $pia_lang_selected = 'it_it'; break;
case 'Russian': $pia_lang_selected = 'ru_ru'; break;
case 'Turkish (tr_tr)': $pia_lang_selected = 'tr_tr'; break;
case 'French': $pia_lang_selected = 'fr_fr'; break;
case 'Chinese (zh_cn)': $pia_lang_selected = 'zh_cn'; break;
default: $pia_lang_selected = 'en_us'; break;
}

View File

@@ -32,6 +32,7 @@ def merge_translations(main_file, other_files):
if __name__ == "__main__":
current_path = os.path.dirname(os.path.abspath(__file__))
json_files = ["en_us.json", "de_de.json", "es_es.json", "fr_fr.json", "nb_no.json", "ru_ru.json", "it_it.json"]
# language codes can be found here: http://www.lingoes.net/en/translator/langcode.htm
json_files = ["en_us.json", "de_de.json", "es_es.json", "fr_fr.json", "nb_no.json", "ru_ru.json", "it_it.json", "pt_br.json", "pl_pl.json", "zh_cn.json", "tr_tr.json"]
file_paths = [os.path.join(current_path, file) for file in json_files]
merge_translations(file_paths[0], file_paths[1:])

View File

@@ -196,6 +196,7 @@
"Device_TableHead_Connected_Devices": "",
"Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "",
"Device_TableHead_GUID": "",
"Device_TableHead_Group": "",
"Device_TableHead_Icon": "",
"Device_TableHead_LastIP": "",
@@ -211,6 +212,7 @@
"Device_TableHead_RowID": "",
"Device_TableHead_Rowid": "",
"Device_TableHead_Status": "",
"Device_TableHead_SyncHubNodeName": "",
"Device_TableHead_Type": "",
"Device_TableHead_Vendor": "",
"Device_Table_Not_Network_Device": "",
@@ -254,6 +256,7 @@
"Events_TableHead_IPOrder": "",
"Events_TableHead_Order": "",
"Events_TableHead_Owner": "",
"Events_TableHead_PendingAlert": "",
"Events_Table_info": "",
"Events_Table_nav_next": "",
"Events_Table_nav_prev": "",
@@ -261,6 +264,8 @@
"Events_Tablelenght_all": "",
"Events_Title": "",
"Gen_Action": "",
"Gen_Add": "",
"Gen_Add_All": "",
"Gen_AreYouSure": "",
"Gen_Backup": "",
"Gen_Cancel": "",
@@ -269,18 +274,25 @@
"Gen_Delete": "",
"Gen_DeleteAll": "",
"Gen_Error": "",
"Gen_Filter": "",
"Gen_LockedDB": "",
"Gen_Offline": "",
"Gen_Okay": "",
"Gen_Purge": "",
"Gen_ReadDocs": "",
"Gen_Remove_All": "",
"Gen_Remove_Last": "",
"Gen_Restore": "",
"Gen_Run": "",
"Gen_Save": "",
"Gen_Saved": "",
"Gen_Search": "",
"Gen_Selected_Devices": "",
"Gen_Switch": "",
"Gen_Upd": "",
"Gen_Upd_Fail": "",
"Gen_Update": "",
"Gen_Update_Value": "",
"Gen_Warning": "",
"Gen_Work_In_Progress": "",
"General_display_name": "",
@@ -323,6 +335,8 @@
"HelpFAQ_Cat_Presence_401_head": "",
"HelpFAQ_Cat_Presence_401_text": "",
"HelpFAQ_Title": "",
"LOADED_PLUGINS_description": "",
"LOADED_PLUGINS_name": "",
"LOG_LEVEL_description": "",
"LOG_LEVEL_name": "",
"Loading": "",
@@ -441,6 +455,7 @@
"Navigation_Maintenance": "",
"Navigation_Monitoring": "",
"Navigation_Network": "",
"Navigation_Notifications": "",
"Navigation_Plugins": "",
"Navigation_Presence": "",
"Navigation_Report": "",
@@ -490,6 +505,8 @@
"Network_Table_State": "",
"Network_Title": "",
"Network_UnassignedDevices": "",
"Notifications_All": "",
"Notifications_Mark_All_Read": "",
"PIALERT_WEB_PASSWORD_description": "",
"PIALERT_WEB_PASSWORD_name": "",
"PIALERT_WEB_PROTECTION_description": "",
@@ -526,6 +543,7 @@
"REPORT_MAIL_name": "",
"REPORT_TITLE": "",
"RandomMAC_hover": "",
"Reports_Sent_Log": "",
"SCAN_SUBNETS_description": "",
"SYSTEM_TITLE": "",
"Setting_Override": "",
@@ -656,6 +674,7 @@
"settings_saved": "",
"settings_system_icon": "",
"settings_system_label": "",
"settings_update_item_warning": "",
"test_event_icon": "",
"test_event_tooltip": ""
}

View File

@@ -0,0 +1,680 @@
{
"API_CUSTOM_SQL_description": "Mo\u017cesz okre\u015bli\u0107 w\u0142asne zapytanie SQL kt\u00f3re b\u0119dzie generowa\u0142o plik JSON i udost\u0119pni\u0107 je poprzez plik typu endpoint <a href=\"/api/table_custom_endpoint.json\" target=\"_blank\"><code>table_custom_endpoint.json</code> </a>.",
"API_CUSTOM_SQL_name": "W\u0142asny endpoint",
"API_display_name": "API",
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
"About_Design": "Zaprojektowany by:",
"About_Exit": "Wyloguj",
"About_Title": "Skaner bezpiecze\u0144stwa sieciowego i framwork powiadomie\u0144",
"AppEvents_DateTimeCreated": "Zalogowany",
"AppEvents_Extra": "Ekstra",
"AppEvents_GUID": "Aplikacja GUID wydarze\u0144",
"AppEvents_Helper1": "Pomocnik 1",
"AppEvents_Helper2": "Pomocnik 2",
"AppEvents_Helper3": "Pomocnik 3",
"AppEvents_ObjectForeignKey": "Klucz obcy",
"AppEvents_ObjectIndex": "Indeks",
"AppEvents_ObjectIsArchived": "Zarchiwizowany (od czasu logu)",
"AppEvents_ObjectIsNew": "Nowy (od czasu log\u00f3w)",
"AppEvents_ObjectPlugin": "Po\u0142\u0105czony plugin",
"AppEvents_ObjectPrimaryID": "Podstawowe ID",
"AppEvents_ObjectSecondaryID": "Drugorz\u0119dne ID",
"AppEvents_ObjectStatus": "Status (od czasu log\u00f3w)",
"AppEvents_ObjectStatusColumn": "Kolumna statusu",
"AppEvents_ObjectType": "Typ objektu",
"AppEvents_Plugin": "Plugin",
"AppEvents_Type": "Typ",
"BackDevDetail_Actions_Ask_Run": "Czy chcesz wykona\u0107 akcj\u0119?",
"BackDevDetail_Actions_Not_Registered": "Akcja nie zarejestrowana: ",
"BackDevDetail_Actions_Title_Run": "Wykonaj akcj\u0119",
"BackDevDetail_Copy_Ask": "Skopiuj opis z urz\u0105dzenia z listy rozwijanej (Wszystko na tej stronie zostanie nadpisane)?",
"BackDevDetail_Copy_Title": "Skopiuj opis",
"BackDevDetail_Tools_WOL_error": "Komenda NIE zosta\u0142a wykonana.",
"BackDevDetail_Tools_WOL_okay": "Komenda zosta\u0142a wykonana.",
"BackDevices_Arpscan_disabled": "Skan Arp Wy\u0142\u0105czony",
"BackDevices_Arpscan_enabled": "Skan Arp W\u0142\u0105czony",
"BackDevices_Backup_CopError": "Oryginalna baza danych nie zosta\u0142a zapisana.",
"BackDevices_Backup_Failed": "Cz\u0119\u015bciowo poprawnie wykonana kopia zapasowa. Archiwum nie mog\u0142o zosta\u0107 utworzone lub jest puste.",
"BackDevices_Backup_okay": "Kopia zapasowa wykonana poprawnie z nowym archiwum",
"BackDevices_DBTools_DelDevError_a": "B\u0142\u0105d usuwania Urz\u0105dzenia",
"BackDevices_DBTools_DelDevError_b": "B\u0142\u0105d usuwania Urz\u0105dze\u0144",
"BackDevices_DBTools_DelDev_a": "Urz\u0105dzenie usuni\u0119te",
"BackDevices_DBTools_DelDev_b": "Urz\u0105dzenia usuni\u0119te",
"BackDevices_DBTools_DelEvents": "Wydarzenie usuni\u0119te",
"BackDevices_DBTools_DelEventsError": "B\u0142\u0105d usuwania Wydarze\u0144",
"BackDevices_DBTools_ImportCSV": "Urz\u0105dzenia z pliku CSV zosta\u0142y zaimportowane poprawnie.",
"BackDevices_DBTools_ImportCSVError": "Plik CSV nie m\u00f3g\u0142 zosta\u0107 zaimportowany. Upewnij si\u0119 \u017ce format jest poprawny.",
"BackDevices_DBTools_ImportCSVMissing": "Plik CSV nie zosta\u0142 znaleziony w <b>/config/devices.csv.</b>",
"BackDevices_DBTools_Purge": "Najstarsza kopia zapasowa zosta\u0142a usuni\u0119ta",
"BackDevices_DBTools_UpdDev": "Urz\u0105dzenie zaktualizowane poprawnie",
"BackDevices_DBTools_UpdDevError": "B\u0142\u0105d aktualizacji urz\u0105dzenia",
"BackDevices_DBTools_Upgrade": "Baza danych zaktualizowana",
"BackDevices_DBTools_UpgradeError": "Aktualizacja bazy danych nie powiod\u0142a si\u0119",
"BackDevices_Device_UpdDevError": "B\u0142\u0105d aktualizacji urz\u0105dze\u0144, spr\u00f3buj ponownie p\u00f3\u017aniej. Mo\u017cliwe \u017ce baza danych jest zablokowana przez trwaj\u0105ce zadania.",
"BackDevices_Restore_CopError": "Oryginalna baza danych nie mo\u017ce zosta\u0107 zapisana.",
"BackDevices_Restore_Failed": "Nie udane przywracanie. Przywr\u00f3\u0107 baz\u0119 danych r\u0119cznie.",
"BackDevices_Restore_okay": "Przywracanie wykonane z sukcesem.",
"BackDevices_darkmode_disabled": "Tryb ciemny Wy\u0142\u0105czony",
"BackDevices_darkmode_enabled": "Tryb ciemny W\u0142\u0105czony",
"DAYS_TO_KEEP_EVENTS_description": "To jest ustawienie konserwacji. Okre\u015bla ile dni maj\u0105 by\u0107 utrzymywane wpisy wydarze\u0144. Wszystkie starsze wpisy wydarze\u0144 zostan\u0105 usuni\u0119te okresowo. Dotyczy tak\u017ce Historii Wydarze\u0144 Plugin\u00f3w.",
"DAYS_TO_KEEP_EVENTS_name": "Usu\u0144 wydarzenia starsze ni\u017c",
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i>Kopiuj opis z urz\u0105dzenia",
"DevDetail_Copy_Device_Tooltip": "Kopiuj opis z urz\u0105dzenia z listy rozwijanej. Wszystko na tej stronie zostanie nadpisane",
"DevDetail_EveandAl_AlertAllEvents": "Powiadamiaj o wszystkich wydarzeniach",
"DevDetail_EveandAl_AlertDown": "Wy\u0142\u0105cz powiadomienia",
"DevDetail_EveandAl_Archived": "Zarchiwizowane",
"DevDetail_EveandAl_NewDevice": "Nowe Urz\u0105dzenie",
"DevDetail_EveandAl_NewDevice_Tooltip": "Pokarze Nowy status dla urz\u0105dzenia i doda do listy kiedy filtr Nowe Urz\u0105dzenie jest aktywne. Nie wp\u0142ywa na powiadomienia.",
"DevDetail_EveandAl_RandomMAC": "Losowy MAC",
"DevDetail_EveandAl_ScanCycle": "Skanuj urz\u0105dzenie",
"DevDetail_EveandAl_ScanCycle_a": "Skanuj Urz\u0105dzenie",
"DevDetail_EveandAl_ScanCycle_z": "Nie skanuj Urz\u0105dzenia",
"DevDetail_EveandAl_Skip": "Pomi\u0144 powtarzaj\u0105ce si\u0119 powiadomienia przez",
"DevDetail_EveandAl_Title": "<i class=\"fa fa-bolt\"></i> Konfiguracja powiadomie\u0144 i alert\u00f3w",
"DevDetail_Events_CheckBox": "Ukryj wydarzenia po\u0142\u0105cze\u0144",
"DevDetail_GoToNetworkNode": "Przenie\u015b do strony Sie\u0107 danego w\u0119z\u0142a.",
"DevDetail_Icon": "Ikona",
"DevDetail_Icon_Descr": "Wprowad\u017a nazw\u0119 ikone z font awesome bez przedroska fa- oraz pe\u0142n\u0105 klase, np fa fa-brands fa-apple.",
"DevDetail_Loading": "Wczytywanie...",
"DevDetail_MainInfo_Comments": "Komentarze",
"DevDetail_MainInfo_Favorite": "Ulubione",
"DevDetail_MainInfo_Group": "Grupa",
"DevDetail_MainInfo_Location": "Lokalizacja",
"DevDetail_MainInfo_Name": "Nazwa",
"DevDetail_MainInfo_Network": "<i class=\"fa fa-server\"></i> W\u0119ze\u0142 (MAC)",
"DevDetail_MainInfo_Network_Port": "<i class=\"fa fa-ethernet\"></i> Port",
"DevDetail_MainInfo_Network_Title": "<i class=\"fa fa-network-wired\"></i> Sie\u0107",
"DevDetail_MainInfo_Owner": "W\u0142a\u015bciciel",
"DevDetail_MainInfo_Title": "<i class=\"fa fa-pencil\"></i> G\u0142\u00f3wne informacje",
"DevDetail_MainInfo_Type": "Typ",
"DevDetail_MainInfo_Vendor": "Dostawca",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_Network_Node_hover": "Wybierz sieciowe urz\u0105dzenie rodzica do kt\u00f3rego urz\u0105dzenia jest aktualnie pod\u0142\u0105czone by wype\u0142ni\u0107 Drzewo Sieci.",
"DevDetail_Network_Port_hover": "Port na kt\u00f3rym urz\u0105dzenie jest pod\u0142\u0105czone do urz\u0105dzenia sieciowego rodzica. Je\u017celi b\u0119dzie puste ikona wifi zostanie wy\u015bwietlona w Drzewku Sieci.",
"DevDetail_Nmap_Scans": "R\u0119czny Skan Nmap",
"DevDetail_Nmap_Scans_desc": "Tutaj mo\u017cesz r\u0119cznie wykona\u0107 skany NMAP. Mo\u017cesz tak\u017ce zaplanowa\u0107 automatyczne regularne skanowanie NMAP poprzez plug Us\u0142ugi i Porty (NMAP). Udaj si\u0119 do <a href='/settings.php' target='_blank'>Ustawie\u0144</a> by dowiedzie\u0107 si\u0119 wi\u0119cej",
"DevDetail_Nmap_buttonDefault": "Podstawowy Skan",
"DevDetail_Nmap_buttonDefault_text": "Podstawowy Skan: Nmap skanuje 1000 pierwszych port\u00f3w z u\u017cyciem wszystkich za\u017c\u0105danych protoko\u0142\u00f3w. \u0141apie oko\u0142o 93% port\u00f3w TCP i 49% port\u00f3w UDP. (oko\u0142o 5 sekund)",
"DevDetail_Nmap_buttonDetail": "Skan Szczeg\u00f3\u0142owy",
"DevDetail_Nmap_buttonDetail_text": "Skan Szczeg\u00f3\u0142owy: Podstawowy skan z w\u0142\u0105czon\u0105 detekcj\u0105 OS, detekcj\u0105 wersji, skrypt skanuj\u0105cy oraz traceroute (do 30 sekund lub wi\u0119cej)",
"DevDetail_Nmap_buttonFast": "Szybki Skan",
"DevDetail_Nmap_buttonFast_text": "Szybki Skan: Skanuje mniej port\u00f3w (100) ni\u017c skan podstawowy (kilka sekund)",
"DevDetail_Nmap_buttonSkipDiscovery": "Pomi\u0144 wykrywanie hosta",
"DevDetail_Nmap_buttonSkipDiscovery_text": "Pomi\u0144 wykrywanie hosta (opcja -Pn): Podstawowy skan bez wykrywania hosta",
"DevDetail_Nmap_resultsLink": "Mo\u017cesz opu\u015bci\u0107 t\u0105 stron\u0119 po w\u0142\u0105czeniu skanu. Wyniki b\u0119d\u0105 dost\u0119pne w pliku <code>app_front.log</code>.",
"DevDetail_Owner_hover": "Kto jest w\u0142a\u015bcicielem urz\u0105dzenia. Dowolny tekst.",
"DevDetail_Periodselect_All": "Wszystkie informacje",
"DevDetail_Periodselect_LastMonth": "Ostatni Miesi\u0105c",
"DevDetail_Periodselect_LastWeek": "Ostatni Tydzie\u0144",
"DevDetail_Periodselect_LastYear": "Ostatni Rok",
"DevDetail_Periodselect_today": "Dzisiaj",
"DevDetail_Run_Actions_Title": "<i class=\"fa fa-play\"></i>Wykonaj akcj\u0119 na urz\u0105dzeniu",
"DevDetail_Run_Actions_Tooltip": "Wykonaj akcje na tym urz\u0105dzeniu z listy rozwijanej.",
"DevDetail_SessionInfo_FirstSession": "Pierwsza Sesja",
"DevDetail_SessionInfo_LastIP": "Ostatnie IP",
"DevDetail_SessionInfo_LastSession": "Ostatnia Sesja",
"DevDetail_SessionInfo_StaticIP": "Statyczne IP",
"DevDetail_SessionInfo_Status": "Status",
"DevDetail_SessionInfo_Title": "<i class=\"fa fa-calendar\"></i>Informacje o Sesji",
"DevDetail_SessionTable_Additionalinfo": "Dodatkowe Informacje",
"DevDetail_SessionTable_Connection": "Po\u0142\u0105czenie",
"DevDetail_SessionTable_Disconnection": "Roz\u0142\u0105czenie",
"DevDetail_SessionTable_Duration": "Okres",
"DevDetail_SessionTable_IP": "IP",
"DevDetail_SessionTable_Order": "Kolejno\u015b\u0107",
"DevDetail_Shortcut_CurrentStatus": "Aktualny Status",
"DevDetail_Shortcut_DownAlerts": "Alert roz\u0142\u0105czenia",
"DevDetail_Shortcut_Presence": "Obecno\u015b\u0107",
"DevDetail_Shortcut_Sessions": "Sesje",
"DevDetail_Tab_Details": "<i class=\"fa fa-info-circle\"></i>Szczeg\u00f3\u0142y",
"DevDetail_Tab_Events": "<i class=\"fa fa-bolt\"></i>Wydarzenia",
"DevDetail_Tab_EventsTableDate": "Data",
"DevDetail_Tab_EventsTableEvent": "Typ wydarzenia",
"DevDetail_Tab_EventsTableIP": "IP",
"DevDetail_Tab_EventsTableInfo": "Dodatkowe info",
"DevDetail_Tab_Nmap": "<i class=\"fa fa-ethernet\"></i>Nmap",
"DevDetail_Tab_NmapEmpty": "Nie wykryto port\u00f3w za pomoc\u0105 Nmap na urz\u0105dzeniu.",
"DevDetail_Tab_NmapTableExtra": "Ekstra",
"DevDetail_Tab_NmapTableHeader": "Wyniki zaplanowanego skanu",
"DevDetail_Tab_NmapTableIndex": "Indeks",
"DevDetail_Tab_NmapTablePort": "Port",
"DevDetail_Tab_NmapTableService": "Us\u0142uga",
"DevDetail_Tab_NmapTableState": "Stan",
"DevDetail_Tab_NmapTableText": "Ustaw harmonogram w <a href=\"/settings.php#NMAP_ACTIVE\">Ustawieniach</a>",
"DevDetail_Tab_NmapTableTime": "Czas",
"DevDetail_Tab_Plugins": "<i class=\"fa fa-plug\"></i>Pluginy",
"DevDetail_Tab_Presence": "<i class=\"fa fa-calendar\"></i> Obecno\u015b\u0107",
"DevDetail_Tab_Sessions": "<i class=\"fa fa-list-ol\"></i> Sesje",
"DevDetail_Tab_Tools": "<i class=\"fa fa-screwdriver-wrench\"></i> Narz\u0119dzia",
"DevDetail_Tab_Tools_Internet_Info_Description": "Narz\u0119dzie informacji o Internecie wy\u015bwietla informacj\u0119 o po\u0142\u0105czeniu z Internetem, takie jak adres IP, miasto, pa\u0144stwo, kod pocztowy i strefa czasowa.",
"DevDetail_Tab_Tools_Internet_Info_Error": "Wyst\u0105pi\u0142 b\u0142\u0105d",
"DevDetail_Tab_Tools_Internet_Info_Start": "Rozpocznij Informacje o Internecie",
"DevDetail_Tab_Tools_Internet_Info_Title": "Internet Info",
"DevDetail_Tab_Tools_Nslookup_Description": "Nslookup to narz\u0119dzie konsoli u\u017cywane do zapyta\u0144 Systemu Nazw Domenowych (DNS). DNS to system t\u0142umaczenia nazw domen, takich jak www.google.com na adres IP, taki jak 172.217.0.142.",
"DevDetail_Tab_Tools_Nslookup_Error": "B\u0142\u0105d: adres IP nie jest poprawny",
"DevDetail_Tab_Tools_Nslookup_Start": "Rozpocznij Nslookup",
"DevDetail_Tab_Tools_Nslookup_Title": "Nslookup",
"DevDetail_Tab_Tools_Speedtest_Description": "Narz\u0119dzie SpeedTest mierzy pr\u0119dko\u015b\u0107 pobierania, wysy\u0142ania oraz op\u00f3\u017anienie po\u0142\u0105czenia internetowego.",
"DevDetail_Tab_Tools_Speedtest_Start": "W\u0142\u0105cz SpeedTest",
"DevDetail_Tab_Tools_Speedtest_Title": "Online SpeedTest",
"DevDetail_Tab_Tools_Traceroute_Description": "Traceroute to sieciowa komenda diagnostyczna s\u0142u\u017c\u0105ca do \u015bledzenia trasy kt\u00f3r\u0105 pakiety przechodz\u0105 z jednego hosta do drugiego.<br><br>Komenda u\u017cywa internetowego protoko\u0142u komunikat\u00f3w kontrolnych (Internet Control Message Protocol - ICMP) do wys\u0142ania pakiet\u00f3w do w\u0119z\u0142\u00f3w po\u015brednich trasy, ka\u017cdy w\u0119ze\u0142 po\u015bredni odpowiada pakietem ICMP time-out (TTL timed out).<br><br>Dane wyj\u015bciowe komendy traceroute wy\u015bwietlaj\u0105 adres IP ka\u017cdego w\u0119z\u0142a po\u015bredniego trasy.<br><br>Komenda traceroute mo\u017ce s\u0142u\u017cy\u0107 do diagnostyki problem\u00f3w sieci, takich jak op\u00f3\u017anienia, utraty pakiet\u00f3w czy zablokowane trasy.<br><br>Mo\u017ce by\u0107 tak\u017ce u\u017cywany do identyfikacji lokalizacji w\u0119z\u0142a po\u015bredniego w sieci.",
"DevDetail_Tab_Tools_Traceroute_Error": "B\u0142\u0105d: adres IP jest niepoprawny",
"DevDetail_Tab_Tools_Traceroute_Start": "Rozpocznij Treceroute",
"DevDetail_Tab_Tools_Traceroute_Title": "Traceroute",
"DevDetail_Tools_WOL": "Wy\u015blij komende WoL do ",
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
"DevDetail_Tools_WOL_noti_text": "Komenda Wake-on-LAN zostaje wys\u0142ana na adres rozg\u0142oszeniowy. Je\u017celi celem nie jest podsie\u0107/VLAN NetAlertX, urz\u0105dzenie docelowe nie odpowie.",
"DevDetail_Type_hover": "Typ urz\u0105dzenia. Je\u017celi zaznaczysz dowolne predefiniowane urz\u0105dzenie sieciowe (np: AP, Zapora sieciowa, Ruter, Switch...) poka\u017c\u0105 si\u0119 w Drzewku Sieci do skonfigurowania jako rodzice w\u0119z\u0142\u00f3w sieciowych.",
"DevDetail_Vendor_hover": "Dostawca powinien by\u0107 automatycznie wykrywany. Mo\u017cesz nadpisa\u0107 lub doda\u0107 w\u0142asn\u0105 warto\u015b\u0107.",
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i>Wake-on-LAN",
"DevDetail_button_AddIcon": "Dodaj now\u0105 Ikon\u0119",
"DevDetail_button_AddIcon_Help": "Wklej tag html SVG lub tag html ikony Font Awesome. Przeczytaj <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">dokumentacje Ikon</a> po wi\u0119cej szczeg\u00f3\u0142\u00f3w.",
"DevDetail_button_AddIcon_Tooltip": "Dodaj now\u0105 Ikon\u0119 kt\u00f3ra nie jest dost\u0119pna w menu rozwijanym do urz\u0105dzenia.",
"DevDetail_button_Delete": "Usu\u0144 Urz\u0105dzenie",
"DevDetail_button_DeleteEvents": "Usu\u0144 Wydarzenia",
"DevDetail_button_DeleteEvents_Warning": "Jeste\u015b pewien, \u017ce chcesz usun\u0105\u0107 wszystkie Wydarzenia tego urz\u0105dzenia?<br><br>(wyczy\u015bci to <b>Histori\u0119 Wydarze\u0144</b> i <b>Sesje</b> i mo\u017ce pom\u00f3c ze sta\u0142ymi powiadomieniami)",
"DevDetail_button_OverwriteIcons": "Nadpisz Ikony",
"DevDetail_button_OverwriteIcons_Tooltip": "Nadpisz ikony dla urz\u0105dze\u0144 o tym samym typie",
"DevDetail_button_OverwriteIcons_Warning": "Czy na pewno chcesz nadpisa\u0107 wszystkie ikony dla urz\u0105dze\u0144 o tym samym typie co to urz\u0105dzenie?",
"DevDetail_button_Reset": "Zresetuj Zmiany",
"DevDetail_button_Save": "Zapisz",
"Device_MultiEdit": "Multi-edycja",
"Device_MultiEdit_Backup": "Ostro\u017cnie, wprowadzenie b\u0142\u0119dnych warto\u015bci poni\u017cej mo\u017ce zepsu\u0107 konfiguracje. Najpierw wykonaj kopie zapasow\u0105 bazy danych lub konfiguracji Urz\u0105dze\u0144 (<a href=\"php/server/devices.php?action=ExportCSV\">kliknij aby pobra\u0107<i class=\"fa-solid fa-download fa-bounce\"></i></a>). Przeczytaj jak odzyska\u0107 Urz\u0105dzenia z tego pliku w <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">Dokumentacji Kopii Zapasowej</a>.",
"Device_MultiEdit_Fields": "Edytuj pola:",
"Device_MultiEdit_MassActions": "Akcja masowa:",
"Device_MultiEdit_Tooltip": "Ostro\u017cnie. Klikaj\u0105c to zastosuj\u0105 si\u0119 warto\u015bci po lewej stronie do wszystkich wybranych powy\u017cej urz\u0105dze\u0144.",
"Device_Searchbox": "Szukaj",
"Device_Shortcut_AllDevices": "Moje Urz\u0105dzenia",
"Device_Shortcut_Archived": "Zarchiwizowane",
"Device_Shortcut_Connected": "Po\u0142\u0105czone",
"Device_Shortcut_Devices": "Urz\u0105dzenia",
"Device_Shortcut_DownAlerts": "Wy\u0142\u0105czone & Offline",
"Device_Shortcut_DownOnly": "Wy\u0142\u0105czone",
"Device_Shortcut_Favorites": "Ulubione",
"Device_Shortcut_NewDevices": "Nowe Urz\u0105dzenia",
"Device_Shortcut_OnlineChart": "Obecno\u015b\u0107 urz\u0105dzenia",
"Device_TableHead_Connected_Devices": "Po\u0142\u0105czenia",
"Device_TableHead_Favorite": "Ulubione",
"Device_TableHead_FirstSession": "Pierwsza Sesja",
"Device_TableHead_GUID": "",
"Device_TableHead_Group": "Grupa",
"Device_TableHead_Icon": "Ikona",
"Device_TableHead_LastIP": "Ostatnie IP",
"Device_TableHead_LastIPOrder": "Kolejno\u015b\u0107 Ostatnich IP",
"Device_TableHead_LastSession": "Ostatnia Sesja",
"Device_TableHead_Location": "Lokalizacja",
"Device_TableHead_MAC": "Losowy MAC",
"Device_TableHead_MAC_full": "Pe\u0142en MAC",
"Device_TableHead_Name": "Nazwa",
"Device_TableHead_Owner": "W\u0142a\u015bciciel",
"Device_TableHead_Parent_MAC": "MAC rodzica w\u0119z\u0142a",
"Device_TableHead_Port": "Port",
"Device_TableHead_RowID": "ID wiersza",
"Device_TableHead_Rowid": "ID wiersza",
"Device_TableHead_Status": "Status",
"Device_TableHead_SyncHubNodeName": "",
"Device_TableHead_Type": "Typ",
"Device_TableHead_Vendor": "Dostawca",
"Device_Table_Not_Network_Device": "Nie skonfigurowane jako urz\u0105dzenie sieciowe",
"Device_Table_info": "Pokazuje_od_POCZ\u0104TKU_do_KO\u0143CA_WSZYSKICH_wpis\u00f3w",
"Device_Table_nav_next": "Nast\u0119pna",
"Device_Table_nav_prev": "Poprzednia",
"Device_Tablelenght": "Poka\u017c_wpisy_MENU",
"Device_Tablelenght_all": "Wszystkie",
"Device_Title": "Urz\u0105dzenia",
"Donations_Others": "Reszta",
"Donations_Platforms": "Platforma Sponsora",
"Donations_Text": "Cze\u015b\u0107 \ud83d\udc4b! </br> Dzi\u0119kuje \u017ce klikn\u0105\u0142e\u015b w to menu \ud83d\ude05 </br> </br> Pr\u00f3buje zebra\u0107 troch\u0119 donacji by ulepszy\u0107 to oprogramowanie. Tak\u017ce pomaga mi to si\u0119 nie wypali\u0107 bym dalej m\u00f3g\u0142 wspiera\u0107 to narz\u0119dzie. Ka\u017cdy ma\u0142y (powtarzaj\u0105cy si\u0119 lub nie) sponsoring sprawia \u017ce chce wk\u0142ada\u0107 wi\u0119cej pracy w t\u0105 aplikacj\u0119. </br> Chcia\u0142bym skr\u00f3\u0107 m\u00f3j tydzie\u0144 pracy i w wolnym czasie skupi\u0107 si\u0119 nad NetAlertX. Dostawaliby\u015bcie wi\u0119cej funkcjonalno\u015bci i bardziej wypolerowane, posiadaj\u0105ce mniej b\u0142\u0119d\u00f3w wydania. </br> </br> Dzi\u0119kuj\u0119 \u017ce to przeczyta\u0142e\u015b - Jestem wdzi\u0119czny za pomoc \u2764\ud83d\ude4f</br> </br> TL;DR: Wspieraj\u0105c mnie otrzymujesz: </br> </br> <ul><li> Regularne aktualizacje by zapewni\u0107 twoim danym i rodzinie bezpiecze\u0144stwo \ud83d\udd04 </li><li>Mniej b\u0142\u0119d\u00f3w (bug\u00f3w) \ud83d\udc1b\ud83d\udd2b</li><li>Wi\u0119cej i lepsze funkcjonalno\u015bci\u2795</li><li>Ja si\u0119 nie wypale\ud83d\udd25\ud83e\udd2f</li><li>Mniej wypchane na si\u0142\u0119 wydania\ud83d\udca8</li><li>Lepsza dokumentacja\ud83d\udcda</li><li>Szybsza i lepsza pomoc w problemach\ud83c\udd98</li></ul> </br>\ud83d\udce7Napisz E-mail do mnie na<a href='mailto:jokob@duck.com?subject=NetAlertX'>jokob@duck.com</a> je\u017celi chcesz nawi\u0105za\u0107 kontakt albo czy powinien doda\u0107 kolejn\u0105 platform\u0119 z sponsoringiem.</br>",
"Donations_Title": "Dotacje",
"ENABLE_PLUGINS_description": "W\u0142\u0105cza funkcjonalno\u015b\u0107 <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins\">plugin\u00f3w</a>. Uruchomienie plugin\u00f3w wymaga wi\u0119cej zasob\u00f3w sprz\u0119tu wi\u0119cej mo\u017cesz chcie\u0107 to wy\u0142\u0105czy\u0107 dla systemu o niskich parametrach.",
"ENABLE_PLUGINS_name": "W\u0142\u0105cz Pluginy",
"Email_display_name": "Email",
"Email_icon": "<i class=\"fa fa-at\"></i>",
"Events_Loading": "Wczytywanie...",
"Events_Periodselect_All": "Wszystkie Informacje",
"Events_Periodselect_LastMonth": "Ostatni Miesi\u0105c",
"Events_Periodselect_LastWeek": "Ostatni Tydzie\u0144",
"Events_Periodselect_LastYear": "Ostatni Rok",
"Events_Periodselect_today": "Dzisiaj",
"Events_Searchbox": "Szukaj",
"Events_Shortcut_AllEvents": "Wszystkie Wydarzenia",
"Events_Shortcut_DownAlerts": "Alerty o roz\u0142\u0105czeniu",
"Events_Shortcut_Events": "Wydarzenia",
"Events_Shortcut_MissSessions": "Brakuj\u0105ce Sesje",
"Events_Shortcut_NewDevices": "Nowe Urz\u0105dzenia",
"Events_Shortcut_Sessions": "Sesje",
"Events_Shortcut_VoidSessions": "Uniewa\u017cnione sesje",
"Events_TableHead_AdditionalInfo": "Dodatkowe Info",
"Events_TableHead_Connection": "Po\u0142\u0105czenie",
"Events_TableHead_Date": "Data",
"Events_TableHead_Device": "Urz\u0105dzenie",
"Events_TableHead_Disconnection": "Roz\u0142\u0105czenie",
"Events_TableHead_Duration": "Okres",
"Events_TableHead_DurationOrder": "Kolejno\u015b\u0107 Okresu",
"Events_TableHead_EventType": "Typ Wydarzenia",
"Events_TableHead_IP": "IP",
"Events_TableHead_IPOrder": "Kolejno\u015b\u0107 IP",
"Events_TableHead_Order": "Kolejno\u015b\u0107",
"Events_TableHead_Owner": "W\u0142a\u015bciciel",
"Events_TableHead_PendingAlert": "",
"Events_Table_info": "Poka\u017c_START_do_KONIEC_wszystkich_wpis\u00f3w",
"Events_Table_nav_next": "Nast\u0119pna",
"Events_Table_nav_prev": "Poprzednia",
"Events_Tablelenght": "Poka\u017c_wpisy_MENU",
"Events_Tablelenght_all": "Wszystkie",
"Events_Title": "Wydarzenia",
"Gen_Action": "Akcja",
"Gen_Add": "Dodaj",
"Gen_Add_All": "Dodaj wszystko",
"Gen_AreYouSure": "Jeste\u015b pewien?",
"Gen_Backup": "Wykonaj Kopie Zapasow\u0105",
"Gen_Cancel": "Anuluj",
"Gen_Copy": "Wykonaj",
"Gen_DataUpdatedUITakesTime": "OK - Aktualizacja UI mo\u017ce chwile potrwa\u0107 je\u017celi wykonywany jest skan.",
"Gen_Delete": "Usu\u0144",
"Gen_DeleteAll": "Usu\u0144 wszystko",
"Gen_Error": "B\u0142\u0105d",
"Gen_Filter": "Filtr",
"Gen_LockedDB": "B\u0141\u0104D - BAZA DANYCH mo\u017ce by\u0107 zablokowana - Sprawd\u017a F12 narz\u0119dzia dewelopera -> Konsola lub spr\u00f3buj ponownie p\u00f3\u017aniej.",
"Gen_Offline": "",
"Gen_Okay": "Ok",
"Gen_Purge": "Wyczy\u015b\u0107",
"Gen_ReadDocs": "Przeczytaj wi\u0119cej w dokumentacji.",
"Gen_Remove_All": "Usu\u0144 wszystko",
"Gen_Remove_Last": "Usu\u0144 ostatnie",
"Gen_Restore": "Wykonaj Przywracanie",
"Gen_Run": "Wykonaj",
"Gen_Save": "Zapisz",
"Gen_Saved": "Zapisano",
"Gen_Search": "Szukaj",
"Gen_Selected_Devices": "Wybierz Urz\u0105dzenia:",
"Gen_Switch": "Switch",
"Gen_Upd": "Zaktualizowane poprawnie",
"Gen_Upd_Fail": "Aktualizacja nie powiod\u0142a si\u0119",
"Gen_Update": "Aktualizuj",
"Gen_Update_Value": "Aktualizuj Warto\u015b\u0107",
"Gen_Warning": "Uwaga",
"Gen_Work_In_Progress": "Praca w toku, dobry czas na feedback https://github.com/jokob-sk/NetAlertX/issues",
"General_display_name": "Og\u00f3lne",
"General_icon": "<i class=\"fa fa-gears\"></i>",
"HRS_TO_KEEP_NEWDEV_description": "To jest ustawienie konserwacyjne. Je\u017celi uruchomione (<code>0</code> jest wy\u0142\u0105czone), urz\u0105dzenie oznaczone jako <b>Nowe Urz\u0105dzenie</b> zostanie usuni\u0119te je\u017celi czas <b>Pierwszej Sesji</b> jest starszy ni\u017c godzina podana w tym ustawieniu. Uzyj tego ustawienia je\u017celi chcesz automatycznie usuwa\u0107 <b>Nowe Urz\u0105dzenia</b> po <code>X</code> godzinach.",
"HRS_TO_KEEP_NEWDEV_name": "Trzymaj nowe urz\u0105dzenia przez",
"HelpFAQ_Cat_Detail": "Szczeg\u00f3\u0142y",
"HelpFAQ_Cat_Detail_300_head": "Co oznacza ",
"HelpFAQ_Cat_Detail_300_text_a": "oznacza urz\u0105dzenie sieciowe (urz\u0105dzenie typu AP, Gateway, Zapora sieciowa, Hypervisor, Powerline, Switch, WLAN, PLC, Ruter, Adapter USB LAN, Adapter USB WIFI, oraz Internet). W\u0142asny typ mo\u017ce zosta\u0107 dodany poprzez ustawienie <code>NETWORK_DEVICE_TYPE</code>.",
"HelpFAQ_Cat_Detail_300_text_b": "wyznacza numer portu gdzie aktualne urz\u0105dzenie jest pod\u0142\u0105czone do urz\u0105dzenia sieciowego. Przeczytaj <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">ten przewodnik</a>po wi\u0119cej informacji.",
"HelpFAQ_Cat_Detail_301_head_a": "Kiedy b\u0119dzie teraz skanowanie? ",
"HelpFAQ_Cat_Detail_301_head_b": " m\u00f3wi \u017ce 1min ale graf pokazuje interwa\u0142 5 minutowy.",
"HelpFAQ_Cat_Detail_301_text": "Interwa\u0142 czasowy mi\u0119dzy skanowanie jest okre\u015blany przez \"Cronjob\", kt\u00f3ry jest podstawowo ustawiony na 5 min. Okre\u015blenie \"1min\" odnosi si\u0119 do oczekiwanego czasu skanowania. Zale\u017cnie od konfiguracji sieci ten czas mo\u017ce si\u0119 r\u00f3\u017cni\u0107. By edytowa\u0107 cronjob, mo\u017cesz u\u017cy\u0107 nast\u0119puj\u0105cej komendy w konsoli <span class=\"text-danger help_faq_code\">crontab -e</span> i zmieni\u0107 interwa\u0142.",
"HelpFAQ_Cat_Detail_302_head_a": "Co oznacza ",
"HelpFAQ_Cat_Detail_302_head_b": "i czemu nie mo\u017cna tego zaznaczy\u0107?",
"HelpFAQ_Cat_Detail_302_text": "Niekt\u00f3re nowoczesne urz\u0105dzenia generuj\u0105 losowy adres MAC z powod\u00f3w prywatno\u015bci, kt\u00f3re nie mog\u0105 by\u0107 przypisane do \u017cadnego producenta i mo\u017ce si\u0119 zmienia\u0107 co nowe po\u0142\u0105czenie. NetAlertX wykrywa czy adres MAC jest losowy i automatycznie aktywuje te \"pole\". By wy\u0142\u0105czy\u0107 takie zachowanie musisz sprawdzi\u0107 jak wy\u0142\u0105czy\u0107 w swoim urz\u0105dzeniu losowe generowanie adresu MAC.",
"HelpFAQ_Cat_Detail_303_head": "Co to jest Nmap i do czego s\u0142u\u017cy?",
"HelpFAQ_Cat_Detail_303_text": "Nmap jest skanerem sieci z wieloma mo\u017cliwo\u015bciami. <br> Kiedy urz\u0105dzenie pojawia si\u0119 na twojej li\u015bcie, masz mo\u017cliwo\u015b\u0107 zebra\u0107 wi\u0119cej informacji o urz\u0105dzeniu poprzez skan Nmap.",
"HelpFAQ_Cat_Device_200_head": "Posiadam na swojej li\u015bcie urz\u0105dzenia o kt\u00f3rych nie wiem. Po usuni\u0119ciu ich znowu si\u0119 pojawiaj\u0105.",
"HelpFAQ_Cat_Device_200_text": "Je\u017celi u\u017cywasz Pi-hole, zanotuj \u017ce NetAlertX otrzymuje informacje ze Pi-hole. Zatrzymaj NetAlertX, porzejdz do strony ustawie\u0144 Pi-Hole i usu\u0144 niepotrzebne dzier\u017cawy DHCP je\u017celi to konieczne. Nast\u0119pnie, tak\u017ce w Pi-hole, pod ustawieniami Narz\u0119dzia -> Sie\u0107 (Tools -> Network) sprawd\u017a czy widzisz powracaj\u0105ce urz\u0105dzenia. Je\u017celi tak to usu\u0144 je tak\u017ce. Teraz mo\u017cesz uruchomi\u0107 NetAlertX ponownie. Teraz urzadzenie(a) nie powinny si\u0119 ju\u017c pojawiac.",
"HelpFAQ_Cat_General": "Og\u00f3lne",
"HelpFAQ_Cat_General_100_head": "Zegar po prawej na g\u00f3rze i czas wydarze\u0144/obecno\u015bci nie jest poprawny (r\u00f3\u017cni\u0105cy si\u0119 czas).",
"HelpFAQ_Cat_General_100_text_a": "Na twoim komputerze strefa czasowa jest ustawiona na \u015brodowisko PHP:",
"HelpFAQ_Cat_General_100_text_b": "Je\u017celi nie jest to strefa czasowa w kt\u00f3rej jeste\u015b, powiniene\u015b zmieni\u0107 stref\u0119 czasow\u0105 w pliku konfiguracyjnym PHP. Mo\u017cesz znale\u017a\u0107 ten plik w folderze:",
"HelpFAQ_Cat_General_100_text_c": "Przeszukaj plik w poszukiwaniu wpisu \"date.timezone\", i usu\u0144 \";\" je\u017celi jest to konieczne oraz wprowad\u017a po\u017c\u0105dan\u0105 stref\u0119 czasow\u0105. Lista wpieranych stref czasowych znajdziesz tutaj (<a href=\"https://www.php.net/manual/en/timezones.php\" target=\"blank\">Link</a>)",
"HelpFAQ_Cat_General_101_head": "Moja sie\u0107 chyba zwolni\u0142a, ogl\u0105danie film\u00f3w \"zawiesza si\u0119\".",
"HelpFAQ_Cat_General_101_text": "Mo\u017cliwe \u017ce wolne urz\u0105dzenia osi\u0105gn\u0119\u0142y sw\u00f3j limit wydajno\u015bci ze wzgl\u0119du na spos\u00f3b w jaki NetAlerX wykrywa nowe urz\u0105dzenia w sieci. Jest to jeszcze bardziej spot\u0119gowane, je\u017celi te urz\u0105dzenia komunikuj\u0105 si\u0119 za pomoc\u0105 sieci WLAN (bezprzewodowej). Rozwi\u0105zaniem b\u0119dzie zmiana na sie\u0107 przewodow\u0105 je\u017celi to mo\u017cliwe lub je\u017celi urz\u0105dzenie jest u\u017cywane przez kr\u00f3tki czas, to lepiej u\u017cy\u0107 skanu ARP. Zatrzymaj skan ARP w karcie Konserwacja.",
"HelpFAQ_Cat_General_102_head": "Dostaje wiadomo\u015b\u0107 \u017ce baza danych jest tylko do odczytu.",
"HelpFAQ_Cat_General_102_text": "Sprawd\u017a w folderze NetAlertX czy folder bazy danych (db) ma przypisany poprawne uprawnienia: <br><span class=\"text-danger help_faq_code\">drwxrwx---2 (twoja nazwa u\u017cytkownika) www-data</span><br> Je\u017celi uprawnienia s\u0105 niepoprawne mo\u017cesz ustawi\u0107 je za pomoc\u0105 komendy w konsoli lub terminalu: <br> <span class=\"text-danger help_faq_code\">sudo chgrp -R www-data /app/db<br>chmod -R 770 /app/db</span><br> Je\u017celi baza danych dalej jest tylko do odczytu spr\u00f3buj przeinstalowa\u0107 albo przywr\u00f3ci\u0107 baz\u0119 danych z kopii zapasowej w karcie Konserwacji.",
"HelpFAQ_Cat_General_102docker_head": "B\u0142\u0119dy bazy danych (AJAX errors, read-only, not found)",
"HelpFAQ_Cat_General_102docker_text": "Sprawd\u017a jeszcze raz <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles\">dockerfile readme (naj\u015bwie\u017csze informacje)</a>.<br/><br/><ul data-sourcepos=\"49:4-52:146\" dir=\"auto\">Pobierz<a target=\"_blank\"href=\"https://github.com/jokob-sk/NetAlertX/blob/main/db/app.db\">oryginaln\u0105 baz\u0119 danych z GitHub</a>.</li><li data-sourcepos=\"50:4-50:195\">Zmapuj plik <code>app.db</code>(<g-emoji class=\"g-emoji\" alias=\"warning\" fallback-src=\"https://github.githubassets.com/images/icons/emoji/unicode/26a0.png\">\u26a0</g-emoji> nie folder) z \u015bcie\u017cki do <code>/app/db/app.db</code> (sprawd\u017a<a target=\"_blank\"href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles#-examples\">Przyk\u0142ady</a> by dowiedzie\u0107 si\u0119 wi\u0119cej).</li><li data-sourcepos=\"51:4-51:161\">Je\u017celi napotka\u0142e\u015b b\u0142\u0119dy (AJAX errors, can not write to DB, itp) upewnij sie \u017ce uprawnienia s\u0105 poprawne lub sprawd\u017a plik log\u00f3w w <code>/app/front/log</code>.</li><li data-sourcepos=\"52:4-52:146\">By naprawi\u0107 problemy spr\u00f3buj wykona\u0107 kopie zapasow\u0105 bazy danych i ja przywr\u00f3\u0107 za pomoc\u0105 sekcji <strong>Konserwacja&gt; Kopia Zapasowa/Przywracanie</strong>.</li><li data-sourcepos=\"53:4-53:228\">Je\u017celi baza danych jest w trybie tylko do odczytu (read-only mode) mo\u017cesz to rozwi\u0105za\u0107 ustawiaj\u0105c w\u0142a\u015bciciela i grup\u0119 poprzez zastosowanie nast\u0119puj\u0105cej komendy w ho\u015bcie systemu: <code>docker exec netalertx chown -R www-data:www-data /app/db/app.db</code>.</li></ul>",
"HelpFAQ_Cat_General_103_head": "Strona logowania nie pojawia si\u0119, nawet po zmianie has\u0142a.",
"HelpFAQ_Cat_General_103_text": "Opr\u00f3cz zmiany has\u0142a, plik konfiguracji musi zawiera\u0107 <span class=\"text-danger help_faq_code\">/app/config/app.conf</span> oraz parametr <span class=\"text-danger help_faq_code\">PIALERT_WEB_PROTECTION</span> musi by\u0107 ustawiony na <span class=\"text-danger help_faq_code\">True</span>.",
"HelpFAQ_Cat_Network_600_head": "Po co jest ta strona?",
"HelpFAQ_Cat_Network_600_text": "Ta strona powinna zapewni\u0107 ci mo\u017cliwo\u015b\u0107 przypisania twoich urz\u0105dze\u0144 sieciowych. W tym celu mo\u017cesz tworzy\u0107 jeden lub wi\u0119cej switch'y, ruter\u00f3w itp, ustawi\u0107 im numery port\u00f3w je\u017celi to konieczne oraz przypisa\u0107 do nich ju\u017c wykryte urz\u0105dzenia. Przypisanie jest mo\u017cliwe w widoku szczeg\u00f3\u0142owym urz\u0105dzenia do przypisania. Dzi\u0119ki temu mo\u017cna szybko okre\u015bli\u0107, do kt\u00f3rego portu pod\u0142\u0105czony jest host i czy jest on online. Przeczytaj ten <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">poradnik</a> po wi\u0119cej informacji.",
"HelpFAQ_Cat_Network_601_head": "Czy jest te\u017c inna dokumentacja?",
"HelpFAQ_Cat_Network_601_text": "Tak, istnieje! Sprawd\u017a <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/\"> wszystkie dokumentacje </a>po wi\u0119cej informacji.",
"HelpFAQ_Cat_Presence_400_head": "Urz\u0105dzenia s\u0105 wy\u015bwietlane z \u017c\u00f3\u0142tym oznaczeniem i notatk\u0105 \"brakuje wydarzenia\".",
"HelpFAQ_Cat_Presence_400_text": "Je\u017celi tak si\u0119 dzieje, masz mo\u017cliwo\u015b\u0107 usuni\u0119cia wydarzenia na danym urz\u0105dzenia (widok szczeg\u00f3\u0142owy). Kolejna mo\u017cliwo\u015b\u0107 to w\u0142\u0105czenie urz\u0105dzenia i oczekiwanie a\u017c NetAlertX wykryje urz\u0105dzenie jako \"online\" przy kolejnym skanowaniu, a nast\u0119pnie wy\u0142\u0105czenia ponownie urz\u0105dzenia. Teraz NetAlertX powinien poprawnie zanotowa\u0107 stan urz\u0105dzenia w bazie danych przy kolejnym skanowaniu.",
"HelpFAQ_Cat_Presence_401_head": "Urz\u0105dzenie jest wy\u015bwietlane jako dost\u0119pne imo i\u017c jest \"Offline\".",
"HelpFAQ_Cat_Presence_401_text": "Je\u017celi tak si\u0119 dzieje, to masz mo\u017cliwo\u015b\u0107 usuni\u0119cia wydarzenia na danym urz\u0105dzenia (widok szczeg\u00f3\u0142owy). Kolejna mo\u017cliwo\u015b\u0107 to w\u0142\u0105czenie urz\u0105dzenia i oczekiwanie a\u017c NetAlertX wykryje urz\u0105dzenie jako \"online\" przy kolejnym skanowaniu, a nast\u0119pnie wy\u0142\u0105czenia ponownie urz\u0105dzenia. Teraz NetAlertX powinien poprawnie zanotowa\u0107 stan urz\u0105dzenia w bazie danych przy kolejnym skanowaniu.",
"HelpFAQ_Title": "Pomoc / FAQ",
"LOADED_PLUGINS_description": "",
"LOADED_PLUGINS_name": "",
"LOG_LEVEL_description": "To ustawienie uruchomi bardziej dok\u0142adnie logi. U\u017cyteczne do debugowania powiadomie\u0144 czekaj\u0105cych w bazie danych.",
"LOG_LEVEL_name": "Pokarz dodatkowe logi",
"Loading": "Wczytywanie...",
"Login_Box": "Wprowad\u017a has\u0142o",
"Login_Default_PWD": "Podstawowe has\u0142o \"123456\" jest aktywne.",
"Login_Psw-box": "Has\u0142o",
"Login_Psw_alert": "Alert HAS\u0141A!",
"Login_Psw_folder": "w folderze konfiguracji.",
"Login_Psw_new": "nowe_has\u0142o",
"Login_Psw_run": "By zmieni\u0107 has\u0142o wprowad\u017a:",
"Login_Remember": "Zapami\u0119taj",
"Login_Remember_small": "(aktualny przez 7 dni)",
"Login_Submit": "Zaloguj",
"Login_Toggle_Alert_headline": "Alert Has\u0142a!",
"Login_Toggle_Info": "Informacje o ha\u015ble",
"Login_Toggle_Info_headline": "Informacje o ha\u015ble",
"Maintenance_Running_Version": "Zainstalowana wersja",
"Maintenance_Status": "Status",
"Maintenance_Title": "Narz\u0119dzia konserwacyjne",
"Maintenance_Tool_ExportCSV": "Eksport CSV",
"Maintenance_Tool_ExportCSV_noti": "Eksport CSV",
"Maintenance_Tool_ExportCSV_noti_text": "Jeste\u015b pewien, \u017ce chcesz wygenerowa\u0107 plik CSV?",
"Maintenance_Tool_ExportCSV_text": "Wygeneruj plik CSV (warto\u015bci oddzielone przecinkami) zawieraj\u0105cy list\u0119 Urz\u0105dze\u0144 zawieraj\u0105c\u0105 relacj\u0119 sieciow\u0105 miedzy W\u0119z\u0142ami Sieciowymi oraz po\u0142\u0105czone urz\u0105dzenia. Mo\u017cesz tak\u017ce wywo\u0142a\u0107 t\u0105 akcje wchodz\u0105c w ten link <code>your NetAlertX url/php/server/devices.php?action=ExportCSV</code> lub w\u0142\u0105czaj\u0105c plugin<a href=\"settings.php#CSVBCKP_header\">Kopia Zapasowa CSV</a>.",
"Maintenance_Tool_ImportCSV": "Import CSV",
"Maintenance_Tool_ImportCSV_noti": "Import CSV",
"Maintenance_Tool_ImportCSV_noti_text": "Jeste\u015b pewien \u017ce chcesz zaimportowa\u0107 plik CSV? Nadpisze to wszystkie urz\u0105dzenie w bazie danych.",
"Maintenance_Tool_ImportCSV_text": "Przed u\u017cyciem tej funkcji, wykonaj prosz\u0119 kopi\u0119 zapasow\u0105. Zaimportuj plik CSV (warto\u015bci oddzielone przecinkami) zawieraj\u0105cy list\u0119 Urz\u0105dze\u0144, w tym Relacji Sieci mi\u0119dzy sieciowymi w\u0119z\u0142ami i pod\u0142\u0105czonymi urz\u0105dzeniami. By to zrobi\u0107 umie\u015b\u0107 plik CSV nazwany <b>devices.csv</b> do twojego folderu <b>/config</b>.",
"Maintenance_Tool_arpscansw": "Prze\u0142\u0105cz Skan-arp (w\u0142/wy\u0142)",
"Maintenance_Tool_arpscansw_noti": "Prze\u0142\u0105cz Skan-arp na w\u0142\u0105czony lub wy\u0142\u0105czony",
"Maintenance_Tool_arpscansw_noti_text": "Kiedy skan zostanie prze\u0142\u0105czony na wy\u0142 zostaje wy\u0142\u0105czony do czasu ponownej aktywacji.",
"Maintenance_Tool_arpscansw_text": "Prze\u0142\u0105czanie Skan-arp na w\u0142 lub wy\u0142. Kiedy skan zostanie prze\u0142\u0105czony na wy\u0142 to zostaje wy\u0142\u0105czony do ponownej aktywacji. Aktywne skany nie zostaje anulowane.",
"Maintenance_Tool_backup": "Kopia Zapasowa Bazy Danych",
"Maintenance_Tool_backup_noti": "Kopia Zapasowa Bazy Danych",
"Maintenance_Tool_backup_noti_text": "Jeste\u015b pewien \u017ce chcesz uruchomi\u0107 Kopie zapasow\u0105 bazy danych? Upewnij si\u0119 \u017ce \u017caden skan nie jest teraz aktywny.",
"Maintenance_Tool_backup_text": "Kopie zapasowe bazy danych s\u0105 zlokalizowane w folderze bazy danych jako pliki archiwizacji zip, nazwane dat\u0105 ich utworzenia. Nie ma maksymalnej liczby kopii zapasowych.",
"Maintenance_Tool_check_visible": "Odznacz by ukry\u0107 kolumn\u0119.",
"Maintenance_Tool_darkmode": "Prze\u0142\u0105cz Tryb (Ciemny/Jasny)",
"Maintenance_Tool_darkmode_noti": "Prze\u0142\u0105cz Tryb",
"Maintenance_Tool_darkmode_noti_text": "Po zmianie tematyki, storna prze\u0142aduje si\u0119 sama by aktywowa\u0107 zmiany. Je\u017celi b\u0119dzie to konieczne, musisz wyczy\u015bci\u0107 pami\u0119\u0107 cache.",
"Maintenance_Tool_darkmode_text": "Prze\u0142\u0105cz miedzy trybem ciemnym, a jasnym. Je\u017celi prze\u0142\u0105cznik nie dzia\u0142a poprawnie, spr\u00f3buj wyczy\u015bci\u0107 pliki cache. Zmiana jest wprowadzana po stronie serwera, wi\u0119c dotknie to wszystkie urz\u0105dzenia kt\u00f3re aktualnie korzystaj\u0105 z narz\u0119dzia.",
"Maintenance_Tool_del_ActHistory": "Usuwanie aktywno\u015bci sieci",
"Maintenance_Tool_del_ActHistory_noti": "Usu\u0144 aktywno\u015b\u0107 sieci",
"Maintenance_Tool_del_ActHistory_noti_text": "Jeste\u015b pewien \u017ce chcesz zresetowa\u0107 aktywno\u015b\u0107 sieci?",
"Maintenance_Tool_del_ActHistory_text": "Graf aktywno\u015bci sieci zosta\u0142 zresetowany. Nie ma to wp\u0142ywu na aktywno\u015bci.",
"Maintenance_Tool_del_alldev": "Usu\u0144 wszystkie Urz\u0105dzenia",
"Maintenance_Tool_del_alldev_noti": "Usu\u0144 Urz\u0105dzenia",
"Maintenance_Tool_del_alldev_noti_text": "Jeste\u015b pewien \u017ce chcesz usun\u0105\u0107 wszystkie urz\u0105dzenia?",
"Maintenance_Tool_del_alldev_text": "",
"Maintenance_Tool_del_allevents": "",
"Maintenance_Tool_del_allevents30": "",
"Maintenance_Tool_del_allevents30_noti": "",
"Maintenance_Tool_del_allevents30_noti_text": "",
"Maintenance_Tool_del_allevents30_text": "",
"Maintenance_Tool_del_allevents_noti": "",
"Maintenance_Tool_del_allevents_noti_text": "",
"Maintenance_Tool_del_allevents_text": "",
"Maintenance_Tool_del_empty_macs": "",
"Maintenance_Tool_del_empty_macs_noti": "",
"Maintenance_Tool_del_empty_macs_noti_text": "",
"Maintenance_Tool_del_empty_macs_text": "",
"Maintenance_Tool_del_selecteddev": "",
"Maintenance_Tool_del_selecteddev_text": "",
"Maintenance_Tool_del_unknowndev": "",
"Maintenance_Tool_del_unknowndev_noti": "",
"Maintenance_Tool_del_unknowndev_noti_text": "",
"Maintenance_Tool_del_unknowndev_text": "",
"Maintenance_Tool_displayed_columns_text": "",
"Maintenance_Tool_drag_me": "",
"Maintenance_Tool_order_columns_text": "",
"Maintenance_Tool_purgebackup": "",
"Maintenance_Tool_purgebackup_noti": "",
"Maintenance_Tool_purgebackup_noti_text": "",
"Maintenance_Tool_purgebackup_text": "",
"Maintenance_Tool_restore": "",
"Maintenance_Tool_restore_noti": "",
"Maintenance_Tool_restore_noti_text": "",
"Maintenance_Tool_restore_text": "",
"Maintenance_Tool_upgrade_database_noti": "",
"Maintenance_Tool_upgrade_database_noti_text": "",
"Maintenance_Tool_upgrade_database_text": "",
"Maintenance_Tools_Tab_BackupRestore": "",
"Maintenance_Tools_Tab_Logging": "",
"Maintenance_Tools_Tab_Settings": "",
"Maintenance_Tools_Tab_Tools": "",
"Maintenance_Tools_Tab_UISettings": "",
"Maintenance_arp_status": "",
"Maintenance_arp_status_off": "",
"Maintenance_arp_status_on": "",
"Maintenance_built_on": "",
"Maintenance_current_version": "",
"Maintenance_database_backup": "",
"Maintenance_database_backup_found": "",
"Maintenance_database_backup_total": "",
"Maintenance_database_lastmod": "",
"Maintenance_database_path": "",
"Maintenance_database_rows": "",
"Maintenance_database_size": "",
"Maintenance_lang_selector_apply": "",
"Maintenance_lang_selector_empty": "",
"Maintenance_lang_selector_lable": "",
"Maintenance_lang_selector_text": "",
"Maintenance_new_version": "",
"Maintenance_themeselector_apply": "",
"Maintenance_themeselector_empty": "",
"Maintenance_themeselector_lable": "",
"Maintenance_themeselector_text": "",
"Maintenance_version": "",
"NETWORK_DEVICE_TYPES_description": "",
"NETWORK_DEVICE_TYPES_name": "",
"Navigation_About": "",
"Navigation_Devices": "",
"Navigation_Donations": "",
"Navigation_Events": "",
"Navigation_HelpFAQ": "",
"Navigation_Integrations": "",
"Navigation_Maintenance": "",
"Navigation_Monitoring": "",
"Navigation_Network": "",
"Navigation_Notifications": "",
"Navigation_Plugins": "",
"Navigation_Presence": "",
"Navigation_Report": "",
"Navigation_Settings": "",
"Navigation_SystemInfo": "",
"Navigation_Workflows": "",
"Network_Assign": "",
"Network_Cant_Assign": "",
"Network_Configuration_Error": "",
"Network_Connected": "",
"Network_ManageAdd": "",
"Network_ManageAdd_Name": "",
"Network_ManageAdd_Name_text": "",
"Network_ManageAdd_Port": "",
"Network_ManageAdd_Port_text": "",
"Network_ManageAdd_Submit": "",
"Network_ManageAdd_Type": "",
"Network_ManageAdd_Type_text": "",
"Network_ManageAssign": "",
"Network_ManageDel": "",
"Network_ManageDel_Name": "",
"Network_ManageDel_Name_text": "",
"Network_ManageDel_Submit": "",
"Network_ManageDevices": "",
"Network_ManageEdit": "",
"Network_ManageEdit_ID": "",
"Network_ManageEdit_ID_text": "",
"Network_ManageEdit_Name": "",
"Network_ManageEdit_Name_text": "",
"Network_ManageEdit_Port": "",
"Network_ManageEdit_Port_text": "",
"Network_ManageEdit_Submit": "",
"Network_ManageEdit_Type": "",
"Network_ManageEdit_Type_text": "",
"Network_ManageLeaf": "",
"Network_ManageUnassign": "",
"Network_NoAssignedDevices": "",
"Network_NoDevices": "",
"Network_Node": "",
"Network_Node_Name": "",
"Network_Parent": "",
"Network_Root": "",
"Network_Root_Not_Configured": "",
"Network_Root_Unconfigurable": "",
"Network_Table_Hostname": "",
"Network_Table_IP": "",
"Network_Table_State": "",
"Network_Title": "",
"Network_UnassignedDevices": "",
"Notifications_All": "",
"Notifications_Mark_All_Read": "",
"PIALERT_WEB_PASSWORD_description": "",
"PIALERT_WEB_PASSWORD_name": "",
"PIALERT_WEB_PROTECTION_description": "",
"PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "",
"Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "",
"Plugins_History": "",
"Plugins_Objects": "",
"Plugins_Out_of": "",
"Plugins_Unprocessed_Events": "",
"Plugins_no_control": "",
"Presence_CalHead_day": "",
"Presence_CalHead_lang": "",
"Presence_CalHead_month": "",
"Presence_CalHead_quarter": "",
"Presence_CalHead_week": "",
"Presence_CalHead_year": "",
"Presence_CallHead_Devices": "",
"Presence_Loading": "",
"Presence_Shortcut_AllDevices": "",
"Presence_Shortcut_Archived": "",
"Presence_Shortcut_Connected": "",
"Presence_Shortcut_Devices": "",
"Presence_Shortcut_DownAlerts": "",
"Presence_Shortcut_Favorites": "",
"Presence_Shortcut_NewDevices": "",
"Presence_Title": "",
"REPORT_DASHBOARD_URL_description": "",
"REPORT_DASHBOARD_URL_name": "",
"REPORT_ERROR": "",
"REPORT_MAIL_description": "",
"REPORT_MAIL_name": "",
"REPORT_TITLE": "",
"RandomMAC_hover": "",
"Reports_Sent_Log": "",
"SCAN_SUBNETS_description": "",
"SYSTEM_TITLE": "",
"Setting_Override": "",
"Setting_Override_Description": "",
"Settings_Metadata_Toggle": "",
"Settings_device_Scanners_desync": "",
"Settings_device_Scanners_desync_popup": "",
"Speedtest_Results": "",
"Systeminfo_CPU": "",
"Systeminfo_CPU_Cores": "",
"Systeminfo_CPU_Name": "",
"Systeminfo_CPU_Speed": "",
"Systeminfo_CPU_Temp": "",
"Systeminfo_CPU_Vendor": "",
"Systeminfo_Client_Resolution": "",
"Systeminfo_Client_User_Agent": "",
"Systeminfo_General": "",
"Systeminfo_General_Date": "",
"Systeminfo_General_Date2": "",
"Systeminfo_General_Full_Date": "",
"Systeminfo_General_TimeZone": "",
"Systeminfo_Memory": "",
"Systeminfo_Memory_Total_Memory": "",
"Systeminfo_Memory_Usage": "",
"Systeminfo_Memory_Usage_Percent": "",
"Systeminfo_Motherboard": "",
"Systeminfo_Motherboard_BIOS": "",
"Systeminfo_Motherboard_BIOS_Date": "",
"Systeminfo_Motherboard_BIOS_Vendor": "",
"Systeminfo_Motherboard_Manufactured": "",
"Systeminfo_Motherboard_Name": "",
"Systeminfo_Motherboard_Revision": "",
"Systeminfo_Network": "",
"Systeminfo_Network_Accept_Encoding": "",
"Systeminfo_Network_Accept_Language": "",
"Systeminfo_Network_Connection_Port": "",
"Systeminfo_Network_HTTP_Host": "",
"Systeminfo_Network_HTTP_Referer": "",
"Systeminfo_Network_HTTP_Referer_String": "",
"Systeminfo_Network_Hardware": "",
"Systeminfo_Network_Hardware_Interface_Mask": "",
"Systeminfo_Network_Hardware_Interface_Name": "",
"Systeminfo_Network_Hardware_Interface_RX": "",
"Systeminfo_Network_Hardware_Interface_TX": "",
"Systeminfo_Network_IP": "",
"Systeminfo_Network_IP_Connection": "",
"Systeminfo_Network_IP_Server": "",
"Systeminfo_Network_MIME": "",
"Systeminfo_Network_Request_Method": "",
"Systeminfo_Network_Request_Time": "",
"Systeminfo_Network_Request_URI": "",
"Systeminfo_Network_Secure_Connection": "",
"Systeminfo_Network_Secure_Connection_String": "",
"Systeminfo_Network_Server_Name": "",
"Systeminfo_Network_Server_Name_String": "",
"Systeminfo_Network_Server_Query": "",
"Systeminfo_Network_Server_Query_String": "",
"Systeminfo_Network_Server_Version": "",
"Systeminfo_Services": "",
"Systeminfo_Services_Description": "",
"Systeminfo_Services_Name": "",
"Systeminfo_Storage": "",
"Systeminfo_Storage_Device": "",
"Systeminfo_Storage_Mount": "",
"Systeminfo_Storage_Size": "",
"Systeminfo_Storage_Type": "",
"Systeminfo_Storage_Usage": "",
"Systeminfo_Storage_Usage_Free": "",
"Systeminfo_Storage_Usage_Mount": "",
"Systeminfo_Storage_Usage_Total": "",
"Systeminfo_Storage_Usage_Used": "",
"Systeminfo_System": "",
"Systeminfo_System_AVG": "",
"Systeminfo_System_Architecture": "",
"Systeminfo_System_Kernel": "",
"Systeminfo_System_OSVersion": "",
"Systeminfo_System_Running_Processes": "",
"Systeminfo_System_System": "",
"Systeminfo_System_Uname": "",
"Systeminfo_System_Uptime": "",
"Systeminfo_This_Client": "",
"Systeminfo_USB_Devices": "",
"TICKER_MIGRATE_TO_NETALERTX": "",
"TIMEZONE_description": "",
"TIMEZONE_name": "",
"UI_DEV_SECTIONS_description": "",
"UI_DEV_SECTIONS_name": "",
"UI_ICONS_description": "",
"UI_ICONS_name": "",
"UI_LANG_description": "",
"UI_LANG_name": "",
"UI_MY_DEVICES_description": "",
"UI_MY_DEVICES_name": "",
"UI_NOT_RANDOM_MAC_description": "",
"UI_NOT_RANDOM_MAC_name": "",
"UI_PRESENCE_description": "",
"UI_PRESENCE_name": "",
"UI_REFRESH_description": "",
"UI_REFRESH_name": "",
"devices_old": "",
"general_event_description": "",
"general_event_title": "",
"report_guid": "",
"report_guid_missing": "",
"report_select_format": "",
"report_time": "",
"run_event_icon": "",
"run_event_tooltip": "",
"settings_core_icon": "",
"settings_core_label": "",
"settings_device_scanners": "",
"settings_device_scanners_icon": "",
"settings_device_scanners_label": "",
"settings_enabled": "",
"settings_enabled_icon": "",
"settings_expand_all": "",
"settings_imported": "",
"settings_imported_label": "",
"settings_missing": "",
"settings_missing_block": "",
"settings_old": "",
"settings_other_scanners": "",
"settings_other_scanners_icon": "",
"settings_other_scanners_label": "",
"settings_publishers": "",
"settings_publishers_icon": "",
"settings_publishers_label": "",
"settings_saved": "",
"settings_system_icon": "",
"settings_system_label": "",
"settings_update_item_warning": "",
"test_event_icon": "",
"test_event_tooltip": ""
}

View File

@@ -0,0 +1,680 @@
{
"API_CUSTOM_SQL_description": "Voc\u00ea pode especificar uma consulta SQL personalizada que ir\u00e1 gerar um arquivo JSON e, em seguida, exp\u00f4-lo por meio do <a href=\"/api/table_custom_endpoint.json\" target=\"_blank\"><code>table_custom_endpoint.json</code> endpoint do arquivo</a>.",
"API_CUSTOM_SQL_name": "Endpoint customizado",
"API_display_name": "API",
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
"About_Design": "Desenhado por:",
"About_Exit": "Sair",
"About_Title": "Analisador de seguran\u00e7a de rede & framework de notifica\u00e7\u00e3o",
"AppEvents_DateTimeCreated": "Registrado em",
"AppEvents_Extra": "Adicional",
"AppEvents_GUID": "Evento de aplica\u00e7\u00e3o GUID",
"AppEvents_Helper1": "Auxiliar 1",
"AppEvents_Helper2": "Auxiliar 2",
"AppEvents_Helper3": "Auxiliar 3",
"AppEvents_ObjectForeignKey": "Chave Estrangeira",
"AppEvents_ObjectIndex": "\u00cdndice",
"AppEvents_ObjectIsArchived": "Foi arquivado (no hor\u00e1rio do log)",
"AppEvents_ObjectIsNew": "\u00c9 novo (no hor\u00e1rio do log)",
"AppEvents_ObjectPlugin": "Plugin Associado",
"AppEvents_ObjectPrimaryID": "ID Prim\u00e1rio",
"AppEvents_ObjectSecondaryID": "ID Secund\u00e1rio",
"AppEvents_ObjectStatus": "Status (no hor\u00e1rio do log)",
"AppEvents_ObjectStatusColumn": "Coluna de Status",
"AppEvents_ObjectType": "Tipo de Objeto",
"AppEvents_Plugin": "Plugin",
"AppEvents_Type": "Tipo",
"BackDevDetail_Actions_Ask_Run": "Voc\u00ea deseja executar esta a\u00e7\u00e3o?",
"BackDevDetail_Actions_Not_Registered": "A\u00e7\u00e3o n\u00e3o registrada: ",
"BackDevDetail_Actions_Title_Run": "Executar a\u00e7\u00e3o",
"BackDevDetail_Copy_Ask": "Copiar detalhes de dispositivos da lista suspenda (Tudo nesta p\u00e1gina ser\u00e1 substitu\u00eddo)?",
"BackDevDetail_Copy_Title": "Copiar detalhes",
"BackDevDetail_Tools_WOL_error": "O comando N\u00c3O foi executado.",
"BackDevDetail_Tools_WOL_okay": "O comando foi executado.",
"BackDevices_Arpscan_disabled": "Busca Arp Desabilitada",
"BackDevices_Arpscan_enabled": "Busca ARP Habilitada",
"BackDevices_Backup_CopError": "A base da dados original n\u00e3o pode ser salva.",
"BackDevices_Backup_Failed": "A copia de seguran\u00e7a foi parcialmente executada. O arquivo n\u00e3o pode ser criado ou est\u00e1 vazio.",
"BackDevices_Backup_okay": "A copia de seguran\u00e7a foi feita executado corretamente com o novo arquivo",
"BackDevices_DBTools_DelDevError_a": "Erro excluindo o Dispositivo",
"BackDevices_DBTools_DelDevError_b": "Erro excluindo os Dispositivos",
"BackDevices_DBTools_DelDev_a": "Dispositivo excluido",
"BackDevices_DBTools_DelDev_b": "Dispositivos excluidos",
"BackDevices_DBTools_DelEvents": "Eventos excluidos",
"BackDevices_DBTools_DelEventsError": "Erro excluindo os eventos",
"BackDevices_DBTools_ImportCSV": "Os dispositivos do arquivo CSV foram importados com sucesso.",
"BackDevices_DBTools_ImportCSVError": "O arquivo CSV n\u00e3o pode ser importado. Assegure que o formato est\u00e1 correto.",
"BackDevices_DBTools_ImportCSVMissing": "O arquivo CSV n\u00e3o foi localizado em <b>/config/devices.csv.</b>",
"BackDevices_DBTools_Purge": "As copias de seguran\u00e7a antigas foram excluidas",
"BackDevices_DBTools_UpdDev": "Dispositivo atualizado com sucesso",
"BackDevices_DBTools_UpdDevError": "Erro atualizando o dispositivo",
"BackDevices_DBTools_Upgrade": "Banco de dados atualizado com sucesso",
"BackDevices_DBTools_UpgradeError": "A atualiza\u00e7\u00e3o do banco de dados falhou",
"BackDevices_Device_UpdDevError": "Erro atualizando os dispositivos, tente novamente mais tarde. O banco de dados provavelmente est\u00e1 travado com uma tarefa em andamento.",
"BackDevices_Restore_CopError": "O banco de dados original n\u00e3o pode ser salvo.",
"BackDevices_Restore_Failed": "A restaura\u00e7\u00e3o falhou. Por favor restaure a copia de seguran\u00e7a manualmente.",
"BackDevices_Restore_okay": "Restaura\u00e7\u00e3o executada com sucesso.",
"BackDevices_darkmode_disabled": "Modo Noturno Desabilitado",
"BackDevices_darkmode_enabled": "Modo Noturno Habilitado",
"DAYS_TO_KEEP_EVENTS_description": "",
"DAYS_TO_KEEP_EVENTS_name": "Excluir eventos mais antigos que",
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copiar detalhes do dispositivo",
"DevDetail_Copy_Device_Tooltip": "",
"DevDetail_EveandAl_AlertAllEvents": "Alerte Todos os Eventos",
"DevDetail_EveandAl_AlertDown": "Alerta Desligado",
"DevDetail_EveandAl_Archived": "Arquivado",
"DevDetail_EveandAl_NewDevice": "Novo Dispositivo",
"DevDetail_EveandAl_NewDevice_Tooltip": "",
"DevDetail_EveandAl_RandomMAC": "MAC Aleat\u00f3rio",
"DevDetail_EveandAl_ScanCycle": "Rastrear dispositivo",
"DevDetail_EveandAl_ScanCycle_a": "Rastrear Dispositivo",
"DevDetail_EveandAl_ScanCycle_z": "N\u00e3o Rastrear Dispositivo",
"DevDetail_EveandAl_Skip": "Pular notifica\u00e7\u00f5es repetidas para",
"DevDetail_EveandAl_Title": "<i class=\"fa fa-bolt\"></i> Configura\u00e7\u00e3o de Eventos & Alertas",
"DevDetail_Events_CheckBox": "Esconder Eventos de Conex\u00e3o",
"DevDetail_GoToNetworkNode": "",
"DevDetail_Icon": "Icone",
"DevDetail_Icon_Descr": "",
"DevDetail_Loading": "",
"DevDetail_MainInfo_Comments": "",
"DevDetail_MainInfo_Favorite": "",
"DevDetail_MainInfo_Group": "",
"DevDetail_MainInfo_Location": "",
"DevDetail_MainInfo_Name": "",
"DevDetail_MainInfo_Network": "",
"DevDetail_MainInfo_Network_Port": "",
"DevDetail_MainInfo_Network_Title": "",
"DevDetail_MainInfo_Owner": "",
"DevDetail_MainInfo_Title": "",
"DevDetail_MainInfo_Type": "",
"DevDetail_MainInfo_Vendor": "",
"DevDetail_MainInfo_mac": "",
"DevDetail_Network_Node_hover": "",
"DevDetail_Network_Port_hover": "",
"DevDetail_Nmap_Scans": "",
"DevDetail_Nmap_Scans_desc": "",
"DevDetail_Nmap_buttonDefault": "",
"DevDetail_Nmap_buttonDefault_text": "",
"DevDetail_Nmap_buttonDetail": "",
"DevDetail_Nmap_buttonDetail_text": "",
"DevDetail_Nmap_buttonFast": "",
"DevDetail_Nmap_buttonFast_text": "",
"DevDetail_Nmap_buttonSkipDiscovery": "",
"DevDetail_Nmap_buttonSkipDiscovery_text": "",
"DevDetail_Nmap_resultsLink": "",
"DevDetail_Owner_hover": "",
"DevDetail_Periodselect_All": "",
"DevDetail_Periodselect_LastMonth": "",
"DevDetail_Periodselect_LastWeek": "",
"DevDetail_Periodselect_LastYear": "",
"DevDetail_Periodselect_today": "",
"DevDetail_Run_Actions_Title": "",
"DevDetail_Run_Actions_Tooltip": "",
"DevDetail_SessionInfo_FirstSession": "",
"DevDetail_SessionInfo_LastIP": "",
"DevDetail_SessionInfo_LastSession": "",
"DevDetail_SessionInfo_StaticIP": "",
"DevDetail_SessionInfo_Status": "",
"DevDetail_SessionInfo_Title": "",
"DevDetail_SessionTable_Additionalinfo": "",
"DevDetail_SessionTable_Connection": "",
"DevDetail_SessionTable_Disconnection": "",
"DevDetail_SessionTable_Duration": "",
"DevDetail_SessionTable_IP": "",
"DevDetail_SessionTable_Order": "",
"DevDetail_Shortcut_CurrentStatus": "",
"DevDetail_Shortcut_DownAlerts": "",
"DevDetail_Shortcut_Presence": "",
"DevDetail_Shortcut_Sessions": "",
"DevDetail_Tab_Details": "",
"DevDetail_Tab_Events": "",
"DevDetail_Tab_EventsTableDate": "",
"DevDetail_Tab_EventsTableEvent": "",
"DevDetail_Tab_EventsTableIP": "",
"DevDetail_Tab_EventsTableInfo": "",
"DevDetail_Tab_Nmap": "",
"DevDetail_Tab_NmapEmpty": "",
"DevDetail_Tab_NmapTableExtra": "",
"DevDetail_Tab_NmapTableHeader": "",
"DevDetail_Tab_NmapTableIndex": "",
"DevDetail_Tab_NmapTablePort": "",
"DevDetail_Tab_NmapTableService": "",
"DevDetail_Tab_NmapTableState": "",
"DevDetail_Tab_NmapTableText": "",
"DevDetail_Tab_NmapTableTime": "",
"DevDetail_Tab_Plugins": "",
"DevDetail_Tab_Presence": "",
"DevDetail_Tab_Sessions": "",
"DevDetail_Tab_Tools": "",
"DevDetail_Tab_Tools_Internet_Info_Description": "",
"DevDetail_Tab_Tools_Internet_Info_Error": "",
"DevDetail_Tab_Tools_Internet_Info_Start": "",
"DevDetail_Tab_Tools_Internet_Info_Title": "",
"DevDetail_Tab_Tools_Nslookup_Description": "",
"DevDetail_Tab_Tools_Nslookup_Error": "",
"DevDetail_Tab_Tools_Nslookup_Start": "",
"DevDetail_Tab_Tools_Nslookup_Title": "",
"DevDetail_Tab_Tools_Speedtest_Description": "",
"DevDetail_Tab_Tools_Speedtest_Start": "",
"DevDetail_Tab_Tools_Speedtest_Title": "",
"DevDetail_Tab_Tools_Traceroute_Description": "",
"DevDetail_Tab_Tools_Traceroute_Error": "",
"DevDetail_Tab_Tools_Traceroute_Start": "",
"DevDetail_Tab_Tools_Traceroute_Title": "",
"DevDetail_Tools_WOL": "",
"DevDetail_Tools_WOL_noti": "",
"DevDetail_Tools_WOL_noti_text": "",
"DevDetail_Type_hover": "",
"DevDetail_Vendor_hover": "",
"DevDetail_WOL_Title": "",
"DevDetail_button_AddIcon": "",
"DevDetail_button_AddIcon_Help": "",
"DevDetail_button_AddIcon_Tooltip": "",
"DevDetail_button_Delete": "",
"DevDetail_button_DeleteEvents": "",
"DevDetail_button_DeleteEvents_Warning": "",
"DevDetail_button_OverwriteIcons": "",
"DevDetail_button_OverwriteIcons_Tooltip": "",
"DevDetail_button_OverwriteIcons_Warning": "",
"DevDetail_button_Reset": "",
"DevDetail_button_Save": "",
"Device_MultiEdit": "",
"Device_MultiEdit_Backup": "",
"Device_MultiEdit_Fields": "",
"Device_MultiEdit_MassActions": "",
"Device_MultiEdit_Tooltip": "",
"Device_Searchbox": "",
"Device_Shortcut_AllDevices": "",
"Device_Shortcut_Archived": "",
"Device_Shortcut_Connected": "",
"Device_Shortcut_Devices": "",
"Device_Shortcut_DownAlerts": "",
"Device_Shortcut_DownOnly": "",
"Device_Shortcut_Favorites": "",
"Device_Shortcut_NewDevices": "",
"Device_Shortcut_OnlineChart": "",
"Device_TableHead_Connected_Devices": "",
"Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "",
"Device_TableHead_GUID": "",
"Device_TableHead_Group": "",
"Device_TableHead_Icon": "",
"Device_TableHead_LastIP": "",
"Device_TableHead_LastIPOrder": "",
"Device_TableHead_LastSession": "",
"Device_TableHead_Location": "",
"Device_TableHead_MAC": "",
"Device_TableHead_MAC_full": "",
"Device_TableHead_Name": "",
"Device_TableHead_Owner": "",
"Device_TableHead_Parent_MAC": "",
"Device_TableHead_Port": "",
"Device_TableHead_RowID": "",
"Device_TableHead_Rowid": "",
"Device_TableHead_Status": "",
"Device_TableHead_SyncHubNodeName": "",
"Device_TableHead_Type": "",
"Device_TableHead_Vendor": "",
"Device_Table_Not_Network_Device": "",
"Device_Table_info": "",
"Device_Table_nav_next": "",
"Device_Table_nav_prev": "",
"Device_Tablelenght": "",
"Device_Tablelenght_all": "",
"Device_Title": "",
"Donations_Others": "",
"Donations_Platforms": "",
"Donations_Text": "",
"Donations_Title": "",
"ENABLE_PLUGINS_description": "",
"ENABLE_PLUGINS_name": "",
"Email_display_name": "",
"Email_icon": "",
"Events_Loading": "",
"Events_Periodselect_All": "",
"Events_Periodselect_LastMonth": "",
"Events_Periodselect_LastWeek": "",
"Events_Periodselect_LastYear": "",
"Events_Periodselect_today": "",
"Events_Searchbox": "",
"Events_Shortcut_AllEvents": "",
"Events_Shortcut_DownAlerts": "",
"Events_Shortcut_Events": "",
"Events_Shortcut_MissSessions": "",
"Events_Shortcut_NewDevices": "",
"Events_Shortcut_Sessions": "",
"Events_Shortcut_VoidSessions": "",
"Events_TableHead_AdditionalInfo": "",
"Events_TableHead_Connection": "",
"Events_TableHead_Date": "",
"Events_TableHead_Device": "",
"Events_TableHead_Disconnection": "",
"Events_TableHead_Duration": "",
"Events_TableHead_DurationOrder": "",
"Events_TableHead_EventType": "",
"Events_TableHead_IP": "",
"Events_TableHead_IPOrder": "",
"Events_TableHead_Order": "",
"Events_TableHead_Owner": "",
"Events_TableHead_PendingAlert": "",
"Events_Table_info": "",
"Events_Table_nav_next": "",
"Events_Table_nav_prev": "",
"Events_Tablelenght": "",
"Events_Tablelenght_all": "",
"Events_Title": "",
"Gen_Action": "",
"Gen_Add": "",
"Gen_Add_All": "",
"Gen_AreYouSure": "",
"Gen_Backup": "",
"Gen_Cancel": "",
"Gen_Copy": "",
"Gen_DataUpdatedUITakesTime": "",
"Gen_Delete": "",
"Gen_DeleteAll": "",
"Gen_Error": "",
"Gen_Filter": "",
"Gen_LockedDB": "",
"Gen_Offline": "",
"Gen_Okay": "",
"Gen_Purge": "",
"Gen_ReadDocs": "",
"Gen_Remove_All": "",
"Gen_Remove_Last": "",
"Gen_Restore": "",
"Gen_Run": "",
"Gen_Save": "",
"Gen_Saved": "",
"Gen_Search": "",
"Gen_Selected_Devices": "",
"Gen_Switch": "",
"Gen_Upd": "",
"Gen_Upd_Fail": "",
"Gen_Update": "",
"Gen_Update_Value": "",
"Gen_Warning": "",
"Gen_Work_In_Progress": "",
"General_display_name": "",
"General_icon": "",
"HRS_TO_KEEP_NEWDEV_description": "",
"HRS_TO_KEEP_NEWDEV_name": "",
"HelpFAQ_Cat_Detail": "",
"HelpFAQ_Cat_Detail_300_head": "",
"HelpFAQ_Cat_Detail_300_text_a": "",
"HelpFAQ_Cat_Detail_300_text_b": "",
"HelpFAQ_Cat_Detail_301_head_a": "",
"HelpFAQ_Cat_Detail_301_head_b": "",
"HelpFAQ_Cat_Detail_301_text": "",
"HelpFAQ_Cat_Detail_302_head_a": "",
"HelpFAQ_Cat_Detail_302_head_b": "",
"HelpFAQ_Cat_Detail_302_text": "",
"HelpFAQ_Cat_Detail_303_head": "",
"HelpFAQ_Cat_Detail_303_text": "",
"HelpFAQ_Cat_Device_200_head": "",
"HelpFAQ_Cat_Device_200_text": "",
"HelpFAQ_Cat_General": "",
"HelpFAQ_Cat_General_100_head": "",
"HelpFAQ_Cat_General_100_text_a": "",
"HelpFAQ_Cat_General_100_text_b": "",
"HelpFAQ_Cat_General_100_text_c": "",
"HelpFAQ_Cat_General_101_head": "",
"HelpFAQ_Cat_General_101_text": "",
"HelpFAQ_Cat_General_102_head": "",
"HelpFAQ_Cat_General_102_text": "",
"HelpFAQ_Cat_General_102docker_head": "",
"HelpFAQ_Cat_General_102docker_text": "",
"HelpFAQ_Cat_General_103_head": "",
"HelpFAQ_Cat_General_103_text": "",
"HelpFAQ_Cat_Network_600_head": "",
"HelpFAQ_Cat_Network_600_text": "",
"HelpFAQ_Cat_Network_601_head": "",
"HelpFAQ_Cat_Network_601_text": "",
"HelpFAQ_Cat_Presence_400_head": "",
"HelpFAQ_Cat_Presence_400_text": "",
"HelpFAQ_Cat_Presence_401_head": "",
"HelpFAQ_Cat_Presence_401_text": "",
"HelpFAQ_Title": "",
"LOADED_PLUGINS_description": "",
"LOADED_PLUGINS_name": "",
"LOG_LEVEL_description": "",
"LOG_LEVEL_name": "",
"Loading": "",
"Login_Box": "",
"Login_Default_PWD": "",
"Login_Psw-box": "",
"Login_Psw_alert": "",
"Login_Psw_folder": "",
"Login_Psw_new": "",
"Login_Psw_run": "",
"Login_Remember": "",
"Login_Remember_small": "",
"Login_Submit": "",
"Login_Toggle_Alert_headline": "",
"Login_Toggle_Info": "",
"Login_Toggle_Info_headline": "",
"Maintenance_Running_Version": "",
"Maintenance_Status": "",
"Maintenance_Title": "",
"Maintenance_Tool_ExportCSV": "",
"Maintenance_Tool_ExportCSV_noti": "",
"Maintenance_Tool_ExportCSV_noti_text": "",
"Maintenance_Tool_ExportCSV_text": "",
"Maintenance_Tool_ImportCSV": "",
"Maintenance_Tool_ImportCSV_noti": "",
"Maintenance_Tool_ImportCSV_noti_text": "",
"Maintenance_Tool_ImportCSV_text": "",
"Maintenance_Tool_arpscansw": "",
"Maintenance_Tool_arpscansw_noti": "",
"Maintenance_Tool_arpscansw_noti_text": "",
"Maintenance_Tool_arpscansw_text": "",
"Maintenance_Tool_backup": "",
"Maintenance_Tool_backup_noti": "",
"Maintenance_Tool_backup_noti_text": "",
"Maintenance_Tool_backup_text": "",
"Maintenance_Tool_check_visible": "",
"Maintenance_Tool_darkmode": "",
"Maintenance_Tool_darkmode_noti": "",
"Maintenance_Tool_darkmode_noti_text": "",
"Maintenance_Tool_darkmode_text": "",
"Maintenance_Tool_del_ActHistory": "",
"Maintenance_Tool_del_ActHistory_noti": "",
"Maintenance_Tool_del_ActHistory_noti_text": "",
"Maintenance_Tool_del_ActHistory_text": "",
"Maintenance_Tool_del_alldev": "",
"Maintenance_Tool_del_alldev_noti": "",
"Maintenance_Tool_del_alldev_noti_text": "",
"Maintenance_Tool_del_alldev_text": "",
"Maintenance_Tool_del_allevents": "",
"Maintenance_Tool_del_allevents30": "",
"Maintenance_Tool_del_allevents30_noti": "",
"Maintenance_Tool_del_allevents30_noti_text": "",
"Maintenance_Tool_del_allevents30_text": "",
"Maintenance_Tool_del_allevents_noti": "",
"Maintenance_Tool_del_allevents_noti_text": "",
"Maintenance_Tool_del_allevents_text": "",
"Maintenance_Tool_del_empty_macs": "",
"Maintenance_Tool_del_empty_macs_noti": "",
"Maintenance_Tool_del_empty_macs_noti_text": "",
"Maintenance_Tool_del_empty_macs_text": "",
"Maintenance_Tool_del_selecteddev": "",
"Maintenance_Tool_del_selecteddev_text": "",
"Maintenance_Tool_del_unknowndev": "",
"Maintenance_Tool_del_unknowndev_noti": "",
"Maintenance_Tool_del_unknowndev_noti_text": "",
"Maintenance_Tool_del_unknowndev_text": "",
"Maintenance_Tool_displayed_columns_text": "",
"Maintenance_Tool_drag_me": "",
"Maintenance_Tool_order_columns_text": "",
"Maintenance_Tool_purgebackup": "",
"Maintenance_Tool_purgebackup_noti": "",
"Maintenance_Tool_purgebackup_noti_text": "",
"Maintenance_Tool_purgebackup_text": "",
"Maintenance_Tool_restore": "",
"Maintenance_Tool_restore_noti": "",
"Maintenance_Tool_restore_noti_text": "",
"Maintenance_Tool_restore_text": "",
"Maintenance_Tool_upgrade_database_noti": "",
"Maintenance_Tool_upgrade_database_noti_text": "",
"Maintenance_Tool_upgrade_database_text": "",
"Maintenance_Tools_Tab_BackupRestore": "",
"Maintenance_Tools_Tab_Logging": "",
"Maintenance_Tools_Tab_Settings": "",
"Maintenance_Tools_Tab_Tools": "",
"Maintenance_Tools_Tab_UISettings": "",
"Maintenance_arp_status": "",
"Maintenance_arp_status_off": "",
"Maintenance_arp_status_on": "",
"Maintenance_built_on": "",
"Maintenance_current_version": "",
"Maintenance_database_backup": "",
"Maintenance_database_backup_found": "",
"Maintenance_database_backup_total": "",
"Maintenance_database_lastmod": "",
"Maintenance_database_path": "",
"Maintenance_database_rows": "",
"Maintenance_database_size": "",
"Maintenance_lang_selector_apply": "",
"Maintenance_lang_selector_empty": "",
"Maintenance_lang_selector_lable": "",
"Maintenance_lang_selector_text": "",
"Maintenance_new_version": "",
"Maintenance_themeselector_apply": "",
"Maintenance_themeselector_empty": "",
"Maintenance_themeselector_lable": "",
"Maintenance_themeselector_text": "",
"Maintenance_version": "",
"NETWORK_DEVICE_TYPES_description": "",
"NETWORK_DEVICE_TYPES_name": "",
"Navigation_About": "",
"Navigation_Devices": "",
"Navigation_Donations": "",
"Navigation_Events": "",
"Navigation_HelpFAQ": "",
"Navigation_Integrations": "",
"Navigation_Maintenance": "",
"Navigation_Monitoring": "",
"Navigation_Network": "",
"Navigation_Notifications": "",
"Navigation_Plugins": "",
"Navigation_Presence": "",
"Navigation_Report": "",
"Navigation_Settings": "",
"Navigation_SystemInfo": "",
"Navigation_Workflows": "",
"Network_Assign": "",
"Network_Cant_Assign": "",
"Network_Configuration_Error": "",
"Network_Connected": "",
"Network_ManageAdd": "",
"Network_ManageAdd_Name": "",
"Network_ManageAdd_Name_text": "",
"Network_ManageAdd_Port": "",
"Network_ManageAdd_Port_text": "",
"Network_ManageAdd_Submit": "",
"Network_ManageAdd_Type": "",
"Network_ManageAdd_Type_text": "",
"Network_ManageAssign": "",
"Network_ManageDel": "",
"Network_ManageDel_Name": "",
"Network_ManageDel_Name_text": "",
"Network_ManageDel_Submit": "",
"Network_ManageDevices": "",
"Network_ManageEdit": "",
"Network_ManageEdit_ID": "",
"Network_ManageEdit_ID_text": "",
"Network_ManageEdit_Name": "",
"Network_ManageEdit_Name_text": "",
"Network_ManageEdit_Port": "",
"Network_ManageEdit_Port_text": "",
"Network_ManageEdit_Submit": "",
"Network_ManageEdit_Type": "",
"Network_ManageEdit_Type_text": "",
"Network_ManageLeaf": "",
"Network_ManageUnassign": "",
"Network_NoAssignedDevices": "",
"Network_NoDevices": "",
"Network_Node": "",
"Network_Node_Name": "",
"Network_Parent": "",
"Network_Root": "",
"Network_Root_Not_Configured": "",
"Network_Root_Unconfigurable": "",
"Network_Table_Hostname": "",
"Network_Table_IP": "",
"Network_Table_State": "",
"Network_Title": "",
"Network_UnassignedDevices": "",
"Notifications_All": "",
"Notifications_Mark_All_Read": "",
"PIALERT_WEB_PASSWORD_description": "",
"PIALERT_WEB_PASSWORD_name": "",
"PIALERT_WEB_PROTECTION_description": "",
"PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "",
"Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "",
"Plugins_History": "",
"Plugins_Objects": "",
"Plugins_Out_of": "",
"Plugins_Unprocessed_Events": "",
"Plugins_no_control": "",
"Presence_CalHead_day": "",
"Presence_CalHead_lang": "",
"Presence_CalHead_month": "",
"Presence_CalHead_quarter": "",
"Presence_CalHead_week": "",
"Presence_CalHead_year": "",
"Presence_CallHead_Devices": "",
"Presence_Loading": "",
"Presence_Shortcut_AllDevices": "",
"Presence_Shortcut_Archived": "",
"Presence_Shortcut_Connected": "",
"Presence_Shortcut_Devices": "",
"Presence_Shortcut_DownAlerts": "",
"Presence_Shortcut_Favorites": "",
"Presence_Shortcut_NewDevices": "",
"Presence_Title": "",
"REPORT_DASHBOARD_URL_description": "",
"REPORT_DASHBOARD_URL_name": "",
"REPORT_ERROR": "",
"REPORT_MAIL_description": "",
"REPORT_MAIL_name": "",
"REPORT_TITLE": "",
"RandomMAC_hover": "",
"Reports_Sent_Log": "",
"SCAN_SUBNETS_description": "",
"SYSTEM_TITLE": "",
"Setting_Override": "",
"Setting_Override_Description": "",
"Settings_Metadata_Toggle": "",
"Settings_device_Scanners_desync": "",
"Settings_device_Scanners_desync_popup": "",
"Speedtest_Results": "",
"Systeminfo_CPU": "",
"Systeminfo_CPU_Cores": "",
"Systeminfo_CPU_Name": "",
"Systeminfo_CPU_Speed": "",
"Systeminfo_CPU_Temp": "",
"Systeminfo_CPU_Vendor": "",
"Systeminfo_Client_Resolution": "",
"Systeminfo_Client_User_Agent": "",
"Systeminfo_General": "",
"Systeminfo_General_Date": "",
"Systeminfo_General_Date2": "",
"Systeminfo_General_Full_Date": "",
"Systeminfo_General_TimeZone": "",
"Systeminfo_Memory": "",
"Systeminfo_Memory_Total_Memory": "",
"Systeminfo_Memory_Usage": "",
"Systeminfo_Memory_Usage_Percent": "",
"Systeminfo_Motherboard": "",
"Systeminfo_Motherboard_BIOS": "",
"Systeminfo_Motherboard_BIOS_Date": "",
"Systeminfo_Motherboard_BIOS_Vendor": "",
"Systeminfo_Motherboard_Manufactured": "",
"Systeminfo_Motherboard_Name": "",
"Systeminfo_Motherboard_Revision": "",
"Systeminfo_Network": "",
"Systeminfo_Network_Accept_Encoding": "",
"Systeminfo_Network_Accept_Language": "",
"Systeminfo_Network_Connection_Port": "",
"Systeminfo_Network_HTTP_Host": "",
"Systeminfo_Network_HTTP_Referer": "",
"Systeminfo_Network_HTTP_Referer_String": "",
"Systeminfo_Network_Hardware": "",
"Systeminfo_Network_Hardware_Interface_Mask": "",
"Systeminfo_Network_Hardware_Interface_Name": "",
"Systeminfo_Network_Hardware_Interface_RX": "",
"Systeminfo_Network_Hardware_Interface_TX": "",
"Systeminfo_Network_IP": "",
"Systeminfo_Network_IP_Connection": "",
"Systeminfo_Network_IP_Server": "",
"Systeminfo_Network_MIME": "",
"Systeminfo_Network_Request_Method": "",
"Systeminfo_Network_Request_Time": "",
"Systeminfo_Network_Request_URI": "",
"Systeminfo_Network_Secure_Connection": "",
"Systeminfo_Network_Secure_Connection_String": "",
"Systeminfo_Network_Server_Name": "",
"Systeminfo_Network_Server_Name_String": "",
"Systeminfo_Network_Server_Query": "",
"Systeminfo_Network_Server_Query_String": "",
"Systeminfo_Network_Server_Version": "",
"Systeminfo_Services": "",
"Systeminfo_Services_Description": "",
"Systeminfo_Services_Name": "",
"Systeminfo_Storage": "",
"Systeminfo_Storage_Device": "",
"Systeminfo_Storage_Mount": "",
"Systeminfo_Storage_Size": "",
"Systeminfo_Storage_Type": "",
"Systeminfo_Storage_Usage": "",
"Systeminfo_Storage_Usage_Free": "",
"Systeminfo_Storage_Usage_Mount": "",
"Systeminfo_Storage_Usage_Total": "",
"Systeminfo_Storage_Usage_Used": "",
"Systeminfo_System": "",
"Systeminfo_System_AVG": "",
"Systeminfo_System_Architecture": "",
"Systeminfo_System_Kernel": "",
"Systeminfo_System_OSVersion": "",
"Systeminfo_System_Running_Processes": "",
"Systeminfo_System_System": "",
"Systeminfo_System_Uname": "",
"Systeminfo_System_Uptime": "",
"Systeminfo_This_Client": "",
"Systeminfo_USB_Devices": "",
"TICKER_MIGRATE_TO_NETALERTX": "",
"TIMEZONE_description": "",
"TIMEZONE_name": "",
"UI_DEV_SECTIONS_description": "",
"UI_DEV_SECTIONS_name": "",
"UI_ICONS_description": "",
"UI_ICONS_name": "",
"UI_LANG_description": "",
"UI_LANG_name": "",
"UI_MY_DEVICES_description": "",
"UI_MY_DEVICES_name": "",
"UI_NOT_RANDOM_MAC_description": "",
"UI_NOT_RANDOM_MAC_name": "",
"UI_PRESENCE_description": "",
"UI_PRESENCE_name": "",
"UI_REFRESH_description": "",
"UI_REFRESH_name": "",
"devices_old": "",
"general_event_description": "",
"general_event_title": "",
"report_guid": "",
"report_guid_missing": "",
"report_select_format": "",
"report_time": "",
"run_event_icon": "",
"run_event_tooltip": "",
"settings_core_icon": "",
"settings_core_label": "",
"settings_device_scanners": "",
"settings_device_scanners_icon": "",
"settings_device_scanners_label": "",
"settings_enabled": "",
"settings_enabled_icon": "",
"settings_expand_all": "",
"settings_imported": "",
"settings_imported_label": "",
"settings_missing": "",
"settings_missing_block": "",
"settings_old": "",
"settings_other_scanners": "",
"settings_other_scanners_icon": "",
"settings_other_scanners_label": "",
"settings_publishers": "",
"settings_publishers_icon": "",
"settings_publishers_label": "",
"settings_saved": "",
"settings_system_icon": "",
"settings_system_label": "",
"settings_update_item_warning": "",
"test_event_icon": "",
"test_event_tooltip": ""
}

1277
front/php/templates/language/ru_ru.json Normal file → Executable file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,680 @@
{
"API_CUSTOM_SQL_description": "",
"API_CUSTOM_SQL_name": "",
"API_display_name": "",
"API_icon": "",
"About_Design": "",
"About_Exit": "",
"About_Title": "",
"AppEvents_DateTimeCreated": "",
"AppEvents_Extra": "",
"AppEvents_GUID": "",
"AppEvents_Helper1": "",
"AppEvents_Helper2": "",
"AppEvents_Helper3": "",
"AppEvents_ObjectForeignKey": "",
"AppEvents_ObjectIndex": "",
"AppEvents_ObjectIsArchived": "",
"AppEvents_ObjectIsNew": "",
"AppEvents_ObjectPlugin": "",
"AppEvents_ObjectPrimaryID": "",
"AppEvents_ObjectSecondaryID": "",
"AppEvents_ObjectStatus": "",
"AppEvents_ObjectStatusColumn": "",
"AppEvents_ObjectType": "",
"AppEvents_Plugin": "",
"AppEvents_Type": "",
"BackDevDetail_Actions_Ask_Run": "",
"BackDevDetail_Actions_Not_Registered": "",
"BackDevDetail_Actions_Title_Run": "",
"BackDevDetail_Copy_Ask": "",
"BackDevDetail_Copy_Title": "",
"BackDevDetail_Tools_WOL_error": "",
"BackDevDetail_Tools_WOL_okay": "",
"BackDevices_Arpscan_disabled": "",
"BackDevices_Arpscan_enabled": "",
"BackDevices_Backup_CopError": "",
"BackDevices_Backup_Failed": "",
"BackDevices_Backup_okay": "",
"BackDevices_DBTools_DelDevError_a": "",
"BackDevices_DBTools_DelDevError_b": "",
"BackDevices_DBTools_DelDev_a": "",
"BackDevices_DBTools_DelDev_b": "",
"BackDevices_DBTools_DelEvents": "",
"BackDevices_DBTools_DelEventsError": "",
"BackDevices_DBTools_ImportCSV": "",
"BackDevices_DBTools_ImportCSVError": "",
"BackDevices_DBTools_ImportCSVMissing": "",
"BackDevices_DBTools_Purge": "",
"BackDevices_DBTools_UpdDev": "",
"BackDevices_DBTools_UpdDevError": "",
"BackDevices_DBTools_Upgrade": "",
"BackDevices_DBTools_UpgradeError": "",
"BackDevices_Device_UpdDevError": "",
"BackDevices_Restore_CopError": "",
"BackDevices_Restore_Failed": "",
"BackDevices_Restore_okay": "",
"BackDevices_darkmode_disabled": "",
"BackDevices_darkmode_enabled": "",
"DAYS_TO_KEEP_EVENTS_description": "",
"DAYS_TO_KEEP_EVENTS_name": "",
"DevDetail_Copy_Device_Title": "",
"DevDetail_Copy_Device_Tooltip": "",
"DevDetail_EveandAl_AlertAllEvents": "",
"DevDetail_EveandAl_AlertDown": "",
"DevDetail_EveandAl_Archived": "",
"DevDetail_EveandAl_NewDevice": "",
"DevDetail_EveandAl_NewDevice_Tooltip": "",
"DevDetail_EveandAl_RandomMAC": "",
"DevDetail_EveandAl_ScanCycle": "",
"DevDetail_EveandAl_ScanCycle_a": "",
"DevDetail_EveandAl_ScanCycle_z": "",
"DevDetail_EveandAl_Skip": "",
"DevDetail_EveandAl_Title": "",
"DevDetail_Events_CheckBox": "",
"DevDetail_GoToNetworkNode": "",
"DevDetail_Icon": "",
"DevDetail_Icon_Descr": "",
"DevDetail_Loading": "",
"DevDetail_MainInfo_Comments": "",
"DevDetail_MainInfo_Favorite": "",
"DevDetail_MainInfo_Group": "",
"DevDetail_MainInfo_Location": "",
"DevDetail_MainInfo_Name": "",
"DevDetail_MainInfo_Network": "",
"DevDetail_MainInfo_Network_Port": "",
"DevDetail_MainInfo_Network_Title": "",
"DevDetail_MainInfo_Owner": "",
"DevDetail_MainInfo_Title": "",
"DevDetail_MainInfo_Type": "",
"DevDetail_MainInfo_Vendor": "",
"DevDetail_MainInfo_mac": "",
"DevDetail_Network_Node_hover": "",
"DevDetail_Network_Port_hover": "",
"DevDetail_Nmap_Scans": "",
"DevDetail_Nmap_Scans_desc": "",
"DevDetail_Nmap_buttonDefault": "",
"DevDetail_Nmap_buttonDefault_text": "",
"DevDetail_Nmap_buttonDetail": "",
"DevDetail_Nmap_buttonDetail_text": "",
"DevDetail_Nmap_buttonFast": "",
"DevDetail_Nmap_buttonFast_text": "",
"DevDetail_Nmap_buttonSkipDiscovery": "",
"DevDetail_Nmap_buttonSkipDiscovery_text": "",
"DevDetail_Nmap_resultsLink": "",
"DevDetail_Owner_hover": "",
"DevDetail_Periodselect_All": "",
"DevDetail_Periodselect_LastMonth": "",
"DevDetail_Periodselect_LastWeek": "",
"DevDetail_Periodselect_LastYear": "",
"DevDetail_Periodselect_today": "",
"DevDetail_Run_Actions_Title": "",
"DevDetail_Run_Actions_Tooltip": "",
"DevDetail_SessionInfo_FirstSession": "",
"DevDetail_SessionInfo_LastIP": "",
"DevDetail_SessionInfo_LastSession": "",
"DevDetail_SessionInfo_StaticIP": "",
"DevDetail_SessionInfo_Status": "",
"DevDetail_SessionInfo_Title": "",
"DevDetail_SessionTable_Additionalinfo": "",
"DevDetail_SessionTable_Connection": "",
"DevDetail_SessionTable_Disconnection": "",
"DevDetail_SessionTable_Duration": "",
"DevDetail_SessionTable_IP": "",
"DevDetail_SessionTable_Order": "",
"DevDetail_Shortcut_CurrentStatus": "",
"DevDetail_Shortcut_DownAlerts": "",
"DevDetail_Shortcut_Presence": "",
"DevDetail_Shortcut_Sessions": "",
"DevDetail_Tab_Details": "",
"DevDetail_Tab_Events": "",
"DevDetail_Tab_EventsTableDate": "",
"DevDetail_Tab_EventsTableEvent": "",
"DevDetail_Tab_EventsTableIP": "",
"DevDetail_Tab_EventsTableInfo": "",
"DevDetail_Tab_Nmap": "",
"DevDetail_Tab_NmapEmpty": "",
"DevDetail_Tab_NmapTableExtra": "",
"DevDetail_Tab_NmapTableHeader": "",
"DevDetail_Tab_NmapTableIndex": "",
"DevDetail_Tab_NmapTablePort": "",
"DevDetail_Tab_NmapTableService": "",
"DevDetail_Tab_NmapTableState": "",
"DevDetail_Tab_NmapTableText": "",
"DevDetail_Tab_NmapTableTime": "",
"DevDetail_Tab_Plugins": "",
"DevDetail_Tab_Presence": "",
"DevDetail_Tab_Sessions": "",
"DevDetail_Tab_Tools": "",
"DevDetail_Tab_Tools_Internet_Info_Description": "",
"DevDetail_Tab_Tools_Internet_Info_Error": "",
"DevDetail_Tab_Tools_Internet_Info_Start": "",
"DevDetail_Tab_Tools_Internet_Info_Title": "",
"DevDetail_Tab_Tools_Nslookup_Description": "",
"DevDetail_Tab_Tools_Nslookup_Error": "",
"DevDetail_Tab_Tools_Nslookup_Start": "",
"DevDetail_Tab_Tools_Nslookup_Title": "",
"DevDetail_Tab_Tools_Speedtest_Description": "",
"DevDetail_Tab_Tools_Speedtest_Start": "",
"DevDetail_Tab_Tools_Speedtest_Title": "",
"DevDetail_Tab_Tools_Traceroute_Description": "",
"DevDetail_Tab_Tools_Traceroute_Error": "",
"DevDetail_Tab_Tools_Traceroute_Start": "",
"DevDetail_Tab_Tools_Traceroute_Title": "",
"DevDetail_Tools_WOL": "",
"DevDetail_Tools_WOL_noti": "",
"DevDetail_Tools_WOL_noti_text": "",
"DevDetail_Type_hover": "",
"DevDetail_Vendor_hover": "",
"DevDetail_WOL_Title": "",
"DevDetail_button_AddIcon": "",
"DevDetail_button_AddIcon_Help": "",
"DevDetail_button_AddIcon_Tooltip": "",
"DevDetail_button_Delete": "",
"DevDetail_button_DeleteEvents": "",
"DevDetail_button_DeleteEvents_Warning": "",
"DevDetail_button_OverwriteIcons": "",
"DevDetail_button_OverwriteIcons_Tooltip": "",
"DevDetail_button_OverwriteIcons_Warning": "",
"DevDetail_button_Reset": "",
"DevDetail_button_Save": "",
"Device_MultiEdit": "",
"Device_MultiEdit_Backup": "",
"Device_MultiEdit_Fields": "",
"Device_MultiEdit_MassActions": "",
"Device_MultiEdit_Tooltip": "",
"Device_Searchbox": "",
"Device_Shortcut_AllDevices": "",
"Device_Shortcut_Archived": "",
"Device_Shortcut_Connected": "",
"Device_Shortcut_Devices": "",
"Device_Shortcut_DownAlerts": "",
"Device_Shortcut_DownOnly": "",
"Device_Shortcut_Favorites": "",
"Device_Shortcut_NewDevices": "",
"Device_Shortcut_OnlineChart": "",
"Device_TableHead_Connected_Devices": "",
"Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "",
"Device_TableHead_GUID": "",
"Device_TableHead_Group": "",
"Device_TableHead_Icon": "",
"Device_TableHead_LastIP": "",
"Device_TableHead_LastIPOrder": "",
"Device_TableHead_LastSession": "",
"Device_TableHead_Location": "",
"Device_TableHead_MAC": "",
"Device_TableHead_MAC_full": "",
"Device_TableHead_Name": "",
"Device_TableHead_Owner": "",
"Device_TableHead_Parent_MAC": "",
"Device_TableHead_Port": "",
"Device_TableHead_RowID": "",
"Device_TableHead_Rowid": "",
"Device_TableHead_Status": "",
"Device_TableHead_SyncHubNodeName": "",
"Device_TableHead_Type": "",
"Device_TableHead_Vendor": "",
"Device_Table_Not_Network_Device": "",
"Device_Table_info": "",
"Device_Table_nav_next": "",
"Device_Table_nav_prev": "",
"Device_Tablelenght": "",
"Device_Tablelenght_all": "",
"Device_Title": "",
"Donations_Others": "",
"Donations_Platforms": "",
"Donations_Text": "",
"Donations_Title": "",
"ENABLE_PLUGINS_description": "",
"ENABLE_PLUGINS_name": "",
"Email_display_name": "",
"Email_icon": "",
"Events_Loading": "",
"Events_Periodselect_All": "",
"Events_Periodselect_LastMonth": "",
"Events_Periodselect_LastWeek": "",
"Events_Periodselect_LastYear": "",
"Events_Periodselect_today": "",
"Events_Searchbox": "",
"Events_Shortcut_AllEvents": "",
"Events_Shortcut_DownAlerts": "",
"Events_Shortcut_Events": "",
"Events_Shortcut_MissSessions": "",
"Events_Shortcut_NewDevices": "",
"Events_Shortcut_Sessions": "",
"Events_Shortcut_VoidSessions": "",
"Events_TableHead_AdditionalInfo": "",
"Events_TableHead_Connection": "",
"Events_TableHead_Date": "",
"Events_TableHead_Device": "",
"Events_TableHead_Disconnection": "",
"Events_TableHead_Duration": "",
"Events_TableHead_DurationOrder": "",
"Events_TableHead_EventType": "",
"Events_TableHead_IP": "",
"Events_TableHead_IPOrder": "",
"Events_TableHead_Order": "",
"Events_TableHead_Owner": "",
"Events_TableHead_PendingAlert": "",
"Events_Table_info": "",
"Events_Table_nav_next": "",
"Events_Table_nav_prev": "",
"Events_Tablelenght": "",
"Events_Tablelenght_all": "",
"Events_Title": "",
"Gen_Action": "",
"Gen_Add": "",
"Gen_Add_All": "",
"Gen_AreYouSure": "",
"Gen_Backup": "",
"Gen_Cancel": "",
"Gen_Copy": "",
"Gen_DataUpdatedUITakesTime": "",
"Gen_Delete": "",
"Gen_DeleteAll": "",
"Gen_Error": "",
"Gen_Filter": "",
"Gen_LockedDB": "",
"Gen_Offline": "",
"Gen_Okay": "",
"Gen_Purge": "",
"Gen_ReadDocs": "",
"Gen_Remove_All": "",
"Gen_Remove_Last": "",
"Gen_Restore": "",
"Gen_Run": "",
"Gen_Save": "",
"Gen_Saved": "",
"Gen_Search": "",
"Gen_Selected_Devices": "",
"Gen_Switch": "",
"Gen_Upd": "",
"Gen_Upd_Fail": "",
"Gen_Update": "",
"Gen_Update_Value": "",
"Gen_Warning": "",
"Gen_Work_In_Progress": "",
"General_display_name": "",
"General_icon": "",
"HRS_TO_KEEP_NEWDEV_description": "",
"HRS_TO_KEEP_NEWDEV_name": "",
"HelpFAQ_Cat_Detail": "",
"HelpFAQ_Cat_Detail_300_head": "",
"HelpFAQ_Cat_Detail_300_text_a": "",
"HelpFAQ_Cat_Detail_300_text_b": "",
"HelpFAQ_Cat_Detail_301_head_a": "",
"HelpFAQ_Cat_Detail_301_head_b": "",
"HelpFAQ_Cat_Detail_301_text": "",
"HelpFAQ_Cat_Detail_302_head_a": "",
"HelpFAQ_Cat_Detail_302_head_b": "",
"HelpFAQ_Cat_Detail_302_text": "",
"HelpFAQ_Cat_Detail_303_head": "",
"HelpFAQ_Cat_Detail_303_text": "",
"HelpFAQ_Cat_Device_200_head": "",
"HelpFAQ_Cat_Device_200_text": "",
"HelpFAQ_Cat_General": "",
"HelpFAQ_Cat_General_100_head": "",
"HelpFAQ_Cat_General_100_text_a": "",
"HelpFAQ_Cat_General_100_text_b": "",
"HelpFAQ_Cat_General_100_text_c": "",
"HelpFAQ_Cat_General_101_head": "",
"HelpFAQ_Cat_General_101_text": "",
"HelpFAQ_Cat_General_102_head": "",
"HelpFAQ_Cat_General_102_text": "",
"HelpFAQ_Cat_General_102docker_head": "",
"HelpFAQ_Cat_General_102docker_text": "",
"HelpFAQ_Cat_General_103_head": "",
"HelpFAQ_Cat_General_103_text": "",
"HelpFAQ_Cat_Network_600_head": "",
"HelpFAQ_Cat_Network_600_text": "",
"HelpFAQ_Cat_Network_601_head": "",
"HelpFAQ_Cat_Network_601_text": "",
"HelpFAQ_Cat_Presence_400_head": "",
"HelpFAQ_Cat_Presence_400_text": "",
"HelpFAQ_Cat_Presence_401_head": "",
"HelpFAQ_Cat_Presence_401_text": "",
"HelpFAQ_Title": "",
"LOADED_PLUGINS_description": "",
"LOADED_PLUGINS_name": "",
"LOG_LEVEL_description": "",
"LOG_LEVEL_name": "",
"Loading": "",
"Login_Box": "",
"Login_Default_PWD": "",
"Login_Psw-box": "",
"Login_Psw_alert": "",
"Login_Psw_folder": "",
"Login_Psw_new": "",
"Login_Psw_run": "",
"Login_Remember": "",
"Login_Remember_small": "",
"Login_Submit": "",
"Login_Toggle_Alert_headline": "",
"Login_Toggle_Info": "",
"Login_Toggle_Info_headline": "",
"Maintenance_Running_Version": "",
"Maintenance_Status": "",
"Maintenance_Title": "",
"Maintenance_Tool_ExportCSV": "",
"Maintenance_Tool_ExportCSV_noti": "",
"Maintenance_Tool_ExportCSV_noti_text": "",
"Maintenance_Tool_ExportCSV_text": "",
"Maintenance_Tool_ImportCSV": "",
"Maintenance_Tool_ImportCSV_noti": "",
"Maintenance_Tool_ImportCSV_noti_text": "",
"Maintenance_Tool_ImportCSV_text": "",
"Maintenance_Tool_arpscansw": "",
"Maintenance_Tool_arpscansw_noti": "",
"Maintenance_Tool_arpscansw_noti_text": "",
"Maintenance_Tool_arpscansw_text": "",
"Maintenance_Tool_backup": "",
"Maintenance_Tool_backup_noti": "",
"Maintenance_Tool_backup_noti_text": "",
"Maintenance_Tool_backup_text": "",
"Maintenance_Tool_check_visible": "",
"Maintenance_Tool_darkmode": "",
"Maintenance_Tool_darkmode_noti": "",
"Maintenance_Tool_darkmode_noti_text": "",
"Maintenance_Tool_darkmode_text": "",
"Maintenance_Tool_del_ActHistory": "",
"Maintenance_Tool_del_ActHistory_noti": "",
"Maintenance_Tool_del_ActHistory_noti_text": "",
"Maintenance_Tool_del_ActHistory_text": "",
"Maintenance_Tool_del_alldev": "",
"Maintenance_Tool_del_alldev_noti": "",
"Maintenance_Tool_del_alldev_noti_text": "",
"Maintenance_Tool_del_alldev_text": "",
"Maintenance_Tool_del_allevents": "",
"Maintenance_Tool_del_allevents30": "",
"Maintenance_Tool_del_allevents30_noti": "",
"Maintenance_Tool_del_allevents30_noti_text": "",
"Maintenance_Tool_del_allevents30_text": "",
"Maintenance_Tool_del_allevents_noti": "",
"Maintenance_Tool_del_allevents_noti_text": "",
"Maintenance_Tool_del_allevents_text": "",
"Maintenance_Tool_del_empty_macs": "",
"Maintenance_Tool_del_empty_macs_noti": "",
"Maintenance_Tool_del_empty_macs_noti_text": "",
"Maintenance_Tool_del_empty_macs_text": "",
"Maintenance_Tool_del_selecteddev": "",
"Maintenance_Tool_del_selecteddev_text": "",
"Maintenance_Tool_del_unknowndev": "",
"Maintenance_Tool_del_unknowndev_noti": "",
"Maintenance_Tool_del_unknowndev_noti_text": "",
"Maintenance_Tool_del_unknowndev_text": "",
"Maintenance_Tool_displayed_columns_text": "",
"Maintenance_Tool_drag_me": "",
"Maintenance_Tool_order_columns_text": "",
"Maintenance_Tool_purgebackup": "",
"Maintenance_Tool_purgebackup_noti": "",
"Maintenance_Tool_purgebackup_noti_text": "",
"Maintenance_Tool_purgebackup_text": "",
"Maintenance_Tool_restore": "",
"Maintenance_Tool_restore_noti": "",
"Maintenance_Tool_restore_noti_text": "",
"Maintenance_Tool_restore_text": "",
"Maintenance_Tool_upgrade_database_noti": "",
"Maintenance_Tool_upgrade_database_noti_text": "",
"Maintenance_Tool_upgrade_database_text": "",
"Maintenance_Tools_Tab_BackupRestore": "",
"Maintenance_Tools_Tab_Logging": "",
"Maintenance_Tools_Tab_Settings": "",
"Maintenance_Tools_Tab_Tools": "",
"Maintenance_Tools_Tab_UISettings": "",
"Maintenance_arp_status": "",
"Maintenance_arp_status_off": "",
"Maintenance_arp_status_on": "",
"Maintenance_built_on": "",
"Maintenance_current_version": "",
"Maintenance_database_backup": "",
"Maintenance_database_backup_found": "",
"Maintenance_database_backup_total": "",
"Maintenance_database_lastmod": "",
"Maintenance_database_path": "",
"Maintenance_database_rows": "",
"Maintenance_database_size": "",
"Maintenance_lang_selector_apply": "",
"Maintenance_lang_selector_empty": "",
"Maintenance_lang_selector_lable": "",
"Maintenance_lang_selector_text": "",
"Maintenance_new_version": "",
"Maintenance_themeselector_apply": "",
"Maintenance_themeselector_empty": "",
"Maintenance_themeselector_lable": "",
"Maintenance_themeselector_text": "",
"Maintenance_version": "",
"NETWORK_DEVICE_TYPES_description": "",
"NETWORK_DEVICE_TYPES_name": "",
"Navigation_About": "",
"Navigation_Devices": "",
"Navigation_Donations": "",
"Navigation_Events": "",
"Navigation_HelpFAQ": "",
"Navigation_Integrations": "",
"Navigation_Maintenance": "",
"Navigation_Monitoring": "",
"Navigation_Network": "",
"Navigation_Notifications": "",
"Navigation_Plugins": "",
"Navigation_Presence": "",
"Navigation_Report": "",
"Navigation_Settings": "",
"Navigation_SystemInfo": "",
"Navigation_Workflows": "",
"Network_Assign": "",
"Network_Cant_Assign": "",
"Network_Configuration_Error": "",
"Network_Connected": "",
"Network_ManageAdd": "",
"Network_ManageAdd_Name": "",
"Network_ManageAdd_Name_text": "",
"Network_ManageAdd_Port": "",
"Network_ManageAdd_Port_text": "",
"Network_ManageAdd_Submit": "",
"Network_ManageAdd_Type": "",
"Network_ManageAdd_Type_text": "",
"Network_ManageAssign": "",
"Network_ManageDel": "",
"Network_ManageDel_Name": "",
"Network_ManageDel_Name_text": "",
"Network_ManageDel_Submit": "",
"Network_ManageDevices": "",
"Network_ManageEdit": "",
"Network_ManageEdit_ID": "",
"Network_ManageEdit_ID_text": "",
"Network_ManageEdit_Name": "",
"Network_ManageEdit_Name_text": "",
"Network_ManageEdit_Port": "",
"Network_ManageEdit_Port_text": "",
"Network_ManageEdit_Submit": "",
"Network_ManageEdit_Type": "",
"Network_ManageEdit_Type_text": "",
"Network_ManageLeaf": "",
"Network_ManageUnassign": "",
"Network_NoAssignedDevices": "",
"Network_NoDevices": "",
"Network_Node": "",
"Network_Node_Name": "",
"Network_Parent": "",
"Network_Root": "",
"Network_Root_Not_Configured": "",
"Network_Root_Unconfigurable": "",
"Network_Table_Hostname": "",
"Network_Table_IP": "",
"Network_Table_State": "",
"Network_Title": "",
"Network_UnassignedDevices": "",
"Notifications_All": "",
"Notifications_Mark_All_Read": "",
"PIALERT_WEB_PASSWORD_description": "",
"PIALERT_WEB_PASSWORD_name": "",
"PIALERT_WEB_PROTECTION_description": "",
"PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "",
"Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "",
"Plugins_History": "",
"Plugins_Objects": "",
"Plugins_Out_of": "",
"Plugins_Unprocessed_Events": "",
"Plugins_no_control": "",
"Presence_CalHead_day": "",
"Presence_CalHead_lang": "",
"Presence_CalHead_month": "",
"Presence_CalHead_quarter": "",
"Presence_CalHead_week": "",
"Presence_CalHead_year": "",
"Presence_CallHead_Devices": "",
"Presence_Loading": "",
"Presence_Shortcut_AllDevices": "",
"Presence_Shortcut_Archived": "",
"Presence_Shortcut_Connected": "",
"Presence_Shortcut_Devices": "",
"Presence_Shortcut_DownAlerts": "",
"Presence_Shortcut_Favorites": "",
"Presence_Shortcut_NewDevices": "",
"Presence_Title": "",
"REPORT_DASHBOARD_URL_description": "",
"REPORT_DASHBOARD_URL_name": "",
"REPORT_ERROR": "",
"REPORT_MAIL_description": "",
"REPORT_MAIL_name": "",
"REPORT_TITLE": "",
"RandomMAC_hover": "",
"Reports_Sent_Log": "",
"SCAN_SUBNETS_description": "",
"SYSTEM_TITLE": "",
"Setting_Override": "",
"Setting_Override_Description": "",
"Settings_Metadata_Toggle": "",
"Settings_device_Scanners_desync": "",
"Settings_device_Scanners_desync_popup": "",
"Speedtest_Results": "",
"Systeminfo_CPU": "",
"Systeminfo_CPU_Cores": "",
"Systeminfo_CPU_Name": "",
"Systeminfo_CPU_Speed": "",
"Systeminfo_CPU_Temp": "",
"Systeminfo_CPU_Vendor": "",
"Systeminfo_Client_Resolution": "",
"Systeminfo_Client_User_Agent": "",
"Systeminfo_General": "",
"Systeminfo_General_Date": "",
"Systeminfo_General_Date2": "",
"Systeminfo_General_Full_Date": "",
"Systeminfo_General_TimeZone": "",
"Systeminfo_Memory": "",
"Systeminfo_Memory_Total_Memory": "",
"Systeminfo_Memory_Usage": "",
"Systeminfo_Memory_Usage_Percent": "",
"Systeminfo_Motherboard": "",
"Systeminfo_Motherboard_BIOS": "",
"Systeminfo_Motherboard_BIOS_Date": "",
"Systeminfo_Motherboard_BIOS_Vendor": "",
"Systeminfo_Motherboard_Manufactured": "",
"Systeminfo_Motherboard_Name": "",
"Systeminfo_Motherboard_Revision": "",
"Systeminfo_Network": "",
"Systeminfo_Network_Accept_Encoding": "",
"Systeminfo_Network_Accept_Language": "",
"Systeminfo_Network_Connection_Port": "",
"Systeminfo_Network_HTTP_Host": "",
"Systeminfo_Network_HTTP_Referer": "",
"Systeminfo_Network_HTTP_Referer_String": "",
"Systeminfo_Network_Hardware": "",
"Systeminfo_Network_Hardware_Interface_Mask": "",
"Systeminfo_Network_Hardware_Interface_Name": "",
"Systeminfo_Network_Hardware_Interface_RX": "",
"Systeminfo_Network_Hardware_Interface_TX": "",
"Systeminfo_Network_IP": "",
"Systeminfo_Network_IP_Connection": "",
"Systeminfo_Network_IP_Server": "",
"Systeminfo_Network_MIME": "",
"Systeminfo_Network_Request_Method": "",
"Systeminfo_Network_Request_Time": "",
"Systeminfo_Network_Request_URI": "",
"Systeminfo_Network_Secure_Connection": "",
"Systeminfo_Network_Secure_Connection_String": "",
"Systeminfo_Network_Server_Name": "",
"Systeminfo_Network_Server_Name_String": "",
"Systeminfo_Network_Server_Query": "",
"Systeminfo_Network_Server_Query_String": "",
"Systeminfo_Network_Server_Version": "",
"Systeminfo_Services": "",
"Systeminfo_Services_Description": "",
"Systeminfo_Services_Name": "",
"Systeminfo_Storage": "",
"Systeminfo_Storage_Device": "",
"Systeminfo_Storage_Mount": "",
"Systeminfo_Storage_Size": "",
"Systeminfo_Storage_Type": "",
"Systeminfo_Storage_Usage": "",
"Systeminfo_Storage_Usage_Free": "",
"Systeminfo_Storage_Usage_Mount": "",
"Systeminfo_Storage_Usage_Total": "",
"Systeminfo_Storage_Usage_Used": "",
"Systeminfo_System": "",
"Systeminfo_System_AVG": "",
"Systeminfo_System_Architecture": "",
"Systeminfo_System_Kernel": "",
"Systeminfo_System_OSVersion": "",
"Systeminfo_System_Running_Processes": "",
"Systeminfo_System_System": "",
"Systeminfo_System_Uname": "",
"Systeminfo_System_Uptime": "",
"Systeminfo_This_Client": "",
"Systeminfo_USB_Devices": "",
"TICKER_MIGRATE_TO_NETALERTX": "",
"TIMEZONE_description": "",
"TIMEZONE_name": "",
"UI_DEV_SECTIONS_description": "",
"UI_DEV_SECTIONS_name": "",
"UI_ICONS_description": "",
"UI_ICONS_name": "",
"UI_LANG_description": "",
"UI_LANG_name": "",
"UI_MY_DEVICES_description": "",
"UI_MY_DEVICES_name": "",
"UI_NOT_RANDOM_MAC_description": "",
"UI_NOT_RANDOM_MAC_name": "",
"UI_PRESENCE_description": "",
"UI_PRESENCE_name": "",
"UI_REFRESH_description": "",
"UI_REFRESH_name": "",
"devices_old": "",
"general_event_description": "",
"general_event_title": "",
"report_guid": "",
"report_guid_missing": "",
"report_select_format": "",
"report_time": "",
"run_event_icon": "",
"run_event_tooltip": "",
"settings_core_icon": "",
"settings_core_label": "",
"settings_device_scanners": "",
"settings_device_scanners_icon": "",
"settings_device_scanners_label": "",
"settings_enabled": "",
"settings_enabled_icon": "",
"settings_expand_all": "",
"settings_imported": "",
"settings_imported_label": "",
"settings_missing": "",
"settings_missing_block": "",
"settings_old": "",
"settings_other_scanners": "",
"settings_other_scanners_icon": "",
"settings_other_scanners_label": "",
"settings_publishers": "",
"settings_publishers_icon": "",
"settings_publishers_label": "",
"settings_saved": "",
"settings_system_icon": "",
"settings_system_label": "",
"settings_update_item_warning": "",
"test_event_icon": "",
"test_event_tooltip": ""
}

View File

@@ -0,0 +1,680 @@
{
"API_CUSTOM_SQL_description": "",
"API_CUSTOM_SQL_name": "",
"API_display_name": "",
"API_icon": "",
"About_Design": "",
"About_Exit": "",
"About_Title": "",
"AppEvents_DateTimeCreated": "",
"AppEvents_Extra": "",
"AppEvents_GUID": "",
"AppEvents_Helper1": "",
"AppEvents_Helper2": "",
"AppEvents_Helper3": "",
"AppEvents_ObjectForeignKey": "",
"AppEvents_ObjectIndex": "",
"AppEvents_ObjectIsArchived": "",
"AppEvents_ObjectIsNew": "",
"AppEvents_ObjectPlugin": "",
"AppEvents_ObjectPrimaryID": "",
"AppEvents_ObjectSecondaryID": "",
"AppEvents_ObjectStatus": "",
"AppEvents_ObjectStatusColumn": "",
"AppEvents_ObjectType": "",
"AppEvents_Plugin": "",
"AppEvents_Type": "",
"BackDevDetail_Actions_Ask_Run": "",
"BackDevDetail_Actions_Not_Registered": "",
"BackDevDetail_Actions_Title_Run": "",
"BackDevDetail_Copy_Ask": "",
"BackDevDetail_Copy_Title": "",
"BackDevDetail_Tools_WOL_error": "",
"BackDevDetail_Tools_WOL_okay": "",
"BackDevices_Arpscan_disabled": "",
"BackDevices_Arpscan_enabled": "",
"BackDevices_Backup_CopError": "",
"BackDevices_Backup_Failed": "",
"BackDevices_Backup_okay": "",
"BackDevices_DBTools_DelDevError_a": "",
"BackDevices_DBTools_DelDevError_b": "",
"BackDevices_DBTools_DelDev_a": "",
"BackDevices_DBTools_DelDev_b": "",
"BackDevices_DBTools_DelEvents": "",
"BackDevices_DBTools_DelEventsError": "",
"BackDevices_DBTools_ImportCSV": "",
"BackDevices_DBTools_ImportCSVError": "",
"BackDevices_DBTools_ImportCSVMissing": "",
"BackDevices_DBTools_Purge": "",
"BackDevices_DBTools_UpdDev": "",
"BackDevices_DBTools_UpdDevError": "",
"BackDevices_DBTools_Upgrade": "",
"BackDevices_DBTools_UpgradeError": "",
"BackDevices_Device_UpdDevError": "",
"BackDevices_Restore_CopError": "",
"BackDevices_Restore_Failed": "",
"BackDevices_Restore_okay": "",
"BackDevices_darkmode_disabled": "",
"BackDevices_darkmode_enabled": "",
"DAYS_TO_KEEP_EVENTS_description": "",
"DAYS_TO_KEEP_EVENTS_name": "",
"DevDetail_Copy_Device_Title": "",
"DevDetail_Copy_Device_Tooltip": "",
"DevDetail_EveandAl_AlertAllEvents": "",
"DevDetail_EveandAl_AlertDown": "",
"DevDetail_EveandAl_Archived": "",
"DevDetail_EveandAl_NewDevice": "",
"DevDetail_EveandAl_NewDevice_Tooltip": "",
"DevDetail_EveandAl_RandomMAC": "",
"DevDetail_EveandAl_ScanCycle": "",
"DevDetail_EveandAl_ScanCycle_a": "",
"DevDetail_EveandAl_ScanCycle_z": "",
"DevDetail_EveandAl_Skip": "",
"DevDetail_EveandAl_Title": "",
"DevDetail_Events_CheckBox": "",
"DevDetail_GoToNetworkNode": "",
"DevDetail_Icon": "",
"DevDetail_Icon_Descr": "",
"DevDetail_Loading": "",
"DevDetail_MainInfo_Comments": "",
"DevDetail_MainInfo_Favorite": "",
"DevDetail_MainInfo_Group": "",
"DevDetail_MainInfo_Location": "",
"DevDetail_MainInfo_Name": "",
"DevDetail_MainInfo_Network": "",
"DevDetail_MainInfo_Network_Port": "",
"DevDetail_MainInfo_Network_Title": "",
"DevDetail_MainInfo_Owner": "",
"DevDetail_MainInfo_Title": "",
"DevDetail_MainInfo_Type": "",
"DevDetail_MainInfo_Vendor": "",
"DevDetail_MainInfo_mac": "",
"DevDetail_Network_Node_hover": "",
"DevDetail_Network_Port_hover": "",
"DevDetail_Nmap_Scans": "",
"DevDetail_Nmap_Scans_desc": "",
"DevDetail_Nmap_buttonDefault": "",
"DevDetail_Nmap_buttonDefault_text": "",
"DevDetail_Nmap_buttonDetail": "",
"DevDetail_Nmap_buttonDetail_text": "",
"DevDetail_Nmap_buttonFast": "",
"DevDetail_Nmap_buttonFast_text": "",
"DevDetail_Nmap_buttonSkipDiscovery": "",
"DevDetail_Nmap_buttonSkipDiscovery_text": "",
"DevDetail_Nmap_resultsLink": "",
"DevDetail_Owner_hover": "",
"DevDetail_Periodselect_All": "",
"DevDetail_Periodselect_LastMonth": "",
"DevDetail_Periodselect_LastWeek": "",
"DevDetail_Periodselect_LastYear": "",
"DevDetail_Periodselect_today": "",
"DevDetail_Run_Actions_Title": "",
"DevDetail_Run_Actions_Tooltip": "",
"DevDetail_SessionInfo_FirstSession": "",
"DevDetail_SessionInfo_LastIP": "",
"DevDetail_SessionInfo_LastSession": "",
"DevDetail_SessionInfo_StaticIP": "",
"DevDetail_SessionInfo_Status": "",
"DevDetail_SessionInfo_Title": "",
"DevDetail_SessionTable_Additionalinfo": "",
"DevDetail_SessionTable_Connection": "",
"DevDetail_SessionTable_Disconnection": "",
"DevDetail_SessionTable_Duration": "",
"DevDetail_SessionTable_IP": "",
"DevDetail_SessionTable_Order": "",
"DevDetail_Shortcut_CurrentStatus": "",
"DevDetail_Shortcut_DownAlerts": "",
"DevDetail_Shortcut_Presence": "",
"DevDetail_Shortcut_Sessions": "",
"DevDetail_Tab_Details": "",
"DevDetail_Tab_Events": "",
"DevDetail_Tab_EventsTableDate": "",
"DevDetail_Tab_EventsTableEvent": "",
"DevDetail_Tab_EventsTableIP": "",
"DevDetail_Tab_EventsTableInfo": "",
"DevDetail_Tab_Nmap": "",
"DevDetail_Tab_NmapEmpty": "",
"DevDetail_Tab_NmapTableExtra": "",
"DevDetail_Tab_NmapTableHeader": "",
"DevDetail_Tab_NmapTableIndex": "",
"DevDetail_Tab_NmapTablePort": "",
"DevDetail_Tab_NmapTableService": "",
"DevDetail_Tab_NmapTableState": "",
"DevDetail_Tab_NmapTableText": "",
"DevDetail_Tab_NmapTableTime": "",
"DevDetail_Tab_Plugins": "",
"DevDetail_Tab_Presence": "",
"DevDetail_Tab_Sessions": "",
"DevDetail_Tab_Tools": "",
"DevDetail_Tab_Tools_Internet_Info_Description": "",
"DevDetail_Tab_Tools_Internet_Info_Error": "",
"DevDetail_Tab_Tools_Internet_Info_Start": "",
"DevDetail_Tab_Tools_Internet_Info_Title": "",
"DevDetail_Tab_Tools_Nslookup_Description": "",
"DevDetail_Tab_Tools_Nslookup_Error": "",
"DevDetail_Tab_Tools_Nslookup_Start": "",
"DevDetail_Tab_Tools_Nslookup_Title": "",
"DevDetail_Tab_Tools_Speedtest_Description": "",
"DevDetail_Tab_Tools_Speedtest_Start": "",
"DevDetail_Tab_Tools_Speedtest_Title": "",
"DevDetail_Tab_Tools_Traceroute_Description": "",
"DevDetail_Tab_Tools_Traceroute_Error": "",
"DevDetail_Tab_Tools_Traceroute_Start": "",
"DevDetail_Tab_Tools_Traceroute_Title": "\u8def\u7531\u8ffd\u8e2a",
"DevDetail_Tools_WOL": "WoL\u5524\u9192 ",
"DevDetail_Tools_WOL_noti": "\u5c40\u57df\u7f51\u5524\u9192",
"DevDetail_Tools_WOL_noti_text": "\u5c06\u5524\u9192\u547d\u4ee4\u88ab\u53d1\u9001\u5230\u5e7f\u64ad\u5730\u5740\u3002\u5982\u679c\u76ee\u6807\u4e0d\u5728 NetAlertX \u7684\u5b50\u7f51/VLAN \u4e2d\uff0c\u76ee\u6807\u8bbe\u5907\u5c06\u4e0d\u4f1a\u54cd\u5e94\u3002",
"DevDetail_Type_hover": "\u8bbe\u5907\u7684\u7c7b\u578b\u3002\u60a8\u9009\u62e9\u4efb\u610f\u9884\u5b9a\u4e49\u7684\u7f51\u7edc\u8bbe\u5907\uff08\u4f8b\u5982\uff1aAP\u3001\u9632\u706b\u5899\u3001\u8def\u7531\u5668\u3001\u4ea4\u6362\u673a...\uff09\uff0c\u5b83\u4eec\u5c06\u4f5c\u4e3a\u53ef\u80fd\u7684\u7236\u7f51\u7edc\u8282\u70b9\u663e\u793a\u5728\u7f51\u7edc\u6811\u914d\u7f6e\u4e2d\u3002",
"DevDetail_Vendor_hover": "\u81ea\u52a8\u68c0\u6d4b\u751f\u4ea7\u5382\u5bb6\u3002\u4f46\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49.",
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> \u5c40\u57df\u7f51\u5524\u9192",
"DevDetail_button_AddIcon": "\u6dfb\u52a0\u56fe\u6807",
"DevDetail_button_AddIcon_Help": "\u7c98\u8d34 SVG html \u6807\u7b7e\u6216 Font Awesome html \u6807\u7b7e\u56fe\u6807\u3002\u9605\u8bfb <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">Icons docs</a> \u4e86\u89e3\u8be6\u60c5.",
"DevDetail_button_AddIcon_Tooltip": "Add a new Icon to this device that is not yet available in the dropdown.",
"DevDetail_button_Delete": "\u5220\u9664\u8bbe\u5907",
"DevDetail_button_DeleteEvents": "\u5220\u9664\u4e8b\u4ef6",
"DevDetail_button_DeleteEvents_Warning": "\u60a8\u786e\u5b9a\u8981\u5220\u9664\u6b64\u8bbe\u5907\u7684\u6240\u6709\u4e8b\u4ef6\u5417\uff1f<br><br>(this will clear the <b>Events history</b> and the <b>Sessions</b> and might help with constant (persistent) notifications)",
"DevDetail_button_OverwriteIcons": "\u8986\u76d6\u56fe\u6807",
"DevDetail_button_OverwriteIcons_Tooltip": "\u8986\u76d6\u5177\u6709\u76f8\u540c\u8bbe\u5907\u7c7b\u578b\u7684\u6240\u6709\u8bbe\u5907\u7684\u56fe\u6807",
"DevDetail_button_OverwriteIcons_Warning": "\u60a8\u786e\u5b9a\u8981\u8986\u76d6\u4e0e\u5f53\u524d\u8bbe\u5907\u7c7b\u578b\u76f8\u540c\u7684\u6240\u6709\u8bbe\u5907\u7684\u6240\u6709\u56fe\u6807\u5417\uff1f",
"DevDetail_button_Reset": "\u91cd\u7f6e",
"DevDetail_button_Save": "\u4fdd\u5b58",
"Device_MultiEdit": "\u7f16\u8f91",
"Device_MultiEdit_Backup": "",
"Device_MultiEdit_Fields": "\u7f16\u8f91:",
"Device_MultiEdit_MassActions": "\u8c28\u614e\u64cd\u4f5c:",
"Device_MultiEdit_Tooltip": "\u5c0f\u5fc3\u3002 \u5355\u51fb\u6b64\u6309\u94ae\u4f1a\u5c06\u5de6\u4fa7\u7684\u503c\u5e94\u7528\u5230\u4e0a\u9762\u9009\u62e9\u7684\u6240\u6709\u8bbe\u5907\u3002",
"Device_Searchbox": "\u641c\u7d22",
"Device_Shortcut_AllDevices": "\u6211\u7684\u8bbe\u5907",
"Device_Shortcut_Archived": "\u5df2\u5b58\u6863",
"Device_Shortcut_Connected": "\u5728\u7ebf\u8bbe\u5907",
"Device_Shortcut_Devices": "\u8bbe\u5907\u7ba1\u7406",
"Device_Shortcut_DownAlerts": "\u79bb\u7ebf",
"Device_Shortcut_DownOnly": "\u79bb\u7ebf\u8bbe\u5907",
"Device_Shortcut_Favorites": "\u6536\u85cf",
"Device_Shortcut_NewDevices": "\u65b0\u8bbe\u5907",
"Device_Shortcut_OnlineChart": "\u8bbe\u5907\u7edf\u8ba1",
"Device_TableHead_Connected_Devices": "\u94fe\u63a5",
"Device_TableHead_Favorite": "\u6536\u85cf",
"Device_TableHead_FirstSession": "\u52a0\u5165",
"Device_TableHead_GUID": "",
"Device_TableHead_Group": "\u7ec4",
"Device_TableHead_Icon": "\u56fe\u6807",
"Device_TableHead_LastIP": "IP",
"Device_TableHead_LastIPOrder": "",
"Device_TableHead_LastSession": "\u79bb\u5f00",
"Device_TableHead_Location": "\u5730\u70b9",
"Device_TableHead_MAC": "\u968f\u673a MAC",
"Device_TableHead_MAC_full": "MAC",
"Device_TableHead_Name": "\u540d\u5b57",
"Device_TableHead_Owner": "\u6240\u6709\u8005",
"Device_TableHead_Parent_MAC": "\u7236\u8282\u70b9",
"Device_TableHead_Port": "\u7aef\u53e3",
"Device_TableHead_RowID": "\u6392\u884c",
"Device_TableHead_Rowid": "\u6392\u884c",
"Device_TableHead_Status": "\u72b6\u6001",
"Device_TableHead_SyncHubNodeName": "",
"Device_TableHead_Type": "\u7c7b\u578b",
"Device_TableHead_Vendor": "\u5236\u9020\u5546",
"Device_Table_Not_Network_Device": "",
"Device_Table_info": "",
"Device_Table_nav_next": "\u4e0b\u4e00\u9875",
"Device_Table_nav_prev": "\u4e0a\u4e00\u9875",
"Device_Tablelenght": "\u663e\u793a _MENU_ \u9875",
"Device_Tablelenght_all": "\u6240\u6709",
"Device_Title": "\u8bbe\u5907",
"Donations_Others": "",
"Donations_Platforms": "",
"Donations_Text": "",
"Donations_Title": "",
"ENABLE_PLUGINS_description": "",
"ENABLE_PLUGINS_name": "",
"Email_display_name": "",
"Email_icon": "",
"Events_Loading": "",
"Events_Periodselect_All": "",
"Events_Periodselect_LastMonth": "",
"Events_Periodselect_LastWeek": "",
"Events_Periodselect_LastYear": "",
"Events_Periodselect_today": "",
"Events_Searchbox": "",
"Events_Shortcut_AllEvents": "",
"Events_Shortcut_DownAlerts": "",
"Events_Shortcut_Events": "",
"Events_Shortcut_MissSessions": "",
"Events_Shortcut_NewDevices": "",
"Events_Shortcut_Sessions": "",
"Events_Shortcut_VoidSessions": "",
"Events_TableHead_AdditionalInfo": "",
"Events_TableHead_Connection": "",
"Events_TableHead_Date": "",
"Events_TableHead_Device": "",
"Events_TableHead_Disconnection": "",
"Events_TableHead_Duration": "",
"Events_TableHead_DurationOrder": "",
"Events_TableHead_EventType": "",
"Events_TableHead_IP": "",
"Events_TableHead_IPOrder": "",
"Events_TableHead_Order": "",
"Events_TableHead_Owner": "",
"Events_TableHead_PendingAlert": "",
"Events_Table_info": "",
"Events_Table_nav_next": "",
"Events_Table_nav_prev": "",
"Events_Tablelenght": "",
"Events_Tablelenght_all": "",
"Events_Title": "",
"Gen_Action": "",
"Gen_Add": "",
"Gen_Add_All": "",
"Gen_AreYouSure": "",
"Gen_Backup": "",
"Gen_Cancel": "",
"Gen_Copy": "",
"Gen_DataUpdatedUITakesTime": "",
"Gen_Delete": "",
"Gen_DeleteAll": "",
"Gen_Error": "",
"Gen_Filter": "",
"Gen_LockedDB": "",
"Gen_Offline": "",
"Gen_Okay": "",
"Gen_Purge": "",
"Gen_ReadDocs": "",
"Gen_Remove_All": "",
"Gen_Remove_Last": "",
"Gen_Restore": "",
"Gen_Run": "",
"Gen_Save": "",
"Gen_Saved": "",
"Gen_Search": "",
"Gen_Selected_Devices": "",
"Gen_Switch": "",
"Gen_Upd": "",
"Gen_Upd_Fail": "",
"Gen_Update": "",
"Gen_Update_Value": "",
"Gen_Warning": "",
"Gen_Work_In_Progress": "",
"General_display_name": "",
"General_icon": "",
"HRS_TO_KEEP_NEWDEV_description": "",
"HRS_TO_KEEP_NEWDEV_name": "",
"HelpFAQ_Cat_Detail": "",
"HelpFAQ_Cat_Detail_300_head": "",
"HelpFAQ_Cat_Detail_300_text_a": "",
"HelpFAQ_Cat_Detail_300_text_b": "",
"HelpFAQ_Cat_Detail_301_head_a": "",
"HelpFAQ_Cat_Detail_301_head_b": "",
"HelpFAQ_Cat_Detail_301_text": "",
"HelpFAQ_Cat_Detail_302_head_a": "",
"HelpFAQ_Cat_Detail_302_head_b": "",
"HelpFAQ_Cat_Detail_302_text": "",
"HelpFAQ_Cat_Detail_303_head": "",
"HelpFAQ_Cat_Detail_303_text": "",
"HelpFAQ_Cat_Device_200_head": "",
"HelpFAQ_Cat_Device_200_text": "",
"HelpFAQ_Cat_General": "",
"HelpFAQ_Cat_General_100_head": "",
"HelpFAQ_Cat_General_100_text_a": "",
"HelpFAQ_Cat_General_100_text_b": "",
"HelpFAQ_Cat_General_100_text_c": "",
"HelpFAQ_Cat_General_101_head": "",
"HelpFAQ_Cat_General_101_text": "",
"HelpFAQ_Cat_General_102_head": "",
"HelpFAQ_Cat_General_102_text": "",
"HelpFAQ_Cat_General_102docker_head": "",
"HelpFAQ_Cat_General_102docker_text": "",
"HelpFAQ_Cat_General_103_head": "",
"HelpFAQ_Cat_General_103_text": "",
"HelpFAQ_Cat_Network_600_head": "",
"HelpFAQ_Cat_Network_600_text": "",
"HelpFAQ_Cat_Network_601_head": "",
"HelpFAQ_Cat_Network_601_text": "",
"HelpFAQ_Cat_Presence_400_head": "",
"HelpFAQ_Cat_Presence_400_text": "",
"HelpFAQ_Cat_Presence_401_head": "",
"HelpFAQ_Cat_Presence_401_text": "",
"HelpFAQ_Title": "",
"LOADED_PLUGINS_description": "",
"LOADED_PLUGINS_name": "",
"LOG_LEVEL_description": "",
"LOG_LEVEL_name": "",
"Loading": "",
"Login_Box": "",
"Login_Default_PWD": "",
"Login_Psw-box": "",
"Login_Psw_alert": "",
"Login_Psw_folder": "",
"Login_Psw_new": "",
"Login_Psw_run": "",
"Login_Remember": "",
"Login_Remember_small": "",
"Login_Submit": "",
"Login_Toggle_Alert_headline": "",
"Login_Toggle_Info": "",
"Login_Toggle_Info_headline": "",
"Maintenance_Running_Version": "",
"Maintenance_Status": "",
"Maintenance_Title": "",
"Maintenance_Tool_ExportCSV": "",
"Maintenance_Tool_ExportCSV_noti": "",
"Maintenance_Tool_ExportCSV_noti_text": "",
"Maintenance_Tool_ExportCSV_text": "",
"Maintenance_Tool_ImportCSV": "",
"Maintenance_Tool_ImportCSV_noti": "",
"Maintenance_Tool_ImportCSV_noti_text": "",
"Maintenance_Tool_ImportCSV_text": "",
"Maintenance_Tool_arpscansw": "",
"Maintenance_Tool_arpscansw_noti": "",
"Maintenance_Tool_arpscansw_noti_text": "",
"Maintenance_Tool_arpscansw_text": "",
"Maintenance_Tool_backup": "",
"Maintenance_Tool_backup_noti": "",
"Maintenance_Tool_backup_noti_text": "",
"Maintenance_Tool_backup_text": "",
"Maintenance_Tool_check_visible": "",
"Maintenance_Tool_darkmode": "",
"Maintenance_Tool_darkmode_noti": "",
"Maintenance_Tool_darkmode_noti_text": "",
"Maintenance_Tool_darkmode_text": "",
"Maintenance_Tool_del_ActHistory": "",
"Maintenance_Tool_del_ActHistory_noti": "",
"Maintenance_Tool_del_ActHistory_noti_text": "",
"Maintenance_Tool_del_ActHistory_text": "",
"Maintenance_Tool_del_alldev": "",
"Maintenance_Tool_del_alldev_noti": "",
"Maintenance_Tool_del_alldev_noti_text": "",
"Maintenance_Tool_del_alldev_text": "",
"Maintenance_Tool_del_allevents": "",
"Maintenance_Tool_del_allevents30": "",
"Maintenance_Tool_del_allevents30_noti": "",
"Maintenance_Tool_del_allevents30_noti_text": "",
"Maintenance_Tool_del_allevents30_text": "",
"Maintenance_Tool_del_allevents_noti": "",
"Maintenance_Tool_del_allevents_noti_text": "",
"Maintenance_Tool_del_allevents_text": "",
"Maintenance_Tool_del_empty_macs": "",
"Maintenance_Tool_del_empty_macs_noti": "",
"Maintenance_Tool_del_empty_macs_noti_text": "",
"Maintenance_Tool_del_empty_macs_text": "",
"Maintenance_Tool_del_selecteddev": "",
"Maintenance_Tool_del_selecteddev_text": "",
"Maintenance_Tool_del_unknowndev": "",
"Maintenance_Tool_del_unknowndev_noti": "",
"Maintenance_Tool_del_unknowndev_noti_text": "",
"Maintenance_Tool_del_unknowndev_text": "",
"Maintenance_Tool_displayed_columns_text": "",
"Maintenance_Tool_drag_me": "",
"Maintenance_Tool_order_columns_text": "",
"Maintenance_Tool_purgebackup": "",
"Maintenance_Tool_purgebackup_noti": "",
"Maintenance_Tool_purgebackup_noti_text": "",
"Maintenance_Tool_purgebackup_text": "",
"Maintenance_Tool_restore": "",
"Maintenance_Tool_restore_noti": "",
"Maintenance_Tool_restore_noti_text": "",
"Maintenance_Tool_restore_text": "",
"Maintenance_Tool_upgrade_database_noti": "",
"Maintenance_Tool_upgrade_database_noti_text": "",
"Maintenance_Tool_upgrade_database_text": "",
"Maintenance_Tools_Tab_BackupRestore": "",
"Maintenance_Tools_Tab_Logging": "",
"Maintenance_Tools_Tab_Settings": "",
"Maintenance_Tools_Tab_Tools": "",
"Maintenance_Tools_Tab_UISettings": "",
"Maintenance_arp_status": "",
"Maintenance_arp_status_off": "",
"Maintenance_arp_status_on": "",
"Maintenance_built_on": "",
"Maintenance_current_version": "",
"Maintenance_database_backup": "",
"Maintenance_database_backup_found": "",
"Maintenance_database_backup_total": "",
"Maintenance_database_lastmod": "",
"Maintenance_database_path": "",
"Maintenance_database_rows": "",
"Maintenance_database_size": "",
"Maintenance_lang_selector_apply": "",
"Maintenance_lang_selector_empty": "",
"Maintenance_lang_selector_lable": "",
"Maintenance_lang_selector_text": "",
"Maintenance_new_version": "",
"Maintenance_themeselector_apply": "",
"Maintenance_themeselector_empty": "",
"Maintenance_themeselector_lable": "",
"Maintenance_themeselector_text": "",
"Maintenance_version": "",
"NETWORK_DEVICE_TYPES_description": "",
"NETWORK_DEVICE_TYPES_name": "",
"Navigation_About": "",
"Navigation_Devices": "",
"Navigation_Donations": "",
"Navigation_Events": "",
"Navigation_HelpFAQ": "",
"Navigation_Integrations": "",
"Navigation_Maintenance": "",
"Navigation_Monitoring": "",
"Navigation_Network": "",
"Navigation_Notifications": "",
"Navigation_Plugins": "",
"Navigation_Presence": "",
"Navigation_Report": "",
"Navigation_Settings": "",
"Navigation_SystemInfo": "",
"Navigation_Workflows": "",
"Network_Assign": "",
"Network_Cant_Assign": "",
"Network_Configuration_Error": "",
"Network_Connected": "",
"Network_ManageAdd": "",
"Network_ManageAdd_Name": "",
"Network_ManageAdd_Name_text": "",
"Network_ManageAdd_Port": "",
"Network_ManageAdd_Port_text": "",
"Network_ManageAdd_Submit": "",
"Network_ManageAdd_Type": "",
"Network_ManageAdd_Type_text": "",
"Network_ManageAssign": "",
"Network_ManageDel": "",
"Network_ManageDel_Name": "",
"Network_ManageDel_Name_text": "",
"Network_ManageDel_Submit": "",
"Network_ManageDevices": "",
"Network_ManageEdit": "",
"Network_ManageEdit_ID": "",
"Network_ManageEdit_ID_text": "",
"Network_ManageEdit_Name": "",
"Network_ManageEdit_Name_text": "",
"Network_ManageEdit_Port": "",
"Network_ManageEdit_Port_text": "",
"Network_ManageEdit_Submit": "",
"Network_ManageEdit_Type": "",
"Network_ManageEdit_Type_text": "",
"Network_ManageLeaf": "",
"Network_ManageUnassign": "",
"Network_NoAssignedDevices": "",
"Network_NoDevices": "",
"Network_Node": "",
"Network_Node_Name": "",
"Network_Parent": "",
"Network_Root": "",
"Network_Root_Not_Configured": "",
"Network_Root_Unconfigurable": "",
"Network_Table_Hostname": "",
"Network_Table_IP": "",
"Network_Table_State": "",
"Network_Title": "",
"Network_UnassignedDevices": "",
"Notifications_All": "",
"Notifications_Mark_All_Read": "",
"PIALERT_WEB_PASSWORD_description": "",
"PIALERT_WEB_PASSWORD_name": "",
"PIALERT_WEB_PROTECTION_description": "",
"PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "",
"Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "",
"Plugins_History": "",
"Plugins_Objects": "",
"Plugins_Out_of": "",
"Plugins_Unprocessed_Events": "",
"Plugins_no_control": "",
"Presence_CalHead_day": "",
"Presence_CalHead_lang": "",
"Presence_CalHead_month": "",
"Presence_CalHead_quarter": "",
"Presence_CalHead_week": "",
"Presence_CalHead_year": "",
"Presence_CallHead_Devices": "",
"Presence_Loading": "",
"Presence_Shortcut_AllDevices": "",
"Presence_Shortcut_Archived": "",
"Presence_Shortcut_Connected": "",
"Presence_Shortcut_Devices": "",
"Presence_Shortcut_DownAlerts": "",
"Presence_Shortcut_Favorites": "",
"Presence_Shortcut_NewDevices": "",
"Presence_Title": "",
"REPORT_DASHBOARD_URL_description": "",
"REPORT_DASHBOARD_URL_name": "",
"REPORT_ERROR": "",
"REPORT_MAIL_description": "",
"REPORT_MAIL_name": "",
"REPORT_TITLE": "",
"RandomMAC_hover": "",
"Reports_Sent_Log": "",
"SCAN_SUBNETS_description": "",
"SYSTEM_TITLE": "",
"Setting_Override": "",
"Setting_Override_Description": "",
"Settings_Metadata_Toggle": "",
"Settings_device_Scanners_desync": "",
"Settings_device_Scanners_desync_popup": "",
"Speedtest_Results": "",
"Systeminfo_CPU": "",
"Systeminfo_CPU_Cores": "",
"Systeminfo_CPU_Name": "",
"Systeminfo_CPU_Speed": "",
"Systeminfo_CPU_Temp": "",
"Systeminfo_CPU_Vendor": "",
"Systeminfo_Client_Resolution": "",
"Systeminfo_Client_User_Agent": "",
"Systeminfo_General": "",
"Systeminfo_General_Date": "",
"Systeminfo_General_Date2": "",
"Systeminfo_General_Full_Date": "",
"Systeminfo_General_TimeZone": "",
"Systeminfo_Memory": "",
"Systeminfo_Memory_Total_Memory": "",
"Systeminfo_Memory_Usage": "",
"Systeminfo_Memory_Usage_Percent": "",
"Systeminfo_Motherboard": "",
"Systeminfo_Motherboard_BIOS": "",
"Systeminfo_Motherboard_BIOS_Date": "",
"Systeminfo_Motherboard_BIOS_Vendor": "",
"Systeminfo_Motherboard_Manufactured": "",
"Systeminfo_Motherboard_Name": "",
"Systeminfo_Motherboard_Revision": "",
"Systeminfo_Network": "",
"Systeminfo_Network_Accept_Encoding": "",
"Systeminfo_Network_Accept_Language": "",
"Systeminfo_Network_Connection_Port": "",
"Systeminfo_Network_HTTP_Host": "",
"Systeminfo_Network_HTTP_Referer": "",
"Systeminfo_Network_HTTP_Referer_String": "",
"Systeminfo_Network_Hardware": "",
"Systeminfo_Network_Hardware_Interface_Mask": "",
"Systeminfo_Network_Hardware_Interface_Name": "",
"Systeminfo_Network_Hardware_Interface_RX": "",
"Systeminfo_Network_Hardware_Interface_TX": "",
"Systeminfo_Network_IP": "",
"Systeminfo_Network_IP_Connection": "",
"Systeminfo_Network_IP_Server": "",
"Systeminfo_Network_MIME": "",
"Systeminfo_Network_Request_Method": "",
"Systeminfo_Network_Request_Time": "",
"Systeminfo_Network_Request_URI": "",
"Systeminfo_Network_Secure_Connection": "",
"Systeminfo_Network_Secure_Connection_String": "",
"Systeminfo_Network_Server_Name": "",
"Systeminfo_Network_Server_Name_String": "",
"Systeminfo_Network_Server_Query": "",
"Systeminfo_Network_Server_Query_String": "",
"Systeminfo_Network_Server_Version": "",
"Systeminfo_Services": "",
"Systeminfo_Services_Description": "",
"Systeminfo_Services_Name": "",
"Systeminfo_Storage": "",
"Systeminfo_Storage_Device": "",
"Systeminfo_Storage_Mount": "",
"Systeminfo_Storage_Size": "",
"Systeminfo_Storage_Type": "",
"Systeminfo_Storage_Usage": "",
"Systeminfo_Storage_Usage_Free": "",
"Systeminfo_Storage_Usage_Mount": "",
"Systeminfo_Storage_Usage_Total": "",
"Systeminfo_Storage_Usage_Used": "",
"Systeminfo_System": "",
"Systeminfo_System_AVG": "",
"Systeminfo_System_Architecture": "",
"Systeminfo_System_Kernel": "",
"Systeminfo_System_OSVersion": "",
"Systeminfo_System_Running_Processes": "",
"Systeminfo_System_System": "",
"Systeminfo_System_Uname": "",
"Systeminfo_System_Uptime": "",
"Systeminfo_This_Client": "",
"Systeminfo_USB_Devices": "",
"TICKER_MIGRATE_TO_NETALERTX": "",
"TIMEZONE_description": "",
"TIMEZONE_name": "",
"UI_DEV_SECTIONS_description": "",
"UI_DEV_SECTIONS_name": "",
"UI_ICONS_description": "",
"UI_ICONS_name": "",
"UI_LANG_description": "",
"UI_LANG_name": "",
"UI_MY_DEVICES_description": "",
"UI_MY_DEVICES_name": "",
"UI_NOT_RANDOM_MAC_description": "",
"UI_NOT_RANDOM_MAC_name": "",
"UI_PRESENCE_description": "",
"UI_PRESENCE_name": "",
"UI_REFRESH_description": "",
"UI_REFRESH_name": "",
"devices_old": "",
"general_event_description": "",
"general_event_title": "",
"report_guid": "",
"report_guid_missing": "",
"report_select_format": "",
"report_time": "",
"run_event_icon": "",
"run_event_tooltip": "",
"settings_core_icon": "",
"settings_core_label": "",
"settings_device_scanners": "",
"settings_device_scanners_icon": "",
"settings_device_scanners_label": "",
"settings_enabled": "",
"settings_enabled_icon": "",
"settings_expand_all": "",
"settings_imported": "",
"settings_imported_label": "",
"settings_missing": "",
"settings_missing_block": "",
"settings_old": "",
"settings_other_scanners": "",
"settings_other_scanners_icon": "",
"settings_other_scanners_label": "",
"settings_publishers": "",
"settings_publishers_icon": "",
"settings_publishers_label": "",
"settings_saved": "",
"settings_system_icon": "",
"settings_system_label": "",
"settings_update_item_warning": "",
"test_event_icon": "",
"test_event_tooltip": ""
}

View File

@@ -12,15 +12,15 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header" >
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 id="modal-ok-title" class="modal-title"> Modal Default Title </h4>
</div>
<div id="modal-ok-message" class="modal-body"> Modal Default message </div>
<div class="modal-footer">
<button id="modal-ok-OK" type="button" class="btn btn-primary" style="min-width: 80px;" data-dismiss="modal"> OK </button>
<div class="modal-footer">
<button id="modal-ok-OK" type="button" class="btn btn-primary btn-modal-submit" style="min-width: 80px;" data-dismiss="modal"> OK </button>
</div>
</div>
<!-- /.modal-content -->
@@ -33,7 +33,7 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header" >
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 id="modal-default-title" class="modal-title"> Modal Default Title </h4>
</div>
@@ -41,8 +41,8 @@
<div id="modal-default-message" class="modal-body"> Modal Default message </div>
<div class="modal-footer">
<button id="modal-default-cancel" type="button" class="btn btn-default pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
<button id="modal-default-OK" type="button" class="btn btn-primary" style="min-width: 80px;" onclick="modalDefaultOK()"> OK </button>
<button id="modal-default-cancel" type="button" class="btn btn-default pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
<button id="modal-default-OK" type="button" class="btn btn-primary btn-modal-submit" style="min-width: 80px;" onclick="modalDefaultOK()"> OK </button>
</div>
</div>
<!-- /.modal-content -->
@@ -55,7 +55,7 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header" >
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 id="modal-str-title" class="modal-title"> Modal Default Title </h4>
</div>
@@ -63,15 +63,15 @@
<div id="modal-str-message" class="modal-body"> Modal Default message </div>
<div class="modal-footer">
<button id="modal-str-cancel" type="button" class="btn btn-default pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
<button id="modal-str-OK" type="button" class="btn btn-primary" style="min-width: 80px;" > OK </button>
<button id="modal-str-cancel" type="button" class="btn btn-default pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
<button id="modal-str-OK" type="button" class="btn btn-primary btn-modal-submit" style="min-width: 80px;"> OK </button>
</div>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
</div>
<!-- Modal warning -->
<div class="modal modal-warning fade" id="modal-warning" style="display: none;">
@@ -86,15 +86,15 @@
<div id="modal-warning-message" class="modal-body"> Modal message </div>
<div class="modal-footer">
<button id="modal-warning-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
<button id="modal-warning-OK" type="button" class="btn btn-outline" style="min-width: 80px;" onclick="modalWarningOK()"> OK </button>
<button id="modal-warning-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
<button id="modal-warning-OK" type="button" class="btn btn-outline btn-modal-submit" style="min-width: 80px;" onclick="modalWarningOK()"> OK </button>
</div>
</div>
</div>
</div>
<!-- Modal input -->
<!-- Modal textarea input -->
<div class="modal modal-warning fade" id="modal-input" style="display: none;">
<div class="modal-dialog">
<div class="modal-content">
@@ -106,11 +106,39 @@
<div id="modal-input-message" class="modal-body"> Modal message </div>
<textarea id="modal-input-textarea" class="logs" cols="30" rows="3" wrap='off' ></textarea>
<textarea id="modal-input-textarea" class="logs" cols="30" rows="3" wrap='off' autofocus ></textarea>
<div class="modal-footer">
<button id="modal-input-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
<button id="modal-input-OK" type="button" class="btn btn-outline" style="min-width: 80px;" onclick="modalDefaultInput()"> OK </button>
<button id="modal-input-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
<button id="modal-input-OK" type="button" class="btn btn-outline btn-modal-submit" style="min-width: 80px;" onclick="modalDefaultInput()"> OK </button>
</div>
</div>
</div>
</div>
<!-- Modal field input -->
<div class="modal modal-warning fade" id="modal-field-input" style="display: none;">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 id="modal-field-input-title" class="modal-title"> Modal Title </h4>
</div>
<div id="modal-field-input-message" class="modal-body"> Modal message </div>
<input id="modal-field-input-field" class="modal-field-input" type="text" onfocus="this.value = this.value;" autofocus ></input>
<div class="modal-footer">
<button id="modal-field-input-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal">
Cancel
</button>
<button id="modal-field-input-OK" type="button" class="btn btn-outline btn-modal-submit" style="min-width: 80px;" onclick="modalDefaultFieldInput()">
OK
</button>
</div>
</div>
@@ -119,7 +147,7 @@
<!-- Alert float -->
<div id="notification" class="alert alert-dimissible pa_alert_notification">
<div id="notification_modal" class="alert alert-dimissible notification_modal" >
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<div id="alert-message"> Alert message </div>
</div>
@@ -130,3 +158,5 @@
<div id="ticker-message"> Announcement message </div>
</div>

View File

@@ -29,18 +29,18 @@ $config_file_lines = file($config_file);
$CookieSaveLoginName = "NetAlertX_SaveLogin";
// ###################################
// ## PIALERT_WEB_PROTECTION FALSE
// ## SETPWD_enable_password FALSE
// ###################################
$config_file_lines_bypass = array_values(preg_grep('/^PIALERT_WEB_PROTECTION.*=/', $config_file_lines));
$config_file_lines_bypass = array_values(preg_grep('/^SETPWD_enable_password.*=/', $config_file_lines));
$protection_line = explode("=", $config_file_lines_bypass[0]);
$Pia_WebProtection = strtolower(trim($protection_line[1]));
// ###################################
// ## PIALERT_WEB_PROTECTION TRUE
// ## SETPWD_enable_password TRUE
// ###################################
$config_file_lines = array_values(preg_grep('/^PIALERT_WEB_PASSWORD.*=/', $config_file_lines));
$config_file_lines = array_values(preg_grep('/^SETPWD_password.*=/', $config_file_lines));
$password_line = explode("'", $config_file_lines[0]);
$Pia_Password = $password_line[1];

View File

@@ -11,11 +11,16 @@
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
#---------------------------------------------------------------------------------#
$filename = "/app/.VERSION";
if(file_exists($filename)) {
echo file_get_contents($filename);
$filename = "/app/.VERSION";
if(file_exists($filename)) {
$fileContents = file_get_contents($filename);
if(trim($fileContents) === 'Dev') {
echo date('H:i:s') . " - " . $fileContents;
} else {
echo $fileContents;
}
else{
echo "File not found";
}
}
else {
echo date('H:i:s') . " - N/A";
}
?>

View File

@@ -1,779 +1,74 @@
> Community translations of this file (might be out-of-date): <a href="https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/README_ES.md">Spanish(<img src="https://github.com/lipis/flag-icons/blob/main/flags/4x3/es.svg" alt="README_ES.md" style="height: 16px !important;width: 20px !important;padding-inline:3px !important;">)</a>, <a href="https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/README_DE.md">German(<img src="https://github.com/lipis/flag-icons/blob/main/flags/4x3/de.svg" alt="README_DE.md" style="height: 16px !important;width: 20px !important;padding-inline:3px !important;">)</a>
# 📚 Docs for individual plugins
# 🔌 Plugins
>[!NOTE]
> Please check this [Plugins debugging guide](https://github.com/jokob-sk/NetAlertX/blob/main/docs/DEBUG_PLUGINS.md) and the corresponding Plugin documentation in the below table if you are facing issues.
## 🔌 Plugins & 📚 Docs
| Required | CurrentScan | Unique Prefix | Data source | Type | Link + Docs |
|----------|-------------|---------------|--------------------|----------------|---------------------------------------------------------------------|
| | | APPRISE | Script | 💬 publisher | 📚[_publisher_apprise](/front/plugins/_publisher_apprise/) |
| | Yes | ARPSCAN | Script | 🔍dev scanner | 📚[arp_scan](/front/plugins/arp_scan/) |
| | | CSVBCKP | Script | ⚙ system | 📚[csv_backup](/front/plugins/csv_backup/) |
| Yes* | | DBCLNP | Script | ⚙ system | 📚[db_cleanup](/front/plugins/db_cleanup/) |
| | | DDNS | Script | ⚙ system | 📚[ddns_update](/front/plugins/ddns_update/) |
| | Yes | DHCPLSS | Script | 🔍dev scanner | 📚[dhcp_leases](/front/plugins/dhcp_leases/) |
| | | DHCPSRVS | Script | ♻ other | 📚[dhcp_servers](/front/plugins/dhcp_servers/) |
| | Yes | INTRNT | Script | 🔍dev scanner | 📚[internet_ip](/front/plugins/internet_ip/) |
| | | INTRSPD | Script | ♻ other | 📚[internet_speedtest](/front/plugins/internet_speedtest/) |
| | | MAINT | Script | ⚙ system | 📚[maintenance](/front/plugins/maintenance/) |
| | | MQTT | Script | 💬 publisher | 📚[_publisher_mqtt](/front/plugins/_publisher_mqtt/) |
| Yes | | NEWDEV | Template | ⚙ system | 📚[newdev_template](/front/plugins/newdev_template/) |
| | | NMAP | Script | ♻ other | 📚[nmap_scan](/front/plugins/nmap_scan/) |
| | | NSLOOKUP | Script | ♻ other | 📚[nslookup_scan](/front/plugins/nslookup_scan/) |
| Yes | | NTFPRCS | Template | ⚙ system | 📚[notification_processing](/front/plugins/notification_processing/)|
| | | NTFY | Script | 💬 publisher | 📚[_publisher_ntfy](/front/plugins/_publisher_ntfy/) |
| | | PHOLUS | Script | ♻ other | 📚[pholus_scan](/front/plugins/pholus_scan/) |
| | Yes | PIHOLE | External SQLite DB | 🔍dev scanner | 📚[pihole_scan](/front/plugins/pihole_scan/) |
| | | PUSHSAFER | Script | 💬 publisher | 📚[_publisher_pushsafer](/front/plugins/_publisher_pushsafer/) |
| | | PUSHOVER | Script | 💬 publisher | 📚[_pushover_pushsafer](/front/plugins/_publisher_pushover/) |
| | | SETPWD | Script | ⚙ system | 📚[set_password](/front/plugins/set_password/) |
| | | SMTP | Script | 💬 publisher | 📚[_publisher_email](/front/plugins/_publisher_email/) |
| | Yes | SNMPDSC | Script | 🔍dev scanner | 📚[snmp_discovery](/front/plugins/snmp_discovery/) |
| | Yes** | UNDIS | Script | ♻ other | 📚[undiscoverables](/front/plugins/undiscoverables/) |
| | Yes | UNFIMP | Script | 🔍dev scanner | 📚[unifi_import](/front/plugins/unifi_import/) |
| | | VNDRPDT | Script | ⚙ system | 📚[vendor_update](/front/plugins/vendor_update/) |
| | | WEBHOOK | Script | 💬 publisher | 📚[_publisher_webhook](/front/plugins/_publisher_webhook/) |
| | | WEBMON | Script | ♻ other | 📚[website_monitor](/front/plugins/website_monitor/) |
| N/A | | N/A | SQL query | | N/A, but the External SQLite DB plugins work similarly |
## Plugin types
If you want to discover or import devices into the application enable some of the `🔍 dev scanner` plugins. The next step is to pick a notification plugin, or `▶️ publisher` plugin, to get notified about network changes. If you don't see a publisher you'd like to use, look at the [📚_publisher_apprise](/front/plugins/_publisher_apprise/) plugin which is a proxy for over 80 notification services.
### Enabling plugins
Plugins can be enabled via Settings, and can be disabled as needed.
1. Research which plugin you'd like to use below and then load the required plugins in Settings via the `LOADED_PLUGINS` setting.
1. Save the changes and review the Settings of the newly loaded plugins.
1. Change the `<prefix>_RUN` Setting to the recommended or custom value as per the documentation of the given setting
- If using `schedule` on a `🔍 dev scanner` plugin, make sure the schedules are the same across all `🔍 dev scanner` plugins
### Disabling, Unloading and Ignoring plugins
1. Change the `<prefix>_RUN` Setting to `disabled` if you want to disable the plugin, but keep the settings
1. If you want to speed up the application, you can unload the plugin by unselecting it in the `LOADED_PLUGINS` setting.
- Careful, once you save the Settings Unloaded plugin settings will be lost (old `app.conf` files are kept in the `/config` folder)
1. You can completely ignore plugins by placing a `ignore_plugin` file into the plugin directory. Ignored plugins won't show up in the `LOADED_PLUGINS` setting.
## Available Plugins
Device-detecting plugins insert values into the `CurrentScan` database table. The plugins that are not required are safe to ignore, however, it makes sense to have a least some device-detecting plugins enabled, such as `ARPSCAN` or `NMAPDEV`.
| ID | Type | Description | Required | Data source | Detailed docs |
|---------------|----------------|------------------------------|----------|--------------------|---------------------------------------------------------------------|
| `APPRISE` | ▶️ publisher | Apprise publisher plugin | | Script | [📚_publisher_apprise](/front/plugins/_publisher_apprise/) |
| `ARPSCAN` | 🔍 dev scanner | ARP scan plugin | | Script | [📚arp_scan](/front/plugins/arp_scan/) |
| `CSVBCKP` | ⚙ system | CSV backup plugin | | Script | [📚csv_backup](/front/plugins/csv_backup/) |
| `DBCLNP` | ⚙ system | Database cleanup plugin | Yes* | Script | [📚db_cleanup](/front/plugins/db_cleanup/) |
| `DDNS` | ⚙ system | DDNS update plugin | | Script | [📚ddns_update](/front/plugins/ddns_update/) |
| `DHCPLSS` | 🔍 dev scanner | DHCP leases plugin | | Script | [📚dhcp_leases](/front/plugins/dhcp_leases/) |
| `DHCPSRVS` | ♻ other | DHCP servers plugin | | Script | [📚dhcp_servers](/front/plugins/dhcp_servers/) |
| `INTRNT` | 🔍 dev scanner | Internet IP scanner | | Script | [📚internet_ip](/front/plugins/internet_ip/) |
| `INTRSPD` | ♻ other | Internet speed test plugin | | Script | [📚internet_speedtest](/front/plugins/internet_speedtest/) |
| `MAINT` | ⚙ system | Maintenance plugin | | Script | [📚maintenance](/front/plugins/maintenance/) |
| `MQTT` | ▶️ publisher | MQTT publisher plugin | | Script | [📚_publisher_mqtt](/front/plugins/_publisher_mqtt/) |
| `NEWDEV` | ⚙ system | New device template | Yes | Template | [📚newdev_template](/front/plugins/newdev_template/) |
| `NMAP` | ♻ other | Nmap scan plugin | | Script | [📚nmap_scan](/front/plugins/nmap_scan/) |
| `NMAPDEV` | 🔍 dev scanner | Nmap device scan plugin | | Script | [📚nmap_dev_scan](/front/plugins/nmap_dev_scan/) |
| `NSLOOKUP` | ♻ other | NSLookup scan plugin | | Script | [📚nslookup_scan](/front/plugins/nslookup_scan/) |
| `NTFPRCS` | ⚙ system | Notification processing | Yes | Template | [📚notification_processing](/front/plugins/notification_processing/)|
| `NTFY` | ▶️ publisher | NTFY publisher plugin | | Script | [📚_publisher_ntfy](/front/plugins/_publisher_ntfy/) |
| `PHOLUS` | ♻ other | Pholus scan plugin | | Script | [📚pholus_scan](/front/plugins/pholus_scan/) |
| `PIHOLE` | 🔍 dev scanner | Pi-hole scan plugin | | SQLite DB | [📚pihole_scan](/front/plugins/pihole_scan/) |
| `PUSHSAFER` | ▶️ publisher | Pushsafer publisher plugin | | Script | [📚_publisher_pushsafer](/front/plugins/_publisher_pushsafer/) |
| `PUSHOVER` | ▶️ publisher | Pushover publisher plugin | | Script | [📚_publisher_pushover](/front/plugins/_publisher_pushover/) |
| `SETPWD` | ⚙ system | Set password template | Yes | Template | [📚set_password](/front/plugins/set_password/) |
| `SMTP` | ▶️ publisher | Email publisher plugin | | Script | [📚_publisher_email](/front/plugins/_publisher_email/) |
| `SNMPDSC` | 🔍 dev scanner | SNMP discovery plugin | | Script | [📚snmp_discovery](/front/plugins/snmp_discovery/) |
| `UNDIS` | ♻ other | Undiscoverables scan plugin | | Script | [📚undiscoverables](/front/plugins/undiscoverables/) |
| `UNFIMP` | 🔍 dev scanner | UniFi import plugin | | Script | [📚unifi_import](/front/plugins/unifi_import/) |
| `VNDRPDT` | ⚙ system | Vendor update plugin | | Script | [📚vendor_update](/front/plugins/vendor_update/) |
| `WEBHOOK` | ▶️ publisher | Webhook publisher plugin | | Script | [📚_publisher_webhook](/front/plugins/_publisher_webhook/) |
| `WEBMON` | ♻ other | Website monitor plugin | | Script | [📚website_monitor](/front/plugins/website_monitor/) |
> \* The database cleanup plugin (`DBCLNP`) is not _required_ but the app will become unusable after a while if not executed.
>
> \** The Undiscoverables plugin (`UNDIS`) inserts only user-specified dummy devices.
> [!NOTE]
> You soft-disable plugins via Settings or completely ignore plugins by placing a `ignore_plugin` file into the plugin directory. The difference is that ignored plugins don't show up anywhere in the UI (Settings, Device details, Plugins pages). The app skips ignored plugins completely. Device-detecting plugins insert values into the `CurrentScan` database table. The plugins that are not required are safe to ignore, however it makes sense to have a least some device-detecting plugins (that insert entries into the `CurrentScan` table) enabled, such as `ARPSCAN` or `PIHOLE`.
> It's recommended to use the same schedule interval for all plugins responsible for discovering new devices.
## 🌟 Create a custom plugin: Overview
## Developing custom plugins
| ![Screen 1][screen1] | ![Screen 2][screen2] | ![Screen 3][screen3] |
|----------------------|----------------------| ----------------------|
| ![Screen 4][screen4] | ![Screen 5][screen5] |
NetAlertX comes with a plugin system to feed events from third-party scripts into the UI and then send notifications, if desired. The highlighted core functionality this plugin system supports, is:
* dynamic creation of a simple UI to interact with the discovered objects,
* filtering of displayed values in the Devices UI
* surface settings of plugins in the UI,
* different column types for reported values to e.g. link back to a device
* import objects into existing NetAlertX database tables
> (Currently, update/overwriting of existing objects is not supported.)
Example use cases for plugins could be:
* Monitor a web service and alert me if it's down
* Import devices from dhcp.leases files instead/complementary to using PiHole or arp-scans
* Creating ad-hoc UI tables from existing data in the NetAlertX database, e.g. to show all open ports on devices, to list devices that disconnected in the last hour, etc.
* Using other device discovery methods on the network and importing the data as new devices
* Creating a script to create FAKE devices based on user input via custom settings
* ...at this point the limitation is mostly the creativity rather than the capability (there might be edge cases and a need to support more form controls for user input off custom settings, but you probably get the idea)
If you wish to develop a plugin, please check the existing plugin structure. Once the settings are saved by the user they need to be removed from the `app.conf` file manually if you want to re-initialize them from the `config.json` of the plugin.
Again, please read the below carefully if you'd like to contribute with a plugin yourself. This documentation file might be outdated, so double-check the sample plugins as well.
## ⚠ Disclaimer
Follow the below very carefully and check example plugin(s) if you'd like to write one yourself. Plugin UI is not my priority right now, happy to approve PRs if you are interested in extending/improving the UI experience (See [Frontend guidelines](/docs/FRONTEND_DEVELOPMENT.md)). Example improvements for the taking:
* Making the tables sortable/filterable
* Using the same approach to display table data as in the Devices section (solves above)
* Adding form controls supported to display the data (Currently supported ones are listed in the section "UI settings in database_column_definitions" below)
* ...
## ❗ Known limitations:
These issues will be hopefully fixed with time, so please don't report them. Instead, if you know how, feel free to investigate and submit a PR to fix the below. Keep the PRs small as it's easier to approve them:
* Existing plugin objects are sometimes not interpreted correctly and a new object is created instead, resulting in duplicate entries. (race condition?)
* Occasional (experienced twice) hanging of processing plugin script file.
* UI displays outdated values until the API endpoints get refreshed.
## Plugin file structure overview
> Folder name must be the same as the code name value in: `"code_name": "<value>"`
> Unique prefix needs to be unique compared to the other settings prefixes, e.g.: the prefix `APPRISE` is already in use.
| File | Required (plugin type) | Description |
|----------------------|----------------------|----------------------|
| `config.json` | yes | Contains the plugin configuration (manifest) including the settings available to the user. |
| `script.py` | no | The Python script itself. You may call any valid linux command. |
| `last_result.log` | no | The file used to interface between NetAlertX and the plugin. Required for a script plugin if you want to feed data into the app. |
| `script.log` | no | Logging output (recommended) |
| `README.md` | yes | Any setup considerations or overview |
More on specifics below.
### Column order and values
> [!IMPORTANT]
> Spend some time reading and trying to understand the below table. This is the interface between the Plugins and the core application.
| Order | Represented Column | Value Required | Description |
|----------------------|----------------------|----------------------|----------------------|
| 0 | `Object_PrimaryID` | yes | The primary ID used to group Events under. |
| 1 | `Object_SecondaryID` | no | Optional secondary ID to create a relationship beween other entities, such as a MAC address |
| 2 | `DateTime` | yes | When the event occured in the format `2023-01-02 15:56:30` |
| 3 | `Watched_Value1` | yes | A value that is watched and users can receive notifications if it changed compared to the previously saved entry. For example IP address |
| 4 | `Watched_Value2` | no | As above |
| 5 | `Watched_Value3` | no | As above |
| 6 | `Watched_Value4` | no | As above |
| 7 | `Extra` | no | Any other data you want to pass and display in NetAlertX and the notifications |
| 8 | `ForeignKey` | no | A foreign key that can be used to link to the parent object (usually a MAC address) |
> [!NOTE]
> De-duplication is run once an hour on the `Plugins_Objects` database table and duplicate entries with the same value in columns `Object_PrimaryID`, `Object_SecondaryID`, `Plugin` (auto-filled based on `unique_prefix` of the plugin), `UserData` (can be populated with the `"type": "textbox_save"` column type) are removed.
# config.json structure
The `config.json` file is the manifest of the plugin. It contains mainly settings definitions and the mapping of Plugin objects to NetAlertX objects.
## Supported data sources
Currently, these data sources are supported (valid `data_source` value).
| Name | `data_source` value | Needs to return a "table"* | Overview (more details on this page below) |
|----------------------|----------------------|----------------------|----------------------|
| Script | `script` | no | Executes any linux command in the `CMD` setting. |
| NetAlertX DB query | `app-db-query` | yes | Executes a SQL query on the NetAlertX database in the `CMD` setting. |
| Template | `template` | no | Used to generate internal settings, such as default values. |
| External SQLite DB query | `sqlite-db-query` | yes | Executes a SQL query from the `CMD` setting on an external SQLite database mapped in the `DB_PATH` setting. |
| Plugin type | `plugin_type` | no | Specifies the type of the plugin and in which section the Plugin settings are displayed ( one of `general/system/scanner/other/publisher` ). |
> * "Needs to return a "table" means that the application expects a `last_result.log` file with some results. It's not a blocker, however warnings in the `app.log` might be logged.
> 🔎Example
>```json
>"data_source": "app-db-query"
>```
If you want to display plugin objects or import devices into the app, data sources have to return a "table" of the exact structure as outlined above.
You can show or hide the UI on the "Plugins" page and "Plugins" tab for a plugin on devices via the `show_ui` property:
> 🔎Example
>```json
> "show_ui": true,
> ```
### "data_source": "script"
If the `data_source` is set to `script` the `CMD` setting (that you specify in the `settings` array section in the `config.json`) contains an executable Linux command, that usually generates a `last_result.log` file (not required if you don't import any data into the app). The `last_result.log` file needs to be saved in the same folder as the plugin.
> [!IMPORTANT]
> A lot of the work is taken care of by the [`plugin_helper.py` library](/front/plugins/plugin_helper.py). You don't need to manage the `last_result.log` file if using the helper objects. Check other `script.py` of other plugins for details (The [Undicoverables plugins `script.py` file](/front/plugins/undiscoverables/script.py) is a good example).
The content of the `last_result.log` file needs to contain the columns as defined in the "Column order and values" section above. The order of columns can't be changed. After every scan it should contain only the results from the latest scan/execution.
- The format of the `last_result.log` is a `csv`-like file with the pipe `|` as a separator.
- 9 (nine) values need to be supplied, so every line needs to contain 8 pipe separators. Empty values are represented by `null`.
- Don't render "headers" for these "columns".
Every scan result/event entry needs to be on a new line.
- You can find which "columns" need to be present, and if the value is required or optional, in the "Column order and values" section.
- The order of these "columns" can't be changed.
#### 🔎 last_result.log examples
Valid CSV:
```csv
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|null|null|null|null
https://www.duckduckgo.com|192.168.0.1|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|ff:ee:ff:11:ff:11
```
Invalid CSV with different errors on each line:
```csv
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898||null|null|null
https://www.duckduckgo.com|null|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|
|https://www.duckduckgo.com|null|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|null
null|192.168.1.1|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine
https://www.duckduckgo.com|192.168.1.1|2023-01-02 15:56:30|null|0.9898|null|null|Best search engine
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|||
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|
```
### "data_source": "app-db-query"
If the `data_source` is set to `app-db-query`, the `CMD` setting needs to contain a SQL query rendering the columns as defined in the "Column order and values" section above. The order of columns is important.
This SQL query is executed on the `app.db` SQLite database file.
> 🔎Example
>
> SQL query example:
>
> ```SQL
> SELECT dv.dev_Name as Object_PrimaryID,
> cast(dv.dev_LastIP as VARCHAR(100)) || ':' || cast( SUBSTR(ns.Port ,0, INSTR(ns.Port , '/')) as VARCHAR(100)) as Object_SecondaryID,
> datetime() as DateTime,
> ns.Service as Watched_Value1,
> ns.State as Watched_Value2,
> 'null' as Watched_Value3,
> 'null' as Watched_Value4,
> ns.Extra as Extra,
> dv.dev_MAC as ForeignKey
> FROM
> (SELECT * FROM Nmap_Scan) ns
> LEFT JOIN
> (SELECT dev_Name, dev_MAC, dev_LastIP FROM Devices) dv
> ON ns.MAC = dv.dev_MAC
> ```
>
> Required `CMD` setting example with above query (you can set `"type": "label"` if you want it to make uneditable in the UI):
>
> ```json
> {
> "function": "CMD",
> "type": "text",
> "default_value":"SELECT dv.dev_Name as Object_PrimaryID, cast(dv.dev_LastIP as VARCHAR(100)) || ':' || cast( SUBSTR(ns.Port ,0, INSTR(ns.Port , '/')) as VARCHAR(100)) as Object_SecondaryID, datetime() as DateTime, ns.Service as Watched_Value1, ns.State as Watched_Value2, 'null' as Watched_Value3, 'null' as Watched_Value4, ns.Extra as Extra FROM (SELECT * FROM Nmap_Scan) ns LEFT JOIN (SELECT dev_Name, dev_MAC, dev_LastIP FROM Devices) dv ON ns.MAC = dv.dev_MAC",
> "options": [],
> "localized": ["name", "description"],
> "name" : [{
> "language_code":"en_us",
> "string" : "SQL to run"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "This SQL query is used to populate the coresponding UI tables under the Plugins section."
> }]
> }
> ```
### "data_source": "template"
In most cases, it is used to initialize settings. Check the `newdev_template` plugin for details.
### "data_source": "sqlite-db-query"
You can execute a SQL query on an external database connected to the current NetAlertX database via a temporary `EXTERNAL_<unique prefix>.` prefix.
For example for `PIHOLE` (`"unique_prefix": "PIHOLE"`) it is `EXTERNAL_PIHOLE.`. The external SQLite database file has to be mapped in the container to the path specified in the `DB_PATH` setting:
> 🔎Example
>
>```json
> ...
>{
> "function": "DB_PATH",
> "type": "readonly",
> "default_value":"/etc/pihole/pihole-FTL.db",
> "options": [],
> "localized": ["name", "description"],
> "name" : [{
> "language_code":"en_us",
> "string" : "DB Path"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "Required setting for the <code>sqlite-db-query</code> plugin type. Is used to mount an external SQLite database and execute the SQL query stored in the <code>CMD</code> setting."
> }]
> }
> ...
>```
The actual SQL query you want to execute is then stored as a `CMD` setting, similar to a Plugin of the `app-db-query` plugin type. The format has to adhere to the format outlined in the "Column order and values" section above.
> 🔎Example
>
> Notice the `EXTERNAL_PIHOLE.` prefix.
>
>```json
>{
> "function": "CMD",
> "type": "text",
> "default_value":"SELECT hwaddr as Object_PrimaryID, cast('http://' || (SELECT ip FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1) as VARCHAR(100)) || ':' || cast( SUBSTR((SELECT name FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1), 0, INSTR((SELECT name FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1), '/')) as VARCHAR(100)) as Object_SecondaryID, datetime() as DateTime, macVendor as Watched_Value1, lastQuery as Watched_Value2, (SELECT name FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1) as Watched_Value3, 'null' as Watched_Value4, '' as Extra, hwaddr as ForeignKey FROM EXTERNAL_PIHOLE.network WHERE hwaddr NOT LIKE 'ip-%' AND hwaddr <> '00:00:00:00:00:00'; ",
> "options": [],
> "localized": ["name", "description"],
> "name" : [{
> "language_code":"en_us",
> "string" : "SQL to run"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "This SQL query is used to populate the coresponding UI tables under the Plugins section. This particular one selects data from a mapped PiHole SQLite database and maps it to the corresponding Plugin columns."
> }]
> }
> ```
## 🕳 Filters
Plugin entries can be filtered in the UI based on values entered into filter fields. The `txtMacFilter` textbox/field contains the Mac address of the currently viewed device, or simply a Mac address that's available in the `mac` query string (`<url>?mac=aa:22:aa:22:aa:22:aa`).
| Property | Required | Description |
|----------------------|----------------------|----------------------|
| `compare_column` | yes | Plugin column name that's value is used for comparison (**Left** side of the equation) |
| `compare_operator` | yes | JavaScript comparison operator |
| `compare_field_id` | yes | The `id` of a input text field containing a value is used for comparison (**Right** side of the equation)|
| `compare_js_template` | yes | JavaScript code used to convert left and right side of the equation. `{value}` is replaced with input values. |
| `compare_use_quotes` | yes | If `true` then the end result of the `compare_js_template` i swrapped in `"` quotes. Use to compare strings. |
Filters are only applied if a filter is specified, and the `txtMacFilter` is not `undefined`, or empty (`--`).
> 🔎Example:
>
> ```json
> "data_filters": [
> {
> "compare_column" : "Object_PrimaryID",
> "compare_operator" : "==",
> "compare_field_id": "txtMacFilter",
> "compare_js_template": "'{value}'.toString()",
> "compare_use_quotes": true
> }
> ],
> ```
>
>1. On the `pluginsCore.php` page is an input field with the id `txtMacFilter`:
>
>```html
><input class="form-control" id="txtMacFilter" type="text" value="--">
>```
>
>2. This input field is initialized via the `&mac=` query string.
>
>3. The app then proceeds to use this Mac value from this field and compares it to the value of the `Object_PrimaryID` database field. The `compare_operator` is `==`.
>
>4. Both values, from the database field `Object_PrimaryID` and from the `txtMacFilter` are wrapped and evaluated with the `compare_js_template`, that is `'{value}.toString()'`.
>
>5. `compare_use_quotes` is set to `true` so `'{value}'.toString()` is wrappe dinto `"` quotes.
>
>6. This results in for example this code:
>
>```javascript
> // left part of the expression coming from compare_column and right from the input field
> // notice the added quotes ()") around the left and right part of teh expression
> "eval('ac:82:ac:82:ac:82".toString()')" == "eval('ac:82:ac:82:ac:82".toString()')"
>```
>
### 🗺 Mapping the plugin results into a database table
Plugin results are always inserted into the standard `Plugin_Objects` database table. Optionally, NetAlertX can take the results of the plugin execution, and insert these results into an additional database table. This is enabled by with the property `"mapped_to_table"` in the `config.json` file. The mapping of the columns is defined in the `database_column_definitions` array.
> [!NOTE]
> If results are mapped to the `CurrentScan` table, the data is then included into the regular scan loop, so for example notification for devices are sent out.
>🔍 Example:
>
>For example, this approach is used to implement the `DHCPLSS` plugin. The script parses all supplied "dhcp.leases" files, gets the results in the generic table format outlined in the "Column order and values" section above, takes individual values, and inserts them into the `CurrentScan` database table in the NetAlertX database. All this is achieved by:
>
>1. Specifying the database table into which the results are inserted by defining `"mapped_to_table": "CurrentScan"` in the root of the `config.json` file as shown below:
>
>```json
>{
> "code_name": "dhcp_leases",
> "unique_prefix": "DHCPLSS",
> ...
> "data_source": "script",
> "localized": ["display_name", "description", "icon"],
> "mapped_to_table": "CurrentScan",
> ...
>}
>```
>2. Defining the target column with the `mapped_to_column` property for individual columns in the `database_column_definitions` array of the `config.json` file. For example in the `DHCPLSS` plugin, I needed to map the value of the `Object_PrimaryID` column returned by the plugin, to the `cur_MAC` column in the NetAlertX database table `CurrentScan`. Notice the `"mapped_to_column": "cur_MAC"` key-value pair in the sample below.
>
>```json
>{
> "column": "Object_PrimaryID",
> "mapped_to_column": "cur_MAC",
> "css_classes": "col-sm-2",
> "show": true,
> "type": "device_mac",
> "default_value":"",
> "options": [],
> "localized": ["name"],
> "name":[{
> "language_code":"en_us",
> "string" : "MAC address"
> }]
> }
>```
>
>3. That's it. The app takes care of the rest. It loops thru the objects discovered by the plugin, takes the results line-by-line, and inserts them into the database table specified in `"mapped_to_table"`. The columns are translated from the generic plugin columns to the target table columns via the `"mapped_to_column"` property in the column definitions.
> [!NOTE]
> You can create a column mapping with a default value via the `mapped_to_column_data` property. This means that the value of the given column will always be this value. That also menas that the `"column": "NameDoesntMatter"` is not important as there is no database source column.
>🔍 Example:
>
>```json
>{
> "column": "NameDoesntMatter",
> "mapped_to_column": "cur_ScanMethod",
> "mapped_to_column_data": {
> "value": "DHCPLSS"
> },
> "css_classes": "col-sm-2",
> "show": true,
> "type": "device_mac",
> "default_value":"",
> "options": [],
> "localized": ["name"],
> "name":[{
> "language_code":"en_us",
> "string" : "MAC address"
> }]
> }
>```
#### params
> [!IMPORTANT]
> An esier way to access settings in scripts is the `get_setting_value` method.
> ```python
> from helper import get_setting_value
>
> ...
> NTFY_TOPIC = get_setting_value('NTFY_TOPIC')
> ...
>
> ```
The `params` array in the `config.json` is used to enable the user to change the parameters of the executed script. For example, the user wants to monitor a specific URL.
> 🔎 Example:
> Passing user-defined settings to a command. Let's say, you want to have a script, that is called with a user-defined parameter called `urls`:
>
> ```bash
> root@server# python3 /app/front/plugins/website_monitor/script.py urls=https://google.com,https://duck.com
> ```
* You can allow the user to add URLs to a setting with the `function` property set to a custom name, such as `urls_to_check` (this is not a reserved name from the section "Supported settings `function` values" below).
* You specify the parameter `urls` in the `params` section of the `config.json` the following way (`WEBMON_` is the plugin prefix automatically added to all the settings):
```json
{
"params" : [
{
"name" : "urls",
"type" : "setting",
"value" : "WEBMON_urls_to_check"
}]
}
```
* Then you use this setting as an input parameter for your command in the `CMD` setting. Notice `urls={urls}` in the below json:
```json
{
"function": "CMD",
"type": "text",
"default_value":"python3 /app/front/plugins/website_monitor/script.py urls={urls}",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Command"
}],
"description": [{
"language_code":"en_us",
"string" : "Command to run"
}]
}
```
During script execution, the app will take the command `"python3 /app/front/plugins/website_monitor/script.py urls={urls}"`, take the `{urls}` wildcard and replace it with the value from the `WEBMON_urls_to_check` setting. This is because:
1. The app checks the `params` entries
2. It finds `"name" : "urls"`
3. Checks the type of the `urls` params and finds `"type" : "setting"`
4. Gets the setting name from `"value" : "WEBMON_urls_to_check"`
- IMPORTANT: in the `config.json` this setting is identified by `"function":"urls_to_check"`, not `"function":"WEBMON_urls_to_check"`
- You can also use a global setting, or a setting from a different plugin
5. The app gets the user defined value from the setting with the code name `WEBMON_urls_to_check`
- let's say the setting with the code name `WEBMON_urls_to_check` contains 2 values entered by the user:
- `WEBMON_urls_to_check=['https://google.com','https://duck.com']`
6. The app takes the value from `WEBMON_urls_to_check` and replaces the `{urls}` wildcard in the setting where `"function":"CMD"`, so you go from:
- `python3 /app/front/plugins/website_monitor/script.py urls={urls}`
- to
- `python3 /app/front/plugins/website_monitor/script.py urls=https://google.com,https://duck.com`
Below are some general additional notes, when defining `params`:
- `"name":"name_value"` - is used as a wildcard replacement in the `CMD` setting value by using curly brackets `{name_value}`. The wildcard is replaced by the result of the `"value" : "param_value"` and `"type":"type_value"` combo configuration below.
- `"type":"<sql|setting>"` - is used to specify the type of the params, currently only 2 supported (`sql`,`setting`).
- `"type":"sql"` - will execute the SQL query specified in the `value` property. The sql query needs to return only one column. The column is flattened and separated by commas (`,`), e.g: `SELECT dev_MAC from DEVICES` -> `Internet,74:ac:74:ac:74:ac,44:44:74:ac:74:ac`. This is then used to replace the wildcards in the `CMD` setting.
- `"type":"setting"` - The setting code name. A combination of the value from `unique_prefix` + `_` + `function` value, or otherwise the code name you can find in the Settings page under the Setting display name, e.g. `PIHOLE_RUN`.
- `"value": "param_value"` - Needs to contain a setting code name or SQL query without wildcards.
- `"timeoutMultiplier" : true` - used to indicate if the value should multiply the max timeout for the whole script run by the number of values in the given parameter.
- `"base64": true` - use base64 encoding to pass the value to the script (e.g. if there are spaces)
> 🔎Example:
>
> ```json
> {
> "params" : [{
> "name" : "ips",
> "type" : "sql",
> "value" : "SELECT dev_LastIP from DEVICES",
> "timeoutMultiplier" : true
> },
> {
> "name" : "macs",
> "type" : "sql",
> "value" : "SELECT dev_MAC from DEVICES"
> },
> {
> "name" : "timeout",
> "type" : "setting",
> "value" : "NMAP_RUN_TIMEOUT"
> },
> {
> "name" : "args",
> "type" : "setting",
> "value" : "NMAP_ARGS",
> "base64" : true
> }]
> }
> ```
#### ⚙ Setting object structure
> [!NOTE]
> The settings flow and when Plugin specific settings are applied is described under the [Settings system](/docs/SETTINGS_SYSTEM.md).
Required attributes are:
| Property | Description |
| -------- | ----------- |
| `"function"` | Specifies the function the setting drives or a simple unique code name. See Supported settings function values for options. |
| `"type"` | Specifies the form control used for the setting displayed in the Settings page and what values are accepted. Supported options include: |
| | - `text` |
| | - `integer` |
| | - `boolean` |
| | - `password` |
| | - `readonly` |
| | - `integer.select` |
| | - `text.select` |
| | - `text.multiselect` |
| | - `list` |
| | - `integer.checkbox` |
| | - `text.template` |
| `"localized"` | A list of properties on the current JSON level that need to be localized. |
| `"name"` | Displayed on the Settings page. An array of localized strings. See Localized strings below. |
| `"description"` | Displayed on the Settings page. An array of localized strings. See Localized strings below. |
| (optional) `"events"` | Specifies whether to generate an execution button next to the input field of the setting. Supported values: |
| | - `"test"` - For notification plugins testing |
| | - `"run"` - Regular plugins testing |
| (optional) `"override_value"` | Used to determine a user-defined override for the setting. Useful for template-based plugins, where you can choose to leave the current value or override it with the value defined in the setting. (Work in progress) |
| (optional) `"events"` | Used to trigger the plugin. Usually used on the `RUN` setting. Not fully tested in all scenarios. Will show a play button next to the setting. After clicking, an event is generated for the backend in the `Parameters` database table to process the front-end event on the next run. |
##### Supported settings `function` values
You can have any `"function": "my_custom_name"` custom name, however, the ones listed below have a specific functionality attached to them. If you use a custom name, then the setting is mostly used as an input parameter for the `params` section.
| Setting | Description |
| ------- | ----------- |
| `RUN` | (required) Specifies when the service is executed. |
| | Supported Options: |
| | - "disabled" - do not run |
| | - "once" - run on app start or on settings saved |
| | - "schedule" - if included, then a `RUN_SCHD` setting needs to be specified to determine the schedule |
| | - "always_after_scan" - run always after a scan is finished |
| | - "before_name_updates" - run before device names are updated (for name discovery plugins) |
| | - "on_new_device" - run when a new device is detected |
| | - "before_config_save" - run before the config is marked as saved. Useful if your plugin needs to modify the `app.conf` file. |
| `RUN_SCHD` | (required if you include "schedule" in the above `RUN` function) Cron-like scheduling is used if the `RUN` setting is set to `schedule`. |
| `CMD` | (required) Specifies the command that should be executed. |
| `API_SQL` | (not implemented) Generates a `table_` + `code_name` + `.json` file as per [API docs](https://github.com/jokob-sk/NetAlertX/blob/main/docs/API.md). |
| `RUN_TIMEOUT` | (optional) Specifies the maximum execution time of the script. If not specified, a default value of 10 seconds is used to prevent hanging. |
| `WATCH` | (optional) Specifies which database columns are watched for changes for this particular plugin. If not specified, no notifications are sent. |
| `REPORT_ON` | (optional) Specifies when to send a notification. Supported options are: |
| | - `new` means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. |
| | - `watched-changed` - means that selected `Watched_ValueN` columns changed |
| | - `watched-not-changed` - reports even on events where selected `Watched_ValueN` did not change |
| | - `missing-in-last-scan` - if the object is missing compared to previous scans |
> 🔎 Example:
>
> ```json
> {
> "function": "RUN",
> "type": "text.select",
> "default_value":"disabled",
> "options": ["disabled", "once", "schedule", "always_after_scan", "on_new_device"],
> "localized": ["name", "description"],
> "name" :[{
> "language_code":"en_us",
> "string" : "When to run"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "Enable a regular scan of your services. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) for the time specified in <a href=\"#WEBMON_RUN_TIMEOUT\"><code>WEBMON_RUN_TIMEOUT</code> setting</a>."
> }]
> }
> ```
##### 🌍Localized strings
- `"language_code":"<en_us|es_es|de_de>"` - code name of the language string. Only these three are currently supported. At least the `"language_code":"en_us"` variant has to be defined.
- `"string"` - The string to be displayed in the given language.
> 🔎 Example:
>
> ```json
>
> {
> "language_code":"en_us",
> "string" : "When to run"
> }
>
> ```
##### UI settings in database_column_definitions
The UI will adjust how columns are displayed in the UI based on the resolvers definition of the `database_column_definitions` object. These are the supported form controls and related functionality:
- Only columns with `"show": true` and also with at least an English translation will be shown in the UI.
| Supported Types | Description |
| -------------- | ----------- |
| `label` | Displays a column only. |
| `textarea_readonly` | Generates a read only text area and cleans up the text to display it somewhat formatted with new lines preserved. |
| See below for information on `threshold`, `replace`. | |
| | |
| `options` Property | Used in conjunction with types like `threshold`, `replace`, `regex`. |
| `options_params` Property | Used in conjunction with a `"options": "[{value}]"` template and `text.select`. Can specify SQL query (needs to return 2 columns `SELECT dev_Name as name, dev_Mac as id`) or Setting (not tested) to populate the dropdown. Check example below or have a look at the `NEWDEV` plugin `config.json` file. |
| `threshold` | The `options` array contains objects ordered from the lowest `maximum` to the highest. The corresponding `hexColor` is used for the value background color if it's less than the specified `maximum` but more than the previous one in the `options` array. |
| `replace` | The `options` array contains objects with an `equals` property, which is compared to the "value." If the values are the same, the string in `replacement` is displayed in the UI instead of the actual "value". |
| `regex` | Applies a regex to the value. The `options` array contains objects with an `type` (must be set to `regex`) and `param` (must contain the regex itself) property. |
| | |
| Type Definitions | |
| `device_mac` | The value is considered to be a MAC address, and a link pointing to the device with the given MAC address is generated. |
| `device_ip` | The value is considered to be an IP address. A link pointing to the device with the given IP is generated. The IP is checked against the last detected IP address and translated into a MAC address, which is then used for the link itself. |
| `device_name_mac` | The value is considered to be a MAC address, and a link pointing to the device with the given IP is generated. The link label is resolved as the target device name. |
| `url` | The value is considered to be a URL, so a link is generated. |
| `textbox_save` | Generates an editable and saveable text box that saves values in the database. Primarily intended for the `UserData` database column in the `Plugins_Objects` table. |
| `url_http_https` | Generates two links with the `https` and `http` prefix as lock icons. |
| `eval` | Evaluates as JavaScript. Use the variable `value` to use the given column value as input (e.g. `'<b>${value}<b>'` (replace ' with ` in your code) ) |
> [!NOTE]
> Supports chaining. You can chain multiple resolvers with `.`. For example `regex.url_http_https`. This will apply the `regex` resolver and then the `url_http_https` resolver.
```json
"function": "dev_DeviceType",
"type": "text.select",
"maxLength": 30,
"default_value": "",
"options": ["{value}"],
"options_params" : [
{
"name" : "value",
"type" : "sql",
"value" : "SELECT '' as id, '' as name UNION SELECT dev_DeviceType as id, dev_DeviceType as name FROM (SELECT dev_DeviceType FROM Devices UNION SELECT 'Smartphone' UNION SELECT 'Tablet' UNION SELECT 'Laptop' UNION SELECT 'PC' UNION SELECT 'Printer' UNION SELECT 'Server' UNION SELECT 'NAS' UNION SELECT 'Domotic' UNION SELECT 'Game Console' UNION SELECT 'SmartTV' UNION SELECT 'Clock' UNION SELECT 'House Appliance' UNION SELECT 'Phone' UNION SELECT 'AP' UNION SELECT 'Gateway' UNION SELECT 'Firewall' UNION SELECT 'Switch' UNION SELECT 'WLAN' UNION SELECT 'Router' UNION SELECT 'Other') AS all_devices ORDER BY id;"
},
{
"name" : "uilang",
"type" : "setting",
"value" : "UI_LANG"
}
]
```
```json
{
"column": "Watched_Value1",
"css_classes": "col-sm-2",
"show": true,
"type": "threshold",
"default_value":"",
"options": [
{
"maximum": 199,
"hexColor": "#792D86"
},
{
"maximum": 299,
"hexColor": "#5B862D"
},
{
"maximum": 399,
"hexColor": "#7D862D"
},
{
"maximum": 499,
"hexColor": "#BF6440"
},
{
"maximum": 599,
"hexColor": "#D33115"
}
],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Status code"
}]
},
{
"column": "Status",
"show": true,
"type": "replace",
"default_value":"",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<i class='fa-solid fa-square-check'></i>"
},
{
"equals": "watched-changed",
"replacement": "<i class='fa-solid fa-triangle-exclamation'></i>"
},
{
"equals": "new",
"replacement": "<i class='fa-solid fa-circle-plus'></i>"
}
],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Status"
}]
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-1",
"show": true,
"type": "regex.url_http_https",
"default_value":"",
"options": [
{
"type": "regex",
"param": "([\\d.:]+)"
}
],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "HTTP/s links"
},
{
"language_code":"es_es",
"string" : "N/A"
}]
}
```
[screen1]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins.png "Screen 1"
[screen2]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_settings.png "Screen 2"
[screen3]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_json_settings.png "Screen 3"
[screen4]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_json_ui.png "Screen 4"
[screen5]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_device_details.png "Screen 5"
If you want to develop a custom plugin, please read this [Plugin development guide](/docs/PLUGINS_DEV.md).

View File

@@ -1,430 +1,483 @@
{
"code_name": "_publisher_apprise",
"unique_prefix": "APPRISE",
"plugin_type": "publisher",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": ["display_name", "description", "icon"],
"display_name" : [
"code_name": "_publisher_apprise",
"unique_prefix": "APPRISE",
"plugin_type": "publisher",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
"string": "Apprise publisher"
},
{
"language_code": "es_es",
"string": "Habilitar Apprise"
}
],
"icon": [
{
"language_code": "en_us",
"string": "<i class=\"fa-solid fa-bullhorn\"></i>"
}
],
"description": [
{
"language_code": "en_us",
"string": "A plugin to publish a notification via the Apprise gateway."
}
],
"params": [],
"database_column_definitions": [
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string" : "Apprise publisher"
},
{
"language_code": "es_es",
"string" : "Habilitar Apprise"
}
],
"icon":[{
"language_code": "en_us",
"string" : "<i class=\"fa-solid fa-bullhorn\"></i>"
}],
"description": [
{
"language_code": "en_us",
"string" : "A plugin to publish a notification via the Apprise gateway."
}
],
"params" : [],
"database_column_definitions":
[
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
},
{
"language_code": "es_es",
"string" : "N/A"
}]
"language_code": "en_us",
"string": "N/A"
},
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
},
{
"language_code": "es_es",
"string" : "N/A"
}]
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "url",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
}]
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "url",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
}
]
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
},
{
"language_code": "es_es",
"string" : "N/A"
}]
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "DateTimeCreated",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Sent when"
}
]
},
{
"column": "DateTimeChanged",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Changed"
},
{
"column": "DateTimeCreated",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Sent when"
}]
"language_code": "es_es",
"string": "Cambiado"
}
]
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-2",
"show": true,
"type": "eval",
"default_value": "",
"options": [
{
"type": "eval",
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
}
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Notification GUID"
}
]
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-8",
"show": true,
"type": "textarea_readonly",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Result"
}
]
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
},
{
"column": "DateTimeChanged",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Changed"
},
{
"language_code": "es_es",
"string" : "Cambiado"
}]
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-2",
"show": true,
"type": "eval",
"default_value":"",
"options": [
{
"type": "eval",
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
}
],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Notification GUID"
}]
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": false,
"type": "textbox_save",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Comments"
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-8",
"show": true,
"type": "textarea_readonly",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Result"
}]
"language_code": "es_es",
"string": "Comentarios"
}
]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": false,
"type": "replace",
"default_value": "",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
},
{
"language_code": "es_es",
"string" : "N/A"
}]
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
},
{
"language_code": "es_es",
"string" : "N/A"
}]
},
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": false,
"type": "textbox_save",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Comments"
},
{
"language_code": "es_es",
"string" : "Comentarios"
}]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": false,
"type": "replace",
"default_value":"",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Status"
},
{
"language_code": "es_es",
"string" : "Estado"
}]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Extra"
},
{
"language_code": "es_es",
"string" : "Extra"
}]
}
],
"settings":[
{
"function": "RUN",
"events": ["test"],
"type": "text.select",
"default_value":"disabled",
"options": ["disabled", "on_notification" ],
"localized": ["name", "description"],
"name" :[{
"language_code": "en_us",
"string" : "When to run"
},
{
"language_code": "es_es",
"string" : "Cuando ejecuta"
}],
"description": [
{
"language_code": "en_us",
"string" : "Enable sending notifications via a self-hosted <a target=\"_blank\" href=\"https://hub.docker.com/r/caronc/apprise\">Apprise</a> instance. Please specify the URL on which you are running your instance in the <code>APPRISE_HOST</code> setting."
},
{
"language_code": "es_es",
"string" : "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://hub.docker.com/r/caronc/apprise\">Apprise</a>."
}
]
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"function": "CMD",
"type": "readonly",
"default_value":"python3 /app/front/plugins/_publisher_apprise/apprise.py",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Command"
},
{
"language_code": "es_es",
"string" : "Comando"
}],
"description": [{
"language_code": "en_us",
"string" : "Command to run"
},
{
"language_code": "es_es",
"string" : "Comando a ejecutar"
}]
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Status"
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value": 10,
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Run timeout"
},
{
"language_code": "es_es",
"string" : "Tiempo de espera de ejecución"
},
{
"language_code": "de_de",
"string" : "Wartezeit"
}],
"description": [{
"language_code": "en_us",
"string" : "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
},
{
"language_code": "es_es",
"string" : "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela."
}]
"language_code": "es_es",
"string": "Estado"
}
]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Extra"
},
{
"function": "HOST",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Apprise host URL"
},
{
"language_code": "es_es",
"string" : "URL del host de Apprise"
}],
"description": [{
"language_code": "en_us",
"string" : "Apprise host URL starting with <code>http://</code> or <code>https://</code>. (do not forget to include <code>/notify</code> at the end)"
},
{
"language_code": "es_es",
"string" : "URL del host de Apprise que comienza con <code>http://</code> o <code>https://</code>. (no olvide incluir <code>/notify</code> al final)"
}]
"language_code": "es_es",
"string": "Extra"
}
]
}
],
"settings": [
{
"function": "RUN",
"events": ["test"],
"type": "text.select",
"default_value": "disabled",
"options": ["disabled", "on_notification"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "When to run"
},
{
"function": "URL",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Apprise notification URL"
},
{
"language_code": "es_es",
"string" : "URL de notificación de Apprise"
}],
"description": [{
"language_code": "en_us",
"string" : "Apprise notification target URL. For example for Telegram it would be <code>tgram://{bot_token}/{chat_id}</code>."
},
{
"language_code": "es_es",
"string" : "Informar de la URL de destino de la notificación. Por ejemplo, para Telegram sería <code>tgram://{bot_token}/{chat_id}</code>."
}]
"language_code": "es_es",
"string": "Cuando ejecuta"
}
],
"description": [
{
"language_code": "en_us",
"string": "Enable sending notifications via a self-hosted <a target=\"_blank\" href=\"https://hub.docker.com/r/caronc/apprise\">Apprise</a> instance. Please specify the URL on which you are running your instance in the <code>APPRISE_HOST</code> setting."
},
{
"function": "PAYLOAD",
"type": "text.select",
"default_value": "html",
"options": ["html", "text"],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Payload type"
},
{
"language_code": "es_es",
"string" : "Tipo de carga"
}],
"description": [{
"language_code": "en_us",
"string" : "Select the payoad type sent to Apprise. For example <code>html</code> works well with emails, <code>text</code> with chat apps, such as Telegram."
},
{
"language_code": "es_es",
"string" : "Seleccione el tipo de carga útil enviada a Apprise. Por ejemplo, <code>html</code> funciona bien con correos electrónicos, <code>text</code> con aplicaciones de chat, como Telegram."
}]
"language_code": "es_es",
"string": "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://hub.docker.com/r/caronc/apprise\">Apprise</a>."
}
]
},
{
"function": "CMD",
"type": "readonly",
"default_value": "python3 /app/front/plugins/_publisher_apprise/apprise.py",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Command"
},
{
"function": "SIZE",
"type": "integer",
"default_value": 1024,
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Max payload size"
},
{
"language_code": "es_es",
"string" : "Tamaño máximo de carga útil"
}],
"description": [{
"language_code": "en_us",
"string" : "The maximum size of the apprise payload as number of characters in the passed string. If above limit, it will be truncated and a <code>(text was truncated)</code> message is appended."
},
{
"language_code": "es_es",
"string" : "El tamaño máximo de la carga útil de información como número de caracteres en la cadena pasada. Si supera el límite, se truncará y se agregará un mensaje <code>(text was truncated)</code>."
}]
}
]
"language_code": "es_es",
"string": "Comando"
}
],
"description": [
{
"language_code": "en_us",
"string": "Command to run"
},
{
"language_code": "es_es",
"string": "Comando a ejecutar"
}
]
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value": 10,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Run timeout"
},
{
"language_code": "es_es",
"string": "Tiempo de espera de ejecución"
},
{
"language_code": "de_de",
"string": "Wartezeit"
}
],
"description": [
{
"language_code": "en_us",
"string": "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
},
{
"language_code": "es_es",
"string": "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela."
}
]
},
{
"function": "HOST",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Apprise host URL"
},
{
"language_code": "es_es",
"string": "URL del host de Apprise"
}
],
"description": [
{
"language_code": "en_us",
"string": "Apprise host URL starting with <code>http://</code> or <code>https://</code>. (do not forget to include <code>/notify</code> at the end)"
},
{
"language_code": "es_es",
"string": "URL del host de Apprise que comienza con <code>http://</code> o <code>https://</code>. (no olvide incluir <code>/notify</code> al final)"
}
]
},
{
"function": "URL",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Apprise notification URL"
},
{
"language_code": "es_es",
"string": "URL de notificación de Apprise"
}
],
"description": [
{
"language_code": "en_us",
"string": "Apprise notification target URL. For example for Telegram it would be <code>tgram://{bot_token}/{chat_id}</code>."
},
{
"language_code": "es_es",
"string": "Informar de la URL de destino de la notificación. Por ejemplo, para Telegram sería <code>tgram://{bot_token}/{chat_id}</code>."
}
]
},
{
"function": "PAYLOAD",
"type": "text.select",
"default_value": "html",
"options": ["html", "text"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Payload type"
},
{
"language_code": "es_es",
"string": "Tipo de carga"
}
],
"description": [
{
"language_code": "en_us",
"string": "Select the payoad type sent to Apprise. For example <code>html</code> works well with emails, <code>text</code> with chat apps, such as Telegram."
},
{
"language_code": "es_es",
"string": "Seleccione el tipo de carga útil enviada a Apprise. Por ejemplo, <code>html</code> funciona bien con correos electrónicos, <code>text</code> con aplicaciones de chat, como Telegram."
}
]
},
{
"function": "SIZE",
"type": "integer",
"default_value": 1024,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Max payload size"
},
{
"language_code": "es_es",
"string": "Tamaño máximo de carga útil"
}
],
"description": [
{
"language_code": "en_us",
"string": "The maximum size of the apprise payload as number of characters in the passed string. If above limit, it will be truncated and a <code>(text was truncated)</code> message is appended."
},
{
"language_code": "es_es",
"string": "El tamaño máximo de la carga útil de información como número de caracteres en la cadena pasada. Si supera el límite, se truncará y se agregará un mensaje <code>(text was truncated)</code>."
}
]
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,200 @@
## Overview
# Overview
- Feed your data and device changes into [Home Assistant](https://github.com/jokob-sk/NetAlertX/blob/main/docs/HOME_ASSISTANT.md) via the MQTT Mosquito broker.
- Feed your data and device changes into [Home Assistant](https://github.com/jokob-sk/NetAlertX/blob/main/docs/HOME_ASSISTANT.md) via the MQTT Mosquito broker (other brokers might work as well).
### Usage
# Usage
- Go to settings and fill in relevant details.
- Go to settings and fill in relevant details. There are 2 types of "devices" generated and sent to the broker. A generic overview device that contains online/down/archived device stats and then the actual devices detected by the application.
# Sample Payloads
## Overview device
The below payloads apply to the device showing overall online/down/archived stats. You can toggle them on/off with the `SEND_STATS` setting.
### MQTT discovery data:
>[!NOTE]
> You can replace the `netalertx` string of the below topic via the `DEVICE_ID` setting.
Topic: `homeassistant/sensor/netalertx/online/config`
>[!NOTE]
> You can replace the `"name": "NetAlertX"` string of the below payload via the `DEVICE_NAME` setting.
Payload:
```json
{
"name": "online",
"state_topic": "system-sensors/sensor/netalertx/state",
"value_template": "{{value_json.online}}",
"unique_id": "netalertx_sensor_online",
"device": {
"identifiers": [
"netalertx_sensor"
],
"manufacturer": "NetAlertX",
"name": "NetAlertX"
},
"icon": "mdi:wifi-check",
"platform": "mqtt"
}
```
### MQTT config data sample:
>[!NOTE]
> You can replace the `netalertx` string of the below topic via the `DEVICE_ID` setting.
Topic: `homeassistant/sensor/netalertx/all/config`
Payload:
```json
{
"name": "all",
"state_topic": "system-sensors/sensor/netalertx/state",
"value_template": "{{value_json.all}}",
"unique_id": "netalertx_sensor_all",
"device": {
"identifiers": [
"netalertx_sensor"
],
"manufacturer": "NetAlertX",
"name": "NetAlertX"
},
"icon": "mdi:wifi",
"platform": "mqtt"
}
```
### MQTT state data:
>[!NOTE]
> You can replace the `netalertx` string of the below topic via the `DEVICE_ID` setting.
Topic: `system-sensors/sensor/netalertx/state`
Payload:
```json
{
"online": 30,
"down": 36,
"all": 66,
"archived": 0,
"new": 0,
"unknown": 0
}
```
## Individual devices
The below payloads apply to individual devices. Every device discovered by the application will generate the below messages. You can toggle them on/off with the `SEND_DEVICES` setting.
### MQTT discovery data:
Topic: `homeassistant/sensor/mac_44_ef_44_ef_44_ef/last_ip/config`
Payload:
```json
{
"name": "last_ip",
"state_topic": "system-sensors/sensor/mac_44_ef_44_ef_44_ef/state",
"value_template": "{{value_json.last_ip}}",
"unique_id": "mac_44_ef_44_ef_44_ef_sensor_last_ip",
"device": {
"identifiers": [
"mac_44_ef_44_ef_44_ef_sensor"
],
"manufacturer": "NetAlertX",
"name": "Camera - E1"
},
"icon": "mdi:ip-network",
"platform": "mqtt"
}
```
### MQTT state data:
Topic: `system-sensors/sensor/mac_44_ef_44_ef_44_ef/state`
Payload:
```json
{
"last_ip": "192.168.1.33",
"is_new": "0",
"vendor": "None",
"mac_address": "44:ef:44:ef:44:ef"
}
```
### Transmitted message examples:
Topic: `homeassistant/binary_sensor/mac_44_ef_44_ef_44_ef/is_present/`
Payload:
```json
{
"name": "is_present",
"state_topic": "system-sensors/binary_sensor/mac_44_ef_44_ef_44_ef/state",
"value_template": "{{value_json.is_present}}",
"unique_id": "mac_44_ef_44_ef_44_ef_sensor_is_present",
"device": {
"identifiers": [
"mac_44_ef_44_ef_44_ef_sensor"
],
"manufacturer": "NetAlertX",
"name": "Camera - E1"
},
"icon": "mdi:wifi",
"platform": "mqtt"
}
```
Topic: `system-sensors/binary_sensor/mac_44_ef_44_ef_44_ef/state`
Payload:
```json
{
"is_present": "OFF"
}
```
```json
{
"is_present": "ON"
}
```
>[!WARNING]
> Please check your Home Assistant MQTT broker debug info for the most up-to-date data nad format as the above might be outdated.
## Implementation Notes
The first run will take a while, subsequent should be much faster because new sensors don't have to be created anymore. If the first sync times out, try to increase the timeout setting (default: 10s per device). A bit of background:
1. The app keeps a hash of the sensors. The hash includes:
- deviceId: Unique identifier for the device associated with the sensor.
- deviceName: Name of the device.
- sensorType: Type of sensor.
- sensorName: Name of the sensor.
- icon: Icon associated with the sensor.
2. This hash is compared to existing MQTT plugin object hashes, which can be found under Integrations > Plugins > MQTT (Plugin objects tab) > Hash
3. If the hash is not found, a new device/device state is assumed and the device is sent to the broker
The state is managed differently, the state of the sensor is not included in the hash. This might be improved upon in later releases.

File diff suppressed because it is too large Load Diff

View File

@@ -106,10 +106,12 @@ class sensor_config:
if plugObj == {}:
self.isNew = True
mylog('verbose', [f"[{pluginName}] New sensor entry name : {deviceName}"])
mylog('verbose', [f"[{pluginName}] New sensor entry mac : {mac}"])
mylog('verbose', [f"[{pluginName}] New sensor entry input_string : {input_string}"])
mylog('verbose', [f"[{pluginName}] New sensor entry hash_value : {hash_value}"])
else:
device_name = plugObj.get("Watched_Value1", "Unknown")
mylog('verbose', [f"[{pluginName}] Existing, skip Device Name : {device_name}"])
self.isNew = False
@@ -171,11 +173,8 @@ def publish_mqtt(mqtt_client, topic, message):
return True
#-------------------------------------------------------------------------------
def create_generic_device(mqtt_client):
deviceName = 'NetAlertX'
deviceId = 'netalertx'
def create_generic_device(mqtt_client, deviceId, deviceName):
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'online', 'wifi-check')
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'down', 'wifi-cancel')
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'all', 'wifi')
@@ -277,19 +276,24 @@ def mqtt_start(db):
if mqtt_connected_to_broker == False:
mqtt_connected_to_broker = True
mqtt_client = mqtt_create_client()
deviceName = get_setting_value('MQTT_DEVICE_NAME')
deviceId = get_setting_value('MQTT_DEVICE_ID')
presenceSenType = get_setting_value('MQTT_PRESENCE_SENSOR_TYPE')
# General stats
# Create a generic device for overal stats
if get_setting_value('MQTT_SEND_STATS') == True:
# Create a new device representing overall stats
create_generic_device(mqtt_client)
create_generic_device(mqtt_client, deviceId, deviceName)
# Get the data
row = get_device_stats(db)
# Publish (wrap into {} and remove last ',' from above)
publish_mqtt(mqtt_client, "system-sensors/sensor/netalertx/state",
publish_mqtt(mqtt_client, f"system-sensors/sensor/{deviceId}/state",
{
"online": row[0],
"down": row[1],
@@ -321,10 +325,12 @@ def mqtt_start(db):
deviceNameDisplay = re.sub('[^a-zA-Z0-9-_\s]', '', device["dev_Name"])
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'last_ip', 'ip-network', device["dev_MAC"])
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'binary_sensor', 'is_present', 'wifi', device["dev_MAC"])
create_sensor(mqtt_client, deviceId, deviceNameDisplay, presenceSenType, 'is_present', 'wifi', device["dev_MAC"])
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'mac_address', 'folder-key-network', device["dev_MAC"])
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'is_new', 'bell-alert-outline', device["dev_MAC"])
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'vendor', 'cog', device["dev_MAC"])
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'first_connection', 'calendar-start', device["dev_MAC"])
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'last_connection', 'calendar-end', device["dev_MAC"])
# update device sensors in home assistant
@@ -333,11 +339,13 @@ def mqtt_start(db):
"last_ip": device["dev_LastIP"],
"is_new": str(device["dev_NewDevice"]),
"vendor": sanitize_string(device["dev_Vendor"]),
"mac_address": str(device["dev_MAC"])
"mac_address": str(device["dev_MAC"]),
"last_connection": str(device["dev_LastConnection"]),
"first_connection": str(device["dev_FirstConnection"])
}
)
publish_mqtt(mqtt_client, 'system-sensors/binary_sensor/'+deviceId+'/state',
publish_mqtt(mqtt_client, f'system-sensors/{presenceSenType}/{deviceId}/state',
{
"is_present": to_binary_sensor(str(device["dev_PresentLastScan"]))
}

View File

@@ -1,405 +1,456 @@
{
"code_name": "_publisher_ntfy",
"unique_prefix": "NTFY",
"plugin_type": "publisher",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": ["display_name", "description", "icon"],
"display_name" : [
"code_name": "_publisher_ntfy",
"unique_prefix": "NTFY",
"plugin_type": "publisher",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
"string": "NTFY publisher"
},
{
"language_code": "es_es",
"string": "Habilitar NTFY"
}
],
"icon": [
{
"language_code": "en_us",
"string": "<i class=\"fa-solid fa-terminal\"></i>"
}
],
"description": [
{
"language_code": "en_us",
"string": "A plugin to publish a notification via the NTFY gateway."
}
],
"params": [],
"database_column_definitions": [
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string" : "NTFY publisher"
},
{
"language_code": "es_es",
"string" : "Habilitar NTFY"
}
],
"icon":[{
"language_code": "en_us",
"string" : "<i class=\"fa-solid fa-terminal\"></i>"
}],
"description": [
{
"language_code": "en_us",
"string" : "A plugin to publish a notification via the NTFY gateway."
}
],
"params" : [
],
"database_column_definitions":
[
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
},
{
"language_code": "es_es",
"string" : "N/A"
}]
"language_code": "en_us",
"string": "N/A"
},
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
},
{
"language_code": "es_es",
"string" : "N/A"
}]
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
}]
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
}
]
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Sent when"
}
]
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-3",
"show": true,
"type": "eval",
"default_value": "",
"options": [
{
"type": "eval",
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
}
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Notification GUID"
}
]
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-2",
"show": true,
"type": "textarea_readonly",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Response"
}
]
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Response code"
}
]
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": false,
"type": "device_mac",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Device"
}
]
},
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": false,
"type": "textbox_save",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Comments"
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Sent when"
}]
"language_code": "es_es",
"string": "Comentarios"
}
]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": false,
"type": "replace",
"default_value": "",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-3",
"show": true,
"type": "eval",
"default_value":"",
"options": [
{
"type": "eval",
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
}
],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Notification GUID"
}]
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-2",
"show": true,
"type": "textarea_readonly",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Response"
}]
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Response code"
}]
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Status"
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": false,
"type": "device_mac",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Device"
}
]
},
"language_code": "es_es",
"string": "Estado"
}
]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": false,
"type": "textbox_save",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Comments"
},
{
"language_code": "es_es",
"string" : "Comentarios"
}]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": false,
"type": "replace",
"default_value":"",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Status"
},
{
"language_code": "es_es",
"string" : "Estado"
}]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Extra"
},
{
"language_code": "es_es",
"string" : "Extra"
}]
}
],
"settings":[
{
"function": "RUN",
"events": ["test"],
"type": "text.select",
"default_value":"disabled",
"options": ["disabled", "on_notification" ],
"localized": ["name", "description"],
"name" :[{
"language_code": "en_us",
"string" : "When to run"
},
{
"language_code": "es_es",
"string" : "Cuando ejecuta"
}],
"description": [
{
"language_code": "en_us",
"string" : "Enable sending notifications via <a target=\"_blank\" href=\"https://ntfy.sh/\">NTFY</a>."
},
{
"language_code": "es_es",
"string" : "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://ntfy.sh/\">NTFY</a>."
}
]
"language_code": "en_us",
"string": "Extra"
},
{
"function": "CMD",
"type": "readonly",
"default_value":"python3 /app/front/plugins/_publisher_ntfy/ntfy.py",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Command"
},
{
"language_code": "es_es",
"string" : "Comando"
}],
"description": [{
"language_code": "en_us",
"string" : "Command to run"
},
{
"language_code": "es_es",
"string" : "Comando a ejecutar"
}]
"language_code": "es_es",
"string": "Extra"
}
]
}
],
"settings": [
{
"function": "RUN",
"events": ["test"],
"type": "text.select",
"default_value": "disabled",
"options": ["disabled", "on_notification"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "When to run"
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value": 10,
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Run timeout"
},
{
"language_code": "es_es",
"string" : "Tiempo de espera de ejecución"
},
{
"language_code": "de_de",
"string" : "Wartezeit"
}],
"description": [{
"language_code": "en_us",
"string" : "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
},
{
"language_code": "es_es",
"string" : "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela."
}]
},
"language_code": "es_es",
"string": "Cuando ejecuta"
}
],
"description": [
{
"function": "HOST",
"type": "text",
"default_value": "https://ntfy.sh",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "NTFY host URL"
},
{
"language_code": "es_es",
"string" : "URL del host NTFY"
}],
"description": [{
"language_code": "en_us",
"string" : "NTFY host URL starting with <code>http://</code> or <code>https://</code>. You can use the hosted instance on <a target=\"_blank\" href=\"https://ntfy.sh/\">https://ntfy.sh</a> by simply entering <code>https://ntfy.sh</code>."
},
{
"language_code": "es_es",
"string" : "URL de host NTFY que comienza con <code>http://</code> o <code>https://</code>. Puede usar la instancia alojada en <a target=\"_blank\" href=\"https://ntfy.sh/\">https://ntfy.sh</a> simplemente ingresando <code>https://ntfy. sh</código>."
}]
"language_code": "en_us",
"string": "Enable sending notifications via <a target=\"_blank\" href=\"https://ntfy.sh/\">NTFY</a>."
},
{
"function": "TOPIC",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "NTFY topic"
},
{
"language_code": "es_es",
"string" : "Tema de NTFY"
}],
"description": [{
"language_code": "en_us",
"string" : "Your secret topic."
},
{
"language_code": "es_es",
"string" : "Tu tema secreto."
}]
"language_code": "es_es",
"string": "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://ntfy.sh/\">NTFY</a>."
}
]
},
{
"function": "CMD",
"type": "readonly",
"default_value": "python3 /app/front/plugins/_publisher_ntfy/ntfy.py",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Command"
},
{
"function": "USER",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "NTFY user"
},
{
"language_code": "es_es",
"string" : "Usuario de NTFY"
}],
"description": [{
"language_code": "en_us",
"string" : "Enter user if you need (host) an instance with enabled authetication."
},
{
"language_code": "es_es",
"string" : "Ingrese usuario si necesita (alojar) una instancia con autenticación habilitada."
}]
"language_code": "es_es",
"string": "Comando"
}
],
"description": [
{
"language_code": "en_us",
"string": "Command to run"
},
{
"function": "PASSWORD",
"type": "password",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "NTFY password"
},
{
"language_code": "es_es",
"string" : "Contraseña de NTFY"
}],
"description": [{
"language_code": "en_us",
"string" : "Enter password if you need (host) an instance with enabled authetication."
},
{
"language_code": "es_es",
"string" : "Ingrese la contraseña si necesita (host) una instancia con autenticación habilitada."
}]
"language_code": "es_es",
"string": "Comando a ejecutar"
}
]
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value": 10,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Run timeout"
},
{
"function": "PRIORITY",
"type": "text.select",
"default_value":"urgent",
"options": ["urgent", "high", "default" , "low" , "min" ],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Message priority"
}],
"description": [{
"language_code": "en_us",
"string" : "All NTFY messages have a priority, which defines how urgently your phone notifies you. On Android, you can set custom notification sounds and vibration patterns on your phone to map to these priorities (see <a href=\"https://docs.ntfy.sh/subscribe/phone/\">Android config</a>)."
}]
}
]
"language_code": "es_es",
"string": "Tiempo de espera de ejecución"
},
{
"language_code": "de_de",
"string": "Wartezeit"
}
],
"description": [
{
"language_code": "en_us",
"string": "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
},
{
"language_code": "es_es",
"string": "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela."
}
]
},
{
"function": "HOST",
"type": "text",
"default_value": "https://ntfy.sh",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "NTFY host URL"
},
{
"language_code": "es_es",
"string": "URL del host NTFY"
}
],
"description": [
{
"language_code": "en_us",
"string": "NTFY host URL starting with <code>http://</code> or <code>https://</code>. You can use the hosted instance on <a target=\"_blank\" href=\"https://ntfy.sh/\">https://ntfy.sh</a> by simply entering <code>https://ntfy.sh</code>."
},
{
"language_code": "es_es",
"string": "URL de host NTFY que comienza con <code>http://</code> o <code>https://</code>. Puede usar la instancia alojada en <a target=\"_blank\" href=\"https://ntfy.sh/\">https://ntfy.sh</a> simplemente ingresando <code>https://ntfy. sh</código>."
}
]
},
{
"function": "TOPIC",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "NTFY topic"
},
{
"language_code": "es_es",
"string": "Tema de NTFY"
}
],
"description": [
{
"language_code": "en_us",
"string": "Your secret topic."
},
{
"language_code": "es_es",
"string": "Tu tema secreto."
}
]
},
{
"function": "USER",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "NTFY user"
},
{
"language_code": "es_es",
"string": "Usuario de NTFY"
}
],
"description": [
{
"language_code": "en_us",
"string": "Enter user if you need (host) an instance with enabled authetication."
},
{
"language_code": "es_es",
"string": "Ingrese usuario si necesita (alojar) una instancia con autenticación habilitada."
}
]
},
{
"function": "PASSWORD",
"type": "password",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "NTFY password"
},
{
"language_code": "es_es",
"string": "Contraseña de NTFY"
}
],
"description": [
{
"language_code": "en_us",
"string": "Enter password if you need (host) an instance with enabled authetication."
},
{
"language_code": "es_es",
"string": "Ingrese la contraseña si necesita (host) una instancia con autenticación habilitada."
}
]
},
{
"function": "PRIORITY",
"type": "text.select",
"default_value": "urgent",
"options": ["urgent", "high", "default", "low", "min"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Message priority"
}
],
"description": [
{
"language_code": "en_us",
"string": "All NTFY messages have a priority, which defines how urgently your phone notifies you. On Android, you can set custom notification sounds and vibration patterns on your phone to map to these priorities (see <a href=\"https://docs.ntfy.sh/subscribe/phone/\">Android config</a>)."
}
]
}
]
}

View File

@@ -1,431 +1,382 @@
{
"code_name": "_publisher_pushover",
"unique_prefix": "PUSHOVER",
"plugin_type": "publisher",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": [
"display_name",
"description",
"icon"
],
"display_name": [
"code_name": "_publisher_pushover",
"unique_prefix": "PUSHOVER",
"plugin_type": "publisher",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
"string": "Pushover publisher"
},
{
"language_code": "es_es",
"string": "Habilitar Pushover"
}
],
"icon": [
{
"language_code": "en_us",
"string": "<i class=\"fa-solid fa-bell\"></i>"
}
],
"description": [
{
"language_code": "en_us",
"string": "A plugin to publish a notification via the pushover.net"
}
],
"params": [],
"database_column_definitions": [
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Pushover publisher"
"language_code": "en_us",
"string": "N/A"
},
{
"language_code": "es_es",
"string": "Habilitar Pushover"
"language_code": "es_es",
"string": "N/A"
}
],
"icon": [
]
},
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "<i class=\"fa-solid fa-bell\"></i>"
"language_code": "en_us",
"string": "N/A"
},
{
"language_code": "es_es",
"string": "N/A"
}
],
"description": [
]
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "A plugin to publish a notification via the pushover.net"
"language_code": "en_us",
"string": "N/A"
}
],
"params": [],
"database_column_definitions": [
]
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"name": [
{
"language_code": "en_us",
"string": "N/A"
},
{
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"name": [
{
"language_code": "en_us",
"string": "N/A"
},
{
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"name": [
{
"language_code": "en_us",
"string": "N/A"
}
]
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"name": [
{
"language_code": "en_us",
"string": "Sent when"
}
]
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-3",
"show": true,
"type": "eval",
"default_value": "",
"options": [
{
"type": "eval",
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
}
],
"localized": [
"name"
],
"name": [
{
"language_code": "en_us",
"string": "Notification GUID"
}
]
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-2",
"show": true,
"type": "textarea_readonly",
"default_value": "",
"options": [],
"localized": [
"name"
],
"name": [
{
"language_code": "en_us",
"string": "Response"
}
]
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"name": [
{
"language_code": "en_us",
"string": "Response code"
}
]
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": false,
"type": "device_mac",
"default_value": "",
"options": [],
"localized": [
"name"
],
"name": [
{
"language_code": "en_us",
"string": "Device"
}
]
},
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": false,
"type": "textbox_save",
"default_value": "",
"options": [],
"localized": [
"name"
],
"name": [
{
"language_code": "en_us",
"string": "Comments"
},
{
"language_code": "es_es",
"string": "Comentarios"
}
]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": false,
"type": "replace",
"default_value": "",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": [
"name"
],
"name": [
{
"language_code": "en_us",
"string": "Status"
},
{
"language_code": "es_es",
"string": "Estado"
}
]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"name": [
{
"language_code": "en_us",
"string": "Extra"
},
{
"language_code": "es_es",
"string": "Extra"
}
]
"language_code": "en_us",
"string": "Sent when"
}
],
"settings": [
]
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-3",
"show": true,
"type": "eval",
"default_value": "",
"options": [
{
"function": "RUN",
"events": [
"test"
],
"type": "text.select",
"default_value": "disabled",
"options": [
"disabled",
"on_notification"
],
"localized": [
"name",
"description"
],
"name": [
{
"language_code": "en_us",
"string": "When to run"
},
{
"language_code": "es_es",
"string": "Cuando ejecuta"
}
],
"description": [
{
"language_code": "en_us",
"string": "Enable sending notifications via <a target=\"_blank\" href=\"https://www.pushover.net/\">Pushover</a>."
},
{
"language_code": "es_es",
"string": "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://www.pushover.net/\">Pushover</a>."
}
]
},
{
"function": "CMD",
"type": "readonly",
"default_value": "python3 /app/front/plugins/_publisher_pushover/pushover.py",
"options": [],
"localized": [
"name",
"description"
],
"name": [
{
"language_code": "en_us",
"string": "Command"
},
{
"language_code": "es_es",
"string": "Comando"
}
],
"description": [
{
"language_code": "en_us",
"string": "Command to run"
},
{
"language_code": "es_es",
"string": "Comando a ejecutar"
}
]
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value": 10,
"options": [],
"localized": [
"name",
"description"
],
"name": [
{
"language_code": "en_us",
"string": "Run timeout"
},
{
"language_code": "es_es",
"string": "Tiempo de espera de ejecución"
},
{
"language_code": "de_de",
"string": "Wartezeit"
}
],
"description": [
{
"language_code": "en_us",
"string": "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
}
]
},
{
"function": "USER_KEY",
"type": "text",
"default_value": "USER_KEY",
"options": [],
"localized": [
"name",
"description"
],
"name": [
{
"language_code": "en_us",
"string": "Pushover USER key"
}
],
"description": [
{
"language_code": "en_us",
"string": "Your secret Pushsafer USER key."
}
]
},
{
"function": "APP_TOKEN",
"type": "text",
"default_value": "APP_TOKEN",
"options": [],
"localized": [
"name",
"description"
],
"name": [
{
"language_code": "en_us",
"string": "Pushover APP Token"
}
],
"description": [
{
"language_code": "en_us",
"string": "Your Pushover APP Token."
}
]
},
{
"function": "DEVICE_NAME",
"type": "text",
"default_value": "DEVICE_NAME",
"options": [],
"localized": [
"name",
"description"
],
"name": [
{
"language_code": "en_us",
"string": "Pushover Device name"
}
],
"description": [
{
"language_code": "en_us",
"string": "(Optional) When specifying a device name, notifications will be exclusively sent to the device."
}
]
"type": "eval",
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
}
]
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Notification GUID"
}
]
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-2",
"show": true,
"type": "textarea_readonly",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Response"
}
]
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Response code"
}
]
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": false,
"type": "device_mac",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Device"
}
]
},
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": false,
"type": "textbox_save",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Comments"
},
{
"language_code": "es_es",
"string": "Comentarios"
}
]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": false,
"type": "replace",
"default_value": "",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Status"
},
{
"language_code": "es_es",
"string": "Estado"
}
]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Extra"
},
{
"language_code": "es_es",
"string": "Extra"
}
]
}
],
"settings": [
{
"function": "RUN",
"events": ["test"],
"type": "text.select",
"default_value": "disabled",
"options": ["disabled", "on_notification"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "When to run"
},
{
"language_code": "es_es",
"string": "Cuando ejecuta"
}
],
"description": [
{
"language_code": "en_us",
"string": "Enable sending notifications via <a target=\"_blank\" href=\"https://www.pushover.net/\">Pushover</a>."
},
{
"language_code": "es_es",
"string": "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://www.pushover.net/\">Pushover</a>."
}
]
},
{
"function": "CMD",
"type": "readonly",
"default_value": "python3 /app/front/plugins/_publisher_pushover/pushover.py",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Command"
},
{
"language_code": "es_es",
"string": "Comando"
}
],
"description": [
{
"language_code": "en_us",
"string": "Command to run"
},
{
"language_code": "es_es",
"string": "Comando a ejecutar"
}
]
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value": 10,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Run timeout"
},
{
"language_code": "es_es",
"string": "Tiempo de espera de ejecución"
},
{
"language_code": "de_de",
"string": "Wartezeit"
}
],
"description": [
{
"language_code": "en_us",
"string": "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
}
]
},
{
"function": "USER_KEY",
"type": "text",
"default_value": "USER_KEY",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Pushover USER key"
}
],
"description": [
{
"language_code": "en_us",
"string": "Your secret Pushsafer USER key."
}
]
},
{
"function": "APP_TOKEN",
"type": "text",
"default_value": "APP_TOKEN",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Pushover APP Token"
}
],
"description": [
{
"language_code": "en_us",
"string": "Your Pushover APP Token."
}
]
},
{
"function": "DEVICE_NAME",
"type": "text",
"default_value": "DEVICE_NAME",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Pushover Device name"
}
],
"description": [
{
"language_code": "en_us",
"string": "(Optional) When specifying a device name, notifications will be exclusively sent to the device."
}
]
}
]
}

View File

@@ -1,321 +1,356 @@
{
"code_name": "_publisher_pushsafer",
"unique_prefix": "PUSHSAFER",
"plugin_type": "publisher",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": ["display_name", "description", "icon"],
"display_name" : [
"code_name": "_publisher_pushsafer",
"unique_prefix": "PUSHSAFER",
"plugin_type": "publisher",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
"string": "Pushsafer publisher"
},
{
"language_code": "es_es",
"string": "Habilitar Pushsafer"
}
],
"icon": [
{
"language_code": "en_us",
"string": "<i class=\"fa-solid fa-bell\"></i>"
}
],
"description": [
{
"language_code": "en_us",
"string": "A plugin to publish a notification via the Pushsafer gateway."
}
],
"params": [],
"database_column_definitions": [
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string" : "Pushsafer publisher"
},
{
"language_code": "es_es",
"string" : "Habilitar Pushsafer"
}
],
"icon":[{
"language_code": "en_us",
"string" : "<i class=\"fa-solid fa-bell\"></i>"
}],
"description": [
{
"language_code": "en_us",
"string" : "A plugin to publish a notification via the Pushsafer gateway."
}
],
"params" : [
],
"database_column_definitions":
[
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
},
{
"language_code": "es_es",
"string" : "N/A"
}]
"language_code": "en_us",
"string": "N/A"
},
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
},
{
"language_code": "es_es",
"string" : "N/A"
}]
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
}]
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
}
]
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Sent when"
}
]
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-3",
"show": true,
"type": "eval",
"default_value": "",
"options": [
{
"type": "eval",
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
}
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Notification GUID"
}
]
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-2",
"show": true,
"type": "textarea_readonly",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Response"
}
]
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Response code"
}
]
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": false,
"type": "device_mac",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Device"
}
]
},
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": false,
"type": "textbox_save",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Comments"
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Sent when"
}]
"language_code": "es_es",
"string": "Comentarios"
}
]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": false,
"type": "replace",
"default_value": "",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-3",
"show": true,
"type": "eval",
"default_value":"",
"options": [
{
"type": "eval",
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
}
],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Notification GUID"
}]
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-2",
"show": true,
"type": "textarea_readonly",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Response"
}]
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Response code"
}]
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Status"
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": false,
"type": "device_mac",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Device"
}
]
},
"language_code": "es_es",
"string": "Estado"
}
]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": false,
"type": "textbox_save",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Comments"
},
{
"language_code": "es_es",
"string" : "Comentarios"
}]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": false,
"type": "replace",
"default_value":"",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Status"
},
{
"language_code": "es_es",
"string" : "Estado"
}]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Extra"
},
{
"language_code": "es_es",
"string" : "Extra"
}]
}
],
"settings":[
{
"function": "RUN",
"events": ["test"],
"type": "text.select",
"default_value":"disabled",
"options": ["disabled", "on_notification" ],
"localized": ["name", "description"],
"name" :[{
"language_code": "en_us",
"string" : "When to run"
},
{
"language_code": "es_es",
"string" : "Cuando ejecuta"
}],
"description": [
{
"language_code": "en_us",
"string" : "Enable sending notifications via <a target=\"_blank\" href=\"https://www.pushsafer.com/\">Pushsafer</a>."
},
{
"language_code": "es_es",
"string" : "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://www.pushsafer.com/\">Pushsafer</a>."
}
]
"language_code": "en_us",
"string": "Extra"
},
{
"function": "CMD",
"type": "readonly",
"default_value":"python3 /app/front/plugins/_publisher_pushsafer/pushsafer.py",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Command"
},
{
"language_code": "es_es",
"string" : "Comando"
}],
"description": [{
"language_code": "en_us",
"string" : "Command to run"
},
{
"language_code": "es_es",
"string" : "Comando a ejecutar"
}]
"language_code": "es_es",
"string": "Extra"
}
]
}
],
"settings": [
{
"function": "RUN",
"events": ["test"],
"type": "text.select",
"default_value": "disabled",
"options": ["disabled", "on_notification"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "When to run"
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value": 10,
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Run timeout"
},
{
"language_code": "es_es",
"string" : "Tiempo de espera de ejecución"
},
{
"language_code": "de_de",
"string" : "Wartezeit"
}],
"description": [{
"language_code": "en_us",
"string" : "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
},
{
"language_code": "es_es",
"string" : "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela."
}]
},
{
"function": "TOKEN",
"type": "text",
"default_value": "ApiKey",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Pushsafer token"
},
{
"language_code": "es_es",
"string" : "Token de Pushsafer"
}],
"description": [{
"language_code": "en_us",
"string" : "Your secret Pushsafer API key (token)."
},
{
"language_code": "es_es",
"string" : "Su clave secreta de la API de Pushsafer (token)."
}]
}
]
"language_code": "es_es",
"string": "Cuando ejecuta"
}
],
"description": [
{
"language_code": "en_us",
"string": "Enable sending notifications via <a target=\"_blank\" href=\"https://www.pushsafer.com/\">Pushsafer</a>."
},
{
"language_code": "es_es",
"string": "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://www.pushsafer.com/\">Pushsafer</a>."
}
]
},
{
"function": "CMD",
"type": "readonly",
"default_value": "python3 /app/front/plugins/_publisher_pushsafer/pushsafer.py",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Command"
},
{
"language_code": "es_es",
"string": "Comando"
}
],
"description": [
{
"language_code": "en_us",
"string": "Command to run"
},
{
"language_code": "es_es",
"string": "Comando a ejecutar"
}
]
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value": 10,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Run timeout"
},
{
"language_code": "es_es",
"string": "Tiempo de espera de ejecución"
},
{
"language_code": "de_de",
"string": "Wartezeit"
}
],
"description": [
{
"language_code": "en_us",
"string": "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
},
{
"language_code": "es_es",
"string": "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela."
}
]
},
{
"function": "TOKEN",
"type": "text",
"default_value": "ApiKey",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Pushsafer token"
},
{
"language_code": "es_es",
"string": "Token de Pushsafer"
}
],
"description": [
{
"language_code": "en_us",
"string": "Your secret Pushsafer API key (token)."
},
{
"language_code": "es_es",
"string": "Su clave secreta de la API de Pushsafer (token)."
}
]
}
]
}

View File

@@ -1,409 +1,460 @@
{
"code_name": "_publisher_webhook",
"unique_prefix": "WEBHOOK",
"plugin_type": "publisher",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": ["display_name", "description", "icon"],
"display_name" : [
"code_name": "_publisher_webhook",
"unique_prefix": "WEBHOOK",
"plugin_type": "publisher",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
"string": "Webhook publisher"
},
{
"language_code": "es_es",
"string": "Habilitar Webhook"
}
],
"icon": [
{
"language_code": "en_us",
"string": "<i class=\"fa-solid fa-circle-nodes\"></i>"
}
],
"description": [
{
"language_code": "en_us",
"string": "A plugin to publish a notification via Webhooks."
}
],
"params": [],
"database_column_definitions": [
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string" : "Webhook publisher"
},
{
"language_code": "es_es",
"string" : "Habilitar Webhook"
}
],
"icon":[{
"language_code": "en_us",
"string" : "<i class=\"fa-solid fa-circle-nodes\"></i>"
}],
"description": [
{
"language_code": "en_us",
"string" : "A plugin to publish a notification via Webhooks."
}
],
"params" : [
],
"database_column_definitions":
[
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
},
{
"language_code": "es_es",
"string" : "N/A"
}]
"language_code": "en_us",
"string": "N/A"
},
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
},
{
"language_code": "es_es",
"string" : "N/A"
}]
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
}]
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
}
]
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Sent when"
}
]
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-3",
"show": true,
"type": "eval",
"default_value": "",
"options": [
{
"type": "eval",
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
}
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Notification GUID"
}
]
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-2",
"show": true,
"type": "textarea_readonly",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Response (stdout)"
}
]
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": true,
"type": "textarea_readonly",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Response (stderr)"
}
]
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": false,
"type": "device_mac",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Device"
}
]
},
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": false,
"type": "textbox_save",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Comments"
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Sent when"
}]
"language_code": "es_es",
"string": "Comentarios"
}
]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": false,
"type": "replace",
"default_value": "",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-3",
"show": true,
"type": "eval",
"default_value":"",
"options": [
{
"type": "eval",
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
}
],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Notification GUID"
}]
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-2",
"show": true,
"type": "textarea_readonly",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Response (stdout)"
}]
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": true,
"type": "textarea_readonly",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Response (stderr)"
}]
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Status"
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": false,
"type": "device_mac",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Device"
}
]
},
"language_code": "es_es",
"string": "Estado"
}
]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": false,
"type": "textbox_save",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Comments"
},
{
"language_code": "es_es",
"string" : "Comentarios"
}]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": false,
"type": "replace",
"default_value":"",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Status"
},
{
"language_code": "es_es",
"string" : "Estado"
}]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Extra"
},
{
"language_code": "es_es",
"string" : "Extra"
}]
}
],
"settings":[
{
"function": "RUN",
"events": ["test"],
"type": "text.select",
"default_value":"disabled",
"options": ["disabled", "on_notification" ],
"localized": ["name", "description"],
"name" :[{
"language_code": "en_us",
"string" : "When to run"
},
{
"language_code": "es_es",
"string" : "Cuando ejecuta"
}],
"description": [
{
"language_code": "en_us",
"string" : "Enable webhooks for notifications. Webhooks help you to connect to a lot of 3rd party tools, such as IFTTT, Zapier or <a href=\"https://n8n.io/\" target=\"_blank\">n8n</a> to name a few. Check out this simple <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_N8N.md\" target=\"_blank\">n8n guide here</a> to get started. If enabled, configure related settings below."
},
{
"language_code": "es_es",
"string" : "Habilite webhooks para notificaciones. Los webhooks lo ayudan a conectarse a muchas herramientas de terceros, como IFTTT, Zapier o <a href=\"https://n8n.io/\" target=\"_blank\">n8n</a>, por nombrar algunas. Consulte esta sencilla <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_N8N.md\" target=\"_blank\">guía de n8n aquí</a> para obtener comenzó. Si está habilitado, configure los ajustes relacionados a continuación."
}
]
"language_code": "en_us",
"string": "Extra"
},
{
"function": "CMD",
"type": "readonly",
"default_value":"python3 /app/front/plugins/_publisher_webhook/webhook.py",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Command"
},
{
"language_code": "es_es",
"string" : "Comando"
}],
"description": [{
"language_code": "en_us",
"string" : "Command to run"
},
{
"language_code": "es_es",
"string" : "Comando a ejecutar"
}]
"language_code": "es_es",
"string": "Extra"
}
]
}
],
"settings": [
{
"function": "RUN",
"events": ["test"],
"type": "text.select",
"default_value": "disabled",
"options": ["disabled", "on_notification"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "When to run"
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value": 10,
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Run timeout"
},
{
"language_code": "es_es",
"string" : "Tiempo de espera de ejecución"
},
{
"language_code": "de_de",
"string" : "Wartezeit"
}],
"description": [{
"language_code": "en_us",
"string" : "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
},
{
"language_code": "es_es",
"string" : "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela."
}]
},
{
"function": "URL",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Target URL"
},
{
"language_code": "es_es",
"string" : "URL de destino"
}],
"description": [{
"language_code": "en_us",
"string" : "Target URL starting with <code>http://</code> or <code>https://</code>."
},
{
"language_code": "es_es",
"string" : "URL de destino comienza con <code>http://</code> o <code>https://</code>."
}]
"language_code": "es_es",
"string": "Cuando ejecuta"
}
],
"description": [
{
"language_code": "en_us",
"string": "Enable webhooks for notifications. Webhooks help you to connect to a lot of 3rd party tools, such as IFTTT, Zapier or <a href=\"https://n8n.io/\" target=\"_blank\">n8n</a> to name a few. Check out this simple <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_N8N.md\" target=\"_blank\">n8n guide here</a> to get started. If enabled, configure related settings below."
},
{
"function": "PAYLOAD",
"type": "text.select",
"default_value": "json",
"options": ["json", "html", "text"],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Payload type"
},
{
"language_code": "es_es",
"string" : "Tipo de carga"
}],
"description": [{
"language_code": "en_us",
"string" : "The Webhook payload data format for the <code>body</code> > <code>attachments</code> > <code>text</code> attribute in the payload json. See an example of the payload <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">here</a>. (e.g.: for discord use <code>text</code>)"
},
{
"language_code": "es_es",
"string" : "El formato de datos de carga de Webhook para el atributo <code>body</code> > <code>attachments</code> > <code>text</code> en el json de carga. Vea un ejemplo de la carga <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">aquí</a>. (por ejemplo: para discord use <code>text</code>)"
}]
{
"language_code": "es_es",
"string": "Habilite webhooks para notificaciones. Los webhooks lo ayudan a conectarse a muchas herramientas de terceros, como IFTTT, Zapier o <a href=\"https://n8n.io/\" target=\"_blank\">n8n</a>, por nombrar algunas. Consulte esta sencilla <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_N8N.md\" target=\"_blank\">guía de n8n aquí</a> para obtener comenzó. Si está habilitado, configure los ajustes relacionados a continuación."
}
]
},
{
"function": "CMD",
"type": "readonly",
"default_value": "python3 /app/front/plugins/_publisher_webhook/webhook.py",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Command"
},
{
"function": "REQUEST_METHOD",
"type": "text.select",
"default_value": "GET",
"options": ["GET", "POST", "PUT"],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Request method"
},
{
"language_code": "es_es",
"string" : "Método de solicitud"
}],
"description": [{
"language_code": "en_us",
"string" : "The HTTP request method to be used for the webhook call."
},
{
"language_code": "es_es",
"string" : "El método de solicitud HTTP que se utilizará para la llamada de webhook."
}]
{
"language_code": "es_es",
"string": "Comando"
}
],
"description": [
{
"language_code": "en_us",
"string": "Command to run"
},
{
"function": "SIZE",
"type": "integer",
"default_value": 1024,
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "Max payload size"
},
{
"language_code": "es_es",
"string" : "Tamaño máximo de carga útil"
}],
"description": [{
"language_code": "en_us",
"string" : "The maximum size of the webhook payload as number of characters in the passed string. If above limit, it will be truncated and a <code>(text was truncated)</code> message is appended."
},
{
"language_code": "es_es",
"string" : "El tamaño máximo de la carga útil del webhook como número de caracteres en la cadena pasada. Si supera el límite, se truncará y se agregará un mensaje <code>(text was truncated)</code>."
}]
},
{
"function": "SECRET",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code": "en_us",
"string" : "HMAC Secret"
},
{
"language_code": "es_es",
"string" : ""
}],
"description": [{
"language_code": "en_us",
"string" : "When set, use this secret to generate the SHA256-HMAC hex digest value of the request body, which will be passed as the <code>X-Webhook-Signature</code> header to the request. You can find more information <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_SECRET.md\">here</a>."
}]
}
]
{
"language_code": "es_es",
"string": "Comando a ejecutar"
}
]
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value": 10,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Run timeout"
},
{
"language_code": "es_es",
"string": "Tiempo de espera de ejecución"
},
{
"language_code": "de_de",
"string": "Wartezeit"
}
],
"description": [
{
"language_code": "en_us",
"string": "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
},
{
"language_code": "es_es",
"string": "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela."
}
]
},
{
"function": "URL",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Target URL"
},
{
"language_code": "es_es",
"string": "URL de destino"
}
],
"description": [
{
"language_code": "en_us",
"string": "Target URL starting with <code>http://</code> or <code>https://</code>."
},
{
"language_code": "es_es",
"string": "URL de destino comienza con <code>http://</code> o <code>https://</code>."
}
]
},
{
"function": "PAYLOAD",
"type": "text.select",
"default_value": "json",
"options": ["json", "html", "text"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Payload type"
},
{
"language_code": "es_es",
"string": "Tipo de carga"
}
],
"description": [
{
"language_code": "en_us",
"string": "The Webhook payload data format for the <code>body</code> > <code>attachments</code> > <code>text</code> attribute in the payload json. See an example of the payload <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">here</a>. (e.g.: for discord use <code>text</code>)"
},
{
"language_code": "es_es",
"string": "El formato de datos de carga de Webhook para el atributo <code>body</code> > <code>attachments</code> > <code>text</code> en el json de carga. Vea un ejemplo de la carga <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">aquí</a>. (por ejemplo: para discord use <code>text</code>)"
}
]
},
{
"function": "REQUEST_METHOD",
"type": "text.select",
"default_value": "GET",
"options": ["GET", "POST", "PUT"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Request method"
},
{
"language_code": "es_es",
"string": "Método de solicitud"
}
],
"description": [
{
"language_code": "en_us",
"string": "The HTTP request method to be used for the webhook call."
},
{
"language_code": "es_es",
"string": "El método de solicitud HTTP que se utilizará para la llamada de webhook."
}
]
},
{
"function": "SIZE",
"type": "integer",
"default_value": 1024,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Max payload size"
},
{
"language_code": "es_es",
"string": "Tamaño máximo de carga útil"
}
],
"description": [
{
"language_code": "en_us",
"string": "The maximum size of the webhook payload as number of characters in the passed string. If above limit, it will be truncated and a <code>(text was truncated)</code> message is appended."
},
{
"language_code": "es_es",
"string": "El tamaño máximo de la carga útil del webhook como número de caracteres en la cadena pasada. Si supera el límite, se truncará y se agregará un mensaje <code>(text was truncated)</code>."
}
]
},
{
"function": "SECRET",
"type": "text",
"default_value": "",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "HMAC Secret"
},
{
"language_code": "es_es",
"string": ""
}
],
"description": [
{
"language_code": "en_us",
"string": "When set, use this secret to generate the SHA256-HMAC hex digest value of the request body, which will be passed as the <code>X-Webhook-Signature</code> header to the request. You can find more information <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_SECRET.md\">here</a>."
}
]
}
]
}

View File

@@ -1,6 +1,13 @@
## Overview
Arp-scan is a command-line tool that uses the ARP protocol to discover and fingerprint IP hosts on the local network. An alternative to ARP scan is to enable the `PIHOLE_RUN` PiHole integration settings. The arp-scan (and other Network-scan plugin times using the `SCAN_SUBNETS` setting) time depends on the number of IP addresses to check so set this up carefully with the appropriate network mask and interface. Check the [subnets documentation](https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md) for help on setting up VLANs, what VLANs are supported, or how to figure out the network mask and your interface.
Most on-network scanners (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) rely on scanning specific network interfaces and subnets. Check the [subnets documentation](https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md) for help on this setting, especially VLANs, what VLANs are supported, or how to figure out the network mask and your interface.
An alternative to on-network scanners is to enable some other Device scanners/importers that don't rely on NetAlert<sup>X</sup> having access to the network (UNIFI, dhcp.leases, PiHole, etc.).
> Note: The scan time itself depends on the number of IP addresses to check so set this up carefully with the appropriate network mask and interface.
> [!NOTE]
> If you have a lot of offline devices, which should be online, look into using, or substituing, ARP scan with other scans, such as `NMAPDEV`. The [ARP scan protocol uses](https://networkencyclopedia.com/arp-command/) a cache so results may not be 100% reliable. You can find all available network scanning options (marked as `🔍 dev scanner`) in the [Plugins overview](https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/README.md) readme.
### Usage

View File

@@ -15,11 +15,7 @@
}
],
"show_ui": true,
"localized": [
"display_name",
"description",
"icon"
],
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
@@ -82,13 +78,8 @@
"always_after_scan",
"on_new_device"
],
"localized": [
"name",
"description"
],
"events": [
"run"
],
"localized": ["name", "description"],
"events": ["run"],
"name": [
{
"language_code": "en_us",
@@ -106,7 +97,7 @@
"description": [
{
"language_code": "en_us",
"string": "Specify when your Network-discovery scan will run. Typical setting would be <code>schedule</code> and then you specify a cron-like schedule in the <a href=\"#ARPSCAN_RUN_SCHD\"><code>ARPSCAN_RUN_SCHD</code>setting</a>. ⚠ Use the same schedule if you have multiple <i class=\"fa-solid fa-magnifying-glass-plus\"></i> Device scanners enabled."
"string": "Specify when your Network-discovery scan will run. Typical setting would be <code>schedule</code> and then you specify a cron-like schedule in the <a href=\"#ARPSCAN_RUN_SCHD\"><code>ARPSCAN_RUN_SCHD</code>setting</a>. ⚠ Use the same schedule if you have multiple <i class=\"fa-solid fa-magnifying-glass-plus\"></i> Device scanners enabled. <br/><br/> Depends on the <a onclick=\"toggleAllSettings()\" href=\"#SCAN_SUBNETS\"><code>SCAN_SUBNETS</code> setting</a>."
},
{
"language_code": "es_es",
@@ -123,10 +114,7 @@
"type": "readonly",
"default_value": "python3 /app/front/plugins/arp_scan/script.py userSubnets={subnets}",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -161,10 +149,7 @@
"type": "integer",
"default_value": 300,
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -199,10 +184,7 @@
"type": "text",
"default_value": "*/5 * * * *",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -235,20 +217,14 @@
{
"function": "WATCH",
"type": "text.multiselect",
"default_value": [
"Watched_Value1",
"Watched_Value2"
],
"default_value": ["Watched_Value1", "Watched_Value2"],
"options": [
"Watched_Value1",
"Watched_Value2",
"Watched_Value3",
"Watched_Value4"
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -281,19 +257,14 @@
{
"function": "REPORT_ON",
"type": "text.multiselect",
"default_value": [
"new"
],
"default_value": ["new"],
"options": [
"new",
"watched-changed",
"watched-not-changed",
"missing-in-last-scan"
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -328,10 +299,7 @@
"type": "text",
"default_value": "sudo arp-scan --ignoredups --retry=6",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -355,9 +323,7 @@
"type": "device_name_mac",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -381,9 +347,7 @@
"type": "device_ip",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -407,9 +371,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -436,9 +398,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -461,9 +421,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -486,9 +444,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -528,9 +484,7 @@
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -547,4 +501,4 @@
]
}
]
}
}

View File

@@ -38,7 +38,7 @@ def main():
mylog('verbose', ['[ARP Scan] In script '])
# holds a list of user-submitted subnets.
mylog('verbose', ['[ARP Scan] values.userSubnets: ', values.userSubnets])
# mylog('verbose', ['[ARP Scan] values.userSubnets: ', values.userSubnets])
# Extract the base64-encoded subnet information from the first element of the userSubnets list.
@@ -46,7 +46,7 @@ def main():
userSubnetsParamBase64 = values.userSubnets[0].split('userSubnets=b')[1]
# Printing the extracted base64-encoded subnet information.
mylog('verbose', ['[ARP Scan] userSubnetsParamBase64: ', userSubnetsParamBase64])
# mylog('verbose', ['[ARP Scan] userSubnetsParamBase64: ', userSubnetsParamBase64])
# Decode the base64-encoded subnet information to get the actual subnet information in ASCII format.

View File

@@ -1,15 +1,3 @@
### Community translations of this file
<a href="https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/csv_backup/README_ES.md">
<img src="https://github.com/lipis/flag-icons/blob/main/flags/4x3/es.svg" alt="README_ES.md" style="height: 20px !important;width: 20px !important;">
Spanish (Spain)
</a>
<br>
<a href="https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/csv_backup/README_DE.md">
<img src="https://github.com/lipis/flag-icons/blob/main/flags/4x3/de.svg" alt="README_DE.md" style="height: 20px !important;width: 20px !important;">
German (Germany)
</a>
## Overview
Plugin generating CSV backups of your Devices database table, including the network mappings. Can be used for importing your setup via the Maintenance > Backup / Restore > CSV Import feature (See also: [Devices Bulk Editing](https://github.com/jokob-sk/NetAlertX/blob/main/docs/DEVICES_BULK_EDITING.md)).

View File

@@ -3,7 +3,7 @@
"unique_prefix": "CSVBCKP",
"plugin_type": "system",
"enabled": true,
"data_source": "script",
"data_source": "script",
"show_ui": false,
"localized": ["display_name", "description", "icon"],
@@ -19,7 +19,7 @@
{
"language_code": "de_de",
"string": "CSV-Sicherung"
}
}
],
"icon": [
{
@@ -39,53 +39,64 @@
{
"language_code": "de_de",
"string": "Ein Plugin zum automatischen Generieren von devices.csv-Backups."
}
}
],
"params" : [{
"name" : "overwrite",
"type" : "setting",
"value" : "CSVBCKP_overwrite"
"params": [
{
"name": "overwrite",
"type": "setting",
"value": "CSVBCKP_overwrite"
},
{
"name" : "location",
"type" : "setting",
"value" : "CSVBCKP_location"
"name": "location",
"type": "setting",
"value": "CSVBCKP_location"
}
],
],
"settings": [
{
"function": "RUN",
"events": ["run"],
"type": "text.select",
"default_value":"schedule",
"options": ["disabled", "once", "schedule", "always_after_scan", "on_new_device"],
"function": "RUN",
"events": ["run"],
"type": "text.select",
"default_value": "schedule",
"options": [
"disabled",
"once",
"schedule",
"always_after_scan",
"on_new_device"
],
"localized": ["name", "description"],
"name" :[{
"language_code":"en_us",
"string" : "When to run"
},
{
"language_code":"es_es",
"string" : "Cuándo ejecutar"
},
{
"language_code":"de_de",
"string" : "Wann laufen"
}],
"description": [{
"language_code":"en_us",
"string" : "When the backup should be created. A daily or weekly <code>SCHEDULE</code> is a good option."
},
{
"language_code":"es_es",
"string" : "Cuándo se debe crear la copia de seguridad. Un <code>SCHEDULE</code> diario o semanal es una buena opción."
},
{
"language_code":"de_de",
"string" : "Wann das Backup erstellt werden soll. Ein täglicher oder wöchentlicher <code>SCHEDULE</code> ist eine gute Option."
}]
},
"name": [
{
"language_code": "en_us",
"string": "When to run"
},
{
"language_code": "es_es",
"string": "Cuándo ejecutar"
},
{
"language_code": "de_de",
"string": "Wann laufen"
}
],
"description": [
{
"language_code": "en_us",
"string": "When the backup should be created. A daily or weekly <code>SCHEDULE</code> is a good option."
},
{
"language_code": "es_es",
"string": "Cuándo se debe crear la copia de seguridad. Un <code>SCHEDULE</code> diario o semanal es una buena opción."
},
{
"language_code": "de_de",
"string": "Wann das Backup erstellt werden soll. Ein täglicher oder wöchentlicher <code>SCHEDULE</code> ist eine gute Option."
}
]
},
{
"function": "CMD",
"type": "readonly",
@@ -104,7 +115,7 @@
{
"language_code": "de_de",
"string": "Befehl"
}
}
],
"description": [
{
@@ -118,40 +129,44 @@
{
"language_code": "de_de",
"string": "Befehl zum Ausführen. Dies kann nicht geändert werden"
}
}
]
},
{
"function": "RUN_SCHD",
"type": "text",
"default_value":"0 2 * * 3",
"default_value": "0 2 * * 3",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Schedule"
},
{
"language_code":"es_es",
"string" : "Schedule"
},
{
"language_code":"de_de",
"string" : "Schedule"
}],
"description": [{
"language_code":"en_us",
"string" : "Only enabled if you select <code>schedule</code> in the <a href=\"#CSVBCKP_RUN\"><code>CSVBCKP_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). For example entering <code>0 4 * * *</code> will run the scan after 4 am in the <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes."
},
{
"language_code":"es_es",
"string" : "Solo está habilitado si selecciona <code>schedule</code> en la configuración <a href=\"#CSVBCKP_RUN\"><code>CSVBCKP_RUN</code></a>. Asegúrese de ingresar la programación en el formato similar a cron correcto (por ejemplo, valide en <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutará el escaneo después de las 4 a.m. en el <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ código> que configuró arriba</a>. Se ejecutará la PRÓXIMA vez que pase el tiempo."
},
{
"language_code":"de_de",
"string" : "Nur aktiviert, wenn Sie <code>schedule</code> in der <a href=\"#CSVBCKP_RUN\"><code>CSVBCKP_RUN</code>-Einstellung</a> auswählen. Stellen Sie sicher, dass Sie den Zeitplan im richtigen Cron-ähnlichen Format eingeben (z. B. validieren unter <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Wenn Sie beispielsweise <code>0 4 * * *</code> eingeben, wird der Scan nach 4 Uhr morgens in der <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ ausgeführt. Code> den Sie oben festgelegt haben</a>. Wird das NÄCHSTE Mal ausgeführt, wenn die Zeit vergeht."
}]
},
"name": [
{
"language_code": "en_us",
"string": "Schedule"
},
{
"language_code": "es_es",
"string": "Schedule"
},
{
"language_code": "de_de",
"string": "Schedule"
}
],
"description": [
{
"language_code": "en_us",
"string": "Only enabled if you select <code>schedule</code> in the <a href=\"#CSVBCKP_RUN\"><code>CSVBCKP_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). For example entering <code>0 4 * * *</code> will run the scan after 4 am in the <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes."
},
{
"language_code": "es_es",
"string": "Solo está habilitado si selecciona <code>schedule</code> en la configuración <a href=\"#CSVBCKP_RUN\"><code>CSVBCKP_RUN</code></a>. Asegúrese de ingresar la programación en el formato similar a cron correcto (por ejemplo, valide en <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutará el escaneo después de las 4 a.m. en el <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ código> que configuró arriba</a>. Se ejecutará la PRÓXIMA vez que pase el tiempo."
},
{
"language_code": "de_de",
"string": "Nur aktiviert, wenn Sie <code>schedule</code> in der <a href=\"#CSVBCKP_RUN\"><code>CSVBCKP_RUN</code>-Einstellung</a> auswählen. Stellen Sie sicher, dass Sie den Zeitplan im richtigen Cron-ähnlichen Format eingeben (z. B. validieren unter <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Wenn Sie beispielsweise <code>0 4 * * *</code> eingeben, wird der Scan nach 4 Uhr morgens in der <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ ausgeführt. Code> den Sie oben festgelegt haben</a>. Wird das NÄCHSTE Mal ausgeführt, wenn die Zeit vergeht."
}
]
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
@@ -170,7 +185,7 @@
{
"language_code": "de_de",
"string": "Zeitüberschreitung"
}
}
],
"description": [
{
@@ -184,75 +199,80 @@
{
"language_code": "de_de",
"string": "Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei Überschreitung dieser Zeit wird das Skript abgebrochen."
}
}
]
},
{
"function": "overwrite",
"type": "boolean",
"default_value":false,
"default_value": false,
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Overwrite file"
},
{
"language_code":"es_es",
"string" : "Sobrescribir archivo"
},
{
"language_code":"de_de",
"string" : "Datei überschreiben"
}],
"description": [{
"language_code":"en_us",
"string" : "If the <code>devices.csv</code> file should be always overwritten. If disabled, the date and time is added to the name."
},
{
"language_code":"es_es",
"string" : "Si el archivo <code>devices.csv</code> siempre debe sobrescribirse. Si está deshabilitado, la fecha y la hora se agregan al nombre."
},
{
"language_code":"de_de",
"string" : "Wenn die Datei <code>devices.csv</code> immer überschrieben werden soll. Wenn deaktiviert, werden dem Namen Datum und Uhrzeit hinzugefügt."
}]
"name": [
{
"language_code": "en_us",
"string": "Overwrite file"
},
{
"language_code": "es_es",
"string": "Sobrescribir archivo"
},
{
"language_code": "de_de",
"string": "Datei überschreiben"
}
],
"description": [
{
"language_code": "en_us",
"string": "If the <code>devices.csv</code> file should be always overwritten. If disabled, the date and time is added to the name."
},
{
"language_code": "es_es",
"string": "Si el archivo <code>devices.csv</code> siempre debe sobrescribirse. Si está deshabilitado, la fecha y la hora se agregan al nombre."
},
{
"language_code": "de_de",
"string": "Wenn die Datei <code>devices.csv</code> immer überschrieben werden soll. Wenn deaktiviert, werden dem Namen Datum und Uhrzeit hinzugefügt."
}
]
},
{
"function": "location",
"type": "text",
"default_value":"/app/config",
"default_value": "/app/config",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "File location"
},
{
"language_code":"es_es",
"string" : "Ubicación del archivo"
},
{
"language_code":"de_de",
"string" : "Speicherort"
}],
"description": [{
"language_code":"en_us",
"string" : "Where the <code>devices.csv</code> file should be saved. For example <code>/app/config</code>."
},
{
"language_code":"es_es",
"string" : "Donde se debe guardar el archivo <code>devices.csv</code>. Por ejemplo <code>/app/config</code>."
},
{
"language_code":"de_de",
"string" : "Wo die Datei <code>devices.csv</code> gespeichert werden soll. Zum Beispiel <code>/app/config</code>."
}]
}
"name": [
{
"language_code": "en_us",
"string": "File location"
},
{
"language_code": "es_es",
"string": "Ubicación del archivo"
},
{
"language_code": "de_de",
"string": "Speicherort"
}
],
"description": [
{
"language_code": "en_us",
"string": "Where the <code>devices.csv</code> file should be saved. For example <code>/app/config</code>."
},
{
"language_code": "es_es",
"string": "Donde se debe guardar el archivo <code>devices.csv</code>. Por ejemplo <code>/app/config</code>."
},
{
"language_code": "de_de",
"string": "Wo die Datei <code>devices.csv</code> gespeichert werden soll. Zum Beispiel <code>/app/config</code>."
}
]
}
],
"database_column_definitions":
[
]
"database_column_definitions": []
}

View File

@@ -3,7 +3,7 @@
"unique_prefix": "DBCLNP",
"plugin_type": "system",
"enabled": true,
"data_source": "script",
"data_source": "script",
"show_ui": false,
"localized": ["display_name", "description", "icon"],
@@ -23,55 +23,55 @@
{
"language_code": "en_us",
"string": "A plugin to schedule database cleanup & upkeep tasks."
}
],
"params" : [{
"name" : "pluginskeephistory",
"type" : "setting",
"value" : "PLUGINS_KEEP_HIST"
},
{
"name" : "daystokeepevents",
"type" : "setting",
"value" : "DAYS_TO_KEEP_EVENTS"
},
{
"name" : "hourstokeepnewdevice",
"type" : "setting",
"value" : "HRS_TO_KEEP_NEWDEV"
},
{
"name" : "pholuskeepdays",
"type" : "setting",
"value" : "PHOLUS_DAYS_DATA"
}
],
],
"params": [
{
"name": "pluginskeephistory",
"type": "setting",
"value": "PLUGINS_KEEP_HIST"
},
{
"name": "daystokeepevents",
"type": "setting",
"value": "DAYS_TO_KEEP_EVENTS"
},
{
"name": "hourstokeepnewdevice",
"type": "setting",
"value": "HRS_TO_KEEP_NEWDEV"
}
],
"settings": [
{
"function": "RUN",
"events": ["run"],
"type": "text.select",
"default_value":"schedule",
"function": "RUN",
"events": ["run"],
"type": "text.select",
"default_value": "schedule",
"options": ["disabled", "once", "schedule", "always_after_scan"],
"localized": ["name", "description"],
"name" :[{
"language_code":"en_us",
"string" : "When to run"
},
{
"language_code":"es_es",
"string" : "Cuándo ejecutar"
},
{
"language_code":"de_de",
"string" : "Wann laufen"
}],
"description": [{
"language_code":"en_us",
"string" : "When the cleanup should be performed. An hourly or daily <code>SCHEDULE</code> is a good option."
}]
},
"name": [
{
"language_code": "en_us",
"string": "When to run"
},
{
"language_code": "es_es",
"string": "Cuándo ejecutar"
},
{
"language_code": "de_de",
"string": "Wann laufen"
}
],
"description": [
{
"language_code": "en_us",
"string": "When the cleanup should be performed. An hourly or daily <code>SCHEDULE</code> is a good option."
}
]
},
{
"function": "CMD",
"type": "readonly",
@@ -90,7 +90,7 @@
{
"language_code": "de_de",
"string": "Befehl"
}
}
],
"description": [
{
@@ -104,40 +104,44 @@
{
"language_code": "de_de",
"string": "Befehl zum Ausführen. Dies kann nicht geändert werden"
}
}
]
},
{
"function": "RUN_SCHD",
"type": "text",
"default_value":"*/30 * * * *",
"default_value": "*/30 * * * *",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Schedule"
},
{
"language_code":"es_es",
"string" : "Schedule"
},
{
"language_code":"de_de",
"string" : "Schedule"
}],
"description": [{
"language_code":"en_us",
"string" : "Only enabled if you select <code>schedule</code> in the <a href=\"#DBCLNP_RUN\"><code>DBCLNP_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). For example entering <code>0 4 * * *</code> will run the scan after 4 am in the <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes."
},
{
"language_code":"es_es",
"string" : "Solo está habilitado si selecciona <code>schedule</code> en la configuración <a href=\"#DBCLNP_RUN\"><code>DBCLNP_RUN</code></a>. Asegúrese de ingresar la programación en el formato similar a cron correcto (por ejemplo, valide en <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutará el escaneo después de las 4 a.m. en el <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ código> que configuró arriba</a>. Se ejecutará la PRÓXIMA vez que pase el tiempo."
},
{
"language_code":"de_de",
"string" : "Nur aktiviert, wenn Sie <code>schedule</code> in der <a href=\"#DBCLNP_RUN\"><code>DBCLNP_RUN</code>-Einstellung</a> auswählen. Stellen Sie sicher, dass Sie den Zeitplan im richtigen Cron-ähnlichen Format eingeben (z. B. validieren unter <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Wenn Sie beispielsweise <code>0 4 * * *</code> eingeben, wird der Scan nach 4 Uhr morgens in der <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ ausgeführt. Code> den Sie oben festgelegt haben</a>. Wird das NÄCHSTE Mal ausgeführt, wenn die Zeit vergeht."
}]
},
"name": [
{
"language_code": "en_us",
"string": "Schedule"
},
{
"language_code": "es_es",
"string": "Schedule"
},
{
"language_code": "de_de",
"string": "Schedule"
}
],
"description": [
{
"language_code": "en_us",
"string": "Only enabled if you select <code>schedule</code> in the <a href=\"#DBCLNP_RUN\"><code>DBCLNP_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). For example entering <code>0 4 * * *</code> will run the scan after 4 am in the <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes."
},
{
"language_code": "es_es",
"string": "Solo está habilitado si selecciona <code>schedule</code> en la configuración <a href=\"#DBCLNP_RUN\"><code>DBCLNP_RUN</code></a>. Asegúrese de ingresar la programación en el formato similar a cron correcto (por ejemplo, valide en <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutará el escaneo después de las 4 a.m. en el <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ código> que configuró arriba</a>. Se ejecutará la PRÓXIMA vez que pase el tiempo."
},
{
"language_code": "de_de",
"string": "Nur aktiviert, wenn Sie <code>schedule</code> in der <a href=\"#DBCLNP_RUN\"><code>DBCLNP_RUN</code>-Einstellung</a> auswählen. Stellen Sie sicher, dass Sie den Zeitplan im richtigen Cron-ähnlichen Format eingeben (z. B. validieren unter <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Wenn Sie beispielsweise <code>0 4 * * *</code> eingeben, wird der Scan nach 4 Uhr morgens in der <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ ausgeführt. Code> den Sie oben festgelegt haben</a>. Wird das NÄCHSTE Mal ausgeführt, wenn die Zeit vergeht."
}
]
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
@@ -156,7 +160,7 @@
{
"language_code": "de_de",
"string": "Zeitüberschreitung"
}
}
],
"description": [
{
@@ -170,7 +174,7 @@
{
"language_code": "de_de",
"string": "Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei Überschreitung dieser Zeit wird das Skript abgebrochen."
}
}
]
},
{
@@ -194,8 +198,5 @@
}
],
"database_column_definitions":
[
]
"database_column_definitions": []
}

View File

@@ -32,14 +32,14 @@ def main():
parser.add_argument('pluginskeephistory', action="store", help="TBC")
parser.add_argument('hourstokeepnewdevice', action="store", help="TBC")
parser.add_argument('daystokeepevents', action="store", help="TBC")
parser.add_argument('pholuskeepdays', action="store", help="TBC")
parser.add_argument('pholuskeepdays', action="store", help="TBC") # unused
values = parser.parse_args()
PLUGINS_KEEP_HIST = int(values.pluginskeephistory.split('=')[1])
HRS_TO_KEEP_NEWDEV = int(values.hourstokeepnewdevice.split('=')[1])
DAYS_TO_KEEP_EVENTS = int(values.daystokeepevents.split('=')[1])
PHOLUS_DAYS_DATA = int(values.pholuskeepdays.split('=')[1])
PLUGINS_KEEP_HIST = int(values.pluginskeephistory.split('=')[1])
HRS_TO_KEEP_NEWDEV = int(values.hourstokeepnewdevice.split('=')[1])
DAYS_TO_KEEP_EVENTS = int(values.daystokeepevents.split('=')[1])
PHOLUS_DAYS_DATA = get_setting_value("PHOLUS_DAYS_DATA")
mylog('verbose', [f'[{pluginName}] In script'])
@@ -148,7 +148,7 @@ def cleanup_database (dbPath, DAYS_TO_KEEP_EVENTS, PHOLUS_DAYS_DATA, HRS_TO_KEEP
# -----------------------------------------------------
# Cleanup Pholus_Scan
if PHOLUS_DAYS_DATA != 0:
if PHOLUS_DAYS_DATA != "" and PHOLUS_DAYS_DATA != 0:
mylog('verbose', [f'[{pluginName}] Pholus_Scan: Delete all older than ' + str(PHOLUS_DAYS_DATA) + ' days (PHOLUS_DAYS_DATA setting)'])
# todo: improvement possibility: keep at least N per mac
cursor.execute (f"""DELETE FROM Pholus_Scan

View File

@@ -14,11 +14,7 @@
],
"data_source": "script",
"show_ui": true,
"localized": [
"display_name",
"description",
"icon"
],
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
@@ -79,21 +75,11 @@
"settings": [
{
"function": "RUN",
"events": [
"run"
],
"events": ["run"],
"type": "text.select",
"default_value": "disabled",
"options": [
"disabled",
"once",
"schedule",
"always_after_scan"
],
"localized": [
"name",
"description"
],
"options": ["disabled", "once", "schedule", "always_after_scan"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -124,10 +110,7 @@
"type": "readonly",
"default_value": "python3 /app/front/plugins/ddns_update/script.py prev_ip={prev_ip} DDNS_UPDATE_URL={DDNS_UPDATE_URL} DDNS_USER={DDNS_USER} DDNS_PASSWORD={DDNS_PASSWORD} DDNS_DOMAIN={DDNS_DOMAIN} ",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -162,10 +145,7 @@
"type": "text",
"default_value": "*/5 * * * *",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -200,10 +180,7 @@
"type": "integer",
"default_value": 30,
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -238,10 +215,7 @@
"type": "text",
"default_value": "your_domain.freeddns.org",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -276,10 +250,7 @@
"type": "text",
"default_value": "dynu_user",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -314,10 +285,7 @@
"type": "password",
"default_value": "A0000000B0000000C0000000D0000000",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -352,10 +320,7 @@
"type": "text",
"default_value": "https://api.dynu.com/nic/update?",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -388,19 +353,14 @@
{
"function": "WATCH",
"type": "text.multiselect",
"default_value": [
"Watched_Value1"
],
"default_value": ["Watched_Value1"],
"options": [
"Watched_Value1",
"Watched_Value2",
"Watched_Value3",
"Watched_Value4"
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -429,20 +389,14 @@
{
"function": "REPORT_ON",
"type": "text.multiselect",
"default_value": [
"new",
"watched-changed"
],
"default_value": ["new", "watched-changed"],
"options": [
"new",
"watched-changed",
"watched-not-changed",
"missing-in-last-scan"
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -481,9 +435,7 @@
"type": "device_name_mac",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -506,9 +458,7 @@
"type": "device_ip",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -531,9 +481,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -555,9 +503,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -580,9 +526,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -605,9 +549,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -647,9 +589,7 @@
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -666,4 +606,4 @@
]
}
]
}
}

View File

@@ -6,6 +6,8 @@ A plugin allowing for importing devices from DHCP.leases files.
- Specify full paths of all `dhcp.leases` files you want to import and watch in the `DHCPLSS_paths_to_check`setting.
- Map the paths specified in the `DHCPLSS_paths_to_check`setting in your `docker-compose.yml` file.
- If you are using pihole or dnsmasq dhcp.leases, include `pihole` or `dnsmasq` into the mapping path respectively, check the below example for details
#### Example:
@@ -18,20 +20,47 @@ A plugin allowing for importing devices from DHCP.leases files.
# mapping different dhcp.leases files
- /first/location/dhcp.leases:/mnt/dhcp1.leases
- /second/location/dhcp.leases:/mnt/dhcp2.leases
- /third/location/dhcp.leases:/etc/pihole/dhcp.leases # a pihole specific dhcp.leases file
- /fourth/location/dhcp.leases:/etc/dnsmasq/dhcp.leases # a dnsmasq specific dhcp.leases file
...
```
`DHCPLSS_paths_to_check` Setting:
The `DHCPLSS_paths_to_check` setting should then contain the following:
```python
DHCPLSS_paths_to_check = ['/mnt/dhcp1.leases','/mnt/dhcp2.leases']
DHCPLSS_paths_to_check = ['/mnt/dhcp1.leases','/mnt/dhcp2.leases','/etc/pihole/dhcp.leases','/etc/dnsmasq/dhcp.leases']
```
### Notes
- No specific configuration needed.
No specific configuration is needed. This plugin supports `dhcp.leases` file(s) in the following formats:
1. PiHole
2. Dnsmasq
3. Generic format
#### pihole format
Example File Format: _(not all lines are required)_
```
TBC
```
#### dnsmasq format
`[Lease expiry time] [mac address] [ip address] [hostname] [client id, if known]`
Example File Format: _(not all lines are required)_
```
1715932537 01:5c:5c:5c:5c:5c:5c 192.168.1.115 ryans-laptop 01:5c:5c:5c:5c:5c:5c
```
> Note, only `[mac address] [ip address] [hostname]` are captured
#### Generic format
- This plugin expects the dhcp.leases file(s) to be in the format of **dhcpd.leases** that is different to the format that PiHole uses.
[dhcpd.leases(5) - Linux man page]( https://linux.die.net/man/5/dhcpd.leases#:~:text=This%20database%20is%20a%20free,file%20is%20the%20current%20one.)
Example File Format: _(not all lines are required)_
@@ -50,4 +79,4 @@ lease 192.168.79.15 {
option agent.remote-id c0:a8:9:5;
client-hostname "android-8182e21c852776e7";
}
```
```

View File

@@ -14,11 +14,7 @@
}
],
"show_ui": true,
"localized": [
"display_name",
"description",
"icon"
],
"localized": ["display_name", "description", "icon"],
"mapped_to_table": "CurrentScan",
"display_name": [
{
@@ -73,9 +69,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -98,9 +92,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -124,9 +116,7 @@
"type": "device_mac",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -150,9 +140,7 @@
"type": "device_ip",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -175,9 +163,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -201,9 +187,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -226,9 +210,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -252,9 +234,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -277,9 +257,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -302,9 +280,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -327,9 +303,7 @@
"type": "textbox_save",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -352,9 +326,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -381,9 +353,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -423,9 +393,7 @@
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -445,9 +413,7 @@
"settings": [
{
"function": "RUN",
"events": [
"run"
],
"events": ["run"],
"type": "text.select",
"default_value": "disabled",
"options": [
@@ -457,10 +423,7 @@
"always_after_scan",
"on_new_device"
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -495,10 +458,7 @@
"type": "text",
"default_value": "python3 /app/front/plugins/dhcp_leases/script.py paths={paths}",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -531,15 +491,9 @@
{
"function": "paths_to_check",
"type": "list",
"default_value": [
"/mnt/dhcp1.leases",
"/mnt/dhcp2.leases"
],
"default_value": ["/mnt/dhcp1.leases", "/mnt/dhcp2.leases"],
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -574,10 +528,7 @@
"type": "text",
"default_value": "0 2 * * *",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -612,10 +563,7 @@
"type": "integer",
"default_value": 5,
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -648,20 +596,14 @@
{
"function": "WATCH",
"type": "text.multiselect",
"default_value": [
"Watched_Value1",
"Watched_Value4"
],
"default_value": ["Watched_Value1", "Watched_Value4"],
"options": [
"Watched_Value1",
"Watched_Value2",
"Watched_Value3",
"Watched_Value4"
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -694,20 +636,14 @@
{
"function": "REPORT_ON",
"type": "text.multiselect",
"default_value": [
"new",
"watched-changed"
],
"default_value": ["new", "watched-changed"],
"options": [
"new",
"watched-changed",
"watched-not-changed",
"missing-in-last-scan"
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -738,4 +674,4 @@
]
}
]
}
}

View File

@@ -56,6 +56,7 @@ def get_entries(path, plugin_objects):
# Use the detected encoding
encoding = result['encoding']
# Order: MAC, IP, IsActive, NAME, Hardware
# Handle pihole-specific dhcp.leases files
if 'pihole' in path:
with open(path, 'r', encoding=encoding, errors='replace') as f:
@@ -72,6 +73,24 @@ def get_entries(path, plugin_objects):
extra = handleEmpty(path),
foreignKey = handleEmpty(row[1])
)
elif 'dnsmasq' in path:
# [Lease expiry time] [mac address] [ip address] [hostname] [client id, if known]
# e.g.
# 1715932537 01:5c:5c:5c:5c:5c:5c 192.168.1.115 ryans-laptop 01:5c:5c:5c:5c:5c:5c
with open(path, 'r', encoding=encoding, errors='replace') as f:
for line in f:
row = line.rstrip().split()
if len(row) > 3:
plugin_objects.add_object(
primaryId = handleEmpty(row[1]),
secondaryId = handleEmpty(row[2]),
watched1 = handleEmpty('True'),
watched2 = handleEmpty(row[3]),
watched3 = '',
watched4 = handleEmpty('True'),
extra = handleEmpty(path),
foreignKey = handleEmpty(row[1])
)
else:
# Handle generic dhcp.leases files
leases = DhcpLeases(path)

View File

@@ -1,420 +1,486 @@
{
"code_name": "dhcp_servers",
"unique_prefix": "DHCPSRVS",
"plugin_type": "other",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": ["display_name", "description", "icon"],
"display_name" : [{
"language_code":"en_us",
"string" : "Rogue DHCP"
"code_name": "dhcp_servers",
"unique_prefix": "DHCPSRVS",
"plugin_type": "other",
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
"string": "Rogue DHCP"
},
{
"language_code":"es_es",
"string" : "Rogue DHCP (DHCP no autorizado)"
}],
"icon":[{
"language_code":"en_us",
"string" : "<i class=\"fa-solid fa-skull-crossbones\"></i>"
"language_code": "es_es",
"string": "Rogue DHCP (DHCP no autorizado)"
}
],
"icon": [
{
"language_code": "en_us",
"string": "<i class=\"fa-solid fa-skull-crossbones\"></i>"
},
{
"language_code":"es_es",
"string" : "<i class=\"fa-solid fa-skull-crossbones\"></i>"
}],
"description": [{
"language_code":"en_us",
"string" : "This plugin is to use NMAP to monitor for rogue DHCP servers."
"language_code": "es_es",
"string": "<i class=\"fa-solid fa-skull-crossbones\"></i>"
}
],
"description": [
{
"language_code": "en_us",
"string": "This plugin is to use NMAP to monitor for rogue DHCP servers."
},
{
"language_code":"es_es",
"string" : "Este complemento es para usar NMAP para monitorear servidores DHCP no autorizados."
}],
"params" : [],
"database_column_definitions":
[
"language_code": "es_es",
"string": "Este complemento es para usar NMAP para monitorear servidores DHCP no autorizados."
}
],
"params": [],
"database_column_definitions": [
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"column": "Index",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "N/A"
},
{
"language_code":"es_es",
"string" : "N/A"
}]
} ,
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "N/A"
},
{
"language_code":"es_es",
"string" : "N/A"
}]
"language_code": "en_us",
"string": "N/A"
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "device_ip",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Server Identifier"
},
{
"language_code":"es_es",
"string" : "Identificador de servidor"
}]
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Domain Name"
},
{
"language_code":"es_es",
"string" : "Nombre de dominio"
}]
} ,
{
"column": "DateTimeCreated",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Created"
},
{
"language_code":"es_es",
"string" : "Creado"
}]
},
{
"column": "DateTimeChanged",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Changed"
},
{
"language_code":"es_es",
"string" : "Cambiado"
}]
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Domain Name Server"
},
{
"language_code":"es_es",
"string" : "Servidor de nombres de dominio"
}]
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "IP Offered"
},
{
"language_code":"es_es",
"string" : "IP ofrecida"
}]
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Interface"
},
{
"language_code":"es_es",
"string" : "Interfaz"
}]
} ,
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Router"
},
{
"language_code":"es_es",
"string" : "Router"
}]
} ,
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": true,
"type": "textbox_save",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Comments"
},
{
"language_code":"es_es",
"string" : "Comentarios"
}]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": true,
"type": "replace",
"default_value":"",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Status"
},
{
"language_code":"es_es",
"string" : "Estado"
}]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": true,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Extra info"
},
{
"language_code":"es_es",
"string" : "Información extra"
}]
}
],
"settings":[
{
"function": "RUN",
"events": ["run"],
"type": "text.select",
"default_value":"disabled",
"options": ["disabled", "once", "schedule", "always_after_scan", "on_new_device"],
"localized": ["name", "description"],
"name" :[{
"language_code":"en_us",
"string" : "When to run"
},
{
"language_code":"es_es",
"string" : "Cuando ejecutar"
}],
"description": [{
"language_code":"en_us",
"string" : "Enable a regular scan of rogue DHCP servers. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) or after you update your settings. ⚠ Use the same schedule if you have multiple <i class=\"fa-solid fa-magnifying-glass-plus\"></i> Device scanners enabled."
},
{
"language_code":"es_es",
"string" : "Habilite un escaneo regular de servidores DHCP no autorizados. Si selecciona <code>schedule</code>, se aplican las configuraciones de programación de abajo. Si selecciona <code>once</code>, el análisis se ejecuta solo una vez al inicio de la aplicación (contenedor) o después de actualizar su configuración."
}]
},
{
"function": "CMD",
"type": "text",
"default_value":"python3 /app/front/plugins/dhcp_servers/script.py",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Command"
},
{
"language_code":"es_es",
"string" : "Comando"
}],
"description": [{
"language_code":"en_us",
"string" : "Command to run"
},
{
"language_code":"es_es",
"string" : "Comando a ejecutar"
}]
},
{
"function": "RUN_SCHD",
"type": "text",
"default_value":"0 2 * * *",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Schedule"
},
{
"language_code":"es_es",
"string" : "Programar"
}],
"description": [{
"language_code":"en_us",
"string" : "Only enabled if you select <code>schedule</code> in the <a href=\"#DHCPSRVS_RUN\"><code>DHCPSRVS_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). For example entering <code>0 4 * * *</code> will run the scan after 4 am in the <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes."
},
{
"language_code":"es_es",
"string" : "Solo está habilitado si selecciona <code>schedule</code> en la configuración de <a href=\"#DHCPSRVS_RUN\"><code>DHCPSRVS_RUN</code></a>. Asegúrese de ingresar la programación en el formato similar a cron correcto (por ejemplo, valide en <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutará el escaneo después de las 4 a.m. en el <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ código> que configuró arriba</a>. Se ejecutará la PRÓXIMA vez que pase el tiempo."
}]
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value":10,
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Run timeout"
},
{
"language_code":"es_es",
"string" : "Tiempo de espera de ejecución"
},
{
"language_code":"de_de",
"string" : "Wartezeit"
}],
"description": [{
"language_code":"en_us",
"string" : "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
},
{
"language_code":"es_es",
"string" : "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela."
}]
},
{
"function": "WATCH",
"type": "text.multiselect",
"default_value":["Watched_Value1"],
"options": ["Watched_Value1","Watched_Value2","Watched_Value3","Watched_Value4"],
"localized": ["name", "description"],
"name" :[{
"language_code":"en_us",
"string" : "Watched"
},
{
"language_code":"es_es",
"string" : "Visto"
}] ,
"description":[{
"language_code":"en_us",
"string" : "Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is Domain Name Server</li><li><code>Watched_Value2</code> is IP Offered</li><li><code>Watched_Value3</code> is Interface </li><li><code>Watched_Value4</code> is Router </li></ul>"
},
{
"language_code":"es_es",
"string" : "Envíe una notificación si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>Watched_Value1</code> es servidor de nombres de dominio</li><li><code>Watched_Value2</code> es IP ofrecida</li><li><code>Watched_Value3</code> es Interfaz </li><li><code>Watched_Value4</code> es enrutador </li></ul>"
}]
},
{
"function": "REPORT_ON",
"type": "text.multiselect",
"default_value":["new","watched-changed"],
"options": ["new","watched-changed","watched-not-changed"],
"localized": ["name", "description"],
"name" :[{
"language_code":"en_us",
"string" : "Report on"
},
{
"language_code":"es_es",
"string" : "Informar sobre"
}] ,
"description":[{
"language_code":"en_us",
"string" : "Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed."
},
{
"language_code":"es_es",
"string" : "Envíe una notificación solo en estos estados. <code>new</code> significa que se descubrió un nuevo objeto único (una combinación única de PrimaryId y SecondaryId). <code>watched-changed</code> significa que las columnas <code>Watched_ValueN</code> seleccionadas cambiaron."
}]
"language_code": "es_es",
"string": "N/A"
}
]
]
},
{
"column": "Plugin",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "N/A"
},
{
"language_code": "es_es",
"string": "N/A"
}
]
},
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "device_ip",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Server Identifier"
},
{
"language_code": "es_es",
"string": "Identificador de servidor"
}
]
},
{
"column": "Object_SecondaryID",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Domain Name"
},
{
"language_code": "es_es",
"string": "Nombre de dominio"
}
]
},
{
"column": "DateTimeCreated",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Created"
},
{
"language_code": "es_es",
"string": "Creado"
}
]
},
{
"column": "DateTimeChanged",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Changed"
},
{
"language_code": "es_es",
"string": "Cambiado"
}
]
},
{
"column": "Watched_Value1",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Domain Name Server"
},
{
"language_code": "es_es",
"string": "Servidor de nombres de dominio"
}
]
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "IP Offered"
},
{
"language_code": "es_es",
"string": "IP ofrecida"
}
]
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": false,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Interface"
},
{
"language_code": "es_es",
"string": "Interfaz"
}
]
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Router"
},
{
"language_code": "es_es",
"string": "Router"
}
]
},
{
"column": "UserData",
"css_classes": "col-sm-2",
"show": true,
"type": "textbox_save",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Comments"
},
{
"language_code": "es_es",
"string": "Comentarios"
}
]
},
{
"column": "Status",
"css_classes": "col-sm-1",
"show": true,
"type": "replace",
"default_value": "",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
},
{
"equals": "watched-changed",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
},
{
"equals": "new",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
},
{
"equals": "missing-in-last-scan",
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Status"
},
{
"language_code": "es_es",
"string": "Estado"
}
]
},
{
"column": "Extra",
"css_classes": "col-sm-3",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Extra info"
},
{
"language_code": "es_es",
"string": "Información extra"
}
]
}
],
"settings": [
{
"function": "RUN",
"events": ["run"],
"type": "text.select",
"default_value": "disabled",
"options": [
"disabled",
"once",
"schedule",
"always_after_scan",
"on_new_device"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "When to run"
},
{
"language_code": "es_es",
"string": "Cuando ejecutar"
}
],
"description": [
{
"language_code": "en_us",
"string": "Enable a regular scan of rogue DHCP servers. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) or after you update your settings. ⚠ Use the same schedule if you have multiple <i class=\"fa-solid fa-magnifying-glass-plus\"></i> Device scanners enabled."
},
{
"language_code": "es_es",
"string": "Habilite un escaneo regular de servidores DHCP no autorizados. Si selecciona <code>schedule</code>, se aplican las configuraciones de programación de abajo. Si selecciona <code>once</code>, el análisis se ejecuta solo una vez al inicio de la aplicación (contenedor) o después de actualizar su configuración."
}
]
},
{
"function": "CMD",
"type": "text",
"default_value": "python3 /app/front/plugins/dhcp_servers/script.py",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Command"
},
{
"language_code": "es_es",
"string": "Comando"
}
],
"description": [
{
"language_code": "en_us",
"string": "Command to run"
},
{
"language_code": "es_es",
"string": "Comando a ejecutar"
}
]
},
{
"function": "RUN_SCHD",
"type": "text",
"default_value": "0 2 * * *",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Schedule"
},
{
"language_code": "es_es",
"string": "Programar"
}
],
"description": [
{
"language_code": "en_us",
"string": "Only enabled if you select <code>schedule</code> in the <a href=\"#DHCPSRVS_RUN\"><code>DHCPSRVS_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). For example entering <code>0 4 * * *</code> will run the scan after 4 am in the <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes."
},
{
"language_code": "es_es",
"string": "Solo está habilitado si selecciona <code>schedule</code> en la configuración de <a href=\"#DHCPSRVS_RUN\"><code>DHCPSRVS_RUN</code></a>. Asegúrese de ingresar la programación en el formato similar a cron correcto (por ejemplo, valide en <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutará el escaneo después de las 4 a.m. en el <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ código> que configuró arriba</a>. Se ejecutará la PRÓXIMA vez que pase el tiempo."
}
]
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
"default_value": 10,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Run timeout"
},
{
"language_code": "es_es",
"string": "Tiempo de espera de ejecución"
},
{
"language_code": "de_de",
"string": "Wartezeit"
}
],
"description": [
{
"language_code": "en_us",
"string": "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
},
{
"language_code": "es_es",
"string": "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela."
}
]
},
{
"function": "WATCH",
"type": "text.multiselect",
"default_value": ["Watched_Value1"],
"options": [
"Watched_Value1",
"Watched_Value2",
"Watched_Value3",
"Watched_Value4"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Watched"
},
{
"language_code": "es_es",
"string": "Visto"
}
],
"description": [
{
"language_code": "en_us",
"string": "Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is Domain Name Server</li><li><code>Watched_Value2</code> is IP Offered</li><li><code>Watched_Value3</code> is Interface </li><li><code>Watched_Value4</code> is Router </li></ul>"
},
{
"language_code": "es_es",
"string": "Envíe una notificación si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>Watched_Value1</code> es servidor de nombres de dominio</li><li><code>Watched_Value2</code> es IP ofrecida</li><li><code>Watched_Value3</code> es Interfaz </li><li><code>Watched_Value4</code> es enrutador </li></ul>"
}
]
},
{
"function": "REPORT_ON",
"type": "text.multiselect",
"default_value": ["new", "watched-changed"],
"options": ["new", "watched-changed", "watched-not-changed"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Report on"
},
{
"language_code": "es_es",
"string": "Informar sobre"
}
],
"description": [
{
"language_code": "en_us",
"string": "Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed."
},
{
"language_code": "es_es",
"string": "Envíe una notificación solo en estos estados. <code>new</code> significa que se descubrió un nuevo objeto único (una combinación única de PrimaryId y SecondaryId). <code>watched-changed</code> significa que las columnas <code>Watched_ValueN</code> seleccionadas cambiaron."
}
]
}
]
}

View File

@@ -6,11 +6,7 @@
"enabled": true,
"data_source": "template",
"show_ui": false,
"localized": [
"display_name",
"description",
"icon"
],
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
@@ -159,9 +155,7 @@
],
"type": "string",
"default_value": "1",
"localized": [
"name"
]
"localized": ["name"]
},
{
"name": [
@@ -172,9 +166,7 @@
],
"type": "string",
"default_value": "device_down",
"localized": [
"name"
]
"localized": ["name"]
},
{
"name": [
@@ -185,15 +177,10 @@
],
"type": "integer",
"default_value": 3,
"localized": [
"name"
]
"localized": ["name"]
}
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -213,10 +200,7 @@
"maxLength": 50,
"default_value": [],
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -235,10 +219,7 @@
"type": "text",
"default_value": "UPDATE Devices SET dev_AlertDeviceDown = {KNWN_dev_AlertDeviceDown}, dev_AlertEvents = {KNWN_dev_AlertEvents} WHERE dev_MAC in ({target_macs})",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -258,10 +239,7 @@
"maxLength": 50,
"default_value": "(unknown)",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -284,10 +262,7 @@
"override": false
},
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -307,10 +282,7 @@
"maxLength": 30,
"default_value": "",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -330,10 +302,7 @@
"maxLength": 250,
"default_value": "",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -355,10 +324,7 @@
"override": false
},
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -381,10 +347,7 @@
"override": false
},
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -403,10 +366,7 @@
"type": "string",
"default_value": "",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -426,10 +386,7 @@
"format": "date-time",
"default_value": "",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -449,10 +406,7 @@
"format": "date-time",
"default_value": "",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -472,10 +426,7 @@
"maxLength": 50,
"default_value": "",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -497,10 +448,7 @@
"override": true
},
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -522,10 +470,7 @@
"override": true
},
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -547,10 +492,7 @@
"override": false
},
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -572,10 +514,7 @@
"override": true
},
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -594,10 +533,7 @@
"type": "integer.checkbox",
"default_value": 0,
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -616,10 +552,7 @@
"type": "integer",
"default_value": 0,
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -639,10 +572,7 @@
"format": "date-time",
"default_value": "",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -661,10 +591,7 @@
"type": "integer.checkbox",
"default_value": 1,
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -683,10 +610,7 @@
"type": "integer.checkbox",
"default_value": true,
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -706,10 +630,7 @@
"maxLength": 250,
"default_value": "",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -728,10 +649,7 @@
"type": "integer.checkbox",
"default_value": 0,
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -750,10 +668,7 @@
"type": "string",
"default_value": "",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -772,10 +687,7 @@
"type": "readonly",
"default_value": 0,
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -794,10 +706,7 @@
"type": "string",
"default_value": "",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -835,4 +744,4 @@
"dev_Icon"
],
"additionalProperties": false
}
}

View File

@@ -1,6 +1,9 @@
## Overview
Plugin to run regular Internet connectivity and IP checks.
Plugin to run regular Internet connectivity and IP checks. Change the [dig utility](https://linux.die.net/man/1/dig) arguments if you have issues resolving your Internet IP. Arguments are added at the end of the following command: `dig +short`. Tested with:
- `@ns1.google.com -t txt o-o.myaddr.l.google.com`
- `-4 myip.opendns.com @resolver1.opendns.com`
### Usage

View File

@@ -15,11 +15,7 @@
],
"data_source": "script",
"show_ui": true,
"localized": [
"display_name",
"description",
"icon"
],
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
@@ -66,21 +62,11 @@
"settings": [
{
"function": "RUN",
"events": [
"run"
],
"events": ["run"],
"type": "text.select",
"default_value": "schedule",
"options": [
"disabled",
"once",
"schedule",
"always_after_scan"
],
"localized": [
"name",
"description"
],
"options": ["disabled", "once", "schedule", "always_after_scan"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -111,10 +97,7 @@
"type": "readonly",
"default_value": "python3 /app/front/plugins/internet_ip/script.py prev_ip={prev_ip} INTRNT_DIG_GET_IP_ARG={INTRNT_DIG_GET_IP_ARG}",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -149,10 +132,7 @@
"type": "text",
"default_value": "-4 myip.opendns.com @resolver1.opendns.com",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -170,7 +150,7 @@
"description": [
{
"language_code": "en_us",
"string": "Change the <a href=\"https://linux.die.net/man/1/dig\" target=\"_blank\">dig utility</a> arguments if you have issues resolving your Internet IP. Arguments are added at the end of the following command: <code>dig +short </code>."
"string": "Change the <a href=\"https://linux.die.net/man/1/dig\" target=\"_blank\">dig utility</a> arguments if you have issues resolving your Internet IP. Arguments are added at the end of the following command: <code>dig +short </code>. Tested with: <br/> <ul> <li><code>@ns1.google.com -t txt o-o.myaddr.l.google.com</code></li><li> <code>-4 myip.opendns.com @resolver1.opendns.com</code></li></ul>"
},
{
"language_code": "es_es",
@@ -187,10 +167,7 @@
"type": "text",
"default_value": "*/5 * * * *",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -225,10 +202,7 @@
"type": "integer",
"default_value": 30,
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -258,22 +232,36 @@
}
]
},
{
"function": "RETRIES",
"type": "integer",
"default_value": 3,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Retries"
}
],
"description": [
{
"language_code": "en_us",
"string": "Number of retries before Internet is marked as unreachable. Exponential backoff strategy is used between tries (1s - 1st retry, 2s - 2nd retry, etc)."
}
]
},
{
"function": "WATCH",
"type": "text.multiselect",
"default_value": [
"Watched_Value1"
],
"default_value": ["Watched_Value1"],
"options": [
"Watched_Value1",
"Watched_Value2",
"Watched_Value3",
"Watched_Value4"
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -302,20 +290,14 @@
{
"function": "REPORT_ON",
"type": "text.multiselect",
"default_value": [
"new",
"watched-changed"
],
"default_value": ["new", "watched-changed"],
"options": [
"new",
"watched-changed",
"watched-not-changed",
"missing-in-last-scan"
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -355,9 +337,7 @@
"type": "device_name_mac",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -381,9 +361,7 @@
"type": "device_ip",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -406,9 +384,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -424,14 +400,29 @@
"column": "Watched_Value2",
"css_classes": "col-sm-2",
"show": true,
"type": "textarea_readonly",
"default_value":"",
"type": "textarea_readonly",
"default_value": "",
"options": [],
"localized": ["name"],
"name":[
"name": [
{
"language_code": "en_us",
"string" : "Response"
"string": "Response"
}
]
},
{
"column": "Watched_Value3",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value": "",
"options": [],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
"string": "Retries needed"
}
]
},
@@ -446,9 +437,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -471,9 +460,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -497,9 +484,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -539,9 +524,7 @@
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -558,4 +541,4 @@
]
}
]
}
}

View File

@@ -1,6 +1,7 @@
#!/usr/bin/env python
import os
import time
import pathlib
import argparse
import sys
@@ -29,6 +30,8 @@ RESULT_FILE = os.path.join(CUR_PATH, 'last_result.log')
pluginName = 'INTRNT'
no_internet_ip = '0.0.0.0'
def main():
mylog('verbose', [f'[{pluginName}] In script'])
@@ -45,13 +48,20 @@ def main():
mylog('verbose', [f'[{pluginName}] INTRNT_DIG_GET_IP_ARG: ', DIG_GET_IP_ARG])
# Decode the base64-encoded value to get the actual value in ASCII format.
# DIG_GET_IP_ARG = base64.b64decode(DIG_GET_IP_ARG).decode('ascii')
# mylog('verbose', [f'[{pluginName}] DIG_GET_IP_ARG resolved: {DIG_GET_IP_ARG} '])
# perform the new IP lookup N times specified by the INTRNT_TRIES setting
new_internet_IP = ""
INTRNT_RETRIES = get_setting_value("INTRNT_RETRIES")
retries_needed = 0
# perform the new IP lookup
new_internet_IP, cmd_output = check_internet_IP( PREV_IP, DIG_GET_IP_ARG)
for i in range(INTRNT_RETRIES + 1):
new_internet_IP, cmd_output = check_internet_IP( PREV_IP, DIG_GET_IP_ARG)
if new_internet_IP == no_internet_ip:
time.sleep(1*i) # Exponential backoff strategy
else:
retries_needed = i
break
plugin_objects = Plugin_Objects(RESULT_FILE)
@@ -60,7 +70,7 @@ def main():
secondaryId = new_internet_IP, # IP Address
watched1 = f'Previous IP: {PREV_IP}',
watched2 = cmd_output.replace('\n',''),
watched3 = '',
watched3 = retries_needed,
watched4 = '',
extra = f'Previous IP: {PREV_IP}',
foreignKey = 'Internet')
@@ -84,7 +94,7 @@ def check_internet_IP ( PREV_IP, DIG_GET_IP_ARG ):
mylog('verbose', [f'[{pluginName}] Current internet_IP : {internet_IP}'])
# Check previously stored IP
previous_IP = '0.0.0.0'
previous_IP = no_internet_ip
if PREV_IP is not None and len(PREV_IP) > 0 :
previous_IP = PREV_IP
@@ -116,7 +126,7 @@ def get_internet_IP (DIG_GET_IP_ARG):
# Handle invalid response
if IP == '':
IP = '0.0.0.0'
IP = no_internet_ip
return IP, cmd_output

View File

@@ -5,11 +5,7 @@
"enabled": true,
"data_source": "script",
"show_ui": true,
"localized": [
"display_name",
"description",
"icon"
],
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
@@ -49,9 +45,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -74,9 +68,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -99,9 +91,7 @@
"type": "url",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -120,9 +110,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -145,9 +133,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -166,9 +152,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -208,9 +192,7 @@
"hexColor": "#05483C"
}
],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -246,9 +228,7 @@
"hexColor": "#05483C"
}
],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -267,9 +247,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -292,9 +270,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -317,9 +293,7 @@
"type": "textbox_save",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -359,9 +333,7 @@
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
}
],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -384,9 +356,7 @@
"type": "label",
"default_value": "",
"options": [],
"localized": [
"name"
],
"localized": ["name"],
"name": [
{
"language_code": "en_us",
@@ -406,21 +376,11 @@
"settings": [
{
"function": "RUN",
"events": [
"run"
],
"events": ["run"],
"type": "text.select",
"default_value": "disabled",
"options": [
"disabled",
"once",
"schedule",
"always_after_scan"
],
"localized": [
"name",
"description"
],
"options": ["disabled", "once", "schedule", "always_after_scan"],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -451,10 +411,7 @@
"type": "readonly",
"default_value": "python3 /app/front/plugins/internet_speedtest/script.py",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -489,10 +446,7 @@
"type": "text",
"default_value": "*/30 * * * *",
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -527,10 +481,7 @@
"type": "integer",
"default_value": 60,
"options": [],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -570,10 +521,7 @@
"Watched_Value3",
"Watched_Value4"
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -609,10 +557,7 @@
"watched-not-changed",
"missing-in-last-scan"
],
"localized": [
"name",
"description"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
@@ -643,4 +588,4 @@
]
}
]
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -3,14 +3,14 @@
"unique_prefix": "MAINT",
"plugin_type": "system",
"enabled": true,
"data_source": "script",
"data_source": "script",
"show_ui": false,
"localized": ["display_name", "description", "icon"],
"display_name": [
{
"language_code": "en_us",
"string": "Maintenance"
}
}
],
"icon": [
{
@@ -24,33 +24,42 @@
"string": "A plugin for maintenance tasks."
}
],
"params" : [
],
"params": [],
"settings": [
{
"function": "RUN",
"events": ["run"],
"type": "text.select",
"default_value":"schedule",
"options": ["disabled", "once", "schedule", "always_after_scan", "on_new_device"],
"function": "RUN",
"events": ["run"],
"type": "text.select",
"default_value": "schedule",
"options": [
"disabled",
"once",
"schedule",
"always_after_scan",
"on_new_device"
],
"localized": ["name", "description"],
"name" :[{
"language_code":"en_us",
"string" : "When to run"
},
{
"language_code":"es_es",
"string" : "Cuándo ejecutar"
},
{
"language_code":"de_de",
"string" : "Wann laufen"
}],
"description": [{
"language_code":"en_us",
"string" : "When the maintenance tasks should run. A daily or weekly <code>SCHEDULE</code> is a good option."
}]
},
"name": [
{
"language_code": "en_us",
"string": "When to run"
},
{
"language_code": "es_es",
"string": "Cuándo ejecutar"
},
{
"language_code": "de_de",
"string": "Wann laufen"
}
],
"description": [
{
"language_code": "en_us",
"string": "When the maintenance tasks should run. A daily or weekly <code>SCHEDULE</code> is a good option."
}
]
},
{
"function": "CMD",
"type": "readonly",
@@ -69,7 +78,7 @@
{
"language_code": "de_de",
"string": "Befehl"
}
}
],
"description": [
{
@@ -83,40 +92,44 @@
{
"language_code": "de_de",
"string": "Befehl zum Ausführen. Dies kann nicht geändert werden"
}
}
]
},
{
"function": "RUN_SCHD",
"type": "text",
"default_value":"0 2 * * 3",
"default_value": "0 2 * * *",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Schedule"
},
{
"language_code":"es_es",
"string" : "Schedule"
},
{
"language_code":"de_de",
"string" : "Schedule"
}],
"description": [{
"language_code":"en_us",
"string" : "Only enabled if you select <code>schedule</code> in the <a href=\"#MAINT_RUN\"><code>MAINT_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). For example entering <code>0 4 * * *</code> will run the scan after 4 am in the <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes."
},
{
"language_code":"es_es",
"string" : "Solo está habilitado si selecciona <code>schedule</code> en la configuración <a href=\"#MAINT_RUN\"><code>MAINT_RUN</code></a>. Asegúrese de ingresar la programación en el formato similar a cron correcto (por ejemplo, valide en <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutará el escaneo después de las 4 a.m. en el <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ código> que configuró arriba</a>. Se ejecutará la PRÓXIMA vez que pase el tiempo."
},
{
"language_code":"de_de",
"string" : "Nur aktiviert, wenn Sie <code>schedule</code> in der <a href=\"#CSVBCKP_RUN\"><code>CSVBCKP_RUN</code>-Einstellung</a> auswählen. Stellen Sie sicher, dass Sie den Zeitplan im richtigen Cron-ähnlichen Format eingeben (z. B. validieren unter <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Wenn Sie beispielsweise <code>0 4 * * *</code> eingeben, wird der Scan nach 4 Uhr morgens in der <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ ausgeführt. Code> den Sie oben festgelegt haben</a>. Wird das NÄCHSTE Mal ausgeführt, wenn die Zeit vergeht."
}]
},
"name": [
{
"language_code": "en_us",
"string": "Schedule"
},
{
"language_code": "es_es",
"string": "Schedule"
},
{
"language_code": "de_de",
"string": "Schedule"
}
],
"description": [
{
"language_code": "en_us",
"string": "Only enabled if you select <code>schedule</code> in the <a href=\"#MAINT_RUN\"><code>MAINT_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). For example entering <code>0 4 * * *</code> will run the scan after 4 am in the <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes."
},
{
"language_code": "es_es",
"string": "Solo está habilitado si selecciona <code>schedule</code> en la configuración <a href=\"#MAINT_RUN\"><code>MAINT_RUN</code></a>. Asegúrese de ingresar la programación en el formato similar a cron correcto (por ejemplo, valide en <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutará el escaneo después de las 4 a.m. en el <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ código> que configuró arriba</a>. Se ejecutará la PRÓXIMA vez que pase el tiempo."
},
{
"language_code": "de_de",
"string": "Nur aktiviert, wenn Sie <code>schedule</code> in der <a href=\"#CSVBCKP_RUN\"><code>CSVBCKP_RUN</code>-Einstellung</a> auswählen. Stellen Sie sicher, dass Sie den Zeitplan im richtigen Cron-ähnlichen Format eingeben (z. B. validieren unter <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Wenn Sie beispielsweise <code>0 4 * * *</code> eingeben, wird der Scan nach 4 Uhr morgens in der <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</ ausgeführt. Code> den Sie oben festgelegt haben</a>. Wird das NÄCHSTE Mal ausgeführt, wenn die Zeit vergeht."
}
]
},
{
"function": "RUN_TIMEOUT",
"type": "integer",
@@ -135,7 +148,7 @@
{
"language_code": "de_de",
"string": "Zeitüberschreitung"
}
}
],
"description": [
{
@@ -149,7 +162,7 @@
{
"language_code": "de_de",
"string": "Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei Überschreitung dieser Zeit wird das Skript abgebrochen."
}
}
]
},
{
@@ -158,19 +171,20 @@
"default_value": 250000,
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Log length"
}],
"description": [{
"language_code":"en_us",
"string" : "How many last <code>app.log</code> lines to keep. If <code>LOG_LEVEL</code> is set to <code>debug</code> the app generates about 10000 lines per hour, so when debugging an issue the recommended setting should cover the bug occurence timeframe. For example for a bug with a 3 day periodical appearence the value <code>1000000</code> should be sufficient. Setting this value to <code>1000000</code> generates approximatelly a 50MB <code>app.log</code> file. Set to <code>0</code> to disable log purging."
}]
"name": [
{
"language_code": "en_us",
"string": "Log length"
}
],
"description": [
{
"language_code": "en_us",
"string": "How many last <code>app.log</code> lines to keep. If <code>LOG_LEVEL</code> is set to <code>debug</code> the app generates about 10000 lines per hour, so when debugging an issue the recommended setting should cover the bug occurence timeframe. For example for a bug with a 3 day periodical appearence the value <code>1000000</code> should be sufficient. Setting this value to <code>1000000</code> generates approximatelly a 50MB <code>app.log</code> file. Set to <code>0</code> to disable log purging."
}
]
}
],
"database_column_definitions":
[
]
"database_column_definitions": []
}

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More