Compare commits

..

117 Commits

Author SHA1 Message Date
jokob-sk
dbf7104dd0 docs, smtp logging 2025-07-04 07:41:01 +10:00
jokob-sk
1f26de4b76 docs, smtp logging 2025-07-04 07:21:18 +10:00
jokob-sk
ad43e4a2b2 docs
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-07-03 07:42:10 +10:00
jokob-sk
171feda4fe docs 2025-07-03 07:41:10 +10:00
jokob-sk
e5a4e07b8b Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2025-07-03 07:40:09 +10:00
anton garcias
44a5600108 Translated using Weblate (Catalan)
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Currently translated at 98.4% (739 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ca/
2025-07-02 03:01:52 +02:00
Ondřej Karaffa
d059c5c584 Translated using Weblate (Czech)
Currently translated at 7.9% (60 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/cs/
2025-07-02 03:01:51 +02:00
Ondřej Karaffa
523ff8e877 Translated using Weblate (Czech)
Currently translated at 7.9% (60 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/cs/
2025-07-02 03:01:50 +02:00
Ondřej Karaffa
ba9115bac1 Translated using Weblate (Czech)
Currently translated at 7.9% (60 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/cs/
2025-07-02 03:01:49 +02:00
Massimo Pissarello
11f6f50748 Translated using Weblate (Italian)
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2025-07-02 03:01:47 +02:00
jokob-sk
d85c52bceb Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2025-07-01 07:51:01 +10:00
jokob-sk
9cf1d7b461 lang 2025-07-01 07:50:57 +10:00
Hosted Weblate
e7a2a53d18 Merge branch 'origin/main' into Weblate.
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
2025-06-30 07:38:01 +02:00
Ettore Atalan
1ffdfc17fb Translated using Weblate (German)
Currently translated at 89.4% (672 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2025-06-30 07:38:01 +02:00
jokob-sk
190c6fb007 refactor db upgrade 2025-06-30 15:37:40 +10:00
Максим Горпиніч
0cd806fb74 Translated using Weblate (Ukrainian)
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/uk/
2025-06-29 09:02:07 +02:00
Sylvain Pichon
9f55471f0f Translated using Weblate (Catalan)
Currently translated at 97.3% (731 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ca/
2025-06-29 09:02:07 +02:00
HAMAD ABDULLA
4add27e83c Translated using Weblate (Arabic)
Currently translated at 98.4% (739 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ar/
2025-06-29 09:02:06 +02:00
Sylvain Pichon
7a3ab14fca Translated using Weblate (Turkish)
Currently translated at 66.1% (497 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/tr/
2025-06-29 09:02:04 +02:00
Sylvain Pichon
589af685ac Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 81.7% (614 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/zh_Hans/
2025-06-29 09:02:03 +02:00
Sylvain Pichon
8cb861df6c Translated using Weblate (Polish)
Currently translated at 81.3% (611 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/pl/
2025-06-29 09:02:01 +02:00
Sylvain Pichon
5ebda7eb1a Translated using Weblate (Portuguese (Brazil))
Currently translated at 57.5% (432 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/pt_BR/
2025-06-29 09:01:59 +02:00
Massimo Pissarello
e3bbd509c3 Translated using Weblate (Italian)
Currently translated at 98.4% (739 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2025-06-29 09:01:57 +02:00
Sylvain Pichon
65acca5380 Translated using Weblate (Norwegian Bokmål)
Currently translated at 80.6% (606 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/nb_NO/
2025-06-29 09:01:54 +02:00
Sylvain Pichon
e1d4a80e57 Translated using Weblate (French)
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/fr/
2025-06-29 09:01:52 +02:00
Sylvain Pichon
08f1db2641 Translated using Weblate (Spanish)
Currently translated at 97.3% (731 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2025-06-29 09:01:50 +02:00
Sylvain Pichon
d78b0b3929 Translated using Weblate (German)
Currently translated at 88.5% (665 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2025-06-29 09:01:48 +02:00
jokob-sk
14f376cacb Merge branch 'main' of https://github.com/jokob-sk/NetAlertX
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-06-28 16:58:50 +10:00
jokob-sk
8ccbc12024 docs + hiding archived devices in Network view 2025-06-28 16:58:37 +10:00
jokob-sk
c646c36f4f docs + hiding archived devices in Network view 2025-06-28 16:46:05 +10:00
Safeguard
d5a5e7bcf9 Translated using Weblate (Russian)
Some checks failed
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
Code checks / check-url-paths (push) Has been cancelled
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
2025-06-27 11:01:49 +02:00
jokob-sk
73f6e6d785 docs #1095
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-06-27 07:24:40 +10:00
Hosted Weblate
87b36562cc Merge branch 'origin/main' into Weblate.
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-06-26 04:25:52 +00:00
Максим Горпиніч
7406b6688d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/uk/
2025-06-26 04:25:50 +00:00
Sylvain Pichon
f58dd121d5 Translated using Weblate (French)
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/fr/
2025-06-26 04:25:49 +00:00
jokob-sk
443b10a990 docs 2025-06-26 14:25:20 +10:00
jokob-sk
e8e48a2cc4 integer causing normalization issue in MQTT #1102
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-06-26 07:25:10 +10:00
Ashtin
94edcee382 Translated using Weblate (Ukrainian)
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Currently translated at 98.5% (740 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/uk/
2025-06-25 21:46:40 +02:00
Ashtin
737a53a589 Translated using Weblate (Catalan)
Currently translated at 97.3% (731 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ca/
2025-06-25 21:46:39 +02:00
Ashtin
85bff56bd5 Translated using Weblate (Arabic)
Currently translated at 98.5% (740 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ar/
2025-06-25 21:46:39 +02:00
Ashtin
0f149098a3 Translated using Weblate (Czech)
Currently translated at 1.1% (9 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/cs/
2025-06-25 21:46:38 +02:00
Ashtin
13b5b145e4 Translated using Weblate (Turkish)
Currently translated at 66.1% (497 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/tr/
2025-06-25 21:46:38 +02:00
Ashtin
a050beea72 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 81.7% (614 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/zh_Hans/
2025-06-25 21:46:38 +02:00
Ashtin
3952e8dd91 Translated using Weblate (Polish)
Currently translated at 81.3% (611 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/pl/
2025-06-25 21:46:37 +02:00
Ashtin
68f3c02eb9 Translated using Weblate (Portuguese (Brazil))
Currently translated at 57.5% (432 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/pt_BR/
2025-06-25 21:46:37 +02:00
Ashtin
b4c2703cbb Translated using Weblate (Italian)
Currently translated at 98.5% (740 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2025-06-25 21:46:37 +02:00
Ashtin
cb4fda1786 Translated using Weblate (Russian)
Currently translated at 98.4% (739 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
2025-06-25 21:46:37 +02:00
Ashtin
058b17fcbc Translated using Weblate (Norwegian Bokmål)
Currently translated at 80.6% (606 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/nb_NO/
2025-06-25 21:46:37 +02:00
Ashtin
9bfdc7209b Translated using Weblate (French)
Currently translated at 98.5% (740 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/fr/
2025-06-25 21:46:37 +02:00
Ashtin
1a44e84112 Translated using Weblate (Spanish)
Currently translated at 97.3% (731 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2025-06-25 21:46:36 +02:00
Ashtin
b722fcbe6e Translated using Weblate (German)
Currently translated at 88.5% (665 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2025-06-25 21:46:36 +02:00
Ashtin
d1d26409fc Translated using Weblate (English (United States))
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/en_US/
2025-06-25 21:46:36 +02:00
Jokob @NetAlertX
fef1e17935 Merge pull request #1101 from slammingprogramming/docs-overhaul
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Improvements
2025-06-25 20:43:22 +10:00
Ashtin
5a3782c9f1 Improvements
Fixes a few things here and there
2025-06-25 06:40:10 -04:00
Jokob @NetAlertX
27e9472ce1 Merge pull request #1099 from slammingprogramming/docs-overhaul
Docs overhaul
2025-06-25 20:11:32 +10:00
Ashtin
23a0a98b4f Remove screenshots link from table of contents
They'll find it if they want to see them.
2025-06-25 05:26:29 -04:00
Ashtin
e724c22941 REALLY fix screenshots this time 2025-06-25 05:25:28 -04:00
Ashtin
27d69ff5ed Fix screenshots link 2025-06-25 05:24:41 -04:00
Ashtin
cb2cce5326 Add more issue templates
Adds templates for enhancements to differentiate enhancing existing features and adding whole new ones.

Refactor/Code quality is mostly for dev/contributor use for doc purposes.

Security report is essential and also directs them to reach out with sensitive details directly

Translation requests added to allow additional accessibility to be requested as-needed and to allow prioritization based on need.
2025-06-25 05:17:34 -04:00
Ashtin
e790ca2257 Add Pull Request templates
Add code pr template and docs pr template for conformity.
2025-06-25 05:05:09 -04:00
Ashtin
70a0f9260a Reword and update Security docs
Add Responsibility disclaimer

Add TLDR

Add more formatting

Deep dives into configurations more specifically

Adds responsible disclosure section
2025-06-25 05:00:51 -04:00
Ashtin
23003aa82f Update contributing page
Updated the page for better readability, additional information, and to add recent additions in this branch to it
2025-06-25 04:51:27 -04:00
Jokob @NetAlertX
cc51391d14 Merge pull request #1098 from slammingprogramming/fix-numeric-hostnames
Sanitize hostnames, macs, and vendor names before running .lower/.upper on them to prevent AttributeError
2025-06-25 18:49:48 +10:00
Ashtin
9242a8f55d Add Code of Conduct
Adding Contributor Covenant v2.1 with a special ethical clause specific to NetAlertX
2025-06-25 04:48:46 -04:00
Jokob @NetAlertX
6b32190acd Merge pull request #1097 from slammingprogramming/docs-update
add documentation feedback issue template
2025-06-25 18:48:28 +10:00
Ashtin
69834c7771 Freshen up the README
Add Table of Contents

Add Quick Start guide for Docker and Home Assistant

Fix typo in line 67 (was 33) lits -> list

Add Security & Privacy section

Add FAQ

Add Known Issues
2025-06-25 04:41:08 -04:00
Ashtin
3513fc9617 Update device_handling.py
Fixes #1088 by sanitizing the inputs to mac, vendor, and name before running .upper/.lower to ensure they are type STR to avoid AttributeError
2025-06-25 03:59:29 -04:00
Ashtin
1348987f08 add documentation feedback issue template
Adds a new GitHub issue template for reporting documentation-related suggestions, inconsistencies, or improvements.

This template helps contributors provide clear, categorized feedback on docs, making it easier to track and prioritize structural or content-related issues separately from codebase bugs or feature requests.

Includes fields for:
- Affected document/section
- Description of the issue
- Proposed solution
- Type of documentation issue
- Optional implementation offer

Helps improve overall clarity, uniformity, and contributor experience with documentation.
2025-06-25 03:20:54 -04:00
jokob-sk
b31dff2815 docs
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-06-24 19:57:24 +10:00
jokob-sk
3483d833a0 docs
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
2025-06-23 08:38:27 +10:00
jokob-sk
ddad1468d9 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2025-06-23 08:12:17 +10:00
jokob-sk
f20fc8e123 docs 2025-06-23 08:12:06 +10:00
Jokob @NetAlertX
3bffb2d8f5 Merge pull request #1091 from slammingprogramming/revert-1089-main
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
Revert "Sanitize device fields and prevent crash with numeric hostnames"
2025-06-21 11:32:20 +10:00
Ashtin
0bd4a7b8dd Revert "Sanitize device fields and prevent crash with numeric hostnames" 2025-06-20 21:22:35 -04:00
Jokob @NetAlertX
69d79dbd7c Merge pull request #1089 from slammingprogramming/main
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Sanitize device fields and prevent crash with numeric hostnames
2025-06-20 15:52:45 +10:00
Ashtin
31806c707f Fixed, Again
Fixes #1088 again. turns out that same thing is used twice. same fix applied
2025-06-20 01:25:04 -04:00
Ashtin
2a4198c2c8 Sanitize device fields and prevent crash with numeric hostnames
This patch improves the resilience of the guess_icon function by sanitizing mac, vendor, and name fields to avoid crashes caused by unexpected data types (e.g., numeric hostnames).

Specifically:

mac is now cast to a string before being uppercased, with a newly added fallback to "00:00:00:00:00:00" if empty or invalid.

vendor is sanitized to a string before lowercasing, still defaulting to "unknown".

name is cast to a string before lowercasing, still falling back to "(unknown)" when empty.

This change not only resolves the error caused by numeric-only hostnames (which triggered an AttributeError due to calling .lower() on an int), but also proactively prevents similar crashes from malformed or unexpected input in the future.

References: Fixes issue #1088 and also let's me sleep a little easier tonight.
2025-06-20 00:46:24 -04:00
Hosted Weblate
cecfe60bac Merge branch 'origin/main' into Weblate.
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-06-20 01:33:42 +02:00
HAMAD ABDULLA
ef42eb1fef Translated using Weblate (Arabic)
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ar/
2025-06-20 01:33:38 +02:00
jokob-sk
1e2be52371 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2025-06-20 09:32:25 +10:00
jokob-sk
0034e49c1a case insentive sorting #1087 2025-06-20 09:32:06 +10:00
Максим Горпиніч
350412be33 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/uk/
2025-06-19 23:24:20 +02:00
HAMAD ABDULLA
c9312719ea Translated using Weblate (Arabic)
Currently translated at 3.0% (23 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ar/
2025-06-19 23:24:20 +02:00
Massimo Pissarello
3010bbf1df Translated using Weblate (Italian)
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2025-06-19 16:43:17 +02:00
Максим Горпиніч
59d5f1053f Translated using Weblate (Ukrainian)
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/uk/
2025-06-18 17:31:31 +02:00
Sylvain Pichon
ae81b86e78 Translated using Weblate (French)
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/fr/
2025-06-18 17:31:31 +02:00
Sylvain Pichon
1f80a7d8ca Translated using Weblate (English (United States))
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/en_US/
2025-06-18 17:31:30 +02:00
Anonymous
047797daf2 Translated using Weblate (Ukrainian)
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Currently translated at 99.8% (750 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/uk/
2025-06-17 22:41:36 +02:00
Anonymous
f62e0513f9 Translated using Weblate (Catalan)
Currently translated at 98.6% (741 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ca/
2025-06-17 22:41:35 +02:00
Anonymous
b7471fd91c Translated using Weblate (Turkish)
Currently translated at 67.1% (504 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/tr/
2025-06-17 22:41:35 +02:00
Anonymous
0e8f8a09cb Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 83.0% (624 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/zh_Hans/
2025-06-17 22:41:35 +02:00
Anonymous
8cc85a3203 Translated using Weblate (Polish)
Currently translated at 82.6% (621 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/pl/
2025-06-17 22:41:35 +02:00
Anonymous
8f41d71ac4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 58.1% (437 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/pt_BR/
2025-06-17 22:41:35 +02:00
Anonymous
470d362ab4 Translated using Weblate (Italian)
Currently translated at 99.8% (750 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2025-06-17 22:41:35 +02:00
Anonymous
a342f73f68 Translated using Weblate (Norwegian Bokmål)
Currently translated at 82.0% (616 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/nb_NO/
2025-06-17 22:41:34 +02:00
Anonymous
05842ab4a0 Translated using Weblate (French)
Currently translated at 99.8% (750 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/fr/
2025-06-17 22:41:34 +02:00
Anonymous
b54d95e5af Translated using Weblate (Spanish)
Currently translated at 98.6% (741 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2025-06-17 22:41:33 +02:00
Anonymous
202dcf16b9 Translated using Weblate (German)
Currently translated at 89.7% (674 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2025-06-17 22:41:33 +02:00
jokob-sk
153383343b Merge branch 'main' of https://github.com/jokob-sk/NetAlertX
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-06-17 20:18:23 +10:00
jokob-sk
6f138d95ca docs 2025-06-17 20:18:18 +10:00
Safeguard
e3bbb0afff Translated using Weblate (Russian)
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
2025-06-15 00:01:49 +02:00
jokob-sk
8e05e5739b Merge branch 'main' of https://github.com/jokob-sk/NetAlertX
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-06-14 11:57:42 +10:00
jokob-sk
7a2c4942bf achnged AVAHISCAN defaults #847 2025-06-14 11:57:37 +10:00
Jokob @NetAlertX
95189a9d4b Merge pull request #1085 from mathoudebine/patch-1
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
Update freebox.py: add missing entries in device_type_map
2025-06-12 06:59:50 +10:00
Matthieu Houdebine
ded15aa628 Update freebox.py: do not fail if unknown device type
If a new device type has not been mapped yet, do not fail the scan but return "Unknown" instead
2025-06-11 22:56:04 +02:00
Patrick Seidel
b1d74dcfea Translated using Weblate (German)
Currently translated at 89.8% (675 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2025-06-11 20:26:57 +02:00
Matthieu Houdebine
f4db748eae Update freebox.py: add missing entries in device_type_map
New entries extracted from latest Freebox Server web interface
2025-06-11 19:01:18 +02:00
jokob-sk
b797713b2d Merge branch 'main' of https://github.com/jokob-sk/NetAlertX
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-06-11 07:26:58 +10:00
jokob-sk
69cf4057ac FQDN incorrect check #1081, vendor work #1080 2025-06-11 07:26:52 +10:00
Jokob @NetAlertX
a1d5341840 Merge pull request #1076 from vladaurosh/main
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Updating base image to Alpine 3.22
2025-06-10 12:52:41 +10:00
vladaurosh
8b1e705a96 Updating base image to Alpine 3.22 2025-06-08 21:38:43 +01:00
jokob-sk
dff63b74f5 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
2025-06-08 08:55:13 +10:00
jokob-sk
f709c97602 GraphQL docs #1074 2025-06-08 08:55:06 +10:00
Jokob @NetAlertX
0b2a722218 Merge pull request #1075 from YouFoundAlpha/main
Added buymeacoffee to FUNDING.yml and move it to the correct directory
2025-06-08 07:53:10 +10:00
YouFoundAlpha
168275343c Move the FUNDING.yml to the .github directory 2025-06-07 22:10:52 +03:00
YouFoundAlpha
05335df9bf Add buymeacoffee to FUNDING.yml 2025-06-07 21:53:25 +03:00
GitHub Actions
de2e924aa2 Add release tweet for v25.6.7 - Legacy upgrade removal and Fully Qualified Domain Names 🆎
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-06-07 00:00:05 +00:00
72 changed files with 2225 additions and 1264 deletions

View File

@@ -1,2 +1,3 @@
github: jokob-sk
patreon: 84385063
buy_me_a_coffee: jokobsk

View File

@@ -0,0 +1,56 @@
name: Documentation Feedback 📝
description: Suggest improvements, clarify inconsistencies, or report issues related to the documentation.
labels: ['documentation 📚']
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: Please search to see if an open or closed issue already exists for the documentation change you're suggesting.
options:
- label: I have searched the existing open and closed issues
required: true
- type: textarea
attributes:
label: What document or section does this relate to?
description: |
Please include a link to the file and section, if applicable. Be specific about what part of the documentation you are referencing.
placeholder: e.g. https://github.com/jokob-sk/NetAlertX/blob/main/docs/FRONTEND_DEVELOPMENT.md
validations:
required: true
- type: textarea
attributes:
label: Describe the issue
description: A clear and concise explanation of the issue or inconsistency you found in the documentation.
placeholder: e.g. The linked file is referred to as "Contributor Guidelines" but only covers frontend topics.
validations:
required: true
- type: textarea
attributes:
label: Your suggestion or proposed solution
description: Suggest how the documentation could be improved, clarified, or reorganized.
placeholder: e.g. Combine frontend and backend development into a single CONTRIBUTING.md file with common sections to reduce fragmentation.
validations:
required: true
- type: checkboxes
attributes:
label: What type of issue is this?
options:
- label: Missing information
- label: Inaccurate or outdated information
- label: Unclear or confusing content
- label: Structure or organization improvements
- label: Other (explain in issue)
- type: textarea
attributes:
label: Anything else?
description: |
Additional context, references, screenshots, or related issues. You can also mention if youre willing to help implement the suggestion.
validations:
required: false
- type: checkboxes
attributes:
label: Can I help implement this? 👩‍💻👨‍💻
description: The maintainer can provide guidance and review your changes.
options:
- label: "Yes, Id like to help implement the improvement"
- label: "No, Im just suggesting the idea"

View File

@@ -0,0 +1,33 @@
name: Enhancement Request
description: Propose an improvement to an existing feature or UX behavior.
labels: ['enhancement ♻️']
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
options:
- label: I have searched existing open and closed issues
required: true
- type: textarea
attributes:
label: What is the enhancement?
description: Describe the change or optimization youd like to see to an existing feature.
placeholder: e.g. Make scan intervals configurable from UI instead of just `app.conf`
required: true
- type: textarea
attributes:
label: What problem does this solve or improve?
description: Describe why this change would improve user experience or project maintainability.
required: true
- type: textarea
attributes:
label: Additional context or examples
description: |
Screenshots? Comparisons? Reference repos?
required: false
- type: checkboxes
attributes:
label: Are you willing to help implement this?
options:
- label: "Yes"
- label: "No"

View File

@@ -0,0 +1,37 @@
name: Refactor / Code Quality Request ♻️
description: Suggest improvements to code structure, style, or maintainability.
labels: ['enhancement ♻️']
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: Please check if a similar request already exists.
options:
- label: I have searched the existing open and closed issues
required: true
- type: textarea
attributes:
label: What part of the code needs refactoring or improvement?
description: Specify files, modules, or components.
required: true
- type: textarea
attributes:
label: Describe the proposed changes
description: Explain the refactoring or quality improvements you suggest.
required: true
- type: textarea
attributes:
label: Why is this improvement needed?
description: Benefits such as maintainability, readability, performance, or scalability.
required: true
- type: textarea
attributes:
label: Additional context or examples
description: Any relevant links, references, or related issues.
required: false
- type: checkboxes
attributes:
label: Can you help implement this change?
options:
- label: Yes
- label: No

28
.github/ISSUE_TEMPLATE/security-report.yml vendored Executable file
View File

@@ -0,0 +1,28 @@
name: Security Report 🔐
description: Report a security vulnerability or concern privately.
labels: ['security 🔐']
body:
- type: markdown
attributes:
value: |
**Important:** For security reasons, please do **not** post sensitive security issues publicly in the issue tracker.
Instead, send details to our security contact email: [jokob@duck.com](mailto:jokob@duck.com).
We appreciate your responsible disclosure.
- type: textarea
attributes:
label: Brief summary (non-sensitive)
description: Provide a non-sensitive overview of the security issue.
required: true
- type: textarea
attributes:
label: Additional context or references
description: Any other information or related reports.
required: false
- type: checkboxes
attributes:
label: Have you sent this report via email to the security contact?
options:
- label: Yes, I have sent the details to jokob@duck.com
required: true
- label: Not yet, I will send it after opening this issue

View File

@@ -0,0 +1,36 @@
name: Translation / Localization Request 🌐
description: Suggest adding or improving translations or localization support.
labels: ['enhancement 🌐']
body:
- type: checkboxes
attributes:
label: Have you checked for existing translation efforts or related issues?
options:
- label: I have searched existing open and closed issues
required: true
- type: textarea
attributes:
label: Language(s) involved
description: Specify the language(s) this request pertains to.
required: true
- type: textarea
attributes:
label: Describe the translation or localization improvement
description: Examples include adding new language support, fixing translation errors, or improving formatting.
required: true
- type: textarea
attributes:
label: Why is this important for the project or users?
description: Describe the benefits or target audience.
required: false
- type: textarea
attributes:
label: Additional context or references
description: Link to files, previous translation PRs, or external resources.
required: false
- type: checkboxes
attributes:
label: Can you help with translation or review?
options:
- label: Yes
- label: No

View File

@@ -0,0 +1,53 @@
## 📌 Description
<!-- Provide a brief description of the changes you're introducing. Be clear and concise. -->
---
## 🔍 Related Issues
<!-- Reference any related issues (e.g., closes #123, fixes #456) -->
---
## 📋 Type of Change
Please check the relevant option(s):
- [ ] 🐛 Bug fix
- [ ] ✨ New feature
- [ ] ♻️ Code refactor
- [ ] 📚 Documentation update
- [ ] 🧪 Test addition or change
- [ ] 🔧 Build/config update
- [ ] 🚀 Performance improvement
- [ ] 🔨 CI/CD or automation
- [ ] 🧹 Cleanup / chore
---
## 📷 Screenshots or Logs (if applicable)
<!-- Add screenshots, terminal output, logs, or anything that helps understand your change -->
---
## 🧪 Testing Steps
<!-- Describe how the change was tested. Manual steps, test cases, or automated test runs -->
---
## ✅ Checklist
- [ ] I have read the [Contribution Guidelines](../../CONTRIBUTING)
- [ ] I have tested my changes locally
- [ ] I have updated relevant documentation (if applicable)
- [ ] I have verified my changes do not break existing behavior
- [ ] I am willing to respond to requested changes and feedback
---
## 🙋 Additional Notes
<!-- Anything else you want reviewers to know? Future follow-ups? Questions? -->

View File

@@ -0,0 +1,37 @@
## 📚 Documentation Update
<!-- Describe the purpose of this PR in one or two sentences. Example: "This PR updates the contributor guidelines by merging frontend and backend sections." -->
---
## 📝 Whats Changed?
<!-- Briefly outline what parts of the documentation were added, changed, removed, or reorganized -->
- Combined frontend and backend development guidelines into a single file
- Updated `mkdocs.yml` to reflect new structure
- Added clarification on contribution process
- Fixed outdated links in sidebar
---
## 🔍 Related Issue(s)
<!-- Link to related issues, discussions, or context (e.g., closes #123) -->
---
## ✅ Checklist
- [ ] I followed the formatting/style of existing documentation
- [ ] I have read the [Contribution Guidelines](../../CONTRIBUTING)
- [ ] I updated `mkdocs.yml` if necessary
- [ ] I verified links and references still work
- [ ] I checked that my changes improve clarity, structure, or accuracy
- [ ] I'm open to feedback and suggestions
---
## 🙋 Additional Notes
<!-- Optional: Include anything you want reviewers to be aware of -->

4
.github/tweet.md vendored
View File

@@ -1,2 +1,2 @@
🎉 New release: **v25.5.24 - MQTT, UI improvements, multiple notification emails** is live! 🚀
Check it out here: https://github.com/jokob-sk/NetAlertX/releases/tag/v25.5.24
🎉 New release: **v25.6.7 - Legacy upgrade removal and Fully Qualified Domain Names 🆎** is live! 🚀
Check it out here: https://github.com/jokob-sk/NetAlertX/releases/tag/v25.6.7

137
CODE_OF_CONDUCT.md Executable file
View File

@@ -0,0 +1,137 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or advances of
any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address,
without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official email address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at <jokob@duck.com>.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Ethical Use Clause (Project-Specific)
While NetAlertX is a tool designed to empower users with greater insight into their own networks, we expect and encourage all users to use this software **ethically and legally**.
- Do not use this software to scan or monitor networks without **explicit authorization**.
- Respect privacy, consent, and data protection laws applicable in your jurisdiction.
- Any use of NetAlertX for malicious surveillance, stalking, or unauthorized access is explicitly discouraged and may be grounds for removal from the community and revocation of support.
We reserve the right to take appropriate action to uphold the ethical integrity of this project.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the
[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1,
available at
<https://www.contributor-covenant.org/version/2/1/code_of_conduct/>.
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/inclusion).
For answers to common questions about this code of conduct, see the FAQ at
<https://www.contributor-covenant.org/faq/>. Translations are available at
<https://www.contributor-covenant.org/translations/>.

View File

@@ -1,14 +1,53 @@
# Contributing to this project
# 🤝 Contributing to NetAlertX
## Issues, bugs, feature requests
First off, **thank you** for taking the time to contribute! NetAlertX is built and improved with the help of passionate people like you.
The issue tracker is the preferred channel for bug reports, features requests and submitting pull requests.
---
Before submitting a new issue please spend a couple of minutes on research:
## 📂 Issues, Bugs, and Feature Requests
* Check [🛑 Common issues](https://github.com/jokob-sk/NetAlertX/blob/main/docs/DEBUG_TIPS.md#common-issues)
* Check [💡 Closed issues](https://github.com/jokob-sk/NetAlertX/issues?q=is%3Aissue+is%3Aclosed) if a similar issue was solved in the past.
Please use the [GitHub Issue Tracker](https://github.com/jokob-sk/NetAlertX/issues) for:
- Bug reports 🐞
- Feature requests 💡
- Documentation feedback 📖
## Pull-requests (PRs)
Before opening a new issue:
- 🛑 [Check Common Issues & Debug Tips](https://github.com/jokob-sk/NetAlertX/blob/main/docs/DEBUG_TIPS.md#common-issues)
- 🔍 [Search Closed Issues](https://github.com/jokob-sk/NetAlertX/issues?q=is%3Aissue+is%3Aclosed)
If you submit a PR please do check that your changes are backward compatible with existing installations. Existing features should be always preserved.
---
## 🚀 Submitting Pull Requests (PRs)
We welcome PRs to improve the code, docs, or UI!
Please:
- Ensure **backward compatibility** with existing installations
- Preserve existing features unless a breaking change is intentional and discussed
- Follow existing **code style and structure**
- Provide a clear title and description for your PR
- If relevant, add or update tests and documentation
- For plugins, refer to the [Plugin Dev Guide](https://github.com/jokob-sk/NetAlertX/blob/main/docs/PLUGINS_DEV.md)
---
## 🌟 First-Time Contributors
New to open source? Check out these resources:
- [How to Fork and Submit a PR](https://opensource.guide/how-to-contribute/)
- Ask questions or get support in our [Discord](https://discord.gg/NczTUTWyRr)
---
## 🔐 Code of Conduct
By participating, you agree to follow our [Code of Conduct](./CODE_OF_CONDUCT.md), which ensures a respectful and welcoming community.
---
## 📬 Contact
If you have more in-depth questions or want to discuss contributing in other ways, feel free to reach out at:
📧 [jokob@duck.com](mailto:jokob@duck.com?subject=NetAlertX%20Contribution)
We appreciate every contribution, big or small! 💙

View File

@@ -1,4 +1,4 @@
FROM alpine:3.21 AS builder
FROM alpine:3.22 AS builder
ARG INSTALL_DIR=/app
@@ -22,7 +22,7 @@ RUN pip install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask tplin
RUN cat ${INSTALL_DIR}/install/freebox_certificate.pem >> /opt/venv/lib/python3.12/site-packages/aiofreepybox/freebox_certificates.pem
# second stage
FROM alpine:3.21 AS runner
FROM alpine:3.22 AS runner
ARG INSTALL_DIR=/app

View File

@@ -8,6 +8,42 @@
Get visibility of what's going on on your WIFI/LAN network and enable presence detection of important devices. Schedule scans for devices, port changes and get alerts if unknown devices or changes are found. Write your own [Plugin](https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md#readme) with auto-generated UI and in-build notification system. Build out and easily maintain your network source of truth (NSoT).
## 📋 Table of Contents
- [Features](#-features)
- [Documentation](#-documentation)
- [Quick Start](#-quick-start)
- [Alternative Apps](#-other-alternative-apps)
- [Security & Privacy](#-security--privacy)
- [FAQ](#-faq)
- [Known Issues](#-known-issues)
- [Donations](#-donations)
- [Contributors](#-contributors)
- [Translations](#-translations)
- [License](#license)
## 🚀 Quick Start
Start NetAlertX in seconds with Docker:
```bash
docker run -d --rm --network=host \
-v local_path/config:/app/config \
-v local_path/db:/app/db \
--mount type=tmpfs,target=/app/api \
-e PUID=200 -e PGID=300 \
-e TZ=Europe/Berlin \
-e PORT=20211 \
ghcr.io/jokob-sk/netalertx:latest
```
Need help configuring it? Check the [usage guide](https://github.com/jokob-sk/NetAlertX/blob/main/docs/README.md) or [full documentation](https://jokob-sk.github.io/NetAlertX/).
For Home Assistant users: [Click here to add NetAlertX](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons)
For other install methods, check the [installation docs](#-documentation)
| [📑 Docker guide](https://github.com/jokob-sk/NetAlertX/blob/main/dockerfiles/README.md) | [🚀 Releases](https://github.com/jokob-sk/NetAlertX/releases) | [📚 Docs](https://jokob-sk.github.io/NetAlertX/) | [🔌 Plugins](https://github.com/jokob-sk/NetAlertX/blob/main/docs/PLUGINS.md) | [🤖 Ask AI](https://gurubase.io/g/netalertx)
|----------------------| ----------------------| ----------------------| ----------------------| ----------------------|
@@ -30,7 +66,7 @@ Get visibility of what's going on on your WIFI/LAN network and enable presence d
### Scanners
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/docs/PLUGINS.md#readme) docs for a full lits of avaliable plugins.
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/docs/PLUGINS.md#readme) docs for a full list of avaliable plugins.
### Notification gateways
@@ -59,6 +95,46 @@ Supported browsers: Chrome, Firefox
- [[Development] API docs](https://github.com/jokob-sk/NetAlertX/blob/main/docs/API.md)
- [[Development] Custom Plugins](https://github.com/jokob-sk/NetAlertX/blob/main/docs/PLUGINS_DEV.md)
...or explore all the [documentation here](https://jokob-sk.github.io/NetAlertX/).
## 🔐 Security & Privacy
NetAlertX scans your local network and can store metadata about connected devices. By default, all data is stored **locally**. No information is sent to external services unless you explicitly configure notifications or integrations.
To further secure your installation:
- Run it behind a reverse proxy with authentication
- Use firewalls to restrict access to the web UI
- Regularly update to the latest version for security patches
See [Security Best Practices](https://github.com/jokob-sk/NetAlertX/security) for more details.
## ❓ FAQ
**Q: Why dont I see any devices?**
A: Ensure the container has proper network access (e.g., use `--network host` on Linux). Also check that your scan method is properly configured in the UI.
**Q: Does this work on Wi-Fi-only devices like Raspberry Pi?**
A: Yes, but some scanners (e.g. ARP) work best on Ethernet. For Wi-Fi, try SNMP, DHCP, or Pi-hole import.
**Q: Will this send any data to the internet?**
A: No. All scans and data remain local, unless you set up cloud-based notifications.
**Q: Can I use this without Docker?**
A: Yes! You can install it bare-metal. See the [bare metal installation guide](https://github.com/jokob-sk/NetAlertX/blob/main/docs/HW_INSTALL.md).
**Q: Where is the data stored?**
A: In the `/config` and `/db` folders, mapped in Docker. Back up these folders regularly.
## 🐞 Known Issues
- Some scanners (e.g. ARP) may not detect devices on different subnets. See the [Remote networks guide](https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md) for workarounds.
- Wi-Fi-only networks may require alternate scanners for accurate detection.
- Notification throttling may be needed for large networks to prevent spam.
- On some systems, elevated permissions (like `CAP_NET_RAW`) may be needed for low-level scanning.
Check the [GitHub Issues](https://github.com/jokob-sk/NetAlertX/issues) for the latest bug reports and solutions and consult [the official documentation](https://jokob-sk.github.io/NetAlertX/).
## 📃 Everything else
<!--- --------------------------------------------------------------------- --->
@@ -111,7 +187,6 @@ Proudly using [Weblate](https://hosted.weblate.org/projects/pialert/). Help out
### License
> GPL 3.0 | [Read more here](LICENSE.txt) | Source of the [animated GIF (Loading Animation)](https://commons.wikimedia.org/wiki/File:Loading_Animation.gif) | Source of the [selfhosted Fonts](https://github.com/adobe-fonts/source-sans)
<!--- --------------------------------------------------------------------- --->
@@ -131,4 +206,3 @@ Proudly using [Weblate](https://hosted.weblate.org/projects/pialert/). Help out
[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

@@ -20,7 +20,7 @@
DISCOVER_PLUGINS=True
SCAN_SUBNETS=['--localnet']
TIMEZONE='Europe/Berlin'
LOADED_PLUGINS=['ARPSCAN','CSVBCKP','DBCLNP', 'DIGSCAN', 'INTRNT','MAINT','NEWDEV', 'NBTSCAN', 'NSLOOKUP','NTFPRCS', 'AVAHISCAN', 'SETPWD','SMTP', 'SYNC', 'VNDRPDT', 'WORKFLOWS', 'UI']
LOADED_PLUGINS=['ARPSCAN', 'AVAHISCAN', 'CSVBCKP','DBCLNP', 'DIGSCAN', 'INTRNT', 'MAINT', 'NEWDEV', 'NBTSCAN', 'NSLOOKUP','NTFPRCS', 'SETPWD', 'SMTP', 'SYNC', 'VNDRPDT', 'WORKFLOWS', 'UI']
DAYS_TO_KEEP_EVENTS=90
# Used for generating links in emails. Make sure not to add a trailing slash!
@@ -30,6 +30,8 @@ REPORT_DASHBOARD_URL='http://127.0.0.1'
INTRNT_RUN='schedule'
ARPSCAN_RUN='schedule'
NSLOOKUP_RUN='before_name_updates'
AVAHISCAN_RUN='before_name_updates'
NBTSCAN_RUN='before_name_updates'
# Email
#-------------------------------------

View File

@@ -66,7 +66,7 @@ services:
- ${DEV_LOCATION}/front/appEvents.php:/app/front/appEvents.php
- ${DEV_LOCATION}/front/appEventsCore.php:/app/front/appEventsCore.php
- ${DEV_LOCATION}/front/multiEditCore.php:/app/front/multiEditCore.php
- ${DEV_LOCATION}/front/plugins:/app/front/plugins
- ${DEV_LOCATION}/front/plugins:/app/front/plugins
# DELETE END anyone trying to use this file: comment out / delete ABOVE lines, they are only for development purposes
# ---------------------------------------------------------------------------
environment:

View File

@@ -49,6 +49,8 @@ query GetDevices($options: PageQueryOptionsInput) {
}
```
See also: [Debugging GraphQL issues](./DEBUG_GRAPHQL.md)
### `curl` Command
You can use the following `curl` command to execute the query.

View File

@@ -2,6 +2,7 @@
Use the official installation guides at first and use community content as supplementary material. Open an issue or PR if you'd like to add your link to the list 🙏 (Ordered by last update time)
- ▶ [Discover & Monitor Your Network with This Self-Hosted Open Source Tool - Lawrence Systems](https://www.youtube.com/watch?v=R3b5cxLZMpo) (June 2025)
- ▶ [Home Lab Network Monitoring - Scotti-BYTE Enterprise Consulting Services](https://www.youtube.com/watch?v=0DryhzrQSJA) (July 2024)
- 📄 [How to Install NetAlertX on Your Synology NAS - Marius hosting](https://mariushosting.com/how-to-install-pi-alert-on-your-synology-nas/) (Updated frequently)
- 📄 [Using the PiAlert Network Security Scanner on a Raspberry Pi - PiMyLifeUp](https://pimylifeup.com/raspberry-pi-pialert/)

64
docs/DEBUG_GRAPHQL.md Executable file
View File

@@ -0,0 +1,64 @@
# Debugging GraphQL server issues
The GraphQL server is an API middle layer, running on it's own port specified by `GRAPHQL_PORT`, to retrieve and show the data in the UI. It can also be used to retrieve data for custom third party integarions. Check the [API documentation](./API.md) for details.
The most common issue is that the GraphQL server doesn't start properly, usually due to a **port conflict**. If you are running multiple NetAlertX instances, make sure to use **unique ports** by changing the `GRAPHQL_PORT` setting. The default is `20212`.
## How to update the `GRAPHQL_PORT` in case of issues
As a first troubleshooting step try changing the default `GRAPHQL_PORT` setting. Please remember NetAlertX is running on the host so any application uising the same port will cause issues.
### Updating the setting via the Settings UI
Ideally use the Settings UI to update the setting under General -> Core -> GraphQL port:
![GrapQL settings](./img/DEBUG_GRAPHQL/graphql_settings_port_token.png)
You might need to temporarily stop other applications or NetAlertX instances causing conflicts to update the setting. The `API_TOKEN` is used to authenticate any API calls, including GraphQL requests.
### Updating the `app.conf` file
If the UI is not accessible, you can directly edit the `app.conf` file in your `/config` folder:
![Editing app.conf](./img/DEBUG_GRAPHQL/app_conf_graphql_port.png)
### Using a docker variable
All application settings can also be initialized via the `APP_CONF_OVERRIDE` docker env variable.
```yaml
...
environment:
- TZ=Europe/Berlin
- PORT=20213
- APP_CONF_OVERRIDE={"GRAPHQL_PORT":"20214"}
...
```
## How to check the GraphQL server is running?
There are several ways to check if the GraphQL server is running.
### Init Check
You can navigate to Maintenance -> Init Check to see if `isGraphQLServerRunning` is ticked:
![Init Check](./img/DEBUG_GRAPHQL/Init_check.png)
### Checking the Logs
You can navigate to Maintenance -> Logs and search for `graphql` to see if it started correctly and serving requests:
![GraphQL Logs](./img/DEBUG_GRAPHQL/graphql_running_logs.png)
### Inspecting the Browser console
In your browser open the dev console (usually F12) and navigate to the Network tab where you can filter GraphQL requests (e.g., reload the Devices page).
![Browser Network Tab](./img/DEBUG_GRAPHQL/network_graphql.png)
You can then inspect any of the POST requests by opening them in a new tab.
![Browser GraphQL Json](./img/DEBUG_GRAPHQL/dev_console_graphql_json.png)

View File

@@ -8,8 +8,13 @@ This set of settings allows you to group Devices under different views. The Arch
## Status Colors
![Sattus colors](./img/DEVICE_MANAGEMENT/device_management_display_settings.png)
![Sattus colors](./img/DEVICE_MANAGEMENT/device_management_status_colors.png)
1. Online (Green) = A device that is no longer marked as a "New Device"
2. New (Green) = A newly discovered device that is online and is still "ticked" as a "New Device"
3. New (Grey) = Same as No.2 but device is now offline.
1. 🔌 Online (Green) = A device that is no longer marked as a "New Device".
2. 🔌 New (Green) = A newly discovered device that is online and is still marked as a "New Device".
3. New (Grey) = Same as No.2 but device is now offline.
4. ✖ Offline (Grey) = A device that was not detected online in the last scan.
5. ⚠ Down (Red) = A device that has "Alert Down" marked and has been offline for the time set in the Setting `NTFPRCS_alert_down_time`.
See also [Notification guide](./NOTIFICATIONS.md).

78
docs/FIX_OFFLINE_DETECTION.md Executable file
View File

@@ -0,0 +1,78 @@
# Troubleshooting: Devices Show Offline When They Are Online
In some network setups, certain devices may intermittently appear as **offline** in NetAlertX, even though they are connected and responsive. This issue is often more noticeable with devices that have **higher IP addresses** within the subnet.
> [!NOTE]
>
> Network presence graph showing increased drop outs before enabling additional `ICMP` scans and continuous online presence after following this guide. This graph shows a sudden spike in drop outs probably caused by a device software update.
> ![before after presence](./img/FIX_OFFLINE_DETECTION/presence_graph_before_after.png)
## Symptoms
* Devices sporadically show as offline in the presence timeline.
* This behavior often affects devices with higher IPs (e.g., `192.168.1.240+`).
* Presence data appears inconsistent or unreliable despite the device being online.
## Cause
This issue is typically related to scanning limitations:
* **ARP scan timeouts** may prevent full subnet coverage.
* **Sole reliance on ARP** can result in missed detections:
* Some devices (like iPhones) suppress or reject frequent ARP requests.
* ARP responses may be blocked or delayed due to power-saving features or OS behavior.
* **Scanning frequency conflicts**, where devices ignore repeated scans within a short period.
## Recommended Fixes
To improve presence accuracy and reduce false offline states:
### ✅ Increase ARP Scan Timeout
Extend the ARP scanner timeout to ensure full subnet coverage:
```env
ARPSCAN_RUN_TIMEOUT=360
```
> Adjust based on your network size and device count.
### ✅ Add ICMP (Ping) Scanning
Enable the `ICMP` scan plugin to complement ARP detection. ICMP is often more reliable for detecting active hosts, especially when ARP fails.
### ✅ Use Multiple Detection Methods
A combined approach greatly improves detection robustness:
* `ARPSCAN` (default)
* `ICMP` (ping)
* `NMAPDEV` (nmap)
This hybrid strategy increases reliability, especially for down detection and alerting. See [other plugins](./PLUGINS.md) that might be compatible with your setup. See benefits and drawbacks of individual scan methods in their respective docs.
## Results
After increasing the ARP timeout and adding ICMP scanning (on select IP ranges), users typically report:
* More consistent presence graphs
* Fewer false offline events
* Better coverage across all IP ranges
## Summary
| Setting | Recommendation |
| --------------------- | --------------------------------------------- |
| `ARPSCAN_RUN_TIMEOUT` | Increase to ensure scans reach all IPs |
| `ICMP` Scan | Enable to detect devices ARP might miss |
| Multi-method Scanning | Use a mix of ARP, ICMP, and NMAP-based methods |
---
**Tip:** Each environment is unique. Consider fine-tuning scan settings based on your network size, device behavior, and desired detection accuracy.
Let us know in the [NetAlertX Discussions](https://github.com/jokob-sk/NetAlertX/discussions) if you have further feedback or edge cases.
See also [Remote Networks](./REMOTE_NETWORKS.md) for more advanced setups.

View File

@@ -5,7 +5,8 @@ To download and install NetAlertX on the hardware/server directly use the `curl`
> [!NOTE]
> This is an Experimental feature 🧪 and it relies on community support.
>
> 🙏 Looking for maintainers for this installation method 🙂
> 🙏 Looking for maintainers for this installation method 🙂 Curent community volunteers:
> - [slammingprogramming](https://github.com/slammingprogramming)
>
> There is no guarantee that the install script or any other script will gracefully handle other installed software.
> Data loss is a possibility, **it is recommended to install NetAlertX using the supplied Docker image**.

View File

@@ -9,7 +9,7 @@ Get **NetAlertX** up and running in a few simple steps.
> [!TIP]
> Enable additional plugins under **Settings → `LOADED_PLUGINS`**.
> Make sure to **save** your changes and **reload the page** to activate them.
> ![Loaded plugins settings](./img/PLUGINS/loaded_plugins_setting.png)
> ![Loaded plugins settings](./img/PLUGINS/enable_plugin.gif)
**Initial configuration**: `ARPSCAN`, `INTRNT`

View File

@@ -85,8 +85,8 @@ services:
# (Optional) Useful for debugging setup issues
- local/path/logs:/app/log
# (API: OPTION 1) Store temporary files in memory (recommended for performance)
- type: tmpfs # ◀
target: /app/api # ◀
- type: tmpfs # ◀ 🔺
target: /app/api # ◀ 🔺
# (API: OPTION 2) Store API data on disk (useful for debugging)
# - local/path/api:/app/api
environment:

View File

@@ -9,7 +9,7 @@ NetAlertX supports additional plugins to extend its functionality, each with its
> [!TIP]
> You can load additional Plugins via the General -> `LOADED_PLUGINS` setting. You need to save the settings for the new plugins to load (cache/page reload may be necessary).
> ![Loaded plugins settings](./img/PLUGINS/loaded_plugins_setting.png)
> ![Loaded plugins settings](./img/PLUGINS/enable_plugin.gif)
1. Pick your `🔍 dev scanner` plugin (e.g. `ARPSCAN` or `NMAPDEV`), or import devices into the application with an `📥 importer` plugin. (See **Enabling plugins** below)
2. Pick a `▶️ publisher` plugin, if you want to send notifications. 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.

View File

@@ -1,29 +1,102 @@
# Securing your NetAlertX instance
## 🧭 Responsibility Disclaimer
NetAlertX is an execution framework. In order to run scanners and plugins, the application has to have access to privileged system resources. It is not recommended to expose NetAlertX to the internet without taking basic security precautions. It is highly recommended to use a VPN to access the application and to set up a password for the web interface before exposing the UI online.
NetAlertX provides powerful tools for network scanning, presence detection, and automation. However, **it is up to you—the deployer—to ensure that your instance is properly secured**.
## VPN
This includes (but is not limited to):
- Controlling who has access to the UI and API
- Following network and container security best practices
- Running NetAlertX only on networks where you have legal authorization
- Keeping your deployment up to date with the latest patches
VPNs allow you to securely access your NetAlertX instance from remote locations without exposing it to the internet. A VPN encrypts your connection and prevents unauthorized access.
> NetAlertX is not responsible for misuse, misconfiguration, or unsecure deployments. Always test and secure your setup before exposing it to the outside world.
### Tailscale as an Alternative
# 🔐 Securing Your NetAlertX Instance
If setting up a traditional VPN is not ideal, you can use [Tailscale](https://tailscale.com/) as an easy alternative. Tailscale creates a secure, encrypted connection between your devices without complex configuration. Since NetAlertX is designed to be run on private networks, Tailscale can provide a simple way to securely connect to your instance from anywhere.
NetAlertX is a powerful network scanning and automation framework. With that power comes responsibility. **It is your responsibility to secure your deployment**, especially if you're running it outside a trusted local environment.
## Setting a Password
---
By default, NetAlertX does not enforce authentication, but it is highly recommended to set a password before exposing the web interface.
## ⚠️ TL;DR Key Security Recommendations
Configure `SETPWD_enable_password` to `true` and enter your password in `SETPWD_password`. When enabled, a login dialog is displayed. If facing issues, you can always disable the login by setting `SETPWD_enable_password=false` in your `app.conf` file.
-**NEVER expose NetAlertX directly to the internet without protection**
- ✅ Use a **VPN or Tailscale** to access remotely
- ✅ Enable **password protection** for the web UI
- ✅ Harden your container environment (e.g., no unnecessary privileges)
- ✅ Use **firewalls and IP whitelisting**
- ✅ Keep the software **updated**
- ✅ Limit the scope of **plugins and API keys**
- The default password is `123456`.
- Passwords are stored as SHA256 hashes for security.
---
## Additional Security Measures
## 🔗 Access Control with VPN (or Tailscale)
- **Firewall Rules**: Ensure that only trusted IPs can access the NetAlertX instance.
- **Limit Plugin Permissions**: Only enable the plugins necessary for your setup.
- **Keep Software Updated**: Regularly update NetAlertX to receive the latest security patches.
- **Use Read-Only API Keys**: If exposing APIs, limit privileges with read-only keys where applicable.
NetAlertX is designed to be run on **private LANs**, not the open internet.
By following these security recommendations, you can help protect your NetAlertX instance from unauthorized access and potential misuse.
**Recommended**: Use a VPN to access NetAlertX from remote locations.
### ✅ Tailscale (Easy VPN Alternative)
Tailscale sets up a private mesh network between your devices. It's fast to configure and ideal for NetAlertX.
👉 [Get started with Tailscale](https://tailscale.com/)
---
## 🔑 Web UI Password Protection
By default, NetAlertX does **not** require login. Before exposing the UI in any way:
1. Enable password protection:
```ini
SETPWD_enable_password=true
SETPWD_password=your_secure_password
```
2. Passwords are stored as SHA256 hashes
3. Default password (if not changed): 123456 — change it ASAP!
> To disable authenticated login, set `SETPWD_enable_password=false` in `app.conf`
---
## 🔥 Additional Security Measures
- **Firewall / Network Rules**
Restrict UI/API access to trusted IPs only.
- **Limit Docker Capabilities**
Avoid `--privileged`. Use `--cap-add=NET_RAW` and others **only if required** by your scan method.
- **Keep NetAlertX Updated**
Regular updates contain bug fixes and security patches.
- **Plugin Permissions**
Disable unused plugins. Only install from trusted sources.
- **Use Read-Only API Keys**
When integrating NetAlertX with other tools, scope keys tightly.
---
## 🧱 Docker Hardening Tips
- Use `read-only` mount options where possible (`:ro`)
- Avoid running as `root` unless absolutely necessary
- Consider using `docker scan` or other container image vulnerability scanners
- Run with `--network host` **only on trusted networks** and only if needed for ARP-based scans
---
## 📣 Responsible Disclosure
If you discover a vulnerability or security concern, please report it **privately** to:
📧 [jokob@duck.com](mailto:jokob@duck.com?subject=NetAlertX%20Security%20Disclosure)
We take security seriously and will work to patch confirmed issues promptly. Your help in responsible disclosure is appreciated!
---
By following these recommendations, you can ensure your NetAlertX deployment is both powerful **and** secure.

View File

@@ -1,6 +1,49 @@
# 📧 SMTP guides
# 📧 SMTP server guides
## Using the GMX SMTP server
The SMTP plugin supports any SMTP server. Here are some commonly used services to help speed up your configuration.
> [!NOTE]
> If you are using a self hosted SMTP server ssh into the container and verify (e.g. via ping) that your server is reachable from within the NetAlertX container. See also how to ssh into the container if you are running it as a [Home Assistant](./HOME_ASSISTANT.md) addon.
## Gmail
1. Create an app password by following the instructions from Google, you need to Enable 2FA for this to work.
[https://support.google.com/accounts/answer/185833](https://support.google.com/accounts/answer/185833)
2. Specify the following settings:
```python
SMTP_RUN='on_notification'
SMTP_SKIP_TLS=True
SMTP_FORCE_SSL=True
SMTP_PORT=465
SMTP_SERVER='smtp.gmail.com'
SMTP_PASS='16-digit passcode from google'
SMTP_REPORT_TO='some_target_email@gmail.com'
```
## Brevo
Brevo allows for 300 free emails per day as of time of writing.
1. Create an account on Brevo: https://www.brevo.com/free-smtp-server/
2. Click your name -> SMTP & API
3. Click Generate a new SMTP key
4. Save the details and fill in the NetAlertX settings as below.
```python
SMTP_SERVER='smtp-relay.brevo.com'
SMTP_PORT=587
SMTP_SKIP_LOGIN=False
SMTP_USER='user@email.com'
SMTP_PASS='xsmtpsib-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxx'
SMTP_SKIP_TLS=False
SMTP_FORCE_SSL=False
SMTP_REPORT_TO='some_target_email@gmail.com'
SMTP_REPORT_FROM='NetAlertX <user@email.com>'
```
## GMX
1. Go to your GMX account https://account.gmx.com
2. Under Security Options enable 2FA (Two-factor authentication)
@@ -21,21 +64,3 @@
SMTP_REPORT_TO='some_target_email@gmail.com'
```
## Using the Gmail SMTP server
1. Create an app password by following the instructions from Google, you need to Enable 2FA for this to work.
[https://support.google.com/accounts/answer/185833](https://support.google.com/accounts/answer/185833)
2. Specify the following settings:
```python
SMTP_RUN='on_notification'
SMTP_SKIP_TLS=True
SMTP_FORCE_SSL=True
SMTP_PORT=465
SMTP_SERVER='smtp.gmail.com'
SMTP_PASS='16-digit passcode from google'
SMTP_REPORT_TO='some_target_email@gmail.com'
```

View File

@@ -22,4 +22,4 @@ For a comparison, this is how the UI looks like if you are on the latest stable
## Implementation details
During build a [/app/front/buildtimestamp.txt](https://github.com/jokob-sk/NetAlertX/blob/092797e75ccfa8359444ad149e727358ac4da05f/Dockerfile#L44) file is created. The app then periodically checks if a new release is available with a newer timestamp in GitHub's rest-based JSON endpoint (check the `def isNewVersion():` method for details).
During build a [/app/front/buildtimestamp.txt](https://github.com/jokob-sk/NetAlertX/blob/092797e75ccfa8359444ad149e727358ac4da05f/Dockerfile#L44) file is created. The app then periodically checks if a new release is available with a newer timestamp in GitHub's rest-based JSON endpoint (check the `def isNewVersion:` method for details).

View File

@@ -1,5 +1,8 @@
### Create a simple n8n workflow
> [!NOTE]
> You need to enable the `WEBHOOK` plugin first in order to follow this guide. See the [Plugins guide](./PLUGINS.md) for details.
N8N can be used for more advanced conditional notification use cases. For example, you want only to get notified if two out of a specified list of devices is down. Or you can use other plugins to process the notifiations further. The below is a simple example of sending an email on a webhook.
![n8n workflow](./img/WEBHOOK_N8N/n8n_workflow.png)

View File

@@ -1,5 +1,8 @@
# Webhook Secrets
> [!NOTE]
> You need to enable the `WEBHOOK` plugin first in order to follow this guide. See the [Plugins guide](./PLUGINS.md) for details.
## How does the signing work?
NetAlertX will use the configured secret to create a hash signature of the request body. This SHA256-HMAC signature will appear in the `X-Webhook-Signature` header of each request to the webhook target URL. You can use the value of this header to validate the request was sent by NetAlertX.

60
docs/WORKFLOW_EXAMPLES.md Executable file
View File

@@ -0,0 +1,60 @@
# Workflow examples
Workflows in NetAlertX automate actions based on real-time events and conditions. Below are practical examples that demonstrate how to build automation using triggers, conditions, and actions.
## Un-archive devices if detected online
This workflow automatically unarchives a device if it was previously archived but has now been detected as online.
### 📋 Use Case
Sometimes devices are manually archived (e.g., no longer expected on the network), but they reappear unexpectedly. This workflow reverses the archive status when such devices are detected during a scan.
### ⚙️ Workflow Configuration
```json
{
"name": "Un-archive devices if detected online",
"trigger": {
"object_type": "Devices",
"event_type": "update"
},
"conditions": [
{
"logic": "AND",
"conditions": [
{
"field": "devIsArchived",
"operator": "equals",
"value": "1"
},
{
"field": "devPresentLastScan",
"operator": "equals",
"value": "1"
}
]
}
],
"actions": [
{
"type": "update_field",
"field": "devIsArchived",
"value": "0"
}
],
"enabled": "Yes"
}
```
### 🔍 Explanation
- Trigger: Listens for updates to device records.
- Conditions:
- `devIsArchived` is `1` (archived).
- `devPresentLastScan` is `1` (device was detected in the latest scan).
- Action: Updates the device to set `devIsArchived` to `0` (unarchived).
### ✅ Result
Whenever a previously archived device shows up during a network scan, it will be automatically unarchived — allowing it to reappear in your device lists and dashboards.

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

View File

@@ -163,7 +163,7 @@
devType as type,
devLastIP as last_ip,
(select devType from Devices a where devMac = "'.$node_mac.'") as node_type
FROM Devices WHERE devParentMAC = "'.$node_mac.'" order by port, name asc';
FROM Devices WHERE devParentMAC = "'.$node_mac.'" and devIsArchived = 0 order by port, name asc';
global $db;
$func_result = $db->query($func_sql);
@@ -279,7 +279,8 @@
a.devParentMAC as parent_mac,
a.devIcon as node_icon
FROM Devices a
WHERE a.devType in (".$networkDeviceTypes.")
WHERE a.devType in (".$networkDeviceTypes.")
AND devIsArchived = 0
) t1
LEFT JOIN
(
@@ -363,6 +364,7 @@
WHERE devParentMAC IS NULL
OR devParentMAC IN ("", " ", "undefined", "null")
AND devMac NOT LIKE "%internet%"
AND devIsArchived = 0
ORDER BY name ASC;';
global $db;

File diff suppressed because it is too large Load Diff

View File

@@ -211,7 +211,7 @@
"Device_TableHead_AlertDown": "Cancel·lar alerta",
"Device_TableHead_Connected_Devices": "Connexions",
"Device_TableHead_CustomProps": "Props / Accions",
"Device_TableHead_FQDN": "",
"Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Favorit",
"Device_TableHead_FirstSession": "Primera Sessió",
"Device_TableHead_GUID": "GUID",
@@ -359,11 +359,11 @@
"Maint_PurgeLog": "Registre de purga",
"Maint_RestartServer": "Reinici del servidor",
"Maint_Restart_Server_noti_text": "Estàs segur que vols reiniciar el servidor backend? Això pot causar incongruència a l'aplicació. Abans fes còpia de seguretat de la vostra configuració. <br/> <br/> Nota: Això pot durar uns quants minuts.",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_InitCheck": "Init Check",
"Maintenance_InitCheck_Checking": "Comprovant…",
"Maintenance_InitCheck_QuickSetupGuide": "Assegureu-vos de seguir la guia <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\"> de configuració ràpida</a>.",
"Maintenance_InitCheck_Success": "Aplicació inicialitzada amb èxit!",
"Maintenance_ReCheck": "Tornar a comprovar",
"Maintenance_Running_Version": "Versió instal·lada",
"Maintenance_Status": "Estat",
"Maintenance_Title": "Eines de manteniment",
@@ -565,8 +565,8 @@
"Presence_Shortcut_Favorites": "Favorits",
"Presence_Shortcut_NewDevices": "Nous dispositius",
"Presence_Title": "Detecció de dispositius",
"REFRESH_FQDN_description": "",
"REFRESH_FQDN_name": "",
"REFRESH_FQDN_description": "Re-escaneja tots dispositius i refresca el seu (FQDN). Si està desactivat, nomes s'escanegen els noms coneguts per fer-ho més ràpid. En aquest cas, FQDN s'actualitza només durant descoberta inicial de dispositius.",
"REFRESH_FQDN_name": "Refresc FQDN",
"REPORT_DASHBOARD_URL_description": "Aquesta URL s'utilitza com a base per generar enllaços en informes HTML (per exemple: correus electrònics). Introduïu la URL completa començant per <code>http://</code> incloent el número de port (sense barra inicial <code>/</code>).",
"REPORT_DASHBOARD_URL_name": "URL NetAlertX",
"REPORT_ERROR": "Si us plau, introdueix dins de la caixa de text els caràcters que veu a la imatge de sota. Això és requerit per evitar enviaments automàtics",

View File

@@ -5,11 +5,11 @@
"API_TOKEN_name": "API token",
"API_display_name": "API",
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
"About_Design": "",
"About_Exit": "",
"About_Title": "",
"About_Design": "Designováno pro:",
"About_Exit": "Odhlásit",
"About_Title": "Scanner síťové bezpečnosti a framework pro upozornění",
"AppEvents_AppEventProcessed": "Zpracováno",
"AppEvents_DateTimeCreated": "Zalogováno",
"AppEvents_DateTimeCreated": "Objeveno",
"AppEvents_Extra": "Extra",
"AppEvents_GUID": "",
"AppEvents_Helper1": "",
@@ -289,45 +289,45 @@
"Gen_Action": "",
"Gen_Add": "",
"Gen_AddDevice": "",
"Gen_Add_All": "",
"Gen_All_Devices": "",
"Gen_AreYouSure": "",
"Gen_Backup": "",
"Gen_Cancel": "",
"Gen_Change": "",
"Gen_Copy": "",
"Gen_DataUpdatedUITakesTime": "",
"Gen_Delete": "",
"Gen_DeleteAll": "",
"Gen_Description": "",
"Gen_Error": "",
"Gen_Filter": "",
"Gen_Generate": "",
"Gen_LockedDB": "",
"Gen_Offline": "",
"Gen_Okay": "",
"Gen_Online": "",
"Gen_Purge": "",
"Gen_ReadDocs": "",
"Gen_Remove_All": "",
"Gen_Remove_Last": "",
"Gen_Reset": "",
"Gen_Restore": "",
"Gen_Run": "",
"Gen_Save": "",
"Gen_Saved": "",
"Gen_Search": "",
"Gen_Select": "",
"Gen_SelectIcon": "",
"Gen_SelectToPreview": "",
"Gen_Selected_Devices": "",
"Gen_Switch": "",
"Gen_Upd": "",
"Gen_Upd_Fail": "",
"Gen_Update": "",
"Gen_Update_Value": "",
"Gen_ValidIcon": "",
"Gen_Warning": "",
"Gen_Add_All": "Přidat vše",
"Gen_All_Devices": "Všechna zařízení",
"Gen_AreYouSure": "Jste si jistý?",
"Gen_Backup": "Spustit zálohování",
"Gen_Cancel": "Zrušit",
"Gen_Change": "Změnit",
"Gen_Copy": "Spustit",
"Gen_DataUpdatedUITakesTime": "OK - může zabrat chvíli aktualizovat rozhraní, pokud běží scan.",
"Gen_Delete": "Smazat",
"Gen_DeleteAll": "Smazat vše",
"Gen_Description": "Popis",
"Gen_Error": "Chyba",
"Gen_Filter": "Filtr",
"Gen_Generate": "Vygenerovat",
"Gen_LockedDB": "CHYBA - Databáze je možná zamčená - Zkontrolujte F12 -> Nástroje pro vývojáře -> Konzole. nebo to zkuste později.",
"Gen_Offline": "Offline",
"Gen_Okay": "Ok",
"Gen_Online": "Online",
"Gen_Purge": "Vyčistit",
"Gen_ReadDocs": "Přečíst více v dokumentaci.",
"Gen_Remove_All": "Odstranit vše",
"Gen_Remove_Last": "Odstranit poslední",
"Gen_Reset": "Vyresetovat",
"Gen_Restore": "Spustit obnovu",
"Gen_Run": "Spustit",
"Gen_Save": "Uložit",
"Gen_Saved": "Uloženo",
"Gen_Search": "Hledat",
"Gen_Select": "Vybrat",
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Vybrat na náhled",
"Gen_Selected_Devices": "Vybraná zařízení:",
"Gen_Switch": "Přepnout",
"Gen_Upd": "Úspěšně aktualizováno",
"Gen_Upd_Fail": "Aktualizace se nezdařila",
"Gen_Update": "Aktualizovat",
"Gen_Update_Value": "Aktualizovat hodnotu",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Upozornění",
"Gen_Work_In_Progress": "",
"Gen_create_new_device": "",
"Gen_create_new_device_info": "",
@@ -704,13 +704,13 @@
"WF_Trigger": "",
"WF_Trigger_event_type": "",
"WF_Trigger_type": "",
"add_icon_event_icon": "",
"add_icon_event_tooltip": "",
"add_option_event_icon": "",
"add_option_event_tooltip": "",
"copy_icons_event_icon": "",
"copy_icons_event_tooltip": "",
"devices_old": "",
"add_icon_event_icon": "fa-square-plus",
"add_icon_event_tooltip": "Přidat novou ikonu",
"add_option_event_icon": "fa-square-plus",
"add_option_event_tooltip": "Přidat novou hodnotu",
"copy_icons_event_icon": "fa-copy",
"copy_icons_event_tooltip": "Přepiš ikony všech zařízení za stejný typ zařízení",
"devices_old": "Obnovuji…",
"general_event_description": "",
"general_event_title": "",
"go_to_node_event_icon": "",

View File

@@ -17,7 +17,7 @@
"About_Exit": "Abmelden",
"About_Title": "Netzwerksicherheitsscanner und Benachrichtigungsframework",
"AppEvents_AppEventProcessed": "Verarbeitet",
"AppEvents_DateTimeCreated": "Protokolliert",
"AppEvents_DateTimeCreated": "Entdeckt am",
"AppEvents_Extra": "Extra",
"AppEvents_GUID": "Anwendungsereignis-GUID",
"AppEvents_Helper1": "Helfer 1",
@@ -98,7 +98,7 @@
"DevDetail_GoToNetworkNode": "Zur Netzwerkseite des angegebenen Knotens navigieren.",
"DevDetail_Icon": "Icon",
"DevDetail_Icon_Descr": "Geben Sie einen Font Awesome Icon-Namen ohne das Präfix „fa-“ ein oder die vollständige Klasse, z. B.: fa fa-brands fa-apple.",
"DevDetail_Loading": "Laden ...",
"DevDetail_Loading": "Laden ",
"DevDetail_MainInfo_Comments": "Notiz",
"DevDetail_MainInfo_Favorite": "Favorit",
"DevDetail_MainInfo_Group": "Gruppe",
@@ -263,7 +263,7 @@
"ENCRYPTION_KEY_name": "Verschlüsselungsschlüssel",
"Email_display_name": "Email",
"Email_icon": "<i class=\"fa fa-at\"></i>",
"Events_Loading": "Laden...",
"Events_Loading": "Laden",
"Events_Periodselect_All": "Alle Ereignisse",
"Events_Periodselect_LastMonth": "Letzter Monat",
"Events_Periodselect_LastWeek": "Letzte Woche",
@@ -353,7 +353,7 @@
"LOADED_PLUGINS_name": "Geladene Plugins",
"LOG_LEVEL_description": "Diese Einstellung aktiviert die erweiterte Protokollierung. Nützlich fürs Debuggen von in die Datenbank geschriebenen Events.",
"LOG_LEVEL_name": "Erweiterte Protokollierung",
"Loading": "Laden...",
"Loading": "Laden",
"Login_Box": "Passwort eingeben",
"Login_Default_PWD": "Standardpasswort \"123456\" noch immer aktiv.",
"Login_Info": "",
@@ -386,28 +386,28 @@
"Maint_RestartServer": "Server neu starten",
"Maint_Restart_Server_noti_text": "Soll der Backend-Server wirklich neu gestartet werden? Das könnte Instabilitäten verursachen. Vorher ein Backup erstellen. <br/><br/>Hinweis: Das kann einige Minuten dauern.",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_Checking": "Prüfen …",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_InitCheck_Success": "Anwendung erfolgreich initialisiert!",
"Maintenance_ReCheck": "Prüfung wiederholen",
"Maintenance_Running_Version": "Installierte Version",
"Maintenance_Status": "Status",
"Maintenance_Title": "Wartungswerkzeuge",
"Maintenance_Tool_DownloadConfig": "Einstellungen exportieren",
"Maintenance_Tool_DownloadConfig_text": "",
"Maintenance_Tool_DownloadWorkflows": "",
"Maintenance_Tool_DownloadWorkflows_text": "",
"Maintenance_Tool_ExportCSV": "CSV Export",
"Maintenance_Tool_ExportCSV_noti": "CSV Export",
"Maintenance_Tool_DownloadConfig_text": "Download eines Voll-Backup deiner Einstellungen. Konfiguration gespeichert in <code>app.conf</code> Datei.",
"Maintenance_Tool_DownloadWorkflows": "Workflows Export",
"Maintenance_Tool_DownloadWorkflows_text": "Download eines Voll-Backups deiner Worksflows. Gespeichert in <code>workflows.json</code> Datei.",
"Maintenance_Tool_ExportCSV": "Export Geräte (csv)",
"Maintenance_Tool_ExportCSV_noti": "Geräte Export (csv)",
"Maintenance_Tool_ExportCSV_noti_text": "Sind Sie sich sicher, dass Sie die CSV-Datei erstellen wollen?",
"Maintenance_Tool_ExportCSV_text": "Generiere eine CSV-Datei (comma separated values) mit einer Liste aller Geräte und deren Beziehungen zwischen Netzwerkknoten und verbundenen Geräten. Dies kann auch durch das Besuchen der URL <code>your NetAlertX url/php/server/devices.php?action=ExportCSV</code> oder durch Aktivieren des <a href=\"settings.php#CSVBCKP_header\">CSV-Backups</a> ausgelöst werden.",
"Maintenance_Tool_ImportCSV": "CSV Import",
"Maintenance_Tool_ImportCSV_noti": "CSV Import",
"Maintenance_Tool_ImportCSV_noti_text": "Sind Sie sich sicher, dass Sie die CSV-Datei importieren wollen? Dies wird <b>alle Geräte in der Datenbank überschreiben</b>.",
"Maintenance_Tool_ImportCSV_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Importiere eine CSV-Datei (comma separated values) mit einer Liste aller Geräte und deren Beziehungen zwischen Netzwerkknoten und verbundenen Geräten. Um dies zu tun platziere die <b>devices.csv</b> benannte CSV-Datei in deinen <b>/config</b> Ordner.",
"Maintenance_Tool_ImportConfig_noti": "",
"Maintenance_Tool_ImportPastedCSV": "CSV-Import (Einfügen)",
"Maintenance_Tool_ImportPastedCSV_noti_text": "",
"Maintenance_Tool_ImportCSV": "Geräte Import (csv)",
"Maintenance_Tool_ImportCSV_noti": "Geräte Import (csv)",
"Maintenance_Tool_ImportCSV_noti_text": "Sind Sie sich sicher, dass Sie die CSV-Datei importieren wollen? Dies wird alle Geräte in der Datenbank <b>überschreiben</b>.",
"Maintenance_Tool_ImportCSV_text": "Mache ein Backup, bevor Du diese Funk­tion nutzt. Importiere eine CSV-Datei (comma separated values) mit einer Liste aller Geräte und deren Beziehungen zwischen Netzwerkknoten und verbundenen Geräten. Um dies zu tun platziere die <b>devices.csv</b> benannte CSV-Datei in deinen <b>/config</b> Ordner.",
"Maintenance_Tool_ImportConfig_noti": "Einstellungen importieren (app.conf)",
"Maintenance_Tool_ImportPastedCSV": "Geräte importieren (csv) (einfügen)",
"Maintenance_Tool_ImportPastedCSV_noti_text": "Bist Du dir sicher, dass Du die eingefügte CSV importieren willst? Es werden alle Geräte in deiner Datenbank <b>überschrieben</b>.",
"Maintenance_Tool_ImportPastedCSV_text": "",
"Maintenance_Tool_ImportPastedConfig": "",
"Maintenance_Tool_ImportPastedConfig_noti_text": "",
@@ -597,7 +597,7 @@
"Presence_Key_OnlinePastMiss": "",
"Presence_Key_OnlinePastMiss_desc": "",
"Presence_Key_OnlinePast_desc": "",
"Presence_Loading": "Laden...",
"Presence_Loading": "Laden",
"Presence_Shortcut_AllDevices": "Meine Geräte",
"Presence_Shortcut_Archived": "Archiviert",
"Presence_Shortcut_Connected": "Verbunden",

View File

@@ -9,7 +9,7 @@
"About_Exit": "Sign out",
"About_Title": "Network security scanner & notification framework",
"AppEvents_AppEventProcessed": "Processed",
"AppEvents_DateTimeCreated": "Logged",
"AppEvents_DateTimeCreated": "Discovered On",
"AppEvents_Extra": "Extra",
"AppEvents_GUID": "Application Event GUID",
"AppEvents_Helper1": "Helper 1",
@@ -86,7 +86,7 @@
"DevDetail_GoToNetworkNode": "Navigate to the Network page of the given node.",
"DevDetail_Icon": "Icon",
"DevDetail_Icon_Descr": "Enter a font awesome icon name without the fa- prefix or with complete class, e.g.: fa fa-brands fa-apple.",
"DevDetail_Loading": "Loading...",
"DevDetail_Loading": "Loading",
"DevDetail_MainInfo_Comments": "Comments",
"DevDetail_MainInfo_Favorite": "Favorite",
"DevDetail_MainInfo_Group": "Group",
@@ -177,7 +177,7 @@
"DevDetail_Tools_WOL": "Send WoL command to ",
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
"DevDetail_Tools_WOL_noti_text": "The Wake-on-LAN command is sent to the broadcast address. If the target is not in the subnet/VLAN of NetAlertX, the target device will not respond.",
"DevDetail_Type_hover": "The Type of the device. 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_Type_hover": "The Type of the device. 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": "Add new Icon",
@@ -194,7 +194,7 @@
"DevDetail_button_Save": "Save",
"DeviceEdit_ValidMacIp": "Enter a valid <b>Mac</b> and <b>IP</b> address.",
"Device_MultiEdit": "Multi-edit",
"Device_MultiEdit_Backup": "Careful, entering wrong values below will break your setup. Please backup your database or Devices configuration first (<a href=\"php/server/devices.php?action=ExportCSV\">click to download <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Read how to recover Devices from this file in the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">Backups documentation</a>.",
"Device_MultiEdit_Backup": "Careful, entering wrong values below will break your setup. Please backup your database or Devices configuration first (<a href=\"php/server/devices.php?action=ExportCSV\">click to download <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Read how to recover Devices from this file in the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">Backups documentation</a>. In order to apply your changes click the <b>Save<i class=\"fa-solid fa-save\"></i></b> icon on each field you want to update.",
"Device_MultiEdit_Fields": "Edit fields:",
"Device_MultiEdit_MassActions": "Mass actions:",
"Device_MultiEdit_Tooltip": "Careful. Clicking this will apply the value on the left to all devices selected above.",
@@ -251,7 +251,7 @@
"ENCRYPTION_KEY_name": "Encryption key",
"Email_display_name": "Email",
"Email_icon": "<i class=\"fa fa-at\"></i>",
"Events_Loading": "Loading...",
"Events_Loading": "Loading",
"Events_Periodselect_All": "All Info",
"Events_Periodselect_LastMonth": "Last Month",
"Events_Periodselect_LastWeek": "Last Week",
@@ -341,7 +341,7 @@
"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...",
"Loading": "Loading",
"Login_Box": "Enter your password",
"Login_Default_PWD": "Default password \"123456\" is still active.",
"Login_Info": "Passwords are set via the Set Password plugin. Check the <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">SETPWD docs</a> if you have issues logging in.",
@@ -360,7 +360,7 @@
"Maint_RestartServer": "Restart server",
"Maint_Restart_Server_noti_text": "Are you sure you want to restart the backend server? This may casue app inconsistency. Backup your setup first. <br/> <br/> Note: This may take a few minutes.",
"Maintenance_InitCheck": "Init Check",
"Maintenance_InitCheck_Checking": "Checking...",
"Maintenance_InitCheck_Checking": "Checking",
"Maintenance_InitCheck_QuickSetupGuide": "Make sure you followed the <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">quick setup guide</a>.",
"Maintenance_InitCheck_Success": "Application initialized succesfully!",
"Maintenance_ReCheck": "Retry Check",
@@ -446,7 +446,7 @@
"Maintenance_Tools_Tab_UISettings": "UI Settings",
"Maintenance_arp_status": "Scan Status",
"Maintenance_arp_status_off": "is currently disabled",
"Maintenance_arp_status_on": "scan(s) currently running",
"Maintenance_arp_status_on": "scanning in progress",
"Maintenance_built_on": "Built on",
"Maintenance_current_version": "You are up-to-date. Check out what <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">I am working on</a>.",
"Maintenance_database_backup": "DB Backups",
@@ -556,7 +556,7 @@
"Presence_Key_OnlinePastMiss": "Past online (miss-match)",
"Presence_Key_OnlinePastMiss_desc": "Device online in the past, but currently offline, but the start session might be missing or has conflicting data. (might be a bug - please submit a PR if you know how to fix it - I'm a bit lost in code here)",
"Presence_Key_OnlinePast_desc": "Device online in the past, but currently offline.",
"Presence_Loading": "Loading...",
"Presence_Loading": "Loading",
"Presence_Shortcut_AllDevices": "My Devices",
"Presence_Shortcut_Archived": "Archived",
"Presence_Shortcut_Connected": "Connected",
@@ -710,7 +710,7 @@
"add_option_event_tooltip": "Add new value",
"copy_icons_event_icon": "fa-copy",
"copy_icons_event_tooltip": "Overwrite icons of all devices with the same device type",
"devices_old": "Refreshing...",
"devices_old": "Refreshing",
"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",
"go_to_node_event_icon": "fa-square-up-right",
@@ -735,7 +735,7 @@
"settings_imported_label": "Settings imported",
"settings_missing": "Not all settings loaded! High load on the database or app startup sequence. Click the 🔄 reload button in the top.",
"settings_missing_block": "Error: Settings not loaded correctly. Click the reload button 🔄 at the top, alternatively, check the browser log for details (F12).",
"settings_old": "Importing settings and re-initializing...",
"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",
@@ -744,7 +744,7 @@
"settings_publishers_info": "Load more Publishers with the <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a> setting",
"settings_publishers_label": "Publishers",
"settings_readonly": "Can't READ or WRITE <code>app.conf</code>. Try restarting the container and read the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/FILE_PERMISSIONS.md\" target=\"_blank\">file permissions documentation</a>",
"settings_saved": "<br/>Settings saved. <br/> Reloading... <br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <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>",

View File

@@ -9,7 +9,7 @@
"About_Exit": "Se déconnecter",
"About_Title": "Analyse de la sécurité du réseau et cadre de notification",
"AppEvents_AppEventProcessed": "Traité(s)",
"AppEvents_DateTimeCreated": "Connecté",
"AppEvents_DateTimeCreated": "Découvert le",
"AppEvents_Extra": "Extra",
"AppEvents_GUID": "GUID dévénements de l'application",
"AppEvents_Helper1": "Assistant 1",
@@ -194,7 +194,7 @@
"DevDetail_button_Save": "Enregistrer",
"DeviceEdit_ValidMacIp": "Renseigner une adresse <b>Mac</b> et une adresse <b>IP</b> valides.",
"Device_MultiEdit": "Édition multiple",
"Device_MultiEdit_Backup": "Attention, renseigner des valeurs non cohérentes ci-dessous peut bloquer votre paramétrage. Veillez à faire une sauvegarde de votre base de données ou de la configuration de vos appareils en premier lieu (<a href=\"php/server/devices.php?action=ExportCSV\">clisuer ici pour la télécharger <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Renseignez-vous sur comment remettre les appareils depuis ce fichier via la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">documentation des sauvegardes</a>.",
"Device_MultiEdit_Backup": "Attention, renseigner des valeurs non cohérentes ci-dessous peut bloquer votre paramétrage. Veillez à faire une sauvegarde de votre base de données ou de la configuration de vos appareils en premier lieu (<a href=\"php/server/devices.php?action=ExportCSV\">clisuer ici pour la télécharger <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Renseignez-vous sur comment remettre les appareils depuis ce fichier via la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">documentation des sauvegardes</a>. Afin d'enregistrer les changements, cliquer sur l'icône <b>Sauvegarder<i class=\"fa-solid fa-save\"></i></b> sur chaque champ que vous voulez mettre à jour.",
"Device_MultiEdit_Fields": "Champs modifiables:",
"Device_MultiEdit_MassActions": "Actions en masse:",
"Device_MultiEdit_Tooltip": "Attention. Ceci va appliquer la valeur de gauche à tous les appareils sélectionnés au-dessus.",
@@ -341,7 +341,7 @@
"LOADED_PLUGINS_name": "Plugins chargés",
"LOG_LEVEL_description": "Ce paramètre active une journalisation dans les logs plus verbeuse. Cela est utile pour identifier les événements écrivant dans la base de données.",
"LOG_LEVEL_name": "Afficher des journaux de log additionnels",
"Loading": "Chargement...",
"Loading": "Chargement",
"Login_Box": "Saisir votre mot de passe",
"Login_Default_PWD": "Le mot de passe par défaut \"123456\" est encore actif.",
"Login_Info": "Les mots de passe sont définis via le plugin Set Password. Vérifiez la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">documentation de SETPWD</a> si vous rencontrez des difficultés à vous identifier.",
@@ -360,7 +360,7 @@
"Maint_RestartServer": "Relancer le serveur",
"Maint_Restart_Server_noti_text": "Êtes-vous sûr de vouloir relancer le serveur back-end? Cela peut causer des incohérences avec l'application. Sauvegarder vos paramètres en premier lieu. <br/> <br/> Remarque: cela peut prendre quelques minutes.",
"Maintenance_InitCheck": "Vérification initiale",
"Maintenance_InitCheck_Checking": "Vérification...",
"Maintenance_InitCheck_Checking": "Vérification",
"Maintenance_InitCheck_QuickSetupGuide": "Assurez-vous de suivre le <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">guide de démarrage rapide</a>.",
"Maintenance_InitCheck_Success": "Application initialisée avec succès!",
"Maintenance_ReCheck": "Relancer la vérification",
@@ -446,7 +446,7 @@
"Maintenance_Tools_Tab_UISettings": "Paramètres de l'interface",
"Maintenance_arp_status": "État du scan",
"Maintenance_arp_status_off": "est actuellement désactivé",
"Maintenance_arp_status_on": "scan(s) actuellement en cours",
"Maintenance_arp_status_on": "scan en cours",
"Maintenance_built_on": "Construit sur",
"Maintenance_current_version": "Vous êtes à jour. Découvrez sur quoi <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">je travaille</a>.",
"Maintenance_database_backup": "Sauvegardes de base de données",
@@ -710,7 +710,7 @@
"add_option_event_tooltip": "Ajouter une nouvelle valeur",
"copy_icons_event_icon": "fa-copy",
"copy_icons_event_tooltip": "Remplace les icônes de tous les appareils du même type",
"devices_old": "Rafraichissement...",
"devices_old": "Rafraichissement",
"general_event_description": "L'événement que vous avez lancé peut prendre du temps avant que les tâches de fond ne soit terminées. La durée d'exécution finira une fois que la file d'exécution ci-dessous sera vide (consulter les <a href='/maintenance.php#tab_Logging'>journaux d'erreur</a> si vous rencontrez des erreurs). <br/> <br/> File d'exécution:",
"general_event_title": "Lancement d'un événement sur mesure",
"go_to_node_event_icon": "fa-square-up-right",
@@ -735,7 +735,7 @@
"settings_imported_label": "Paramètres importés",
"settings_missing": "Tous les paramètres n'ont pas été chargés! La base de données est trop sollicitée, ou bien la séquence de démarrage de l'application est trop lourde. Cliquez sur le bouton de rafraîchissement 🔄 en haut.",
"settings_missing_block": "Erreur: les paramètres ne sont pas correctement chargés. Cliquer sur le bouton de rafraîchissement 🔄 en haut; sinon, vous pouvez vérifier les journaux du navigateur pour plus de détails (F12).",
"settings_old": "Importation des paramètres et réinitialisation...",
"settings_old": "Importation des paramètres et réinitialisation",
"settings_other_scanners": "Autres plugins activés, hors scanners d'appareils.",
"settings_other_scanners_icon": "fa-solid fa-recycle",
"settings_other_scanners_label": "Autres scanners",
@@ -750,4 +750,4 @@
"settings_update_item_warning": "Mettre à jour la valeur ci-dessous. Veillez à bien suivre le même format qu'auparavant. <b>Il n'y a pas de pas de contrôle.</b>",
"test_event_icon": "fa-vial-circle-check",
"test_event_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage."
}
}

26
front/php/templates/language/it_it.json Normal file → Executable file
View File

@@ -9,7 +9,7 @@
"About_Exit": "Esci",
"About_Title": "Scanner di sicurezza di rete e framework di notifica",
"AppEvents_AppEventProcessed": "Elaborato",
"AppEvents_DateTimeCreated": "Loggato",
"AppEvents_DateTimeCreated": "Scoperto il",
"AppEvents_Extra": "Extra",
"AppEvents_GUID": "GUID evento applicazione",
"AppEvents_Helper1": "Aiutante 1",
@@ -86,7 +86,7 @@
"DevDetail_GoToNetworkNode": "Passa alla pagina Rete del nodo specificato.",
"DevDetail_Icon": "Icona",
"DevDetail_Icon_Descr": "Inserisci il nome di un'icona Font Awesome senza il prefisso fa- o con la classe completa, es.: fa fa-brands fa-apple.",
"DevDetail_Loading": "Caricamento...",
"DevDetail_Loading": "Caricamento",
"DevDetail_MainInfo_Comments": "Commenti",
"DevDetail_MainInfo_Favorite": "Preferito",
"DevDetail_MainInfo_Group": "Gruppo",
@@ -177,7 +177,7 @@
"DevDetail_Tools_WOL": "Invia comando WoL a ",
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
"DevDetail_Tools_WOL_noti_text": "Il comando Wake-on-LAN viene inviato all'indirizzo di broadcast. Se la destinazione non si trova nella sottorete/VLAN di NetAlertX, il dispositivo di destinazione non risponderà.",
"DevDetail_Type_hover": "Il tipo del dispositivo. Se selezioni uno dei dispositivi di rete predefiniti (ad esempio: AP, Firewall, Router, Switch...) verranno visualizzati nella struttura di rete come possibili nodi della rete principale.",
"DevDetail_Type_hover": "Il tipo del dispositivo. Se selezioni uno dei dispositivi di rete predefiniti (ad esempio: AP, Firewall, Router, Switch) verranno visualizzati nella struttura di rete come possibili nodi della rete principale.",
"DevDetail_Vendor_hover": "Il produttore dovrebbe essere rilevato automaticamente. Puoi sovrascrivere o aggiungere un valore personalizzato.",
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
"DevDetail_button_AddIcon": "Aggiungi nuova icona",
@@ -194,7 +194,7 @@
"DevDetail_button_Save": "Salva",
"DeviceEdit_ValidMacIp": "Inserisci un indirizzo <b>Mac</b> e un indirizzo <b>IP</b> validi.",
"Device_MultiEdit": "Modifica multipla",
"Device_MultiEdit_Backup": "Attento, l'inserimento di valori errati di seguito interromperà la configurazione. Effettua prima il backup del database o della configurazione dei dispositivi (<a href=\"php/server/devices.php?action=ExportCSV\">fai clic per scaricare <i class=\"fa-solid fa-download fa-bounce\"></i> </a>). Leggi come ripristinare i dispositivi da questo file nella <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\" _blank\">Documentazione di backup</a>.",
"Device_MultiEdit_Backup": "Attento, l'inserimento di valori errati di seguito interromperà la configurazione. Effettua prima il backup del database o della configurazione dei dispositivi (<a href=\"php/server/devices.php?action=ExportCSV\">fai clic per scaricare <i class=\"fa-solid fa-download fa-bounce\"></i> </a>). Leggi come ripristinare i dispositivi da questo file nella <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\" _blank\">Documentazione di backup</a>. Per applicare le modifiche, fai clic sull'icona <b>Salva<i class=\"fa-solid fa-save\"></i></b> su ogni campo che desideri aggiornare.",
"Device_MultiEdit_Fields": "Modifica campi:",
"Device_MultiEdit_MassActions": "Azioni di massa:",
"Device_MultiEdit_Tooltip": "Attento. Facendo clic verrà applicato il valore sulla sinistra a tutti i dispositivi selezionati sopra.",
@@ -251,7 +251,7 @@
"ENCRYPTION_KEY_name": "Chiave di crittografia",
"Email_display_name": "E-mail",
"Email_icon": "<i class=\"fa fa-at\"></i>",
"Events_Loading": "Caricamento...",
"Events_Loading": "Caricamento",
"Events_Periodselect_All": "Tutte le info",
"Events_Periodselect_LastMonth": "Ultimo mese",
"Events_Periodselect_LastWeek": "Ultima settimana",
@@ -341,7 +341,7 @@
"LOADED_PLUGINS_name": "Plugin caricati",
"LOG_LEVEL_description": "Questa impostazione abilita un log più dettagliato. Utile per il debug degli eventi salvati nel database.",
"LOG_LEVEL_name": "Stampa log aggiuntivo",
"Loading": "Caricamento...",
"Loading": "Caricamento",
"Login_Box": "Inserisci la tua password",
"Login_Default_PWD": "La password predefinita \"123456\" è ancora attiva.",
"Login_Info": "Le password vengono impostate tramite il plugin Set Password. Controlla la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">documentazione SETPWD</a> se riscontri problemi di accesso.",
@@ -360,7 +360,7 @@
"Maint_RestartServer": "Riavvia server",
"Maint_Restart_Server_noti_text": "Sei sicuro di voler riavviare il server backend? Questo potrebbe causare incoerenze dell'app. Prima esegui il backup della tua configurazione. <br/> <br/> Nota: l'operazione potrebbe richiedere alcuni minuti.",
"Maintenance_InitCheck": "Controllo iniziale",
"Maintenance_InitCheck_Checking": "Controllo in corso...",
"Maintenance_InitCheck_Checking": "Controllo in corso",
"Maintenance_InitCheck_QuickSetupGuide": "Assicurati di aver seguito la <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">guida di configurazione rapida</a>.",
"Maintenance_InitCheck_Success": "Applicazione inizializzata con successo!",
"Maintenance_ReCheck": "Riprova controllo",
@@ -446,7 +446,7 @@
"Maintenance_Tools_Tab_UISettings": "Impostazioni UI",
"Maintenance_arp_status": "Stato scansione",
"Maintenance_arp_status_off": "è attualmente disabilitato",
"Maintenance_arp_status_on": "scansioni attualmente in esecuzione",
"Maintenance_arp_status_on": "scansione in corso",
"Maintenance_built_on": "Rilasciato il",
"Maintenance_current_version": "Sei aggiornato. Scopri <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">a cosa sto lavorando</a>.",
"Maintenance_database_backup": "Backup DB",
@@ -556,7 +556,7 @@
"Presence_Key_OnlinePastMiss": "Online in passato (non corrispondente)",
"Presence_Key_OnlinePastMiss_desc": "Dispositivo online in passato, ma attualmente offline, ma la sessione di avvio potrebbe essere mancante o presentare dati in conflitto. (potrebbe trattarsi di un bug: invia una PR se sai come risolverlo, sono un po' perso nel codice qui)",
"Presence_Key_OnlinePast_desc": "Dispositivo online in passato, ma attualmente offline.",
"Presence_Loading": "Caricamento...",
"Presence_Loading": "Caricamento",
"Presence_Shortcut_AllDevices": "Miei dispositivi",
"Presence_Shortcut_Archived": "Archiviati",
"Presence_Shortcut_Connected": "Connessi",
@@ -710,7 +710,7 @@
"add_option_event_tooltip": "Aggiungi nuovo valore",
"copy_icons_event_icon": "fa-copy",
"copy_icons_event_tooltip": "Sovrascrivi le icone di tutti i dispositivi con lo stesso tipo di dispositivo",
"devices_old": "Aggiornamento...",
"devices_old": "Aggiornamento",
"general_event_description": "L'evento che hai attivato potrebbe richiedere del tempo prima che i processi in background vengano completati. L'esecuzione è terminata una volta che la coda di esecuzione sottostante si è svuotata (controlla il <a href='/maintenance.php#tab_Logging'>log degli errori</a> se riscontri problemi). <br/> <br/> Coda di esecuzione:",
"general_event_title": "Esecuzione di un evento ad-hoc",
"go_to_node_event_icon": "fa-square-up-right",
@@ -735,7 +735,7 @@
"settings_imported_label": "Impostazioni importate",
"settings_missing": "Non tutte le impostazioni sono state caricate! Carico elevato sul database o sulla sequenza di avvio dell'app. Fai clic sul pulsante 🔄 ricarica in alto.",
"settings_missing_block": "Errore: impostazioni non caricate correttamente. Fai clic sul pulsante di ricarica 🔄 in alto, in alternativa, controlla il registro del browser per i dettagli (F12).",
"settings_old": "Importazione impostazioni e riavvio in corso...",
"settings_old": "Importazione impostazioni e riavvio in corso",
"settings_other_scanners": "Altri plugin, non scanner per dispositivi, che sono attualmente abilitati.",
"settings_other_scanners_icon": "fa-solid fa-recycle",
"settings_other_scanners_label": "Altri scanner",
@@ -744,10 +744,10 @@
"settings_publishers_info": "Carica più editori con l'impostazione <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
"settings_publishers_label": "Editori",
"settings_readonly": "Impossibile LEGGERE o SCRIVERE <code>app.conf</code>. Prova a riavviare il contenitore e leggi la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/FILE_PERMISSIONS.md\" target=\"_blank\">documentazione sulle autorizzazioni dei file</a>",
"settings_saved": "<br/>Impostazioni salvate. <br/> Aggiornamento in corso... <br/> <i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
"settings_saved": "<br/>Impostazioni salvate. <br/> Aggiornamento in corso <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": "Sistema",
"settings_update_item_warning": "Aggiorna il valore qui sotto. Fai attenzione a seguire il formato precedente. <b>La convalida non viene eseguita.</b>",
"test_event_icon": "fa-vial-circle-check",
"test_event_tooltip": "Salva le modifiche prima di provare le nuove impostazioni."
}
}

View File

@@ -9,7 +9,7 @@
"About_Exit": "Зарегистрироваться",
"About_Title": "Сетевой сканер и система уведомлений",
"AppEvents_AppEventProcessed": "Обработанный",
"AppEvents_DateTimeCreated": "Журнал",
"AppEvents_DateTimeCreated": "Обнаружено",
"AppEvents_Extra": "Дополнительно",
"AppEvents_GUID": "GUID события приложения",
"AppEvents_Helper1": "Помощник 1",
@@ -86,7 +86,7 @@
"DevDetail_GoToNetworkNode": "Перейти на страницу Сеть данного узла.",
"DevDetail_Icon": "Значок",
"DevDetail_Icon_Descr": "Введите имя значка Font Awesome без префикса fa- или с полным классом, например: fa fa-brands fa-apple.",
"DevDetail_Loading": "Загрузка...",
"DevDetail_Loading": "Загрузка",
"DevDetail_MainInfo_Comments": "Комментарии",
"DevDetail_MainInfo_Favorite": "Избранное",
"DevDetail_MainInfo_Group": "Группа",
@@ -194,7 +194,7 @@
"DevDetail_button_Save": "Сохранить",
"DeviceEdit_ValidMacIp": "Введите действительный <b>Mac</b> и <b>IP</b> адрес.",
"Device_MultiEdit": "Мультиредакт",
"Device_MultiEdit_Backup": "Будьте осторожны: ввод неправильных значений ниже приведет к поломке вашей настройки. Сначала сделайте резервную копию базы данных или конфигурации устройств (<a href=\"php/server/devices.php?action=ExportCSV\">нажмите для загрузки <i class=\"fa-solid fa-download fa-bounce\"></i></a>). О том, как восстановить Устройства из этого файла, читайте в разделе <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">Документация о резервном копировании</a>.",
"Device_MultiEdit_Backup": "Будьте осторожны: ввод неправильных значений ниже приведет к поломке вашей настройки. Сначала сделайте резервную копию базы данных или конфигурации устройств (<a href=\"php/server/devices.php?action=ExportCSV\">нажмите для загрузки <i class=\"fa-solid fa-download fa-bounce\"></i></a>). О том, как восстановить Устройства из этого файла, читайте в разделе <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">Документация о резервном копировании</a>. Чтобы применить свои изменения, нажмите на значок <b> Сохранить <i class = \"fa-solid fa-save\"> </i> </b> в каждом поле, которое вы хотите обновить.",
"Device_MultiEdit_Fields": "Редактировать поля:",
"Device_MultiEdit_MassActions": "Массовые действия:",
"Device_MultiEdit_Tooltip": "Осторожно. При нажатии на эту кнопку значение слева будет применено ко всем устройствам, выбранным выше.",
@@ -211,7 +211,7 @@
"Device_TableHead_AlertDown": "Оповещение о сост. ВЫКЛ",
"Device_TableHead_Connected_Devices": "Соединения",
"Device_TableHead_CustomProps": "Свойства / Действия",
"Device_TableHead_FQDN": "",
"Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Избранное",
"Device_TableHead_FirstSession": "Первый сеанс",
"Device_TableHead_GUID": "GUID",
@@ -251,7 +251,7 @@
"ENCRYPTION_KEY_name": "Ключ шифрования",
"Email_display_name": "Эл. почта",
"Email_icon": "<i class=\"fa fa-at\"></i>",
"Events_Loading": "Загрузка...",
"Events_Loading": "Загрузка",
"Events_Periodselect_All": "Вся информация",
"Events_Periodselect_LastMonth": "Последний месяц",
"Events_Periodselect_LastWeek": "Последняя неделя",
@@ -341,7 +341,7 @@
"LOADED_PLUGINS_name": "Загруженные плагины",
"LOG_LEVEL_description": "Этот параметр включит более подробное ведение журнала. Полезно для отладки записи событий в базу данных.",
"LOG_LEVEL_name": "Распечатать дополнительный журнал",
"Loading": "Загрузка...",
"Loading": "Загрузка",
"Login_Box": "Введите пароль",
"Login_Default_PWD": "Пароль по умолчанию «123456» все еще активен.",
"Login_Info": "Пароли устанавливаются через плагин Set Password. Если у вас возникли проблемы со входом в систему, проверьте <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">SEPWD документацию</a>.",
@@ -359,11 +359,11 @@
"Maint_PurgeLog": "Очистить журнал",
"Maint_RestartServer": "Перезапустить сервер",
"Maint_Restart_Server_noti_text": "Вы уверены, что хотите перезапустить внутренний сервер? Это может привести к несогласованности работы приложения. Сначала создайте резервную копию настроек. <br/> <br/> Примечание: Это может занять несколько минут.",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_InitCheck": "Инициализация проверки",
"Maintenance_InitCheck_Checking": "Проверяется…",
"Maintenance_InitCheck_QuickSetupGuide": "Убедитесь, что вы следовали быстрому руководству по настройке <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\"></a>.",
"Maintenance_InitCheck_Success": "Приложение инициализировано успешно!",
"Maintenance_ReCheck": "Повторить проверку",
"Maintenance_Running_Version": "Установленная версия",
"Maintenance_Status": "Статус",
"Maintenance_Title": "Инструменты обслуживания",
@@ -446,7 +446,7 @@
"Maintenance_Tools_Tab_UISettings": "Интерфейс",
"Maintenance_arp_status": "Состояние сканирования",
"Maintenance_arp_status_off": "в настоящее время отключен",
"Maintenance_arp_status_on": "сканирование, выполняется в данный момент",
"Maintenance_arp_status_on": "выполняется сканирование",
"Maintenance_built_on": "Сборка от",
"Maintenance_current_version": "Вы в курсе событий. Узнайте, над чем <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">я работаю</a>.",
"Maintenance_database_backup": "Резервные копии БД",
@@ -556,7 +556,7 @@
"Presence_Key_OnlinePastMiss": "В прошлом в сети (несовпадение)",
"Presence_Key_OnlinePastMiss_desc": "Устройство в прошлом было подключено к сети, но сейчас находится в автономном режиме, однако стартовый сеанс может отсутствовать или иметь противоречивые данные. (Возможно, это ошибка — отправьте PR, если знаете, как это исправить — здесь я немного запутался в коде)",
"Presence_Key_OnlinePast_desc": "Устройство раньше было в сети, но в настоящее время не в сети.",
"Presence_Loading": "Загрузка...",
"Presence_Loading": "Загрузка",
"Presence_Shortcut_AllDevices": "Мои устройства",
"Presence_Shortcut_Archived": "Архив",
"Presence_Shortcut_Connected": "Подключенные",
@@ -565,8 +565,8 @@
"Presence_Shortcut_Favorites": "Избранные",
"Presence_Shortcut_NewDevices": "Новые устройства",
"Presence_Title": "Присутствие по устройству",
"REFRESH_FQDN_description": "",
"REFRESH_FQDN_name": "",
"REFRESH_FQDN_description": "Повторное сканирование всех устройств и обновление их полного доменного имени (FQDN). Если эта функция отключена, то для повышения производительности сканируются только устройства без известного имени. В этом случае FQDN обновляется только при первоначальном обнаружении устройства.",
"REFRESH_FQDN_name": "Обновить FQDN",
"REPORT_DASHBOARD_URL_description": "Этот URL-адрес используется в качестве основы для создания ссылок в отчетах HTML (например, в электронных письмах). Введите полный URL-адрес, начинающийся с <code>http://</code>, включая номер порта (без косой черты <code>/</code>).",
"REPORT_DASHBOARD_URL_name": "NetAlertX URL",
"REPORT_ERROR": "Страница, которую вы ищете, временно недоступна, повторите попытку через несколько секунд",
@@ -710,7 +710,7 @@
"add_option_event_tooltip": "Добавить новое значение",
"copy_icons_event_icon": "fa-copy",
"copy_icons_event_tooltip": "Заменить иконки всех устройств с одним и тем же типом устройства",
"devices_old": "Актуализируется...",
"devices_old": "Актуализируется",
"general_event_description": "Событие, которое вы инициировали, может занять некоторое время, прежде чем фоновые процессы завершатся. Выполнение завершится, как только очередь выполнения, указанная ниже, опустеет (Проверьте <a href='/maintenance.php#tab_Logging'>журнал ошибок</a> при возникновении проблем). <br/> <br/>· · Очередь выполнения:",
"general_event_title": "Выполнение специального события",
"go_to_node_event_icon": "fa-square-up-right",
@@ -735,7 +735,7 @@
"settings_imported_label": "Настройки импортированы",
"settings_missing": "Не все настройки загружены! Высокая нагрузка на базу данных или последовательность запуска приложения. Нажмите кнопку 🔄 перезагрузить вверху.",
"settings_missing_block": "Ошибка: Настройки загружены неправильно. Нажмите кнопку перезагрузки 🔄 вверху или проверьте журнал браузера для получения подробной информации (F12).",
"settings_old": "Импорт настроек и повторная инициализация...",
"settings_old": "Импорт настроек и повторная инициализация",
"settings_other_scanners": "Другие плагины сканера, не относящиеся к устройствам, которые в настоящее время включены.",
"settings_other_scanners_icon": "fa-solid fa-recycle",
"settings_other_scanners_label": "Другие сканеры",

View File

@@ -9,7 +9,7 @@
"About_Exit": "Вийти",
"About_Title": "Сканер безпеки мережі та структура сповіщень",
"AppEvents_AppEventProcessed": "Оброблено",
"AppEvents_DateTimeCreated": "Зареєстровано",
"AppEvents_DateTimeCreated": "Виявлено",
"AppEvents_Extra": "Екстра",
"AppEvents_GUID": "GUID події програми",
"AppEvents_Helper1": "Помічник 1",
@@ -86,7 +86,7 @@
"DevDetail_GoToNetworkNode": "Перейдіть на сторінку Мережа даного вузла.",
"DevDetail_Icon": "значок",
"DevDetail_Icon_Descr": "Введіть чудову назву значка шрифту без префікса fa- або з повним класом, наприклад: fa fa-бренди fa-яблуко.",
"DevDetail_Loading": "Завантаження...",
"DevDetail_Loading": "Завантаження",
"DevDetail_MainInfo_Comments": "Коментарі",
"DevDetail_MainInfo_Favorite": "улюблений",
"DevDetail_MainInfo_Group": "Група",
@@ -177,7 +177,7 @@
"DevDetail_Tools_WOL": "Надіслати команду WoL до ",
"DevDetail_Tools_WOL_noti": "Wake-on -LAN",
"DevDetail_Tools_WOL_noti_text": "Команда Wake-on-LAN надсилається на широкомовну адресу. Якщо ціль не входить до підмережі/VLAN NetAlertX, цільовий пристрій не відповідатиме.",
"DevDetail_Type_hover": "Тип пристрою. Якщо вибрати будь-який із попередньо визначених мережевих пристроїв (наприклад, точку доступу, брандмауер, маршрутизатор, комутатор...), вони відображатимуться в конфігурації дерева мережі як можливий головний вузол мережі..",
"DevDetail_Type_hover": "Тип пристрою. Якщо ви оберете будь-який із попередньо визначених мережевих пристроїв (наприклад: точка доступу, брандмауер, маршрутизатор, комутатор), вони відображатимуться в конфігурації дерева мережі як можливі батьківські вузли мережі.",
"DevDetail_Vendor_hover": "Постачальник має бути автоматично визначений. Ви можете перезаписати або додати власне значення.",
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on- LAN",
"DevDetail_button_AddIcon": "Додати новий значок",
@@ -194,7 +194,7 @@
"DevDetail_button_Save": "зберегти",
"DeviceEdit_ValidMacIp": "Введіть дійсну адресу <b>Mac</b> та <b>IP</b>.",
"Device_MultiEdit": "Мультиредагування",
"Device_MultiEdit_Backup": "Обережно, введення неправильних значень нижче порушить налаштування. Спершу створіть резервну копію вашої бази даних або конфігурації пристроїв (<a href=\"php/server/devices.php?action=ExportCSV\">натисніть, щоб завантажити <i class=\"fa-solid fa-download fa-bounce\"></i> </a>). Прочитайте, як відновити пристрої з цього файлу, у <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\" _blank\">Документація резервних копій</a>.",
"Device_MultiEdit_Backup": "Обережно, введення неправильних значень нижче призведе до порушення роботи налаштувань. Спочатку створіть резервну копію бази даних або конфігурації пристроїв (<a href=\"php/server/devices.php?action=ExportCSV\">натисніть, щоб завантажити <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Прочитайте, як відновити пристрої з цього файлу, у <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">документації щодо резервних копій</a>. Щоб застосувати зміни, натисніть значок <b>Зберегти<i class=\"fa-solid fa-save\"></i></b> у кожному полі, яке потрібно оновити.",
"Device_MultiEdit_Fields": "Редагувати поля:",
"Device_MultiEdit_MassActions": "Масові акції:",
"Device_MultiEdit_Tooltip": "Обережно. Якщо натиснути це, значення зліва буде застосовано до всіх пристроїв, вибраних вище.",
@@ -251,7 +251,7 @@
"ENCRYPTION_KEY_name": "Ключ шифрування",
"Email_display_name": "Електронна пошта",
"Email_icon": "<i class=\"fa fa-at\"></i>",
"Events_Loading": "Завантаження...",
"Events_Loading": "Завантаження",
"Events_Periodselect_All": "Вся інформація",
"Events_Periodselect_LastMonth": "Останній місяць",
"Events_Periodselect_LastWeek": "Минулий тиждень",
@@ -341,7 +341,7 @@
"LOADED_PLUGINS_name": "Завантажені плагіни",
"LOG_LEVEL_description": "Цей параметр увімкне докладніше журналювання. Корисно для налагодження запису подій у базу даних.",
"LOG_LEVEL_name": "Друк додаткового протоколювання",
"Loading": "Завантаження...",
"Loading": "Завантаження",
"Login_Box": "Введіть свій пароль",
"Login_Default_PWD": "Стандартний пароль \"123456\" все ще активний.",
"Login_Info": "Паролі встановлюються за допомогою плагіна Set Password. Перегляньте <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">документи SETPWD</a>, якщо у вас виникли проблеми з входом.",
@@ -360,7 +360,7 @@
"Maint_RestartServer": "Перезапустіть сервер",
"Maint_Restart_Server_noti_text": "Ви впевнені, що бажаєте перезапустити внутрішній сервер? Це може спричинити неузгодженість програми. Спершу створіть резервну копію налаштувань. <br/> <br/> Примітка. Це може зайняти кілька хвилин.",
"Maintenance_InitCheck": "Перевірка ініціалізації",
"Maintenance_InitCheck_Checking": "Перевірка...",
"Maintenance_InitCheck_Checking": "Перевірка",
"Maintenance_InitCheck_QuickSetupGuide": "Переконайтеся, що ви дотримувалися інструкцій у <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">короткому посібнику з налаштування</a>.",
"Maintenance_InitCheck_Success": "Застосунок успішно ініціалізовано!",
"Maintenance_ReCheck": "Повторна спроба перевірки",
@@ -446,7 +446,7 @@
"Maintenance_Tools_Tab_UISettings": "Налаштування інтерфейсу користувача",
"Maintenance_arp_status": "Статус сканування",
"Maintenance_arp_status_off": "наразі вимкнено",
"Maintenance_arp_status_on": "сканування, що зараз виконується",
"Maintenance_arp_status_on": "триває сканування",
"Maintenance_built_on": "Побудований на",
"Maintenance_current_version": "Ви в курсі подій. Перегляньте, над чим <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">я працюю</a>.",
"Maintenance_database_backup": "Резервне копіювання DB",
@@ -556,7 +556,7 @@
"Presence_Key_OnlinePastMiss": "Минулий онлайн (пропущений матч)",
"Presence_Key_OnlinePastMiss_desc": "Пристрій був онлайн, але зараз офлайн, але початковий сеанс може бути відсутнім або містить суперечливі дані. (може бути помилка - будь ласка, надішліть PR, якщо ви знаєте, як це виправити - я трохи загубився в коді тут)",
"Presence_Key_OnlinePast_desc": "Пристрій був онлайн, але зараз офлайн.",
"Presence_Loading": "Завантаження...",
"Presence_Loading": "Завантаження",
"Presence_Shortcut_AllDevices": "Мої пристрої",
"Presence_Shortcut_Archived": "Архівовано",
"Presence_Shortcut_Connected": "Підключено",
@@ -710,7 +710,7 @@
"add_option_event_tooltip": "Додати нове значення",
"copy_icons_event_icon": "фа-копія",
"copy_icons_event_tooltip": "Перезаписати піктограми всіх пристроїв одним типом пристрою",
"devices_old": "Освіжаючий...",
"devices_old": "Освіжає…",
"general_event_description": "Подія, яку ви ініціювали, може зайняти деякий час, поки завершаться фонові процеси. Виконання завершилося, коли наведена нижче черга виконання спорожнилася (перевірте <a href='/maintenance.php#tab_Logging'>журнал помилок</a>, якщо виникнуть проблеми). <br/> <br/> Черга виконання:",
"general_event_title": "Виконання спеціальної події",
"go_to_node_event_icon": "fa-квадрат-вгору-вправо",
@@ -735,7 +735,7 @@
"settings_imported_label": "Налаштування імпортовано",
"settings_missing": "Не всі налаштування завантажено! Високе навантаження на базу даних або послідовність запуску програми. Натисніть кнопку 🔄 перезавантажити вгорі.",
"settings_missing_block": "Помилка: налаштування не завантажено належним чином. Натисніть кнопку перезавантаження 🔄 вгорі або подробиці перевірте в журналі браузера (F12).",
"settings_old": "Імпорт налаштувань і повторна ініціалізація...",
"settings_old": "Імпорт налаштувань та повторна ініціалізація",
"settings_other_scanners": "Інші наразі ввімкнені плагіни сканера, не пов’язані з пристроєм.",
"settings_other_scanners_icon": "fa -solid fa-recycle",
"settings_other_scanners_label": "Інші сканери",
@@ -744,10 +744,10 @@
"settings_publishers_info": "Завантажте більше видавців за допомогою параметра <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
"settings_publishers_label": "Видавці",
"settings_readonly": "Неможливо ЧИТАТИ або ЗАПИСАТИ <code>app.conf</code>. Спробуйте перезапустити контейнер і прочитайте <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/FILE_PERMISSIONS.md\" target=\"_blank\">документацію щодо дозволів на файли</a>",
"settings_saved": "<br/>Налаштування збережено. <br/> Перезавантаження... <br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
"settings_saved": "<br/>Налаштування збережено. <br/> Перезавантаження <br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
"settings_system_icon": "фа-твердий фа-передача",
"settings_system_label": "Система",
"settings_update_item_warning": "Оновіть значення нижче. Слідкуйте за попереднім форматом. <b>Перевірка не виконана.</b>",
"test_event_icon": "fa-vial-circle- check",
"test_event_tooltip": "Перш ніж перевіряти налаштування, збережіть зміни."
}
}

View File

@@ -66,14 +66,13 @@ def main():
new_notifications = notifications.getNew()
# mylog('verbose', [f'[{pluginName}] new_notifications: ', new_notifications])
# mylog('verbose', [f'[{pluginName}] SMTP_SERVER: ', get_setting_value("SMTP_SERVER")])
# mylog('verbose', [f'[{pluginName}] SMTP_PORT: ', get_setting_value("SMTP_PORT")])
# mylog('verbose', [f'[{pluginName}] SMTP_SKIP_LOGIN: ', get_setting_value("SMTP_SKIP_LOGIN")])
mylog('verbose', [f'[{pluginName}] SMTP_SERVER: ', get_setting_value("SMTP_SERVER")])
mylog('verbose', [f'[{pluginName}] SMTP_PORT: ', get_setting_value("SMTP_PORT")])
mylog('verbose', [f'[{pluginName}] SMTP_SKIP_LOGIN: ', get_setting_value("SMTP_SKIP_LOGIN")])
# mylog('verbose', [f'[{pluginName}] SMTP_USER: ', get_setting_value("SMTP_USER")])
# mylog('verbose', [f'[{pluginName}] SMTP_PASS: ', get_setting_value("SMTP_PASS")])
# mylog('verbose', [f'[{pluginName}] SMTP_SKIP_TLS: ', get_setting_value("SMTP_SKIP_TLS")])
# mylog('verbose', [f'[{pluginName}] SMTP_FORCE_SSL: ', get_setting_value("SMTP_FORCE_SSL")])
# mylog('verbose', [f'[{pluginName}] SMTP_PASS: ', get_setting_value("SMTP_PASS")])
mylog('verbose', [f'[{pluginName}] SMTP_SKIP_TLS: ', get_setting_value("SMTP_SKIP_TLS")])
mylog('verbose', [f'[{pluginName}] SMTP_FORCE_SSL: ', get_setting_value("SMTP_FORCE_SSL")])
# mylog('verbose', [f'[{pluginName}] SMTP_REPORT_TO: ', get_setting_value("SMTP_REPORT_TO")])
# mylog('verbose', [f'[{pluginName}] SMTP_REPORT_FROM: ', get_setting_value("SMTP_REPORT_FROM")])

View File

@@ -58,9 +58,9 @@ def main():
# Retrieve devices
if get_setting_value("REFRESH_FQDN"):
devices = device_handler.getUnknown()
else:
devices = device_handler.getAll()
else:
devices = device_handler.getUnknown()
mylog('verbose', [f'[{pluginName}] Devices count: {len(devices)}'])

View File

@@ -52,7 +52,7 @@
{ "elementType": "select", "elementOptions": [], "transformers": [] }
]
},
"default_value": "before_name_updates",
"default_value": "disabled",
"options": [
"disabled",
"before_name_updates",

View File

@@ -178,15 +178,15 @@
"description": [
{
"language_code": "en_us",
"string": "Only enabled if you select <code>schedule</code> in the <a href=\"#NBTSCAN_RUN\"><code>NBTSCAN_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."
"string": "Only enabled if you select <code>schedule</code> in the <a href=\"#DIGSCAN_RUN\"><code>DIGSCAN_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=\"#NBTSCAN_RUN\"><code>NBTSCAN_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."
"string": "Solo está habilitado si selecciona <code>schedule</code> en la configuración <a href=\"#DIGSCAN_RUN\"><code>DIGSCAN_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=\"#NBTSCAN_RUN\"><code>NBTSCAN_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."
"string": "Nur aktiviert, wenn Sie <code>schedule</code> in der <a href=\"#DIGSCAN_RUN\"><code>DIGSCAN_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."
}
]
},

View File

@@ -56,9 +56,9 @@ def main():
# Retrieve devices
if get_setting_value("REFRESH_FQDN"):
devices = device_handler.getUnknown()
else:
devices = device_handler.getAll()
else:
devices = device_handler.getUnknown()
mylog('verbose', [f'[{pluginName}] Devices count: {len(devices)}'])

View File

@@ -53,5 +53,6 @@ As address, you can either use the public IP of the Freebox, or the unique domai
## Other info
- Version: 1.0
- Author: [KayJay7](https://github.com/KayJay7) & [Lucide](https://github.com/Lucide)
- Author: [KayJay7](https://github.com/KayJay7), [Lucide](https://github.com/Lucide)
- Maintainers: [mathoudebine](https://github.com/mathoudebine)
- Release Date: 2-Dec-2024

View File

@@ -66,13 +66,23 @@ device_type_map = {
"networking_device": "Router",
"multimedia_device": "TV Decoder",
"car": "House Appliance",
"watch": "Clock",
"light": "Domotic",
"outlet": "Domotic",
"appliances": "House Appliance",
"thermostat": "Domotic",
"shutter": "Domotic",
"other": "(Unknown)",
}
def map_device_type(type: str):
return device_type_map[type]
try:
return device_type_map[type]
except KeyError:
# This device type has not been mapped yet
mylog("minimal", [f"[{pluginName}] Unknown device type: {type}"])
return device_type_map["other"]
async def get_device_data(api_version: int, api_address: str, api_port: int):
# ensure existence of db path

View File

@@ -52,7 +52,7 @@
{ "elementType": "select", "elementOptions": [], "transformers": [] }
]
},
"default_value": "before_name_updates",
"default_value": "disabled",
"options": [
"disabled",
"before_name_updates",

View File

@@ -58,9 +58,9 @@ def main():
# Retrieve devices
if get_setting_value("REFRESH_FQDN"):
devices = device_handler.getUnknown()
else:
devices = device_handler.getAll()
else:
devices = device_handler.getUnknown()
mylog('verbose', [f'[{pluginName}] Devices count: {len(devices)}'])

View File

@@ -505,7 +505,7 @@
"column": "Dummy",
"mapped_to_column": "cur_ScanMethod",
"mapped_to_column_data": {
"value": "nmap-dev-scan"
"value": "NMAPDEV"
},
"css_classes": "col-sm-2",
"show": true,

View File

@@ -60,9 +60,9 @@ def main():
# Retrieve devices
if get_setting_value("REFRESH_FQDN"):
devices = device_handler.getUnknown()
else:
devices = device_handler.getAll()
else:
devices = device_handler.getUnknown()
mylog('verbose', [f'[{pluginName}] Devices count: {len(devices)}'])

View File

@@ -12,7 +12,7 @@ import sys
import requests
from requests import Request, Session, packages
from requests.packages.urllib3.exceptions import InsecureRequestWarning
from pyunifi.controller import Controller
from nax_pyunifi.controller import Controller
# Register NetAlertX directories
@@ -96,7 +96,14 @@ def get_entries(plugin_objects: Plugin_Objects) -> Plugin_Objects:
mylog('verbose', [f'[{pluginName}] site: {site}'])
c = Controller(UNIFI_HOST, UNIFI_USERNAME, UNIFI_PASSWORD, port=PORT, version=VERSION, ssl_verify=VERIFYSSL, site_id=site)
c = Controller(
UNIFI_HOST,
UNIFI_USERNAME,
UNIFI_PASSWORD,
port=PORT,
version=VERSION,
ssl_verify=VERIFYSSL,
site_id=site)
online_macs = set()
processed_macs = []

View File

@@ -19,7 +19,7 @@ from plugin_helper import Plugin_Object, Plugin_Objects, decodeBase64, handleEmp
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value
from const import logPath, applicationPath, fullDbPath
from device import query_MAC_vendor
from scan.device_handling import query_MAC_vendor
import conf
from pytz import timezone

View File

@@ -3,6 +3,7 @@
import argparse
import requests
from requests.exceptions import SSLError, Timeout, RequestException
import pathlib
import sys
import os

View File

@@ -43,11 +43,12 @@ nav:
- Reverse Proxy: REVERSE_PROXY.md
- Webhooks (n8n): WEBHOOK_N8N.md
- Workflows: WORKFLOWS.md
- Workflow Examples: WORKFLOW_EXAMPLES.md
- Docker Swarm: DOCKER_SWARM.md
- Help:
- Common issues: COMMON_ISSUES.md
- Random MAC: RANDOM_MAC.md
- Random MAC: RANDOM_MAC.md
- Incorrect Offline Detection: FIX_OFFLINE_DETECTION.md
- Device guides:
- Editing Devices:
- Management: DEVICE_MANAGEMENT.md
@@ -61,6 +62,7 @@ nav:
- Troubleshooting:
- Inspecting Logs: LOGGING.md
- Debugging Tips: DEBUG_TIPS.md
- Debugging GraphQL: DEBUG_GRAPHQL.md
- Debugging Invalid JSON: DEBUG_INVALID_JSON.md
- Debugging Plugins: DEBUG_PLUGINS.md
- Debugging Web UI Port: WEB_UI_PORT_DEBUG.md

View File

@@ -38,6 +38,14 @@ Run the script with the required parameters:
### Example Commands
#### Install Requirements
You will need to install dependencies in the container:
```bash
pip install paramiko
```
#### Using Password Authentication
```sh
./script.py --host 192.168.1.1 --username admin --password mypassword --output /tmp/dnsmasq.leases

View File

@@ -78,8 +78,8 @@ def main ():
db.open()
sql = db.sql # To-Do replace with the db class
# Upgrade DB if needed
db.upgradeDB()
# Init DB
db.initDB()
# Initialize the WorkflowManager
workflow_manager = WorkflowManager(db)

View File

@@ -10,6 +10,7 @@ from const import fullDbPath, sql_devices_stats, sql_devices_all, sql_generateGu
from logger import mylog
from helper import json_obj, initOrSetParam, row_to_json, timeNowTZ
from workflows.app_events import AppEvent_obj
from db.db_upgrade import ensure_column, ensure_views, ensure_CurrentScan, ensure_plugins_tables, ensure_Parameters, ensure_Settings
class DB():
"""
@@ -76,287 +77,35 @@ class DB():
return arr
#-------------------------------------------------------------------------------
def upgradeDB(self):
def initDB(self):
"""
Check the current tables in the DB and upgrade them if neccessary
"""
# -------------------------------------------------------------------------
# Alter Devices table
# -------------------------------------------------------------------------
# VIEWS
self.sql.execute(""" DROP VIEW IF EXISTS Events_Devices;""")
self.sql.execute(""" CREATE VIEW Events_Devices AS
SELECT *
FROM Events
LEFT JOIN Devices ON eve_MAC = devMac;
""")
self.sql.execute(""" DROP VIEW IF EXISTS LatestEventsPerMAC;""")
self.sql.execute("""CREATE VIEW LatestEventsPerMAC AS
WITH RankedEvents AS (
SELECT
e.*,
ROW_NUMBER() OVER (PARTITION BY e.eve_MAC ORDER BY e.eve_DateTime DESC) AS row_num
FROM Events AS e
)
SELECT
e.*,
d.*,
c.*
FROM RankedEvents AS e
LEFT JOIN Devices AS d ON e.eve_MAC = d.devMac
INNER JOIN CurrentScan AS c ON e.eve_MAC = c.cur_MAC
WHERE e.row_num = 1;""")
self.sql.execute(""" DROP VIEW IF EXISTS Sessions_Devices;""")
self.sql.execute("""CREATE VIEW Sessions_Devices AS SELECT * FROM Sessions LEFT JOIN "Devices" ON ses_MAC = devMac;""")
# add fields if missing
# Add Devices fields if missing
# devFQDN missing?
devFQDN_missing = self.sql.execute ("""
SELECT COUNT(*) AS CNTREC FROM pragma_table_info('Devices') WHERE name='devFQDN'
""").fetchone()[0] == 0
# devFQDN
if ensure_column(self.sql, "Devices", "devFQDN", "TEXT") is False:
return # addition failed
if devFQDN_missing:
mylog('verbose', ["[upgradeDB] Adding devFQDN to the Devices table"])
self.sql.execute("""
ALTER TABLE "Devices" ADD "devFQDN" TEXT
""")
# -------------------------------------------------------------------------
# Settings table setup
# -------------------------------------------------------------------------
ensure_Settings(self.sql)
# Parameters tables setup
ensure_Parameters(self.sql)
# Re-creating Settings table
mylog('verbose', ["[upgradeDB] Re-creating Settings table"])
self.sql.execute(""" DROP TABLE IF EXISTS Settings;""")
self.sql.execute("""
CREATE TABLE "Settings" (
"setKey" TEXT,
"setName" TEXT,
"setDescription" TEXT,
"setType" TEXT,
"setOptions" TEXT,
"setGroup" TEXT,
"setValue" TEXT,
"setEvents" TEXT,
"setOverriddenByEnv" INTEGER
);
""")
# Create Pholus_Scan table if missing
mylog('verbose', ["[upgradeDB] Removing Pholus_Scan table"])
self.sql.execute("""DROP TABLE IF EXISTS Pholus_Scan""")
# -------------------------------------------------------------------------
# Parameters table setup
# -------------------------------------------------------------------------
# Re-creating Parameters table
mylog('verbose', ["[upgradeDB] Re-creating Parameters table"])
self.sql.execute("DROP TABLE Parameters;")
self.sql.execute("""
CREATE TABLE "Parameters" (
"par_ID" TEXT PRIMARY KEY,
"par_Value" TEXT
);
""")
# -------------------------------------------------------------------------
# Plugins tables setup
# -------------------------------------------------------------------------
# Plugin state
sql_Plugins_Objects = """ CREATE TABLE IF NOT EXISTS Plugins_Objects(
"Index" INTEGER,
Plugin TEXT NOT NULL,
Object_PrimaryID TEXT NOT NULL,
Object_SecondaryID TEXT NOT NULL,
DateTimeCreated TEXT NOT NULL,
DateTimeChanged TEXT NOT NULL,
Watched_Value1 TEXT NOT NULL,
Watched_Value2 TEXT NOT NULL,
Watched_Value3 TEXT NOT NULL,
Watched_Value4 TEXT NOT NULL,
Status TEXT NOT NULL,
Extra TEXT NOT NULL,
UserData TEXT NOT NULL,
ForeignKey TEXT NOT NULL,
SyncHubNodeName TEXT,
"HelpVal1" TEXT,
"HelpVal2" TEXT,
"HelpVal3" TEXT,
"HelpVal4" TEXT,
ObjectGUID TEXT,
PRIMARY KEY("Index" AUTOINCREMENT)
); """
self.sql.execute(sql_Plugins_Objects)
# Plugin execution results
sql_Plugins_Events = """ CREATE TABLE IF NOT EXISTS Plugins_Events(
"Index" INTEGER,
Plugin TEXT NOT NULL,
Object_PrimaryID TEXT NOT NULL,
Object_SecondaryID TEXT NOT NULL,
DateTimeCreated TEXT NOT NULL,
DateTimeChanged TEXT NOT NULL,
Watched_Value1 TEXT NOT NULL,
Watched_Value2 TEXT NOT NULL,
Watched_Value3 TEXT NOT NULL,
Watched_Value4 TEXT NOT NULL,
Status TEXT NOT NULL,
Extra TEXT NOT NULL,
UserData TEXT NOT NULL,
ForeignKey TEXT NOT NULL,
SyncHubNodeName TEXT,
"HelpVal1" TEXT,
"HelpVal2" TEXT,
"HelpVal3" TEXT,
"HelpVal4" TEXT,
PRIMARY KEY("Index" AUTOINCREMENT)
); """
self.sql.execute(sql_Plugins_Events)
# Plugin execution history
sql_Plugins_History = """ CREATE TABLE IF NOT EXISTS Plugins_History(
"Index" INTEGER,
Plugin TEXT NOT NULL,
Object_PrimaryID TEXT NOT NULL,
Object_SecondaryID TEXT NOT NULL,
DateTimeCreated TEXT NOT NULL,
DateTimeChanged TEXT NOT NULL,
Watched_Value1 TEXT NOT NULL,
Watched_Value2 TEXT NOT NULL,
Watched_Value3 TEXT NOT NULL,
Watched_Value4 TEXT NOT NULL,
Status TEXT NOT NULL,
Extra TEXT NOT NULL,
UserData TEXT NOT NULL,
ForeignKey TEXT NOT NULL,
SyncHubNodeName TEXT,
"HelpVal1" TEXT,
"HelpVal2" TEXT,
"HelpVal3" TEXT,
"HelpVal4" TEXT,
PRIMARY KEY("Index" AUTOINCREMENT)
); """
self.sql.execute(sql_Plugins_History)
# -------------------------------------------------------------------------
# Plugins_Language_Strings table setup
# -------------------------------------------------------------------------
# Dynamically generated language strings
self.sql.execute("DROP TABLE IF EXISTS Plugins_Language_Strings;")
self.sql.execute(""" CREATE TABLE IF NOT EXISTS Plugins_Language_Strings(
"Index" INTEGER,
Language_Code TEXT NOT NULL,
String_Key TEXT NOT NULL,
String_Value TEXT NOT NULL,
Extra TEXT NOT NULL,
PRIMARY KEY("Index" AUTOINCREMENT)
); """)
self.commitDB()
# -------------------------------------------------------------------------
ensure_plugins_tables(self.sql)
# CurrentScan table setup
# -------------------------------------------------------------------------
# indicates, if CurrentScan table is available
# 🐛 CurrentScan DEBUG: comment out below when debugging to keep the CurrentScan table after restarts/scan finishes
self.sql.execute("DROP TABLE IF EXISTS CurrentScan;")
self.sql.execute(""" CREATE TABLE IF NOT EXISTS CurrentScan (
cur_MAC STRING(50) NOT NULL COLLATE NOCASE,
cur_IP STRING(50) NOT NULL COLLATE NOCASE,
cur_Vendor STRING(250),
cur_ScanMethod STRING(10),
cur_Name STRING(250),
cur_LastQuery STRING(250),
cur_DateTime STRING(250),
cur_SyncHubNodeName STRING(50),
cur_NetworkSite STRING(250),
cur_SSID STRING(250),
cur_NetworkNodeMAC STRING(250),
cur_PORT STRING(250),
cur_Type STRING(250),
UNIQUE(cur_MAC)
);
""")
self.commitDB()
# -------------------------------------------------------------------------
# Create the LatestEventsPerMAC view
# -------------------------------------------------------------------------
# Dynamically generated language strings
self.sql.execute(""" CREATE VIEW IF NOT EXISTS LatestEventsPerMAC AS
WITH RankedEvents AS (
SELECT
e.*,
ROW_NUMBER() OVER (PARTITION BY e.eve_MAC ORDER BY e.eve_DateTime DESC) AS row_num
FROM Events AS e
)
SELECT
e.*,
d.*,
c.*
FROM RankedEvents AS e
LEFT JOIN Devices AS d ON e.eve_MAC = d.devMac
INNER JOIN CurrentScan AS c ON e.eve_MAC = c.cur_MAC
WHERE e.row_num = 1;
""")
# handling the Convert_Events_to_Sessions / Sessions screens
self.sql.execute("""DROP VIEW IF EXISTS Convert_Events_to_Sessions;""")
self.sql.execute("""CREATE VIEW Convert_Events_to_Sessions AS SELECT EVE1.eve_MAC,
EVE1.eve_IP,
EVE1.eve_EventType AS eve_EventTypeConnection,
EVE1.eve_DateTime AS eve_DateTimeConnection,
CASE WHEN EVE2.eve_EventType IN ('Disconnected', 'Device Down') OR
EVE2.eve_EventType IS NULL THEN EVE2.eve_EventType ELSE '<missing event>' END AS eve_EventTypeDisconnection,
CASE WHEN EVE2.eve_EventType IN ('Disconnected', 'Device Down') THEN EVE2.eve_DateTime ELSE NULL END AS eve_DateTimeDisconnection,
CASE WHEN EVE2.eve_EventType IS NULL THEN 1 ELSE 0 END AS eve_StillConnected,
EVE1.eve_AdditionalInfo
FROM Events AS EVE1
LEFT JOIN
Events AS EVE2 ON EVE1.eve_PairEventRowID = EVE2.RowID
WHERE EVE1.eve_EventType IN ('New Device', 'Connected','Down Reconnected')
UNION
SELECT eve_MAC,
eve_IP,
'<missing event>' AS eve_EventTypeConnection,
NULL AS eve_DateTimeConnection,
eve_EventType AS eve_EventTypeDisconnection,
eve_DateTime AS eve_DateTimeDisconnection,
0 AS eve_StillConnected,
eve_AdditionalInfo
FROM Events AS EVE1
WHERE (eve_EventType = 'Device Down' OR
eve_EventType = 'Disconnected') AND
EVE1.eve_PairEventRowID IS NULL;
""")
self.commitDB()
ensure_CurrentScan(self.sql)
# Views
ensure_views(self.sql)
# commit changes
self.commitDB()
# Init the AppEvent database table
AppEvent_obj(self)

330
server/db/db_upgrade.py Executable file
View File

@@ -0,0 +1,330 @@
import sys
# Register NetAlertX directories
INSTALL_PATH="/app"
sys.path.extend([f"{INSTALL_PATH}/server"])
from logger import mylog
from messaging.in_app import write_notification
def ensure_column(sql, table: str, column_name: str, column_type: str) -> bool:
"""
Ensures a column exists in the specified table. If missing, attempts to add it.
Returns True on success, False on failure.
Parameters:
- sql: database cursor or connection wrapper (must support execute() and fetchall()).
- table: name of the table (e.g., "Devices").
- column_name: name of the column to ensure.
- column_type: SQL type of the column (e.g., "TEXT", "INTEGER", "BOOLEAN").
"""
try:
# Get actual columns from DB
sql.execute(f'PRAGMA table_info("{table}")')
actual_columns = [row[1] for row in sql.fetchall()]
# Check if target column is already present
if column_name in actual_columns:
return True # Already exists
# Define the expected columns (hardcoded base schema) [v25.5.24] - available in teh default app.db
expected_columns = [
'devMac', 'devName', 'devOwner', 'devType', 'devVendor',
'devFavorite', 'devGroup', 'devComments', 'devFirstConnection',
'devLastConnection', 'devLastIP', 'devStaticIP', 'devScan',
'devLogEvents', 'devAlertEvents', 'devAlertDown', 'devSkipRepeated',
'devLastNotification', 'devPresentLastScan', 'devIsNew',
'devLocation', 'devIsArchived', 'devParentMAC', 'devParentPort',
'devIcon', 'devGUID', 'devSite', 'devSSID', 'devSyncHubNode',
'devSourcePlugin', 'devCustomProps'
]
# Check for mismatches in base schema
missing = set(expected_columns) - set(actual_columns)
extra = set(actual_columns) - set(expected_columns)
if missing:
msg = (f"[db_upgrade] ⚠ ERROR: Unexpected DB structure "
f"(missing: {', '.join(missing) if missing else 'none'}, "
f"extra: {', '.join(extra) if extra else 'none'}) - "
"aborting schema change to prevent corruption. "
"Check https://github.com/jokob-sk/NetAlertX/blob/main/docs/UPDATES.md")
mylog('none', [msg])
write_notification(msg)
return False
if extra:
msg = f'[db_upgrade] Extra DB columns detected in {table}: {', '.join(extra)}'
mylog('none', [msg])
# Add missing column
mylog('verbose', [f"[db_upgrade] Adding '{column_name}' ({column_type}) to {table} table"])
sql.execute(f'ALTER TABLE "{table}" ADD "{column_name}" {column_type}')
return True
except Exception as e:
mylog('none', [f"[db_upgrade] ERROR while adding '{column_name}': {e}"])
return False
def ensure_views(sql) -> bool:
"""
Ensures required views exist.
Parameters:
- sql: database cursor or connection wrapper (must support execute() and fetchall()).
"""
sql.execute(""" DROP VIEW IF EXISTS Events_Devices;""")
sql.execute(""" CREATE VIEW Events_Devices AS
SELECT *
FROM Events
LEFT JOIN Devices ON eve_MAC = devMac;
""")
sql.execute(""" DROP VIEW IF EXISTS LatestEventsPerMAC;""")
sql.execute("""CREATE VIEW LatestEventsPerMAC AS
WITH RankedEvents AS (
SELECT
e.*,
ROW_NUMBER() OVER (PARTITION BY e.eve_MAC ORDER BY e.eve_DateTime DESC) AS row_num
FROM Events AS e
)
SELECT
e.*,
d.*,
c.*
FROM RankedEvents AS e
LEFT JOIN Devices AS d ON e.eve_MAC = d.devMac
INNER JOIN CurrentScan AS c ON e.eve_MAC = c.cur_MAC
WHERE e.row_num = 1;""")
sql.execute(""" DROP VIEW IF EXISTS Sessions_Devices;""")
sql.execute("""CREATE VIEW Sessions_Devices AS SELECT * FROM Sessions LEFT JOIN "Devices" ON ses_MAC = devMac;""")
sql.execute(""" CREATE VIEW IF NOT EXISTS LatestEventsPerMAC AS
WITH RankedEvents AS (
SELECT
e.*,
ROW_NUMBER() OVER (PARTITION BY e.eve_MAC ORDER BY e.eve_DateTime DESC) AS row_num
FROM Events AS e
)
SELECT
e.*,
d.*,
c.*
FROM RankedEvents AS e
LEFT JOIN Devices AS d ON e.eve_MAC = d.devMac
INNER JOIN CurrentScan AS c ON e.eve_MAC = c.cur_MAC
WHERE e.row_num = 1;
""")
# handling the Convert_Events_to_Sessions / Sessions screens
sql.execute("""DROP VIEW IF EXISTS Convert_Events_to_Sessions;""")
sql.execute("""CREATE VIEW Convert_Events_to_Sessions AS SELECT EVE1.eve_MAC,
EVE1.eve_IP,
EVE1.eve_EventType AS eve_EventTypeConnection,
EVE1.eve_DateTime AS eve_DateTimeConnection,
CASE WHEN EVE2.eve_EventType IN ('Disconnected', 'Device Down') OR
EVE2.eve_EventType IS NULL THEN EVE2.eve_EventType ELSE '<missing event>' END AS eve_EventTypeDisconnection,
CASE WHEN EVE2.eve_EventType IN ('Disconnected', 'Device Down') THEN EVE2.eve_DateTime ELSE NULL END AS eve_DateTimeDisconnection,
CASE WHEN EVE2.eve_EventType IS NULL THEN 1 ELSE 0 END AS eve_StillConnected,
EVE1.eve_AdditionalInfo
FROM Events AS EVE1
LEFT JOIN
Events AS EVE2 ON EVE1.eve_PairEventRowID = EVE2.RowID
WHERE EVE1.eve_EventType IN ('New Device', 'Connected','Down Reconnected')
UNION
SELECT eve_MAC,
eve_IP,
'<missing event>' AS eve_EventTypeConnection,
NULL AS eve_DateTimeConnection,
eve_EventType AS eve_EventTypeDisconnection,
eve_DateTime AS eve_DateTimeDisconnection,
0 AS eve_StillConnected,
eve_AdditionalInfo
FROM Events AS EVE1
WHERE (eve_EventType = 'Device Down' OR
eve_EventType = 'Disconnected') AND
EVE1.eve_PairEventRowID IS NULL;
""")
return True
def ensure_CurrentScan(sql) -> bool:
"""
Ensures required CurrentScan table exist.
Parameters:
- sql: database cursor or connection wrapper (must support execute() and fetchall()).
"""
# 🐛 CurrentScan DEBUG: comment out below when debugging to keep the CurrentScan table after restarts/scan finishes
sql.execute("DROP TABLE IF EXISTS CurrentScan;")
sql.execute(""" CREATE TABLE IF NOT EXISTS CurrentScan (
cur_MAC STRING(50) NOT NULL COLLATE NOCASE,
cur_IP STRING(50) NOT NULL COLLATE NOCASE,
cur_Vendor STRING(250),
cur_ScanMethod STRING(10),
cur_Name STRING(250),
cur_LastQuery STRING(250),
cur_DateTime STRING(250),
cur_SyncHubNodeName STRING(50),
cur_NetworkSite STRING(250),
cur_SSID STRING(250),
cur_NetworkNodeMAC STRING(250),
cur_PORT STRING(250),
cur_Type STRING(250),
UNIQUE(cur_MAC)
);
""")
return True
def ensure_Parameters(sql) -> bool:
"""
Ensures required Parameters table exist.
Parameters:
- sql: database cursor or connection wrapper (must support execute() and fetchall()).
"""
# Re-creating Parameters table
mylog('verbose', ["[db_upgrade] Re-creating Parameters table"])
sql.execute("DROP TABLE Parameters;")
sql.execute("""
CREATE TABLE "Parameters" (
"par_ID" TEXT PRIMARY KEY,
"par_Value" TEXT
);
""")
return True
def ensure_Settings(sql) -> bool:
"""
Ensures required Settings table exist.
Parameters:
- sql: database cursor or connection wrapper (must support execute() and fetchall()).
"""
# Re-creating Settings table
mylog('verbose', ["[db_upgrade] Re-creating Settings table"])
sql.execute(""" DROP TABLE IF EXISTS Settings;""")
sql.execute("""
CREATE TABLE "Settings" (
"setKey" TEXT,
"setName" TEXT,
"setDescription" TEXT,
"setType" TEXT,
"setOptions" TEXT,
"setGroup" TEXT,
"setValue" TEXT,
"setEvents" TEXT,
"setOverriddenByEnv" INTEGER
);
""")
return True
def ensure_plugins_tables(sql) -> bool:
"""
Ensures required plugins tables exist.
Parameters:
- sql: database cursor or connection wrapper (must support execute() and fetchall()).
"""
# Plugin state
sql_Plugins_Objects = """ CREATE TABLE IF NOT EXISTS Plugins_Objects(
"Index" INTEGER,
Plugin TEXT NOT NULL,
Object_PrimaryID TEXT NOT NULL,
Object_SecondaryID TEXT NOT NULL,
DateTimeCreated TEXT NOT NULL,
DateTimeChanged TEXT NOT NULL,
Watched_Value1 TEXT NOT NULL,
Watched_Value2 TEXT NOT NULL,
Watched_Value3 TEXT NOT NULL,
Watched_Value4 TEXT NOT NULL,
Status TEXT NOT NULL,
Extra TEXT NOT NULL,
UserData TEXT NOT NULL,
ForeignKey TEXT NOT NULL,
SyncHubNodeName TEXT,
"HelpVal1" TEXT,
"HelpVal2" TEXT,
"HelpVal3" TEXT,
"HelpVal4" TEXT,
ObjectGUID TEXT,
PRIMARY KEY("Index" AUTOINCREMENT)
); """
sql.execute(sql_Plugins_Objects)
# Plugin execution results
sql_Plugins_Events = """ CREATE TABLE IF NOT EXISTS Plugins_Events(
"Index" INTEGER,
Plugin TEXT NOT NULL,
Object_PrimaryID TEXT NOT NULL,
Object_SecondaryID TEXT NOT NULL,
DateTimeCreated TEXT NOT NULL,
DateTimeChanged TEXT NOT NULL,
Watched_Value1 TEXT NOT NULL,
Watched_Value2 TEXT NOT NULL,
Watched_Value3 TEXT NOT NULL,
Watched_Value4 TEXT NOT NULL,
Status TEXT NOT NULL,
Extra TEXT NOT NULL,
UserData TEXT NOT NULL,
ForeignKey TEXT NOT NULL,
SyncHubNodeName TEXT,
"HelpVal1" TEXT,
"HelpVal2" TEXT,
"HelpVal3" TEXT,
"HelpVal4" TEXT,
PRIMARY KEY("Index" AUTOINCREMENT)
); """
sql.execute(sql_Plugins_Events)
# Plugin execution history
sql_Plugins_History = """ CREATE TABLE IF NOT EXISTS Plugins_History(
"Index" INTEGER,
Plugin TEXT NOT NULL,
Object_PrimaryID TEXT NOT NULL,
Object_SecondaryID TEXT NOT NULL,
DateTimeCreated TEXT NOT NULL,
DateTimeChanged TEXT NOT NULL,
Watched_Value1 TEXT NOT NULL,
Watched_Value2 TEXT NOT NULL,
Watched_Value3 TEXT NOT NULL,
Watched_Value4 TEXT NOT NULL,
Status TEXT NOT NULL,
Extra TEXT NOT NULL,
UserData TEXT NOT NULL,
ForeignKey TEXT NOT NULL,
SyncHubNodeName TEXT,
"HelpVal1" TEXT,
"HelpVal2" TEXT,
"HelpVal3" TEXT,
"HelpVal4" TEXT,
PRIMARY KEY("Index" AUTOINCREMENT)
); """
sql.execute(sql_Plugins_History)
# Dynamically generated language strings
sql.execute("DROP TABLE IF EXISTS Plugins_Language_Strings;")
sql.execute(""" CREATE TABLE IF NOT EXISTS Plugins_Language_Strings(
"Index" INTEGER,
Language_Code TEXT NOT NULL,
String_Key TEXT NOT NULL,
String_Value TEXT NOT NULL,
Extra TEXT NOT NULL,
PRIMARY KEY("Index" AUTOINCREMENT)
); """)
return True

View File

@@ -199,7 +199,9 @@ class Query(ObjectType):
for sort_option in options.sort:
devices_data = sorted(
devices_data,
key=lambda x: mixed_type_sort_key(x.get(sort_option.field)),
key=lambda x: mixed_type_sort_key(
x.get(sort_option.field).lower() if isinstance(x.get(sort_option.field), str) else x.get(sort_option.field)
),
reverse=(sort_option.order.lower() == "desc")
)

View File

@@ -495,6 +495,8 @@ def sanitize_SQL_input(val):
# Function to normalize the string and remove diacritics
def normalize_string(text):
# Normalize the text to 'NFD' to separate base characters and diacritics
if not isinstance(text, str):
text = str(text)
normalized_text = unicodedata.normalize('NFD', text)
# Filter out diacritics and unwanted characters
return ''.join(c for c in normalized_text if unicodedata.category(c) != 'Mn')

View File

@@ -674,9 +674,9 @@ def guess_icon(vendor, mac, ip, name, default):
mylog('debug', [f"[guess_icon] Guessing icon for (vendor|mac|ip|name): ('{vendor}'|'{mac}'|{ip}|{name})"])
result = default
mac = mac.upper()
vendor = vendor.lower() if vendor else "unknown"
name = name.lower() if name else "(unknown)"
mac = str(mac).upper() if mac else "00:00:00:00:00:00"
vendor = str(vendor).lower() if vendor else "unknown"
name = str(name).lower() if name else "(unknown)"
# Guess icon based on vendor
if any(brand in vendor for brand in {"samsung", "motorola"}):
@@ -732,8 +732,8 @@ def guess_icon(vendor, mac, ip, name, default):
# Guess device type
def guess_type(vendor, mac, ip, name, default):
result = default
mac = mac.upper()
vendor = vendor.lower() if vendor else "unknown"
mac = str(mac).upper() if mac else "00:00:00:00:00:00"
vendor = str(vendor).lower() if vendor else "unknown"
name = str(name).lower() if name else "(unknown)"
# Guess icon based on vendor