Compare commits

..

2 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
258a11bf21 Fix: Remove redundant session_start() call in index.php (security.php already handles it)
Co-authored-by: jokob-sk <96159884+jokob-sk@users.noreply.github.com>
2026-02-22 05:16:55 +00:00
copilot-swe-agent[bot]
1b317838fd Initial plan 2026-02-22 05:13:38 +00:00
152 changed files with 2764 additions and 6758 deletions

1
.env
View File

@@ -6,6 +6,7 @@ LOGS_LOCATION=/path/to/docker_logs
#ENVIRONMENT VARIABLES #ENVIRONMENT VARIABLES
TZ=Europe/Paris
PORT=20211 PORT=20211
#DEVELOPMENT VARIABLES #DEVELOPMENT VARIABLES

View File

@@ -6,14 +6,14 @@ First off, **thank you** for taking the time to contribute! NetAlertX is built a
## 📂 Issues, Bugs, and Feature Requests ## 📂 Issues, Bugs, and Feature Requests
Please use the [GitHub Issue Tracker](https://github.com/netalertx/NetAlertX/issues) for: Please use the [GitHub Issue Tracker](https://github.com/jokob-sk/NetAlertX/issues) for:
- Bug reports 🐞 - Bug reports 🐞
- Feature requests 💡 - Feature requests 💡
- Documentation feedback 📖 - Documentation feedback 📖
Before opening a new issue: Before opening a new issue:
- 🛑 [Check Common Issues & Debug Tips](https://docs.netalertx.com/DEBUG_TIPS#common-issues) - 🛑 [Check Common Issues & Debug Tips](https://docs.netalertx.com/DEBUG_TIPS#common-issues)
- 🔍 [Search Closed Issues](https://github.com/netalertx/NetAlertX/issues?q=is%3Aissue+is%3Aclosed) - 🔍 [Search Closed Issues](https://github.com/jokob-sk/NetAlertX/issues?q=is%3Aissue+is%3Aclosed)
--- ---

View File

@@ -1,6 +1,6 @@
[![Docker Size](https://img.shields.io/docker/image-size/jokobsk/netalertx?label=Size&logo=Docker&color=0aa8d2&logoColor=fff&style=for-the-badge)](https://hub.docker.com/r/jokobsk/netalertx) [![Docker Size](https://img.shields.io/docker/image-size/jokobsk/netalertx?label=Size&logo=Docker&color=0aa8d2&logoColor=fff&style=for-the-badge)](https://hub.docker.com/r/jokobsk/netalertx)
[![Docker Pulls](https://img.shields.io/docker/pulls/jokobsk/netalertx?label=Pulls&logo=docker&color=0aa8d2&logoColor=fff&style=for-the-badge)](https://hub.docker.com/r/jokobsk/netalertx) [![Docker Pulls](https://img.shields.io/docker/pulls/jokobsk/netalertx?label=Pulls&logo=docker&color=0aa8d2&logoColor=fff&style=for-the-badge)](https://hub.docker.com/r/jokobsk/netalertx)
[![GitHub Release](https://img.shields.io/github/v/release/netalertx/NetAlertX?color=0aa8d2&logoColor=fff&logo=GitHub&style=for-the-badge)](https://github.com/netalertx/NetAlertX/releases) [![GitHub Release](https://img.shields.io/github/v/release/jokob-sk/NetAlertX?color=0aa8d2&logoColor=fff&logo=GitHub&style=for-the-badge)](https://github.com/jokob-sk/NetAlertX/releases)
[![Discord](https://img.shields.io/discord/1274490466481602755?color=0aa8d2&logoColor=fff&logo=Discord&style=for-the-badge)](https://discord.gg/NczTUTWyRr) [![Discord](https://img.shields.io/discord/1274490466481602755?color=0aa8d2&logoColor=fff&logo=Discord&style=for-the-badge)](https://discord.gg/NczTUTWyRr)
[![Home Assistant](https://img.shields.io/badge/Repo-blue?logo=home-assistant&style=for-the-badge&color=0aa8d2&logoColor=fff&label=Add)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons) [![Home Assistant](https://img.shields.io/badge/Repo-blue?logo=home-assistant&style=for-the-badge&color=0aa8d2&logoColor=fff&label=Add)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons)
@@ -168,9 +168,9 @@ Get notified about a new release, what new functionality you can use and about b
### 🔀 Other Alternative Apps ### 🔀 Other Alternative Apps
- [Fing](https://www.fing.com/) - Network scanner app for your Internet security (Commercial, Phone App, Proprietary hardware) - [Fing](https://www.fing.com/) - Network scanner app for your Internet security (Commercial, Phone App, Proprietary hardware)
- [NetBox](https://netboxlabs.com/) - The gold standard for Network Source of Truth (NSoT) and IPAM. - [NetBox](https://netboxlabs.com/) - Network management software (Commercial)
- [Zabbix](https://www.zabbix.com/) or [Nagios](https://www.nagios.org/) - Strong focus on infrastructure monitoring. - [Zabbix](https://www.zabbix.com/) or [Nagios](https://www.nagios.org/) - Strong focus on infrastructure monitoring.
- [NetAlertX](https://netalertx.com) - The streamlined, discovery-focused choice for real-time asset intelligence and noise-free alerting. - [NetAlertX](https://netalertx.com) - The streamlined, discovery-focused alternative for real-time asset intelligence.
### 💙 Donations ### 💙 Donations
@@ -207,7 +207,6 @@ Proudly using [Weblate](https://hosted.weblate.org/projects/pialert/). Help out
### License ### 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) > 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)
_All product names, logos, and brands are property of their respective owners. All company, product and service names used in this website are for identification purposes only. Use of these names, logos, and brands does not imply endorsement._
<!--- --------------------------------------------------------------------- ---> <!--- --------------------------------------------------------------------- --->
[main]: ./docs/img/devices_split.png "Main screen" [main]: ./docs/img/devices_split.png "Main screen"

View File

@@ -3,7 +3,7 @@
# Generated: 2022-12-30_22-19-40 # # Generated: 2022-12-30_22-19-40 #
# # # #
# Config file for the LAN intruder detection app: # # Config file for the LAN intruder detection app: #
# https://github.com/netalertx/NetAlertX # # https://github.com/jokob-sk/NetAlertX #
# # # #
#-----------------AUTOGENERATED FILE-----------------# #-----------------AUTOGENERATED FILE-----------------#

View File

@@ -19,9 +19,6 @@ services:
- CHOWN # Required for root-entrypoint to chown /data + /tmp before dropping privileges - CHOWN # Required for root-entrypoint to chown /data + /tmp before dropping privileges
- SETUID # Required for root-entrypoint to switch to non-root user - SETUID # Required for root-entrypoint to switch to non-root user
- SETGID # Required for root-entrypoint to switch to non-root group - SETGID # Required for root-entrypoint to switch to non-root group
sysctls: # ARP flux mitigation for host networking accuracy
net.ipv4.conf.all.arp_ignore: 1
net.ipv4.conf.all.arp_announce: 2
volumes: volumes:
- type: volume # Persistent Docker-managed Named Volume for storage - type: volume # Persistent Docker-managed Named Volume for storage

View File

@@ -149,7 +149,7 @@ You can access the following files:
| File name | Description | | File name | Description |
|----------------------|----------------------| |----------------------|----------------------|
| `notification_json_final.json` | The json version of the last notification (e.g. used for webhooks - [sample JSON](https://github.com/netalertx/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json)). | | `notification_json_final.json` | The json version of the last notification (e.g. used for webhooks - [sample JSON](https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json)). |
| `table_devices.json` | All of the available Devices detected by the app. | | `table_devices.json` | All of the available Devices detected by the app. |
| `table_plugins_events.json` | The list of the unprocessed (pending) notification events (plugins_events DB table). | | `table_plugins_events.json` | The list of the unprocessed (pending) notification events (plugins_events DB table). |
| `table_plugins_history.json` | The list of notification events history. | | `table_plugins_history.json` | The list of notification events history. |

View File

@@ -13,7 +13,7 @@ There are four key artifacts you can use to back up your NetAlertX configuration
| File | Description | Limitations | | File | Description | Limitations |
| ------------------------ | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | ------------------------ | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/db/app.db` | The application database | Might be in an uncommitted state or corrupted | | `/db/app.db` | The application database | Might be in an uncommitted state or corrupted |
| `/config/app.conf` | Configuration file | Can be overridden using the [`APP_CONF_OVERRIDE`](https://github.com/netalertx/NetAlertX/tree/main/dockerfiles#docker-environment-variables) variable | | `/config/app.conf` | Configuration file | Can be overridden using the [`APP_CONF_OVERRIDE`](https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles#docker-environment-variables) variable |
| `/config/devices.csv` | CSV file containing device data | Does not include historical data | | `/config/devices.csv` | CSV file containing device data | Does not include historical data |
| `/config/workflows.json` | JSON file containing your workflows | N/A | | `/config/workflows.json` | JSON file containing your workflows | N/A |
@@ -37,7 +37,7 @@ This includes settings for:
### Device Data ### Device Data
Stored in `/data/config/devices_<timestamp>.csv` or `/data/config/devices.csv`, created by the [CSV Backup `CSVBCKP` Plugin](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/csv_backup). Stored in `/data/config/devices_<timestamp>.csv` or `/data/config/devices.csv`, created by the [CSV Backup `CSVBCKP` Plugin](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/csv_backup).
Contains: Contains:
* Device names, icons, and categories * Device names, icons, and categories

View File

@@ -1,7 +1,7 @@
# A high-level description of the database structure # A high-level description of the database structure
An overview of the most important database tables as well as an detailed overview of the Devices table. The MAC address is used as a foreign key in most cases. An overview of the most important database tables as well as an detailed overview of the Devices table. The MAC address is used as a foreign key in most cases.
## Devices database table ## Devices database table
@@ -23,7 +23,6 @@
| `devLogEvents` | Whether events related to the device should be logged. | `0` | | `devLogEvents` | Whether events related to the device should be logged. | `0` |
| `devAlertEvents` | Whether alerts should be generated for events. | `1` | | `devAlertEvents` | Whether alerts should be generated for events. | `1` |
| `devAlertDown` | Whether an alert should be sent when the device goes down. | `0` | | `devAlertDown` | Whether an alert should be sent when the device goes down. | `0` |
| `devCanSleep` | Whether the device can enter a sleep window. When `1`, offline periods within the `NTFPRCS_sleep_time` window are shown as **Sleeping** instead of **Down** and no down alert is fired. | `0` |
| `devSkipRepeated` | Whether to skip repeated alerts for this device. | `1` | | `devSkipRepeated` | Whether to skip repeated alerts for this device. | `1` |
| `devLastNotification` | Timestamp of the last notification sent for this device. | `2025-03-22 12:07:26+11:00` | | `devLastNotification` | Timestamp of the last notification sent for this device. | `2025-03-22 12:07:26+11:00` |
| `devPresentLastScan` | Whether the device was present during the last scan. | `1` | | `devPresentLastScan` | Whether the device was present during the last scan. | `1` |
@@ -43,14 +42,8 @@
| `devParentRelType` | The type of relationship between the current device and it's parent node. By default, selecting `nic` will hide it from lists. | `nic` | | `devParentRelType` | The type of relationship between the current device and it's parent node. By default, selecting `nic` will hide it from lists. | `nic` |
| `devReqNicsOnline` | If all NICs are required to be online to mark teh current device online. | `0` | | `devReqNicsOnline` | If all NICs are required to be online to mark teh current device online. | `0` |
> [!NOTE]
> `DevicesView` extends the `Devices` table with two computed fields that are never persisted:
> - `devIsSleeping` (`1` when `devCanSleep=1`, device is offline, and `devLastConnection` is within the `NTFPRCS_sleep_time` window).
> - `devFlapping` (`1` when the device has changed state more than the flap threshold times in the trailing window).
> - `devStatus` — derived string: `On-line`, `Sleeping`, `Down`, or `Off-line`.
To understand how values of these fields influuence application behavior, such as Notifications or Network topology, see also:
To understand how values of these fields influuence application behavior, such as Notifications or Network topology, see also:
- [Device Management](./DEVICE_MANAGEMENT.md) - [Device Management](./DEVICE_MANAGEMENT.md)
- [Network Tree Topology Setup](./NETWORK_TREE.md) - [Network Tree Topology Setup](./NETWORK_TREE.md)
@@ -58,32 +51,32 @@ To understand how values of these fields influuence application behavior, such a
## Other Tables overview ## Other Tables overview
| Table name | Description | Sample data | | Table name | Description | Sample data |
|----------------------|----------------------| ----------------------| |----------------------|----------------------| ----------------------|
| CurrentScan | Result of the current scan | ![Screen1][screen1] | | CurrentScan | Result of the current scan | ![Screen1][screen1] |
| Devices | The main devices database that also contains the Network tree mappings. If `ScanCycle` is set to `0` device is not scanned. | ![Screen2][screen2] | | Devices | The main devices database that also contains the Network tree mappings. If `ScanCycle` is set to `0` device is not scanned. | ![Screen2][screen2] |
| Events | Used to collect connection/disconnection events. | ![Screen4][screen4] | | Events | Used to collect connection/disconnection events. | ![Screen4][screen4] |
| Online_History | Used to display the `Device presence` chart | ![Screen6][screen6] | | Online_History | Used to display the `Device presence` chart | ![Screen6][screen6] |
| Parameters | Used to pass values between the frontend and backend. | ![Screen7][screen7] | | Parameters | Used to pass values between the frontend and backend. | ![Screen7][screen7] |
| Plugins_Events | For capturing events exposed by a plugin via the `last_result.log` file. If unique then saved into the `Plugins_Objects` table. Entries are deleted once processed and stored in the `Plugins_History` and/or `Plugins_Objects` tables. | ![Screen10][screen10] | | Plugins_Events | For capturing events exposed by a plugin via the `last_result.log` file. If unique then saved into the `Plugins_Objects` table. Entries are deleted once processed and stored in the `Plugins_History` and/or `Plugins_Objects` tables. | ![Screen10][screen10] |
| Plugins_History | History of all entries from the `Plugins_Events` table | ![Screen11][screen11] | | Plugins_History | History of all entries from the `Plugins_Events` table | ![Screen11][screen11] |
| Plugins_Language_Strings | Language strings collected from the plugin `config.json` files used for string resolution in the frontend. | ![Screen12][screen12] | | Plugins_Language_Strings | Language strings collected from the plugin `config.json` files used for string resolution in the frontend. | ![Screen12][screen12] |
| Plugins_Objects | Unique objects detected by individual plugins. | ![Screen13][screen13] | | Plugins_Objects | Unique objects detected by individual plugins. | ![Screen13][screen13] |
| Sessions | Used to display sessions in the charts | ![Screen15][screen15] | | Sessions | Used to display sessions in the charts | ![Screen15][screen15] |
| Settings | Database representation of the sum of all settings from `app.conf` and plugins coming from `config.json` files. | ![Screen16][screen16] | | Settings | Database representation of the sum of all settings from `app.conf` and plugins coming from `config.json` files. | ![Screen16][screen16] |
[screen1]: ./img/DATABASE/CurrentScan.png [screen1]: ./img/DATABASE/CurrentScan.png
[screen2]: ./img/DATABASE/Devices.png [screen2]: ./img/DATABASE/Devices.png
[screen4]: ./img/DATABASE/Events.png [screen4]: ./img/DATABASE/Events.png
[screen6]: ./img/DATABASE/Online_History.png [screen6]: ./img/DATABASE/Online_History.png
[screen7]: ./img/DATABASE/Parameters.png [screen7]: ./img/DATABASE/Parameters.png
[screen10]: ./img/DATABASE/Plugins_Events.png [screen10]: ./img/DATABASE/Plugins_Events.png
[screen11]: ./img/DATABASE/Plugins_History.png [screen11]: ./img/DATABASE/Plugins_History.png
[screen12]: ./img/DATABASE/Plugins_Language_Strings.png [screen12]: ./img/DATABASE/Plugins_Language_Strings.png
[screen13]: ./img/DATABASE/Plugins_Objects.png [screen13]: ./img/DATABASE/Plugins_Objects.png
[screen15]: ./img/DATABASE/Sessions.png [screen15]: ./img/DATABASE/Sessions.png
[screen16]: ./img/DATABASE/Settings.png [screen16]: ./img/DATABASE/Settings.png

View File

@@ -38,7 +38,7 @@ If possible, check if your issue got fixed in the `_dev` image before opening a
> ⚠ Please backup your DB and config beforehand! > ⚠ Please backup your DB and config beforehand!
Please also search [open issues](https://github.com/netalertx/NetAlertX/issues). Please also search [open issues](https://github.com/jokob-sk/NetAlertX/issues).
## 4. Disable restart behavior ## 4. Disable restart behavior

View File

@@ -1,6 +1,6 @@
# Device Display Settings # Device Display Settings
This set of settings allows you to group Devices under different views. The Archived toggle allows you to exclude a Device from most listings and notifications. This set of settings allows you to group Devices under different views. The Archived toggle allows you to exclude a Device from most listings and notifications.
![Display settings](./img/DEVICE_MANAGEMENT/DeviceDetails_DisplaySettings.png) ![Display settings](./img/DEVICE_MANAGEMENT/DeviceDetails_DisplaySettings.png)
@@ -8,17 +8,13 @@ This set of settings allows you to group Devices under different views. The Arch
## Status Colors ## Status Colors
| Icon | Status | Image | Description | ![Sattus colors](./img/DEVICE_MANAGEMENT/device_management_status_colors.png)
|-----------|------------------------|-----------------------------------------------------------------------|-----------------------------------------------------------------------------------------------|
| <i class="fa-solid fa-plug"></i> | Online (Green) | ![Status color - online](./img/DEVICE_MANAGEMENT/device_management_status_online.png) | A device that is no longer marked as a "New Device". | 1. 🔌 Online (Green) = A device that is no longer marked as a "New Device".
| <i class="fa-solid fa-plug"></i> | New (Green) | ![Status color - new online](./img/DEVICE_MANAGEMENT/device_management_status_new_online.png) | A newly discovered device that is online and is still marked as a "New Device". | 2. 🔌 New (Green) = A newly discovered device that is online and is still marked as a "New Device".
| <i class="fa-solid fa-plug-circle-exclamation"></i> | Online (Orange) | ![Status color - flapping online](./img/DEVICE_MANAGEMENT/device_management_status_flapping_online.png) | The device is online, but unstable and flapping (3 status changes in the last hour). | 3. ✖ New (Grey) = Same as No.2 but device is now offline.
| <i class="fa-solid fa-xmark"></i> | New (Grey) | ![Status color - new offline](./img/DEVICE_MANAGEMENT/device_management_status_new_offline.png) | Same as "New (Green)" but the device is now offline. | 4. ✖ Offline (Grey) = A device that was not detected online in the last scan.
| <i class="fa-solid fa-box-archive"></i> | New (Grey) | ![Status color - new archived](./img/DEVICE_MANAGEMENT/device_management_status_archived_new.png) | Same as "New (Green)" but the device is now offline and archived. | 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`.
| <i class="fa-solid fa-xmark"></i> | Offline (Grey) | ![Status color - offline](./img/DEVICE_MANAGEMENT/device_management_status_offline.png) | A device that was not detected online in the last scan. |
| <i class="fa-solid fa-box-archive"></i> | Archived (Grey) | ![Status color - archived](./img/DEVICE_MANAGEMENT/device_management_status_archived.png) | A device that was not detected online in the last scan. |
| <i class="fa-solid fa-moon"></i> | Sleeping (Aqua) | ![Status color - sleeping](./img/DEVICE_MANAGEMENT/device_management_status_sleeping.png) | A device with **Can Sleep** enabled that has gone offline within the `NTFPRCS_sleep_time` window. No down alert is fired while the device is in this state. See [Notifications](./NOTIFICATIONS.md#device-settings). |
| <i class="fa-solid fa-triangle-exclamation"></i> | Down (Red) | ![Status color - down](./img/DEVICE_MANAGEMENT/device_management_status_down.png) | A device marked as "Alert Down" and offline for the duration set in `NTFPRCS_alert_down_time`.|
See also [Notification guide](./NOTIFICATIONS.md). See also [Notification guide](./NOTIFICATIONS.md).

View File

@@ -77,7 +77,7 @@ Create a folder `netalertx` in the `APP_DATA_LOCATION` (in this example in `/vol
You can then modify the python script without restarting/rebuilding the container every time. Additionally, you can trigger a plugin run via the UI: You can then modify the python script without restarting/rebuilding the container every time. Additionally, you can trigger a plugin run via the UI:
![image](https://github.com/netalertx/NetAlertX/assets/96159884/3cbf2748-03c8-49e7-b801-f38c7755246b) ![image](https://github.com/jokob-sk/NetAlertX/assets/96159884/3cbf2748-03c8-49e7-b801-f38c7755246b)
## Tips ## Tips

View File

@@ -30,9 +30,6 @@ services:
- CHOWN # Required for root-entrypoint to chown /data + /tmp before dropping privileges - CHOWN # Required for root-entrypoint to chown /data + /tmp before dropping privileges
- SETUID # Required for root-entrypoint to switch to non-root user - SETUID # Required for root-entrypoint to switch to non-root user
- SETGID # Required for root-entrypoint to switch to non-root group - SETGID # Required for root-entrypoint to switch to non-root group
sysctls: # ARP flux mitigation (reduces duplicate/ambiguous ARP behavior on host networking)
net.ipv4.conf.all.arp_ignore: 1
net.ipv4.conf.all.arp_announce: 2
volumes: volumes:
- type: volume # Persistent Docker-managed named volume for config + database - type: volume # Persistent Docker-managed named volume for config + database

View File

@@ -1,6 +1,6 @@
[![Docker Size](https://img.shields.io/docker/image-size/jokobsk/netalertx?label=Size&logo=Docker&color=0aa8d2&logoColor=fff&style=for-the-badge)](https://hub.docker.com/r/jokobsk/netalertx) [![Docker Size](https://img.shields.io/docker/image-size/jokobsk/netalertx?label=Size&logo=Docker&color=0aa8d2&logoColor=fff&style=for-the-badge)](https://hub.docker.com/r/jokobsk/netalertx)
[![Docker Pulls](https://img.shields.io/docker/pulls/jokobsk/netalertx?label=Pulls&logo=docker&color=0aa8d2&logoColor=fff&style=for-the-badge)](https://hub.docker.com/r/jokobsk/netalertx) [![Docker Pulls](https://img.shields.io/docker/pulls/jokobsk/netalertx?label=Pulls&logo=docker&color=0aa8d2&logoColor=fff&style=for-the-badge)](https://hub.docker.com/r/jokobsk/netalertx)
[![GitHub Release](https://img.shields.io/github/v/release/jokob-sk/NetAlertX?color=0aa8d2&logoColor=fff&logo=GitHub&style=for-the-badge)](https://github.com/netalertx/NetAlertX/releases) [![GitHub Release](https://img.shields.io/github/v/release/jokob-sk/NetAlertX?color=0aa8d2&logoColor=fff&logo=GitHub&style=for-the-badge)](https://github.com/jokob-sk/NetAlertX/releases)
[![Discord](https://img.shields.io/discord/1274490466481602755?color=0aa8d2&logoColor=fff&logo=Discord&style=for-the-badge)](https://discord.gg/NczTUTWyRr) [![Discord](https://img.shields.io/discord/1274490466481602755?color=0aa8d2&logoColor=fff&logo=Discord&style=for-the-badge)](https://discord.gg/NczTUTWyRr)
[![Home Assistant](https://img.shields.io/badge/Repo-blue?logo=home-assistant&style=for-the-badge&color=0aa8d2&logoColor=fff&label=Add)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons) [![Home Assistant](https://img.shields.io/badge/Repo-blue?logo=home-assistant&style=for-the-badge&color=0aa8d2&logoColor=fff&label=Add)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons)
@@ -96,7 +96,7 @@ sudo chmod -R a+rwx /local_data_dir
### Initial setup ### Initial setup
- If unavailable, the app generates a default `app.conf` and `app.db` file on the first run. - If unavailable, the app generates a default `app.conf` and `app.db` file on the first run.
- The preferred way is to manage the configuration via the Settings section in the UI, if UI is inaccessible you can modify [app.conf](https://github.com/netalertx/NetAlertX/tree/main/back) in the `/data/config/` folder directly - The preferred way is to manage the configuration via the Settings section in the UI, if UI is inaccessible you can modify [app.conf](https://github.com/jokob-sk/NetAlertX/tree/main/back) in the `/data/config/` folder directly
#### Setting up scanners #### Setting up scanners
@@ -116,7 +116,7 @@ You can read or watch several [community configuration guides](https://docs.neta
#### Common issues #### Common issues
- Before creating a new issue, please check if a similar issue was [already resolved](https://github.com/netalertx/NetAlertX/issues?q=is%3Aissue+is%3Aclosed). - Before creating a new issue, please check if a similar issue was [already resolved](https://github.com/jokob-sk/NetAlertX/issues?q=is%3Aissue+is%3Aclosed).
- Check also common issues and [debugging tips](https://docs.netalertx.com/DEBUG_TIPS). - Check also common issues and [debugging tips](https://docs.netalertx.com/DEBUG_TIPS).
## 💙 Support me ## 💙 Support me

View File

@@ -77,6 +77,6 @@ After increasing the ARP timeout and adding ICMP scanning (on select IP ranges),
**Tip:** Each environment is unique. Consider fine-tuning scan settings based on your network size, device behavior, and desired detection accuracy. **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/netalertx/NetAlertX/discussions) if you have further feedback or edge cases. 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. See also [Remote Networks](./REMOTE_NETWORKS.md) for more advanced setups.

View File

@@ -1,4 +1,4 @@
# Frontend development # Frontend development
This page contains tips for frontend development when extending NetAlertX. Guiding principles are: This page contains tips for frontend development when extending NetAlertX. Guiding principles are:
@@ -7,17 +7,17 @@ This page contains tips for frontend development when extending NetAlertX. Guidi
3. Reusability 3. Reusability
4. Placing more functionality into Plugins and enhancing core Plugins functionality 4. Placing more functionality into Plugins and enhancing core Plugins functionality
That means that, when writing code, focus on reusing what's available instead of writing quick fixes. Or creating reusable functions, instead of bespoke functionaility. That means that, when writing code, focus on reusing what's available instead of writing quick fixes. Or creating reusable functions, instead of bespoke functionaility.
## 🔍 Examples ## 🔍 Examples
Some examples how to apply the above: Some examples how to apply the above:
> Example 1 > Example 1
> >
> I want to implement a scan fucntion. Options would be: > I want to implement a scan fucntion. Options would be:
> >
> 1. To add a manual scan functionality to the `deviceDetails.php` page. > 1. To add a manual scan functionality to the `deviceDetails.php` page.
> 2. To create a separate page that handles the execution of the scan. > 2. To create a separate page that handles the execution of the scan.
> 3. To create a configurable Plugin. > 3. To create a configurable Plugin.
> >
@@ -31,16 +31,16 @@ Some examples how to apply the above:
> 2. Implement the changes and add settings to influence the behavior in the `initialize.py` file so the user can adjust these. > 2. Implement the changes and add settings to influence the behavior in the `initialize.py` file so the user can adjust these.
> 3. Implement the changes and add settings via a setting-only plugin. > 3. Implement the changes and add settings via a setting-only plugin.
> 4. Implement the changes in a way so the behavior can be toggled on each plugin so the core capabilities of Plugins get extended. > 4. Implement the changes in a way so the behavior can be toggled on each plugin so the core capabilities of Plugins get extended.
> >
> From the above, number 4 would be the most appropriate solution. Then followed by number 3. Number 1 or 2 would be approved only in special circumstances. > From the above, number 4 would be the most appropriate solution. Then followed by number 3. Number 1 or 2 would be approved only in special circumstances.
## 💡 Frontend tips ## 💡 Frontend tips
Some useful frontend JavaScript functions: Some useful frontend JavaScript functions:
- `getDevDataByMac(macAddress, devicesColumn)` - method to retrieve any device data (database column) based on MAC address in the frontend - `getDevDataByMac(macAddress, devicesColumn)` - method to retrieve any device data (database column) based on MAC address in the frontend
- `getString(string stringKey)` - method to retrieve translated strings in the frontend - `getString(string stringKey)` - method to retrieve translated strings in the frontend
- `getSetting(string stringKey)` - method to retrieve settings in the frontend - `getSetting(string stringKey)` - method to retrieve settings in the frontend
Check the [common.js](https://github.com/netalertx/NetAlertX/blob/main-2023-06-10/front/js/common.js) file for more frontend functions. Check the [common.js](https://github.com/jokob-sk/NetAlertX/blob/main-2023-06-10/front/js/common.js) file for more frontend functions.

View File

@@ -4,7 +4,7 @@ This page provides an overview of community-contributed scripts for NetAlertX. T
## Community Scripts ## Community Scripts
You can find all scripts in this [scripts GitHub folder](https://github.com/netalertx/NetAlertX/tree/main/scripts). You can find all scripts in this [scripts GitHub folder](https://github.com/jokob-sk/NetAlertX/tree/main/scripts).
| Script Name | Description | Author | Version | Release Date | | Script Name | Description | Author | Version | Release Date |
|------------|-------------|--------|---------|--------------| |------------|-------------|--------|---------|--------------|
@@ -17,5 +17,5 @@ You can find all scripts in this [scripts GitHub folder](https://github.com/neta
> [!NOTE] > [!NOTE]
> These scripts are community-supplied and not actively maintained. Use at your own discretion. > These scripts are community-supplied and not actively maintained. Use at your own discretion.
For detailed usage instructions, refer to each script's documentation in each [scripts GitHub folder](https://github.com/netalertx/NetAlertX/tree/main/scripts). For detailed usage instructions, refer to each script's documentation in each [scripts GitHub folder](https://github.com/jokob-sk/NetAlertX/tree/main/scripts).

View File

@@ -5,11 +5,11 @@ NetAlertX comes with MQTT support, allowing you to show all detected devices as
> [!TIP] > [!TIP]
> You can install NetAlertX also as a Home Assistant addon [![Home Assistant](https://img.shields.io/badge/Repo-blue?logo=home-assistant&style=for-the-badge&color=0aa8d2&logoColor=fff&label=Add)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons) via the [alexbelgium/hassio-addons](https://github.com/alexbelgium/hassio-addons/) repository. This is only possible if you run a supervised instance of Home Assistant. If not, you can still run NetAlertX in a separate Docker container and follow this guide to configure MQTT. > You can install NetAlertX also as a Home Assistant addon [![Home Assistant](https://img.shields.io/badge/Repo-blue?logo=home-assistant&style=for-the-badge&color=0aa8d2&logoColor=fff&label=Add)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons) via the [alexbelgium/hassio-addons](https://github.com/alexbelgium/hassio-addons/) repository. This is only possible if you run a supervised instance of Home Assistant. If not, you can still run NetAlertX in a separate Docker container and follow this guide to configure MQTT.
## ⚠ Note ## ⚠ Note
- Please note that discovery takes about ~10s per device. - Please note that discovery takes about ~10s per device.
- Deleting of devices is not handled automatically. Please use [MQTT Explorer](https://mqtt-explorer.com/) to delete devices in the broker (Home Assistant), if needed. - Deleting of devices is not handled automatically. Please use [MQTT Explorer](https://mqtt-explorer.com/) to delete devices in the broker (Home Assistant), if needed.
- For optimization reasons, the devices are not always fully synchronized. You can delete Plugin objects as described in the [MQTT plugin](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/_publisher_mqtt#forcing-an-update) docs to force a full synchronization. - For optimization reasons, the devices are not always fully synchronized. You can delete Plugin objects as described in the [MQTT plugin](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_mqtt#forcing-an-update) docs to force a full synchronization.
## 🧭 Guide ## 🧭 Guide
@@ -34,26 +34,26 @@ NetAlertX comes with MQTT support, allowing you to show all detected devices as
- Fill in remaining settings as per description - Fill in remaining settings as per description
- set MQTT_RUN to schedule or on_notification depending on requirements - set MQTT_RUN to schedule or on_notification depending on requirements
![Configuration Example][configuration] ![Configuration Example][configuration]
## 📷 Screenshots ## 📷 Screenshots
| ![Screen 1][sensors] | ![Screen 2][history] | | ![Screen 1][sensors] | ![Screen 2][history] |
|----------------------|----------------------| |----------------------|----------------------|
| ![Screen 3][list] | ![Screen 4][overview] | | ![Screen 3][list] | ![Screen 4][overview] |
[configuration]: ./img/HOME_ASISSTANT/HomeAssistant-Configuration.png "configuration" [configuration]: ./img/HOME_ASISSTANT/HomeAssistant-Configuration.png "configuration"
[sensors]: ./img/HOME_ASISSTANT/HomeAssistant-Device-as-Sensors.png "sensors" [sensors]: ./img/HOME_ASISSTANT/HomeAssistant-Device-as-Sensors.png "sensors"
[history]: ./img/HOME_ASISSTANT/HomeAssistant-Device-Presence-History.png "history" [history]: ./img/HOME_ASISSTANT/HomeAssistant-Device-Presence-History.png "history"
[list]: ./img/HOME_ASISSTANT/HomeAssistant-Devices-List.png "list" [list]: ./img/HOME_ASISSTANT/HomeAssistant-Devices-List.png "list"
[overview]: ./img/HOME_ASISSTANT/HomeAssistant-Overview-Card.png "overview" [overview]: ./img/HOME_ASISSTANT/HomeAssistant-Overview-Card.png "overview"
## Troubleshooting ## Troubleshooting
If you can't see all devices detected, run `sudo arp-scan --interface=eth0 192.168.1.0/24` (change these based on your setup, read [Subnets](./SUBNETS.md) docs for details). This command has to be executed the NetAlertX container, not in the Home Assistant container. If you can't see all devices detected, run `sudo arp-scan --interface=eth0 192.168.1.0/24` (change these based on your setup, read [Subnets](./SUBNETS.md) docs for details). This command has to be executed the NetAlertX container, not in the Home Assistant container.
You can access the NetAlertX container via Portainer on your host or via ssh. The container name will be something like `addon_db21ed7f_netalertx` (you can copy the `db21ed7f_netalertx` part from the browser when accessing the UI of NetAlertX). You can access the NetAlertX container via Portainer on your host or via ssh. The container name will be something like `addon_db21ed7f_netalertx` (you can copy the `db21ed7f_netalertx` part from the browser when accessing the UI of NetAlertX).
## Accessing the NetAlertX container via SSH ## Accessing the NetAlertX container via SSH

View File

@@ -40,7 +40,7 @@ Some facts about what and where something will be changed/installed by the HW in
- **EXPERIMENTAL** and not recommended way to install NetAlertX. - **EXPERIMENTAL** and not recommended way to install NetAlertX.
> [!TIP] > [!TIP]
> If the below fails try grabbing and installing one of the [previous releases](https://github.com/netalertx/NetAlertX/releases) and run the installation from the zip package. > If the below fails try grabbing and installing one of the [previous releases](https://github.com/jokob-sk/NetAlertX/releases) and run the installation from the zip package.
These commands will download the `install.debian12.sh` script from the GitHub repository, make it executable with `chmod`, and then run it using `./install.debian12.sh`. These commands will download the `install.debian12.sh` script from the GitHub repository, make it executable with `chmod`, and then run it using `./install.debian12.sh`.

View File

@@ -102,7 +102,7 @@ Before opening a new issue:
* 📘 [Common Issues](./COMMON_ISSUES.md) * 📘 [Common Issues](./COMMON_ISSUES.md)
* 🧰 [Debugging Tips](./DEBUG_TIPS.md) * 🧰 [Debugging Tips](./DEBUG_TIPS.md)
* ✅ [Browse resolved GitHub issues](https://github.com/netalertx/NetAlertX/issues?q=is%3Aissue+is%3Aclosed) * ✅ [Browse resolved GitHub issues](https://github.com/jokob-sk/NetAlertX/issues?q=is%3Aissue+is%3Aclosed)
--- ---

View File

@@ -17,10 +17,10 @@ If facing issues, please spend a few minutes searching.
- Check [common issues](./COMMON_ISSUES.md) - Check [common issues](./COMMON_ISSUES.md)
- Have a look at [Community guides](./COMMUNITY_GUIDES.md) - Have a look at [Community guides](./COMMUNITY_GUIDES.md)
- [Search closed or open issues or discussions](https://github.com/netalertx/NetAlertX/issues?q=is%3Aissue) - [Search closed or open issues or discussions](https://github.com/jokob-sk/NetAlertX/issues?q=is%3Aissue)
- Check [Discord](https://discord.gg/NczTUTWyRr) - Check [Discord](https://discord.gg/NczTUTWyRr)
> [!NOTE] > [!NOTE]
> If you can't find a solution anywhere, ask in Discord if you think it's a quick question, otherwise open a new [issue](https://github.com/netalertx/NetAlertX/issues/new?template=setup-help.yml). Please fill in as much as possible to speed up the help process. > If you can't find a solution anywhere, ask in Discord if you think it's a quick question, otherwise open a new [issue](https://github.com/jokob-sk/NetAlertX/issues/new?template=setup-help.yml). Please fill in as much as possible to speed up the help process.
> >

View File

@@ -19,23 +19,22 @@ The following device properties influence notifications. You can:
1. **Alert Events** - Enables alerts of connections, disconnections, IP changes (down and down reconnected notifications are still sent even if this is disabled). 1. **Alert Events** - Enables alerts of connections, disconnections, IP changes (down and down reconnected notifications are still sent even if this is disabled).
2. **Alert Down** - Alerts when a device goes down. This setting overrides a disabled **Alert Events** setting, so you will get a notification of a device going down even if you don't have **Alert Events** ticked. Disabling this will disable down and down reconnected notifications on the device. 2. **Alert Down** - Alerts when a device goes down. This setting overrides a disabled **Alert Events** setting, so you will get a notification of a device going down even if you don't have **Alert Events** ticked. Disabling this will disable down and down reconnected notifications on the device.
3. **Can Sleep** - Marks the device as sleep-capable (e.g. a battery-powered sensor that deep-sleeps between readings). When enabled, offline periods within the **Alert down after (sleep)** (`NTFPRCS_sleep_time`) global window are shown as **Sleeping** (aqua badge 🌙) instead of **Down**, and no down alert is fired during that window. Once the window expires the device falls back to normal down-alert logic. ⚠ Requires **Alert Down** to be enabled — sleeping suppresses the alert during the window only. 3. **Skip repeated notifications**, if for example you know there is a temporary issue and want to pause the same notification for this device for a given time.
4. **Skip repeated notifications**, if for example you know there is a temporary issue and want to pause the same notification for this device for a given time. 4. **Require NICs Online** - Indicates whether this device should be considered online only if all associated NICs (devices with the `nic` relationship type) are online. If disabled, the device is considered online if any NIC is online. If a NIC is online it sets the parent (this) device's status to online irrespectivelly of the detected device's status. The Relationship type is set on the childern device.
5. **Require NICs Online** - Indicates whether this device should be considered online only if all associated NICs (devices with the `nic` relationship type) are online. If disabled, the device is considered online if any NIC is online. If a NIC is online it sets the parent (this) device's status to online irrespectivelly of the detected device's status. The Relationship type is set on the childern device.
> [!NOTE] > [!NOTE]
> Please read through the [NTFPRCS plugin](https://github.com/netalertx/NetAlertX/blob/main/front/plugins/notification_processing/README.md) documentation to understand how device and global settings influence the notification processing. > Please read through the [NTFPRCS plugin](https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/notification_processing/README.md) documentation to understand how device and global settings influence the notification processing.
## Plugin settings 🔌 ## Plugin settings 🔌
![Plugin notification settings](./img/NOTIFICATIONS/Plugin-notification-settings.png) ![Plugin notification settings](./img/NOTIFICATIONS/Plugin-notification-settings.png)
On almost all plugins there are 2 core settings, `<plugin>_WATCH` and `<plugin>_REPORT_ON`. On almost all plugins there are 2 core settings, `<plugin>_WATCH` and `<plugin>_REPORT_ON`.
1. `<plugin>_WATCH` specifies the columns which the app should watch. If watched columns change the device state is considered changed. This changed status is then used to decide to send out notifications based on the `<plugin>_REPORT_ON` setting. 1. `<plugin>_WATCH` specifies the columns which the app should watch. If watched columns change the device state is considered changed. This changed status is then used to decide to send out notifications based on the `<plugin>_REPORT_ON` setting.
2. `<plugin>_REPORT_ON` let's you specify on which events the app should notify you. This is related to the `<plugin>_WATCH` setting. So if you select `watched-changed` and in `<plugin>_WATCH` you only select `Watched_Value1`, then a notification is triggered if `Watched_Value1` is changed from the previous value, but no notification is send if `Watched_Value2` changes. 2. `<plugin>_REPORT_ON` let's you specify on which events the app should notify you. This is related to the `<plugin>_WATCH` setting. So if you select `watched-changed` and in `<plugin>_WATCH` you only select `Watched_Value1`, then a notification is triggered if `Watched_Value1` is changed from the previous value, but no notification is send if `Watched_Value2` changes.
Click the **Read more in the docs.** Link at the top of each plugin to get more details on how the given plugin works. Click the **Read more in the docs.** Link at the top of each plugin to get more details on how the given plugin works.
## Global settings ⚙ ## Global settings ⚙
@@ -43,11 +42,10 @@ Click the **Read more in the docs.** Link at the top of each plugin to get more
In Notification Processing settings, you can specify blanket rules. These allow you to specify exceptions to the Plugin and Device settings and will override those. In Notification Processing settings, you can specify blanket rules. These allow you to specify exceptions to the Plugin and Device settings and will override those.
1. Notify on (`NTFPRCS_INCLUDED_SECTIONS`) allows you to specify which events trigger notifications. Usual setups will have `new_devices`, `down_devices`, and possibly `down_reconnected` set. Including `plugin` (dependenton the Plugin `<plugin>_WATCH` and `<plugin>_REPORT_ON` settings) and `events` (dependent on the on-device **Alert Events** setting) might be too noisy for most setups. More info in the [NTFPRCS plugin](https://github.com/netalertx/NetAlertX/blob/main/front/plugins/notification_processing/README.md) on what events these selections include. 1. Notify on (`NTFPRCS_INCLUDED_SECTIONS`) allows you to specify which events trigger notifications. Usual setups will have `new_devices`, `down_devices`, and possibly `down_reconnected` set. Including `plugin` (dependenton the Plugin `<plugin>_WATCH` and `<plugin>_REPORT_ON` settings) and `events` (dependent on the on-device **Alert Events** setting) might be too noisy for most setups. More info in the [NTFPRCS plugin](https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/notification_processing/README.md) on what events these selections include.
2. Alert down after (`NTFPRCS_alert_down_time`) is useful if you want to wait for some time before the system sends out a down notification for a device. This is related to the on-device **Alert down** setting and only devices with this checked will trigger a down notification. 2. Alert down after (`NTFPRCS_alert_down_time`) is useful if you want to wait for some time before the system sends out a down notification for a device. This is related to the on-device **Alert down** setting and only devices with this checked will trigger a down notification.
3. Alert down after (sleep) (`NTFPRCS_sleep_time`) sets the **sleep window** in minutes. If a device has **Can Sleep** enabled and goes offline, it is shown as **Sleeping** (aqua 🌙 badge) for this many minutes before down-alert logic kicks in. Default is `30` minutes. Changing this setting takes effect after saving — no restart required.
You can filter out unwanted notifications globally. This could be because of a misbehaving device (GoogleNest/GoogleHub (See also [ARPSAN docs and the `--exclude-broadcast` flag](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/arp_scan#ip-flipping-on-google-nest-devices))) which flips between IP addresses, or because you want to ignore new device notifications of a certain pattern. You can filter out unwanted notifications globally. This could be because of a misbehaving device (GoogleNest/GoogleHub (See also [ARPSAN docs and the `--exclude-broadcast` flag](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/arp_scan#ip-flipping-on-google-nest-devices))) which flips between IP addresses, or because you want to ignore new device notifications of a certain pattern.
1. Events Filter (`NTFPRCS_event_condition`) - Filter out Events from notifications. 1. Events Filter (`NTFPRCS_event_condition`) - Filter out Events from notifications.
2. New Devices Filter (`NTFPRCS_new_dev_condition`) - Filter out New Devices from notifications, but log and keep a new device in the system. 2. New Devices Filter (`NTFPRCS_new_dev_condition`) - Filter out New Devices from notifications, but log and keep a new device in the system.
@@ -56,9 +54,9 @@ You can filter out unwanted notifications globally. This could be because of a m
![Ignoring new devices](./img/NOTIFICATIONS/NEWDEV_ignores.png) ![Ignoring new devices](./img/NOTIFICATIONS/NEWDEV_ignores.png)
You can completely ignore detected devices globally. This could be because your instance detects docker containers, you want to ignore devices from a specific manufacturer via MAC rules or you want to ignore devices on a specific IP range. You can completely ignore detected devices globally. This could be because your instance detects docker containers, you want to ignore devices from a specific manufacturer via MAC rules or you want to ignore devices on a specific IP range.
1. Ignored MACs (`NEWDEV_ignored_MACs`) - List of MACs to ignore. 1. Ignored MACs (`NEWDEV_ignored_MACs`) - List of MACs to ignore.
2. Ignored IPs (`NEWDEV_ignored_IPs`) - List of IPs to ignore. 2. Ignored IPs (`NEWDEV_ignored_IPs`) - List of IPs to ignore.

View File

@@ -48,36 +48,6 @@ Two plugins help maintain the systems performance:
--- ---
## Database Performance Tuning
The application automatically maintains database performance as data accumulates. However, you can adjust settings to balance CPU usage, disk usage, and responsiveness.
### **WAL Size Tuning (Storage vs. CPU Tradeoff)**
The SQLite Write-Ahead Log (WAL) is a temporary file that grows during normal operation. On systems with constrained resources (NAS, Raspberry Pi), controlling WAL size is important.
**Setting:** **`PRAGMA_JOURNAL_SIZE_LIMIT`** (default: **50 MB**)
| Setting | Effect | Use Case |
|---------|--------|----------|
| **1020 MB** | Smaller storage footprint; more frequent disk operations | NAS with SD card (storage priority) |
| **50 MB** (default) | Balanced; recommended for most setups | General use |
| **75100 MB** | Smoother performance; larger WAL on disk | High-speed NAS or servers |
**Recommendation:** For NAS devices with SD cards, leave at default (50 MB) or increase slightly (75 MB). Avoid very low values (< 10 MB) as they cause frequent disk thrashing and CPU spikes.
### **Automatic Cleanup**
The DB cleanup plugin (`DBCLNP`) automatically optimizes query performance and trims old data:
- **Deletes old events** Controlled by `DAYS_TO_KEEP_EVENTS` (default: 90 days)
- **Trims plugin history** Keeps recent entries only (controlled by `PLUGINS_KEEP_HIST`)
- **Optimizes queries** Updates database statistics so queries remain fast
**If cleanup fails**, performance degrades quickly. Check **Maintenance → Logs** for errors. If you see frequent failures, increase the timeout (`DBCLNP_RUN_TIMEOUT`).
---
## Scan Frequency and Coverage ## Scan Frequency and Coverage
Frequent scans increase resource usage, network traffic, and database read/write cycles. Frequent scans increase resource usage, network traffic, and database read/write cycles.

View File

@@ -17,7 +17,7 @@ To use this approach make sure the Web UI password in **Pi-hole** is set.
| `PIHOLEAPI_API_MAXCLIENTS` | Maximum number of devices to request from Pi-hole. Defaults are usually fine. | `500` | | `PIHOLEAPI_API_MAXCLIENTS` | Maximum number of devices to request from Pi-hole. Defaults are usually fine. | `500` |
| `PIHOLEAPI_FAKE_MAC` | Generate FAKE MAC from IP. | `False` | | `PIHOLEAPI_FAKE_MAC` | Generate FAKE MAC from IP. | `False` |
Check the [PiHole API plugin readme](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/pihole_api_scan/) for details and troubleshooting. Check the [PiHole API plugin readme](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/pihole_api_scan/) for details and troubleshooting.
### docker-compose changes ### docker-compose changes
@@ -35,7 +35,7 @@ No changes needed
| `DHCPLSS_RUN_SCHD` | If you run multiple device scanner plugins, align the schedules of all plugins to the same value. | `*/5 * * * *` | | `DHCPLSS_RUN_SCHD` | If you run multiple device scanner plugins, align the schedules of all plugins to the same value. | `*/5 * * * *` |
| `DHCPLSS_paths_to_check` | You need to map the value in this setting in the `docker-compose.yml` file. The in-container path must contain `pihole` so it's parsed correctly. | `['/etc/pihole/dhcp.leases']` | | `DHCPLSS_paths_to_check` | You need to map the value in this setting in the `docker-compose.yml` file. The in-container path must contain `pihole` so it's parsed correctly. | `['/etc/pihole/dhcp.leases']` |
Check the [DHCPLSS plugin readme](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/dhcp_leases#overview) for details Check the [DHCPLSS plugin readme](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dhcp_leases#overview) for details
### docker-compose changes ### docker-compose changes
@@ -54,7 +54,7 @@ Check the [DHCPLSS plugin readme](https://github.com/netalertx/NetAlertX/tree/ma
| `PIHOLE_RUN_SCHD` | If you run multiple device scanner plugins, align the schedules of all plugins to the same value. | `*/5 * * * *` | | `PIHOLE_RUN_SCHD` | If you run multiple device scanner plugins, align the schedules of all plugins to the same value. | `*/5 * * * *` |
| `PIHOLE_DB_PATH` | You need to map the value in this setting in the `docker-compose.yml` file. | `/etc/pihole/pihole-FTL.db` | | `PIHOLE_DB_PATH` | You need to map the value in this setting in the `docker-compose.yml` file. | `/etc/pihole/pihole-FTL.db` |
Check the [PiHole plugin readme](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/pihole_scan) for details Check the [PiHole plugin readme](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/pihole_scan) for details
### docker-compose changes ### docker-compose changes

View File

@@ -1,18 +1,18 @@
# 🔌 Plugins # 🔌 Plugins
NetAlertX supports additional plugins to extend its functionality, each with its own settings and options. Plugins can be loaded via the General -> `LOADED_PLUGINS` setting. For custom plugin development, refer to the [Plugin development guide](./PLUGINS_DEV.md). NetAlertX supports additional plugins to extend its functionality, each with its own settings and options. Plugins can be loaded via the General -> `LOADED_PLUGINS` setting. For custom plugin development, refer to the [Plugin development guide](./PLUGINS_DEV.md).
>[!NOTE] >[!NOTE]
> Please check this [Plugins debugging guide](./DEBUG_PLUGINS.md) and the corresponding Plugin documentation in the below table if you are facing issues. > Please check this [Plugins debugging guide](./DEBUG_PLUGINS.md) and the corresponding Plugin documentation in the below table if you are facing issues.
## ⚡ Quick start ## ⚡ Quick start
> [!TIP] > [!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). > 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/enable_plugin.gif) > ![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) 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. 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.
3. Setup your [Network topology diagram](./NETWORK_TREE.md) 3. Setup your [Network topology diagram](./NETWORK_TREE.md)
4. Fine-tune [Notifications](./NOTIFICATIONS.md) 4. Fine-tune [Notifications](./NOTIFICATIONS.md)
5. Setup [Workflows](./WORKFLOWS.md) 5. Setup [Workflows](./WORKFLOWS.md)
@@ -40,56 +40,56 @@ NetAlertX supports additional plugins to extend its functionality, each with its
## Available Plugins ## Available Plugins
Device-detecting plugins insert values into the `CurrentScan` database table. The plugins that are not required are safe to ignore, however, it makes sense to have at least some device-detecting plugins enabled, such as `ARPSCAN` or `NMAPDEV`. Device-detecting plugins insert values into the `CurrentScan` database table. The plugins that are not required are safe to ignore, however, it makes sense to have at least some device-detecting plugins enabled, such as `ARPSCAN` or `NMAPDEV`.
| ID | Plugin docs | Type | Description | Features | Required | | ID | Plugin docs | Type | Description | Features | Required |
| --------------- | ------------------------------------------------------------------------------------------------------------------ | -------- | ----------------------------------------- | -------- | -------- | | --------------- | ------------------------------------------------------------------------------------------------------------------ | -------- | ----------------------------------------- | -------- | -------- |
| `APPRISE` | [_publisher_apprise](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/_publisher_apprise/) | ▶️ | Apprise notification proxy | | | | `APPRISE` | [_publisher_apprise](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_apprise/) | ▶️ | Apprise notification proxy | | |
| `ARPSCAN` | [arp_scan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/arp_scan/) | 🔍 | ARP-scan on current network | | | | `ARPSCAN` | [arp_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/arp_scan/) | 🔍 | ARP-scan on current network | | |
| `AVAHISCAN` | [avahi_scan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/avahi_scan/) | 🆎 | Avahi (mDNS-based) name resolution | | | | `AVAHISCAN` | [avahi_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/avahi_scan/) | 🆎 | Avahi (mDNS-based) name resolution | | |
| `ASUSWRT` | [asuswrt_import](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/asuswrt_import/) | 🔍 | Import connected devices from AsusWRT | | | | `ASUSWRT` | [asuswrt_import](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/asuswrt_import/) | 🔍 | Import connected devices from AsusWRT | | |
| `CSVBCKP` | [csv_backup](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/csv_backup/) | ⚙ | CSV devices backup | | | | `CSVBCKP` | [csv_backup](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/csv_backup/) | ⚙ | CSV devices backup | | |
| `CUSTPROP` | [custom_props](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/custom_props/) | ⚙ | Managing custom device properties values | | Yes | | `CUSTPROP` | [custom_props](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/custom_props/) | ⚙ | Managing custom device properties values | | Yes |
| `DBCLNP` | [db_cleanup](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/db_cleanup/) | ⚙ | Database cleanup | | Yes\* | | `DBCLNP` | [db_cleanup](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/db_cleanup/) | ⚙ | Database cleanup | | Yes\* |
| `DDNS` | [ddns_update](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/ddns_update/) | ⚙ | DDNS update | | | | `DDNS` | [ddns_update](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/ddns_update/) | ⚙ | DDNS update | | |
| `DHCPLSS` | [dhcp_leases](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/dhcp_leases/) | 🔍/📥/🆎 | Import devices from DHCP leases | | | | `DHCPLSS` | [dhcp_leases](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dhcp_leases/) | 🔍/📥/🆎 | Import devices from DHCP leases | | |
| `DHCPSRVS` | [dhcp_servers](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/dhcp_servers/) | ♻ | DHCP servers | | | | `DHCPSRVS` | [dhcp_servers](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dhcp_servers/) | ♻ | DHCP servers | | |
| `DIGSCAN` | [dig_scan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/dig_scan/) | 🆎 | Dig (DNS) Name resolution | | | | `DIGSCAN` | [dig_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dig_scan/) | 🆎 | Dig (DNS) Name resolution | | |
| `FREEBOX` | [freebox](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/freebox/) | 🔍/♻/🆎 | Pull data and names from Freebox/Iliadbox | | | | `FREEBOX` | [freebox](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/freebox/) | 🔍/♻/🆎 | Pull data and names from Freebox/Iliadbox | | |
| `ICMP` | [icmp_scan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/icmp_scan/) | ♻ | ICMP (ping) status checker | | | | `ICMP` | [icmp_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/icmp_scan/) | ♻ | ICMP (ping) status checker | | |
| `INTRNT` | [internet_ip](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/internet_ip/) | 🔍 | Internet IP scanner | | | | `INTRNT` | [internet_ip](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/internet_ip/) | 🔍 | Internet IP scanner | | |
| `INTRSPD` | [internet_speedtest](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/internet_speedtest/) | ♻ | Internet speed test | | | | `INTRSPD` | [internet_speedtest](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/internet_speedtest/) | ♻ | Internet speed test | | |
| `IPNEIGH` | [ipneigh](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/ipneigh/) | 🔍 | Scan ARP (IPv4) and NDP (IPv6) tables | | | | `IPNEIGH` | [ipneigh](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/ipneigh/) | 🔍 | Scan ARP (IPv4) and NDP (IPv6) tables | | |
| `LUCIRPC` | [luci_import](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/luci_import/) | 🔍 | Import connected devices from OpenWRT | | | | `LUCIRPC` | [luci_import](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/luci_import/) | 🔍 | Import connected devices from OpenWRT | | |
| `MAINT` | [maintenance](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/maintenance/) | ⚙ | Maintenance of logs, etc. | | | | `MAINT` | [maintenance](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/maintenance/) | ⚙ | Maintenance of logs, etc. | | |
| `MQTT` | [_publisher_mqtt](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/_publisher_mqtt/) | ▶️ | MQTT for synching to Home Assistant | | | | `MQTT` | [_publisher_mqtt](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_mqtt/) | ▶️ | MQTT for synching to Home Assistant | | |
| `MTSCAN` | [mikrotik_scan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/mikrotik_scan/) | 🔍 | Mikrotik device import & sync | | | | `MTSCAN` | [mikrotik_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/mikrotik_scan/) | 🔍 | Mikrotik device import & sync | | |
| `NBTSCAN` | [nbtscan_scan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nbtscan_scan/) | 🆎 | Nbtscan (NetBIOS-based) name resolution | | | | `NBTSCAN` | [nbtscan_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nbtscan_scan/) | 🆎 | Nbtscan (NetBIOS-based) name resolution | | |
| `NEWDEV` | [newdev_template](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/newdev_template/) | ⚙ | New device template | | Yes | | `NEWDEV` | [newdev_template](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/newdev_template/) | ⚙ | New device template | | Yes |
| `NMAP` | [nmap_scan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_scan/) | ♻ | Nmap port scanning & discovery | | | | `NMAP` | [nmap_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan/) | ♻ | Nmap port scanning & discovery | | |
| `NMAPDEV` | [nmap_dev_scan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_dev_scan/) | 🔍 | Nmap dev scan on current network | | | | `NMAPDEV` | [nmap_dev_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_dev_scan/) | 🔍 | Nmap dev scan on current network | | |
| `NSLOOKUP` | [nslookup_scan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nslookup_scan/) | 🆎 | NSLookup (DNS-based) name resolution | | | | `NSLOOKUP` | [nslookup_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nslookup_scan/) | 🆎 | NSLookup (DNS-based) name resolution | | |
| `NTFPRCS` | [notification_processing](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/notification_processing/) | ⚙ | Notification processing | | Yes | | `NTFPRCS` | [notification_processing](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/notification_processing/) | ⚙ | Notification processing | | Yes |
| `NTFY` | [_publisher_ntfy](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/_publisher_ntfy/) | ▶️ | NTFY notifications | | | | `NTFY` | [_publisher_ntfy](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_ntfy/) | ▶️ | NTFY notifications | | |
| `OMDSDN` | [omada_sdn_imp](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/omada_sdn_imp/) | 📥/🆎 ❌ | UNMAINTAINED use `OMDSDNOPENAPI` | 🖧 🔄 | | | `OMDSDN` | [omada_sdn_imp](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/omada_sdn_imp/) | 📥/🆎 ❌ | UNMAINTAINED use `OMDSDNOPENAPI` | 🖧 🔄 | |
| `OMDSDNOPENAPI` | [omada_sdn_openapi](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/omada_sdn_openapi/) | 📥/🆎 | OMADA TP-Link import via OpenAPI | 🖧 | | | `OMDSDNOPENAPI` | [omada_sdn_openapi](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/omada_sdn_openapi/) | 📥/🆎 | OMADA TP-Link import via OpenAPI | 🖧 | |
| `PIHOLE` | [pihole_scan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/pihole_scan/) | 🔍/🆎/📥 | Pi-hole device import & sync | | | | `PIHOLE` | [pihole_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/pihole_scan/) | 🔍/🆎/📥 | Pi-hole device import & sync | | |
| `PIHOLEAPI` | [pihole_api_scan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/pihole_api_scan/) | 🔍/🆎/📥 | Pi-hole device import & sync via API v6+ | | | | `PIHOLEAPI` | [pihole_api_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/pihole_api_scan/) | 🔍/🆎/📥 | Pi-hole device import & sync via API v6+ | | |
| `PUSHSAFER` | [_publisher_pushsafer](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/_publisher_pushsafer/) | ▶️ | Pushsafer notifications | | | | `PUSHSAFER` | [_publisher_pushsafer](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_pushsafer/) | ▶️ | Pushsafer notifications | | |
| `PUSHOVER` | [_publisher_pushover](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/_publisher_pushover/) | ▶️ | Pushover notifications | | | | `PUSHOVER` | [_publisher_pushover](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_pushover/) | ▶️ | Pushover notifications | | |
| `SETPWD` | [set_password](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/set_password/) | ⚙ | Set password | | Yes | | `SETPWD` | [set_password](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password/) | ⚙ | Set password | | Yes |
| `SMTP` | [_publisher_email](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/_publisher_email/) | ▶️ | Email notifications | | | | `SMTP` | [_publisher_email](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_email/) | ▶️ | Email notifications | | |
| `SNMPDSC` | [snmp_discovery](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/snmp_discovery/) | 🔍/📥 | SNMP device import & sync | | | | `SNMPDSC` | [snmp_discovery](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/snmp_discovery/) | 🔍/📥 | SNMP device import & sync | | |
| `SYNC` | [sync](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/sync/) | 🔍/⚙/📥 | Sync & import from NetAlertX instances | 🖧 🔄 | Yes | | `SYNC` | [sync](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/sync/) | 🔍/⚙/📥 | Sync & import from NetAlertX instances | 🖧 🔄 | Yes |
| `TELEGRAM` | [_publisher_telegram](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/_publisher_telegram/) | ▶️ | Telegram notifications | | | | `TELEGRAM` | [_publisher_telegram](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_telegram/) | ▶️ | Telegram notifications | | |
| `UI` | [ui_settings](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/ui_settings/) | ♻ | UI specific settings | | Yes | | `UI` | [ui_settings](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/ui_settings/) | ♻ | UI specific settings | | Yes |
| `UNFIMP` | [unifi_import](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/unifi_import/) | 🔍/📥/🆎 | UniFi device import & sync | 🖧 | | | `UNFIMP` | [unifi_import](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/unifi_import/) | 🔍/📥/🆎 | UniFi device import & sync | 🖧 | |
| `UNIFIAPI` | [unifi_api_import](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/unifi_api_import/) | 🔍/📥/🆎 | UniFi device import (SM API, multi-site) | | | | `UNIFIAPI` | [unifi_api_import](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/unifi_api_import/) | 🔍/📥/🆎 | UniFi device import (SM API, multi-site) | | |
| `VNDRPDT` | [vendor_update](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/vendor_update/) | ⚙ | Vendor database update | | | | `VNDRPDT` | [vendor_update](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/vendor_update/) | ⚙ | Vendor database update | | |
| `WEBHOOK` | [_publisher_webhook](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/_publisher_webhook/) | ▶️ | Webhook notifications | | | | `WEBHOOK` | [_publisher_webhook](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_webhook/) | ▶️ | Webhook notifications | | |
| `WEBMON` | [website_monitor](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/website_monitor/) | ♻ | Website down monitoring | | | | `WEBMON` | [website_monitor](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/website_monitor/) | ♻ | Website down monitoring | | |
| `WOL` | [wake_on_lan](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/wake_on_lan/) | ♻ | Automatic wake-on-lan | | | | `WOL` | [wake_on_lan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/wake_on_lan/) | ♻ | Automatic wake-on-lan | | |
> \* The database cleanup plugin (`DBCLNP`) is not _required_ but the app will become unusable after a while if not executed. > \* The database cleanup plugin (`DBCLNP`) is not _required_ but the app will become unusable after a while if not executed.
@@ -100,18 +100,18 @@ Device-detecting plugins insert values into the `CurrentScan` database table. T
## Enabling plugins ## Enabling plugins
Plugins can be enabled via Settings, and can be disabled as needed. Plugins can be enabled via Settings, and can be disabled as needed.
1. Research which plugin you'd like to use, enable `DISCOVER_PLUGINS` and load the required plugins in Settings via the `LOADED_PLUGINS` setting. 1. Research which plugin you'd like to use, enable `DISCOVER_PLUGINS` and load the required plugins in Settings via the `LOADED_PLUGINS` setting.
1. Save the changes and review the Settings of the newly loaded plugins. 1. Save the changes and review the Settings of the newly loaded plugins.
1. Change the `<prefix>_RUN` Setting to the recommended or custom value as per the documentation of the given setting 1. Change the `<prefix>_RUN` Setting to the recommended or custom value as per the documentation of the given setting
- If using `schedule` on a `🔍 dev scanner` plugin, make sure the schedules are the same across all `🔍 dev scanner` plugins - If using `schedule` on a `🔍 dev scanner` plugin, make sure the schedules are the same across all `🔍 dev scanner` plugins
### Disabling, Unloading and Ignoring plugins ### Disabling, Unloading and Ignoring plugins
1. Change the `<prefix>_RUN` Setting to `disabled` if you want to disable the plugin, but keep the settings 1. Change the `<prefix>_RUN` Setting to `disabled` if you want to disable the plugin, but keep the settings
1. If you want to speed up the application, you can unload the plugin by unselecting it in the `LOADED_PLUGINS` setting. 1. If you want to speed up the application, you can unload the plugin by unselecting it in the `LOADED_PLUGINS` setting.
- Careful, once you save the Settings Unloaded plugin settings will be lost (old `app.conf` files are kept in the `/config` folder) - Careful, once you save the Settings Unloaded plugin settings will be lost (old `app.conf` files are kept in the `/config` folder)
1. You can completely ignore plugins by placing a `ignore_plugin` file into the plugin directory. Ignored plugins won't show up in the `LOADED_PLUGINS` setting. 1. You can completely ignore plugins by placing a `ignore_plugin` file into the plugin directory. Ignored plugins won't show up in the `LOADED_PLUGINS` setting.
## 🆕 Developing new custom plugins ## 🆕 Developing new custom plugins

View File

@@ -34,7 +34,7 @@ NetAlertX comes with a plugin system to feed events from third-party scripts int
### 🐛 Troubleshooting ### 🐛 Troubleshooting
- **[Debugging Plugins](DEBUG_PLUGINS.md)** - Troubleshoot plugin issues - **[Debugging Plugins](DEBUG_PLUGINS.md)** - Troubleshoot plugin issues
- **[Plugin Examples](https://github.com/netalertx/NetAlertX/tree/main/front/plugins)** - Study existing plugins as reference implementations - **[Plugin Examples](../front/plugins)** - Study existing plugins as reference implementations
### 🎥 Video Tutorial ### 🎥 Video Tutorial

View File

@@ -137,7 +137,7 @@ Some additional context:
Before submitting a new issue please spend a couple of minutes on research: Before submitting a new issue please spend a couple of minutes on research:
* Check [🛑 Common issues](./DEBUG_TIPS.md#common-issues) * Check [🛑 Common issues](./DEBUG_TIPS.md#common-issues)
* Check [💡 Closed issues](https://github.com/netalertx/NetAlertX/issues?q=is%3Aissue+is%3Aclosed) if a similar issue was solved in the past. * Check [💡 Closed issues](https://github.com/jokob-sk/NetAlertX/issues?q=is%3Aissue+is%3Aclosed) if a similar issue was solved in the past.
* When submitting an issue ❗[enable debug](./DEBUG_TIPS.md)❗ * When submitting an issue ❗[enable debug](./DEBUG_TIPS.md)❗
⚠ Please follow the pre-defined issue template to resolve your issue faster. ⚠ Please follow the pre-defined issue template to resolve your issue faster.

View File

@@ -43,11 +43,11 @@ You can use supplementary plugins that employ alternate methods. Protocols used
## Multiple NetAlertX Instances ## Multiple NetAlertX Instances
If you have servers in different networks, you can set up separate NetAlertX instances on those subnets and synchronize the results into one instance using the [`SYNC` plugin](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/sync). If you have servers in different networks, you can set up separate NetAlertX instances on those subnets and synchronize the results into one instance using the [`SYNC` plugin](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/sync).
## Manual Entry ## Manual Entry
If you don't need to discover new devices and only need to report on their status (`online`, `offline`, `down`), you can manually enter devices and check their status using the [`ICMP` plugin](https://github.com/netalertx/NetAlertX/blob/main/front/plugins/icmp_scan/), which uses the `ping` command internally. If you don't need to discover new devices and only need to report on their status (`online`, `offline`, `down`), you can manually enter devices and check their status using the [`ICMP` plugin](https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/icmp_scan/), which uses the `ping` command internally.
For more information on how to add devices manually (or dummy devices), refer to the [Device Management](./DEVICE_MANAGEMENT.md) documentation. For more information on how to add devices manually (or dummy devices), refer to the [Device Management](./DEVICE_MANAGEMENT.md) documentation.
@@ -57,4 +57,4 @@ To create truly dummy devices, you can use a loopback IP address (e.g., `0.0.0.0
Scanning remote networks with NMAP is possible (via the `NMAPDEV` plugin), but since it cannot retrieve the MAC address, you need to enable the `NMAPDEV_FAKE_MAC` setting. This will generate a fake MAC address based on the IP address, allowing you to track devices. However, this can lead to inconsistencies, especially if the IP address changes or a previously logged device is rediscovered. If this setting is disabled, only the IP address will be discovered, and devices with missing MAC addresses will be skipped. Scanning remote networks with NMAP is possible (via the `NMAPDEV` plugin), but since it cannot retrieve the MAC address, you need to enable the `NMAPDEV_FAKE_MAC` setting. This will generate a fake MAC address based on the IP address, allowing you to track devices. However, this can lead to inconsistencies, especially if the IP address changes or a previously logged device is rediscovered. If this setting is disabled, only the IP address will be discovered, and devices with missing MAC addresses will be skipped.
Check the [NMAPDEV plugin](https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_dev_scan) for details Check the [NMAPDEV plugin](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_dev_scan) for details

View File

@@ -2,35 +2,35 @@
You need to specify the network interface and the network mask. You can also configure multiple subnets and specify VLANs (see VLAN exceptions below). You need to specify the network interface and the network mask. You can also configure multiple subnets and specify VLANs (see VLAN exceptions below).
`ARPSCAN` can scan multiple networks if the network allows it. To scan networks directly, the subnets must be accessible from the network where NetAlertX is running. This means NetAlertX needs to have access to the interface attached to that subnet. `ARPSCAN` can scan multiple networks if the network allows it. To scan networks directly, the subnets must be accessible from the network where NetAlertX is running. This means NetAlertX needs to have access to the interface attached to that subnet.
> [!WARNING] > [!WARNING]
> If you don't see all expected devices run the following command in the NetAlertX container (replace the interface and ip mask): > If you don't see all expected devices run the following command in the NetAlertX container (replace the interface and ip mask):
> `sudo arp-scan --interface=eth0 192.168.1.0/24` > `sudo arp-scan --interface=eth0 192.168.1.0/24`
> >
> If this command returns no results, the network is not accessible due to your network or firewall restrictions (Wi-Fi Extenders, VPNs and inaccessible networks). If direct scans are not possible, check the [remote networks documentation](./REMOTE_NETWORKS.md) for workarounds. > If this command returns no results, the network is not accessible due to your network or firewall restrictions (Wi-Fi Extenders, VPNs and inaccessible networks). If direct scans are not possible, check the [remote networks documentation](./REMOTE_NETWORKS.md) for workarounds.
## Example Values ## Example Values
> [!NOTE] > [!NOTE]
> Please use the UI to configure settings as it ensures the config file is in the correct format. Edit `app.conf` directly only when really necessary. > Please use the UI to configure settings as it ensures the config file is in the correct format. Edit `app.conf` directly only when really necessary.
> ![Settings location](./img/SUBNETS/subnets-setting-location.png) > ![Settings location](./img/SUBNETS/subnets-setting-location.png)
* **Examples for one and two subnets:** * **Examples for one and two subnets:**
* One subnet: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0']` * One subnet: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0']`
* Two subnets: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0','192.168.1.0/24 --interface=eth1 --vlan=107']` * Two subnets: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0','192.168.1.0/24 --interface=eth1 --vlan=107']`
> [!TIP] > [!TIP]
> When adding more subnets, you may need to increase both the scan interval (`ARPSCAN_RUN_SCHD`) and the timeout (`ARPSCAN_RUN_TIMEOUT`)—as well as similar settings for related plugins. > When adding more subnets, you may need to increase both the scan interval (`ARPSCAN_RUN_SCHD`) and the timeout (`ARPSCAN_RUN_TIMEOUT`)—as well as similar settings for related plugins.
> >
> If the timeout is too short, you may see timeout errors in the log. To prevent the application from hanging due to unresponsive plugins, scans are canceled when they exceed the timeout limit. > If the timeout is too short, you may see timeout errors in the log. To prevent the application from hanging due to unresponsive plugins, scans are canceled when they exceed the timeout limit.
> >
> To fix this: > To fix this:
> - Reduce the subnet size (e.g., change `/16` to `/24`). > - Reduce the subnet size (e.g., change `/16` to `/24`).
> - Increase the timeout (e.g., set `ARPSCAN_RUN_TIMEOUT` to `300` for a 5-minute timeout). > - Increase the timeout (e.g., set `ARPSCAN_RUN_TIMEOUT` to `300` for a 5-minute timeout).
> - Extend the scan interval (e.g., set `ARPSCAN_RUN_SCHD` to `*/10 * * * *` to scan every 10 minutes). > - Extend the scan interval (e.g., set `ARPSCAN_RUN_SCHD` to `*/10 * * * *` to scan every 10 minutes).
> >
> For more troubleshooting tips, see [Debugging Plugins](./DEBUG_PLUGINS.md). > For more troubleshooting tips, see [Debugging Plugins](./DEBUG_PLUGINS.md).
--- ---
@@ -43,7 +43,7 @@ You need to specify the network interface and the network mask. You can also con
The `arp-scan` time itself depends on the number of IP addresses to check. The `arp-scan` time itself depends on the number of IP addresses to check.
> The number of IPs to check depends on the [network mask](https://www.calculator.net/ip-subnet-calculator.html) you set in the `SCAN_SUBNETS` setting. > The number of IPs to check depends on the [network mask](https://www.calculator.net/ip-subnet-calculator.html) you set in the `SCAN_SUBNETS` setting.
> For example, a `/24` mask results in 256 IPs to check, whereas a `/16` mask checks around 65,536 IPs. Each IP takes a couple of seconds, so an incorrect configuration could make `arp-scan` take hours instead of seconds. > For example, a `/24` mask results in 256 IPs to check, whereas a `/16` mask checks around 65,536 IPs. Each IP takes a couple of seconds, so an incorrect configuration could make `arp-scan` take hours instead of seconds.
Specify the network filter, which **significantly** speeds up the scan process. For example, the filter `192.168.1.0/24` covers IP ranges from `192.168.1.0` to `192.168.1.255`. Specify the network filter, which **significantly** speeds up the scan process. For example, the filter `192.168.1.0/24` covers IP ranges from `192.168.1.0` to `192.168.1.255`.
@@ -56,7 +56,7 @@ The adapter will probably be `eth0` or `eth1`. (Check `System Info` > `Network H
![Network hardware](./img/SUBNETS/system_info-network_hardware.png) ![Network hardware](./img/SUBNETS/system_info-network_hardware.png)
> [!TIP] > [!TIP]
> As an alternative to `iwconfig`, run `ip -o link show | awk -F': ' '!/lo|vir|docker/ {print $2}'` in your container to find your interface name(s) (e.g.: `eth0`, `eth1`): > As an alternative to `iwconfig`, run `ip -o link show | awk -F': ' '!/lo|vir|docker/ {print $2}'` in your container to find your interface name(s) (e.g.: `eth0`, `eth1`):
> ```bash > ```bash
> Synology-NAS:/# ip -o link show | awk -F': ' '!/lo|vir|docker/ {print $2}' > Synology-NAS:/# ip -o link show | awk -F': ' '!/lo|vir|docker/ {print $2}'
@@ -73,11 +73,11 @@ The adapter will probably be `eth0` or `eth1`. (Check `System Info` > `Network H
#### VLANs on a Hyper-V Setup #### VLANs on a Hyper-V Setup
> Community-sourced content by [mscreations](https://github.com/mscreations) from this [discussion](https://github.com/netalertx/NetAlertX/discussions/404). > Community-sourced content by [mscreations](https://github.com/mscreations) from this [discussion](https://github.com/jokob-sk/NetAlertX/discussions/404).
**Tested Setup:** Bare Metal → Hyper-V on Win Server 2019 → Ubuntu 22.04 VM → Docker → NetAlertX. **Tested Setup:** Bare Metal → Hyper-V on Win Server 2019 → Ubuntu 22.04 VM → Docker → NetAlertX.
**Approach 1 (may cause issues):** **Approach 1 (may cause issues):**
Configure multiple network adapters in Hyper-V with distinct VLANs connected to each one using Hyper-V's network setup. However, this action can potentially lead to the Docker host's inability to handle network traffic correctly. This might interfere with other applications such as Authentik. Configure multiple network adapters in Hyper-V with distinct VLANs connected to each one using Hyper-V's network setup. However, this action can potentially lead to the Docker host's inability to handle network traffic correctly. This might interfere with other applications such as Authentik.
**Approach 2 (working example):** **Approach 2 (working example):**

View File

@@ -1,6 +1,6 @@
## Am I running the latest released version? ## Am I running the latest released version?
Since version 23.01.14 NetAlertX uses a simple timestamp-based version check to verify if a new version is available. You can check the [current and past releases here](https://github.com/netalertx/NetAlertX/releases), or have a look at what I'm [currently working on](https://github.com/netalertx/NetAlertX/issues/138). Since version 23.01.14 NetAlertX uses a simple timestamp-based version check to verify if a new version is available. You can check the [current and past releases here](https://github.com/jokob-sk/NetAlertX/releases), or have a look at what I'm [currently working on](https://github.com/jokob-sk/NetAlertX/issues/138).
If you are not on the latest version, the app will notify you, that a new released version is avialable the following way: If you are not on the latest version, the app will notify you, that a new released version is avialable the following way:
@@ -22,4 +22,4 @@ For a comparison, this is how the UI looks like if you are on the latest stable
## Implementation details ## Implementation details
During build a [/app/front/buildtimestamp.txt](https://github.com/netalertx/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,14 +1,14 @@
### Create a simple n8n workflow ### Create a simple n8n workflow
> [!NOTE] > [!NOTE]
> You need to enable the `WEBHOOK` plugin first in order to follow this guide. See the [Plugins guide](./PLUGINS.md) for details. > 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 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) ![n8n workflow](./img/WEBHOOK_N8N/n8n_workflow.png)
### Specify your email template ### Specify your email template
See [sample JSON](https://github.com/netalertx/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json) if you want to see the JSON paths used in the email template below See [sample JSON](https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json) if you want to see the JSON paths used in the email template below
![Email template](./img/WEBHOOK_N8N/n8n_send_email_settings.png) ![Email template](./img/WEBHOOK_N8N/n8n_send_email_settings.png)
``` ```

View File

@@ -8,7 +8,7 @@ Below are a few examples that demonstrate how this module can be used to simplif
## Updating Workflows ## Updating Workflows
> [!NOTE] > [!NOTE]
> In order to apply a workflow change, you must first **Save** the changes and then reload the application by clicking **Restart server**. > In order to apply a workflow change, you must first **Save** the changes and then reload the application by clicking **Restart server**.
## Workflow components ## Workflow components
@@ -25,7 +25,7 @@ Triggers define the event that activates a workflow. They monitor changes to obj
#### Example Trigger: #### Example Trigger:
- **Object Type**: `Devices` - **Object Type**: `Devices`
- **Event Type**: `update` - **Event Type**: `update`
This trigger will activate when a `Device` object is updated. This trigger will activate when a `Device` object is updated.
### Conditions ### Conditions
@@ -42,7 +42,7 @@ Conditions determine whether a workflow should proceed based on certain criteria
- **Field**: `devVendor` - **Field**: `devVendor`
- **Operator**: `contains` (case in-sensitive) - **Operator**: `contains` (case in-sensitive)
- **Value**: `Google` - **Value**: `Google`
This condition checks if the device's vendor is `Google`. The workflow will only proceed if the condition is true. This condition checks if the device's vendor is `Google`. The workflow will only proceed if the condition is true.
### Actions ### Actions
@@ -57,7 +57,7 @@ You can include multiple actions that should execute once the conditions are met
- **Action Type**: `update_field` - **Action Type**: `update_field`
- **Field**: `devIsNew` - **Field**: `devIsNew`
- **Value**: `0` - **Value**: `0`
This action updates the `devIsNew` field to `0`, marking the device as no longer new. This action updates the `devIsNew` field to `0`, marking the device as no longer new.
@@ -67,4 +67,4 @@ You can find a couple of configuration examples in [Workflow Examples](WORKFLOW_
> [!TIP] > [!TIP]
> Share your workflows in [Discord](https://discord.com/invite/NczTUTWyRr) or [GitHub Discussions](https://github.com/netalertx/NetAlertX/discussions). > Share your workflows in [Discord](https://discord.com/invite/NczTUTWyRr) or [GitHub Discussions](https://github.com/jokob-sk/NetAlertX/discussions).

View File

@@ -1,51 +0,0 @@
# ARP Flux Sysctls Not Set
## Issue Description
NetAlertX detected that ARP flux protection sysctls are not set as expected:
- `net.ipv4.conf.all.arp_ignore=1`
- `net.ipv4.conf.all.arp_announce=2`
## Security Ramifications
This is not a direct container breakout risk, but detection quality can degrade:
- Incorrect IP/MAC associations
- Device state flapping
- Unreliable topology or presence data
## Why You're Seeing This Issue
The running environment does not provide the expected kernel sysctl values. This is common in Docker setups where sysctls were not explicitly configured.
## How to Correct the Issue
Set these sysctls at container runtime.
- In `docker-compose.yml` (preferred):
```yaml
services:
netalertx:
sysctls:
net.ipv4.conf.all.arp_ignore: 1
net.ipv4.conf.all.arp_announce: 2
```
- For `docker run`:
```bash
docker run \
--sysctl net.ipv4.conf.all.arp_ignore=1 \
--sysctl net.ipv4.conf.all.arp_announce=2 \
ghcr.io/netalertx/netalertx:latest
```
> **Note:** Setting `net.ipv4.conf.all.arp_ignore` and `net.ipv4.conf.all.arp_announce` may fail with "operation not permitted" unless the container is run with elevated privileges. To resolve this, you can:
> - Use `--privileged` with `docker run`.
> - Use the more restrictive `--cap-add=NET_ADMIN` (or `cap_add: [NET_ADMIN]` in `docker-compose` service definitions) to allow the sysctls to be applied at runtime.
## Additional Resources
For broader Docker Compose guidance, see:
- [DOCKER_COMPOSE.md](https://docs.netalertx.com/DOCKER_COMPOSE)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

View File

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

View File

@@ -384,9 +384,25 @@ $(document).on('input', 'input:text', function() {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
function initializeTabs () { function initializeTabs () {
initializeTabsShared({
cacheKey: 'activeDevicesTab', key ="activeDevicesTab"
defaultTab: 'tabDetails'
// Activate panel
if(!emptyArr.includes(getCache(key)))
{
selectedTab = getCache(key);
}
$('.nav-tabs a[id='+ selectedTab +']').tab('show');
// When changed save new current tab
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
setCache(key, $(e.target).attr('id'))
});
// events on tab change
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
var target = $(e.target).attr("href") // activated tab
}); });
} }
@@ -403,12 +419,7 @@ async function renderSmallBoxes() {
const apiToken = getSetting("API_TOKEN"); const apiToken = getSetting("API_TOKEN");
const apiBaseUrl = getApiBase(); const apiBaseUrl = getApiBase();
// Ensure period is a string, not an element const url = `${apiBaseUrl}/device/${getMac()}?period=${encodeURIComponent(period)}`;
let periodValue = period;
if (typeof period === 'object' && period !== null && 'value' in period) {
periodValue = period.value;
}
const url = `${apiBaseUrl}/device/${getMac()}?period=${encodeURIComponent(periodValue)}`;
const response = await fetch(url, { const response = await fetch(url, {
method: "GET", method: "GET",
@@ -425,22 +436,17 @@ async function renderSmallBoxes() {
const deviceData = await response.json(); const deviceData = await response.json();
// Derive status card appearance from shared getStatusBadgeParts —
// ensures icon, color, label and lang key are always in sync with the rest of the UI.
const statusBadge = badgeFromDevice(deviceData);
const statusText = statusBadge.label;
// Prepare custom data // Prepare custom data
const customData = [ const customData = [
{ {
"onclickEvent": "$('#tabDetails').trigger('click')", "onclickEvent": "$('#tabDetails').trigger('click')",
"color": statusBadge.cssClass, "color": "bg-aqua",
"headerId": "deviceStatus", "headerId": "deviceStatus",
"headerStyle": "margin-left: 0em", "headerStyle": "margin-left: 0em",
"labelLang": "DevDetail_Shortcut_CurrentStatus", "labelLang": "DevDetail_Shortcut_CurrentStatus",
"iconId": "deviceStatusIcon", "iconId": "deviceStatusIcon",
"iconHtml": statusBadge.iconHtml, "iconClass": deviceData.devPresentLastScan == 1 ? "fa fa-check text-green" : "fa fa-xmark text-red",
"dataValue": statusText "dataValue": deviceData.devPresentLastScan == 1 ? getString("Gen_Online") : getString("Gen_Offline")
}, },
{ {
"onclickEvent": "$('#tabSessions').trigger('click');", "onclickEvent": "$('#tabSessions').trigger('click');",
@@ -547,24 +553,20 @@ function updateDevicePageName(mac) {
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------
// Call renderSmallBoxes, then main
(async () => {
await renderSmallBoxes();
main();
})();
window.onload = function async()
{
mac = getMac()
// initializeTabs();
updateChevrons(mac);
updateDevicePageName(mac);
window.onload = function() {
// Always trigger app-init bootstrap
if (typeof executeOnce === 'function') {
executeOnce();
}
mac = getMac();
// Wait for app initialization (cache populated) before using cached data
callAfterAppInitialized(async () => {
updateDevicePageName(mac);
updateChevrons(mac);
await renderSmallBoxes();
main();
});
} }
</script> </script>

View File

@@ -138,7 +138,7 @@ function getDeviceData() {
}, },
// Group for event and alert settings // Group for event and alert settings
DevDetail_EveandAl_Title: { DevDetail_EveandAl_Title: {
data: ["devAlertEvents", "devAlertDown", "devCanSleep", "devSkipRepeated", "devReqNicsOnline", "devChildrenNicsDynamic", "devForceStatus"], data: ["devAlertEvents", "devAlertDown", "devSkipRepeated", "devReqNicsOnline", "devChildrenNicsDynamic", "devForceStatus"],
docs: "https://docs.netalertx.com/NOTIFICATIONS", docs: "https://docs.netalertx.com/NOTIFICATIONS",
iconClass: "fa fa-bell", iconClass: "fa fa-bell",
inputGroupClasses: "field-group alert-group col-lg-4 col-sm-6 col-xs-12", inputGroupClasses: "field-group alert-group col-lg-4 col-sm-6 col-xs-12",
@@ -363,7 +363,7 @@ function getDeviceData() {
generateSimpleForm(relevantSettings); generateSimpleForm(relevantSettings);
toggleNetworkConfiguration(mac.toLowerCase() == 'internet') toggleNetworkConfiguration(mac == 'Internet')
initSelect2(); initSelect2();
initHoverNodeInfo(); initHoverNodeInfo();
@@ -447,7 +447,6 @@ function setDeviceData(direction = '', refreshCallback = '') {
devAlertEvents: ($('#NEWDEV_devAlertEvents')[0].checked * 1), devAlertEvents: ($('#NEWDEV_devAlertEvents')[0].checked * 1),
devAlertDown: ($('#NEWDEV_devAlertDown')[0].checked * 1), devAlertDown: ($('#NEWDEV_devAlertDown')[0].checked * 1),
devCanSleep: ($('#NEWDEV_devCanSleep')[0].checked * 1),
devSkipRepeated: $('#NEWDEV_devSkipRepeated').val().split(' ')[0], devSkipRepeated: $('#NEWDEV_devSkipRepeated').val().split(' ')[0],
devForceStatus: $('#NEWDEV_devForceStatus').val().replace(/'/g, ""), devForceStatus: $('#NEWDEV_devForceStatus').val().replace(/'/g, ""),

View File

@@ -5,7 +5,7 @@
?> ?>
<!-- INTERNET INFO --> <!-- INTERNET INFO -->
<?php if (strtolower($_REQUEST["mac"]) == "internet") { ?> <?php if ($_REQUEST["mac"] == "Internet") { ?>
<h4 class=""><i class="fa-solid fa-globe"></i> <h4 class=""><i class="fa-solid fa-globe"></i>
<?= lang("DevDetail_Tab_Tools_Internet_Info_Title") ?> <?= lang("DevDetail_Tab_Tools_Internet_Info_Title") ?>
@@ -24,7 +24,7 @@
<?php } ?> <?php } ?>
<!-- COPY FROM DEVICE --> <!-- COPY FROM DEVICE -->
<?php if (strtolower($_REQUEST["mac"]) != "internet") { ?> <?php if ($_REQUEST["mac"] != "Internet") { ?>
<h4 class=""><i class="fa-solid fa-copy"></i> <h4 class=""><i class="fa-solid fa-copy"></i>
<?= lang("DevDetail_Copy_Device_Title") ?> <?= lang("DevDetail_Copy_Device_Title") ?>
@@ -47,7 +47,7 @@
<?php } ?> <?php } ?>
<!-- WAKE ON LAN - WOL --> <!-- WAKE ON LAN - WOL -->
<?php if (strtolower($_REQUEST["mac"]) != "internet") { ?> <?php if ($_REQUEST["mac"] != "Internet") { ?>
<h4 class=""><i class="fa-solid fa-bell"></i> <h4 class=""><i class="fa-solid fa-bell"></i>
<?= lang("DevDetail_Tools_WOL_noti") ?> <?= lang("DevDetail_Tools_WOL_noti") ?>
@@ -108,7 +108,7 @@
<!-- SPEEDTEST --> <!-- SPEEDTEST -->
<?php if (strtolower($_REQUEST["mac"]) == "internet") { ?> <?php if ($_REQUEST["mac"] == "Internet") { ?>
<h4 class=""><i class="fa-solid fa-gauge-high"></i> <h4 class=""><i class="fa-solid fa-gauge-high"></i>
<?= lang("DevDetail_Tab_Tools_Speedtest_Title") ?> <?= lang("DevDetail_Tab_Tools_Speedtest_Title") ?>
</h4> </h4>
@@ -126,7 +126,7 @@
<?php } ?> <?php } ?>
<!-- TRACEROUTE --> <!-- TRACEROUTE -->
<?php if (strtolower($_REQUEST["mac"]) != "internet") { ?> <?php if ($_REQUEST["mac"] != "Internet") { ?>
<h4 class=""><i class="fa-solid fa-route"></i> <h4 class=""><i class="fa-solid fa-route"></i>
<?= lang("DevDetail_Tab_Tools_Traceroute_Title") ?> <?= lang("DevDetail_Tab_Tools_Traceroute_Title") ?>
</h4> </h4>
@@ -144,7 +144,7 @@
<?php } ?> <?php } ?>
<!-- NSLOOKUP --> <!-- NSLOOKUP -->
<?php if (strtolower($_REQUEST["mac"]) != "internet") { ?> <?php if ($_REQUEST["mac"] != "Internet") { ?>
<h4 class=""><i class="fa-solid fa-magnifying-glass"></i> <h4 class=""><i class="fa-solid fa-magnifying-glass"></i>
<?= lang("DevDetail_Tab_Tools_Nslookup_Title") ?> <?= lang("DevDetail_Tab_Tools_Nslookup_Title") ?>
</h4> </h4>
@@ -526,7 +526,13 @@
function getVisibleDevicesList() function getVisibleDevicesList()
{ {
// Read cache (skip cookie expiry check) // Read cache (skip cookie expiry check)
devicesList = parseDeviceCache(getCache('devicesListAll_JSON', true)); devicesList = getCache('devicesListAll_JSON', true);
if (devicesList != '') {
devicesList = JSON.parse (devicesList);
} else {
devicesList = [];
}
// only loop thru the filtered down list // only loop thru the filtered down list
visibleDevices = getCache("ntx_visible_macs") visibleDevices = getCache("ntx_visible_macs")

View File

@@ -53,12 +53,7 @@
<div class="col-md-12"> <div class="col-md-12">
<div class="box" id="clients"> <div class="box" id="clients">
<div class="box-header "> <div class="box-header ">
<h3 class="box-title"><?= lang('Device_Shortcut_OnlineChart');?> </h3> <h3 class="box-title col-md-12"><?= lang('Device_Shortcut_OnlineChart');?> </h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-minus"></i>
</button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<div class="chart"> <div class="chart">
@@ -77,15 +72,10 @@
<!-- Device Filters ------------------------------------------------------- --> <!-- Device Filters ------------------------------------------------------- -->
<div class="box box-aqua hidden" id="columnFiltersWrap"> <div class="box box-aqua hidden" id="columnFiltersWrap">
<div class="box-header "> <div class="box-header ">
<h3 class="box-title"><?= lang('Devices_Filters');?> </h3> <h3 class="box-title col-md-12"><?= lang('Devices_Filters');?> </h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-minus"></i>
</button>
</div>
</div> </div>
<!-- Placeholder ------------------------------------------------------- --> <!-- Placeholder ------------------------------------------------------- -->
<div class="box-body" id="columnFilters"></div> <div id="columnFilters" ></div>
</div> </div>
<!-- datatable ------------------------------------------------------------- --> <!-- datatable ------------------------------------------------------------- -->
@@ -97,8 +87,6 @@
<div class="box-header"> <div class="box-header">
<div class=" col-sm-8 "> <div class=" col-sm-8 ">
<h3 id="tableDevicesTitle" class="box-title text-gray "></h3> <h3 id="tableDevicesTitle" class="box-title text-gray "></h3>
<!-- Next scan ETA — populated by sse_manager.js via nax:scanEtaUpdate -->
<small id="nextScanEta" class="text-muted" style="display:none;margin-left:8px;font-weight:normal;font-size:0.75em;"></small>
</div> </div>
<div class="dummyDevice col-sm-4 "> <div class="dummyDevice col-sm-4 ">
<span id="multiEditPlc"> <span id="multiEditPlc">
@@ -155,23 +143,6 @@
headersDefaultOrder = []; headersDefaultOrder = [];
missingNumbers = []; missingNumbers = [];
// DEVICE_COLUMN_FIELDS, COL, NUMERIC_DEFAULTS, GRAPHQL_EXTRA_FIELDS, COLUMN_NAME_MAP
// are all defined in js/device-columns.js — edit that file to add new columns.
// Collapse DevicePresence and Filters sections by default on small/mobile screens
(function collapseOnMobile() {
if (window.innerWidth < 768) {
['#clients', '#columnFiltersWrap'].forEach(function(sel) {
var $box = $(sel);
if ($box.length) {
$box.addClass('collapsed-box');
$box.find('.box-body, .box-footer').hide();
$box.find('[data-widget="collapse"] i').removeClass('fa-minus').addClass('fa-plus');
}
});
}
})();
// Read parameters & Initialize components // Read parameters & Initialize components
callAfterAppInitialized(main) callAfterAppInitialized(main)
showSpinner(); showSpinner();
@@ -496,9 +467,12 @@ function renderFilters(customData) {
// Collect filters // Collect filters
const columnFilters = collectFilters(); const columnFilters = collectFilters();
// Apply column filters then draw once (previously drew twice — bug fixed). // Update DataTable with the new filters or search value (if applicable)
$('#tableDevices').DataTable().draw();
// Optionally, apply column filters (if using filters for individual columns)
const table = $('#tableDevices').DataTable(); const table = $('#tableDevices').DataTable();
table.columnFilters = columnFilters; table.columnFilters = columnFilters; // Apply your column filters logic
table.draw(); table.draw();
}); });
@@ -538,160 +512,49 @@ function collectFilters() {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Map column index to column name for GraphQL query // Map column index to column name for GraphQL query
function mapColumnIndexToFieldName(index, tableColumnVisible) { function mapColumnIndexToFieldName(index, tableColumnVisible) {
// Derives field name from the authoritative DEVICE_COLUMN_FIELDS constant. // the order is important, don't change it!
return DEVICE_COLUMN_FIELDS[tableColumnOrder[index]] || null; const columnNames = [
"devName", // 0
"devOwner", // 1
"devType", // 2
"devIcon", // 3
"devFavorite", // 4
"devGroup", // 5
"devFirstConnection", // 6
"devLastConnection", // 7
"devLastIP", // 8
"devIsRandomMac", // 9 resolved on the fly
"devStatus", // 10 resolved on the fly
"devMac", // 11
"devIpLong", // 12 formatIPlong(device.devLastIP) || "", // IP orderable
"rowid", // 13
"devParentMAC", // 14
"devParentChildrenCount", // 15 resolved on the fly
"devLocation", // 16
"devVendor", // 17
"devParentPort", // 18
"devGUID", // 19
"devSyncHubNode", // 20
"devSite", // 21
"devSSID", // 22
"devSourcePlugin", // 23
"devPresentLastScan", // 24
"devAlertDown", // 25
"devCustomProps", // 26
"devFQDN", // 27
"devParentRelType", // 28
"devReqNicsOnline", // 29
"devVlan", // 30
"devPrimaryIPv4", // 31
"devPrimaryIPv6", // 32
];
// console.log("OrderBy: " + columnNames[tableColumnOrder[index]]);
return columnNames[tableColumnOrder[index]] || null;
} }
// ---------------------------------------------------------
// Status badge helper for DataTables rowData (positional array).
// Uses mapIndx(COL.*) for reordered display fields and COL_EXTRA.* for extra fields.
function badgeFromRowData(rowData) {
return getStatusBadgeParts(
rowData[mapIndx(COL.devPresentLastScan)],
rowData[mapIndx(COL.devAlertDown)],
rowData[mapIndx(COL.devFlapping)],
rowData[mapIndx(COL.devMac)],
'',
rowData[COL_EXTRA.devIsSleeping] || 0,
rowData[COL_EXTRA.devIsArchived] || 0,
rowData[COL_EXTRA.devIsNew] || 0
);
}
// ---------------------------------------------------------
// Build the rich empty-table onboarding message (HTML).
// Used as the DataTables 'emptyTable' language option.
function buildEmptyDeviceTableMessage(nextScanLabel) {
var etaLine = nextScanLabel
? '<small class="text-muted" style="margin-top:6px;display:block;">' + nextScanLabel + '</small>'
: '';
return '<div class="text-center" style="padding:20px;">' +
'<i class="fa fa-search fa-2x text-muted" style="margin-bottom:10px;"></i><br>' +
'<strong>' + getString('Device_NoData_Title') + '</strong><br>' +
'<span class="text-muted">' + getString('Device_NoData_Scanning') + '</span><br>' +
etaLine +
'<small style="margin-top:6px;display:block;">' + getString('Device_NoData_Help') + '</small>' +
'</div>';
}
// ---------------------------------------------------------
// Compute a live countdown label from an ISO next_scan_time string.
// next_scan_time is the earliest scheduled run time across enabled device_scanner plugins,
// computed by the backend and broadcast via SSE — no guesswork needed on the frontend.
function computeNextScanLabel(nextScanTime) {
if (!nextScanTime) return getString('Device_NextScan_Imminent');
// Append Z if no UTC offset marker present — backend may emit naive UTC ISO strings.
var isoStr = /Z$|[+-]\d{2}:?\d{2}$/.test(nextScanTime.trim()) ? nextScanTime : nextScanTime + 'Z';
var secsLeft = Math.round((new Date(isoStr).getTime() - Date.now()) / 1000);
if (secsLeft <= 0) return getString('Device_NextScan_Imminent');
if (secsLeft >= 60) {
var m = Math.floor(secsLeft / 60);
var s = secsLeft % 60;
return getString('Device_NextScan_In') + m + 'm ' + s + 's';
}
return getString('Device_NextScan_In') + secsLeft + 's';
}
// Anchor for next scheduled scan time, ticker handle, plugins data, and current state — module-level.
var _nextScanTimeAnchor = null;
var _currentStateAnchor = null;
var _scanEtaTickerId = null;
var _pluginsData = null;
var _wasImminent = false; // true once the countdown displayed "imminent"; gates the Scanning... label
var _imminentForTime = null; // the _nextScanTimeAnchor value that last set _wasImminent
// prevents re-arming on the same (already-consumed) timestamp
// Returns true when the backend is actively scanning (not idle).
// Uses an exclusion approach — only "Process: Idle" and an empty/null state are non-scanning.
// This future-proofs against new states added to the scan pipeline (e.g. "Plugin: AVAHISCAN").
function isScanningState(state) {
return !!state && state !== 'Process: Idle';
}
// Fetch plugins.json once on page load so we can guard ETA display to device_scanner plugins only.
$.get('php/server/query_json.php', { file: 'plugins.json', nocache: Date.now() }, function(res) {
_pluginsData = res['data'] || [];
});
// Returns true only when at least one device_scanner plugin is loaded and not disabled.
function hasEnabledDeviceScanners() {
if (!_pluginsData || !_pluginsData.length) return false;
return getPluginsByType(_pluginsData, 'device_scanner', true).length > 0;
}
// ---------------------------------------------------------
// Update the title-bar ETA subtitle and the DataTables empty-state message.
// Called on every nax:scanEtaUpdate; the inner ticker keeps the title bar live between events.
function updateScanEtaDisplay(nextScanTime, currentState) {
// Detect scan-finished transition BEFORE updating _currentStateAnchor.
// justFinishedScanning is true only when the backend transitions scanning → idle.
var justFinishedScanning = (currentState === 'Process: Idle') && isScanningState(_currentStateAnchor);
// Prefer the backend-computed values; keep previous anchors if not yet received.
_nextScanTimeAnchor = nextScanTime || _nextScanTimeAnchor;
_currentStateAnchor = currentState || _currentStateAnchor;
// Reset the imminent gate when the scan finishes back to idle so the next cycle starts clean.
if (currentState === 'Process: Idle') { _wasImminent = false; }
// Restart the per-second title-bar ticker
if (_scanEtaTickerId !== null) { clearInterval(_scanEtaTickerId); }
function getEtaLabel() {
if (!hasEnabledDeviceScanners()) return '';
if (isScanningState(_currentStateAnchor) && _wasImminent) return getString('Device_Scanning');
var label = computeNextScanLabel(_nextScanTimeAnchor);
// Arm _wasImminent only for a NEW next_scan_time anchor — not the already-consumed one.
// This prevents the ticker from re-arming immediately after "Process: Idle" resets the flag
// while _nextScanTimeAnchor still holds the now-past timestamp.
if (label === getString('Device_NextScan_Imminent') && _nextScanTimeAnchor !== _imminentForTime) {
_wasImminent = true;
_imminentForTime = _nextScanTimeAnchor;
}
return label;
}
function tickTitleBar() {
var eta = document.getElementById('nextScanEta');
if (!eta) return;
var label = getEtaLabel();
if (!label) { eta.style.display = 'none'; return; }
eta.textContent = label;
eta.style.display = '';
}
// Update DataTables empty message once per SSE event.
// NOTE: Do NOT call dt.draw() here — on page load the SSE queue replays all
// accumulated events at once, causing a draw() (= GraphQL AJAX call) per event.
// Instead, update the visible empty-state DOM cell directly.
var label = getEtaLabel();
if ($.fn.DataTable.isDataTable('#tableDevices')) {
var dt = $('#tableDevices').DataTable();
var newEmptyMsg = buildEmptyDeviceTableMessage(label);
dt.settings()[0].oLanguage.sEmptyTable = newEmptyMsg;
if (dt.page.info().recordsTotal === 0) {
// Patch the visible cell text without triggering a server-side AJAX reload.
$('#tableDevices tbody .dataTables_empty').html(newEmptyMsg);
}
// When scanning just finished and the table is still empty, reload data so
// newly discovered devices appear automatically. Skip reload if there are
// already rows — no need to disturb the user's current view.
if (justFinishedScanning && dt.page.info().recordsTotal === 0) {
dt.ajax.reload(null, false); // false = keep current page position
}
}
tickTitleBar();
_scanEtaTickerId = setInterval(tickTitleBar, 1000);
}
// Listen for scan ETA updates dispatched by sse_manager.js (SSE push or poll fallback)
document.addEventListener('nax:scanEtaUpdate', function(e) {
updateScanEtaDisplay(e.detail.nextScanTime, e.detail.currentState);
});
// --------------------------------------------------------- // ---------------------------------------------------------
// Initializes the main devices list datatable // Initializes the main devices list datatable
function initializeDatatable (status) { function initializeDatatable (status) {
@@ -756,15 +619,53 @@ function initializeDatatable (status) {
"type": "POST", "type": "POST",
"contentType": "application/json", "contentType": "application/json",
"data": function (d) { "data": function (d) {
// GraphQL fields are derived from DEVICE_COLUMN_FIELDS + GRAPHQL_EXTRA_FIELDS // Construct GraphQL query with pagination and sorting options
// (both defined in js/device-columns.js). No manual field list to maintain.
const _gqlFields = [...new Set([...DEVICE_COLUMN_FIELDS, ...GRAPHQL_EXTRA_FIELDS])]
.join('\n ');
let graphqlQuery = ` let graphqlQuery = `
query devices($options: PageQueryOptionsInput) { query devices($options: PageQueryOptionsInput) {
devices(options: $options) { devices(options: $options) {
devices { devices {
${_gqlFields} rowid
devMac
devName
devOwner
devType
devVendor
devFavorite
devGroup
devComments
devFirstConnection
devLastConnection
devLastIP
devStaticIP
devScan
devLogEvents
devAlertEvents
devAlertDown
devSkipRepeated
devLastNotification
devPresentLastScan
devIsNew
devIsRandomMac
devLocation
devIsArchived
devParentMAC
devParentPort
devIcon
devGUID
devSite
devSSID
devSyncHubNode
devSourcePlugin
devStatus
devParentChildrenCount
devIpLong
devCustomProps
devFQDN
devParentRelType
devReqNicsOnline
devVlan
devPrimaryIPv4
devPrimaryIPv6
} }
count count
} }
@@ -816,24 +717,49 @@ function initializeDatatable (status) {
// Return only the array of rows for the table // Return only the array of rows for the table
return json.devices.devices.map(device => { return json.devices.devices.map(device => {
// Build positional row directly from DEVICE_COLUMN_FIELDS. // Convert each device record into the required DataTable row format
// NUMERIC_DEFAULTS controls which fields default to 0 vs "". // Order has to be the same as in the UI_device_columns setting options
// Adding a new column: add to DEVICE_COLUMN_FIELDS (and NUMERIC_DEFAULTS const originalRow = [
// if needed) in js/device-columns.js — nothing to change here. device.devName || "",
const originalRow = DEVICE_COLUMN_FIELDS.map( device.devOwner || "",
field => device[field] ?? (NUMERIC_DEFAULTS.has(field) ? 0 : "") device.devType || "",
); device.devIcon || "",
device.devFavorite || "",
device.devGroup || "",
device.devFirstConnection || "",
device.devLastConnection || "",
device.devLastIP || "",
device.devIsRandomMac || "",
device.devStatus || "",
device.devMac || "",
device.devIpLong || "",
device.rowid || "",
device.devParentMAC || "",
device.devParentChildrenCount || 0,
device.devLocation || "",
device.devVendor || "",
device.devParentPort || "",
device.devGUID || "",
device.devSyncHubNode || "",
device.devSite || "",
device.devSSID || "",
device.devSourcePlugin || "",
device.devPresentLastScan || "",
device.devAlertDown || "",
device.devCustomProps || "",
device.devFQDN || "",
device.devParentRelType || "",
device.devReqNicsOnline || 0,
device.devVlan || "",
device.devPrimaryIPv4 || "",
device.devPrimaryIPv6 || "",
];
const newRow = []; const newRow = [];
// Reorder data based on user-defined columns order // Reorder data based on user-defined columns order
for (let index = 0; index < tableColumnOrder.length; index++) { for (let index = 0; index < tableColumnOrder.length; index++) {
newRow.push(originalRow[tableColumnOrder[index]]); newRow.push(originalRow[tableColumnOrder[index]]);
} }
// Append extra (non-display) fields after the display columns so
// they are accessible in createdCell via COL_EXTRA.*
GRAPHQL_EXTRA_FIELDS.forEach(field => {
newRow.push(device[field] ?? (NUMERIC_DEFAULTS.has(field) ? 0 : ""));
});
return newRow; return newRow;
}); });
} }
@@ -861,15 +787,15 @@ function initializeDatatable (status) {
'columnDefs' : [ 'columnDefs' : [
{visible: false, targets: tableColumnHide }, {visible: false, targets: tableColumnHide },
{className: 'text-center', targets: [mapIndx(COL.devFavorite), mapIndx(COL.devIsRandomMac), mapIndx(COL.devStatus), mapIndx(COL.devParentChildrenCount), mapIndx(COL.devParentPort)] }, {className: 'text-center', targets: [mapIndx(4), mapIndx(9), mapIndx(10), mapIndx(15), mapIndx(18)] },
{className: 'iconColumn text-center', targets: [mapIndx(COL.devIcon)]}, {className: 'iconColumn text-center', targets: [mapIndx(3)]},
{width: '80px', targets: [mapIndx(COL.devFirstConnection), mapIndx(COL.devLastConnection), mapIndx(COL.devParentChildrenCount), mapIndx(COL.devFQDN)] }, {width: '80px', targets: [mapIndx(6), mapIndx(7), mapIndx(15), mapIndx(27)] },
{width: '85px', targets: [mapIndx(COL.devIsRandomMac)] }, {width: '85px', targets: [mapIndx(9)] },
{width: '30px', targets: [mapIndx(COL.devIcon), mapIndx(COL.devStatus), mapIndx(COL.rowid), mapIndx(COL.devParentPort)] }, {width: '30px', targets: [mapIndx(3), mapIndx(10), mapIndx(13), mapIndx(18)] },
{orderData: [mapIndx(COL.devIpLong)], targets: mapIndx(COL.devLastIP) }, {orderData: [mapIndx(12)], targets: mapIndx(8) },
// Device Name and FQDN // Device Name and FQDN
{targets: [mapIndx(COL.devName), mapIndx(COL.devFQDN)], {targets: [mapIndx(0), mapIndx(27)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
// console.log(cellData) // console.log(cellData)
@@ -883,23 +809,19 @@ function initializeDatatable (status) {
$(td).html ( $(td).html (
`<b class="anonymizeDev " `<b class="anonymizeDev "
> >
<a href="deviceDetails.php?mac=${rowData[mapIndx(COL.devMac)]}" class="hover-node-info" <a href="deviceDetails.php?mac=${rowData[mapIndx(11)]}" class="hover-node-info"
data-name="${displayedValue}" data-name="${displayedValue}"
data-ip="${rowData[mapIndx(COL.devLastIP)]}" data-ip="${rowData[mapIndx(8)]}"
data-mac="${rowData[mapIndx(COL.devMac)]}" data-mac="${rowData[mapIndx(11)]}"
data-vendor="${rowData[mapIndx(COL.devVendor)]}" data-vendor="${rowData[mapIndx(17)]}"
data-type="${rowData[mapIndx(COL.devType)]}" data-type="${rowData[mapIndx(2)]}"
data-firstseen="${rowData[mapIndx(COL.devFirstConnection)]}" data-firstseen="${rowData[mapIndx(6)]}"
data-lastseen="${rowData[mapIndx(COL.devLastConnection)]}" data-lastseen="${rowData[mapIndx(7)]}"
data-relationship="${rowData[mapIndx(COL.devParentRelType)]}" data-relationship="${rowData[mapIndx(28)]}"
data-status="${rowData[mapIndx(COL.devStatus)]}" data-status="${rowData[mapIndx(10)]}"
data-present="${rowData[mapIndx(COL.devPresentLastScan)]}" data-present="${rowData[mapIndx(24)]}"
data-alertdown="${rowData[mapIndx(COL.devAlertDown)]}" data-alert="${rowData[mapIndx(25)]}"
data-flapping="${rowData[mapIndx(COL.devFlapping)]}" data-icon="${rowData[mapIndx(3)]}">
data-sleeping="${rowData[COL_EXTRA.devIsSleeping] || 0}"
data-archived="${rowData[COL_EXTRA.devIsArchived] || 0}"
data-isnew="${rowData[COL_EXTRA.devIsNew] || 0}"
data-icon="${rowData[mapIndx(COL.devIcon)]}">
${displayedValue} ${displayedValue}
</a> </a>
</b>` </b>`
@@ -907,12 +829,12 @@ function initializeDatatable (status) {
} }, } },
// Connected Devices // Connected Devices
{targets: [mapIndx(COL.devParentChildrenCount)], {targets: [mapIndx(15)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
// check if this is a network device // check if this is a network device
if(getSetting("NETWORK_DEVICE_TYPES").includes(`'${rowData[mapIndx(COL.devType)]}'`) ) if(getSetting("NETWORK_DEVICE_TYPES").includes(`'${rowData[mapIndx(2)]}'`) )
{ {
$(td).html ('<b><a href="./network.php?mac='+ rowData[mapIndx(COL.devMac)] +'" class="">'+ cellData +'</a></b>'); $(td).html ('<b><a href="./network.php?mac='+ rowData[mapIndx(11)] +'" class="">'+ cellData +'</a></b>');
} }
else else
{ {
@@ -922,7 +844,7 @@ function initializeDatatable (status) {
} }, } },
// Icon // Icon
{targets: [mapIndx(COL.devIcon)], {targets: [mapIndx(3)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
if (!emptyArr.includes(cellData)){ if (!emptyArr.includes(cellData)){
@@ -933,7 +855,7 @@ function initializeDatatable (status) {
} }, } },
// Full MAC // Full MAC
{targets: [mapIndx(COL.devMac)], {targets: [mapIndx(11)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
if (!emptyArr.includes(cellData)){ if (!emptyArr.includes(cellData)){
$(td).html ('<span class="anonymizeMac">'+cellData+'</span>'); $(td).html ('<span class="anonymizeMac">'+cellData+'</span>');
@@ -943,7 +865,7 @@ function initializeDatatable (status) {
} }, } },
// IP address // IP address
{targets: [mapIndx(COL.devLastIP)], {targets: [mapIndx(8)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
if (!emptyArr.includes(cellData)){ if (!emptyArr.includes(cellData)){
$(td).html (`<span class="anonymizeIp"> $(td).html (`<span class="anonymizeIp">
@@ -961,8 +883,8 @@ function initializeDatatable (status) {
} }
} }
}, },
// IP address (orderable) // IP address (ordeable)
{targets: [mapIndx(COL.devIpLong)], {targets: [mapIndx(12)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
if (!emptyArr.includes(cellData)){ if (!emptyArr.includes(cellData)){
$(td).html (`<span class="anonymizeIp">${cellData}<span>`); $(td).html (`<span class="anonymizeIp">${cellData}<span>`);
@@ -973,10 +895,10 @@ function initializeDatatable (status) {
}, },
// Custom Properties // Custom Properties
{targets: [mapIndx(COL.devCustomProps)], {targets: [mapIndx(26)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
if (!emptyArr.includes(cellData)){ if (!emptyArr.includes(cellData)){
$(td).html (`<span>${renderCustomProps(cellData, rowData[mapIndx(COL.devMac)])}</span>`); $(td).html (`<span>${renderCustomProps(cellData, rowData[mapIndx(11)])}</span>`);
} else { } else {
$(td).html (''); $(td).html ('');
} }
@@ -984,7 +906,7 @@ function initializeDatatable (status) {
}, },
// Favorite // Favorite
{targets: [mapIndx(COL.devFavorite)], {targets: [mapIndx(4)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
if (cellData == 1){ if (cellData == 1){
$(td).html ('<i class="fa fa-star text-yellow" style="font-size:16px"></i>'); $(td).html ('<i class="fa fa-star text-yellow" style="font-size:16px"></i>');
@@ -994,7 +916,7 @@ function initializeDatatable (status) {
} }, } },
// Dates // Dates
{targets: [mapIndx(COL.devFirstConnection), mapIndx(COL.devLastConnection)], {targets: [mapIndx(6), mapIndx(7)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
var result = cellData.toString(); // Convert to string var result = cellData.toString(); // Convert to string
if (result.includes("+")) { // Check if timezone offset is present if (result.includes("+")) { // Check if timezone offset is present
@@ -1004,7 +926,7 @@ function initializeDatatable (status) {
} }, } },
// Random MAC // Random MAC
{targets: [mapIndx(COL.devIsRandomMac)], {targets: [mapIndx(9)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
// console.log(cellData) // console.log(cellData)
if (cellData == 1){ if (cellData == 1){
@@ -1015,7 +937,7 @@ function initializeDatatable (status) {
} }, } },
// Parent Mac // Parent Mac
{targets: [mapIndx(COL.devParentMAC)], {targets: [mapIndx(14)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
if (!isValidMac(cellData)) { if (!isValidMac(cellData)) {
$(td).html(''); $(td).html('');
@@ -1037,19 +959,27 @@ function initializeDatatable (status) {
} }
}, },
// Status color // Status color
{targets: [mapIndx(COL.devStatus)], {targets: [mapIndx(10)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
const badge = badgeFromRowData(rowData); tmp_devPresentLastScan = rowData[mapIndx(24)]
tmp_devAlertDown = rowData[mapIndx(25)]
$(td).html(`<a href="${badge.url}" class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.label}</a>`); const badge = getStatusBadgeParts(
rowData[mapIndx(24)], // tmp_devPresentLastScan
rowData[mapIndx(25)], // tmp_devAlertDown
rowData[mapIndx(11)], // MAC
cellData // optional text
);
$(td).html (`<a href="${badge.url}" class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.text}</a>`);
} }, } },
], ],
// Processing // Processing
'processing' : true, 'processing' : true,
'language' : { 'language' : {
emptyTable: buildEmptyDeviceTableMessage(getString('Device_NextScan_Imminent')), emptyTable: 'No data',
"lengthMenu": "<?= lang('Device_Tablelenght');?>", "lengthMenu": "<?= lang('Device_Tablelenght');?>",
"search": "<?= lang('Device_Searchbox');?>: ", "search": "<?= lang('Device_Searchbox');?>: ",
"paginate": { "paginate": {
@@ -1107,7 +1037,7 @@ function initializeDatatable (status) {
}, },
createdRow: function(row, data, dataIndex) { createdRow: function(row, data, dataIndex) {
// add devMac to the table row // add devMac to the table row
$(row).attr('my-devMac', data[mapIndx(COL.devMac)]); $(row).attr('my-devMac', data[mapIndx(11)]);
} }
@@ -1153,7 +1083,7 @@ function multiEditDevices()
macs = "" macs = ""
for (var j = 0; j < selectedDevicesDataTableData.length; j++) { for (var j = 0; j < selectedDevicesDataTableData.length; j++) {
macs += selectedDevicesDataTableData[j][mapIndx(COL.devMac)] + ","; // MAC macs += selectedDevicesDataTableData[j][mapIndx(11)] + ","; // [11] == MAC
} }
// redirect to the Maintenance section // redirect to the Maintenance section
@@ -1174,7 +1104,7 @@ function getMacsOfShownDevices() {
allIndexes.each(function(idx) { allIndexes.each(function(idx) {
var rowData = table.row(idx).data(); var rowData = table.row(idx).data();
if (rowData) { if (rowData) {
macs.push(rowData[mapIndx(COL.devMac)]); // MAC column macs.push(rowData[mapIndx(11)]); // mapIndx(11) == MAC column
} }
}); });

View File

@@ -7,12 +7,6 @@ require_once $_SERVER['DOCUMENT_ROOT'].'/php/server/db.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/php/templates/language/lang.php'; require_once $_SERVER['DOCUMENT_ROOT'].'/php/templates/language/lang.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/php/templates/security.php'; require_once $_SERVER['DOCUMENT_ROOT'].'/php/templates/security.php';
// if (session_status() === PHP_SESSION_NONE) {
// session_start();
// }
// session_start();
const DEFAULT_REDIRECT = '/devices.php'; const DEFAULT_REDIRECT = '/devices.php';
/* ===================================================== /* =====================================================

View File

@@ -1,281 +0,0 @@
/* -----------------------------------------------------------------------------
* NetAlertX
* Open Source Network Guard / WIFI & LAN intrusion detector
*
* app-init.js - Front module. Application lifecycle: initialization,
* cache orchestration, and startup sequencing.
* Loaded AFTER common.js — depends on showSpinner(), isEmpty(),
* mergeUniqueArrays(), getSetting(), getString(), getCache(),
* setCache(), and all cache* functions from cache.js.
*-------------------------------------------------------------------------------
# jokob@duck.com GNU GPLv3
----------------------------------------------------------------------------- */
// -----------------------------------------------------------------------------
// initialize
// -----------------------------------------------------------------------------
var completedCalls = []
var completedCalls_final = ['cacheApiConfig', 'cacheSettings', 'cacheStrings', 'cacheDevices'];
var lang_completedCalls = 0;
// -----------------------------------------------------------------------------
// Clearing all the caches
function clearCache() {
showSpinner();
sessionStorage.clear();
localStorage.clear();
// Wait for spinner to show and cache to clear, then reload
setTimeout(() => {
console.warn("clearCache called");
window.location.reload();
}, 100);
}
// ===================================================================
// DEPRECATED: checkSettingChanges() - Replaced by SSE-based manager
// Settings changes are now handled via SSE events
// Kept for backward compatibility, will be removed in future version
// ===================================================================
function checkSettingChanges() {
// SSE manager handles settings_changed events now
if (typeof netAlertXStateManager !== 'undefined' && netAlertXStateManager.initialized) {
return; // SSE handles this now
}
// Fallback for backward compatibility
$.get('php/server/query_json.php', { file: 'app_state.json', nocache: Date.now() }, function(appState) {
const importedMilliseconds = parseInt(appState["settingsImported"] * 1000);
const lastReloaded = parseInt(getCache(CACHE_KEYS.INIT_TIMESTAMP));
if (importedMilliseconds > lastReloaded) {
console.log("Cache needs to be refreshed because of setting changes");
setTimeout(() => {
clearCache();
}, 500);
}
});
}
// ===================================================================
// Display spinner and reload page if not yet initialized
async function handleFirstLoad(callback) {
if (!isAppInitialized()) {
await new Promise(resolve => setTimeout(resolve, 1000));
callback();
}
}
// ===================================================================
// Execute callback once the app is initialized and GraphQL server is running
async function callAfterAppInitialized(callback) {
if (!isAppInitialized() || !(await isGraphQLServerRunning())) {
setTimeout(() => {
callAfterAppInitialized(callback);
}, 500);
} else {
callback();
}
}
// ===================================================================
// Polling function to repeatedly check if the server is running
async function waitForGraphQLServer() {
const pollInterval = 2000; // 2 seconds between each check
let serverRunning = false;
while (!serverRunning) {
serverRunning = await isGraphQLServerRunning();
if (!serverRunning) {
console.log("GraphQL server not running, retrying in 2 seconds...");
await new Promise(resolve => setTimeout(resolve, pollInterval));
}
}
console.log("GraphQL server is now running.");
}
// -----------------------------------------------------------------------------
// Returns 1 if running, 0 otherwise
async function isGraphQLServerRunning() {
try {
const response = await $.get('php/server/query_json.php', { file: 'app_state.json', nocache: Date.now()});
console.log("graphQLServerStarted: " + response["graphQLServerStarted"]);
setCache(CACHE_KEYS.GRAPHQL_STARTED, response["graphQLServerStarted"]);
return response["graphQLServerStarted"];
} catch (error) {
console.error("Failed to check GraphQL server status:", error);
return false;
}
}
// Throttle isAppInitialized logging so the console isn't spammed on every poll.
let _isAppInit_lastLogTime = 0;
function _isAppInitLog(msg) {
const now = Date.now();
if (now - _isAppInit_lastLogTime > 5000) { // log at most once per 5s
console.log(msg);
_isAppInit_lastLogTime = now;
}
}
// -----------------------------------------------------------------------------
// Check if the code has been executed before by checking localStorage
function isAppInitialized() {
lang_shouldBeCompletedCalls = getLangCode() == 'en_us' ? 1 : 2;
// check if each ajax call completed succesfully
for (const call_name of completedCalls_final) {
if (getCache(CACHE_KEYS.initFlag(call_name)) != "true") {
_isAppInitLog(`[isAppInitialized] waiting on ${call_name} (value: ${getCache(CACHE_KEYS.initFlag(call_name))})`);
return false;
}
}
// check if all required languages chached
if(parseInt(getCache(CACHE_KEYS.STRINGS_COUNT)) != lang_shouldBeCompletedCalls)
{
_isAppInitLog(`[isAppInitialized] waiting on cacheStrings: ${getCache(CACHE_KEYS.STRINGS_COUNT)} of ${lang_shouldBeCompletedCalls}`);
return false;
}
return true;
}
// Retry a single async init step up to maxAttempts times with a delay.
async function retryStep(name, fn, maxAttempts = 3, delayMs = 1500) {
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
await fn();
return; // success
} catch (err) {
console.warn(`[executeOnce] ${name} failed (attempt ${attempt}/${maxAttempts}):`, err);
if (attempt < maxAttempts) {
await new Promise(r => setTimeout(r, delayMs));
} else {
console.error(`[executeOnce] ${name} permanently failed after ${maxAttempts} attempts.`);
}
}
}
}
// -----------------------------------------------------------------------------
// Main execution logic
let _executeOnceRunning = false;
async function executeOnce() {
if (_executeOnceRunning) {
console.log('[executeOnce] Already running — skipping duplicate call.');
return;
}
_executeOnceRunning = true;
showSpinner();
// Auto-bust stale cache if code version has changed since last init.
// Clears localStorage in-place so the subsequent init runs fresh without
// requiring a page reload.
if (getCache(CACHE_KEYS.CACHE_VERSION) !== NAX_CACHE_VERSION) {
console.log(`[executeOnce] Cache version mismatch (stored: "${getCache(CACHE_KEYS.CACHE_VERSION)}", expected: "${NAX_CACHE_VERSION}"). Clearing cache.`);
localStorage.clear();
sessionStorage.clear();
}
if (!isAppInitialized()) {
try {
await waitForGraphQLServer(); // Wait for the server to start
await retryStep('cacheApiConfig', cacheApiConfig); // Bootstrap: API_TOKEN + GRAPHQL_PORT from app.conf
await retryStep('cacheDevices', cacheDevices);
await retryStep('cacheSettings', cacheSettings);
await retryStep('cacheStrings', cacheStrings);
console.log("All AJAX callbacks have completed");
onAllCallsComplete();
} finally {
_executeOnceRunning = false;
}
} else {
_executeOnceRunning = false;
}
}
// -----------------------------------------------------------------------------
// Function to handle successful completion of an AJAX call
const handleSuccess = (callName) => {
console.log(`AJAX call successful: ${callName}`);
if(callName.includes("cacheStrings"))
{
completed_tmp = getCache(CACHE_KEYS.STRINGS_COUNT);
completed_tmp == "" ? completed_tmp = 0 : completed_tmp = completed_tmp;
completed_tmp++;
setCache(CACHE_KEYS.STRINGS_COUNT, completed_tmp);
}
setCache(CACHE_KEYS.initFlag(callName), true)
};
// -----------------------------------------------------------------------------
// Function to handle failure of an AJAX call
const handleFailure = (callName, callback) => {
msg = `AJAX call ${callName} failed`
console.error(msg);
if (typeof callback === 'function') {
callback(new Error(msg));
}
};
// -----------------------------------------------------------------------------
// Function to execute when all AJAX calls have completed
const onAllCallsComplete = () => {
completedCalls = mergeUniqueArrays(getCache(CACHE_KEYS.COMPLETED_CALLS).split(','), completedCalls);
setCache(CACHE_KEYS.COMPLETED_CALLS, completedCalls);
// Check if all necessary strings are initialized
if (areAllStringsInitialized()) {
const millisecondsNow = Date.now();
setCache(CACHE_KEYS.INIT_TIMESTAMP, millisecondsNow);
setCache(CACHE_KEYS.CACHE_VERSION, NAX_CACHE_VERSION);
console.log('✔ Cache initialized');
} else {
// If not all strings are initialized, retry initialization
console.log('❌ Not all strings are initialized. Retrying...');
executeOnce();
return;
}
// Call any other initialization functions here if needed
};
// Function to check if all necessary strings are initialized
const areAllStringsInitialized = () => {
// Implement logic to check if all necessary strings are initialized
// Return true if all strings are initialized, false otherwise
return getString('UI_LANG_name') != ""
};
// Call the function to execute the code
executeOnce();
// Set timer for regular UI refresh if enabled
setTimeout(() => {
// page refresh if configured
const refreshTime = getSetting("UI_REFRESH");
if (refreshTime && refreshTime !== "0" && refreshTime !== "") {
console.log("Refreshing page becasue UI_REFRESH setting enabled.");
newTimerRefreshData(clearCache, parseInt(refreshTime)*1000);
}
// Check if page needs to refresh due to setting changes
checkSettingChanges()
}, 10000);
console.log("init app-init.js");

View File

@@ -1,502 +0,0 @@
/* -----------------------------------------------------------------------------
* NetAlertX
* Open Source Network Guard / WIFI & LAN intrusion detector
*
* cache.js - Front module. Cache primitives, settings, strings, and device
* data caching. Loaded FIRST — no dependencies on other NAX files.
* All cross-file calls (handleSuccess, showSpinner, etc.) are
* call-time dependencies resolved after page load.
*-------------------------------------------------------------------------------
# jokob@duck.com GNU GPLv3
----------------------------------------------------------------------------- */
// Cache version stamp — injected by header.php from the app's .VERSION file.
// Changes automatically on every release, busting stale localStorage caches.
// Falls back to a build-time constant so local dev without PHP still works.
const NAX_CACHE_VERSION = (typeof window.NAX_APP_VERSION !== 'undefined')
? window.NAX_APP_VERSION
: 'dev';
// -----------------------------------------------------------------------------
// Central registry of all localStorage cache keys.
// Use these constants (and the helper functions for dynamic keys) everywhere
// instead of bare string literals to prevent silent typo bugs.
// -----------------------------------------------------------------------------
const CACHE_KEYS = {
// --- Init flags (dynamic) ---
// Stores "true" when an AJAX init call completes. Use initFlag(name) below.
initFlag: (name) => `${name}_completed`,
// --- Settings ---
// Stores the value of a setting by its setKey. nax_set_<setKey>
setting: (key) => `nax_set_${key}`,
// Stores the resolved options array for a setting. nax_set_opt_<setKey>
settingOpts: (key) => `nax_set_opt_${key}`,
// --- Language strings ---
// Stores a translated string. pia_lang_<key>_<langCode>
langString: (key, langCode) => `pia_lang_${key}_${langCode}`,
LANG_FALLBACK: 'en_us', // fallback language code
// --- Devices ---
DEVICES_ALL: 'devicesListAll_JSON', // full device list from table_devices.json
DEVICES_TOPOLOGY: 'devicesListNew', // filtered/sorted list for network topology
// --- UI state ---
VISIBLE_MACS: 'ntx_visible_macs', // comma-separated MACs visible in current view
SHOW_ARCHIVED: 'showArchived', // topology show-archived toggle (network page)
SHOW_OFFLINE: 'showOffline', // topology show-offline toggle (network page)
// --- Internal init tracking ---
GRAPHQL_STARTED: 'graphQLServerStarted', // set when GraphQL server responds
STRINGS_COUNT: 'cacheStringsCountCompleted', // count of language packs loaded
COMPLETED_CALLS: 'completedCalls', // comma-joined list of completed init calls
INIT_TIMESTAMP: 'nax_init_timestamp', // ms timestamp of last successful cache init
CACHE_VERSION: 'nax_cache_version', // version stamp for auto-bust on deploy
};
// -----------------------------------------------------------------------------
// localStorage cache helpers
// -----------------------------------------------------------------------------
function getCache(key)
{
// check cache
cachedValue = localStorage.getItem(key)
if(cachedValue)
{
return cachedValue;
}
return "";
}
// -----------------------------------------------------------------------------
function setCache(key, data)
{
localStorage.setItem(key, data);
}
// -----------------------------------------------------------------------------
// Fetch data from a server-generated JSON file via query_json.php.
// Returns a Promise resolving with the "data" array from the response.
// -----------------------------------------------------------------------------
function fetchJson(file) {
return new Promise((resolve, reject) => {
$.get('php/server/query_json.php', { file: file, nocache: Date.now() })
.done((res) => resolve(res['data'] || []))
.fail((err) => reject(err));
});
}
// -----------------------------------------------------------------------------
// Safely parse and normalize device cache data.
// Handles both direct array format and { data: [...] } format.
// Returns an array, or empty array on failure.
function parseDeviceCache(cachedStr) {
if (!cachedStr || cachedStr === "") {
return [];
}
let parsed;
try {
parsed = JSON.parse(cachedStr);
} catch (err) {
console.error('[parseDeviceCache] Failed to parse:', err);
return [];
}
// If result is an object with a .data property, extract it (handles legacy format)
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed) && Array.isArray(parsed.data)) {
console.debug('[parseDeviceCache] Extracting .data property from wrapper object');
parsed = parsed.data;
}
// Ensure result is an array
if (!Array.isArray(parsed)) {
console.error('[parseDeviceCache] Result is not an array:', parsed);
return [];
}
return parsed;
}
// -----------------------------------------------------------------------------
// Returns the API token, base URL, and a ready-to-use Authorization header
// object for all backend API calls. Centralises the repeated
// getSetting("API_TOKEN") + getApiBase() pattern.
// -----------------------------------------------------------------------------
function getAuthContext() {
const token = getSetting('API_TOKEN');
const apiBase = getApiBase();
return {
token,
apiBase,
authHeader: { 'Authorization': 'Bearer ' + token },
};
}
// -----------------------------------------------------------------------------
// Get settings from the .json file generated by the python backend
// and cache them, if available, with options
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// Bootstrap: fetch API_TOKEN and GRAPHQL_PORT directly from app.conf via the
// PHP helper endpoint. Runs before cacheSettings so that API calls made during
// or after init always have a token available — even if table_settings.json
// hasn't been generated yet. Writes values into the setting() namespace so
// getSetting("API_TOKEN") and getSetting("GRAPHQL_PORT") work immediately.
// -----------------------------------------------------------------------------
function cacheApiConfig() {
return new Promise((resolve, reject) => {
if (getCache(CACHE_KEYS.initFlag('cacheApiConfig')) === 'true') {
resolve();
return;
}
$.get('php/server/app_config.php', { nocache: Date.now() })
.done((res) => {
if (res && res.api_token) {
setCache(CACHE_KEYS.setting('API_TOKEN'), res.api_token);
setCache(CACHE_KEYS.setting('GRAPHQL_PORT'), String(res.graphql_port || 20212));
handleSuccess('cacheApiConfig');
resolve();
} else {
console.warn('[cacheApiConfig] Response missing api_token — will rely on cacheSettings fallback');
resolve(); // non-fatal: cacheSettings will still populate these
}
})
.fail((err) => {
console.warn('[cacheApiConfig] Failed to reach app_config.php:', err);
resolve(); // non-fatal fallback
});
});
}
function cacheSettings()
{
return new Promise((resolve, reject) => {
if(getCache(CACHE_KEYS.initFlag('cacheSettings')) === "true")
{
resolve();
return;
}
// plugins.json may not exist on first boot — treat its absence as non-fatal
Promise.all([fetchJson('table_settings.json'), fetchJson('plugins.json').catch(() => [])])
.then(([settingsArr, pluginsArr]) => {
pluginsData = pluginsArr;
settingsData = settingsArr;
// Defensive: Accept either array or object with .data property
// for both settings and plugins
if (!Array.isArray(settingsData)) {
if (settingsData && Array.isArray(settingsData.data)) {
settingsData = settingsData.data;
} else {
console.error('[cacheSettings] settingsData is not an array:', settingsData);
reject(new Error('settingsData is not an array'));
return;
}
}
// Normalize plugins array too (may have { data: [...] } format)
if (!Array.isArray(pluginsData)) {
if (pluginsData && Array.isArray(pluginsData.data)) {
pluginsData = pluginsData.data;
} else {
console.warn('[cacheSettings] pluginsData is not an array, treating as empty');
pluginsData = [];
}
}
settingsData.forEach((set) => {
resolvedOptions = createArray(set.setOptions)
resolvedOptionsOld = resolvedOptions
setPlugObj = {};
options_params = [];
resolved = ""
// proceed only if first option item contains something to resolve
if( !set.setKey.includes("__metadata") &&
resolvedOptions.length != 0 &&
resolvedOptions[0].includes("{value}"))
{
// get setting definition from the plugin config if available
setPlugObj = getPluginSettingObject(pluginsData, set.setKey)
// check if options contains parameters and resolve
if(setPlugObj != {} && setPlugObj["options_params"])
{
// get option_params for {value} resolution
options_params = setPlugObj["options_params"]
if(options_params != [])
{
// handles only strings of length == 1
resolved = resolveParams(options_params, resolvedOptions[0])
if(resolved.includes('"')) // check if list of strings
{
resolvedOptions = `[${resolved}]`
} else // one value only
{
resolvedOptions = `["${resolved}"]`
}
}
}
}
setCache(CACHE_KEYS.setting(set.setKey), set.setValue)
setCache(CACHE_KEYS.settingOpts(set.setKey), resolvedOptions)
});
handleSuccess('cacheSettings');
resolve();
})
.catch((err) => { handleFailure('cacheSettings'); reject(err); });
});
}
// -----------------------------------------------------------------------------
// Get a setting options value by key
function getSettingOptions (key) {
result = getCache(CACHE_KEYS.settingOpts(key));
if (result == "")
{
result = []
}
return result;
}
// -----------------------------------------------------------------------------
// Get a setting value by key
function getSetting (key) {
result = getCache(CACHE_KEYS.setting(key));
return result;
}
// -----------------------------------------------------------------------------
// Get language string
// -----------------------------------------------------------------------------
function cacheStrings() {
return new Promise((resolve, reject) => {
if(getCache(CACHE_KEYS.initFlag('cacheStrings')) === "true")
{
// Core strings are cached, but plugin strings may have failed silently on
// the first load (non-fatal fetch). Always re-fetch them so that plugin
// keys like "CSVBCKP_overwrite_description" are available without needing
// a full clearCache().
fetchJson('table_plugins_language_strings.json')
.catch((pluginError) => {
console.warn('[cacheStrings early-return] Plugin language strings unavailable (non-fatal):', pluginError);
return [];
})
.then((data) => {
if (!Array.isArray(data)) { data = []; }
data.forEach((langString) => {
setCache(CACHE_KEYS.langString(langString.String_Key, langString.Language_Code), langString.String_Value);
});
resolve();
});
return;
}
// Create a promise for each language (include en_us by default as fallback)
languagesToLoad = ['en_us']
additionalLanguage = getLangCode()
if(additionalLanguage != 'en_us')
{
languagesToLoad.push(additionalLanguage)
}
console.log(languagesToLoad);
const languagePromises = languagesToLoad.map((language_code) => {
return new Promise((resolveLang, rejectLang) => {
// Fetch core strings and translations
$.get(`php/templates/language/${language_code}.json?nocache=${Date.now()}`)
.done((res) => {
// Iterate over each key-value pair and store the translations
Object.entries(res).forEach(([key, value]) => {
setCache(CACHE_KEYS.langString(key, language_code), value);
});
// Fetch strings and translations from plugins (non-fatal — file may
// not exist on first boot or immediately after a cache clear)
fetchJson('table_plugins_language_strings.json')
.catch((pluginError) => {
console.warn('[cacheStrings] Plugin language strings unavailable (non-fatal):', pluginError);
return []; // treat as empty list
})
.then((data) => {
// Defensive: ensure data is an array (fetchJson may return
// an object, undefined, or empty string on edge cases)
if (!Array.isArray(data)) { data = []; }
// Store plugin translations
data.forEach((langString) => {
setCache(CACHE_KEYS.langString(langString.String_Key, langString.Language_Code), langString.String_Value);
});
// Handle successful completion of language processing
handleSuccess('cacheStrings');
resolveLang();
});
})
.fail((error) => {
// Handle failure in core strings fetching
rejectLang(error);
});
});
});
// Wait for all language promises to complete
Promise.all(languagePromises)
.then(() => {
// All languages processed successfully
resolve();
})
.catch((error) => {
// Handle failure in any of the language processing
handleFailure('cacheStrings');
reject(error);
});
});
}
// -----------------------------------------------------------------------------
// Get translated language string
function getString(key) {
function fetchString(key) {
lang_code = getLangCode();
let result = getCache(CACHE_KEYS.langString(key, lang_code));
if (isEmpty(result)) {
result = getCache(CACHE_KEYS.langString(key, CACHE_KEYS.LANG_FALLBACK));
}
return result;
}
if (isAppInitialized()) {
return fetchString(key);
} else {
callAfterAppInitialized(() => fetchString(key));
}
}
// -----------------------------------------------------------------------------
// Get current language ISO code.
// The UI_LANG setting value is always in the form "Name (code)", e.g. "English (en_us)".
// Extracting the code with a regex means this function never needs updating when a
// new language is added — the single source of truth is languages.json.
function getLangCode() {
UI_LANG = getSetting("UI_LANG");
const match = (UI_LANG || '').match(/\(([a-z]{2}_[a-z]{2})\)\s*$/i);
return match ? match[1].toLowerCase() : 'en_us';
}
// -----------------------------------------------------------------------------
// A function to get a device property using the mac address as key and DB column name as parameter
// for the value to be returned
function getDevDataByMac(macAddress, dbColumn) {
const sessionDataKey = CACHE_KEYS.DEVICES_ALL;
const devicesCache = getCache(sessionDataKey);
if (!devicesCache || devicesCache == "") {
console.warn(`[getDevDataByMac] Cache key "${sessionDataKey}" is empty — cache may not be initialized yet.`);
return null;
}
const devices = parseDeviceCache(devicesCache);
if (devices.length === 0) {
return null;
}
for (const device of devices) {
if (device["devMac"].toLowerCase() === macAddress.toLowerCase()) {
if(dbColumn)
{
return device[dbColumn];
}
else
{
return device
}
}
}
console.error("⚠ Device with MAC not found:" + macAddress)
return null; // Return a default value if MAC address is not found
}
// -----------------------------------------------------------------------------
// Cache the devices as one JSON
function cacheDevices()
{
return new Promise((resolve, reject) => {
if(getCache(CACHE_KEYS.initFlag('cacheDevices')) === "true")
{
// One-time migration: normalize legacy { data: [...] } wrapper to a plain array.
// Old cache entries from prior versions stored the raw API envelope; re-write
// them in the flat format so parseDeviceCache never needs the fallback branch.
const raw = getCache(CACHE_KEYS.DEVICES_ALL);
if (raw) {
try {
const p = JSON.parse(raw);
if (p && typeof p === 'object' && !Array.isArray(p) && Array.isArray(p.data)) {
setCache(CACHE_KEYS.DEVICES_ALL, JSON.stringify(p.data));
}
} catch (e) { /* ignore malformed cache will be refreshed next init */ }
}
resolve();
return;
}
fetchJson('table_devices.json')
.then((arr) => {
devicesListAll_JSON = arr;
devicesListAll_JSON_str = JSON.stringify(devicesListAll_JSON)
if(devicesListAll_JSON_str == "")
{
showSpinner()
setTimeout(() => {
cacheDevices()
}, 1000);
}
setCache(CACHE_KEYS.DEVICES_ALL, devicesListAll_JSON_str)
handleSuccess('cacheDevices');
resolve();
})
.catch((err) => { handleFailure('cacheDevices'); reject(err); });
}
);
}
var devicesListAll_JSON = []; // this will contain a list off all devices

View File

@@ -12,33 +12,46 @@ var timerRefreshData = ''
var emptyArr = ['undefined', "", undefined, null, 'null']; var emptyArr = ['undefined', "", undefined, null, 'null'];
var UI_LANG = "English (en_us)"; var UI_LANG = "English (en_us)";
// allLanguages is populated at init via fetchAllLanguages() from GET /languages. const allLanguages = ["ar_ar","ca_ca","cs_cz","de_de",
// Do not hardcode this list — add new languages to languages.json instead. "en_us","es_es","fa_fa","fr_fr",
let allLanguages = []; "it_it","ja_jp","nb_no","pl_pl",
"pt_br","pt_pt","ru_ru","sv_sv",
"tr_tr","uk_ua","vi_vn","zh_cn"]; // needs to be same as in lang.php
var settingsJSON = {} var settingsJSON = {}
// NAX_CACHE_VERSION and CACHE_KEYS moved to cache.js
// getCache, setCache, fetchJson, getAuthContext moved to cache.js
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Fetch the canonical language list from GET /languages and populate allLanguages. // Simple session cache withe expiration managed via cookies
// Must be called after the API token is available (e.g. alongside cacheStrings).
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
function fetchAllLanguages(apiToken) { function getCache(key, noCookie = false)
return fetch('/languages', { {
headers: { 'Authorization': 'Bearer ' + apiToken } // check cache
}) cachedValue = localStorage.getItem(key)
.then(function(resp) { return resp.json(); })
.then(function(data) { // console.log(cachedValue);
if (data && data.success && Array.isArray(data.languages)) {
allLanguages = data.languages.map(function(l) { return l.code; }); if(cachedValue)
} {
}) // // check if not expired
.catch(function(err) { // if(noCookie || getCookie(key + '_session_expiry') != "")
console.warn('[fetchAllLanguages] Failed to load language list:', err); // {
}); return cachedValue;
// }
}
return "";
}
// -----------------------------------------------------------------------------
function setCache(key, data, expirationMinutes='')
{
localStorage.setItem(key, data);
// // create cookie if expiration set to handle refresh of data
// if (expirationMinutes != '')
// {
// setCookie ('cache_session_expiry', 'OK', 1)
// }
} }
@@ -80,13 +93,288 @@ function deleteCookie (cookie) {
document.cookie = cookie + '=;expires=Thu, 01 Jan 1970 00:00:00 UTC'; document.cookie = cookie + '=;expires=Thu, 01 Jan 1970 00:00:00 UTC';
} }
// -----------------------------------------------------------------------------
function deleteAllCookies() {
// Array of cookies
var allCookies = document.cookie.split(";");
// For each cookie
for (var i = 0; i < allCookies.length; i++) {
var cookie = allCookies[i].trim();
var eqPos = cookie.indexOf("=");
var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 UTC";
}
}
// cacheApiConfig, cacheSettings, getSettingOptions, getSetting moved to cache.js
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// cacheStrings, getString, getLangCode moved to cache.js // Get settings from the .json file generated by the python backend
// and cache them, if available, with options
// -----------------------------------------------------------------------------
function cacheSettings()
{
return new Promise((resolve, reject) => {
if(!getCache('cacheSettings_completed') === true)
{
$.get('php/server/query_json.php', { file: 'table_settings.json', nocache: Date.now() }, function(resSet) {
$.get('php/server/query_json.php', { file: 'plugins.json', nocache: Date.now() }, function(resPlug) {
pluginsData = resPlug["data"];
settingsData = resSet["data"];
settingsData.forEach((set) => {
resolvedOptions = createArray(set.setOptions)
resolvedOptionsOld = resolvedOptions
setPlugObj = {};
options_params = [];
resolved = ""
// proceed only if first option item contains something to resolve
if( !set.setKey.includes("__metadata") &&
resolvedOptions.length != 0 &&
resolvedOptions[0].includes("{value}"))
{
// get setting definition from the plugin config if available
setPlugObj = getPluginSettingObject(pluginsData, set.setKey)
// check if options contains parameters and resolve
if(setPlugObj != {} && setPlugObj["options_params"])
{
// get option_params for {value} resolution
options_params = setPlugObj["options_params"]
if(options_params != [])
{
// handles only strings of length == 1
resolved = resolveParams(options_params, resolvedOptions[0])
if(resolved.includes('"')) // check if list of strings
{
resolvedOptions = `[${resolved}]`
} else // one value only
{
resolvedOptions = `["${resolved}"]`
}
}
}
}
setCache(`nax_set_${set.setKey}`, set.setValue)
setCache(`nax_set_opt_${set.setKey}`, resolvedOptions)
});
}).then(() => handleSuccess('cacheSettings', resolve())).catch(() => handleFailure('cacheSettings', reject("cacheSettings already completed"))); // handle AJAX synchronization
})
}
});
}
// -----------------------------------------------------------------------------
// Get a setting options value by key
function getSettingOptions (key) {
// handle initial load to make sure everything is set-up and cached
// handleFirstLoad()
result = getCache(`nax_set_opt_${key}`, true);
if (result == "")
{
// console.log(`Setting options with key "${key}" not found`)
result = []
}
return result;
}
// -----------------------------------------------------------------------------
// Get a setting value by key
function getSetting (key) {
// handle initial load to make sure everything is set-up and cached
// handleFirstLoad()
result = getCache(`nax_set_${key}`, true);
// if (result == "")
// {
// console.log(`Setting with key "${key}" not found`)
// }
return result;
}
// -----------------------------------------------------------------------------
// Get language string
// -----------------------------------------------------------------------------
function cacheStrings() {
return new Promise((resolve, reject) => {
// Create a promise for each language (include en_us by default as fallback)
languagesToLoad = ['en_us']
additionalLanguage = getLangCode()
if(additionalLanguage != 'en_us')
{
languagesToLoad.push(additionalLanguage)
}
console.log(languagesToLoad);
const languagePromises = languagesToLoad.map((language_code) => {
return new Promise((resolveLang, rejectLang) => {
// Fetch core strings and translations
$.get(`php/templates/language/${language_code}.json?nocache=${Date.now()}`)
.done((res) => {
// Iterate over each key-value pair and store the translations
Object.entries(res).forEach(([key, value]) => {
setCache(`pia_lang_${key}_${language_code}`, value);
});
// Fetch strings and translations from plugins
$.get('php/server/query_json.php', { file: 'table_plugins_language_strings.json', nocache: Date.now() })
.done((pluginRes) => {
const data = pluginRes["data"];
// Store plugin translations
data.forEach((langString) => {
setCache(`pia_lang_${langString.String_Key}_${langString.Language_Code}`, langString.String_Value);
});
// Handle successful completion of language processing
handleSuccess(`cacheStrings`, resolveLang);
})
.fail((pluginError) => {
// Handle failure in plugin strings fetching
rejectLang(pluginError);
});
})
.fail((error) => {
// Handle failure in core strings fetching
rejectLang(error);
});
});
});
// Wait for all language promises to complete
Promise.all(languagePromises)
.then(() => {
// All languages processed successfully
resolve();
})
.catch((error) => {
// Handle failure in any of the language processing
handleFailure('cacheStrings', reject);
});
});
}
// -----------------------------------------------------------------------------
// Get translated language string
function getString(key) {
function fetchString(key) {
lang_code = getLangCode();
let result = getCache(`pia_lang_${key}_${lang_code}`, true);
if (isEmpty(result)) {
result = getCache(`pia_lang_${key}_en_us`, true);
}
return result;
}
if (isAppInitialized()) {
return fetchString(key);
} else {
callAfterAppInitialized(() => fetchString(key));
}
}
// -----------------------------------------------------------------------------
// Get current language ISO code
// below has to match exactly the values in /front/php/templates/language/lang.php & /front/js/common.js
function getLangCode() {
UI_LANG = getSetting("UI_LANG");
let lang_code = 'en_us';
switch (UI_LANG) {
case 'English (en_us)':
lang_code = 'en_us';
break;
case 'Spanish (es_es)':
lang_code = 'es_es';
break;
case 'German (de_de)':
lang_code = 'de_de';
break;
case 'Farsi (fa_fa)':
lang_code = 'fa_fa';
break;
case 'French (fr_fr)':
lang_code = 'fr_fr';
break;
case 'Norwegian (nb_no)':
lang_code = 'nb_no';
break;
case 'Polish (pl_pl)':
lang_code = 'pl_pl';
break;
case 'Portuguese (pt_br)':
lang_code = 'pt_br';
break;
case 'Portuguese (pt_pt)':
lang_code = 'pt_pt';
break;
case 'Turkish (tr_tr)':
lang_code = 'tr_tr';
break;
case 'Swedish (sv_sv)':
lang_code = 'sv_sv';
break;
case 'Italian (it_it)':
lang_code = 'it_it';
break;
case 'Japanese (ja_jp)':
lang_code = 'ja_jp';
break;
case 'Russian (ru_ru)':
lang_code = 'ru_ru';
break;
case 'Chinese (zh_cn)':
lang_code = 'zh_cn';
break;
case 'Czech (cs_cz)':
lang_code = 'cs_cz';
break;
case 'Arabic (ar_ar)':
lang_code = 'ar_ar';
break;
case 'Catalan (ca_ca)':
lang_code = 'ca_ca';
break;
case 'Ukrainian (uk_uk)':
lang_code = 'uk_ua';
break;
case 'Vietnamese (vi_vn)':
lang_code = 'vi_vn';
break;
}
return lang_code;
}
const tz = getSetting("TIMEZONE") || 'Europe/Berlin'; const tz = getSetting("TIMEZONE") || 'Europe/Berlin';
const LOCALE = getSetting('UI_LOCALE') || 'en-GB'; const LOCALE = getSetting('UI_LOCALE') || 'en-GB';
@@ -430,13 +718,14 @@ function numberArrayFromString(data)
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Update network parent/child relationship (network tree) // Update network parent/child relationship (network tree)
function updateNetworkLeaf(leafMac, parentMac) { function updateNetworkLeaf(leafMac, parentMac) {
const { apiBase, authHeader } = getAuthContext(); const apiBase = getApiBase();
const apiToken = getSetting("API_TOKEN");
const url = `${apiBase}/device/${leafMac}/update-column`; const url = `${apiBase}/device/${leafMac}/update-column`;
$.ajax({ $.ajax({
method: "POST", method: "POST",
url: url, url: url,
headers: authHeader, headers: { "Authorization": `Bearer ${apiToken}` },
data: JSON.stringify({ columnName: "devParentMAC", columnValue: parentMac }), data: JSON.stringify({ columnName: "devParentMAC", columnValue: parentMac }),
contentType: "application/json", contentType: "application/json",
success: function(response) { success: function(response) {
@@ -868,7 +1157,72 @@ function isRandomMAC(mac)
return options; return options;
} }
// getDevDataByMac, cacheDevices, devicesListAll_JSON moved to cache.js // -----------------------------------------------------------------------------
// A function to get a device property using the mac address as key and DB column nakme as parameter
// for the value to be returned
function getDevDataByMac(macAddress, dbColumn) {
const sessionDataKey = 'devicesListAll_JSON';
const devicesCache = getCache(sessionDataKey);
if (!devicesCache || devicesCache == "") {
console.error(`Session variable "${sessionDataKey}" not found.`);
return null;
}
const devices = JSON.parse(devicesCache);
for (const device of devices) {
if (device["devMac"].toLowerCase() === macAddress.toLowerCase()) {
if(dbColumn)
{
return device[dbColumn];
}
else
{
return device
}
}
}
console.error("⚠ Device with MAC not found:" + macAddress)
return null; // Return a default value if MAC address is not found
}
// -----------------------------------------------------------------------------
// Cache the devices as one JSON
function cacheDevices()
{
return new Promise((resolve, reject) => {
$.get('php/server/query_json.php', { file: 'table_devices.json', nocache: Date.now() }, function(data) {
// console.log(data)
devicesListAll_JSON = data["data"]
devicesListAll_JSON_str = JSON.stringify(devicesListAll_JSON)
if(devicesListAll_JSON_str == "")
{
showSpinner()
setTimeout(() => {
cacheDevices()
}, 1000);
}
// console.log(devicesListAll_JSON_str);
setCache('devicesListAll_JSON', devicesListAll_JSON_str)
// console.log(getCache('devicesListAll_JSON'))
}).then(() => handleSuccess('cacheDevices', resolve())).catch(() => handleFailure('cacheDevices', reject("cacheDevices already completed"))); // handle AJAX synchronization
}
);
}
var devicesListAll_JSON = []; // this will contain a list off all devices
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
function isEmpty(value) function isEmpty(value)
@@ -1015,13 +1369,18 @@ function updateApi(apiEndpoints)
// value has to be in format event|param. e.g. run|ARPSCAN // value has to be in format event|param. e.g. run|ARPSCAN
action = `${getGuid()}|update_api|${apiEndpoints}` action = `${getGuid()}|update_api|${apiEndpoints}`
const { token: apiToken, apiBase: apiBaseUrl, authHeader } = getAuthContext(); // Get data from the server
const apiToken = getSetting("API_TOKEN");
const apiBaseUrl = getApiBase();
const url = `${apiBaseUrl}/logs/add-to-execution-queue`; const url = `${apiBaseUrl}/logs/add-to-execution-queue`;
$.ajax({ $.ajax({
method: "POST", method: "POST",
url: url, url: url,
headers: { ...authHeader, "Content-Type": "application/json" }, headers: {
"Authorization": "Bearer " + apiToken,
"Content-Type": "application/json"
},
data: JSON.stringify({ action: action }), data: JSON.stringify({ action: action }),
success: function(data, textStatus) { success: function(data, textStatus) {
console.log(data) console.log(data)
@@ -1189,11 +1548,16 @@ function hideUIelements(setKey) {
function getDevicesList() function getDevicesList()
{ {
// Read cache (skip cookie expiry check) // Read cache (skip cookie expiry check)
const cached = getCache(CACHE_KEYS.DEVICES_ALL); devicesList = getCache('devicesListAll_JSON', true);
let devicesList = parseDeviceCache(cached);
if (devicesList != '') {
devicesList = JSON.parse (devicesList);
} else {
devicesList = [];
}
// only loop thru the filtered down list // only loop thru the filtered down list
visibleDevices = getCache(CACHE_KEYS.VISIBLE_MACS) visibleDevices = getCache("ntx_visible_macs")
if(visibleDevices != "") { if(visibleDevices != "") {
visibleDevicesMACs = visibleDevices.split(','); visibleDevicesMACs = visibleDevices.split(',');
@@ -1252,14 +1616,18 @@ function restartBackend() {
modalEventStatusId = 'modal-message-front-event' modalEventStatusId = 'modal-message-front-event'
const { token: apiToken, apiBase: apiBaseUrl, authHeader } = getAuthContext(); const apiToken = getSetting("API_TOKEN");
const apiBaseUrl = getApiBase();
const url = `${apiBaseUrl}/logs/add-to-execution-queue`; const url = `${apiBaseUrl}/logs/add-to-execution-queue`;
// Execute // Execute
$.ajax({ $.ajax({
method: "POST", method: "POST",
url: url, url: url,
headers: { ...authHeader, "Content-Type": "application/json" }, headers: {
"Authorization": "Bearer " + apiToken,
"Content-Type": "application/json"
},
data: JSON.stringify({ action: `cron_restart_backend` }), data: JSON.stringify({ action: `cron_restart_backend` }),
success: function(data, textStatus) { success: function(data, textStatus) {
// showModalOk ('Result', data ); // showModalOk ('Result', data );
@@ -1274,8 +1642,237 @@ function restartBackend() {
}) })
} }
// App lifecycle (completedCalls, executeOnce, handleSuccess, clearCache, etc.) moved to app-init.js // -----------------------------------------------------------------------------
// initialize
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// Define a unique key for storing the flag in sessionStorage
const sessionStorageKey = "myScriptExecuted_common_js";
var completedCalls = []
var completedCalls_final = ['cacheSettings', 'cacheStrings', 'cacheDevices'];
var lang_completedCalls = 0;
// -----------------------------------------------------------------------------
// Clearing all the caches
function clearCache() {
showSpinner();
sessionStorage.clear();
localStorage.clear();
setTimeout(() => {
console.warn("clearChache called");
window.location.reload();
}, 500);
}
// ===================================================================
// DEPRECATED: checkSettingChanges() - Replaced by SSE-based manager
// Settings changes are now handled via SSE events
// Kept for backward compatibility, will be removed in future version
// ===================================================================
function checkSettingChanges() {
// SSE manager handles settings_changed events now
if (typeof netAlertXStateManager !== 'undefined' && netAlertXStateManager.initialized) {
return; // SSE handles this now
}
// Fallback for backward compatibility
$.get('php/server/query_json.php', { file: 'app_state.json', nocache: Date.now() }, function(appState) {
const importedMilliseconds = parseInt(appState["settingsImported"] * 1000);
const lastReloaded = parseInt(sessionStorage.getItem(sessionStorageKey + '_time'));
if (importedMilliseconds > lastReloaded) {
console.log("Cache needs to be refreshed because of setting changes");
setTimeout(() => {
clearCache();
}, 500);
}
});
}
// ===================================================================
// Display spinner and reload page if not yet initialized
async function handleFirstLoad(callback) {
if (!isAppInitialized()) {
await new Promise(resolve => setTimeout(resolve, 1000));
callback();
}
}
// ===================================================================
// Execute callback once the app is initialized and GraphQL server is running
async function callAfterAppInitialized(callback) {
if (!isAppInitialized() || !(await isGraphQLServerRunning())) {
setTimeout(() => {
callAfterAppInitialized(callback);
}, 500);
} else {
callback();
}
}
// ===================================================================
// Polling function to repeatedly check if the server is running
async function waitForGraphQLServer() {
const pollInterval = 2000; // 2 seconds between each check
let serverRunning = false;
while (!serverRunning) {
serverRunning = await isGraphQLServerRunning();
if (!serverRunning) {
console.log("GraphQL server not running, retrying in 2 seconds...");
await new Promise(resolve => setTimeout(resolve, pollInterval));
}
}
console.log("GraphQL server is now running.");
}
// -----------------------------------------------------------------------------
// Returns 1 if running, 0 otherwise
async function isGraphQLServerRunning() {
try {
const response = await $.get('php/server/query_json.php', { file: 'app_state.json', nocache: Date.now()});
console.log("graphQLServerStarted: " + response["graphQLServerStarted"]);
setCache("graphQLServerStarted", response["graphQLServerStarted"]);
return response["graphQLServerStarted"];
} catch (error) {
console.error("Failed to check GraphQL server status:", error);
return false;
}
}
// -----------------------------------------------------------------------------
// Check if the code has been executed before by checking sessionStorage
function isAppInitialized() {
lang_shouldBeCompletedCalls = getLangCode() == 'en_us' ? 1 : 2;
// check if each ajax call completed succesfully
$.each(completedCalls_final, function(index, call_name){
if(getCache(call_name + "_completed") != "true")
{
console.log(`[isAppInitialized] AJAX call ${call_name} unsuccesful: ${getCache(call_name + "_completed")}`)
return false;
}
});
// check if all required languages chached
if(parseInt(getCache("cacheStringsCountCompleted")) != lang_shouldBeCompletedCalls)
{
console.log(`[isAppInitialized] AJAX call cacheStrings unsuccesful: ${getCache("cacheStringsCountCompleted")} out of ${lang_shouldBeCompletedCalls}`)
return false;
}
return true;
}
// -----------------------------------------------------------------------------
// Main execution logic
async function executeOnce() {
showSpinner();
if (!isAppInitialized()) {
try {
await waitForGraphQLServer(); // Wait for the server to start
await cacheDevices();
await cacheSettings();
await cacheStrings();
console.log("All AJAX callbacks have completed");
onAllCallsComplete();
} catch (error) {
console.error("Error:", error);
}
}
}
// -----------------------------------------------------------------------------
// Function to handle successful completion of an AJAX call
const handleSuccess = (callName) => {
console.log(`AJAX call successful: ${callName}`);
if(callName.includes("cacheStrings"))
{
completed_tmp = getCache("cacheStringsCountCompleted");
completed_tmp == "" ? completed_tmp = 0 : completed_tmp = completed_tmp;
completed_tmp++;
setCache("cacheStringsCountCompleted", completed_tmp);
}
setCache(callName + "_completed", true)
};
// -----------------------------------------------------------------------------
// Function to handle failure of an AJAX call
const handleFailure = (callName, callback) => {
msg = `AJAX call ${callName} failed`
console.error(msg);
// Implement retry logic here if needed
// write_notification(msg, 'interrupt')
};
// -----------------------------------------------------------------------------
// Function to execute when all AJAX calls have completed
const onAllCallsComplete = () => {
completedCalls = mergeUniqueArrays(getCache('completedCalls').split(','), completedCalls);
setCache('completedCalls', completedCalls);
// Check if all necessary strings are initialized
if (areAllStringsInitialized()) {
sessionStorage.setItem(sessionStorageKey, "true");
const millisecondsNow = Date.now();
sessionStorage.setItem(sessionStorageKey + '_time', millisecondsNow);
console.log('✔ Cache initialized');
// setTimeout(() => {
// location.reload()
// }, 10);
} else {
// If not all strings are initialized, retry initialization
console.log('❌ Not all strings are initialized. Retrying...');
executeOnce();
return;
}
// Call any other initialization functions here if needed
};
// Function to check if all necessary strings are initialized
const areAllStringsInitialized = () => {
// Implement logic to check if all necessary strings are initialized
// Return true if all strings are initialized, false otherwise
return getString('UI_LANG_name') != ""
};
// Call the function to execute the code
executeOnce();
// Set timer for regular UI refresh if enabled
setTimeout(() => {
// page refresh if configured
const refreshTime = getSetting("UI_REFRESH");
if (refreshTime && refreshTime !== "0" && refreshTime !== "") {
console.log("Refreshing page becasue UI_REFRESH setting enabled.");
newTimerRefreshData(clearCache, parseInt(refreshTime)*1000);
}
// Check if page needs to refresh due to setting changes
checkSettingChanges()
}, 10000);
console.log("init common.js");

View File

@@ -1,133 +0,0 @@
// =============================================================================
// device-columns.js — Single source of truth for device field definitions.
//
// To add a new device column, update ONLY these places:
// 1. DEVICE_COLUMN_FIELDS — add the field name in the correct position
// 2. COLUMN_NAME_MAP — add Device_TableHead_X → fieldName mapping
// 3. NUMERIC_DEFAULTS — add fieldName if its default value is 0 not ""
// 4. GRAPHQL_EXTRA_FIELDS — add fieldName ONLY if it is NOT a display column
// (i.e. fetched for logic but not shown in table)
// 5. front/plugins/ui_settings/config.json options[]
// 6. front/php/templates/language/en_us.json Device_TableHead_X
// then run merge_translations.py for other languages
// 7. Backend: DB view + GraphQL type
// =============================================================================
// Ordered list of all device table column field names.
// Position here determines the positional index used throughout devices.php.
const DEVICE_COLUMN_FIELDS = [
"devName", // 0 Device_TableHead_Name
"devOwner", // 1 Device_TableHead_Owner
"devType", // 2 Device_TableHead_Type
"devIcon", // 3 Device_TableHead_Icon
"devFavorite", // 4 Device_TableHead_Favorite
"devGroup", // 5 Device_TableHead_Group
"devFirstConnection", // 6 Device_TableHead_FirstSession
"devLastConnection", // 7 Device_TableHead_LastSession
"devLastIP", // 8 Device_TableHead_LastIP
"devIsRandomMac", // 9 Device_TableHead_MAC (random MAC flag column)
"devStatus", // 10 Device_TableHead_Status
"devMac", // 11 Device_TableHead_MAC_full
"devIpLong", // 12 Device_TableHead_LastIPOrder
"rowid", // 13 Device_TableHead_Rowid
"devParentMAC", // 14 Device_TableHead_Parent_MAC
"devParentChildrenCount",// 15 Device_TableHead_Connected_Devices
"devLocation", // 16 Device_TableHead_Location
"devVendor", // 17 Device_TableHead_Vendor
"devParentPort", // 18 Device_TableHead_Port
"devGUID", // 19 Device_TableHead_GUID
"devSyncHubNode", // 20 Device_TableHead_SyncHubNodeName
"devSite", // 21 Device_TableHead_NetworkSite
"devSSID", // 22 Device_TableHead_SSID
"devSourcePlugin", // 23 Device_TableHead_SourcePlugin
"devPresentLastScan", // 24 Device_TableHead_PresentLastScan
"devAlertDown", // 25 Device_TableHead_AlertDown
"devCustomProps", // 26 Device_TableHead_CustomProps
"devFQDN", // 27 Device_TableHead_FQDN
"devParentRelType", // 28 Device_TableHead_ParentRelType
"devReqNicsOnline", // 29 Device_TableHead_ReqNicsOnline
"devVlan", // 30 Device_TableHead_Vlan
"devPrimaryIPv4", // 31 Device_TableHead_IPv4
"devPrimaryIPv6", // 32 Device_TableHead_IPv6
"devFlapping", // 33 Device_TableHead_Flapping
];
// Named index constants — eliminates all mapIndx(N) magic numbers.
// Access as COL.devFlapping, COL.devMac, etc.
const COL = Object.fromEntries(DEVICE_COLUMN_FIELDS.map((name, i) => [name, i]));
// Fields whose GraphQL response value should default to 0 instead of "".
const NUMERIC_DEFAULTS = new Set([
"devParentChildrenCount",
"devReqNicsOnline",
"devFlapping",
]);
// Fields fetched from GraphQL for internal logic only — not display columns.
// These are merged with DEVICE_COLUMN_FIELDS to build the GraphQL query.
const GRAPHQL_EXTRA_FIELDS = [
"devComments",
"devStaticIP",
"devScan",
"devLogEvents",
"devAlertEvents",
"devSkipRepeated",
"devLastNotification",
"devIsNew",
"devIsArchived",
"devIsSleeping",
];
// Row positions for extra (non-display) fields.
// In dataSrc, extra fields are appended AFTER the display columns in each row,
// so their position = DEVICE_COLUMN_FIELDS.length + their index in GRAPHQL_EXTRA_FIELDS.
// Use COL_EXTRA.fieldName to access them in createdCell rowData.
const COL_EXTRA = Object.fromEntries(
GRAPHQL_EXTRA_FIELDS.map((name, i) => [name, DEVICE_COLUMN_FIELDS.length + i])
);
// Maps Device_TableHead_* language keys to their GraphQL/DB field names.
// Used by getColumnNameFromLangString() in ui_components.js and by
// column filter logic in devices.php.
//
// NOTE: Device_TableHead_MAC maps to devMac (display), while position 9 in
// DEVICE_COLUMN_FIELDS uses devIsRandomMac (the random-MAC flag column).
// These are intentionally different; do not collapse them.
const COLUMN_NAME_MAP = {
"Device_TableHead_Name": "devName",
"Device_TableHead_Owner": "devOwner",
"Device_TableHead_Type": "devType",
"Device_TableHead_Icon": "devIcon",
"Device_TableHead_Favorite": "devFavorite",
"Device_TableHead_Group": "devGroup",
"Device_TableHead_FirstSession": "devFirstConnection",
"Device_TableHead_LastSession": "devLastConnection",
"Device_TableHead_LastIP": "devLastIP",
"Device_TableHead_MAC": "devMac",
"Device_TableHead_Status": "devStatus",
"Device_TableHead_MAC_full": "devMac",
"Device_TableHead_LastIPOrder": "devIpLong",
"Device_TableHead_Rowid": "rowid",
"Device_TableHead_Parent_MAC": "devParentMAC",
"Device_TableHead_Connected_Devices": "devParentChildrenCount",
"Device_TableHead_Location": "devLocation",
"Device_TableHead_Vendor": "devVendor",
"Device_TableHead_Port": "devParentPort",
"Device_TableHead_GUID": "devGUID",
"Device_TableHead_SyncHubNodeName": "devSyncHubNode",
"Device_TableHead_NetworkSite": "devSite",
"Device_TableHead_SSID": "devSSID",
"Device_TableHead_SourcePlugin": "devSourcePlugin",
"Device_TableHead_PresentLastScan": "devPresentLastScan",
"Device_TableHead_AlertDown": "devAlertDown",
"Device_TableHead_CustomProps": "devCustomProps",
"Device_TableHead_FQDN": "devFQDN",
"Device_TableHead_ParentRelType": "devParentRelType",
"Device_TableHead_ReqNicsOnline": "devReqNicsOnline",
"Device_TableHead_Vlan": "devVlan",
"Device_TableHead_IPv4": "devPrimaryIPv4",
"Device_TableHead_IPv6": "devPrimaryIPv6",
"Device_TableHead_Flapping": "devFlapping",
};
console.log("init device-columns.js");

View File

@@ -1,266 +0,0 @@
// network-api.js
// API calls and data loading functions for network topology
/**
* Load network nodes (network device types)
* Creates top-level tabs for each network device
*/
function loadNetworkNodes() {
// Create Top level tabs (List of network devices), explanation of the terminology below:
//
// Switch 1 (node)
// /(p1) \ (p2) <----- port numbers
// / \
// Smart TV (leaf) Switch 2 (node (for the PC) and leaf (for Switch 1))
// \
// PC (leaf) <------- leafs are not included in this SQL query
const rawSql = `
SELECT
parent.devName,
LOWER(parent.devMac) AS devMac,
parent.devPresentLastScan,
parent.devType,
LOWER(parent.devParentMAC) AS devParentMAC,
parent.devIcon,
parent.devAlertDown,
parent.devFlapping,
parent.devIsSleeping,
parent.devIsNew,
COUNT(child.devMac) AS node_ports_count
FROM DevicesView AS parent
LEFT JOIN DevicesView AS child
/* CRITICAL FIX: COLLATE NOCASE ensures the join works
even if devParentMAC is uppercase and devMac is lowercase
*/
ON child.devParentMAC = parent.devMac COLLATE NOCASE
WHERE parent.devType IN (${networkDeviceTypes})
AND parent.devIsArchived = 0
GROUP BY parent.devMac, parent.devName, parent.devPresentLastScan,
parent.devType, parent.devParentMAC, parent.devIcon, parent.devAlertDown, parent.devFlapping, parent.devIsSleeping, parent.devIsNew
ORDER BY parent.devName;
`;
const { token: apiToken, apiBase, authHeader } = getAuthContext();
// Verify token is available
if (!apiToken || apiToken.trim() === '') {
console.error("API_TOKEN not available. Settings may not be loaded yet.");
return;
}
const url = `${apiBase}/dbquery/read`;
$.ajax({
url,
method: "POST",
headers: { ...authHeader, "Content-Type": "application/json" },
data: JSON.stringify({ rawSql: btoa(unescape(encodeURIComponent(rawSql))) }),
contentType: "application/json",
success: function(data) {
const nodes = data.results || [];
renderNetworkTabs(nodes);
loadUnassignedDevices();
checkTabsOverflow();
},
error: function(xhr, status, error) {
console.error("Error loading network nodes:", status, error);
// Check if it's an auth error
if (xhr.status === 401) {
console.error("Authorization failed. API_TOKEN may be invalid or not yet loaded.");
}
}
});
}
/**
* Load device table with configurable SQL and rendering
* @param {Object} options - Configuration object
* @param {string} options.sql - SQL query to fetch devices
* @param {string} options.containerSelector - jQuery selector for container
* @param {string} options.tableId - ID for DataTable instance
* @param {string} options.wrapperHtml - HTML wrapper for table
* @param {boolean} options.assignMode - Whether to show assign/unassign buttons
*/
function loadDeviceTable({ sql, containerSelector, tableId, wrapperHtml = null, assignMode = true }) {
const { token: apiToken, apiBase, authHeader } = getAuthContext();
// Verify token is available
if (!apiToken || apiToken.trim() === '') {
console.error("API_TOKEN not available. Settings may not be loaded yet.");
return;
}
const url = `${apiBase}/dbquery/read`;
$.ajax({
url,
method: "POST",
headers: { ...authHeader, "Content-Type": "application/json" },
data: JSON.stringify({ rawSql: btoa(unescape(encodeURIComponent(sql))) }),
contentType: "application/json",
success: function(data) {
const devices = data.results || [];
const $container = $(containerSelector);
// end if nothing to show
if(devices.length == 0)
{
return;
}
$container.html(wrapperHtml);
const $table = $(`#${tableId}`);
const columns = [
{
title: assignMode ? getString('Network_ManageAssign') : getString('Network_ManageUnassign'),
data: 'devMac',
orderable: false,
width: '5%',
render: function (mac) {
// mac = mac.toLowerCase()
const label = assignMode ? 'assign' : 'unassign';
const btnClass = assignMode ? 'btn-primary' : 'btn-primary bg-red';
const btnText = assignMode ? getString('Network_ManageAssign') : getString('Network_ManageUnassign');
return `<button class="btn ${btnClass} btn-sm" data-myleafmac="${mac}" onclick="updateLeaf('${mac}','${label}')">
${btnText}
</button>`;
}
},
{
title: getString('Device_TableHead_Name'),
data: 'devName',
width: '15%',
render: function (name, type, device) {
return `<a href="./deviceDetails.php?mac=${device.devMac}" target="_blank">
<b class="anonymize">${name || '-'}</b>
</a>`;
}
},
{
title: getString('Device_TableHead_Status'),
data: 'devStatus',
width: '15%',
render: function (_, type, device) {
const badge = badgeFromDevice(device);
return `<a href="${badge.url}" class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.label}</a>`;
}
},
{
title: 'MAC',
data: 'devMac',
width: '5%',
render: (data) => `<span class="anonymize">${data}</span>`
},
{
title: getString('Network_Table_IP'),
data: 'devLastIP',
width: '5%'
},
{
title: getString('Device_TableHead_Port'),
data: 'devParentPort',
width: '5%'
},
{
title: getString('Device_TableHead_Vendor'),
data: 'devVendor',
width: '20%'
}
].filter(Boolean);
tableConfig = {
data: devices,
columns: columns,
pageLength: 10,
order: assignMode ? [[2, 'asc']] : [],
responsive: true,
autoWidth: false,
searching: true,
createdRow: function (row, data) {
$(row).attr('data-mac', data.devMac);
}
};
if ($.fn.DataTable.isDataTable($table)) {
$table.DataTable(tableConfig).clear().rows.add(devices).draw();
} else {
$table.DataTable(tableConfig);
}
},
error: function(xhr, status, error) {
console.error("Error loading device table:", status, error);
}
});
}
/**
* Load unassigned devices (devices without parent)
*/
function loadUnassignedDevices() {
const sql = `
SELECT devMac, devPresentLastScan, devName, devLastIP, devVendor, devAlertDown, devParentPort, devFlapping, devIsSleeping, devIsNew, devStatus
FROM DevicesView
WHERE (devParentMAC IS NULL OR devParentMAC IN ("", " ", "undefined", "null"))
AND LOWER(devMac) NOT LIKE "%internet%"
AND devIsArchived = 0
ORDER BY devName ASC`;
const wrapperHtml = `
<div class="content">
<div id="unassignedDevices" class="box box-aqua box-body table-responsive">
<section>
<h5><i class="fa-solid fa-plug-circle-xmark"></i> ${getString('Network_UnassignedDevices')}</h5>
<table id="unassignedDevicesTable" class="table table-striped" width="100%"></table>
</section>
</div>
</div>`;
loadDeviceTable({
sql,
containerSelector: '#unassigned-devices-wrapper',
tableId: 'unassignedDevicesTable',
wrapperHtml,
assignMode: true
});
}
/**
* Load devices connected to a specific node
* @param {string} node_mac - MAC address of the parent node
*/
function loadConnectedDevices(node_mac) {
// Standardize the input just in case
const normalized_mac = node_mac.toLowerCase();
const sql = `
SELECT devName, devMac, devLastIP, devVendor, devPresentLastScan, devAlertDown, devParentPort, devVlan, devFlapping, devIsSleeping, devIsNew, devIsArchived,
CASE
WHEN devIsNew = 1 THEN 'New'
WHEN devPresentLastScan = 1 THEN 'On-line'
WHEN devIsSleeping = 1 THEN 'Sleeping'
WHEN devPresentLastScan = 0 AND devAlertDown != 0 THEN 'Down'
WHEN devIsArchived = 1 THEN 'Archived'
WHEN devPresentLastScan = 0 THEN 'Off-line'
ELSE 'Unknown status'
END AS devStatus
FROM DevicesView
/* Using COLLATE NOCASE here solves the 'TEXT' vs 'NOCASE' mismatch */
WHERE devParentMac = '${normalized_mac}' COLLATE NOCASE`;
// Keep the ID generation consistent
const id = normalized_mac.replace(/:/g, '_');
const wrapperHtml = `
<table class="table table-bordered table-striped node-leafs-table " id="table_leafs_${id}" data-node-mac="${normalized_mac}">
</table>`;
loadDeviceTable({
sql,
containerSelector: `#leafs_${id}`,
tableId: `table_leafs_${id}`,
wrapperHtml,
assignMode: false
});
}

View File

@@ -1,135 +0,0 @@
// network-events.js
// Event handlers and tree node click interactions
/**
* Handle network node click - select correct tab and scroll to appropriate content
* @param {HTMLElement} el - The clicked element
*/
function handleNodeClick(el)
{
isNetworkDevice = $(el).data("devisnetworknodedynamic") == 1;
targetTabMAC = ""
thisDevMac= $(el).data("mac");
if (isNetworkDevice == false)
{
targetTabMAC = $(el).data("parentmac");
} else
{
targetTabMAC = thisDevMac;
}
var targetTab = $(`a[data-mytabmac="${targetTabMAC}"]`);
if (targetTab.length) {
// Simulate a click event on the target tab
targetTab.click();
}
if (isNetworkDevice) {
// Smooth scroll to the tab content
$('html, body').animate({
scrollTop: targetTab.offset().top - 50
}, 500); // Adjust the duration as needed
} else {
$("tr.selected").removeClass("selected");
$(`tr[data-mac="${thisDevMac}"]`).addClass("selected");
const tableId = "table_leafs_" + targetTabMAC.replace(/:/g, '_');
const $table = $(`#${tableId}`).DataTable();
// Find the row index (in the full data set) that matches
const rowIndex = $table
.rows()
.eq(0)
.filter(function(idx) {
return $table.row(idx).node().getAttribute("data-mac") === thisDevMac;
});
if (rowIndex.length > 0) {
// Change to the page where this row is
$table.page(Math.floor(rowIndex[0] / $table.page.len())).draw(false);
// Delay needed so the row is in the DOM after page draw
setTimeout(() => {
const rowNode = $table.row(rowIndex[0]).node();
$(rowNode).addClass("selected");
// Smooth scroll to the row
$('html, body').animate({
scrollTop: $(rowNode).offset().top - 50
}, 500);
}, 0);
}
}
}
/**
* Handle window resize events to recheck tab overflow
*/
let resizeTimeout;
$(window).on('resize', function () {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(() => {
checkTabsOverflow();
}, 100);
});
/**
* Initialize page on document ready
* Sets up toggle filters and event handlers
*/
$(document).ready(function () {
// Restore cached values on load
const cachedOffline = getCache(CACHE_KEYS.SHOW_OFFLINE);
if (cachedOffline !== null) {
$('input[name="showOffline"]').prop('checked', cachedOffline === 'true');
}
const cachedArchived = getCache(CACHE_KEYS.SHOW_ARCHIVED);
if (cachedArchived !== null) {
$('input[name="showArchived"]').prop('checked', cachedArchived === 'true');
}
// Function to enable/disable showArchived based on showOffline
function updateArchivedToggle() {
const isOfflineChecked = $('input[name="showOffline"]').is(':checked');
const archivedToggle = $('input[name="showArchived"]');
if (!isOfflineChecked) {
archivedToggle.prop('checked', false);
archivedToggle.prop('disabled', true);
setCache(CACHE_KEYS.SHOW_ARCHIVED, false);
} else {
archivedToggle.prop('disabled', false);
}
}
// Initial state on load
updateArchivedToggle();
// Bind change event for both toggles
$('input[name="showOffline"], input[name="showArchived"]').on('change', function () {
const name = $(this).attr('name');
const value = $(this).is(':checked');
// setCache(name, value) works because CACHE_KEYS.SHOW_OFFLINE === 'showOffline'
// and CACHE_KEYS.SHOW_ARCHIVED === 'showArchived' — matches the DOM input name attr.
setCache(name, value);
// Update state of showArchived if showOffline changed
if (name === 'showOffline') {
updateArchivedToggle();
}
// Refresh page after a brief delay to ensure cache is written
setTimeout(() => {
location.reload();
}, 100);
});
// init pop up hover boxes for device details
initHoverNodeInfo();
});

View File

@@ -1,152 +0,0 @@
// network-init.js
// Main initialization and data loading logic for network topology
// Global variables needed by other modules
var networkDeviceTypes = "";
var showArchived = false;
var showOffline = false;
/**
* Initialize network topology on page load
* Fetches all devices and sets up the tree visualization
*/
function initNetworkTopology() {
networkDeviceTypes = getSetting("NETWORK_DEVICE_TYPES").replace("[", "").replace("]", "");
showArchived = getCache(CACHE_KEYS.SHOW_ARCHIVED) === "true";
showOffline = getCache(CACHE_KEYS.SHOW_OFFLINE) === "true";
console.log('showArchived:', showArchived);
console.log('showOffline:', showOffline);
// Always get all devices
const rawSql = `
SELECT *,
LOWER(devMac) AS devMac,
LOWER(devParentMAC) AS devParentMAC,
CASE
WHEN devPresentLastScan = 1 THEN 'On-line'
WHEN devIsSleeping = 1 THEN 'Sleeping'
WHEN devAlertDown != 0 AND devPresentLastScan = 0 THEN 'Down'
ELSE 'Off-line'
END AS devStatus,
CASE
WHEN devType IN (${networkDeviceTypes}) THEN 1
ELSE 0
END AS devIsNetworkNodeDynamic
FROM DevicesView a
`;
const { token: apiToken, apiBase, authHeader } = getAuthContext();
// Verify token is available before making API call
if (!apiToken || apiToken.trim() === '') {
console.error("API_TOKEN not available. Settings may not be loaded yet. Retrying in 500ms...");
// Retry after a short delay to allow settings to load
setTimeout(() => {
initNetworkTopology();
}, 500);
return;
}
const url = `${apiBase}/dbquery/read`;
$.ajax({
url,
method: "POST",
headers: { ...authHeader, "Content-Type": "application/json" },
data: JSON.stringify({ rawSql: btoa(unescape(encodeURIComponent(rawSql))) }),
contentType: "application/json",
success: function(data) {
console.log(data);
const allDevices = data.results || [];
console.log(allDevices);
if (!allDevices || allDevices.length === 0) {
showModalOK(getString('Gen_Warning'), getString('Network_NoDevices'));
return;
}
// Count totals for UI
let archivedCount = 0;
let offlineCount = 0;
allDevices.forEach(device => {
if (parseInt(device.devIsArchived) === 1) archivedCount++;
if (parseInt(device.devPresentLastScan) === 0 && parseInt(device.devIsArchived) === 0) offlineCount++;
});
if(archivedCount > 0)
{
$('#showArchivedNumber').text(`(${archivedCount})`);
}
if(offlineCount > 0)
{
$('#showOfflineNumber').text(`(${offlineCount})`);
}
// Now apply UI filter based on toggles (always keep root)
const filteredDevices = allDevices.filter(device => {
const isRoot = (device.devMac || '').toLowerCase() === 'internet';
if (isRoot) return true;
if (!showArchived && parseInt(device.devIsArchived) === 1) return false;
if (!showOffline && parseInt(device.devPresentLastScan) === 0) return false;
return true;
});
// Sort filtered devices
const orderTopologyBy = createArray(getSetting("UI_TOPOLOGY_ORDER"));
const devicesSorted = filteredDevices.sort((a, b) => {
const parsePort = (port) => {
const parsed = parseInt(port, 10);
return isNaN(parsed) ? Infinity : parsed;
};
switch (orderTopologyBy[0]) {
case "Name":
// ensuring string
const nameA = (a.devName ?? "").toString();
const nameB = (b.devName ?? "").toString();
const nameCompare = nameA.localeCompare(nameB);
return nameCompare !== 0
? nameCompare
: parsePort(a.devParentPort) - parsePort(b.devParentPort);
case "Port":
return parsePort(a.devParentPort) - parsePort(b.devParentPort);
default:
return a.rowid - b.rowid;
}
});
setCache(CACHE_KEYS.DEVICES_TOPOLOGY, JSON.stringify(devicesSorted));
deviceListGlobal = devicesSorted;
// Render filtered result
initTree(getHierarchy());
loadNetworkNodes();
attachTreeEvents();
},
error: function(xhr, status, error) {
console.error("Error loading topology data:", status, error);
if (xhr.status === 401) {
console.error("Authorization failed! API_TOKEN may be invalid. Check that API_TOKEN setting is correct and not empty.");
showMessage("Authorization Failed: API_TOKEN setting may be invalid or not loaded. Please refresh the page.");
}
}
});
}
// Initialize on page load
$(document).ready(function () {
// show spinning icon
showSpinner();
// Start loading the network topology
initNetworkTopology();
});

View File

@@ -1,256 +0,0 @@
// network-tabs.js
// Tab management and tab content rendering functions
/**
* Render network tabs from nodes
* @param {Array} nodes - Array of network node objects
*/
function renderNetworkTabs(nodes) {
let html = '';
nodes.forEach((node, i) => {
const iconClass = node.devPresentLastScan == 1 ? "text-green" :
(node.devIsSleeping == 1 ? "text-aqua" :
(node.devAlertDown == 1 ? "text-red" : "text-gray50"));
const portLabel = node.node_ports_count ? ` (${node.node_ports_count})` : '';
const icon = atob(node.devIcon);
const id = node.devMac.replace(/:/g, '_');
html += `
<li class="networkNodeTabHeaders ${i === 0 ? 'active' : ''}">
<a href="#${id}" data-mytabmac="${node.devMac}" id="${id}_id" data-toggle="tab" title="${node.devName}">
<div class="icon ${iconClass}">${icon}</div>
<span class="node-name">${node.devName}</span>${portLabel}
</a>
</li>`;
});
$('.nav-tabs').html(html);
// populate tabs
renderNetworkTabContent(nodes);
// init selected (first) tab
initTab();
// init selected node highlighting
initSelectedNodeHighlighting()
// Register events on tab change
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
initSelectedNodeHighlighting()
});
}
/**
* Render content for each network tab
* @param {Array} nodes - Array of network node objects
*/
function renderNetworkTabContent(nodes) {
$('.tab-content').empty();
nodes.forEach((node, i) => {
const id = node.devMac.replace(/:/g, '_').toLowerCase();
const badge = badgeFromDevice(node);
const badgeHtml = `<a href="${badge.url}" class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.label}</a>`;
const parentId = node.devParentMAC.replace(/:/g, '_');
isRootNode = node.devParentMAC == "";
const paneHtml = `
<div class="tab-pane box box-aqua box-body ${i === 0 ? 'active' : ''}" id="${id}">
<h5><i class="fa fa-server"></i> ${getString('Network_Node')}</h5>
<div class="mb-3 row">
<label class="col-sm-3 col-form-label fw-bold">${getString('DevDetail_Tab_Details')}</label>
<div class="col-sm-9">
<a href="./deviceDetails.php?mac=${node.devMac}" target="_blank" class="anonymize">${node.devName}</a>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-3 col-form-label fw-bold">MAC</label>
<div class="col-sm-9 anonymize">${node.devMac}</div>
</div>
<div class="mb-3 row">
<label class="col-sm-3 col-form-label fw-bold">${getString('Device_TableHead_Type')}</label>
<div class="col-sm-9">${node.devType}</div>
</div>
<div class="mb-3 row">
<label class="col-sm-3 col-form-label fw-bold">${getString('Device_TableHead_Status')}</label>
<div class="col-sm-9">${badgeHtml}</div>
</div>
<div class="mb-3 row">
<label class="col-sm-3 col-form-label fw-bold">${getString('Network_Parent')}</label>
<div class="col-sm-9">
${isRootNode ? '' : `<a class="anonymize" href="#">`}
<span my-data-mac="${node.devParentMAC}" data-mac="${node.devParentMAC}" data-devIsNetworkNodeDynamic="1" onclick="handleNodeClick(this)">
${isRootNode ? getString('Network_Root') : getDevDataByMac(node.devParentMAC, "devName")}
</span>
${isRootNode ? '' : `</a>`}
</div>
</div>
<hr/>
<div class="box box-aqua box-body" id="connected">
<h5>
<i class="fa fa-sitemap fa-rotate-270"></i>
${getString('Network_Connected')}
</h5>
<div id="leafs_${id}" class="table-responsive"></div>
</div>
</div>
`;
$('.tab-content').append(paneHtml);
loadConnectedDevices(node.devMac);
});
}
/**
* Initialize the active tab based on cache or query parameter
*/
function initTab()
{
key = "activeNetworkTab"
// default selection
selectedTab = "Internet_id"
// the #target from the url
target = getQueryString('mac')
// update cookie if target specified
if(target != "")
{
setCache(key, target.replaceAll(":","_")+'_id') // _id is added so it doesn't conflict with AdminLTE tab behavior
}
// get the tab id from the cookie (already overridden by the target)
if(!emptyArr.includes(getCache(key)))
{
selectedTab = getCache(key);
}
// Activate panel
$('.nav-tabs a[id='+ selectedTab +']').tab('show');
// When changed save new current tab
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
setCache(key, $(e.target).attr('id'))
});
}
/**
* Highlight the currently selected node in the tree
*/
function initSelectedNodeHighlighting()
{
var currentNodeMac = $(".networkNodeTabHeaders.active a").data("mytabmac");
// change highlighted node in the tree
selNode = $("#networkTree .highlightedNode")[0]
console.log(selNode)
if(selNode)
{
$(selNode).attr('class', $(selNode).attr('class').replace('highlightedNode'))
}
newSelNode = $("#networkTree div[data-mac='"+currentNodeMac+"']")[0]
console.log(newSelNode)
$(newSelNode).attr('class', $(newSelNode).attr('class') + ' highlightedNode')
}
/**
* Update a device's network assignment
* @param {string} leafMac - MAC address of device to update
* @param {string} action - 'assign' or 'unassign'
*/
function updateLeaf(leafMac, action) {
console.log(leafMac); // child
console.log(action); // action
const nodeMac = $(".networkNodeTabHeaders.active a").data("mytabmac") || "";
if (action === "assign") {
if (!nodeMac) {
showMessage(getString("Network_Cant_Assign_No_Node_Selected"));
} else if (leafMac.toLowerCase().includes("internet")) {
showMessage(getString("Network_Cant_Assign"));
} else {
saveData("updateNetworkLeaf", leafMac, nodeMac);
setTimeout(() => location.reload(), 500);
}
} else if (action === "unassign") {
saveData("updateNetworkLeaf", leafMac, "");
setTimeout(() => location.reload(), 500);
} else {
console.warn("Unknown action:", action);
}
}
/**
* Dynamically show/hide tab names based on available space
* Hides tab names when tabs overflow, shows them again when space is available
*/
function checkTabsOverflow() {
const $ul = $('.nav-tabs');
const $lis = $ul.find('li');
// First measure widths with current state
let totalWidth = 0;
$lis.each(function () {
totalWidth += $(this).outerWidth(true);
});
const ulWidth = $ul.width();
const isOverflowing = totalWidth > ulWidth;
if (isOverflowing) {
if (!$ul.hasClass('hide-node-names')) {
$ul.addClass('hide-node-names');
// Re-check: did hiding fix it?
requestAnimationFrame(() => {
let newTotal = 0;
$lis.each(function () {
newTotal += $(this).outerWidth(true);
});
if (newTotal > $ul.width()) {
// Still overflowing — do nothing, keep class
}
});
}
} else {
if ($ul.hasClass('hide-node-names')) {
$ul.removeClass('hide-node-names');
// Re-check: did un-hiding break it?
requestAnimationFrame(() => {
let newTotal = 0;
$lis.each(function () {
newTotal += $(this).outerWidth(true);
});
if (newTotal > $ul.width()) {
// Oops, that broke it — re-hide
$ul.addClass('hide-node-names');
}
});
}
}
}

View File

@@ -1,354 +0,0 @@
// network-tree.js
// Tree hierarchy construction and rendering functions
// Global state variables
var leafNodesCount = 0;
var visibleNodesCount = 0;
var parentNodesCount = 0;
var hiddenMacs = []; // hidden children
var hiddenChildren = [];
var deviceListGlobal = null;
var myTree;
/**
* Recursively get children nodes and build a tree
* @param {Object} node - Current node
* @param {Array} list - Full device list
* @param {string} path - Path to current node
* @param {Array} visited - Visited nodes (for cycle detection)
* @returns {Object} Tree node with children
*/
function getChildren(node, list, path, visited = [])
{
var children = [];
// Check for infinite recursion by seeing if the node has been visited before
if (visited.includes(node.devMac.toLowerCase())) {
console.error("Infinite recursion detected at node:", node.devMac);
write_notification("[ERROR] ⚠ Infinite recursion detected. You probably have assigned the Internet node to another children node or to itself. Please open a new issue on GitHub and describe how you did it.", 'interrupt')
return { error: "Infinite recursion detected", node: node.devMac };
}
// Add current node to visited list
visited.push(node.devMac.toLowerCase());
// Loop through all items to find children of the current node
for (var i in list) {
const item = list[i];
const parentMac = item.devParentMAC?.toLowerCase() || ""; // null-safe
const nodeMac = node.devMac?.toLowerCase() || ""; // null-safe
if (parentMac != "" && parentMac == nodeMac && !hiddenMacs.includes(parentMac)) {
visibleNodesCount++;
// Process children recursively, passing a copy of the visited list
children.push(getChildren(list[i], list, path + ((path == "") ? "" : '|') + parentMac, visited));
}
}
// Track leaf and parent node counts
if (children.length == 0) {
leafNodesCount++;
} else {
parentNodesCount++;
}
// console.log(node);
return {
devName: node.devName,
path: path,
devMac: node.devMac,
devParentPort: node.devParentPort,
id: node.devMac,
devParentMAC: node.devParentMAC,
devIcon: node.devIcon,
devType: node.devType,
devIsNetworkNodeDynamic: node.devIsNetworkNodeDynamic,
devVendor: node.devVendor,
devLastConnection: node.devLastConnection,
devFirstConnection: node.devFirstConnection,
devLastIP: node.devLastIP,
devStatus: node.devStatus,
devPresentLastScan: node.devPresentLastScan,
devFlapping: node.devFlapping,
devAlertDown: node.devAlertDown,
devIsSleeping: node.devIsSleeping || 0,
devIsArchived: node.devIsArchived || 0,
devIsNew: node.devIsNew || 0,
hasChildren: children.length > 0 || hiddenMacs.includes(node.devMac),
devParentRelType: node.devParentRelType,
devVlan: node.devVlan,
devSSID: node.devSSID,
hiddenChildren: hiddenMacs.includes(node.devMac),
qty: children.length,
children: children
};
}
/**
* Build complete hierarchy starting from the Internet node
* @returns {Object} Root hierarchy object
*/
function getHierarchy()
{
// reset counters before rebuilding the hierarchy
leafNodesCount = 0;
visibleNodesCount = 0;
parentNodesCount = 0;
let internetNode = null;
for(i in deviceListGlobal)
{
if(deviceListGlobal[i].devMac.toLowerCase() == 'internet')
{
internetNode = deviceListGlobal[i];
return (getChildren(internetNode, deviceListGlobal, ''))
break;
}
}
if (!internetNode) {
showModalOk(
getString('Network_Configuration_Error'),
getString('Network_Root_Not_Configured')
);
console.error("getHierarchy(): Internet node not found");
return null;
}
}
/**
* Toggle collapse/expand state of a subtree
* @param {string} parentMac - MAC address of parent node to toggle
* @param {string} treePath - Path in tree (colon-separated)
*/
function toggleSubTree(parentMac, treePath)
{
treePath = treePath.split('|')
parentMac = parentMac.toLowerCase()
if(!hiddenMacs.includes(parentMac))
{
hiddenMacs.push(parentMac)
}
else
{
removeItemFromArray(hiddenMacs, parentMac)
}
updatedTree = getHierarchy()
myTree.refresh(updatedTree);
// re-attach any onclick events
attachTreeEvents();
}
/**
* Attach click events to tree collapse/expand controls
*/
function attachTreeEvents()
{
// toggle subtree functionality
$("div[data-mytreemac]").each(function(){
$(this).attr('onclick', 'toggleSubTree("'+$(this).attr('data-mytreemac')+'","'+ $(this).attr('data-mytreepath')+'")')
});
}
/**
* Convert pixels to em units
* @param {number} px - Pixel value
* @param {HTMLElement} element - Reference element for font-size
* @returns {number} Value in em units
*/
function pxToEm(px, element) {
var baseFontSize = parseFloat($(element || "body").css("font-size"));
return px / baseFontSize;
}
/**
* Convert em units to pixels
* @param {number} em - Value in em units
* @param {HTMLElement} element - Reference element for font-size
* @returns {number} Value in pixels (rounded)
*/
function emToPx(em, element) {
var baseFontSize = parseFloat($(element || "body").css("font-size"));
return Math.round(em * baseFontSize);
}
/**
* Initialize tree visualization
* @param {Object} myHierarchy - Hierarchy object to render
*/
function initTree(myHierarchy)
{
if(myHierarchy && myHierarchy.type !== "")
{
// calculate the drawing area based on the tree width and available screen size
let baseFontSize = parseFloat($('html').css('font-size'));
let treeAreaHeight = ($(window).height() - 155); ;
let minNodeWidth = 60 // min safe node width not breaking the tree
// calculate the font size of the leaf nodes to fit everything into the tree area
leafNodesCount == 0 ? 1 : leafNodesCount;
emSize = pxToEm((treeAreaHeight/(leafNodesCount)).toFixed(2));
// let screenWidthEm = pxToEm($('.networkTable').width()-15);
let minTreeWidthPx = parentNodesCount * minNodeWidth;
let actualWidthPx = $('.networkTable').width() - 15;
let finalWidthPx = Math.max(actualWidthPx, minTreeWidthPx);
// override original value
let screenWidthEm = pxToEm(finalWidthPx);
// handle canvas and node size if only a few nodes
emSize > 1 ? emSize = 1 : emSize = emSize;
let nodeHeightPx = emToPx(emSize*1);
let nodeWidthPx = emToPx(screenWidthEm / (parentNodesCount));
// handle if only a few nodes
nodeWidthPx > 160 ? nodeWidthPx = 160 : nodeWidthPx = nodeWidthPx;
if (nodeWidthPx < minNodeWidth) nodeWidthPx = minNodeWidth; // minimum safe width
console.log("Calculated nodeWidthPx =", nodeWidthPx, "emSize =", emSize , " screenWidthEm:", screenWidthEm, " emToPx(screenWidthEm):" , emToPx(screenWidthEm));
// init the drawing area size
$("#networkTree").attr('style', `height:${treeAreaHeight}px; width:${emToPx(screenWidthEm)}px`)
console.log(Treeviz);
myTree = Treeviz.create({
htmlId: "networkTree",
renderNode: nodeData => {
(!emptyArr.includes(nodeData.data.devParentPort)) ? port = nodeData.data.devParentPort : port = "";
(port == "" || port == 0 || port == 'None' ) ? portBckgIcon = `<i class="fa fa-wifi"></i>` : portBckgIcon = `<i class="fa fa-ethernet"></i>`;
portHtml = (port == "" || port == 0 || port == 'None' ) ? " &nbsp " : port;
// Build HTML for individual nodes in the network diagram
deviceIcon = (!emptyArr.includes(nodeData.data.devIcon)) ?
`<div class="netIcon">
${atob(nodeData.data.devIcon)}
</div>` : "";
devicePort = `<div class="netPort"
style="width:${emSize}em;height:${emSize}em">
${portHtml}</div>
<div class="portBckgIcon"
style="margin-left:-${emSize*0.7}em;">
${portBckgIcon}
</div>`;
collapseExpandIcon = nodeData.data.hiddenChildren ?
"square-plus" : "square-minus";
// generate +/- icon if node has children nodes
collapseExpandHtml = nodeData.data.hasChildren ?
`<div class="netCollapse"
style="font-size:${nodeHeightPx/2}px;top:${Math.floor(nodeHeightPx / 4)}px"
data-mytreepath="${nodeData.data.path}"
data-mytreemac="${nodeData.data.devMac}">
<i class="fa fa-${collapseExpandIcon} pointer"></i>
</div>` : "";
selectedNodeMac = $(".nav-tabs-custom .active a").attr('data-mytabmac')
highlightedCss = nodeData.data.devMac == selectedNodeMac ?
" highlightedNode " : "";
cssNodeType = nodeData.data.devIsNetworkNodeDynamic ?
" node-network-device " : " node-standard-device ";
networkHardwareIcon = nodeData.data.devIsNetworkNodeDynamic ? `<span class="network-hw-icon">
<i class="fa-solid fa-hard-drive"></i>
</span>` : "";
const badgeConf = badgeFromDevice(nodeData.data);
return result = `<div
class="node-inner hover-node-info box pointer ${highlightedCss} ${cssNodeType}"
style="height:${nodeHeightPx}px;font-size:${nodeHeightPx-5}px;"
onclick="handleNodeClick(this)"
data-mac="${nodeData.data.devMac}"
data-parentMac="${nodeData.data.devParentMAC}"
data-name="${nodeData.data.devName}"
data-ip="${nodeData.data.devLastIP}"
data-mac="${nodeData.data.devMac}"
data-vendor="${nodeData.data.devVendor}"
data-type="${nodeData.data.devType}"
data-devIsNetworkNodeDynamic="${nodeData.data.devIsNetworkNodeDynamic}"
data-lastseen="${nodeData.data.devLastConnection}"
data-firstseen="${nodeData.data.devFirstConnection}"
data-relationship="${nodeData.data.devParentRelType}"
data-flapping="${nodeData.data.devFlapping}"
data-sleeping="${nodeData.data.devIsSleeping || 0}"
data-archived="${nodeData.data.devIsArchived || 0}"
data-isnew="${nodeData.data.devIsNew || 0}"
data-status="${nodeData.data.devStatus}"
data-present="${nodeData.data.devPresentLastScan}"
data-alertdown="${nodeData.data.devAlertDown}"
data-icon="${nodeData.data.devIcon}"
>
<div class="netNodeText">
<strong><span>${devicePort} <span class="${badgeConf.cssText}">${deviceIcon}</span></span>
<span class="spanNetworkTree anonymizeDev" style="width:${nodeWidthPx-50}px">${nodeData.data.devName}</span>
${networkHardwareIcon}
</strong>
</div>
</div>
${collapseExpandHtml}`;
},
mainAxisNodeSpacing: 'auto',
// secondaryAxisNodeSpacing: 0.3,
nodeHeight: nodeHeightPx,
nodeWidth: nodeWidthPx,
marginTop: '5',
isHorizontal : true,
hasZoom: true,
hasPan: true,
marginLeft: '10',
marginRight: '10',
idKey: "devMac",
hasFlatData: false,
relationnalField: "children",
linkLabel: {
render: (parent, child) => {
// Return text or HTML to display on the connection line
connectionLabel = (child?.data.devVlan ?? "") + "/" + (child?.data.devSSID ?? "");
if(connectionLabel == "/")
{
connectionLabel = "";
}
return connectionLabel;
// or with HTML:
// return "<tspan><strong>reports to</strong></tspan>";
},
color: "#336c87ff", // Label text color (optional)
fontSize: nodeHeightPx - 5 // Label font size in px (optional)
},
linkWidth: (nodeData) => 2,
linkColor: (nodeData) => {
relConf = getRelationshipConf(nodeData.data.devParentRelType)
return relConf.color;
}
// onNodeClick: (nodeData) => handleNodeClick(nodeData),
});
console.log(deviceListGlobal);
myTree.refresh(myHierarchy);
// hide spinning icon
hideSpinner()
} else
{
console.error("getHierarchy() not returning expected result");
}
}

View File

@@ -165,27 +165,6 @@ class NetAlertXStateManager {
.html(displayTime) .html(displayTime)
.attr('data-build-time', buildTime); .attr('data-build-time', buildTime);
// 4. Trigger cache clear if settings were imported after last init
if (appState["settingsImported"]) {
const importedMs = parseInt(appState["settingsImported"] * 1000);
const lastReloaded = parseInt(getCache(CACHE_KEYS.INIT_TIMESTAMP));
if (importedMs > lastReloaded) {
console.log("[NetAlertX State] Settings changed — clearing cache and reloading");
setTimeout(() => clearCache(), 500);
}
}
// 5. Dispatch scan ETA update for pages that display next-scan timing
if (appState["last_scan_run"] !== undefined || appState["next_scan_time"] !== undefined) {
document.dispatchEvent(new CustomEvent('nax:scanEtaUpdate', {
detail: {
lastScanRun: appState["last_scan_run"],
nextScanTime: appState["next_scan_time"],
currentState: appState["currentState"]
}
}));
}
// console.log("[NetAlertX State] UI updated via jQuery"); // console.log("[NetAlertX State] UI updated via jQuery");
} catch (e) { } catch (e) {
console.error("[NetAlertX State] Failed to update state display:", e); console.error("[NetAlertX State] Failed to update state display:", e);

View File

@@ -8,100 +8,6 @@
----------------------------------------------------------------------------- */ ----------------------------------------------------------------------------- */
// -------------------------------------------------------------------
// Shared tab initialization utility.
// Resolves the active tab from URL hash, query param, or cache, then activates it.
//
// Options:
// cacheKey (string) - localStorage key for persisting the active tab (required)
// defaultTab (string) - fallback tab ID if nothing is found in URL or cache. Optional, defaults to ''.
// urlParamName (string) - query-string parameter name to read (e.g. 'tab'). Optional.
// useHash (boolean) - if true, reads window.location.hash as a tab target. Optional.
// idSuffix (string) - suffix appended to URL-derived targets to form the tab <a> id (e.g. '_id'). Optional.
// onTabChange (function) - callback(targetHref) invoked when a tab is shown. Optional.
// delay (number) - ms to delay initialization (wraps in setTimeout). Optional. 0 = immediate.
// tabContainer (string) - CSS selector to scope tab lookups and event binding. Optional. null = whole document.
//
// Returns nothing. Activates the resolved tab and binds cache persistence.
// -------------------------------------------------------------------
function initializeTabsShared(options) {
const {
cacheKey,
defaultTab = '',
urlParamName = null,
useHash = false,
idSuffix = '',
onTabChange = null,
delay = 0,
tabContainer = null // CSS selector to scope tab lookups (e.g. '#tabs-location')
} = options;
function run() {
let selectedTab = defaultTab;
// 1. URL hash (e.g. maintenance.php#tab_Logging)
if (useHash) {
let hashTarget = window.location.hash.substring(1);
if (hashTarget.includes('?')) {
hashTarget = hashTarget.split('?')[0];
}
if (hashTarget) {
selectedTab = hashTarget.endsWith(idSuffix) ? hashTarget : hashTarget + idSuffix;
setCache(cacheKey, selectedTab);
}
}
// 2. URL query parameter (e.g. ?tab=WEBMON)
if (urlParamName) {
const urlParams = new URLSearchParams(window.location.search);
const paramVal = urlParams.get(urlParamName);
if (paramVal) {
selectedTab = paramVal.endsWith(idSuffix) ? paramVal : paramVal + idSuffix;
setCache(cacheKey, selectedTab);
}
}
// 3. Cached value (may already have been overridden above)
const cached = getCache(cacheKey);
if (cached && !emptyArr.includes(cached)) {
selectedTab = cached;
}
// Resolve scoped vs global selectors
const $scope = tabContainer ? $(tabContainer) : $(document);
// Activate the resolved tab (no-op if selectedTab is empty or not found)
if (selectedTab) {
$scope.find('a[id="' + selectedTab + '"]').tab('show');
}
// Fire callback for initial tab
if (onTabChange && selectedTab) {
const initialHref = $scope.find('a[id="' + selectedTab + '"]').attr('href');
if (initialHref) {
onTabChange(initialHref);
}
}
// Persist future tab changes to cache and invoke callback
$scope.find('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
const newTabId = $(e.target).attr('id');
setCache(cacheKey, newTabId);
if (onTabChange) {
const newHref = $(e.target).attr('href');
onTabChange(newHref);
}
});
}
if (delay > 0) {
setTimeout(run, delay);
} else {
run();
}
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Utility function to generate a random API token in the format t_<random string of specified length> // Utility function to generate a random API token in the format t_<random string of specified length>
@@ -730,62 +636,70 @@ function showIconSelection(setKey) {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Get the correct db column code name based on table header title string. // Get the correct db column code name based on table header title string
// COLUMN_NAME_MAP is defined in device-columns.js, loaded before this file.
function getColumnNameFromLangString(headStringKey) { function getColumnNameFromLangString(headStringKey) {
return COLUMN_NAME_MAP[headStringKey] || ""; columnNameMap = {
"Device_TableHead_Name": "devName",
"Device_TableHead_Owner": "devOwner",
"Device_TableHead_Type": "devType",
"Device_TableHead_Icon": "devIcon",
"Device_TableHead_Favorite": "devFavorite",
"Device_TableHead_Group": "devGroup",
"Device_TableHead_FirstSession": "devFirstConnection",
"Device_TableHead_LastSession": "devLastConnection",
"Device_TableHead_LastIP": "devLastIP",
"Device_TableHead_MAC": "devMac",
"Device_TableHead_Status": "devStatus",
"Device_TableHead_MAC_full": "devMac",
"Device_TableHead_LastIPOrder": "devIpLong",
"Device_TableHead_Rowid": "rowid",
"Device_TableHead_Parent_MAC": "devParentMAC",
"Device_TableHead_Connected_Devices": "devParentChildrenCount",
"Device_TableHead_Location": "devLocation",
"Device_TableHead_Vendor": "devVendor",
"Device_TableHead_Port": "devParentPort",
"Device_TableHead_GUID": "devGUID",
"Device_TableHead_SyncHubNodeName": "devSyncHubNode",
"Device_TableHead_NetworkSite": "devSite",
"Device_TableHead_SSID": "devSSID",
"Device_TableHead_SourcePlugin": "devSourcePlugin",
"Device_TableHead_PresentLastScan": "devPresentLastScan",
"Device_TableHead_AlertDown": "devAlertDown",
"Device_TableHead_CustomProps": "devCustomProps",
"Device_TableHead_FQDN": "devFQDN",
"Device_TableHead_ParentRelType": "devParentRelType",
"Device_TableHead_ReqNicsOnline": "devReqNicsOnline",
"Device_TableHead_Vlan": "devVlan",
"Device_TableHead_IPv4": "devPrimaryIPv4",
"Device_TableHead_IPv6": "devPrimaryIPv6"
};
return columnNameMap[headStringKey] || "";
} }
//-------------------------------------------------------------- //--------------------------------------------------------------
// Generating the device status chip // Generating the device status chip
function getStatusBadgeParts(devPresentLastScan, devAlertDown, devFlapping, devMac, statusText = '', devIsSleeping = 0, devIsArchived = 0, devIsNew = 0) { function getStatusBadgeParts(devPresentLastScan, devAlertDown, devMac, statusText = '') {
let css = 'bg-gray text-white statusUnknown'; let css = 'bg-gray text-white statusUnknown';
let icon = '<i class="fa-solid fa-question"></i>'; let icon = '<i class="fa-solid fa-question"></i>';
let status = 'unknown'; let status = 'unknown';
let cssText = ''; let cssText = '';
let label = getString('Gen_Offline');
if (devPresentLastScan == 1 && devFlapping == 0) { if (devPresentLastScan == 1) {
css = 'bg-green text-white statusOnline'; css = 'bg-green text-white statusOnline';
cssText = 'text-green'; cssText = 'text-green';
icon = '<i class="fa-solid fa-plug"></i>'; icon = '<i class="fa-solid fa-plug"></i>';
status = 'online'; status = 'online';
label = getString('Gen_Online');
} else if (devPresentLastScan == 1 && devFlapping == 1) {
css = 'bg-yellow text-white statusFlapping';
cssText = 'text-yellow';
icon = '<i class="fa-solid fa-plug-circle-exclamation"></i>';
status = 'flapping';
label = getString('Gen_Flapping');
} else if (devIsSleeping == 1) {
css = 'bg-aqua text-white statusSleeping';
cssText = 'text-aqua';
icon = '<i class="fa-solid fa-moon"></i>';
status = 'sleeping';
label = getString('Gen_Sleeping');
} else if (devIsArchived == 1) {
css = 'bg-gray text-white statusArchived';
cssText = 'text-gray50';
icon = '<i class="fa-solid fa-box-archive"></i>';
status = 'archived';
label = getString('Gen_Archived');
} else if (devAlertDown == 1) { } else if (devAlertDown == 1) {
css = 'bg-red text-white statusDown'; css = 'bg-red text-white statusDown';
cssText = 'text-red'; cssText = 'text-red';
icon = '<i class="fa-solid fa-triangle-exclamation"></i>'; icon = '<i class="fa-solid fa-triangle-exclamation"></i>';
status = 'down'; status = 'down';
label = getString('Gen_Down');
} else if (devPresentLastScan != 1) { } else if (devPresentLastScan != 1) {
css = 'bg-gray text-white statusOffline'; css = 'bg-gray text-white statusOffline';
cssText = 'text-gray50'; cssText = 'text-gray50';
icon = '<i class="fa-solid fa-xmark"></i>'; icon = '<i class="fa-solid fa-xmark"></i>';
status = 'offline'; status = 'offline';
label = getString('Gen_Offline');
}
// New devices keep the online/offline color & icon but show "New" as label
if (devIsNew == 1) {
label = getString('Gen_New');
} }
const cleanedText = statusText.replace(/-/g, ''); const cleanedText = statusText.replace(/-/g, '');
@@ -793,36 +707,15 @@ function getStatusBadgeParts(devPresentLastScan, devAlertDown, devFlapping, devM
return { return {
cssClass: css, cssClass: css,
cssText: cssText, cssText: cssText,
iconHtml: icon, iconHtml: icon,
mac: devMac, mac: devMac,
text: cleanedText, text: cleanedText,
status: status, status: status,
label: label, url: url
url: url
}; };
} }
// Convenience wrappers — call getStatusBadgeParts with the right fields
// for each object shape used across the codebase.
// Any object with devXxx field names (API response, cache, SQL DevicesView row,
// network-api nodes, network-tree nodeData.data objects)
function badgeFromDevice(d) {
return getStatusBadgeParts(
d.devPresentLastScan, d.devAlertDown, d.devFlapping, d.devMac,
'', d.devIsSleeping || 0, d.devIsArchived || 0, d.devIsNew || 0
);
}
// hover-box: reads status fields from jQuery data-* attributes on an element
function badgeFromDataAttrs($el) {
return getStatusBadgeParts(
$el.data('present'), $el.data('alertdown'), $el.data('flapping') || 0, $el.data('mac'),
'', $el.data('sleeping') || 0, $el.data('archived') || 0, $el.data('isnew') || 0
);
}
//-------------------------------------------------------------- //--------------------------------------------------------------
// Getting the color and css class for device relationships // Getting the color and css class for device relationships
function getRelationshipConf(relType) { function getRelationshipConf(relType) {
@@ -968,7 +861,11 @@ function renderDeviceLink(data, container, useName = false) {
} }
// Build and return badge parts // Build and return badge parts
const badge = badgeFromDevice(device); const badge = getStatusBadgeParts(
device.devPresentLastScan,
device.devAlertDown,
device.devMac
);
// badge class and hover-info class to container // badge class and hover-info class to container
$(container) $(container)
@@ -983,12 +880,8 @@ function renderDeviceLink(data, container, useName = false) {
'data-firstseen': device.devFirstConnection, 'data-firstseen': device.devFirstConnection,
'data-relationship': device.devParentRelType, 'data-relationship': device.devParentRelType,
'data-status': device.devStatus, 'data-status': device.devStatus,
'data-flapping': device.devFlapping,
'data-present': device.devPresentLastScan, 'data-present': device.devPresentLastScan,
'data-alertdown': device.devAlertDown, 'data-alert': device.devAlertDown,
'data-sleeping': device.devIsSleeping || 0,
'data-archived': device.devIsArchived || 0,
'data-isnew': device.devIsNew || 0,
'data-icon': device.devIcon 'data-icon': device.devIcon
}); });
@@ -1057,8 +950,8 @@ function initHoverNodeInfo() {
const lastseen = $el.data('lastseen') || 'Unknown'; const lastseen = $el.data('lastseen') || 'Unknown';
const firstseen = $el.data('firstseen') || 'Unknown'; const firstseen = $el.data('firstseen') || 'Unknown';
const relationship = $el.data('relationship') || 'Unknown'; const relationship = $el.data('relationship') || 'Unknown';
const badge = badgeFromDataAttrs($el); const badge = getStatusBadgeParts( $el.data('present'), $el.data('alert'), $el.data('mac'))
const status =`<span class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.label}</span>` const status =`<span class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.status}</span>`
const html = ` const html = `
<div> <div>

View File

@@ -1,48 +0,0 @@
# For Humans
To set up MCP access for your AI Agent:
1. Tell it to "Please go here and set up MCP using HOST:BACKEND_PORT <link to this page>"
-or-
2. Copy and paste the contents of this page and let it know your HOST and API token.
---
# For AI Agents: NetAlertX MCP Setup
NetAlertX is a network monitoring system. Connect to its **MCP (Model Context Protocol) server** for live access to devices, scans, and events.
## 1. Gather Connection Details
Ask the user for the following if not provided:
1. **API Token:** Found in **`/settings.php`** under **System / API**. If you were directed to this server, try to browse to /settings.php on your own.
2. **MCP URL:** Typically `http://<HOST>:20212/mcp/sse`. (The UI is usually on port `20211`, and the MCP/GraphQL backend is on `20212`).
*Note: Test HTTP connectivity. If port `20212` fails, ask the user if the `GRAPHQL_PORT` was changed in settings or if a reverse proxy is used.*
## 2. Configure MCP Client
Use the gathered details to configure your MCP connection:
```json
{
"mcpServers": {
"netalertx": {
"url": "http://<HOST>:<GRAPHQL_PORT>/mcp/sse",
"headers": {
"Authorization": "Bearer <API_TOKEN>"
}
}
}
}
```
## 3. Capabilities
Once connected, you can:
- Query and manage devices (search, filter, MAC details, Wake-on-LAN).
- Trigger network scans (ARP, NMAP, Avahi).
- Manage events, sessions, and notifications.
## 4. Important Notes
- **UI Refresh:** When you modify data, tell the user to click the in-app refresh button (🔄) to see changes.
- **REST API Fallback:** If MCP is unavailable, retrieve the OpenAPI spec from `http://<HOST>:<GRAPHQL_PORT>/openapi.json` to discover available endpoints, then call those endpoints with `Authorization: Bearer <API_TOKEN>`. This approach is context-heavy and manual, so use it as a last resort.
- **Authentication:** The API token is distinct from the UI login password and must be obtained/changed in the frontend /settings.php

View File

@@ -778,14 +778,50 @@ function scrollDown() {
// General initialization // General initialization
// -------------------------------------------------------- // --------------------------------------------------------
function initializeTabs() { function initializeTabs() {
initializeTabsShared({ setTimeout(() => {
cacheKey: 'activeMaintenanceTab', const key = "activeMaintenanceTab";
defaultTab: 'tab_DBTools_id',
useHash: true, // default selection
idSuffix: '_id', let selectedTab = "tab_DBTools_id";
delay: 50
}); // the #target from the URL
setTimeout(() => hideSpinner(), 50); let target = window.location.hash.substr(1);
console.log(selectedTab);
// get only the part between #...?
if (target.includes('?')) {
target = target.split('?')[0];
}
// update cookie if target specified
if (target) {
selectedTab = target.endsWith("_id") ? target : `${target}_id`;
setCache(key, selectedTab); // _id is added so it doesn't conflict with AdminLTE tab behavior
}
// get the tab id from the cookie (already overridden by the target)
const cachedTab = getCache(key);
if (cachedTab && !emptyArr.includes(cachedTab)) {
selectedTab = cachedTab;
}
// Activate panel
$('.nav-tabs a[id='+ selectedTab +']').tab('show');
// When changed save new current tab
$('a[data-toggle="tab"]').on('shown.bs.tab', (e) => {
const newTabId = $(e.target).attr('id');
setCache(key, newTabId);
});
// events on tab change
$('a[data-toggle="tab"]').on('shown.bs.tab', (e) => {
const newTarget = $(e.target).attr("href"); // activated tab
});
hideSpinner();
}, 50);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -859,10 +895,10 @@ window.onload = function asyncFooter() {
initializeTabs(); initializeTabs();
try { try {
$("#lastCommit").append('<a href="https://github.com/netalertx/NetAlertX/commits" target="_blank"><img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/jokob-sk/netalertx/main?logo=github"></a>'); $("#lastCommit").append('<a href="https://github.com/jokob-sk/NetAlertX/commits" target="_blank"><img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/jokob-sk/netalertx/main?logo=github"></a>');
$("#lastDockerUpdate").append( $("#lastDockerUpdate").append(
'<a href="https://github.com/netalertx/NetAlertX/releases" target="_blank"><img alt="Docker last pushed" src="https://img.shields.io/github/v/release/jokob-sk/NetAlertX?color=0aa8d2&logoColor=fff&logo=GitHub&label=Latest"></a>'); '<a href="https://github.com/jokob-sk/NetAlertX/releases" target="_blank"><img alt="Docker last pushed" src="https://img.shields.io/github/v/release/jokob-sk/NetAlertX?color=0aa8d2&logoColor=fff&logo=GitHub&label=Latest"></a>');
} catch (error) { } catch (error) {
console.error('Failed to load GitHub badges:', error); console.error('Failed to load GitHub badges:', error);
} }

View File

@@ -240,8 +240,8 @@
// Initialize device selectors / pickers fields // Initialize device selectors / pickers fields
function initDeviceSelectors() { function initDeviceSelectors() {
// Parse device list using the shared helper // Parse device list
devicesList = parseDeviceCache(getCache('devicesListAll_JSON')); devicesList = JSON.parse(getCache('devicesListAll_JSON'));
// Check if the device list exists and is an array // Check if the device list exists and is an array
if (Array.isArray(devicesList)) { if (Array.isArray(devicesList)) {

File diff suppressed because it is too large Load Diff

View File

@@ -14,13 +14,12 @@ function renderSmallBox($params) {
$labelLang = isset($params['labelLang']) ? $params['labelLang'] : ''; $labelLang = isset($params['labelLang']) ? $params['labelLang'] : '';
$iconId = isset($params['iconId']) ? $params['iconId'] : ''; $iconId = isset($params['iconId']) ? $params['iconId'] : '';
$iconClass = isset($params['iconClass']) ? $params['iconClass'] : ''; $iconClass = isset($params['iconClass']) ? $params['iconClass'] : '';
$iconHtml = isset($params['iconHtml']) ? $params['iconHtml'] : '';
$dataValue = isset($params['dataValue']) ? $params['dataValue'] : ''; $dataValue = isset($params['dataValue']) ? $params['dataValue'] : '';
return ' return '
<div class="col-lg-3 col-sm-6 col-xs-6"> <div class="col-lg-3 col-sm-6 col-xs-6">
<div style="cursor:pointer" onclick="javascript: ' . htmlspecialchars($onclickEvent) . '"> <a href="#" onclick="javascript: ' . htmlspecialchars($onclickEvent) . '">
<div class="small-box ' . htmlspecialchars($color) . '" style="pointer-events:none"> <div class="small-box ' . htmlspecialchars($color) . '">
<div class="inner"> <div class="inner">
<div class="col-lg-6 col-sm-6 col-xs-6"> <div class="col-lg-6 col-sm-6 col-xs-6">
<div class="small-box-text col-lg-12 col-sm-12 col-xs-12" id="' . htmlspecialchars($headerId) . '" style="' . htmlspecialchars($headerStyle) . '"> <b>' . htmlspecialchars($dataValue) . '</b> </div> <div class="small-box-text col-lg-12 col-sm-12 col-xs-12" id="' . htmlspecialchars($headerId) . '" style="' . htmlspecialchars($headerStyle) . '"> <b>' . htmlspecialchars($dataValue) . '</b> </div>
@@ -28,10 +27,10 @@ function renderSmallBox($params) {
<div class="infobox_label col-lg-6 col-sm-6 col-xs-6">' . lang(htmlspecialchars($labelLang)) . '</div> <div class="infobox_label col-lg-6 col-sm-6 col-xs-6">' . lang(htmlspecialchars($labelLang)) . '</div>
</div> </div>
<div class="icon"> <div class="icon">
' . ($iconHtml ? $iconHtml : '<i id="' . htmlspecialchars($iconId) . '" class="' . htmlspecialchars($iconClass) . '"></i>') . ' <i id="' . htmlspecialchars($iconId) . '" class="' . htmlspecialchars($iconClass) . '"></i>
</div> </div>
</div> </div>
</div> </a>
</div>'; </div>';
} }

View File

@@ -1,38 +0,0 @@
<?php
// ---- IMPORTS ----
// Check if authenticated - also populates $api_token and $configLines from app.conf
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
// getSettingValue() reads from Python-generated table_settings.json (reliable runtime source)
require_once dirname(__FILE__) . '/init.php';
// ---- IMPORTS ----
// Only respond to GET requests
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
http_response_code(405);
header('Content-Type: application/json');
echo json_encode(['error' => 'Method not allowed']);
exit;
}
// API_TOKEN: security.php extracts it from app.conf but the value is empty until Python
// initialise.py runs. Fall back to table_settings.json (runtime source of truth).
$resolved_token = !empty($api_token) ? $api_token : getSettingValue('API_TOKEN');
// GRAPHQL_PORT: format in app.conf is bare integer — GRAPHQL_PORT=20212 (no quotes)
$graphql_port_raw = getConfigLine('/^GRAPHQL_PORT\s*=/', $configLines);
$graphql_port = isset($graphql_port_raw[1]) ? (int) trim($graphql_port_raw[1]) : 20212;
// Validate we have something useful before returning
if (empty($resolved_token) || str_starts_with($resolved_token, 'Could not')) {
http_response_code(500);
header('Content-Type: application/json');
echo json_encode(['error' => 'Could not read API_TOKEN from configuration']);
exit;
}
header('Content-Type: application/json');
echo json_encode([
'api_token' => $resolved_token,
'graphql_port' => $graphql_port,
]);

View File

@@ -77,7 +77,7 @@ function saveSettings()
$txt = $txt."# Generated: ".$timestamp." #\n"; $txt = $txt."# Generated: ".$timestamp." #\n";
$txt = $txt."# #\n"; $txt = $txt."# #\n";
$txt = $txt."# Config file for the LAN intruder detection app: #\n"; $txt = $txt."# Config file for the LAN intruder detection app: #\n";
$txt = $txt."# https://github.com/netalertx/NetAlertX #\n"; $txt = $txt."# https://github.com/jokob-sk/NetAlertX #\n";
$txt = $txt."# #\n"; $txt = $txt."# #\n";
$txt = $txt."#-----------------AUTOGENERATED FILE-----------------#\n"; $txt = $txt."#-----------------AUTOGENERATED FILE-----------------#\n";

View File

@@ -24,10 +24,11 @@
<!-- NetAlertX footer with url --> <!-- NetAlertX footer with url -->
<a href="https://github.com/jokob-sk/NetAlertX" target="_blank">Net<b>Alert</b><sup>x</sup></a> <a href="https://github.com/jokob-sk/NetAlertX" target="_blank">Net<b>Alert</b><sup>x</sup></a>
<!-- To the right --> <!-- To the right -->
<div class="pull-right no-hidden-xs"> <div class="pull-right no-hidden-xs">
| <a href="https://gurubase.io/g/netalertx" class="pointer" target="_blank" title="Ask AI"><i class="fa fa-comment-dots fa-flip-horizontal"></i></a> | <a href="https://gurubase.io/g/netalertx" class="pointer" target="_blank" title="Ask AI"><i class="fa fa-comment-dots fa-flip-horizontal"></i></a>
| <a href="/llms.txt" class="pointer" target="_blank" data-agent-role="mcp-setup" aria-label="Agentic MCP instructions" title="Agent MCP Instructions"><i class="fa fa-robot"></i></a>
| <a href="https://docs.netalertx.com/" class="pointer" target="_blank" title="Documentation"><i class="fa fa-book"></i></a> | <a href="https://docs.netalertx.com/" class="pointer" target="_blank" title="Documentation"><i class="fa fa-book"></i></a>
| <a href="https://github.com/jokob-sk/NetAlertX/issues" class="pointer" target="_blank"><i class="fa fa-bug" title="Report a bug"></i></a> | <a href="https://github.com/jokob-sk/NetAlertX/issues" class="pointer" target="_blank"><i class="fa fa-bug" title="Report a bug"></i></a>
| <a href="https://discord.com/invite/NczTUTWyRr" class="pointer" target="_blank"><i class="fa-brands fa-discord" title="Join Discord"></i></a> | <a href="https://discord.com/invite/NczTUTWyRr" class="pointer" target="_blank"><i class="fa-brands fa-discord" title="Join Discord"></i></a>
@@ -55,7 +56,6 @@
<!-- NetAlertX --> <!-- NetAlertX -->
<script defer src="js/handle_version.js"></script> <script defer src="js/handle_version.js"></script>
<script src="js/device-columns.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<script src="js/ui_components.js?v=<?php include 'php/templates/version.php'; ?>"></script> <script src="js/ui_components.js?v=<?php include 'php/templates/version.php'; ?>"></script>

View File

@@ -43,10 +43,7 @@
<script src="lib/datatables.net-bs/js/dataTables.bootstrap.min.js"></script> <script src="lib/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
<script src="lib/datatables.net/js/dataTables.select.min.js"></script> <script src="lib/datatables.net/js/dataTables.select.min.js"></script>
<script>window.NAX_APP_VERSION = "<?php echo trim(file_exists('/app/.VERSION') ? file_get_contents('/app/.VERSION') : 'dev'); ?>";</script>
<script src="js/cache.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<script src="js/common.js?v=<?php include 'php/templates/version.php'; ?>"></script> <script src="js/common.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<script src="js/app-init.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<script src="js/sse_manager.js?v=<?php include 'php/templates/version.php'; ?>"></script> <script src="js/sse_manager.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<script src="js/api.js?v=<?php include 'php/templates/version.php'; ?>"></script> <script src="js/api.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<script src="js/modal.js?v=<?php include 'php/templates/version.php'; ?>"></script> <script src="js/modal.js?v=<?php include 'php/templates/version.php'; ?>"></script>
@@ -317,9 +314,6 @@
<li> <li>
<a href="devices.php#archived" onclick="forceLoadUrl('devices.php#archived')" > <?= lang("Device_Shortcut_Archived");?> </a> <a href="devices.php#archived" onclick="forceLoadUrl('devices.php#archived')" > <?= lang("Device_Shortcut_Archived");?> </a>
</li> </li>
<li>
<a href="devices.php#unstable_devices" onclick="forceLoadUrl('devices.php#unstable_devices')" > <?= lang("Device_Shortcut_Unstable");?> </a>
</li>
<li> <li>
<a href="devices.php#all_devices" onclick="forceLoadUrl('devices.php#all_devices')" > <?= lang("Gen_All_Devices");?> </a> <a href="devices.php#all_devices" onclick="forceLoadUrl('devices.php#all_devices')" > <?= lang("Gen_All_Devices");?> </a>
</li> </li>

View File

@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "إجراءات جماعية", "Device_MultiEdit_MassActions": "إجراءات جماعية",
"Device_MultiEdit_No_Devices": "لم يتم تحديد أي أجهزة.", "Device_MultiEdit_No_Devices": "لم يتم تحديد أي أجهزة.",
"Device_MultiEdit_Tooltip": "تعديل الأجهزة المحددة", "Device_MultiEdit_Tooltip": "تعديل الأجهزة المحددة",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "", "Device_Save_Failed": "",
"Device_Save_Unauthorized": "", "Device_Save_Unauthorized": "",
"Device_Saved_Success": "", "Device_Saved_Success": "",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "بحث", "Device_Searchbox": "بحث",
"Device_Shortcut_AllDevices": "جميع الأجهزة", "Device_Shortcut_AllDevices": "جميع الأجهزة",
"Device_Shortcut_AllNodes": "جميع العقد", "Device_Shortcut_AllNodes": "جميع العقد",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "المفضلة", "Device_Shortcut_Favorites": "المفضلة",
"Device_Shortcut_NewDevices": "أجهزة جديدة", "Device_Shortcut_NewDevices": "أجهزة جديدة",
"Device_Shortcut_OnlineChart": "مخطط الاتصال", "Device_Shortcut_OnlineChart": "مخطط الاتصال",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "تنبيه عدم الاتصال", "Device_TableHead_AlertDown": "تنبيه عدم الاتصال",
"Device_TableHead_Connected_Devices": "الأجهزة المتصلة", "Device_TableHead_Connected_Devices": "الأجهزة المتصلة",
"Device_TableHead_CustomProps": "خصائص مخصصة", "Device_TableHead_CustomProps": "خصائص مخصصة",
"Device_TableHead_FQDN": "اسم النطاق الكامل", "Device_TableHead_FQDN": "اسم النطاق الكامل",
"Device_TableHead_Favorite": "مفضل", "Device_TableHead_Favorite": "مفضل",
"Device_TableHead_FirstSession": "أول جلسة", "Device_TableHead_FirstSession": "أول جلسة",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "معرف فريد", "Device_TableHead_GUID": "معرف فريد",
"Device_TableHead_Group": "المجموعة", "Device_TableHead_Group": "المجموعة",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "إضافة جهاز", "Gen_AddDevice": "إضافة جهاز",
"Gen_Add_All": "إضافة الكل", "Gen_Add_All": "إضافة الكل",
"Gen_All_Devices": "جميع الأجهزة", "Gen_All_Devices": "جميع الأجهزة",
"Gen_Archived": "",
"Gen_AreYouSure": "هل أنت متأكد؟", "Gen_AreYouSure": "هل أنت متأكد؟",
"Gen_Backup": "نسخة احتياطية", "Gen_Backup": "نسخة احتياطية",
"Gen_Cancel": "إلغاء", "Gen_Cancel": "إلغاء",
@@ -333,16 +324,13 @@
"Gen_Delete": "حذف", "Gen_Delete": "حذف",
"Gen_DeleteAll": "حذف الكل", "Gen_DeleteAll": "حذف الكل",
"Gen_Description": "الوصف", "Gen_Description": "الوصف",
"Gen_Down": "",
"Gen_Error": "خطأ", "Gen_Error": "خطأ",
"Gen_Filter": "تصفية", "Gen_Filter": "تصفية",
"Gen_Flapping": "",
"Gen_Generate": "إنشاء", "Gen_Generate": "إنشاء",
"Gen_InvalidMac": "عنوان MAC غير صالح.", "Gen_InvalidMac": "عنوان MAC غير صالح.",
"Gen_Invalid_Value": "تم إدخال قيمة غير صالحة", "Gen_Invalid_Value": "تم إدخال قيمة غير صالحة",
"Gen_LockedDB": "قاعدة البيانات مقفلة", "Gen_LockedDB": "قاعدة البيانات مقفلة",
"Gen_NetworkMask": "قناع الشبكة", "Gen_NetworkMask": "قناع الشبكة",
"Gen_New": "",
"Gen_Offline": "غير متصل", "Gen_Offline": "غير متصل",
"Gen_Okay": "موافق", "Gen_Okay": "موافق",
"Gen_Online": "متصل", "Gen_Online": "متصل",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "اختيار أيقونة", "Gen_SelectIcon": "اختيار أيقونة",
"Gen_SelectToPreview": "اختر للمعاينة", "Gen_SelectToPreview": "اختر للمعاينة",
"Gen_Selected_Devices": "الأجهزة المحددة", "Gen_Selected_Devices": "الأجهزة المحددة",
"Gen_Sleeping": "",
"Gen_Subnet": "الشبكة الفرعية", "Gen_Subnet": "الشبكة الفرعية",
"Gen_Switch": "تبديل", "Gen_Switch": "تبديل",
"Gen_Upd": "تحديث", "Gen_Upd": "تحديث",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "حماية الويب", "PIALERT_WEB_PROTECTION_name": "حماية الويب",
"PLUGINS_KEEP_HIST_description": "الاحتفاظ بسجل المكونات الإضافية", "PLUGINS_KEEP_HIST_description": "الاحتفاظ بسجل المكونات الإضافية",
"PLUGINS_KEEP_HIST_name": "سجل المكونات الإضافية", "PLUGINS_KEEP_HIST_name": "سجل المكونات الإضافية",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "حذف الكل", "Plugins_DeleteAll": "حذف الكل",
"Plugins_Filters_Mac": "تصفية عنوان MAC", "Plugins_Filters_Mac": "تصفية عنوان MAC",
"Plugins_History": "السجل", "Plugins_History": "السجل",
@@ -804,4 +789,4 @@
"settings_system_label": "نظام", "settings_system_label": "نظام",
"settings_update_item_warning": "قم بتحديث القيمة أدناه. احرص على اتباع التنسيق السابق. <b>لم يتم إجراء التحقق.</b>", "settings_update_item_warning": "قم بتحديث القيمة أدناه. احرص على اتباع التنسيق السابق. <b>لم يتم إجراء التحقق.</b>",
"test_event_tooltip": "احفظ التغييرات أولاً قبل اختبار الإعدادات." "test_event_tooltip": "احفظ التغييرات أولاً قبل اختبار الإعدادات."
} }

View File

@@ -27,8 +27,8 @@
"AppEvents_ObjectType": "Tipus d'objecte", "AppEvents_ObjectType": "Tipus d'objecte",
"AppEvents_Plugin": "Plugin", "AppEvents_Plugin": "Plugin",
"AppEvents_Type": "Tipus", "AppEvents_Type": "Tipus",
"BACKEND_API_URL_description": "S'utilitza per permetre la comunicació del frontend al backend. Per defecte establert en <code>/server</code> i no cal canviar-ho.", "BACKEND_API_URL_description": "",
"BACKEND_API_URL_name": "URL del API Backend", "BACKEND_API_URL_name": "",
"BackDevDetail_Actions_Ask_Run": "Vol executar aquesta comanda?", "BackDevDetail_Actions_Ask_Run": "Vol executar aquesta comanda?",
"BackDevDetail_Actions_Not_Registered": "Comanda no registrada: ", "BackDevDetail_Actions_Not_Registered": "Comanda no registrada: ",
"BackDevDetail_Actions_Title_Run": "Executar la comanda", "BackDevDetail_Actions_Title_Run": "Executar la comanda",
@@ -98,10 +98,10 @@
"DevDetail_MainInfo_Network": "<i class=\"fa fa-server\"></i> Node (MAC)", "DevDetail_MainInfo_Network": "<i class=\"fa fa-server\"></i> Node (MAC)",
"DevDetail_MainInfo_Network_Port": "<i class=\"fa fa-ethernet\"></i> Port", "DevDetail_MainInfo_Network_Port": "<i class=\"fa fa-ethernet\"></i> Port",
"DevDetail_MainInfo_Network_Site": "Lloc web", "DevDetail_MainInfo_Network_Site": "Lloc web",
"DevDetail_MainInfo_Network_Title": "Detalls de Xarxa", "DevDetail_MainInfo_Network_Title": "Xarxa",
"DevDetail_MainInfo_Owner": "Propietari", "DevDetail_MainInfo_Owner": "Propietari",
"DevDetail_MainInfo_SSID": "SSID", "DevDetail_MainInfo_SSID": "SSID",
"DevDetail_MainInfo_Title": "Informació del dispositiu", "DevDetail_MainInfo_Title": "Informació principal",
"DevDetail_MainInfo_Type": "Tipus", "DevDetail_MainInfo_Type": "Tipus",
"DevDetail_MainInfo_Vendor": "Venedor", "DevDetail_MainInfo_Vendor": "Venedor",
"DevDetail_MainInfo_mac": "MAC", "DevDetail_MainInfo_mac": "MAC",
@@ -109,7 +109,7 @@
"DevDetail_Network_Node_hover": "Seleccioneu el dispositiu de xarxa al qual aquest dispositiu està connectat, per poder omplir l'arbre de xarxa.", "DevDetail_Network_Node_hover": "Seleccioneu el dispositiu de xarxa al qual aquest dispositiu està connectat, per poder omplir l'arbre de xarxa.",
"DevDetail_Network_Port_hover": "El port on el dispositiu està connectat al dispositiu de xarxa del pare. Si es deixa buit, sortirà una icona wifi a la representació de la Xarxa.", "DevDetail_Network_Port_hover": "El port on el dispositiu està connectat al dispositiu de xarxa del pare. Si es deixa buit, sortirà una icona wifi a la representació de la Xarxa.",
"DevDetail_Nmap_Scans": "Escaneig manual Nmap", "DevDetail_Nmap_Scans": "Escaneig manual Nmap",
"DevDetail_Nmap_Scans_desc": "Aquí podeu executar les exploracions NMAP manuals. També podeu programar les exploracions NMAP automàtiques a través del connector Serveis i Ports (NMAP). Ves a <a href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_scan\" target='_blank'>Docs</a> per saber-ne més", "DevDetail_Nmap_Scans_desc": "Aquí podeu executar les exploracions NMAP manuals. També podeu programar les exploracions NMAP automàtiques a través del connector Serveis i Ports (NMAP). Ves a <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target='_blank'>Docs</a> per saber-ne més",
"DevDetail_Nmap_buttonDefault": "Escaneig predeterminat", "DevDetail_Nmap_buttonDefault": "Escaneig predeterminat",
"DevDetail_Nmap_buttonDefault_text": "Escaneig predeterminat: Nmap escaneja els 1000 ports superiors per a cada protocol d'exploració sol·licitat. El 93% dels ports TCP i el 49% dels ports UDP. (uns 5 segons)", "DevDetail_Nmap_buttonDefault_text": "Escaneig predeterminat: Nmap escaneja els 1000 ports superiors per a cada protocol d'exploració sol·licitat. El 93% dels ports TCP i el 49% dels ports UDP. (uns 5 segons)",
"DevDetail_Nmap_buttonDetail": "Escaneig Detallat", "DevDetail_Nmap_buttonDetail": "Escaneig Detallat",
@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "Accions massives:", "Device_MultiEdit_MassActions": "Accions massives:",
"Device_MultiEdit_No_Devices": "Cap dispositiu seleccionat.", "Device_MultiEdit_No_Devices": "Cap dispositiu seleccionat.",
"Device_MultiEdit_Tooltip": "Atenció. Si feu clic a això s'aplicarà el valor de l'esquerra a tots els dispositius seleccionats a dalt.", "Device_MultiEdit_Tooltip": "Atenció. Si feu clic a això s'aplicarà el valor de l'esquerra a tots els dispositius seleccionats a dalt.",
"Device_NextScan_Imminent": "", "Device_Save_Failed": "",
"Device_NextScan_In": "", "Device_Save_Unauthorized": "",
"Device_NoData_Help": "", "Device_Saved_Success": "",
"Device_NoData_Scanning": "", "Device_Saved_Unexpected": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "Problemes guardant el dispositiu",
"Device_Save_Unauthorized": "Token invàlid - No autoritzat",
"Device_Saved_Success": "S'ha guardat el dispositiu",
"Device_Saved_Unexpected": "Actualització de dispositiu ha retornat una resposta no esperada",
"Device_Scanning": "",
"Device_Searchbox": "Cerca", "Device_Searchbox": "Cerca",
"Device_Shortcut_AllDevices": "Els meus dispositius", "Device_Shortcut_AllDevices": "Els meus dispositius",
"Device_Shortcut_AllNodes": "Tots els nodes", "Device_Shortcut_AllNodes": "Tots els nodes",
@@ -224,18 +218,16 @@
"Device_Shortcut_Favorites": "Favorits", "Device_Shortcut_Favorites": "Favorits",
"Device_Shortcut_NewDevices": "Nous dispositius", "Device_Shortcut_NewDevices": "Nous dispositius",
"Device_Shortcut_OnlineChart": "Dispositius detectats", "Device_Shortcut_OnlineChart": "Dispositius detectats",
"Device_Shortcut_Unstable": "Inestable",
"Device_TableHead_AlertDown": "Cancel·lar alerta", "Device_TableHead_AlertDown": "Cancel·lar alerta",
"Device_TableHead_Connected_Devices": "Connexions", "Device_TableHead_Connected_Devices": "Connexions",
"Device_TableHead_CustomProps": "Props / Accions", "Device_TableHead_CustomProps": "Props / Accions",
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Favorit", "Device_TableHead_Favorite": "Favorit",
"Device_TableHead_FirstSession": "Primera Sessió", "Device_TableHead_FirstSession": "Primera Sessió",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grup", "Device_TableHead_Group": "Grup",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "",
"Device_TableHead_IPv6": "IPv6", "Device_TableHead_IPv6": "",
"Device_TableHead_Icon": "Icona", "Device_TableHead_Icon": "Icona",
"Device_TableHead_LastIP": "Darrera IP", "Device_TableHead_LastIP": "Darrera IP",
"Device_TableHead_LastIPOrder": "Últim Ordre d'IP", "Device_TableHead_LastIPOrder": "Últim Ordre d'IP",
@@ -259,7 +251,7 @@
"Device_TableHead_SyncHubNodeName": "Node Sync", "Device_TableHead_SyncHubNodeName": "Node Sync",
"Device_TableHead_Type": "Tipus", "Device_TableHead_Type": "Tipus",
"Device_TableHead_Vendor": "Venedor", "Device_TableHead_Vendor": "Venedor",
"Device_TableHead_Vlan": "VLAN", "Device_TableHead_Vlan": "",
"Device_Table_Not_Network_Device": "No configurat com a dispositiu de xarxa", "Device_Table_Not_Network_Device": "No configurat com a dispositiu de xarxa",
"Device_Table_info": "Mostrant _INICI_ a_FINAL_ d'entrades_ TOTALS", "Device_Table_info": "Mostrant _INICI_ a_FINAL_ d'entrades_ TOTALS",
"Device_Table_nav_next": "Següent", "Device_Table_nav_next": "Següent",
@@ -307,14 +299,14 @@
"Events_Tablelenght": "Veure_entrades_MENU", "Events_Tablelenght": "Veure_entrades_MENU",
"Events_Tablelenght_all": "Tot", "Events_Tablelenght_all": "Tot",
"Events_Title": "Esdeveniments", "Events_Title": "Esdeveniments",
"FakeMAC_hover": "Aquest dispositiu fa servir una adreça MAC falsa", "FakeMAC_hover": "Autodetecció - indica si el dispositiu fa servir una adreça MAC falsa (comença amb FA:CE o 00:1A), típicament generada per un plugin que no pot detectar la MAC real o quan es crea un dispositiu amagat (dummy).",
"FieldLock_Error": "Error actualitzant l'estat de bloqueig de camp", "FieldLock_Error": "",
"FieldLock_Lock_Tooltip": "Bloquejar el camp (per previndre modificacions)", "FieldLock_Lock_Tooltip": "",
"FieldLock_Locked": "Camp bloquejat", "FieldLock_Locked": "",
"FieldLock_SaveBeforeLocking": "Guardar canvis abans de bloquejar", "FieldLock_SaveBeforeLocking": "",
"FieldLock_Source_Label": "Font: ", "FieldLock_Source_Label": "",
"FieldLock_Unlock_Tooltip": "Desbloquejar camp (permet modificacions)", "FieldLock_Unlock_Tooltip": "",
"FieldLock_Unlocked": "Camp desbloquejat", "FieldLock_Unlocked": "",
"GRAPHQL_PORT_description": "El número de port del servidor GraphQL. Comprova que el port és únic en totes les aplicacions d'aquest servidor i en totes les instàncies de NetAlertX.", "GRAPHQL_PORT_description": "El número de port del servidor GraphQL. Comprova que el port és únic en totes les aplicacions d'aquest servidor i en totes les instàncies de NetAlertX.",
"GRAPHQL_PORT_name": "Port GraphQL", "GRAPHQL_PORT_name": "Port GraphQL",
"Gen_Action": "Acció", "Gen_Action": "Acció",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "Afegir dispositiu", "Gen_AddDevice": "Afegir dispositiu",
"Gen_Add_All": "Afegeix tot", "Gen_Add_All": "Afegeix tot",
"Gen_All_Devices": "Tots els dispositius", "Gen_All_Devices": "Tots els dispositius",
"Gen_Archived": "",
"Gen_AreYouSure": "Estàs segur?", "Gen_AreYouSure": "Estàs segur?",
"Gen_Backup": "Executar Backup", "Gen_Backup": "Executar Backup",
"Gen_Cancel": "Cancel·lar", "Gen_Cancel": "Cancel·lar",
@@ -333,16 +324,13 @@
"Gen_Delete": "Esborrar", "Gen_Delete": "Esborrar",
"Gen_DeleteAll": "Esborrar tot", "Gen_DeleteAll": "Esborrar tot",
"Gen_Description": "Descripció", "Gen_Description": "Descripció",
"Gen_Down": "",
"Gen_Error": "Error", "Gen_Error": "Error",
"Gen_Filter": "Filtrar", "Gen_Filter": "Filtrar",
"Gen_Flapping": "",
"Gen_Generate": "Generar", "Gen_Generate": "Generar",
"Gen_InvalidMac": "Mac address invàlida.", "Gen_InvalidMac": "Mac address invàlida.",
"Gen_Invalid_Value": "S'ha introduït un valor incorrecte", "Gen_Invalid_Value": "S'ha introduït un valor incorrecte",
"Gen_LockedDB": "ERROR - DB podria estar bloquejada - Fes servir F12 Eines desenvolupament -> Consola o provar-ho més tard.", "Gen_LockedDB": "ERROR - DB podria estar bloquejada - Fes servir F12 Eines desenvolupament -> Consola o provar-ho més tard.",
"Gen_NetworkMask": "Màscara de xarxa", "Gen_NetworkMask": "Màscara de xarxa",
"Gen_New": "",
"Gen_Offline": "Fora de línia", "Gen_Offline": "Fora de línia",
"Gen_Okay": "Ok", "Gen_Okay": "Ok",
"Gen_Online": "En línia", "Gen_Online": "En línia",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Seleccioneu la vista prèvia", "Gen_SelectToPreview": "Seleccioneu la vista prèvia",
"Gen_Selected_Devices": "Dispositius seleccionats:", "Gen_Selected_Devices": "Dispositius seleccionats:",
"Gen_Sleeping": "",
"Gen_Subnet": "Subxarxa", "Gen_Subnet": "Subxarxa",
"Gen_Switch": "Switch", "Gen_Switch": "Switch",
"Gen_Upd": "Actualitzat correctament", "Gen_Upd": "Actualitzat correctament",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "Actualitzar Valor", "Gen_Update_Value": "Actualitzar Valor",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Advertència", "Gen_Warning": "Advertència",
"Gen_Work_In_Progress": "Work in progress, un bon moment per retroalimentació a https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Work in progress, un bon moment per retroalimentació a https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Nou dispositiu", "Gen_create_new_device": "Nou dispositiu",
"Gen_create_new_device_info": "Els dispositius són típicament descobert utilitzant <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>. Tanmateix, en certs casos, pots necessitar afegir dispositius a mà. Per explorar els temes concrets comproveu la <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">documentació de Xarxes Remotes</a>.", "Gen_create_new_device_info": "Els dispositius són típicament descobert utilitzant <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>. Tanmateix, en certs casos, pots necessitar afegir dispositius a mà. Per explorar els temes concrets comproveu la <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">documentació de Xarxes Remotes</a>.",
"General_display_name": "General", "General_display_name": "General",
@@ -385,7 +372,7 @@
"Loading": "Carregant…", "Loading": "Carregant…",
"Login_Box": "Introduïu la vostra contrasenya", "Login_Box": "Introduïu la vostra contrasenya",
"Login_Default_PWD": "Contrasenya per defecte \"123456\" encara és activa.", "Login_Default_PWD": "Contrasenya per defecte \"123456\" encara és activa.",
"Login_Info": "Les contrasenyes es canvien al connector(plugin) Configurar Contrasenya. Comprova el <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/set_password\">SETPWD docs</a> si tens dubtes fent logging.", "Login_Info": "Les contrasenyes es canvien al connector(plugin) Configurar Contrasenya. Comprova el <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">SETPWD docs</a> si tens dubtes fent logging.",
"Login_Psw-box": "Contrasenya", "Login_Psw-box": "Contrasenya",
"Login_Psw_alert": "Alerta de contrasenya!", "Login_Psw_alert": "Alerta de contrasenya!",
"Login_Psw_folder": "a la carpeta config.", "Login_Psw_folder": "a la carpeta config.",
@@ -412,25 +399,25 @@
"Maintenance_Tool_DownloadConfig_text": "Descarregueu una còpia de seguretat completa de la vostra configuració de configuració emmagatzemada al fitxer <code>app.conf</code>.", "Maintenance_Tool_DownloadConfig_text": "Descarregueu una còpia de seguretat completa de la vostra configuració de configuració emmagatzemada al fitxer <code>app.conf</code>.",
"Maintenance_Tool_DownloadWorkflows": "Exportació de fluxos de treball", "Maintenance_Tool_DownloadWorkflows": "Exportació de fluxos de treball",
"Maintenance_Tool_DownloadWorkflows_text": "Descarregueu una còpia de seguretat completa dels vostres fluxos de treball emmagatzemats en el fitxer <code>workflows.json</code>.", "Maintenance_Tool_DownloadWorkflows_text": "Descarregueu una còpia de seguretat completa dels vostres fluxos de treball emmagatzemats en el fitxer <code>workflows.json</code>.",
"Maintenance_Tool_ExportCSV": "Exportació de dispositius (csv)", "Maintenance_Tool_ExportCSV": "CSV Exportació de dispositius",
"Maintenance_Tool_ExportCSV_noti": "Exportació de dispositius (csv)", "Maintenance_Tool_ExportCSV_noti": "CSV Exportació",
"Maintenance_Tool_ExportCSV_noti_text": "Estàs segur que vols generar un fitxer CSV?", "Maintenance_Tool_ExportCSV_noti_text": "Estàs segur que vols generar un fitxer CSV?",
"Maintenance_Tool_ExportCSV_text": "Genera un fitxer CSV (comma separated value) que conté la llista dels dispositius incloent les relacions de Xarxa entre Nodes i dispositius connectats. També pots disparar-ho activant la <a ref=\"settings.php#CSVBCKP_header\">CSV Còpia de seguretat</a>.", "Maintenance_Tool_ExportCSV_text": "Genera un fitxer CSV (comma separated value) que conté la llista dels dispositius incloent les relacions de Xarxa entre Nodes i dispositius connectats. També pots disparar-ho accedint a la URL <code>el_vostre_NetAlertX_ url/php/server/devices.php?acció=ExportCSV</code> o activant el connector <a href=\"settings.php#CSVBCKP_header\">CSV Còpia de seguretat</a>.",
"Maintenance_Tool_ImportCSV": "Importació de dispositius (csv)", "Maintenance_Tool_ImportCSV": "CSV Importació de dispositius",
"Maintenance_Tool_ImportCSV_noti": "Importar dispositius (csv)", "Maintenance_Tool_ImportCSV_noti": "CSV Importació",
"Maintenance_Tool_ImportCSV_noti_text": "Estàs segur que vols importar el fitxer CSV? Això <b> sobreescriurà</b> completament els dispositius de la seva base de dades.", "Maintenance_Tool_ImportCSV_noti_text": "Estàs segur que vols importar el fitxer CSV? Això <b> sobreescriurà</b> completament els dispositius de la seva base de dades.",
"Maintenance_Tool_ImportCSV_text": "Abans d'utilitzar aquesta funció, fes una còpia de seguretat, si us plau. Importa un CSV (comma separated value) el fitxer que conté la llista dels dispositius que inclouen les relacions de Xarxa entre Nodes i dispositius connectats. Per fer-ho col·loca el CSV el fitxer anomenat <b>devices.csv</b> a la vostra <b>/config</b> carpeta.", "Maintenance_Tool_ImportCSV_text": "Abans d'utilitzar aquesta funció, fes una còpia de seguretat, si us plau. Importa un CSV (comma separated value) el fitxer que conté la llista dels dispositius que inclouen les relacions de Xarxa entre Nodes i dispositius connectats. Per fer-ho col·loca el CSV el fitxer anomenat <b>devices.csv</b> a la vostra <b>/config</b> carpeta.",
"Maintenance_Tool_ImportConfig_noti": "Importació de la configuració (app.conf)", "Maintenance_Tool_ImportConfig_noti": "Importació de la configuració (app.conf)",
"Maintenance_Tool_ImportPastedCSV": "Importar de dispositius (csv) (Paste)", "Maintenance_Tool_ImportPastedCSV": "CSV Importació de dispositius (Paste)",
"Maintenance_Tool_ImportPastedCSV_noti_text": "Estàs segur que vols importar el CSV copiat? Això <b> sobreescriurà</b> completament els dispositius de la base de dades.", "Maintenance_Tool_ImportPastedCSV_noti_text": "Estàs segur que vols importar el CSV copiat? Això <b> sobreescriurà</b> completament els dispositius de la base de dades.",
"Maintenance_Tool_ImportPastedCSV_text": "Abans d'utilitzar aquesta funció, feu una còpia de seguretat. Importar un fitxer CSV (comma separated value) que contingui la llista de dispositius, incloent les relacions de xarxa entre els nodes i els dispositius connectats.", "Maintenance_Tool_ImportPastedCSV_text": "Abans d'utilitzar aquesta funció, feu una còpia de seguretat. Importar un fitxer CSV (comma separated value) que contingui la llista de dispositius, incloent les relacions de xarxa entre els nodes i els dispositius connectats.",
"Maintenance_Tool_ImportPastedConfig": "Importació de la configuració (paste)", "Maintenance_Tool_ImportPastedConfig": "Importació de la configuració (paste)",
"Maintenance_Tool_ImportPastedConfig_noti_text": "Estàs segur que vols importar la configuració config enganxada? Això <b> sobreescriurà</b> completament el fitxer <code>app.conf</code>.", "Maintenance_Tool_ImportPastedConfig_noti_text": "Estàs segur que vols importar la configuració config enganxada? Això <b> sobreescriurà</b> completament el fitxer <code>app.conf</code>.",
"Maintenance_Tool_ImportPastedConfig_text": "Importa el fitxer <code>app.conf</code> que conté tota l'aplicació Configuració. És possible que vulgueu descarregar el fitxer actual <code>app.conf</code> primer amb el <b>Settings Export</b>.", "Maintenance_Tool_ImportPastedConfig_text": "Importa el fitxer <code>app.conf</code> que conté tota l'aplicació Configuració. És possible que vulgueu descarregar el fitxer actual <code>app.conf</code> primer amb el <b>Settings Export</b>.",
"Maintenance_Tool_UnlockFields": "Desbloquejar camps del dispositiu", "Maintenance_Tool_UnlockFields": "",
"Maintenance_Tool_UnlockFields_noti": "Desbloquejar camps del dispositiu", "Maintenance_Tool_UnlockFields_noti": "",
"Maintenance_Tool_UnlockFields_noti_text": "Esta segur que vol netejar tots els valors de les fonts (BLOQUEIG/USUARI) de tots els camps de tots els dispositius? L'acció no es pot desfer.", "Maintenance_Tool_UnlockFields_noti_text": "",
"Maintenance_Tool_UnlockFields_text": "Aquesta eina eliminarà tots els valors d'origen de tots els camps seguits per a tots els dispositius, desbloquejant tots els camps per als connectors i usuaris. Utilitzeu-ho amb precaució, ja que afectarà tot l'inventari del vostre dispositiu.", "Maintenance_Tool_UnlockFields_text": "",
"Maintenance_Tool_arpscansw": "Conmuta arp-Scan (on/off)", "Maintenance_Tool_arpscansw": "Conmuta arp-Scan (on/off)",
"Maintenance_Tool_arpscansw_noti": "Conmuta arp-Scan on or off", "Maintenance_Tool_arpscansw_noti": "Conmuta arp-Scan on or off",
"Maintenance_Tool_arpscansw_noti_text": "Quan l'escàner ha estat canviat a off es queda off fins que és activat de bell nou.", "Maintenance_Tool_arpscansw_noti_text": "Quan l'escàner ha estat canviat a off es queda off fins que és activat de bell nou.",
@@ -440,9 +427,9 @@
"Maintenance_Tool_backup_noti_text": "Estàs segur que vols executar el Backup DB? Assegura't que no hi ha exploració en funcionament.", "Maintenance_Tool_backup_noti_text": "Estàs segur que vols executar el Backup DB? Assegura't que no hi ha exploració en funcionament.",
"Maintenance_Tool_backup_text": "Les còpies de seguretat de la base de dades es troben al directori de bases de dades com a arxiu zip, anomenat amb la data de creació. No hi ha un nombre màxim de còpies de seguretat.", "Maintenance_Tool_backup_text": "Les còpies de seguretat de la base de dades es troben al directori de bases de dades com a arxiu zip, anomenat amb la data de creació. No hi ha un nombre màxim de còpies de seguretat.",
"Maintenance_Tool_check_visible": "Desmarqueu-ho per amagar la columna.", "Maintenance_Tool_check_visible": "Desmarqueu-ho per amagar la columna.",
"Maintenance_Tool_clearSourceFields_selected": "Neteja els camps font", "Maintenance_Tool_clearSourceFields_selected": "",
"Maintenance_Tool_clearSourceFields_selected_noti": "Neteja les fonts", "Maintenance_Tool_clearSourceFields_selected_noti": "",
"Maintenance_Tool_clearSourceFields_selected_text": "Això netejarà tots els camps d'origen dels dispositius seleccionats. No es pot desfer.", "Maintenance_Tool_clearSourceFields_selected_text": "",
"Maintenance_Tool_darkmode": "Canvia Modes (Fosc/Clar)", "Maintenance_Tool_darkmode": "Canvia Modes (Fosc/Clar)",
"Maintenance_Tool_darkmode_noti": "Canvia Modes", "Maintenance_Tool_darkmode_noti": "Canvia Modes",
"Maintenance_Tool_darkmode_noti_text": "Després del canvi de tema, la pàgina intenta recarregar-se per activar el canvi. Si és necessari, s'ha de netejar la memòria cau.", "Maintenance_Tool_darkmode_noti_text": "Després del canvi de tema, la pàgina intenta recarregar-se per activar el canvi. Si és necessari, s'ha de netejar la memòria cau.",
@@ -473,7 +460,7 @@
"Maintenance_Tool_del_unknowndev_noti": "Elimina dispositius desconeguts", "Maintenance_Tool_del_unknowndev_noti": "Elimina dispositius desconeguts",
"Maintenance_Tool_del_unknowndev_noti_text": "Estàs segur que vols eliminar tots els dispositius (no coneguts) o amb nom (no trobat)?", "Maintenance_Tool_del_unknowndev_noti_text": "Estàs segur que vols eliminar tots els dispositius (no coneguts) o amb nom (no trobat)?",
"Maintenance_Tool_del_unknowndev_text": "Abans d'utilitzar aquesta funció, feu una còpia de seguretat. La supressió no es pot desfer. Tots els dispositius anomenats (no coneguts) s'eliminaran de la base de dades.", "Maintenance_Tool_del_unknowndev_text": "Abans d'utilitzar aquesta funció, feu una còpia de seguretat. La supressió no es pot desfer. Tots els dispositius anomenats (no coneguts) s'eliminaran de la base de dades.",
"Maintenance_Tool_del_unlockFields_selecteddev_text": "Això desbloquejarà els camps BLOQUEJAT/USUARI dels dispositius seleccionats. No es pot desfer.e desfer.", "Maintenance_Tool_del_unlockFields_selecteddev_text": "",
"Maintenance_Tool_displayed_columns_text": "Canvieu la visibilitat i l'ordre de les columnes a la pàgina <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Dispositius</b></a>.", "Maintenance_Tool_displayed_columns_text": "Canvieu la visibilitat i l'ordre de les columnes a la pàgina <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Dispositius</b></a>.",
"Maintenance_Tool_drag_me": "Arrossega'm a reorder columnes.", "Maintenance_Tool_drag_me": "Arrossega'm a reorder columnes.",
"Maintenance_Tool_order_columns_text": "Manteniment_Eina_ordre_columnes_text", "Maintenance_Tool_order_columns_text": "Manteniment_Eina_ordre_columnes_text",
@@ -485,8 +472,8 @@
"Maintenance_Tool_restore_noti": "Restaura base de dades", "Maintenance_Tool_restore_noti": "Restaura base de dades",
"Maintenance_Tool_restore_noti_text": "Estàs segur que vols executar la Restauració de Base de Dades? Comprova que no hi ha exploració en funcionament.", "Maintenance_Tool_restore_noti_text": "Estàs segur que vols executar la Restauració de Base de Dades? Comprova que no hi ha exploració en funcionament.",
"Maintenance_Tool_restore_text": "L'última còpia de seguretat es pot restaurar mitjançant el botó, però les còpies de seguretat antigues només es poden restaurar manualment. Després de la restauració, feu una comprovació d'integritat a la base de dades per seguretat, per si de cas la Base de dades estigués en mode escriptura quan es va crear la còpia de seguretat.", "Maintenance_Tool_restore_text": "L'última còpia de seguretat es pot restaurar mitjançant el botó, però les còpies de seguretat antigues només es poden restaurar manualment. Després de la restauració, feu una comprovació d'integritat a la base de dades per seguretat, per si de cas la Base de dades estigués en mode escriptura quan es va crear la còpia de seguretat.",
"Maintenance_Tool_unlockFields_selecteddev": "Desbloquejar els camps del dispositiu", "Maintenance_Tool_unlockFields_selecteddev": "",
"Maintenance_Tool_unlockFields_selecteddev_noti": "Desbloqueja camps", "Maintenance_Tool_unlockFields_selecteddev_noti": "",
"Maintenance_Tool_upgrade_database_noti": "Actualitza base de dades", "Maintenance_Tool_upgrade_database_noti": "Actualitza base de dades",
"Maintenance_Tool_upgrade_database_noti_text": "T'és segur vols actualitzar la base de dades?<br>(potser prefereixes arxivar-la)", "Maintenance_Tool_upgrade_database_noti_text": "T'és segur vols actualitzar la base de dades?<br>(potser prefereixes arxivar-la)",
"Maintenance_Tool_upgrade_database_text": "Aquest botó actualitzarà la base de dades per activar l'activitat de Xarxa dins les darreres 12 hores. Si us plau, feu còpia de la vostra base de dades per si de cas.", "Maintenance_Tool_upgrade_database_text": "Aquest botó actualitzarà la base de dades per activar l'activitat de Xarxa dins les darreres 12 hores. Si us plau, feu còpia de la vostra base de dades per si de cas.",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "actualment està desactivat", "Maintenance_arp_status_off": "actualment està desactivat",
"Maintenance_arp_status_on": "s'està fent un scan", "Maintenance_arp_status_on": "s'està fent un scan",
"Maintenance_built_on": "Construït", "Maintenance_built_on": "Construït",
"Maintenance_current_version": "Ets actual. Dona un cop d'ull al que <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">estic treballant</a>.", "Maintenance_current_version": "Ets actual. Dona un cop d'ull al que <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">estic treballant</a>.",
"Maintenance_database_backup": "Còpies de seguretat de BBDD", "Maintenance_database_backup": "Còpies de seguretat de BBDD",
"Maintenance_database_backup_found": "s'han trobat còpies de seguretat", "Maintenance_database_backup_found": "s'han trobat còpies de seguretat",
"Maintenance_database_backup_total": "ús total del disc", "Maintenance_database_backup_total": "ús total del disc",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "Tria idioma", "Maintenance_lang_selector_empty": "Tria idioma",
"Maintenance_lang_selector_lable": "Selecció d'idioma", "Maintenance_lang_selector_lable": "Selecció d'idioma",
"Maintenance_lang_selector_text": "El canvi té lloc en el cantó del client, així que afecta només el navegador actual.", "Maintenance_lang_selector_text": "El canvi té lloc en el cantó del client, així que afecta només el navegador actual.",
"Maintenance_new_version": "Hi ha una nova versió. Comprova <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">release notes</a>.", "Maintenance_new_version": "Hi ha una nova versió. Comprova <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">release notes</a>.",
"Maintenance_themeselector_apply": "Aplica", "Maintenance_themeselector_apply": "Aplica",
"Maintenance_themeselector_empty": "Tria una Skin", "Maintenance_themeselector_empty": "Tria una Skin",
"Maintenance_themeselector_lable": "Selecciona una Skin", "Maintenance_themeselector_lable": "Selecciona una Skin",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "Activa l'accés", "PIALERT_WEB_PROTECTION_name": "Activa l'accés",
"PLUGINS_KEEP_HIST_description": "Quantes entrades de Plugins s'han de mantenir a la història (per Plugin, no per dispositiu).", "PLUGINS_KEEP_HIST_description": "Quantes entrades de Plugins s'han de mantenir a la història (per Plugin, no per dispositiu).",
"PLUGINS_KEEP_HIST_name": "Història dels Plugins", "PLUGINS_KEEP_HIST_name": "Història dels Plugins",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "Elimina tot (s'ignoraran els filtres)", "Plugins_DeleteAll": "Elimina tot (s'ignoraran els filtres)",
"Plugins_Filters_Mac": "Filtre de MAC", "Plugins_Filters_Mac": "Filtre de MAC",
"Plugins_History": "Historial d'Esdeveniments", "Plugins_History": "Historial d'Esdeveniments",
@@ -630,7 +615,7 @@
"REPORT_MAIL_description": "Si està activat s'envia un correu electrònic amb una llista de canvis als quals s'ha subscrit. Si us plau, ompli tots els paràmetres restants relacionats amb la configuració SMTP. Si té problemes, configuri <code>LOG_LEVEL</code> i <code>debug</code> comprovi <a href=\"/maintenance.php#tab_Logging\"> el registre d'errors</a>.", "REPORT_MAIL_description": "Si està activat s'envia un correu electrònic amb una llista de canvis als quals s'ha subscrit. Si us plau, ompli tots els paràmetres restants relacionats amb la configuració SMTP. Si té problemes, configuri <code>LOG_LEVEL</code> i <code>debug</code> comprovi <a href=\"/maintenance.php#tab_Logging\"> el registre d'errors</a>.",
"REPORT_MAIL_name": "Activa el correu electrònic", "REPORT_MAIL_name": "Activa el correu electrònic",
"REPORT_TITLE": "Informe", "REPORT_TITLE": "Informe",
"RandomMAC_hover": "Aquest dispositiu té una l'adreça MAC aleatòria", "RandomMAC_hover": "Auto detectat - indica que el dispositiu aleatoritza l'adreça MAC. Pots excloure MACs específiques amb la configuració UI_NOT_RANDOM_MAC. Fes click per saber més.",
"Reports_Sent_Log": "Registre d'informes enviats", "Reports_Sent_Log": "Registre d'informes enviats",
"SCAN_SUBNETS_description": "La majoria dels escàners en xarxa (ARP-SCAN, NMAP, NSLOOKUP, DIG) es basen en l'exploració d'interfícies de xarxa específiques i subxarxes. Comproveu la <a href=\"https://docs.netalertx.com/SUBNETS\" target=\"_blank\">documentació de subxarxes</a> per ajudar en aquesta configuració, especialment VLANs, i quines VLANs són compatibles, o com esbrinar la màscara de xarxa i la seva interfície. <br/> <br/> Una alternativa als escàners en xarxa és activar alguns altres escàners / importadors de dispositius que no requereixin NetAlert<sup>X</sup> per tenir accés a la xarxa (UNIFI, dhcp. leases, PiHole, etc.). <br/> <br/> Nota: El temps d'exploració en si mateix depèn del nombre d'adreces IP per verificar, així que s'ha establir amb cura amb la màscara i la interfície de xarxa adequats.", "SCAN_SUBNETS_description": "La majoria dels escàners en xarxa (ARP-SCAN, NMAP, NSLOOKUP, DIG) es basen en l'exploració d'interfícies de xarxa específiques i subxarxes. Comproveu la <a href=\"https://docs.netalertx.com/SUBNETS\" target=\"_blank\">documentació de subxarxes</a> per ajudar en aquesta configuració, especialment VLANs, i quines VLANs són compatibles, o com esbrinar la màscara de xarxa i la seva interfície. <br/> <br/> Una alternativa als escàners en xarxa és activar alguns altres escàners / importadors de dispositius que no requereixin NetAlert<sup>X</sup> per tenir accés a la xarxa (UNIFI, dhcp. leases, PiHole, etc.). <br/> <br/> Nota: El temps d'exploració en si mateix depèn del nombre d'adreces IP per verificar, així que s'ha establir amb cura amb la màscara i la interfície de xarxa adequats.",
"SCAN_SUBNETS_name": "Xarxes per escanejar", "SCAN_SUBNETS_name": "Xarxes per escanejar",
@@ -638,7 +623,7 @@
"Setting_Override": "Valor de sobreescriptura", "Setting_Override": "Valor de sobreescriptura",
"Setting_Override_Description": "Activant aquesta opció anul·larà un valor predeterminat de l'aplicació amb el valor especificat.", "Setting_Override_Description": "Activant aquesta opció anul·larà un valor predeterminat de l'aplicació amb el valor especificat.",
"Settings_Metadata_Toggle": "Mostrar/amagar metadades per a la configuració donada.", "Settings_Metadata_Toggle": "Mostrar/amagar metadades per a la configuració donada.",
"Settings_Show_Description": "Mostra la descripció", "Settings_Show_Description": "Mostra la descripció de la configuració.",
"Settings_device_Scanners_desync": "⚠ Els horaris d'escàner de dispositius no estan en sincronia.", "Settings_device_Scanners_desync": "⚠ Els horaris d'escàner de dispositius no estan en sincronia.",
"Settings_device_Scanners_desync_popup": "Els horaris dels escàners de dispositius (<code>*_RUN_SCHD</code>) no són iguals. Això donarà lloc a notificacions inconsistents del dispositiu en línia / fora de línia. Si no és intencionat, utilitzeu el mateix horari per a tots els <b>🔍 escàners de dispositius</b>.", "Settings_device_Scanners_desync_popup": "Els horaris dels escàners de dispositius (<code>*_RUN_SCHD</code>) no són iguals. Això donarà lloc a notificacions inconsistents del dispositiu en línia / fora de línia. Si no és intencionat, utilitzeu el mateix horari per a tots els <b>🔍 escàners de dispositius</b>.",
"Speedtest_Results": "Speedtest Resultats", "Speedtest_Results": "Speedtest Resultats",

View File

@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "", "Device_MultiEdit_MassActions": "",
"Device_MultiEdit_No_Devices": "", "Device_MultiEdit_No_Devices": "",
"Device_MultiEdit_Tooltip": "", "Device_MultiEdit_Tooltip": "",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "", "Device_Save_Failed": "",
"Device_Save_Unauthorized": "", "Device_Save_Unauthorized": "",
"Device_Saved_Success": "", "Device_Saved_Success": "",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "", "Device_Searchbox": "",
"Device_Shortcut_AllDevices": "", "Device_Shortcut_AllDevices": "",
"Device_Shortcut_AllNodes": "", "Device_Shortcut_AllNodes": "",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "", "Device_Shortcut_Favorites": "",
"Device_Shortcut_NewDevices": "", "Device_Shortcut_NewDevices": "",
"Device_Shortcut_OnlineChart": "", "Device_Shortcut_OnlineChart": "",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "", "Device_TableHead_AlertDown": "",
"Device_TableHead_Connected_Devices": "", "Device_TableHead_Connected_Devices": "",
"Device_TableHead_CustomProps": "", "Device_TableHead_CustomProps": "",
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "", "Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "", "Device_TableHead_FirstSession": "",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "", "Device_TableHead_GUID": "",
"Device_TableHead_Group": "", "Device_TableHead_Group": "",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "", "Gen_AddDevice": "",
"Gen_Add_All": "Přidat vše", "Gen_Add_All": "Přidat vše",
"Gen_All_Devices": "Všechna zařízení", "Gen_All_Devices": "Všechna zařízení",
"Gen_Archived": "",
"Gen_AreYouSure": "Jste si jistý?", "Gen_AreYouSure": "Jste si jistý?",
"Gen_Backup": "Spustit zálohování", "Gen_Backup": "Spustit zálohování",
"Gen_Cancel": "Zrušit", "Gen_Cancel": "Zrušit",
@@ -333,16 +324,13 @@
"Gen_Delete": "Smazat", "Gen_Delete": "Smazat",
"Gen_DeleteAll": "Smazat vše", "Gen_DeleteAll": "Smazat vše",
"Gen_Description": "Popis", "Gen_Description": "Popis",
"Gen_Down": "",
"Gen_Error": "Chyba", "Gen_Error": "Chyba",
"Gen_Filter": "Filtr", "Gen_Filter": "Filtr",
"Gen_Flapping": "",
"Gen_Generate": "Vygenerovat", "Gen_Generate": "Vygenerovat",
"Gen_InvalidMac": "", "Gen_InvalidMac": "",
"Gen_Invalid_Value": "", "Gen_Invalid_Value": "",
"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_LockedDB": "CHYBA - Databáze je možná zamčená - Zkontrolujte F12 -> Nástroje pro vývojáře -> Konzole. nebo to zkuste později.",
"Gen_NetworkMask": "", "Gen_NetworkMask": "",
"Gen_New": "",
"Gen_Offline": "Offline", "Gen_Offline": "Offline",
"Gen_Okay": "Ok", "Gen_Okay": "Ok",
"Gen_Online": "Online", "Gen_Online": "Online",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Vybrat na náhled", "Gen_SelectToPreview": "Vybrat na náhled",
"Gen_Selected_Devices": "Vybraná zařízení:", "Gen_Selected_Devices": "Vybraná zařízení:",
"Gen_Sleeping": "",
"Gen_Subnet": "", "Gen_Subnet": "",
"Gen_Switch": "Přepnout", "Gen_Switch": "Přepnout",
"Gen_Upd": "Úspěšně aktualizováno", "Gen_Upd": "Úspěšně aktualizováno",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "", "PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "", "PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "", "PLUGINS_KEEP_HIST_name": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "", "Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "", "Plugins_Filters_Mac": "",
"Plugins_History": "", "Plugins_History": "",

View File

@@ -207,16 +207,10 @@
"Device_MultiEdit_MassActions": "Massen aktionen:", "Device_MultiEdit_MassActions": "Massen aktionen:",
"Device_MultiEdit_No_Devices": "Keine Geräte ausgewählt.", "Device_MultiEdit_No_Devices": "Keine Geräte ausgewählt.",
"Device_MultiEdit_Tooltip": "Achtung! Beim Drücken werden alle Werte auf die oben ausgewählten Geräte übertragen.", "Device_MultiEdit_Tooltip": "Achtung! Beim Drücken werden alle Werte auf die oben ausgewählten Geräte übertragen.",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "", "Device_Save_Failed": "",
"Device_Save_Unauthorized": "", "Device_Save_Unauthorized": "",
"Device_Saved_Success": "Gerät erfolgreich gespeichert", "Device_Saved_Success": "Gerät erfolgreich gespeichert",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "Suche", "Device_Searchbox": "Suche",
"Device_Shortcut_AllDevices": "Meine Geräte", "Device_Shortcut_AllDevices": "Meine Geräte",
"Device_Shortcut_AllNodes": "Alle Knoten", "Device_Shortcut_AllNodes": "Alle Knoten",
@@ -228,14 +222,12 @@
"Device_Shortcut_Favorites": "Favoriten", "Device_Shortcut_Favorites": "Favoriten",
"Device_Shortcut_NewDevices": "Neue Geräte", "Device_Shortcut_NewDevices": "Neue Geräte",
"Device_Shortcut_OnlineChart": "Gerätepräsenz im Laufe der Zeit", "Device_Shortcut_OnlineChart": "Gerätepräsenz im Laufe der Zeit",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "Alarm aus", "Device_TableHead_AlertDown": "Alarm aus",
"Device_TableHead_Connected_Devices": "Verbindungen", "Device_TableHead_Connected_Devices": "Verbindungen",
"Device_TableHead_CustomProps": "Eigenschaften / Aktionen", "Device_TableHead_CustomProps": "Eigenschaften / Aktionen",
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "Favorit", "Device_TableHead_Favorite": "Favorit",
"Device_TableHead_FirstSession": "Erste Sitzung", "Device_TableHead_FirstSession": "Erste Sitzung",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Gruppe", "Device_TableHead_Group": "Gruppe",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -326,7 +318,6 @@
"Gen_AddDevice": "Gerät hinzufügen", "Gen_AddDevice": "Gerät hinzufügen",
"Gen_Add_All": "Alle hinzufügen", "Gen_Add_All": "Alle hinzufügen",
"Gen_All_Devices": "Alle Geräte", "Gen_All_Devices": "Alle Geräte",
"Gen_Archived": "",
"Gen_AreYouSure": "Sind Sie sich sicher?", "Gen_AreYouSure": "Sind Sie sich sicher?",
"Gen_Backup": "Sichern", "Gen_Backup": "Sichern",
"Gen_Cancel": "Abbrechen", "Gen_Cancel": "Abbrechen",
@@ -337,16 +328,13 @@
"Gen_Delete": "Löschen", "Gen_Delete": "Löschen",
"Gen_DeleteAll": "Alles löschen", "Gen_DeleteAll": "Alles löschen",
"Gen_Description": "Beschreibung", "Gen_Description": "Beschreibung",
"Gen_Down": "",
"Gen_Error": "Fehler", "Gen_Error": "Fehler",
"Gen_Filter": "Filter", "Gen_Filter": "Filter",
"Gen_Flapping": "",
"Gen_Generate": "Generieren", "Gen_Generate": "Generieren",
"Gen_InvalidMac": "Ungültige MAC-Adresse.", "Gen_InvalidMac": "Ungültige MAC-Adresse.",
"Gen_Invalid_Value": "", "Gen_Invalid_Value": "",
"Gen_LockedDB": "ERROR - DB eventuell gesperrt - Nutze die Konsole in den Entwickler Werkzeugen (F12) zur Überprüfung oder probiere es später erneut.", "Gen_LockedDB": "ERROR - DB eventuell gesperrt - Nutze die Konsole in den Entwickler Werkzeugen (F12) zur Überprüfung oder probiere es später erneut.",
"Gen_NetworkMask": "", "Gen_NetworkMask": "",
"Gen_New": "",
"Gen_Offline": "Offline", "Gen_Offline": "Offline",
"Gen_Okay": "Ok", "Gen_Okay": "Ok",
"Gen_Online": "Online", "Gen_Online": "Online",
@@ -364,7 +352,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Zur Vorschau auswählen", "Gen_SelectToPreview": "Zur Vorschau auswählen",
"Gen_Selected_Devices": "Ausgewählte Geräte:", "Gen_Selected_Devices": "Ausgewählte Geräte:",
"Gen_Sleeping": "",
"Gen_Subnet": "", "Gen_Subnet": "",
"Gen_Switch": "Umschalten", "Gen_Switch": "Umschalten",
"Gen_Upd": "Aktualisierung erfolgreich", "Gen_Upd": "Aktualisierung erfolgreich",
@@ -373,7 +360,7 @@
"Gen_Update_Value": "Wert aktualisieren", "Gen_Update_Value": "Wert aktualisieren",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Warnung", "Gen_Warning": "Warnung",
"Gen_Work_In_Progress": "Keine Finalversion, feedback bitte unter: https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Keine Finalversion, feedback bitte unter: https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Neues Gerät", "Gen_create_new_device": "Neues Gerät",
"Gen_create_new_device_info": "Geräte werden normalerweise über <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">Plugins</a> gefunden. In Ausnahmefällen kann es nötig sein, sie manuell hinzuzufügen. Konkrete Szenarien sind in der <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">Dokumentation über entfernte Netzwerke</a> zu finden.", "Gen_create_new_device_info": "Geräte werden normalerweise über <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">Plugins</a> gefunden. In Ausnahmefällen kann es nötig sein, sie manuell hinzuzufügen. Konkrete Szenarien sind in der <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">Dokumentation über entfernte Netzwerke</a> zu finden.",
"General_display_name": "Allgemein", "General_display_name": "Allgemein",
@@ -517,7 +504,7 @@
"Maintenance_arp_status_off": "ist im Moment deaktiviert", "Maintenance_arp_status_off": "ist im Moment deaktiviert",
"Maintenance_arp_status_on": "Scan(s) sind gerade aktiv", "Maintenance_arp_status_on": "Scan(s) sind gerade aktiv",
"Maintenance_built_on": "Erstellt am", "Maintenance_built_on": "Erstellt am",
"Maintenance_current_version": "Du bist up-to-date. Sieh dir an, <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">woran ich gerade arbeite</a>.", "Maintenance_current_version": "Du bist up-to-date. Sieh dir an, <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">woran ich gerade arbeite</a>.",
"Maintenance_database_backup": "DB Sicherungen", "Maintenance_database_backup": "DB Sicherungen",
"Maintenance_database_backup_found": "Sicherungen verfügbar", "Maintenance_database_backup_found": "Sicherungen verfügbar",
"Maintenance_database_backup_total": "Speicherplatz insgesamt", "Maintenance_database_backup_total": "Speicherplatz insgesamt",
@@ -529,7 +516,7 @@
"Maintenance_lang_selector_empty": "Sprache wählen", "Maintenance_lang_selector_empty": "Sprache wählen",
"Maintenance_lang_selector_lable": "Sprachauswahl", "Maintenance_lang_selector_lable": "Sprachauswahl",
"Maintenance_lang_selector_text": "Die Änderung findet clientseitig statt, betrifft also nur den aktuellen Browser.", "Maintenance_lang_selector_text": "Die Änderung findet clientseitig statt, betrifft also nur den aktuellen Browser.",
"Maintenance_new_version": "Eine neue Version ist vefügbar. Sieh dir die <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">Versionshinweise</a> an.", "Maintenance_new_version": "Eine neue Version ist vefügbar. Sieh dir die <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">Versionshinweise</a> an.",
"Maintenance_themeselector_apply": "Übernehmen", "Maintenance_themeselector_apply": "Übernehmen",
"Maintenance_themeselector_empty": "Skin wählen", "Maintenance_themeselector_empty": "Skin wählen",
"Maintenance_themeselector_lable": "Skin Auswahl", "Maintenance_themeselector_lable": "Skin Auswahl",
@@ -619,8 +606,6 @@
"PIALERT_WEB_PROTECTION_name": "Anmeldung aktivieren", "PIALERT_WEB_PROTECTION_name": "Anmeldung aktivieren",
"PLUGINS_KEEP_HIST_description": "Wie viele Plugin Scanresultate behalten werden (pro Plugin, nicht gerätespezifisch).", "PLUGINS_KEEP_HIST_description": "Wie viele Plugin Scanresultate behalten werden (pro Plugin, nicht gerätespezifisch).",
"PLUGINS_KEEP_HIST_name": "Plugins Verlauf", "PLUGINS_KEEP_HIST_name": "Plugins Verlauf",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"PUSHSAFER_TOKEN_description": "Your secret Pushsafer API key (token).", "PUSHSAFER_TOKEN_description": "Your secret Pushsafer API key (token).",
"PUSHSAFER_TOKEN_name": "Pushsafer token", "PUSHSAFER_TOKEN_name": "Pushsafer token",
"PUSHSAFER_display_name": "Pushsafer", "PUSHSAFER_display_name": "Pushsafer",
@@ -797,7 +782,7 @@
"UI_REFRESH_name": "Benutzeroberfläche automatisch auffrischen", "UI_REFRESH_name": "Benutzeroberfläche automatisch auffrischen",
"VERSION_description": "", "VERSION_description": "",
"VERSION_name": "Version oder Zeitstempel", "VERSION_name": "Version oder Zeitstempel",
"WEBHOOK_PAYLOAD_description": "The Webhook payload data format for the <code>body</code> > <code>attachments</code> > <code>text</code> attribute in the payload json. See an example of the payload <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">here</a>. (e.g.: for discord use <code>text</code>)", "WEBHOOK_PAYLOAD_description": "The Webhook payload data format for the <code>body</code> > <code>attachments</code> > <code>text</code> attribute in the payload json. See an example of the payload <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">here</a>. (e.g.: for discord use <code>text</code>)",
"WEBHOOK_PAYLOAD_name": "Payload type", "WEBHOOK_PAYLOAD_name": "Payload type",
"WEBHOOK_REQUEST_METHOD_description": "The HTTP request method to be used for the webhook call.", "WEBHOOK_REQUEST_METHOD_description": "The HTTP request method to be used for the webhook call.",
"WEBHOOK_REQUEST_METHOD_name": "Request method", "WEBHOOK_REQUEST_METHOD_name": "Request method",

View File

@@ -109,7 +109,7 @@
"DevDetail_Network_Node_hover": "Select the parent network device the current device is connected to, to populate the Network tree.", "DevDetail_Network_Node_hover": "Select the parent network device the current device is connected to, to populate the Network tree.",
"DevDetail_Network_Port_hover": "The port this device is connected to on the parent network device. If left empty a wifi icon is displayed in the Network tree.", "DevDetail_Network_Port_hover": "The port this device is connected to on the parent network device. If left empty a wifi icon is displayed in the Network tree.",
"DevDetail_Nmap_Scans": "Manual Nmap Scans", "DevDetail_Nmap_Scans": "Manual Nmap Scans",
"DevDetail_Nmap_Scans_desc": "Here you can execute manual NMAP scans. You can also schedule regular automatic NMAP scans via the Services & Ports (NMAP) plugin. Head to <a href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Docs</a> to find out more", "DevDetail_Nmap_Scans_desc": "Here you can execute manual NMAP scans. You can also schedule regular automatic NMAP scans via the Services & Ports (NMAP) plugin. Head to <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Docs</a> to find out more",
"DevDetail_Nmap_buttonDefault": "Default Scan", "DevDetail_Nmap_buttonDefault": "Default Scan",
"DevDetail_Nmap_buttonDefault_text": "Default Scan: Nmap scans the top 1,000 ports for each scan protocol requested. This catches roughly 93% of the TCP ports and 49% of the UDP ports. (about 5 seconds)", "DevDetail_Nmap_buttonDefault_text": "Default Scan: Nmap scans the top 1,000 ports for each scan protocol requested. This catches roughly 93% of the TCP ports and 49% of the UDP ports. (about 5 seconds)",
"DevDetail_Nmap_buttonDetail": "Detailed Scan", "DevDetail_Nmap_buttonDetail": "Detailed Scan",
@@ -139,7 +139,7 @@
"DevDetail_SessionTable_Duration": "Duration", "DevDetail_SessionTable_Duration": "Duration",
"DevDetail_SessionTable_IP": "IP", "DevDetail_SessionTable_IP": "IP",
"DevDetail_SessionTable_Order": "Order", "DevDetail_SessionTable_Order": "Order",
"DevDetail_Shortcut_CurrentStatus": "Status", "DevDetail_Shortcut_CurrentStatus": "Current Status",
"DevDetail_Shortcut_DownAlerts": "Down Alerts", "DevDetail_Shortcut_DownAlerts": "Down Alerts",
"DevDetail_Shortcut_Presence": "Presence", "DevDetail_Shortcut_Presence": "Presence",
"DevDetail_Shortcut_Sessions": "Sessions", "DevDetail_Shortcut_Sessions": "Sessions",
@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "Mass actions:", "Device_MultiEdit_MassActions": "Mass actions:",
"Device_MultiEdit_No_Devices": "No devices selected.", "Device_MultiEdit_No_Devices": "No devices selected.",
"Device_MultiEdit_Tooltip": "Careful. Clicking this will apply the value on the left to all devices selected above.", "Device_MultiEdit_Tooltip": "Careful. Clicking this will apply the value on the left to all devices selected above.",
"Device_NextScan_Imminent": "Imminent...",
"Device_NextScan_In": "Next scan in about ",
"Device_NoData_Help": "If devices don't appear after the scan, check your SCAN_SUBNETS setting and <a href=\"https://docs.netalertx.com/SUBNETS\" target=\"_blank\">documentation</a>.",
"Device_NoData_Scanning": "Waiting for the first scan - this may take several minutes after the initial setup.",
"Device_NoData_Title": "No devices found yet",
"Device_Save_Failed": "Failed to save device", "Device_Save_Failed": "Failed to save device",
"Device_Save_Unauthorized": "Unauthorized - invalid API token", "Device_Save_Unauthorized": "Unauthorized - invalid API token",
"Device_Saved_Success": "Device saved successfully", "Device_Saved_Success": "Device saved successfully",
"Device_Saved_Unexpected": "Device update returned an unexpected response", "Device_Saved_Unexpected": "Device update returned an unexpected response",
"Device_Scanning": "Scanning...",
"Device_Searchbox": "Search", "Device_Searchbox": "Search",
"Device_Shortcut_AllDevices": "My devices", "Device_Shortcut_AllDevices": "My devices",
"Device_Shortcut_AllNodes": "All Nodes", "Device_Shortcut_AllNodes": "All Nodes",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "Favorites", "Device_Shortcut_Favorites": "Favorites",
"Device_Shortcut_NewDevices": "New devices", "Device_Shortcut_NewDevices": "New devices",
"Device_Shortcut_OnlineChart": "Device presence", "Device_Shortcut_OnlineChart": "Device presence",
"Device_Shortcut_Unstable": "Unstable",
"Device_TableHead_AlertDown": "Alert Down", "Device_TableHead_AlertDown": "Alert Down",
"Device_TableHead_Connected_Devices": "Connections", "Device_TableHead_Connected_Devices": "Connections",
"Device_TableHead_CustomProps": "Props / Actions", "Device_TableHead_CustomProps": "Props / Actions",
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Favorite", "Device_TableHead_Favorite": "Favorite",
"Device_TableHead_FirstSession": "First Session", "Device_TableHead_FirstSession": "First Session",
"Device_TableHead_Flapping": "Flapping",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Group", "Device_TableHead_Group": "Group",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "Add device", "Gen_AddDevice": "Add device",
"Gen_Add_All": "Add all", "Gen_Add_All": "Add all",
"Gen_All_Devices": "All devices", "Gen_All_Devices": "All devices",
"Gen_Archived": "Archived",
"Gen_AreYouSure": "Are you sure?", "Gen_AreYouSure": "Are you sure?",
"Gen_Backup": "Run Backup", "Gen_Backup": "Run Backup",
"Gen_Cancel": "Cancel", "Gen_Cancel": "Cancel",
@@ -333,16 +324,13 @@
"Gen_Delete": "Delete", "Gen_Delete": "Delete",
"Gen_DeleteAll": "Delete all", "Gen_DeleteAll": "Delete all",
"Gen_Description": "Description", "Gen_Description": "Description",
"Gen_Down": "Down",
"Gen_Error": "Error", "Gen_Error": "Error",
"Gen_Filter": "Filter", "Gen_Filter": "Filter",
"Gen_Flapping": "Flapping",
"Gen_Generate": "Generate", "Gen_Generate": "Generate",
"Gen_InvalidMac": "Invalid Mac address.", "Gen_InvalidMac": "Invalid Mac address.",
"Gen_Invalid_Value": "An invalid value was entered", "Gen_Invalid_Value": "An invalid value was entered",
"Gen_LockedDB": "ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.", "Gen_LockedDB": "ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.",
"Gen_NetworkMask": "Network mask", "Gen_NetworkMask": "Network mask",
"Gen_New": "New",
"Gen_Offline": "Offline", "Gen_Offline": "Offline",
"Gen_Okay": "Ok", "Gen_Okay": "Ok",
"Gen_Online": "Online", "Gen_Online": "Online",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Select to preview", "Gen_SelectToPreview": "Select to preview",
"Gen_Selected_Devices": "Selected devices:", "Gen_Selected_Devices": "Selected devices:",
"Gen_Sleeping": "Sleeping",
"Gen_Subnet": "Subnet", "Gen_Subnet": "Subnet",
"Gen_Switch": "Switch", "Gen_Switch": "Switch",
"Gen_Upd": "Updated successfully", "Gen_Upd": "Updated successfully",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "Update Value", "Gen_Update_Value": "Update Value",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Warning", "Gen_Warning": "Warning",
"Gen_Work_In_Progress": "Work in progress, good time to feedback on https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Work in progress, good time to feedback on https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "New device", "Gen_create_new_device": "New device",
"Gen_create_new_device_info": "Devices are typically discovered using <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>. However, in certain cases, you may need to add devices manually. To explore specific scenarios check the <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">Remote Networks documentation</a>.", "Gen_create_new_device_info": "Devices are typically discovered using <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>. However, in certain cases, you may need to add devices manually. To explore specific scenarios check the <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">Remote Networks documentation</a>.",
"General_display_name": "General", "General_display_name": "General",
@@ -385,7 +372,7 @@
"Loading": "Loading…", "Loading": "Loading…",
"Login_Box": "Enter your password", "Login_Box": "Enter your password",
"Login_Default_PWD": "Default password \"123456\" is still active.", "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/netalertx/NetAlertX/tree/main/front/plugins/set_password\">SETPWD docs</a> if you have issues logging in.", "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.",
"Login_Psw-box": "Password", "Login_Psw-box": "Password",
"Login_Psw_alert": "Password Alert!", "Login_Psw_alert": "Password Alert!",
"Login_Psw_folder": "in the config folder.", "Login_Psw_folder": "in the config folder.",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "is currently disabled", "Maintenance_arp_status_off": "is currently disabled",
"Maintenance_arp_status_on": "scanning in progress", "Maintenance_arp_status_on": "scanning in progress",
"Maintenance_built_on": "Built on", "Maintenance_built_on": "Built on",
"Maintenance_current_version": "You are up-to-date. Check out what <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">I am working on</a>.", "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", "Maintenance_database_backup": "DB Backups",
"Maintenance_database_backup_found": "backups were found", "Maintenance_database_backup_found": "backups were found",
"Maintenance_database_backup_total": "total disk usage", "Maintenance_database_backup_total": "total disk usage",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "Choose Language", "Maintenance_lang_selector_empty": "Choose Language",
"Maintenance_lang_selector_lable": "Select Language", "Maintenance_lang_selector_lable": "Select Language",
"Maintenance_lang_selector_text": "The change takes place on the client side, so it affects only the current browser.", "Maintenance_lang_selector_text": "The change takes place on the client side, so it affects only the current browser.",
"Maintenance_new_version": "A new version is available. Check out the <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">release notes</a>.", "Maintenance_new_version": "A new version is available. Check out the <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">release notes</a>.",
"Maintenance_themeselector_apply": "Apply", "Maintenance_themeselector_apply": "Apply",
"Maintenance_themeselector_empty": "Choose a Skin", "Maintenance_themeselector_empty": "Choose a Skin",
"Maintenance_themeselector_lable": "Select Skin", "Maintenance_themeselector_lable": "Select Skin",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "Enable login", "PIALERT_WEB_PROTECTION_name": "Enable login",
"PLUGINS_KEEP_HIST_description": "How many entries of Plugins History scan results should be kept (per Plugin, and not device specific).", "PLUGINS_KEEP_HIST_description": "How many entries of Plugins History scan results should be kept (per Plugin, and not device specific).",
"PLUGINS_KEEP_HIST_name": "Plugins History", "PLUGINS_KEEP_HIST_name": "Plugins History",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "SQLite WAL (Write-Ahead Log) maximum size in MB before triggering automatic checkpoints. Lower values (10-20 MB) reduce disk/storage usage but increase CPU usage during scans. Higher values (50-100 MB) reduce CPU spikes during operations but may use more RAM and disk space. Default <code>50 MB</code> balances both. Useful for resource-constrained systems like NAS devices with SD cards. Restart server for changes to take effect after saving the settings.",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "WAL size limit (MB)",
"Plugins_DeleteAll": "Delete all (filters are ignored)", "Plugins_DeleteAll": "Delete all (filters are ignored)",
"Plugins_Filters_Mac": "Mac Filter", "Plugins_Filters_Mac": "Mac Filter",
"Plugins_History": "Events History", "Plugins_History": "Events History",

View File

@@ -29,8 +29,8 @@
"AppEvents_Type": "Tipo", "AppEvents_Type": "Tipo",
"Apprise_display_name": "Apprise", "Apprise_display_name": "Apprise",
"Apprise_icon": "<i class=\"fa fa-bullhorn\"></i>", "Apprise_icon": "<i class=\"fa fa-bullhorn\"></i>",
"BACKEND_API_URL_description": "Usado para permitir al front comunicarse con el backend. Por defecto está definido en <code>/server</code> y generalmente no debiera cambiarse.", "BACKEND_API_URL_description": "",
"BACKEND_API_URL_name": "URL de la API de backend", "BACKEND_API_URL_name": "",
"BackDevDetail_Actions_Ask_Run": "¿Desea ejecutar la acción?", "BackDevDetail_Actions_Ask_Run": "¿Desea ejecutar la acción?",
"BackDevDetail_Actions_Not_Registered": "Acción no registrada: ", "BackDevDetail_Actions_Not_Registered": "Acción no registrada: ",
"BackDevDetail_Actions_Title_Run": "Ejecutar acción", "BackDevDetail_Actions_Title_Run": "Ejecutar acción",
@@ -111,7 +111,7 @@
"DevDetail_Network_Node_hover": "Seleccione el dispositivo de red principal al que está conectado el dispositivo actual para completar el árbol de Red.", "DevDetail_Network_Node_hover": "Seleccione el dispositivo de red principal al que está conectado el dispositivo actual para completar el árbol de Red.",
"DevDetail_Network_Port_hover": "El puerto al que está conectado este dispositivo en el dispositivo de red principal. Si se deja vacío, se muestra un icono de wifi en el árbol de Red.", "DevDetail_Network_Port_hover": "El puerto al que está conectado este dispositivo en el dispositivo de red principal. Si se deja vacío, se muestra un icono de wifi en el árbol de Red.",
"DevDetail_Nmap_Scans": "Escaneos de Nmap", "DevDetail_Nmap_Scans": "Escaneos de Nmap",
"DevDetail_Nmap_Scans_desc": "Aquí puede ejecutar escaneos NMAP manuales. También puede programar escaneos NMAP automáticos regulares a través del complemento Servicios y puertos (NMAP). Dirígete a <a href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Documentación</a> para obtener más información", "DevDetail_Nmap_Scans_desc": "Aquí puede ejecutar escaneos NMAP manuales. También puede programar escaneos NMAP automáticos regulares a través del complemento Servicios y puertos (NMAP). Dirígete a <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Documentación</a> para obtener más información",
"DevDetail_Nmap_buttonDefault": "Escaneado predeterminado", "DevDetail_Nmap_buttonDefault": "Escaneado predeterminado",
"DevDetail_Nmap_buttonDefault_text": "Escaneo predeterminado: NMAP escanea los 1,000 puertos principales para cada protocolo de escaneo solicitado. Esto atrapa aproximadamente el 93% de los puertos TCP y el 49% de los puertos UDP. (aproximadamente 5 segundos)", "DevDetail_Nmap_buttonDefault_text": "Escaneo predeterminado: NMAP escanea los 1,000 puertos principales para cada protocolo de escaneo solicitado. Esto atrapa aproximadamente el 93% de los puertos TCP y el 49% de los puertos UDP. (aproximadamente 5 segundos)",
"DevDetail_Nmap_buttonDetail": "Escaneo detallado", "DevDetail_Nmap_buttonDetail": "Escaneo detallado",
@@ -203,18 +203,12 @@
"Device_MultiEdit_Backup": "Tenga cuidado, ingresar valores incorrectos o romperá su configuración. Por favor, haga una copia de seguridad de su base de datos o de la configuración de los dispositivos primero (<a href=\"#\" onclick=\"ExportCSV()\">haga clic para descargar <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Lea cómo recuperar dispositivos de este archivo en la documentación de <a href=\"https://docs.netalertx.com/BACKUPS#scenario-2-corrupted-database\" target=\"_blank\">Copia de seguridad</a>. Para aplicar sus cambios haga click en el ícono de <b>Guardar<i class=\"fa-solid fa-save\"></i></b> en cada campo que quiera actualizar.", "Device_MultiEdit_Backup": "Tenga cuidado, ingresar valores incorrectos o romperá su configuración. Por favor, haga una copia de seguridad de su base de datos o de la configuración de los dispositivos primero (<a href=\"#\" onclick=\"ExportCSV()\">haga clic para descargar <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Lea cómo recuperar dispositivos de este archivo en la documentación de <a href=\"https://docs.netalertx.com/BACKUPS#scenario-2-corrupted-database\" target=\"_blank\">Copia de seguridad</a>. Para aplicar sus cambios haga click en el ícono de <b>Guardar<i class=\"fa-solid fa-save\"></i></b> en cada campo que quiera actualizar.",
"Device_MultiEdit_Fields": "Editar campos:", "Device_MultiEdit_Fields": "Editar campos:",
"Device_MultiEdit_MassActions": "Acciones masivas:", "Device_MultiEdit_MassActions": "Acciones masivas:",
"Device_MultiEdit_No_Devices": "Sin dispositivo seleccionado.", "Device_MultiEdit_No_Devices": "",
"Device_MultiEdit_Tooltip": "Cuidado. Al hacer clic se aplicará el valor de la izquierda a todos los dispositivos seleccionados anteriormente.", "Device_MultiEdit_Tooltip": "Cuidado. Al hacer clic se aplicará el valor de la izquierda a todos los dispositivos seleccionados anteriormente.",
"Device_NextScan_Imminent": "", "Device_Save_Failed": "",
"Device_NextScan_In": "", "Device_Save_Unauthorized": "",
"Device_NoData_Help": "", "Device_Saved_Success": "",
"Device_NoData_Scanning": "", "Device_Saved_Unexpected": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "Fallo al guardar el dispositivo",
"Device_Save_Unauthorized": "No autorizado - Token de API inválido",
"Device_Saved_Success": "Dispositivo guardado exitósamente",
"Device_Saved_Unexpected": "La actualización del dispositivo retornó una respuesta inesperada",
"Device_Scanning": "",
"Device_Searchbox": "Búsqueda", "Device_Searchbox": "Búsqueda",
"Device_Shortcut_AllDevices": "Mis dispositivos", "Device_Shortcut_AllDevices": "Mis dispositivos",
"Device_Shortcut_AllNodes": "Todos los nodos", "Device_Shortcut_AllNodes": "Todos los nodos",
@@ -226,19 +220,17 @@
"Device_Shortcut_Favorites": "Favorito(s)", "Device_Shortcut_Favorites": "Favorito(s)",
"Device_Shortcut_NewDevices": "Nuevos dispositivos", "Device_Shortcut_NewDevices": "Nuevos dispositivos",
"Device_Shortcut_OnlineChart": "Presencia del dispositivo a lo largo del tiempo", "Device_Shortcut_OnlineChart": "Presencia del dispositivo a lo largo del tiempo",
"Device_Shortcut_Unstable": "Inestable",
"Device_TableHead_AlertDown": "Alerta desactivada", "Device_TableHead_AlertDown": "Alerta desactivada",
"Device_TableHead_Connected_Devices": "Conexiones", "Device_TableHead_Connected_Devices": "Conexiones",
"Device_TableHead_CustomProps": "Propiedades / Acciones", "Device_TableHead_CustomProps": "Propiedades / Acciones",
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Favorito", "Device_TableHead_Favorite": "Favorito",
"Device_TableHead_FirstSession": "1ra. sesión", "Device_TableHead_FirstSession": "1ra. sesión",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grupo", "Device_TableHead_Group": "Grupo",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "",
"Device_TableHead_IPv6": "IPv6", "Device_TableHead_IPv6": "",
"Device_TableHead_Icon": "Ícono", "Device_TableHead_Icon": "Icon",
"Device_TableHead_LastIP": "Última IP", "Device_TableHead_LastIP": "Última IP",
"Device_TableHead_LastIPOrder": "Última orden de IP", "Device_TableHead_LastIPOrder": "Última orden de IP",
"Device_TableHead_LastSession": "Última conexión", "Device_TableHead_LastSession": "Última conexión",
@@ -261,7 +253,7 @@
"Device_TableHead_SyncHubNodeName": "Nodo de sincronización", "Device_TableHead_SyncHubNodeName": "Nodo de sincronización",
"Device_TableHead_Type": "Tipo", "Device_TableHead_Type": "Tipo",
"Device_TableHead_Vendor": "Fabricante", "Device_TableHead_Vendor": "Fabricante",
"Device_TableHead_Vlan": "VLAN", "Device_TableHead_Vlan": "",
"Device_Table_Not_Network_Device": "No está configurado como dispositivo de red", "Device_Table_Not_Network_Device": "No está configurado como dispositivo de red",
"Device_Table_info": "Mostrando el INICIO y el FINAL de TODAS las entradas", "Device_Table_info": "Mostrando el INICIO y el FINAL de TODAS las entradas",
"Device_Table_nav_next": "Siguiente", "Device_Table_nav_next": "Siguiente",
@@ -309,14 +301,14 @@
"Events_Tablelenght": "Mostrando entradas del MENÚ", "Events_Tablelenght": "Mostrando entradas del MENÚ",
"Events_Tablelenght_all": "Todos", "Events_Tablelenght_all": "Todos",
"Events_Title": "Eventos", "Events_Title": "Eventos",
"FakeMAC_hover": "Este dispositivo tiene una dirección MAC falsa/alterada", "FakeMAC_hover": "",
"FieldLock_Error": "Error actualizando el estado de bloqueo del campo", "FieldLock_Error": "",
"FieldLock_Lock_Tooltip": "Campo bloqueado (impide sobreescrituras del plugin)", "FieldLock_Lock_Tooltip": "",
"FieldLock_Locked": "Campo bloqueado", "FieldLock_Locked": "",
"FieldLock_SaveBeforeLocking": "Guarda tus cambios antes de bloquear", "FieldLock_SaveBeforeLocking": "",
"FieldLock_Source_Label": "Fuente: ", "FieldLock_Source_Label": "",
"FieldLock_Unlock_Tooltip": "Campo desbloqueado (permite sobreescritura del plugin)", "FieldLock_Unlock_Tooltip": "",
"FieldLock_Unlocked": "Campo desbloqueado", "FieldLock_Unlocked": "",
"GRAPHQL_PORT_description": "El número de puerto del servidor GraphQL. Asegúrese de que el puerto sea único en todas sus aplicaciones en este host y en las instancias de NetAlertX.", "GRAPHQL_PORT_description": "El número de puerto del servidor GraphQL. Asegúrese de que el puerto sea único en todas sus aplicaciones en este host y en las instancias de NetAlertX.",
"GRAPHQL_PORT_name": "Puerto GraphQL", "GRAPHQL_PORT_name": "Puerto GraphQL",
"Gen_Action": "Acción", "Gen_Action": "Acción",
@@ -324,27 +316,23 @@
"Gen_AddDevice": "Añadir dispositivo", "Gen_AddDevice": "Añadir dispositivo",
"Gen_Add_All": "Añadir todo", "Gen_Add_All": "Añadir todo",
"Gen_All_Devices": "Todos los dispositivos", "Gen_All_Devices": "Todos los dispositivos",
"Gen_Archived": "",
"Gen_AreYouSure": "¿Estás seguro?", "Gen_AreYouSure": "¿Estás seguro?",
"Gen_Backup": "Ejecutar copia de seguridad", "Gen_Backup": "Ejecutar copia de seguridad",
"Gen_Cancel": "Cancelar", "Gen_Cancel": "Cancelar",
"Gen_Change": "Cambiar", "Gen_Change": "Cambiar",
"Gen_Copy": "Ejecutar", "Gen_Copy": "Ejecutar",
"Gen_CopyToClipboard": "Copiar al portapapeles", "Gen_CopyToClipboard": "",
"Gen_DataUpdatedUITakesTime": "Correcto - La interfaz puede tardar en actualizarse si se está ejecutando un escaneo.", "Gen_DataUpdatedUITakesTime": "Correcto - La interfaz puede tardar en actualizarse si se está ejecutando un escaneo.",
"Gen_Delete": "Eliminar", "Gen_Delete": "Eliminar",
"Gen_DeleteAll": "Eliminar todo", "Gen_DeleteAll": "Eliminar todo",
"Gen_Description": "Descripción", "Gen_Description": "Descripción",
"Gen_Down": "",
"Gen_Error": "Error", "Gen_Error": "Error",
"Gen_Filter": "Filtro", "Gen_Filter": "Filtro",
"Gen_Flapping": "",
"Gen_Generate": "Generar", "Gen_Generate": "Generar",
"Gen_InvalidMac": "Dirección MAC inválida.", "Gen_InvalidMac": "",
"Gen_Invalid_Value": "Un valor inválido fue ingresado", "Gen_Invalid_Value": "",
"Gen_LockedDB": "Fallo - La base de datos puede estar bloqueada - Pulsa F1 -> Ajustes de desarrolladores -> Consola o prueba más tarde.", "Gen_LockedDB": "Fallo - La base de datos puede estar bloqueada - Pulsa F1 -> Ajustes de desarrolladores -> Consola o prueba más tarde.",
"Gen_NetworkMask": "Máscara de red", "Gen_NetworkMask": "",
"Gen_New": "",
"Gen_Offline": "Desconectado", "Gen_Offline": "Desconectado",
"Gen_Okay": "Aceptar", "Gen_Okay": "Aceptar",
"Gen_Online": "En linea", "Gen_Online": "En linea",
@@ -362,8 +350,7 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Seleccionar para previsualizar", "Gen_SelectToPreview": "Seleccionar para previsualizar",
"Gen_Selected_Devices": "Dispositivos seleccionados:", "Gen_Selected_Devices": "Dispositivos seleccionados:",
"Gen_Sleeping": "", "Gen_Subnet": "",
"Gen_Subnet": "Subred",
"Gen_Switch": "Cambiar", "Gen_Switch": "Cambiar",
"Gen_Upd": "Actualizado correctamente", "Gen_Upd": "Actualizado correctamente",
"Gen_Upd_Fail": "Fallo al actualizar", "Gen_Upd_Fail": "Fallo al actualizar",
@@ -371,7 +358,7 @@
"Gen_Update_Value": "Actualizar valor", "Gen_Update_Value": "Actualizar valor",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Advertencia", "Gen_Warning": "Advertencia",
"Gen_Work_In_Progress": "Trabajo en curso, un buen momento para hacer comentarios en https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Trabajo en curso, un buen momento para hacer comentarios en https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Nuevo dispositivo", "Gen_create_new_device": "Nuevo dispositivo",
"Gen_create_new_device_info": "Los dispositivos se suelen descubrir utilizando <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>. Sin embargo, en algunos casos, es posible que necesite agregar dispositivos manualmente. Para explorar escenarios específicos, consulte la documentación <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">Redes remotas</a>.", "Gen_create_new_device_info": "Los dispositivos se suelen descubrir utilizando <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>. Sin embargo, en algunos casos, es posible que necesite agregar dispositivos manualmente. Para explorar escenarios específicos, consulte la documentación <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">Redes remotas</a>.",
"General_display_name": "General", "General_display_name": "General",
@@ -387,7 +374,7 @@
"Loading": "Cargando . . .", "Loading": "Cargando . . .",
"Login_Box": "Ingrese su contraseña", "Login_Box": "Ingrese su contraseña",
"Login_Default_PWD": "La contraseña por defecto \"123456\" sigue activa.", "Login_Default_PWD": "La contraseña por defecto \"123456\" sigue activa.",
"Login_Info": "Las contraseñas se establecen a través del plugin Establecer contraseña. Compruebe la <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/set_password\">documentación SETPWD</a> si tiene problemas para iniciar sesión.", "Login_Info": "Las contraseñas se establecen a través del plugin Establecer contraseña. Compruebe la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">documentación SETPWD</a> si tiene problemas para iniciar sesión.",
"Login_Psw-box": "Contraseña", "Login_Psw-box": "Contraseña",
"Login_Psw_alert": "¡Alerta de Contraseña!", "Login_Psw_alert": "¡Alerta de Contraseña!",
"Login_Psw_folder": "en la carpeta config.", "Login_Psw_folder": "en la carpeta config.",
@@ -443,10 +430,10 @@
"Maintenance_Tool_ImportPastedConfig": "Importar ajustes (pegar)", "Maintenance_Tool_ImportPastedConfig": "Importar ajustes (pegar)",
"Maintenance_Tool_ImportPastedConfig_noti_text": "¿Seguro que quieres importar la configuración pegada? Esto <b>sobrescribirá</b> por completo el archivo <code>app.conf</code>.", "Maintenance_Tool_ImportPastedConfig_noti_text": "¿Seguro que quieres importar la configuración pegada? Esto <b>sobrescribirá</b> por completo el archivo <code>app.conf</code>.",
"Maintenance_Tool_ImportPastedConfig_text": "Importa el archivo <code>app.conf</code> que contiene toda la configuración de la aplicación. Es recomendable descargar primero el archivo <code>app.conf</code> actual con la <b>Exportación de configuración</b>.", "Maintenance_Tool_ImportPastedConfig_text": "Importa el archivo <code>app.conf</code> que contiene toda la configuración de la aplicación. Es recomendable descargar primero el archivo <code>app.conf</code> actual con la <b>Exportación de configuración</b>.",
"Maintenance_Tool_UnlockFields": "Campos Desbloqueo del Dispositivo", "Maintenance_Tool_UnlockFields": "",
"Maintenance_Tool_UnlockFields_noti": "Campos Desbloqueo del Dispositivo", "Maintenance_Tool_UnlockFields_noti": "",
"Maintenance_Tool_UnlockFields_noti_text": "¿Está seguro que desea limpiar los valores fuente (BLOQUEADO/USUARIO) para todos los campos dispositivo en todos los dispositivos? Esta acción no puede deshacerse.", "Maintenance_Tool_UnlockFields_noti_text": "",
"Maintenance_Tool_UnlockFields_text": "Esta herramienta removerá todos los valores fuente de cada campo de traza para todos los dispositivos, desbloqueando efectivamente todos los campos para plugins y usuarios. Use esto con precaución, dado que afectará todo su inventario de dispositivos.", "Maintenance_Tool_UnlockFields_text": "",
"Maintenance_Tool_arpscansw": "Activar arp-scan (on/off)", "Maintenance_Tool_arpscansw": "Activar arp-scan (on/off)",
"Maintenance_Tool_arpscansw_noti": "Activar arp-scan on or off", "Maintenance_Tool_arpscansw_noti": "Activar arp-scan on or off",
"Maintenance_Tool_arpscansw_noti_text": "Cuando el escaneo se ha apagado, permanece apagado hasta que se active nuevamente.", "Maintenance_Tool_arpscansw_noti_text": "Cuando el escaneo se ha apagado, permanece apagado hasta que se active nuevamente.",
@@ -456,9 +443,9 @@
"Maintenance_Tool_backup_noti_text": "¿Estás seguro de que quieres exactos la copia de seguridad de DB? Asegúrese de que ningún escaneo se esté ejecutando actualmente.", "Maintenance_Tool_backup_noti_text": "¿Estás seguro de que quieres exactos la copia de seguridad de DB? Asegúrese de que ningún escaneo se esté ejecutando actualmente.",
"Maintenance_Tool_backup_text": "Las copias de seguridad de la base de datos se encuentran en el directorio de la base de datos como una Zip-Archive, nombrada con la fecha de creación. No hay un número máximo de copias de seguridad.", "Maintenance_Tool_backup_text": "Las copias de seguridad de la base de datos se encuentran en el directorio de la base de datos como una Zip-Archive, nombrada con la fecha de creación. No hay un número máximo de copias de seguridad.",
"Maintenance_Tool_check_visible": "Desactivar para ocultar columna.", "Maintenance_Tool_check_visible": "Desactivar para ocultar columna.",
"Maintenance_Tool_clearSourceFields_selected": "Limpiar campos fuente", "Maintenance_Tool_clearSourceFields_selected": "",
"Maintenance_Tool_clearSourceFields_selected_noti": "Limpiar fuentes", "Maintenance_Tool_clearSourceFields_selected_noti": "",
"Maintenance_Tool_clearSourceFields_selected_text": "Esto limpiará todos los campos fuente de los dispositivos seleccionados. Esta acción no puede deshacerse.", "Maintenance_Tool_clearSourceFields_selected_text": "",
"Maintenance_Tool_darkmode": "Cambiar Modo (Dark/Light)", "Maintenance_Tool_darkmode": "Cambiar Modo (Dark/Light)",
"Maintenance_Tool_darkmode_noti": "Cambiar Modo", "Maintenance_Tool_darkmode_noti": "Cambiar Modo",
"Maintenance_Tool_darkmode_noti_text": "Después del cambio de tema, la página intenta volver a cargar para activar el cambio. Si es necesario, el caché debe ser eliminado.", "Maintenance_Tool_darkmode_noti_text": "Después del cambio de tema, la página intenta volver a cargar para activar el cambio. Si es necesario, el caché debe ser eliminado.",
@@ -489,7 +476,7 @@
"Maintenance_Tool_del_unknowndev_noti": "Eliminar dispositivos (desconocidos)", "Maintenance_Tool_del_unknowndev_noti": "Eliminar dispositivos (desconocidos)",
"Maintenance_Tool_del_unknowndev_noti_text": "¿Estás seguro de que quieres eliminar todos los dispositivos (desconocidos)?", "Maintenance_Tool_del_unknowndev_noti_text": "¿Estás seguro de que quieres eliminar todos los dispositivos (desconocidos)?",
"Maintenance_Tool_del_unknowndev_text": "Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Todos los dispositivos nombrados (desconocidos) se eliminarán de la base de datos.", "Maintenance_Tool_del_unknowndev_text": "Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Todos los dispositivos nombrados (desconocidos) se eliminarán de la base de datos.",
"Maintenance_Tool_del_unlockFields_selecteddev_text": "Esto desbloqueará los campos BLOQUEADO/USUARIO de los dispositivos seleccionados. Esta acción no puede deshacerse.", "Maintenance_Tool_del_unlockFields_selecteddev_text": "",
"Maintenance_Tool_displayed_columns_text": "Cambia la visibilidad y el orden de las columnas en la página <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Dispositivos</b></a>.", "Maintenance_Tool_displayed_columns_text": "Cambia la visibilidad y el orden de las columnas en la página <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Dispositivos</b></a>.",
"Maintenance_Tool_drag_me": "Coger para rearrastrar columnas.", "Maintenance_Tool_drag_me": "Coger para rearrastrar columnas.",
"Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text", "Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text",
@@ -501,8 +488,8 @@
"Maintenance_Tool_restore_noti": "Restaurar DB", "Maintenance_Tool_restore_noti": "Restaurar DB",
"Maintenance_Tool_restore_noti_text": "¿Estás seguro de que quieres hacer exactos la restauración de DB? Asegúrese de que ningún escaneo se esté ejecutando actualmente.", "Maintenance_Tool_restore_noti_text": "¿Estás seguro de que quieres hacer exactos la restauración de DB? Asegúrese de que ningún escaneo se esté ejecutando actualmente.",
"Maintenance_Tool_restore_text": "La última copia de seguridad se puede restaurar a través del botón, pero las copias de seguridad anteriores solo se pueden restaurar manualmente. Después de la restauración, realice una verificación de integridad en la base de datos por seguridad, en caso de que el DB estuviera actualmente en acceso de escritura cuando se creó la copia de seguridad.", "Maintenance_Tool_restore_text": "La última copia de seguridad se puede restaurar a través del botón, pero las copias de seguridad anteriores solo se pueden restaurar manualmente. Después de la restauración, realice una verificación de integridad en la base de datos por seguridad, en caso de que el DB estuviera actualmente en acceso de escritura cuando se creó la copia de seguridad.",
"Maintenance_Tool_unlockFields_selecteddev": "Campos dispositivo desbloqueado", "Maintenance_Tool_unlockFields_selecteddev": "",
"Maintenance_Tool_unlockFields_selecteddev_noti": "Campos desbloqueo", "Maintenance_Tool_unlockFields_selecteddev_noti": "",
"Maintenance_Tool_upgrade_database_noti": "Actualizar la base de datos", "Maintenance_Tool_upgrade_database_noti": "Actualizar la base de datos",
"Maintenance_Tool_upgrade_database_noti_text": "¿Estás seguro de que quieres actualizar la base de datos? <br> (tal vez prefieras archivarla)", "Maintenance_Tool_upgrade_database_noti_text": "¿Estás seguro de que quieres actualizar la base de datos? <br> (tal vez prefieras archivarla)",
"Maintenance_Tool_upgrade_database_text": "Este botón actualizará la base de datos para habilitar la actividad de la red en las últimas 12 horas. Haga una copia de seguridad de su base de datos en caso de problemas.", "Maintenance_Tool_upgrade_database_text": "Este botón actualizará la base de datos para habilitar la actividad de la red en las últimas 12 horas. Haga una copia de seguridad de su base de datos en caso de problemas.",
@@ -515,7 +502,7 @@
"Maintenance_arp_status_off": "está actualmente deshabilitado", "Maintenance_arp_status_off": "está actualmente deshabilitado",
"Maintenance_arp_status_on": "escaneo en ejecución", "Maintenance_arp_status_on": "escaneo en ejecución",
"Maintenance_built_on": "Creada", "Maintenance_built_on": "Creada",
"Maintenance_current_version": "No hay actualizaciones disponibles. Comprueba en que <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">se está trabajando</a>.", "Maintenance_current_version": "No hay actualizaciones disponibles. Comprueba en que <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">se está trabajando</a>.",
"Maintenance_database_backup": "Copias de seguridad de BD", "Maintenance_database_backup": "Copias de seguridad de BD",
"Maintenance_database_backup_found": "copia(s) de seguridad encontrada(s)", "Maintenance_database_backup_found": "copia(s) de seguridad encontrada(s)",
"Maintenance_database_backup_total": "Uso total de disco", "Maintenance_database_backup_total": "Uso total de disco",
@@ -527,7 +514,7 @@
"Maintenance_lang_selector_empty": "Elija un idioma", "Maintenance_lang_selector_empty": "Elija un idioma",
"Maintenance_lang_selector_lable": "Seleccione su idioma", "Maintenance_lang_selector_lable": "Seleccione su idioma",
"Maintenance_lang_selector_text": "El cambio se produce en el lado del cliente, por lo que sólo afecta al navegador actual.", "Maintenance_lang_selector_text": "El cambio se produce en el lado del cliente, por lo que sólo afecta al navegador actual.",
"Maintenance_new_version": "Una nueva versión está disponible. Comprueba las <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">notas de lanzamiento</a>.", "Maintenance_new_version": "Una nueva versión está disponible. Comprueba las <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">notas de lanzamiento</a>.",
"Maintenance_themeselector_apply": "Aplicar", "Maintenance_themeselector_apply": "Aplicar",
"Maintenance_themeselector_empty": "Elige un tema", "Maintenance_themeselector_empty": "Elige un tema",
"Maintenance_themeselector_lable": "Seleccionar tema", "Maintenance_themeselector_lable": "Seleccionar tema",
@@ -617,8 +604,6 @@
"PIALERT_WEB_PROTECTION_name": "Habilitar inicio de sesión", "PIALERT_WEB_PROTECTION_name": "Habilitar inicio de sesión",
"PLUGINS_KEEP_HIST_description": "¿Cuántas entradas de los resultados del análisis del historial de complementos deben conservarse (globalmente, no específico del dispositivo!).", "PLUGINS_KEEP_HIST_description": "¿Cuántas entradas de los resultados del análisis del historial de complementos deben conservarse (globalmente, no específico del dispositivo!).",
"PLUGINS_KEEP_HIST_name": "Historial de complementos", "PLUGINS_KEEP_HIST_name": "Historial de complementos",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"PUSHSAFER_TOKEN_description": "Su clave secreta de la API de Pushsafer (token).", "PUSHSAFER_TOKEN_description": "Su clave secreta de la API de Pushsafer (token).",
"PUSHSAFER_TOKEN_name": "Token de Pushsafer", "PUSHSAFER_TOKEN_name": "Token de Pushsafer",
"PUSHSAFER_display_name": "Pushsafer", "PUSHSAFER_display_name": "Pushsafer",
@@ -702,7 +687,7 @@
"Settings_device_Scanners_desync": "⚠ Los horarios del escáner de los dispositivos no están sincronizados.", "Settings_device_Scanners_desync": "⚠ Los horarios del escáner de los dispositivos no están sincronizados.",
"Settings_device_Scanners_desync_popup": "Los horarios de escáneres de dispositivos (<code> *_RUN_SCHD</code> ) no son lo mismo. Esto resultará en notificaciones inconsistentes del dispositivo en línea/fuera de línea. A menos que sea así, utilice el mismo horario para todos los habilitados.<b> 🔍Escáneres de dispositivos</b> .", "Settings_device_Scanners_desync_popup": "Los horarios de escáneres de dispositivos (<code> *_RUN_SCHD</code> ) no son lo mismo. Esto resultará en notificaciones inconsistentes del dispositivo en línea/fuera de línea. A menos que sea así, utilice el mismo horario para todos los habilitados.<b> 🔍Escáneres de dispositivos</b> .",
"Speedtest_Results": "Resultados de la prueba de velocidad", "Speedtest_Results": "Resultados de la prueba de velocidad",
"Systeminfo_AvailableIps": "IPs disponibles", "Systeminfo_AvailableIps": "",
"Systeminfo_CPU": "CPU", "Systeminfo_CPU": "CPU",
"Systeminfo_CPU_Cores": "Núcleos de CPU:", "Systeminfo_CPU_Cores": "Núcleos de CPU:",
"Systeminfo_CPU_Name": "Nombre de la CPU:", "Systeminfo_CPU_Name": "Nombre de la CPU:",
@@ -796,7 +781,7 @@
"UI_REFRESH_name": "Actualización automática de la interfaz de usuario", "UI_REFRESH_name": "Actualización automática de la interfaz de usuario",
"VERSION_description": "Valor de ayuda de versión o marca de tiempo para comprobar si la aplicación se ha actualizado.", "VERSION_description": "Valor de ayuda de versión o marca de tiempo para comprobar si la aplicación se ha actualizado.",
"VERSION_name": "Versión o marca de tiempo", "VERSION_name": "Versión o marca de tiempo",
"WEBHOOK_PAYLOAD_description": "El formato de datos de carga de Webhook para el atributo <code>body</code> > <code>attachments</code> > <code>text</code> en el json de carga. Vea un ejemplo de la carga <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">aquí</a>. (por ejemplo: para discord use <code>text</code>)", "WEBHOOK_PAYLOAD_description": "El formato de datos de carga de Webhook para el atributo <code>body</code> > <code>attachments</code> > <code>text</code> en el json de carga. Vea un ejemplo de la carga <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">aquí</a>. (por ejemplo: para discord use <code>text</code>)",
"WEBHOOK_PAYLOAD_name": "Tipo de carga", "WEBHOOK_PAYLOAD_name": "Tipo de carga",
"WEBHOOK_REQUEST_METHOD_description": "El método de solicitud HTTP que se utilizará para la llamada de webhook.", "WEBHOOK_REQUEST_METHOD_description": "El método de solicitud HTTP que se utilizará para la llamada de webhook.",
"WEBHOOK_REQUEST_METHOD_name": "Método de solicitud", "WEBHOOK_REQUEST_METHOD_name": "Método de solicitud",

View File

@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "", "Device_MultiEdit_MassActions": "",
"Device_MultiEdit_No_Devices": "", "Device_MultiEdit_No_Devices": "",
"Device_MultiEdit_Tooltip": "", "Device_MultiEdit_Tooltip": "",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "", "Device_Save_Failed": "",
"Device_Save_Unauthorized": "", "Device_Save_Unauthorized": "",
"Device_Saved_Success": "", "Device_Saved_Success": "",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "", "Device_Searchbox": "",
"Device_Shortcut_AllDevices": "", "Device_Shortcut_AllDevices": "",
"Device_Shortcut_AllNodes": "", "Device_Shortcut_AllNodes": "",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "", "Device_Shortcut_Favorites": "",
"Device_Shortcut_NewDevices": "", "Device_Shortcut_NewDevices": "",
"Device_Shortcut_OnlineChart": "", "Device_Shortcut_OnlineChart": "",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "", "Device_TableHead_AlertDown": "",
"Device_TableHead_Connected_Devices": "", "Device_TableHead_Connected_Devices": "",
"Device_TableHead_CustomProps": "", "Device_TableHead_CustomProps": "",
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "", "Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "", "Device_TableHead_FirstSession": "",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "", "Device_TableHead_GUID": "",
"Device_TableHead_Group": "", "Device_TableHead_Group": "",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "", "Gen_AddDevice": "",
"Gen_Add_All": "", "Gen_Add_All": "",
"Gen_All_Devices": "", "Gen_All_Devices": "",
"Gen_Archived": "",
"Gen_AreYouSure": "", "Gen_AreYouSure": "",
"Gen_Backup": "", "Gen_Backup": "",
"Gen_Cancel": "", "Gen_Cancel": "",
@@ -333,16 +324,13 @@
"Gen_Delete": "", "Gen_Delete": "",
"Gen_DeleteAll": "", "Gen_DeleteAll": "",
"Gen_Description": "", "Gen_Description": "",
"Gen_Down": "",
"Gen_Error": "", "Gen_Error": "",
"Gen_Filter": "", "Gen_Filter": "",
"Gen_Flapping": "",
"Gen_Generate": "", "Gen_Generate": "",
"Gen_InvalidMac": "", "Gen_InvalidMac": "",
"Gen_Invalid_Value": "", "Gen_Invalid_Value": "",
"Gen_LockedDB": "", "Gen_LockedDB": "",
"Gen_NetworkMask": "", "Gen_NetworkMask": "",
"Gen_New": "",
"Gen_Offline": "", "Gen_Offline": "",
"Gen_Okay": "", "Gen_Okay": "",
"Gen_Online": "", "Gen_Online": "",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "", "Gen_SelectIcon": "",
"Gen_SelectToPreview": "", "Gen_SelectToPreview": "",
"Gen_Selected_Devices": "", "Gen_Selected_Devices": "",
"Gen_Sleeping": "",
"Gen_Subnet": "", "Gen_Subnet": "",
"Gen_Switch": "", "Gen_Switch": "",
"Gen_Upd": "", "Gen_Upd": "",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "", "PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "", "PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "", "PLUGINS_KEEP_HIST_name": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "", "Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "", "Plugins_Filters_Mac": "",
"Plugins_History": "", "Plugins_History": "",

View File

@@ -109,7 +109,7 @@
"DevDetail_Network_Node_hover": "Sélectionner l'appareil du réseau principal auquel cet appareil est connecté afin de compléter l'arborescence du Réseau.", "DevDetail_Network_Node_hover": "Sélectionner l'appareil du réseau principal auquel cet appareil est connecté afin de compléter l'arborescence du Réseau.",
"DevDetail_Network_Port_hover": "Le port auquel cet appareil est connecté sur l'appareil du réseau principal. Si vide, une icône Wifi est affichée dans l'arborescence du Réseau.", "DevDetail_Network_Port_hover": "Le port auquel cet appareil est connecté sur l'appareil du réseau principal. Si vide, une icône Wifi est affichée dans l'arborescence du Réseau.",
"DevDetail_Nmap_Scans": "Scans manuels via Nmap", "DevDetail_Nmap_Scans": "Scans manuels via Nmap",
"DevDetail_Nmap_Scans_desc": "Vous pouvez lancer des scans NMAP manuels. Vous pouvez aussi programmer des sans réguliers via le plugin Services & Ports (NMAP). Aller dans les <a href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Docs</a> pour plus de details", "DevDetail_Nmap_Scans_desc": "Vous pouvez lancer des scans NMAP manuels. Vous pouvez aussi programmer des sans réguliers via le plugin Services & Ports (NMAP). Aller dans les <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Docs</a> pour plus de details",
"DevDetail_Nmap_buttonDefault": "Scan par défaut", "DevDetail_Nmap_buttonDefault": "Scan par défaut",
"DevDetail_Nmap_buttonDefault_text": "Scan par défaut : NMAP scanne les 1 000 premiers ports pour chaque demande de scan de protocole. Cela couvre environ 93% des ports TCP et 49% des ports UDP (environ 5 secondes)", "DevDetail_Nmap_buttonDefault_text": "Scan par défaut : NMAP scanne les 1 000 premiers ports pour chaque demande de scan de protocole. Cela couvre environ 93% des ports TCP et 49% des ports UDP (environ 5 secondes)",
"DevDetail_Nmap_buttonDetail": "Scan détaillé", "DevDetail_Nmap_buttonDetail": "Scan détaillé",
@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "Actions en masse:", "Device_MultiEdit_MassActions": "Actions en masse:",
"Device_MultiEdit_No_Devices": "Aucun appareil sélectionné.", "Device_MultiEdit_No_Devices": "Aucun appareil sélectionné.",
"Device_MultiEdit_Tooltip": "Attention. Ceci va appliquer la valeur de gauche à tous les appareils sélectionnés au-dessus.", "Device_MultiEdit_Tooltip": "Attention. Ceci va appliquer la valeur de gauche à tous les appareils sélectionnés au-dessus.",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "Erreur à l'enregistrement de l'appareil", "Device_Save_Failed": "Erreur à l'enregistrement de l'appareil",
"Device_Save_Unauthorized": "Non autorisé - Jeton d'API invalide", "Device_Save_Unauthorized": "Non autorisé - Jeton d'API invalide",
"Device_Saved_Success": "Appareil enregistré avec succès", "Device_Saved_Success": "Appareil enregistré avec succès",
"Device_Saved_Unexpected": "La mise à jour de l'appareil a renvoyé une réponse inattendue", "Device_Saved_Unexpected": "La mise à jour de l'appareil a renvoyé une réponse inattendue",
"Device_Scanning": "",
"Device_Searchbox": "Rechercher", "Device_Searchbox": "Rechercher",
"Device_Shortcut_AllDevices": "Mes appareils", "Device_Shortcut_AllDevices": "Mes appareils",
"Device_Shortcut_AllNodes": "Tous les nœuds", "Device_Shortcut_AllNodes": "Tous les nœuds",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "Favoris", "Device_Shortcut_Favorites": "Favoris",
"Device_Shortcut_NewDevices": "Nouveaux appareils", "Device_Shortcut_NewDevices": "Nouveaux appareils",
"Device_Shortcut_OnlineChart": "Présence de l'appareil", "Device_Shortcut_OnlineChart": "Présence de l'appareil",
"Device_Shortcut_Unstable": "Instable",
"Device_TableHead_AlertDown": "Alerter si En panne", "Device_TableHead_AlertDown": "Alerter si En panne",
"Device_TableHead_Connected_Devices": "Connexions", "Device_TableHead_Connected_Devices": "Connexions",
"Device_TableHead_CustomProps": "Champs / Actions", "Device_TableHead_CustomProps": "Champs / Actions",
"Device_TableHead_FQDN": "Nom de domaine FQDN", "Device_TableHead_FQDN": "Nom de domaine FQDN",
"Device_TableHead_Favorite": "Favori", "Device_TableHead_Favorite": "Favori",
"Device_TableHead_FirstSession": "Première session", "Device_TableHead_FirstSession": "Première session",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Groupe", "Device_TableHead_Group": "Groupe",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "Ajouter un appareil", "Gen_AddDevice": "Ajouter un appareil",
"Gen_Add_All": "Ajouter tous", "Gen_Add_All": "Ajouter tous",
"Gen_All_Devices": "Tous les appareils", "Gen_All_Devices": "Tous les appareils",
"Gen_Archived": "",
"Gen_AreYouSure": "Êtes-vous sûr?", "Gen_AreYouSure": "Êtes-vous sûr?",
"Gen_Backup": "Lancer la sauvegarde", "Gen_Backup": "Lancer la sauvegarde",
"Gen_Cancel": "Annuler", "Gen_Cancel": "Annuler",
@@ -333,16 +324,13 @@
"Gen_Delete": "Supprimer", "Gen_Delete": "Supprimer",
"Gen_DeleteAll": "Supprimer tous", "Gen_DeleteAll": "Supprimer tous",
"Gen_Description": "Description", "Gen_Description": "Description",
"Gen_Down": "",
"Gen_Error": "Erreur", "Gen_Error": "Erreur",
"Gen_Filter": "Filtrer", "Gen_Filter": "Filtrer",
"Gen_Flapping": "",
"Gen_Generate": "Générer", "Gen_Generate": "Générer",
"Gen_InvalidMac": "Adresse MAC invalide.", "Gen_InvalidMac": "Adresse MAC invalide.",
"Gen_Invalid_Value": "Une valeur invalide a été renseignée", "Gen_Invalid_Value": "Une valeur invalide a été renseignée",
"Gen_LockedDB": "Erreur - La base de données est peut-être verrouillée - Vérifier avec les outils de dév via F12 -> Console ou essayer plus tard.", "Gen_LockedDB": "Erreur - La base de données est peut-être verrouillée - Vérifier avec les outils de dév via F12 -> Console ou essayer plus tard.",
"Gen_NetworkMask": "Masque réseau", "Gen_NetworkMask": "Masque réseau",
"Gen_New": "",
"Gen_Offline": "Hors ligne", "Gen_Offline": "Hors ligne",
"Gen_Okay": "OK", "Gen_Okay": "OK",
"Gen_Online": "En ligne", "Gen_Online": "En ligne",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Sélectionnez pour prévisualiser", "Gen_SelectToPreview": "Sélectionnez pour prévisualiser",
"Gen_Selected_Devices": "Appareils sélectionnés :", "Gen_Selected_Devices": "Appareils sélectionnés :",
"Gen_Sleeping": "",
"Gen_Subnet": "Sous-réseau", "Gen_Subnet": "Sous-réseau",
"Gen_Switch": "Basculer", "Gen_Switch": "Basculer",
"Gen_Upd": "Mise à jour réussie", "Gen_Upd": "Mise à jour réussie",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "Valeur à mettre à jour", "Gen_Update_Value": "Valeur à mettre à jour",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Avertissement", "Gen_Warning": "Avertissement",
"Gen_Work_In_Progress": "Travaux en cours, c'est le bon moment pour faire un retour via la liste d'anomalies sur Github https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Travaux en cours, c'est le bon moment pour faire un retour via la liste d'anomalies sur Github https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Nouvel appareil", "Gen_create_new_device": "Nouvel appareil",
"Gen_create_new_device_info": "Les appareils sont souvent découverts à l'aide d'un <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugin</a>. Cependant, dans certains cas, vous pouvez ajouter manuellement les appareils. Pour explorer des scénarios spécifiques, consulter la <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">documentation des réseaux distants</a>.", "Gen_create_new_device_info": "Les appareils sont souvent découverts à l'aide d'un <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugin</a>. Cependant, dans certains cas, vous pouvez ajouter manuellement les appareils. Pour explorer des scénarios spécifiques, consulter la <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">documentation des réseaux distants</a>.",
"General_display_name": "Général", "General_display_name": "Général",
@@ -385,7 +372,7 @@
"Loading": "Chargement…", "Loading": "Chargement…",
"Login_Box": "Saisir votre mot de passe", "Login_Box": "Saisir votre mot de passe",
"Login_Default_PWD": "Le mot de passe par défaut \"123456\" est encore actif.", "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/netalertx/NetAlertX/tree/main/front/plugins/set_password\">documentation de SETPWD</a> si vous rencontrez des difficultés à vous identifier.", "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.",
"Login_Psw-box": "Mot de passe", "Login_Psw-box": "Mot de passe",
"Login_Psw_alert": "Alerte de mot de passe!", "Login_Psw_alert": "Alerte de mot de passe!",
"Login_Psw_folder": "dans le dossier de configuration.", "Login_Psw_folder": "dans le dossier de configuration.",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "est actuellement désactivé", "Maintenance_arp_status_off": "est actuellement désactivé",
"Maintenance_arp_status_on": "scan en cours", "Maintenance_arp_status_on": "scan en cours",
"Maintenance_built_on": "Construit sur", "Maintenance_built_on": "Construit sur",
"Maintenance_current_version": "Vous êtes à jour. Découvrez sur quoi <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">je travaille</a>.", "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", "Maintenance_database_backup": "Sauvegardes de base de données",
"Maintenance_database_backup_found": "des sauvegardes ont été trouvées", "Maintenance_database_backup_found": "des sauvegardes ont été trouvées",
"Maintenance_database_backup_total": "utilisation totale du disque", "Maintenance_database_backup_total": "utilisation totale du disque",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "Choix de la langue", "Maintenance_lang_selector_empty": "Choix de la langue",
"Maintenance_lang_selector_lable": "Sélectionner une langue", "Maintenance_lang_selector_lable": "Sélectionner une langue",
"Maintenance_lang_selector_text": "Le changement est effectué côté client, cela ne concerne donc que le navigateur actuel.", "Maintenance_lang_selector_text": "Le changement est effectué côté client, cela ne concerne donc que le navigateur actuel.",
"Maintenance_new_version": "Une nouvelle version est disponible. Consulter les <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">notes de version</a>.", "Maintenance_new_version": "Une nouvelle version est disponible. Consulter les <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">notes de version</a>.",
"Maintenance_themeselector_apply": "Appliquer", "Maintenance_themeselector_apply": "Appliquer",
"Maintenance_themeselector_empty": "Choisir un thème", "Maintenance_themeselector_empty": "Choisir un thème",
"Maintenance_themeselector_lable": "Sélectionner un thème", "Maintenance_themeselector_lable": "Sélectionner un thème",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "Activer la connexion par login", "PIALERT_WEB_PROTECTION_name": "Activer la connexion par login",
"PLUGINS_KEEP_HIST_description": "Combien d'entrées de résultats de scan doivent être conservés dans l'historique des plugins (par plugin, pas par appareil).", "PLUGINS_KEEP_HIST_description": "Combien d'entrées de résultats de scan doivent être conservés dans l'historique des plugins (par plugin, pas par appareil).",
"PLUGINS_KEEP_HIST_name": "Historique des plugins", "PLUGINS_KEEP_HIST_name": "Historique des plugins",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "Tout supprimer (ne prend pas en compte les filtres)", "Plugins_DeleteAll": "Tout supprimer (ne prend pas en compte les filtres)",
"Plugins_Filters_Mac": "Filtrer par MAC", "Plugins_Filters_Mac": "Filtrer par MAC",
"Plugins_History": "Historique des événements", "Plugins_History": "Historique des événements",
@@ -804,4 +789,4 @@
"settings_system_label": "Système", "settings_system_label": "Système",
"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>", "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_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage." "test_event_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage."
} }

View File

@@ -1,807 +0,0 @@
{
"API_CUSTOM_SQL_description": "",
"API_CUSTOM_SQL_name": "",
"API_TOKEN_description": "",
"API_TOKEN_name": "",
"API_display_name": "",
"API_icon": "",
"About_Design": "",
"About_Exit": "",
"About_Title": "",
"AppEvents_AppEventProcessed": "",
"AppEvents_DateTimeCreated": "",
"AppEvents_Extra": "",
"AppEvents_GUID": "",
"AppEvents_Helper1": "",
"AppEvents_Helper2": "",
"AppEvents_Helper3": "",
"AppEvents_ObjectForeignKey": "",
"AppEvents_ObjectIndex": "",
"AppEvents_ObjectIsArchived": "",
"AppEvents_ObjectIsNew": "",
"AppEvents_ObjectPlugin": "",
"AppEvents_ObjectPrimaryID": "",
"AppEvents_ObjectSecondaryID": "",
"AppEvents_ObjectStatus": "",
"AppEvents_ObjectStatusColumn": "",
"AppEvents_ObjectType": "",
"AppEvents_Plugin": "",
"AppEvents_Type": "",
"BACKEND_API_URL_description": "",
"BACKEND_API_URL_name": "",
"BackDevDetail_Actions_Ask_Run": "",
"BackDevDetail_Actions_Not_Registered": "",
"BackDevDetail_Actions_Title_Run": "",
"BackDevDetail_Copy_Ask": "",
"BackDevDetail_Copy_Title": "",
"BackDevDetail_Tools_WOL_error": "",
"BackDevDetail_Tools_WOL_okay": "",
"BackDevices_Arpscan_disabled": "",
"BackDevices_Arpscan_enabled": "",
"BackDevices_Backup_CopError": "",
"BackDevices_Backup_Failed": "",
"BackDevices_Backup_okay": "",
"BackDevices_DBTools_DelDevError_a": "",
"BackDevices_DBTools_DelDevError_b": "",
"BackDevices_DBTools_DelDev_a": "",
"BackDevices_DBTools_DelDev_b": "",
"BackDevices_DBTools_DelEvents": "",
"BackDevices_DBTools_DelEventsError": "",
"BackDevices_DBTools_ImportCSV": "",
"BackDevices_DBTools_ImportCSVError": "",
"BackDevices_DBTools_ImportCSVMissing": "",
"BackDevices_DBTools_Purge": "",
"BackDevices_DBTools_UpdDev": "",
"BackDevices_DBTools_UpdDevError": "",
"BackDevices_DBTools_Upgrade": "",
"BackDevices_DBTools_UpgradeError": "",
"BackDevices_Device_UpdDevError": "",
"BackDevices_Restore_CopError": "",
"BackDevices_Restore_Failed": "",
"BackDevices_Restore_okay": "",
"BackDevices_darkmode_disabled": "",
"BackDevices_darkmode_enabled": "",
"CLEAR_NEW_FLAG_description": "",
"CLEAR_NEW_FLAG_name": "",
"CustProps_cant_remove": "",
"DAYS_TO_KEEP_EVENTS_description": "",
"DAYS_TO_KEEP_EVENTS_name": "",
"DISCOVER_PLUGINS_description": "",
"DISCOVER_PLUGINS_name": "",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "",
"DevDetail_Copy_Device_Tooltip": "",
"DevDetail_CustomProperties_Title": "",
"DevDetail_CustomProps_reset_info": "",
"DevDetail_DisplayFields_Title": "",
"DevDetail_EveandAl_AlertAllEvents": "",
"DevDetail_EveandAl_AlertDown": "",
"DevDetail_EveandAl_Archived": "",
"DevDetail_EveandAl_NewDevice": "",
"DevDetail_EveandAl_NewDevice_Tooltip": "",
"DevDetail_EveandAl_RandomMAC": "",
"DevDetail_EveandAl_ScanCycle": "",
"DevDetail_EveandAl_ScanCycle_a": "",
"DevDetail_EveandAl_ScanCycle_z": "",
"DevDetail_EveandAl_Skip": "",
"DevDetail_EveandAl_Title": "",
"DevDetail_Events_CheckBox": "",
"DevDetail_GoToNetworkNode": "",
"DevDetail_Icon": "",
"DevDetail_Icon_Descr": "",
"DevDetail_Loading": "",
"DevDetail_MainInfo_Comments": "",
"DevDetail_MainInfo_Favorite": "",
"DevDetail_MainInfo_Group": "",
"DevDetail_MainInfo_Location": "",
"DevDetail_MainInfo_Name": "",
"DevDetail_MainInfo_Network": "",
"DevDetail_MainInfo_Network_Port": "",
"DevDetail_MainInfo_Network_Site": "",
"DevDetail_MainInfo_Network_Title": "",
"DevDetail_MainInfo_Owner": "",
"DevDetail_MainInfo_SSID": "",
"DevDetail_MainInfo_Title": "",
"DevDetail_MainInfo_Type": "",
"DevDetail_MainInfo_Vendor": "",
"DevDetail_MainInfo_mac": "",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "",
"DevDetail_Network_Port_hover": "",
"DevDetail_Nmap_Scans": "",
"DevDetail_Nmap_Scans_desc": "",
"DevDetail_Nmap_buttonDefault": "",
"DevDetail_Nmap_buttonDefault_text": "",
"DevDetail_Nmap_buttonDetail": "",
"DevDetail_Nmap_buttonDetail_text": "",
"DevDetail_Nmap_buttonFast": "",
"DevDetail_Nmap_buttonFast_text": "",
"DevDetail_Nmap_buttonSkipDiscovery": "",
"DevDetail_Nmap_buttonSkipDiscovery_text": "",
"DevDetail_Nmap_resultsLink": "",
"DevDetail_Owner_hover": "",
"DevDetail_Periodselect_All": "",
"DevDetail_Periodselect_LastMonth": "",
"DevDetail_Periodselect_LastWeek": "",
"DevDetail_Periodselect_LastYear": "",
"DevDetail_Periodselect_today": "",
"DevDetail_Run_Actions_Title": "",
"DevDetail_Run_Actions_Tooltip": "",
"DevDetail_SessionInfo_FirstSession": "",
"DevDetail_SessionInfo_LastIP": "",
"DevDetail_SessionInfo_LastSession": "",
"DevDetail_SessionInfo_StaticIP": "",
"DevDetail_SessionInfo_Status": "",
"DevDetail_SessionInfo_Title": "",
"DevDetail_SessionTable_Additionalinfo": "",
"DevDetail_SessionTable_Connection": "",
"DevDetail_SessionTable_Disconnection": "",
"DevDetail_SessionTable_Duration": "",
"DevDetail_SessionTable_IP": "",
"DevDetail_SessionTable_Order": "",
"DevDetail_Shortcut_CurrentStatus": "",
"DevDetail_Shortcut_DownAlerts": "",
"DevDetail_Shortcut_Presence": "",
"DevDetail_Shortcut_Sessions": "",
"DevDetail_Tab_Details": "",
"DevDetail_Tab_Events": "",
"DevDetail_Tab_EventsTableDate": "",
"DevDetail_Tab_EventsTableEvent": "",
"DevDetail_Tab_EventsTableIP": "",
"DevDetail_Tab_EventsTableInfo": "",
"DevDetail_Tab_Nmap": "",
"DevDetail_Tab_NmapEmpty": "",
"DevDetail_Tab_NmapTableExtra": "",
"DevDetail_Tab_NmapTableHeader": "",
"DevDetail_Tab_NmapTableIndex": "",
"DevDetail_Tab_NmapTablePort": "",
"DevDetail_Tab_NmapTableService": "",
"DevDetail_Tab_NmapTableState": "",
"DevDetail_Tab_NmapTableText": "",
"DevDetail_Tab_NmapTableTime": "",
"DevDetail_Tab_Plugins": "",
"DevDetail_Tab_Presence": "",
"DevDetail_Tab_Sessions": "",
"DevDetail_Tab_Tools": "",
"DevDetail_Tab_Tools_Internet_Info_Description": "",
"DevDetail_Tab_Tools_Internet_Info_Error": "",
"DevDetail_Tab_Tools_Internet_Info_Start": "",
"DevDetail_Tab_Tools_Internet_Info_Title": "",
"DevDetail_Tab_Tools_Nslookup_Description": "",
"DevDetail_Tab_Tools_Nslookup_Error": "",
"DevDetail_Tab_Tools_Nslookup_Start": "",
"DevDetail_Tab_Tools_Nslookup_Title": "",
"DevDetail_Tab_Tools_Speedtest_Description": "",
"DevDetail_Tab_Tools_Speedtest_Start": "",
"DevDetail_Tab_Tools_Speedtest_Title": "",
"DevDetail_Tab_Tools_Traceroute_Description": "",
"DevDetail_Tab_Tools_Traceroute_Error": "",
"DevDetail_Tab_Tools_Traceroute_Start": "",
"DevDetail_Tab_Tools_Traceroute_Title": "",
"DevDetail_Tools_WOL": "",
"DevDetail_Tools_WOL_noti": "",
"DevDetail_Tools_WOL_noti_text": "",
"DevDetail_Type_hover": "",
"DevDetail_Vendor_hover": "",
"DevDetail_WOL_Title": "",
"DevDetail_button_AddIcon": "",
"DevDetail_button_AddIcon_Help": "",
"DevDetail_button_AddIcon_Tooltip": "",
"DevDetail_button_Delete": "",
"DevDetail_button_DeleteEvents": "",
"DevDetail_button_DeleteEvents_Warning": "",
"DevDetail_button_Delete_ask": "",
"DevDetail_button_OverwriteIcons": "",
"DevDetail_button_OverwriteIcons_Tooltip": "",
"DevDetail_button_OverwriteIcons_Warning": "",
"DevDetail_button_Reset": "",
"DevDetail_button_Save": "",
"DeviceEdit_ValidMacIp": "",
"Device_MultiEdit": "",
"Device_MultiEdit_Backup": "",
"Device_MultiEdit_Fields": "",
"Device_MultiEdit_MassActions": "",
"Device_MultiEdit_No_Devices": "",
"Device_MultiEdit_Tooltip": "",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "",
"Device_Save_Unauthorized": "",
"Device_Saved_Success": "",
"Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "",
"Device_Shortcut_AllDevices": "",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "",
"Device_Shortcut_Connected": "",
"Device_Shortcut_Devices": "",
"Device_Shortcut_DownAlerts": "",
"Device_Shortcut_DownOnly": "",
"Device_Shortcut_Favorites": "",
"Device_Shortcut_NewDevices": "",
"Device_Shortcut_OnlineChart": "",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "",
"Device_TableHead_Connected_Devices": "",
"Device_TableHead_CustomProps": "",
"Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "",
"Device_TableHead_Group": "",
"Device_TableHead_IPv4": "",
"Device_TableHead_IPv6": "",
"Device_TableHead_Icon": "",
"Device_TableHead_LastIP": "",
"Device_TableHead_LastIPOrder": "",
"Device_TableHead_LastSession": "",
"Device_TableHead_Location": "",
"Device_TableHead_MAC": "",
"Device_TableHead_MAC_full": "",
"Device_TableHead_Name": "",
"Device_TableHead_NetworkSite": "",
"Device_TableHead_Owner": "",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "",
"Device_TableHead_Port": "",
"Device_TableHead_PresentLastScan": "",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "",
"Device_TableHead_Rowid": "",
"Device_TableHead_SSID": "",
"Device_TableHead_SourcePlugin": "",
"Device_TableHead_Status": "",
"Device_TableHead_SyncHubNodeName": "",
"Device_TableHead_Type": "",
"Device_TableHead_Vendor": "",
"Device_TableHead_Vlan": "",
"Device_Table_Not_Network_Device": "",
"Device_Table_info": "",
"Device_Table_nav_next": "",
"Device_Table_nav_prev": "",
"Device_Tablelenght": "",
"Device_Tablelenght_all": "",
"Device_Title": "",
"Devices_Filters": "",
"ENABLE_PLUGINS_description": "",
"ENABLE_PLUGINS_name": "",
"ENCRYPTION_KEY_description": "",
"ENCRYPTION_KEY_name": "",
"Email_display_name": "",
"Email_icon": "",
"Events_Loading": "",
"Events_Periodselect_All": "",
"Events_Periodselect_LastMonth": "",
"Events_Periodselect_LastWeek": "",
"Events_Periodselect_LastYear": "",
"Events_Periodselect_today": "",
"Events_Searchbox": "",
"Events_Shortcut_AllEvents": "",
"Events_Shortcut_DownAlerts": "",
"Events_Shortcut_Events": "",
"Events_Shortcut_MissSessions": "",
"Events_Shortcut_NewDevices": "",
"Events_Shortcut_Sessions": "",
"Events_Shortcut_VoidSessions": "",
"Events_TableHead_AdditionalInfo": "",
"Events_TableHead_Connection": "",
"Events_TableHead_Date": "",
"Events_TableHead_Device": "",
"Events_TableHead_Disconnection": "",
"Events_TableHead_Duration": "",
"Events_TableHead_DurationOrder": "",
"Events_TableHead_EventType": "",
"Events_TableHead_IP": "",
"Events_TableHead_IPOrder": "",
"Events_TableHead_Order": "",
"Events_TableHead_Owner": "",
"Events_TableHead_PendingAlert": "",
"Events_Table_info": "",
"Events_Table_nav_next": "",
"Events_Table_nav_prev": "",
"Events_Tablelenght": "",
"Events_Tablelenght_all": "",
"Events_Title": "",
"FakeMAC_hover": "",
"FieldLock_Error": "",
"FieldLock_Lock_Tooltip": "",
"FieldLock_Locked": "",
"FieldLock_SaveBeforeLocking": "",
"FieldLock_Source_Label": "",
"FieldLock_Unlock_Tooltip": "",
"FieldLock_Unlocked": "",
"GRAPHQL_PORT_description": "",
"GRAPHQL_PORT_name": "",
"Gen_Action": "",
"Gen_Add": "",
"Gen_AddDevice": "",
"Gen_Add_All": "",
"Gen_All_Devices": "",
"Gen_Archived": "",
"Gen_AreYouSure": "",
"Gen_Backup": "",
"Gen_Cancel": "",
"Gen_Change": "",
"Gen_Copy": "",
"Gen_CopyToClipboard": "",
"Gen_DataUpdatedUITakesTime": "",
"Gen_Delete": "",
"Gen_DeleteAll": "",
"Gen_Description": "",
"Gen_Down": "",
"Gen_Error": "",
"Gen_Filter": "",
"Gen_Flapping": "",
"Gen_Generate": "",
"Gen_InvalidMac": "",
"Gen_Invalid_Value": "",
"Gen_LockedDB": "",
"Gen_NetworkMask": "",
"Gen_New": "",
"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_Sleeping": "",
"Gen_Subnet": "",
"Gen_Switch": "",
"Gen_Upd": "",
"Gen_Upd_Fail": "",
"Gen_Update": "",
"Gen_Update_Value": "",
"Gen_ValidIcon": "",
"Gen_Warning": "",
"Gen_Work_In_Progress": "",
"Gen_create_new_device": "",
"Gen_create_new_device_info": "",
"General_display_name": "",
"General_icon": "",
"HRS_TO_KEEP_NEWDEV_description": "",
"HRS_TO_KEEP_NEWDEV_name": "",
"HRS_TO_KEEP_OFFDEV_description": "",
"HRS_TO_KEEP_OFFDEV_name": "",
"LOADED_PLUGINS_description": "",
"LOADED_PLUGINS_name": "",
"LOG_LEVEL_description": "",
"LOG_LEVEL_name": "",
"Loading": "",
"Login_Box": "",
"Login_Default_PWD": "",
"Login_Info": "",
"Login_Psw-box": "",
"Login_Psw_alert": "",
"Login_Psw_folder": "",
"Login_Psw_new": "",
"Login_Psw_run": "",
"Login_Remember": "",
"Login_Remember_small": "",
"Login_Submit": "",
"Login_Toggle_Alert_headline": "",
"Login_Toggle_Info": "",
"Login_Toggle_Info_headline": "",
"Maint_PurgeLog": "",
"Maint_RestartServer": "",
"Maint_Restart_Server_noti_text": "",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "",
"Maintenance_Status": "",
"Maintenance_Title": "",
"Maintenance_Tool_DownloadConfig": "",
"Maintenance_Tool_DownloadConfig_text": "",
"Maintenance_Tool_DownloadWorkflows": "",
"Maintenance_Tool_DownloadWorkflows_text": "",
"Maintenance_Tool_ExportCSV": "",
"Maintenance_Tool_ExportCSV_noti": "",
"Maintenance_Tool_ExportCSV_noti_text": "",
"Maintenance_Tool_ExportCSV_text": "",
"Maintenance_Tool_ImportCSV": "",
"Maintenance_Tool_ImportCSV_noti": "",
"Maintenance_Tool_ImportCSV_noti_text": "",
"Maintenance_Tool_ImportCSV_text": "",
"Maintenance_Tool_ImportConfig_noti": "",
"Maintenance_Tool_ImportPastedCSV": "",
"Maintenance_Tool_ImportPastedCSV_noti_text": "",
"Maintenance_Tool_ImportPastedCSV_text": "",
"Maintenance_Tool_ImportPastedConfig": "",
"Maintenance_Tool_ImportPastedConfig_noti_text": "",
"Maintenance_Tool_ImportPastedConfig_text": "",
"Maintenance_Tool_UnlockFields": "",
"Maintenance_Tool_UnlockFields_noti": "",
"Maintenance_Tool_UnlockFields_noti_text": "",
"Maintenance_Tool_UnlockFields_text": "",
"Maintenance_Tool_arpscansw": "",
"Maintenance_Tool_arpscansw_noti": "",
"Maintenance_Tool_arpscansw_noti_text": "",
"Maintenance_Tool_arpscansw_text": "",
"Maintenance_Tool_backup": "",
"Maintenance_Tool_backup_noti": "",
"Maintenance_Tool_backup_noti_text": "",
"Maintenance_Tool_backup_text": "",
"Maintenance_Tool_check_visible": "",
"Maintenance_Tool_clearSourceFields_selected": "",
"Maintenance_Tool_clearSourceFields_selected_noti": "",
"Maintenance_Tool_clearSourceFields_selected_text": "",
"Maintenance_Tool_darkmode": "",
"Maintenance_Tool_darkmode_noti": "",
"Maintenance_Tool_darkmode_noti_text": "",
"Maintenance_Tool_darkmode_text": "",
"Maintenance_Tool_del_ActHistory": "",
"Maintenance_Tool_del_ActHistory_noti": "",
"Maintenance_Tool_del_ActHistory_noti_text": "",
"Maintenance_Tool_del_ActHistory_text": "",
"Maintenance_Tool_del_alldev": "",
"Maintenance_Tool_del_alldev_noti": "",
"Maintenance_Tool_del_alldev_noti_text": "",
"Maintenance_Tool_del_alldev_text": "",
"Maintenance_Tool_del_allevents": "",
"Maintenance_Tool_del_allevents30": "",
"Maintenance_Tool_del_allevents30_noti": "",
"Maintenance_Tool_del_allevents30_noti_text": "",
"Maintenance_Tool_del_allevents30_text": "",
"Maintenance_Tool_del_allevents_noti": "",
"Maintenance_Tool_del_allevents_noti_text": "",
"Maintenance_Tool_del_allevents_text": "",
"Maintenance_Tool_del_empty_macs": "",
"Maintenance_Tool_del_empty_macs_noti": "",
"Maintenance_Tool_del_empty_macs_noti_text": "",
"Maintenance_Tool_del_empty_macs_text": "",
"Maintenance_Tool_del_selecteddev": "",
"Maintenance_Tool_del_selecteddev_text": "",
"Maintenance_Tool_del_unknowndev": "",
"Maintenance_Tool_del_unknowndev_noti": "",
"Maintenance_Tool_del_unknowndev_noti_text": "",
"Maintenance_Tool_del_unknowndev_text": "",
"Maintenance_Tool_del_unlockFields_selecteddev_text": "",
"Maintenance_Tool_displayed_columns_text": "",
"Maintenance_Tool_drag_me": "",
"Maintenance_Tool_order_columns_text": "",
"Maintenance_Tool_purgebackup": "",
"Maintenance_Tool_purgebackup_noti": "",
"Maintenance_Tool_purgebackup_noti_text": "",
"Maintenance_Tool_purgebackup_text": "",
"Maintenance_Tool_restore": "",
"Maintenance_Tool_restore_noti": "",
"Maintenance_Tool_restore_noti_text": "",
"Maintenance_Tool_restore_text": "",
"Maintenance_Tool_unlockFields_selecteddev": "",
"Maintenance_Tool_unlockFields_selecteddev_noti": "",
"Maintenance_Tool_upgrade_database_noti": "",
"Maintenance_Tool_upgrade_database_noti_text": "",
"Maintenance_Tool_upgrade_database_text": "",
"Maintenance_Tools_Tab_BackupRestore": "",
"Maintenance_Tools_Tab_Logging": "",
"Maintenance_Tools_Tab_Settings": "",
"Maintenance_Tools_Tab_Tools": "",
"Maintenance_Tools_Tab_UISettings": "",
"Maintenance_arp_status": "",
"Maintenance_arp_status_off": "",
"Maintenance_arp_status_on": "",
"Maintenance_built_on": "",
"Maintenance_current_version": "",
"Maintenance_database_backup": "",
"Maintenance_database_backup_found": "",
"Maintenance_database_backup_total": "",
"Maintenance_database_lastmod": "",
"Maintenance_database_path": "",
"Maintenance_database_rows": "",
"Maintenance_database_size": "",
"Maintenance_lang_selector_apply": "",
"Maintenance_lang_selector_empty": "",
"Maintenance_lang_selector_lable": "",
"Maintenance_lang_selector_text": "",
"Maintenance_new_version": "",
"Maintenance_themeselector_apply": "",
"Maintenance_themeselector_empty": "",
"Maintenance_themeselector_lable": "",
"Maintenance_themeselector_text": "",
"Maintenance_version": "",
"NETWORK_DEVICE_TYPES_description": "",
"NETWORK_DEVICE_TYPES_name": "",
"Navigation_About": "",
"Navigation_AppEvents": "",
"Navigation_Devices": "",
"Navigation_Donations": "",
"Navigation_Events": "",
"Navigation_Integrations": "",
"Navigation_Maintenance": "",
"Navigation_Monitoring": "",
"Navigation_Network": "",
"Navigation_Notifications": "",
"Navigation_Plugins": "",
"Navigation_Presence": "",
"Navigation_Report": "",
"Navigation_Settings": "",
"Navigation_SystemInfo": "",
"Navigation_Workflows": "",
"Network_Assign": "",
"Network_Cant_Assign": "",
"Network_Cant_Assign_No_Node_Selected": "",
"Network_Configuration_Error": "",
"Network_Connected": "",
"Network_Devices": "",
"Network_ManageAdd": "",
"Network_ManageAdd_Name": "",
"Network_ManageAdd_Name_text": "",
"Network_ManageAdd_Port": "",
"Network_ManageAdd_Port_text": "",
"Network_ManageAdd_Submit": "",
"Network_ManageAdd_Type": "",
"Network_ManageAdd_Type_text": "",
"Network_ManageAssign": "",
"Network_ManageDel": "",
"Network_ManageDel_Name": "",
"Network_ManageDel_Name_text": "",
"Network_ManageDel_Submit": "",
"Network_ManageDevices": "",
"Network_ManageEdit": "",
"Network_ManageEdit_ID": "",
"Network_ManageEdit_ID_text": "",
"Network_ManageEdit_Name": "",
"Network_ManageEdit_Name_text": "",
"Network_ManageEdit_Port": "",
"Network_ManageEdit_Port_text": "",
"Network_ManageEdit_Submit": "",
"Network_ManageEdit_Type": "",
"Network_ManageEdit_Type_text": "",
"Network_ManageLeaf": "",
"Network_ManageUnassign": "",
"Network_NoAssignedDevices": "",
"Network_NoDevices": "",
"Network_Node": "",
"Network_Node_Name": "",
"Network_Parent": "",
"Network_Root": "",
"Network_Root_Not_Configured": "",
"Network_Root_Unconfigurable": "",
"Network_ShowArchived": "",
"Network_ShowOffline": "",
"Network_Table_Hostname": "",
"Network_Table_IP": "",
"Network_Table_State": "",
"Network_Title": "",
"Network_UnassignedDevices": "",
"Notifications_All": "",
"Notifications_Mark_All_Read": "",
"PIALERT_WEB_PASSWORD_description": "",
"PIALERT_WEB_PASSWORD_name": "",
"PIALERT_WEB_PROTECTION_description": "",
"PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "",
"Plugins_History": "",
"Plugins_Obj_DeleteListed": "",
"Plugins_Objects": "",
"Plugins_Out_of": "",
"Plugins_Unprocessed_Events": "",
"Plugins_no_control": "",
"Presence_CalHead_day": "",
"Presence_CalHead_lang": "",
"Presence_CalHead_month": "",
"Presence_CalHead_quarter": "",
"Presence_CalHead_week": "",
"Presence_CalHead_year": "",
"Presence_CallHead_Devices": "",
"Presence_Key_OnlineNow": "",
"Presence_Key_OnlineNow_desc": "",
"Presence_Key_OnlinePast": "",
"Presence_Key_OnlinePastMiss": "",
"Presence_Key_OnlinePastMiss_desc": "",
"Presence_Key_OnlinePast_desc": "",
"Presence_Loading": "",
"Presence_Shortcut_AllDevices": "",
"Presence_Shortcut_Archived": "",
"Presence_Shortcut_Connected": "",
"Presence_Shortcut_Devices": "",
"Presence_Shortcut_DownAlerts": "",
"Presence_Shortcut_Favorites": "",
"Presence_Shortcut_NewDevices": "",
"Presence_Title": "",
"REFRESH_FQDN_description": "",
"REFRESH_FQDN_name": "",
"REPORT_DASHBOARD_URL_description": "",
"REPORT_DASHBOARD_URL_name": "",
"REPORT_ERROR": "",
"REPORT_MAIL_description": "",
"REPORT_MAIL_name": "",
"REPORT_TITLE": "",
"RandomMAC_hover": "",
"Reports_Sent_Log": "",
"SCAN_SUBNETS_description": "",
"SCAN_SUBNETS_name": "",
"SYSTEM_TITLE": "",
"Setting_Override": "",
"Setting_Override_Description": "",
"Settings_Metadata_Toggle": "",
"Settings_Show_Description": "",
"Settings_device_Scanners_desync": "",
"Settings_device_Scanners_desync_popup": "",
"Speedtest_Results": "",
"Systeminfo_AvailableIps": "",
"Systeminfo_CPU": "",
"Systeminfo_CPU_Cores": "",
"Systeminfo_CPU_Name": "",
"Systeminfo_CPU_Speed": "",
"Systeminfo_CPU_Temp": "",
"Systeminfo_CPU_Vendor": "",
"Systeminfo_Client_Resolution": "",
"Systeminfo_Client_User_Agent": "",
"Systeminfo_General": "",
"Systeminfo_General_Date": "",
"Systeminfo_General_Date2": "",
"Systeminfo_General_Full_Date": "",
"Systeminfo_General_TimeZone": "",
"Systeminfo_Memory": "",
"Systeminfo_Memory_Total_Memory": "",
"Systeminfo_Memory_Usage": "",
"Systeminfo_Memory_Usage_Percent": "",
"Systeminfo_Motherboard": "",
"Systeminfo_Motherboard_BIOS": "",
"Systeminfo_Motherboard_BIOS_Date": "",
"Systeminfo_Motherboard_BIOS_Vendor": "",
"Systeminfo_Motherboard_Manufactured": "",
"Systeminfo_Motherboard_Name": "",
"Systeminfo_Motherboard_Revision": "",
"Systeminfo_Network": "",
"Systeminfo_Network_Accept_Encoding": "",
"Systeminfo_Network_Accept_Language": "",
"Systeminfo_Network_Connection_Port": "",
"Systeminfo_Network_HTTP_Host": "",
"Systeminfo_Network_HTTP_Referer": "",
"Systeminfo_Network_HTTP_Referer_String": "",
"Systeminfo_Network_Hardware": "",
"Systeminfo_Network_Hardware_Interface_Mask": "",
"Systeminfo_Network_Hardware_Interface_Name": "",
"Systeminfo_Network_Hardware_Interface_RX": "",
"Systeminfo_Network_Hardware_Interface_TX": "",
"Systeminfo_Network_IP": "",
"Systeminfo_Network_IP_Connection": "",
"Systeminfo_Network_IP_Server": "",
"Systeminfo_Network_MIME": "",
"Systeminfo_Network_Request_Method": "",
"Systeminfo_Network_Request_Time": "",
"Systeminfo_Network_Request_URI": "",
"Systeminfo_Network_Secure_Connection": "",
"Systeminfo_Network_Secure_Connection_String": "",
"Systeminfo_Network_Server_Name": "",
"Systeminfo_Network_Server_Name_String": "",
"Systeminfo_Network_Server_Query": "",
"Systeminfo_Network_Server_Query_String": "",
"Systeminfo_Network_Server_Version": "",
"Systeminfo_Services": "",
"Systeminfo_Services_Description": "",
"Systeminfo_Services_Name": "",
"Systeminfo_Storage": "",
"Systeminfo_Storage_Device": "",
"Systeminfo_Storage_Mount": "",
"Systeminfo_Storage_Size": "",
"Systeminfo_Storage_Type": "",
"Systeminfo_Storage_Usage": "",
"Systeminfo_Storage_Usage_Free": "",
"Systeminfo_Storage_Usage_Mount": "",
"Systeminfo_Storage_Usage_Total": "",
"Systeminfo_Storage_Usage_Used": "",
"Systeminfo_System": "",
"Systeminfo_System_AVG": "",
"Systeminfo_System_Architecture": "",
"Systeminfo_System_Kernel": "",
"Systeminfo_System_OSVersion": "",
"Systeminfo_System_Running_Processes": "",
"Systeminfo_System_System": "",
"Systeminfo_System_Uname": "",
"Systeminfo_System_Uptime": "",
"Systeminfo_This_Client": "",
"Systeminfo_USB_Devices": "",
"TICKER_MIGRATE_TO_NETALERTX": "",
"TIMEZONE_description": "",
"TIMEZONE_name": "",
"UI_DEV_SECTIONS_description": "",
"UI_DEV_SECTIONS_name": "",
"UI_ICONS_description": "",
"UI_ICONS_name": "",
"UI_LANG_description": "",
"UI_LANG_name": "",
"UI_MY_DEVICES_description": "",
"UI_MY_DEVICES_name": "",
"UI_NOT_RANDOM_MAC_description": "",
"UI_NOT_RANDOM_MAC_name": "",
"UI_PRESENCE_description": "",
"UI_PRESENCE_name": "",
"UI_REFRESH_description": "",
"UI_REFRESH_name": "",
"VERSION_description": "",
"VERSION_name": "",
"WF_Action_Add": "",
"WF_Action_field": "",
"WF_Action_type": "",
"WF_Action_value": "",
"WF_Actions": "",
"WF_Add": "",
"WF_Add_Condition": "",
"WF_Add_Group": "",
"WF_Condition_field": "",
"WF_Condition_operator": "",
"WF_Condition_value": "",
"WF_Conditions": "",
"WF_Conditions_logic_rules": "",
"WF_Duplicate": "",
"WF_Enabled": "",
"WF_Export": "",
"WF_Export_Copy": "",
"WF_Import": "",
"WF_Import_Copy": "",
"WF_Name": "",
"WF_Remove": "",
"WF_Remove_Copy": "",
"WF_Save": "",
"WF_Trigger": "",
"WF_Trigger_event_type": "",
"WF_Trigger_type": "",
"add_icon_event_tooltip": "",
"add_option_event_tooltip": "",
"copy_icons_event_tooltip": "",
"devices_old": "",
"general_event_description": "",
"general_event_title": "",
"go_to_device_event_tooltip": "",
"go_to_node_event_tooltip": "",
"new_version_available": "",
"report_guid": "",
"report_guid_missing": "",
"report_select_format": "",
"report_time": "",
"run_event_tooltip": "",
"select_icon_event_tooltip": "",
"settings_core_icon": "",
"settings_core_label": "",
"settings_device_scanners": "",
"settings_device_scanners_icon": "",
"settings_device_scanners_info": "",
"settings_device_scanners_label": "",
"settings_enabled": "",
"settings_enabled_icon": "",
"settings_expand_all": "",
"settings_imported": "",
"settings_imported_label": "",
"settings_missing": "",
"settings_missing_block": "",
"settings_old": "",
"settings_other_scanners": "",
"settings_other_scanners_icon": "",
"settings_other_scanners_label": "",
"settings_publishers": "",
"settings_publishers_icon": "",
"settings_publishers_info": "",
"settings_publishers_label": "",
"settings_readonly": "",
"settings_saved": "",
"settings_system_icon": "",
"settings_system_label": "",
"settings_update_item_warning": "",
"test_event_tooltip": ""
}

View File

@@ -109,7 +109,7 @@
"DevDetail_Network_Node_hover": "Seleziona il dispositivo di rete principale a cui è connesso il dispositivo corrente per popolare la struttura di rete.", "DevDetail_Network_Node_hover": "Seleziona il dispositivo di rete principale a cui è connesso il dispositivo corrente per popolare la struttura di rete.",
"DevDetail_Network_Port_hover": "La porta a cui è connesso questo dispositivo sul dispositivo di rete principale. Se lasciato vuoto, verrà visualizzata un'icona Wi-Fi nella struttura di rete.", "DevDetail_Network_Port_hover": "La porta a cui è connesso questo dispositivo sul dispositivo di rete principale. Se lasciato vuoto, verrà visualizzata un'icona Wi-Fi nella struttura di rete.",
"DevDetail_Nmap_Scans": "Scansioni Nmap manuali", "DevDetail_Nmap_Scans": "Scansioni Nmap manuali",
"DevDetail_Nmap_Scans_desc": "Qui puoi eseguire scansioni manuali NMAP. Puoi anche pianificare scansioni automatiche NMAP attraverso il plugin Servizi e porte (NMAP). Vai alla <a href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Documentazione</a> per saperne di più", "DevDetail_Nmap_Scans_desc": "Qui puoi eseguire scansioni manuali NMAP. Puoi anche pianificare scansioni automatiche NMAP attraverso il plugin Servizi e porte (NMAP). Vai alla <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Documentazione</a> per saperne di più",
"DevDetail_Nmap_buttonDefault": "Scansione predefinita", "DevDetail_Nmap_buttonDefault": "Scansione predefinita",
"DevDetail_Nmap_buttonDefault_text": "Scansione predefinita: Nmap scansiona 1000 porte per ogni protocollo richiesto. Questo dovrebbe coprire circa il 93% delle porte TCP e il 49% delle porte UDP (circa 5 secondi)", "DevDetail_Nmap_buttonDefault_text": "Scansione predefinita: Nmap scansiona 1000 porte per ogni protocollo richiesto. Questo dovrebbe coprire circa il 93% delle porte TCP e il 49% delle porte UDP (circa 5 secondi)",
"DevDetail_Nmap_buttonDetail": "Scansione dettagliata", "DevDetail_Nmap_buttonDetail": "Scansione dettagliata",
@@ -139,7 +139,7 @@
"DevDetail_SessionTable_Duration": "Durata", "DevDetail_SessionTable_Duration": "Durata",
"DevDetail_SessionTable_IP": "IP", "DevDetail_SessionTable_IP": "IP",
"DevDetail_SessionTable_Order": "Ordine", "DevDetail_SessionTable_Order": "Ordine",
"DevDetail_Shortcut_CurrentStatus": "Stato", "DevDetail_Shortcut_CurrentStatus": "Stato attuale",
"DevDetail_Shortcut_DownAlerts": "Avvisi disconnessione", "DevDetail_Shortcut_DownAlerts": "Avvisi disconnessione",
"DevDetail_Shortcut_Presence": "Presenza", "DevDetail_Shortcut_Presence": "Presenza",
"DevDetail_Shortcut_Sessions": "Sessioni", "DevDetail_Shortcut_Sessions": "Sessioni",
@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "Azioni di massa:", "Device_MultiEdit_MassActions": "Azioni di massa:",
"Device_MultiEdit_No_Devices": "Nessun dispositivo selezionato.", "Device_MultiEdit_No_Devices": "Nessun dispositivo selezionato.",
"Device_MultiEdit_Tooltip": "Attento. Facendo clic verrà applicato il valore sulla sinistra a tutti i dispositivi selezionati sopra.", "Device_MultiEdit_Tooltip": "Attento. Facendo clic verrà applicato il valore sulla sinistra a tutti i dispositivi selezionati sopra.",
"Device_NextScan_Imminent": "Imminente...",
"Device_NextScan_In": "Prossima scansione tra circa ",
"Device_NoData_Help": "Se i dispositivi non vengono visualizzati dopo la scansione, controlla l'impostazione SCAN_SUBNETS e la <a href=\"https://docs.netalertx.com/SUBNETS\" target=\"_blank\">documentazione</a>.",
"Device_NoData_Scanning": "In attesa della prima scansione: potrebbero volerci diversi minuti dopo la configurazione iniziale.",
"Device_NoData_Title": "Ancora nessun dispositivo trovato",
"Device_Save_Failed": "Impossibile salvare il dispositivo", "Device_Save_Failed": "Impossibile salvare il dispositivo",
"Device_Save_Unauthorized": "Non autorizzato: token API non valido", "Device_Save_Unauthorized": "Non autorizzato: token API non valido",
"Device_Saved_Success": "Dispositivo salvato correttamente", "Device_Saved_Success": "Dispositivo salvato correttamente",
"Device_Saved_Unexpected": "L'aggiornamento del dispositivo ha restituito una risposta imprevista", "Device_Saved_Unexpected": "L'aggiornamento del dispositivo ha restituito una risposta imprevista",
"Device_Scanning": "Scansione in corso...",
"Device_Searchbox": "Cerca", "Device_Searchbox": "Cerca",
"Device_Shortcut_AllDevices": "I miei dispositivi", "Device_Shortcut_AllDevices": "I miei dispositivi",
"Device_Shortcut_AllNodes": "Tutti i nodi", "Device_Shortcut_AllNodes": "Tutti i nodi",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "Preferiti", "Device_Shortcut_Favorites": "Preferiti",
"Device_Shortcut_NewDevices": "Nuovi dispositivi", "Device_Shortcut_NewDevices": "Nuovi dispositivi",
"Device_Shortcut_OnlineChart": "Presenza dispositivo", "Device_Shortcut_OnlineChart": "Presenza dispositivo",
"Device_Shortcut_Unstable": "Instabile",
"Device_TableHead_AlertDown": "Avviso disconnessione", "Device_TableHead_AlertDown": "Avviso disconnessione",
"Device_TableHead_Connected_Devices": "Connessioni", "Device_TableHead_Connected_Devices": "Connessioni",
"Device_TableHead_CustomProps": "Proprietà/Azioni", "Device_TableHead_CustomProps": "Proprietà/Azioni",
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Preferito", "Device_TableHead_Favorite": "Preferito",
"Device_TableHead_FirstSession": "Prima sessione", "Device_TableHead_FirstSession": "Prima sessione",
"Device_TableHead_Flapping": "Flapping",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Gruppo", "Device_TableHead_Group": "Gruppo",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "Aggiungi dispositivo", "Gen_AddDevice": "Aggiungi dispositivo",
"Gen_Add_All": "Aggiungi tutti", "Gen_Add_All": "Aggiungi tutti",
"Gen_All_Devices": "Tutti i dispositivi", "Gen_All_Devices": "Tutti i dispositivi",
"Gen_Archived": "Archiviato",
"Gen_AreYouSure": "Sei sicuro?", "Gen_AreYouSure": "Sei sicuro?",
"Gen_Backup": "Esegui backup", "Gen_Backup": "Esegui backup",
"Gen_Cancel": "Annulla", "Gen_Cancel": "Annulla",
@@ -333,16 +324,13 @@
"Gen_Delete": "Elimina", "Gen_Delete": "Elimina",
"Gen_DeleteAll": "Elimina tutti", "Gen_DeleteAll": "Elimina tutti",
"Gen_Description": "Descrizione", "Gen_Description": "Descrizione",
"Gen_Down": "Giù",
"Gen_Error": "Errore", "Gen_Error": "Errore",
"Gen_Filter": "Filtro", "Gen_Filter": "Filtro",
"Gen_Flapping": "Flapping",
"Gen_Generate": "Genera", "Gen_Generate": "Genera",
"Gen_InvalidMac": "Indirizzo Mac non valido.", "Gen_InvalidMac": "Indirizzo Mac non valido.",
"Gen_Invalid_Value": "È stato inserito un valore non valido", "Gen_Invalid_Value": "È stato inserito un valore non valido",
"Gen_LockedDB": "ERRORE: il DB potrebbe essere bloccato, controlla F12 Strumenti di sviluppo -> Console o riprova più tardi.", "Gen_LockedDB": "ERRORE: il DB potrebbe essere bloccato, controlla F12 Strumenti di sviluppo -> Console o riprova più tardi.",
"Gen_NetworkMask": "Maschera di rete", "Gen_NetworkMask": "Maschera di rete",
"Gen_New": "Nuovo",
"Gen_Offline": "Offline", "Gen_Offline": "Offline",
"Gen_Okay": "Ok", "Gen_Okay": "Ok",
"Gen_Online": "Online", "Gen_Online": "Online",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Seleziona per anteprima", "Gen_SelectToPreview": "Seleziona per anteprima",
"Gen_Selected_Devices": "Dispositivi selezionati:", "Gen_Selected_Devices": "Dispositivi selezionati:",
"Gen_Sleeping": "Sleeping",
"Gen_Subnet": "Sottorete", "Gen_Subnet": "Sottorete",
"Gen_Switch": "Cambia", "Gen_Switch": "Cambia",
"Gen_Upd": "Aggiornato correttamente", "Gen_Upd": "Aggiornato correttamente",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "Aggiorna valore", "Gen_Update_Value": "Aggiorna valore",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Avviso", "Gen_Warning": "Avviso",
"Gen_Work_In_Progress": "Lavori in corso, è quindi un buon momento per un feedback su https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Lavori in corso, è quindi un buon momento per un feedback su https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Nuovo dispositivo", "Gen_create_new_device": "Nuovo dispositivo",
"Gen_create_new_device_info": "I dispositivi vengono generalmente rilevati utilizzando <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugin</a>. Tuttavia, in alcuni casi, potrebbe essere necessario aggiungere manualmente i dispositivi. Per esplorare scenari specifici, consulta la <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">documentazione sulle reti remote</a>.", "Gen_create_new_device_info": "I dispositivi vengono generalmente rilevati utilizzando <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugin</a>. Tuttavia, in alcuni casi, potrebbe essere necessario aggiungere manualmente i dispositivi. Per esplorare scenari specifici, consulta la <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">documentazione sulle reti remote</a>.",
"General_display_name": "Generale", "General_display_name": "Generale",
@@ -385,7 +372,7 @@
"Loading": "Caricamento…", "Loading": "Caricamento…",
"Login_Box": "Inserisci la tua password", "Login_Box": "Inserisci la tua password",
"Login_Default_PWD": "La password predefinita \"123456\" è ancora attiva.", "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/netalertx/NetAlertX/tree/main/front/plugins/set_password\">documentazione SETPWD</a> se riscontri problemi di accesso.", "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.",
"Login_Psw-box": "Password", "Login_Psw-box": "Password",
"Login_Psw_alert": "Avviso password!", "Login_Psw_alert": "Avviso password!",
"Login_Psw_folder": "nella cartella di configurazione.", "Login_Psw_folder": "nella cartella di configurazione.",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "è attualmente disabilitato", "Maintenance_arp_status_off": "è attualmente disabilitato",
"Maintenance_arp_status_on": "scansione in corso", "Maintenance_arp_status_on": "scansione in corso",
"Maintenance_built_on": "Rilasciato il", "Maintenance_built_on": "Rilasciato il",
"Maintenance_current_version": "Sei aggiornato. Scopri <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">a cosa sto lavorando</a>.", "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", "Maintenance_database_backup": "Backup DB",
"Maintenance_database_backup_found": "backup trovati", "Maintenance_database_backup_found": "backup trovati",
"Maintenance_database_backup_total": "utilizzo totale disco", "Maintenance_database_backup_total": "utilizzo totale disco",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "Scegli lingua", "Maintenance_lang_selector_empty": "Scegli lingua",
"Maintenance_lang_selector_lable": "Seleziona lingua", "Maintenance_lang_selector_lable": "Seleziona lingua",
"Maintenance_lang_selector_text": "Questa modifica avviene lato client, quindi influisce solo sul browser attualmente in uso.", "Maintenance_lang_selector_text": "Questa modifica avviene lato client, quindi influisce solo sul browser attualmente in uso.",
"Maintenance_new_version": "È disponibile una nuova versione. Controlla le <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">note di rilascio</a>.", "Maintenance_new_version": "È disponibile una nuova versione. Controlla le <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">note di rilascio</a>.",
"Maintenance_themeselector_apply": "Applica", "Maintenance_themeselector_apply": "Applica",
"Maintenance_themeselector_empty": "Scegli una skin", "Maintenance_themeselector_empty": "Scegli una skin",
"Maintenance_themeselector_lable": "Seleziona skin", "Maintenance_themeselector_lable": "Seleziona skin",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "Abilita login", "PIALERT_WEB_PROTECTION_name": "Abilita login",
"PLUGINS_KEEP_HIST_description": "Quante voci dei risultati della scansione della cronologia dei plugin devono essere conservate (per plugin e non per dispositivo specifico).", "PLUGINS_KEEP_HIST_description": "Quante voci dei risultati della scansione della cronologia dei plugin devono essere conservate (per plugin e non per dispositivo specifico).",
"PLUGINS_KEEP_HIST_name": "Storico plugin", "PLUGINS_KEEP_HIST_name": "Storico plugin",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "Dimensione massima in MB del WAL (Write-Ahead Log) di SQLite prima dell'attivazione dei checkpoint automatici. Valori inferiori (10-20 MB) riducono l'utilizzo di disco/archiviazione, ma aumentano l'utilizzo della CPU durante le scansioni. Valori superiori (50-100 MB) riducono i picchi di CPU durante le operazioni, ma potrebbero richiedere più RAM e spazio su disco. Il valore predefinito di <code>50 MB</code> bilancia entrambi. Utile per sistemi con risorse limitate, come dispositivi NAS con schede SD. Riavviare il server affinché le modifiche abbiano effetto dopo aver salvato le impostazioni.",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "Limite dimensione WAL (MB)",
"Plugins_DeleteAll": "Elimina tutti (i filtri vengono ignorati)", "Plugins_DeleteAll": "Elimina tutti (i filtri vengono ignorati)",
"Plugins_Filters_Mac": "Filtro MAC", "Plugins_Filters_Mac": "Filtro MAC",
"Plugins_History": "Storico eventi", "Plugins_History": "Storico eventi",
@@ -804,4 +789,4 @@
"settings_system_label": "Sistema", "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>", "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_tooltip": "Salva le modifiche prima di provare le nuove impostazioni." "test_event_tooltip": "Salva le modifiche prima di provare le nuove impostazioni."
} }

View File

@@ -27,7 +27,7 @@
"AppEvents_ObjectType": "オブジェクトタイプ", "AppEvents_ObjectType": "オブジェクトタイプ",
"AppEvents_Plugin": "プラグイン", "AppEvents_Plugin": "プラグイン",
"AppEvents_Type": "種別", "AppEvents_Type": "種別",
"BACKEND_API_URL_description": "フロントエンドからバックエンドに通信するために使用します。 デフォルトでは<code>/server</code>に設定されており、通常変更する必要はありません。", "BACKEND_API_URL_description": "バックエンドAPIのURLを生成するために使用します。リバースプロキシを使用して<code>GRAPHQL_PORT</code>にマッピングする場合は指定してください。ポート番号を含む<code>http://</code>で始まる完全なURLを入力してください末尾のスラッシュ<code>/</code>は不要です)。",
"BACKEND_API_URL_name": "バックエンド API URL", "BACKEND_API_URL_name": "バックエンド API URL",
"BackDevDetail_Actions_Ask_Run": "このアクションを実行してよろしいですか?", "BackDevDetail_Actions_Ask_Run": "このアクションを実行してよろしいですか?",
"BackDevDetail_Actions_Not_Registered": "登録されていないアクション: ", "BackDevDetail_Actions_Not_Registered": "登録されていないアクション: ",
@@ -98,10 +98,10 @@
"DevDetail_MainInfo_Network": "<i class=\"fa fa-server\"></i>ードMAC", "DevDetail_MainInfo_Network": "<i class=\"fa fa-server\"></i>ードMAC",
"DevDetail_MainInfo_Network_Port": "<i class=\"fa fa-ethernet\"></i>ポート", "DevDetail_MainInfo_Network_Port": "<i class=\"fa fa-ethernet\"></i>ポート",
"DevDetail_MainInfo_Network_Site": "サイト", "DevDetail_MainInfo_Network_Site": "サイト",
"DevDetail_MainInfo_Network_Title": "ネットワーク詳細", "DevDetail_MainInfo_Network_Title": "ネットワーク",
"DevDetail_MainInfo_Owner": "所有者", "DevDetail_MainInfo_Owner": "所有者",
"DevDetail_MainInfo_SSID": "SSID", "DevDetail_MainInfo_SSID": "SSID",
"DevDetail_MainInfo_Title": "デバイス情報", "DevDetail_MainInfo_Title": "メイン情報",
"DevDetail_MainInfo_Type": "種別", "DevDetail_MainInfo_Type": "種別",
"DevDetail_MainInfo_Vendor": "ベンダー", "DevDetail_MainInfo_Vendor": "ベンダー",
"DevDetail_MainInfo_mac": "MAC", "DevDetail_MainInfo_mac": "MAC",
@@ -109,7 +109,7 @@
"DevDetail_Network_Node_hover": "現在のデバイスが接続されている上位のネットワーク機器を選択し、ネットワークツリーを構築します。", "DevDetail_Network_Node_hover": "現在のデバイスが接続されている上位のネットワーク機器を選択し、ネットワークツリーを構築します。",
"DevDetail_Network_Port_hover": "上位のネットワーク機器上で本デバイスが接続されているポート。空欄のままにすると、ネットワークツリーにWi-Fiアイコンが表示されます。", "DevDetail_Network_Port_hover": "上位のネットワーク機器上で本デバイスが接続されているポート。空欄のままにすると、ネットワークツリーにWi-Fiアイコンが表示されます。",
"DevDetail_Nmap_Scans": "手動Nmapスキャン", "DevDetail_Nmap_Scans": "手動Nmapスキャン",
"DevDetail_Nmap_Scans_desc": "ここでは手動のNMAPスキャンを実行できます。また、サービスとポートNMAPプラグインを通じて定期的な自動NMAPスキャンをスケジュールすることも可能です。詳細は<a href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">ドキュメント</a>をご覧ください", "DevDetail_Nmap_Scans_desc": "ここでは手動のNMAPスキャンを実行できます。また、サービスとポートNMAPプラグインを通じて定期的な自動NMAPスキャンをスケジュールすることも可能です。詳細は<a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">ドキュメント</a>をご覧ください",
"DevDetail_Nmap_buttonDefault": "デフォルトスキャン", "DevDetail_Nmap_buttonDefault": "デフォルトスキャン",
"DevDetail_Nmap_buttonDefault_text": "デフォルトスキャン: Nmapは、要求された各スキャンプロトコルに対して上位1,000ポートをスキャンします。これにより、TCPポートの約93%、UDPポートの約49%を捕捉します。約5秒", "DevDetail_Nmap_buttonDefault_text": "デフォルトスキャン: Nmapは、要求された各スキャンプロトコルに対して上位1,000ポートをスキャンします。これにより、TCPポートの約93%、UDPポートの約49%を捕捉します。約5秒",
"DevDetail_Nmap_buttonDetail": "詳細スキャン", "DevDetail_Nmap_buttonDetail": "詳細スキャン",
@@ -139,7 +139,7 @@
"DevDetail_SessionTable_Duration": "期間", "DevDetail_SessionTable_Duration": "期間",
"DevDetail_SessionTable_IP": "IPアドレス", "DevDetail_SessionTable_IP": "IPアドレス",
"DevDetail_SessionTable_Order": "順序", "DevDetail_SessionTable_Order": "順序",
"DevDetail_Shortcut_CurrentStatus": "状態", "DevDetail_Shortcut_CurrentStatus": "現在の状態",
"DevDetail_Shortcut_DownAlerts": "ダウンアラート", "DevDetail_Shortcut_DownAlerts": "ダウンアラート",
"DevDetail_Shortcut_Presence": "検出", "DevDetail_Shortcut_Presence": "検出",
"DevDetail_Shortcut_Sessions": "セッション", "DevDetail_Shortcut_Sessions": "セッション",
@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "大量のアクション:", "Device_MultiEdit_MassActions": "大量のアクション:",
"Device_MultiEdit_No_Devices": "デバイスが選択されていません。", "Device_MultiEdit_No_Devices": "デバイスが選択されていません。",
"Device_MultiEdit_Tooltip": "注意。これをクリックすると、左側の値が上記で選択したすべてのデバイスに適用されます。", "Device_MultiEdit_Tooltip": "注意。これをクリックすると、左側の値が上記で選択したすべてのデバイスに適用されます。",
"Device_NextScan_Imminent": "まもなく", "Device_Save_Failed": "",
"Device_NextScan_In": "次のスキャン ", "Device_Save_Unauthorized": "",
"Device_NoData_Help": "スキャン後にデバイスが表示されない場合は、SCAN_SUBNETS設定と<a href=\"https://docs.netalertx.com/SUBNETS\" target=\"_blank\">ドキュメント</a>を確認してください。", "Device_Saved_Success": "",
"Device_NoData_Scanning": "最初のスキャンを待機中 - 初期設定後、数分かかる場合があります。", "Device_Saved_Unexpected": "",
"Device_NoData_Title": "デバイスが見つかりません",
"Device_Save_Failed": "デバイスの保存に失敗しました",
"Device_Save_Unauthorized": "許可されていない - 無効なAPIトークン",
"Device_Saved_Success": "デバイスが正常に保存されました",
"Device_Saved_Unexpected": "デバイスの更新で予期せぬ応答がありました",
"Device_Scanning": "スキャン中…",
"Device_Searchbox": "検索", "Device_Searchbox": "検索",
"Device_Shortcut_AllDevices": "自分のデバイス", "Device_Shortcut_AllDevices": "自分のデバイス",
"Device_Shortcut_AllNodes": "全ノード", "Device_Shortcut_AllNodes": "全ノード",
@@ -224,18 +218,16 @@
"Device_Shortcut_Favorites": "お気に入り", "Device_Shortcut_Favorites": "お気に入り",
"Device_Shortcut_NewDevices": "新規デバイス", "Device_Shortcut_NewDevices": "新規デバイス",
"Device_Shortcut_OnlineChart": "デバイス検出", "Device_Shortcut_OnlineChart": "デバイス検出",
"Device_Shortcut_Unstable": "不安定",
"Device_TableHead_AlertDown": "ダウンアラート", "Device_TableHead_AlertDown": "ダウンアラート",
"Device_TableHead_Connected_Devices": "接続", "Device_TableHead_Connected_Devices": "接続",
"Device_TableHead_CustomProps": "属性 / アクション", "Device_TableHead_CustomProps": "属性 / アクション",
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "お気に入り", "Device_TableHead_Favorite": "お気に入り",
"Device_TableHead_FirstSession": "初回セッション", "Device_TableHead_FirstSession": "初回セッション",
"Device_TableHead_Flapping": "フラッピング",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "グループ", "Device_TableHead_Group": "グループ",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "",
"Device_TableHead_IPv6": "IPv6", "Device_TableHead_IPv6": "",
"Device_TableHead_Icon": "アイコン", "Device_TableHead_Icon": "アイコン",
"Device_TableHead_LastIP": "直近のIP", "Device_TableHead_LastIP": "直近のIP",
"Device_TableHead_LastIPOrder": "直近のIP順", "Device_TableHead_LastIPOrder": "直近のIP順",
@@ -259,7 +251,7 @@
"Device_TableHead_SyncHubNodeName": "同期ノード", "Device_TableHead_SyncHubNodeName": "同期ノード",
"Device_TableHead_Type": "種別", "Device_TableHead_Type": "種別",
"Device_TableHead_Vendor": "ベンダー", "Device_TableHead_Vendor": "ベンダー",
"Device_TableHead_Vlan": "VLAN", "Device_TableHead_Vlan": "",
"Device_Table_Not_Network_Device": "ネットワーク機器として構成されていない", "Device_Table_Not_Network_Device": "ネットワーク機器として構成されていない",
"Device_Table_info": "_START__END_を表示 / _TOTAL_ 件中", "Device_Table_info": "_START__END_を表示 / _TOTAL_ 件中",
"Device_Table_nav_next": "次", "Device_Table_nav_next": "次",
@@ -307,14 +299,14 @@
"Events_Tablelenght": "_MENU_件ずつ表示", "Events_Tablelenght": "_MENU_件ずつ表示",
"Events_Tablelenght_all": "全件", "Events_Tablelenght_all": "全件",
"Events_Title": "イベント", "Events_Title": "イベント",
"FakeMAC_hover": "このデバイスは偽装MACアドレスを使用しています", "FakeMAC_hover": "自動検出 - デバイスがFAKE MACアドレスFA:CEまたは00:1Aで始まるを使用しているかどうかを示します。これは通常、本来のMACアドレスを検出できないプラグインによる生成か、ダミーデバイスの作成によって使用されます。",
"FieldLock_Error": "フィールドロック状態の更新エラー", "FieldLock_Error": "",
"FieldLock_Lock_Tooltip": "フィールドをロック(プラグインによる上書きを防止)", "FieldLock_Lock_Tooltip": "",
"FieldLock_Locked": "フィールドロック", "FieldLock_Locked": "",
"FieldLock_SaveBeforeLocking": "変更を保存してからロックしてください", "FieldLock_SaveBeforeLocking": "",
"FieldLock_Source_Label": "Source: ", "FieldLock_Source_Label": "",
"FieldLock_Unlock_Tooltip": "フィールドのロック解除(プラグインによる上書きを許可)", "FieldLock_Unlock_Tooltip": "",
"FieldLock_Unlocked": "フィールドロック解除", "FieldLock_Unlocked": "",
"GRAPHQL_PORT_description": "GraphQLサーバーのポート番号。このホスト上のすべてのアプリケーションおよびNetAlertXインスタンスにおいて、ポートが一意であることを確認してください。", "GRAPHQL_PORT_description": "GraphQLサーバーのポート番号。このホスト上のすべてのアプリケーションおよびNetAlertXインスタンスにおいて、ポートが一意であることを確認してください。",
"GRAPHQL_PORT_name": "GraphQLポート", "GRAPHQL_PORT_name": "GraphQLポート",
"Gen_Action": "アクション", "Gen_Action": "アクション",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "デバイス追加", "Gen_AddDevice": "デバイス追加",
"Gen_Add_All": "すべて追加", "Gen_Add_All": "すべて追加",
"Gen_All_Devices": "全デバイス", "Gen_All_Devices": "全デバイス",
"Gen_Archived": "アーカイブ",
"Gen_AreYouSure": "本当によろしいですか?", "Gen_AreYouSure": "本当によろしいですか?",
"Gen_Backup": "バックアップを実行", "Gen_Backup": "バックアップを実行",
"Gen_Cancel": "キャンセル", "Gen_Cancel": "キャンセル",
@@ -333,16 +324,13 @@
"Gen_Delete": "削除", "Gen_Delete": "削除",
"Gen_DeleteAll": "全削除", "Gen_DeleteAll": "全削除",
"Gen_Description": "説明", "Gen_Description": "説明",
"Gen_Down": "ダウン中",
"Gen_Error": "エラー", "Gen_Error": "エラー",
"Gen_Filter": "フィルター", "Gen_Filter": "フィルター",
"Gen_Flapping": "フラッピング",
"Gen_Generate": "生成", "Gen_Generate": "生成",
"Gen_InvalidMac": "無効なMacアドレス。", "Gen_InvalidMac": "無効なMacアドレス。",
"Gen_Invalid_Value": "無効な値が入力されました", "Gen_Invalid_Value": "無効な値が入力されました",
"Gen_LockedDB": "エラー - DBがロックされている可能性があります - F12で開発者ツール→コンソールを確認するか、後で試してください。", "Gen_LockedDB": "エラー - DBがロックされている可能性があります - F12で開発者ツール→コンソールを確認するか、後で試してください。",
"Gen_NetworkMask": "ネットワークマスク", "Gen_NetworkMask": "ネットワークマスク",
"Gen_New": "New",
"Gen_Offline": "オフライン", "Gen_Offline": "オフライン",
"Gen_Okay": "Ok", "Gen_Okay": "Ok",
"Gen_Online": "オンライン", "Gen_Online": "オンライン",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "プレビューを選択", "Gen_SelectToPreview": "プレビューを選択",
"Gen_Selected_Devices": "選択したデバイス:", "Gen_Selected_Devices": "選択したデバイス:",
"Gen_Sleeping": "スリーピング",
"Gen_Subnet": "サブネット", "Gen_Subnet": "サブネット",
"Gen_Switch": "スイッチ", "Gen_Switch": "スイッチ",
"Gen_Upd": "アップデートが正常に完了しました", "Gen_Upd": "アップデートが正常に完了しました",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "更新値", "Gen_Update_Value": "更新値",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "警告", "Gen_Warning": "警告",
"Gen_Work_In_Progress": "作業中、https://github.com/netalertx/NetAlertX/issues へのフィードバックの好機です", "Gen_Work_In_Progress": "作業中、https://github.com/jokob-sk/NetAlertX/issues へのフィードバックの好機です",
"Gen_create_new_device": "新規デバイス", "Gen_create_new_device": "新規デバイス",
"Gen_create_new_device_info": "デバイスは通常、<a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">プラグイン</a>を使用して検出されます。ただし、特定のケースでは手動でデバイスを追加する必要がある場合があります。具体的なシナリオについては、<a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">リモートネットワークドキュメント</a>を参照してください。", "Gen_create_new_device_info": "デバイスは通常、<a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">プラグイン</a>を使用して検出されます。ただし、特定のケースでは手動でデバイスを追加する必要がある場合があります。具体的なシナリオについては、<a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">リモートネットワークドキュメント</a>を参照してください。",
"General_display_name": "一般", "General_display_name": "一般",
@@ -385,7 +372,7 @@
"Loading": "読み込み中…", "Loading": "読み込み中…",
"Login_Box": "パスワードを入力してください", "Login_Box": "パスワードを入力してください",
"Login_Default_PWD": "デフォルトパスワード「123456」は有効なままです。", "Login_Default_PWD": "デフォルトパスワード「123456」は有効なままです。",
"Login_Info": "パスワードはSet Passwordプラグインで設定されます。ログインに問題がある場合は<a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/set_password\">SETPWDのドキュメント</a>を確認してください。", "Login_Info": "パスワードはSet Passwordプラグインで設定されます。ログインに問題がある場合は<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">SETPWDのドキュメント</a>を確認してください。",
"Login_Psw-box": "パスワード", "Login_Psw-box": "パスワード",
"Login_Psw_alert": "パスワードアラート!", "Login_Psw_alert": "パスワードアラート!",
"Login_Psw_folder": "config フォルダ内。", "Login_Psw_folder": "config フォルダ内。",
@@ -427,10 +414,10 @@
"Maintenance_Tool_ImportPastedConfig": "設定のインポート(貼り付け)", "Maintenance_Tool_ImportPastedConfig": "設定のインポート(貼り付け)",
"Maintenance_Tool_ImportPastedConfig_noti_text": "貼り付けた設定を本当にインポートしますか?これにより<code>app.conf</code>ファイルが完全に<b>上書き</b>されます。", "Maintenance_Tool_ImportPastedConfig_noti_text": "貼り付けた設定を本当にインポートしますか?これにより<code>app.conf</code>ファイルが完全に<b>上書き</b>されます。",
"Maintenance_Tool_ImportPastedConfig_text": "アプリケーション設定をすべて含む<code>app.conf</code>ファイルをインポートします。まず<b>設定のエクスポート</b>で現在の<code>app.conf</code>ファイルをダウンロードすることをお勧めします。", "Maintenance_Tool_ImportPastedConfig_text": "アプリケーション設定をすべて含む<code>app.conf</code>ファイルをインポートします。まず<b>設定のエクスポート</b>で現在の<code>app.conf</code>ファイルをダウンロードすることをお勧めします。",
"Maintenance_Tool_UnlockFields": "デバイスフィールドのロック解除", "Maintenance_Tool_UnlockFields": "",
"Maintenance_Tool_UnlockFields_noti": "デバイスフィールドのロック解除", "Maintenance_Tool_UnlockFields_noti": "",
"Maintenance_Tool_UnlockFields_noti_text": "全デバイスのデバイスフィールドのソース値LOCKED/USERをすべてクリアしてもよろしいですか この操作は元に戻せません。", "Maintenance_Tool_UnlockFields_noti_text": "",
"Maintenance_Tool_UnlockFields_text": "このツールは、すべてのデバイスにおいて追跡対象フィールドからすべてのソース値を削除し、プラグインおよびユーザー向けに全フィールドを解放します。登録されたデバイス全体に影響を与えるため、慎重に使用してください。", "Maintenance_Tool_UnlockFields_text": "",
"Maintenance_Tool_arpscansw": "arpスキャンの切り替えオン/オフ)", "Maintenance_Tool_arpscansw": "arpスキャンの切り替えオン/オフ)",
"Maintenance_Tool_arpscansw_noti": "arpスキャンをオンまたはオフにする", "Maintenance_Tool_arpscansw_noti": "arpスキャンをオンまたはオフにする",
"Maintenance_Tool_arpscansw_noti_text": "スキャンをオフにした場合、再度有効化されるまでオフのままとなります。", "Maintenance_Tool_arpscansw_noti_text": "スキャンをオフにした場合、再度有効化されるまでオフのままとなります。",
@@ -440,9 +427,9 @@
"Maintenance_Tool_backup_noti_text": "データベースのバックアップを実行してもよろしいですか? 現在スキャンが実行されていないことを確認してください。", "Maintenance_Tool_backup_noti_text": "データベースのバックアップを実行してもよろしいですか? 現在スキャンが実行されていないことを確認してください。",
"Maintenance_Tool_backup_text": "データベースのバックアップは、作成日をファイル名としたzipアーカイブとしてデータベースディレクトリ内に配置されます。バックアップの最大数は存在しません。", "Maintenance_Tool_backup_text": "データベースのバックアップは、作成日をファイル名としたzipアーカイブとしてデータベースディレクトリ内に配置されます。バックアップの最大数は存在しません。",
"Maintenance_Tool_check_visible": "チェックを外すと列を非表示にします。", "Maintenance_Tool_check_visible": "チェックを外すと列を非表示にします。",
"Maintenance_Tool_clearSourceFields_selected": "ソースフィールドをクリア", "Maintenance_Tool_clearSourceFields_selected": "",
"Maintenance_Tool_clearSourceFields_selected_noti": "ソースをクリア", "Maintenance_Tool_clearSourceFields_selected_noti": "",
"Maintenance_Tool_clearSourceFields_selected_text": "選択したデバイスのすべてのソースフィールドをクリアします。この操作は取り消せません。", "Maintenance_Tool_clearSourceFields_selected_text": "",
"Maintenance_Tool_darkmode": "モード切替(ダーク/ライト)", "Maintenance_Tool_darkmode": "モード切替(ダーク/ライト)",
"Maintenance_Tool_darkmode_noti": "モード切替", "Maintenance_Tool_darkmode_noti": "モード切替",
"Maintenance_Tool_darkmode_noti_text": "テーマ変更後、変更を有効化するためにページを再読み込みします。必要に応じて、キャッシュをクリアする必要があります。", "Maintenance_Tool_darkmode_noti_text": "テーマ変更後、変更を有効化するためにページを再読み込みします。必要に応じて、キャッシュをクリアする必要があります。",
@@ -473,7 +460,7 @@
"Maintenance_Tool_del_unknowndev_noti": "(Unknown)のデバイスを削除", "Maintenance_Tool_del_unknowndev_noti": "(Unknown)のデバイスを削除",
"Maintenance_Tool_del_unknowndev_noti_text": "すべての(Unknown)のデバイスと(name not found)のデバイスを削除してもよろしいですか?", "Maintenance_Tool_del_unknowndev_noti_text": "すべての(Unknown)のデバイスと(name not found)のデバイスを削除してもよろしいですか?",
"Maintenance_Tool_del_unknowndev_text": "この機能を使用する前に、必ずバックアップを作成してください。削除操作は元に戻せません。データベースから(Unknown)という名前のデバイスをすべて削除します。", "Maintenance_Tool_del_unknowndev_text": "この機能を使用する前に、必ずバックアップを作成してください。削除操作は元に戻せません。データベースから(Unknown)という名前のデバイスをすべて削除します。",
"Maintenance_Tool_del_unlockFields_selecteddev_text": "これにより、選択したデバイスの「LOCKED/USER」フィールドのロックが解除されます。この操作は取り消せません。", "Maintenance_Tool_del_unlockFields_selecteddev_text": "",
"Maintenance_Tool_displayed_columns_text": "<a href=\"devices.php\"><b><i class=\"fa fa-laptop\"></i>デバイス</b></a>ページの列の表示状態と順序を変更します。", "Maintenance_Tool_displayed_columns_text": "<a href=\"devices.php\"><b><i class=\"fa fa-laptop\"></i>デバイス</b></a>ページの列の表示状態と順序を変更します。",
"Maintenance_Tool_drag_me": "ドラッグして列を並べ替え。", "Maintenance_Tool_drag_me": "ドラッグして列を並べ替え。",
"Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text", "Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text",
@@ -485,8 +472,8 @@
"Maintenance_Tool_restore_noti": "DB復元", "Maintenance_Tool_restore_noti": "DB復元",
"Maintenance_Tool_restore_noti_text": "データベースの復元を実行してもよろしいですか? 現在スキャンが実行されていないことを確認してください。", "Maintenance_Tool_restore_noti_text": "データベースの復元を実行してもよろしいですか? 現在スキャンが実行されていないことを確認してください。",
"Maintenance_Tool_restore_text": "最新のバックアップはボタンから復元できますが、それ以前のバックアップは手動でのみ復元可能です。復元後は、バックアップ作成時にデータベースが書き込まれていた場合に備え、安全のためデータベースの整合性チェックを実施してください。", "Maintenance_Tool_restore_text": "最新のバックアップはボタンから復元できますが、それ以前のバックアップは手動でのみ復元可能です。復元後は、バックアップ作成時にデータベースが書き込まれていた場合に備え、安全のためデータベースの整合性チェックを実施してください。",
"Maintenance_Tool_unlockFields_selecteddev": "デバイスフィールドのロック解除", "Maintenance_Tool_unlockFields_selecteddev": "",
"Maintenance_Tool_unlockFields_selecteddev_noti": "フィールドのロック解除", "Maintenance_Tool_unlockFields_selecteddev_noti": "",
"Maintenance_Tool_upgrade_database_noti": "データベースアップグレード", "Maintenance_Tool_upgrade_database_noti": "データベースアップグレード",
"Maintenance_Tool_upgrade_database_noti_text": "データベースをアップグレードしてもよろしいですか?<br>(アーカイブすることをお勧めします)", "Maintenance_Tool_upgrade_database_noti_text": "データベースをアップグレードしてもよろしいですか?<br>(アーカイブすることをお勧めします)",
"Maintenance_Tool_upgrade_database_text": "このボタンをクリックすると、データベースがアップグレードされ、過去12時間のネットワーク活動チャートが表示可能になります。問題発生に備え、データベースのバックアップを必ず行ってください。", "Maintenance_Tool_upgrade_database_text": "このボタンをクリックすると、データベースがアップグレードされ、過去12時間のネットワーク活動チャートが表示可能になります。問題発生に備え、データベースのバックアップを必ず行ってください。",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "無効化中", "Maintenance_arp_status_off": "無効化中",
"Maintenance_arp_status_on": "スキャン中", "Maintenance_arp_status_on": "スキャン中",
"Maintenance_built_on": "ビルド日", "Maintenance_built_on": "ビルド日",
"Maintenance_current_version": "最新です。<a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">現在の取り組み</a>をご覧ください。", "Maintenance_current_version": "最新です。<a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">現在の取り組み</a>をご覧ください。",
"Maintenance_database_backup": "DBバックアップ", "Maintenance_database_backup": "DBバックアップ",
"Maintenance_database_backup_found": "バックアップが見つかりました", "Maintenance_database_backup_found": "バックアップが見つかりました",
"Maintenance_database_backup_total": "総ディスク使用量", "Maintenance_database_backup_total": "総ディスク使用量",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "言語を選択", "Maintenance_lang_selector_empty": "言語を選択",
"Maintenance_lang_selector_lable": "言語を選択", "Maintenance_lang_selector_lable": "言語を選択",
"Maintenance_lang_selector_text": "変更はクライアント側で行われるため、現在のブラウザにのみ影響します。", "Maintenance_lang_selector_text": "変更はクライアント側で行われるため、現在のブラウザにのみ影響します。",
"Maintenance_new_version": "新しいバージョンが利用可能です。<a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">リリースノート</a>を確認してください。", "Maintenance_new_version": "新しいバージョンが利用可能です。<a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">リリースノート</a>を確認してください。",
"Maintenance_themeselector_apply": "適用", "Maintenance_themeselector_apply": "適用",
"Maintenance_themeselector_empty": "スキンを選択", "Maintenance_themeselector_empty": "スキンを選択",
"Maintenance_themeselector_lable": "スキンを選択", "Maintenance_themeselector_lable": "スキンを選択",
@@ -524,7 +511,7 @@
"Navigation_Devices": "デバイス", "Navigation_Devices": "デバイス",
"Navigation_Donations": "寄付", "Navigation_Donations": "寄付",
"Navigation_Events": "イベント", "Navigation_Events": "イベント",
"Navigation_Integrations": "連携", "Navigation_Integrations": "統合",
"Navigation_Maintenance": "メンテナンス", "Navigation_Maintenance": "メンテナンス",
"Navigation_Monitoring": "監視", "Navigation_Monitoring": "監視",
"Navigation_Network": "ネットワーク", "Navigation_Network": "ネットワーク",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "ログインを有効化", "PIALERT_WEB_PROTECTION_name": "ログインを有効化",
"PLUGINS_KEEP_HIST_description": "プラグイン履歴スキャン結果のエントリをいくつ保持すべきか(デバイス固有ではなく、プラグインごとに)。", "PLUGINS_KEEP_HIST_description": "プラグイン履歴スキャン結果のエントリをいくつ保持すべきか(デバイス固有ではなく、プラグインごとに)。",
"PLUGINS_KEEP_HIST_name": "プラグイン履歴", "PLUGINS_KEEP_HIST_name": "プラグイン履歴",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "SQLite WALWrite-Ahead Logの自動チェックポイント発生前の最大サイズMB単位。低い値1020 MBではディスク/ストレージ使用量を削減しますが、スキャン時のCPU使用率が増加します。高い値50100 MBは操作中のCPUスパイクを軽減しますが、RAMとディスク容量をより多く消費する可能性があります。デフォルトの<code>50 MB</code>は両者のバランスを取ります。SDカードを搭載したNASデバイスなどのリソース制約のあるシステムで有用です。設定保存後、変更を有効にするにはサーバーを再起動してください。",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "WALサイズ制限(MB)",
"Plugins_DeleteAll": "すべて削除(フィルターは無視されます)", "Plugins_DeleteAll": "すべて削除(フィルターは無視されます)",
"Plugins_Filters_Mac": "Macフィルター", "Plugins_Filters_Mac": "Macフィルター",
"Plugins_History": "イベント履歴", "Plugins_History": "イベント履歴",
@@ -607,7 +592,7 @@
"Presence_CalHead_week": "週", "Presence_CalHead_week": "週",
"Presence_CalHead_year": "年", "Presence_CalHead_year": "年",
"Presence_CallHead_Devices": "デバイス", "Presence_CallHead_Devices": "デバイス",
"Presence_Key_OnlineNow": "オンライン継続中", "Presence_Key_OnlineNow": "現在までオンライン",
"Presence_Key_OnlineNow_desc": "前回のスキャンでオンライン状態と検出されたデバイス。", "Presence_Key_OnlineNow_desc": "前回のスキャンでオンライン状態と検出されたデバイス。",
"Presence_Key_OnlinePast": "オンラインだった時間", "Presence_Key_OnlinePast": "オンラインだった時間",
"Presence_Key_OnlinePastMiss": "オンラインだった時間(不一致)", "Presence_Key_OnlinePastMiss": "オンラインだった時間(不一致)",
@@ -630,7 +615,7 @@
"REPORT_MAIL_description": "有効化すると、購読した変更点のリストが記載されたメールが送信されます。以下のSMTP設定に関連する残りの設定もすべて入力してください。問題が発生した場合は、<code>LOG_LEVEL</code>を<code>debug</code>に設定し、<a href=\"/maintenance.php#tab_Logging\">エラーログ</a>を確認してください。", "REPORT_MAIL_description": "有効化すると、購読した変更点のリストが記載されたメールが送信されます。以下のSMTP設定に関連する残りの設定もすべて入力してください。問題が発生した場合は、<code>LOG_LEVEL</code>を<code>debug</code>に設定し、<a href=\"/maintenance.php#tab_Logging\">エラーログ</a>を確認してください。",
"REPORT_MAIL_name": "メールを有効化", "REPORT_MAIL_name": "メールを有効化",
"REPORT_TITLE": "レポート", "REPORT_TITLE": "レポート",
"RandomMAC_hover": "このデバイスはランダムなMACアドレスを使用しています", "RandomMAC_hover": "自動検出 - デバイスがMACアドレスをランダム化しているかどうかを示します。UI_NOT_RANDOM_MAC設定で特定のMACアドレスを除外できます。詳細はこちらをクリックしてください。",
"Reports_Sent_Log": "送信レポートログ", "Reports_Sent_Log": "送信レポートログ",
"SCAN_SUBNETS_description": "ほとんどのネットワーク内スキャナーARP-SCAN、NMAP、NSLOOKUP、DIGは、特定のネットワークインターフェースとサブネットをスキャンすることに依存しています。この設定に関するヘルプについては、<a href=\"https://docs.netalertx.com/SUBNETS\" target=\"_blank\">サブネットのドキュメント</a>を確認してください。特にVLAN、サポートされているVLANの種類、ネットワークマスクとインターフェースの確認方法についてです。<br/><br/>ネットワーク内スキャナーの代替手段として、NetAlert<sup>X</sup>がネットワークにアクセスする必要のない他のデバイススキャナー/インポーターUNIFI、dhcp.leases、PiHoleなどを有効化できます。<br/><br/>注スキャン時間自体は確認するIPアドレス数に依存するため、適切なネットワークマスクとインターフェースで慎重に設定してください。", "SCAN_SUBNETS_description": "ほとんどのネットワーク内スキャナーARP-SCAN、NMAP、NSLOOKUP、DIGは、特定のネットワークインターフェースとサブネットをスキャンすることに依存しています。この設定に関するヘルプについては、<a href=\"https://docs.netalertx.com/SUBNETS\" target=\"_blank\">サブネットのドキュメント</a>を確認してください。特にVLAN、サポートされているVLANの種類、ネットワークマスクとインターフェースの確認方法についてです。<br/><br/>ネットワーク内スキャナーの代替手段として、NetAlert<sup>X</sup>がネットワークにアクセスする必要のない他のデバイススキャナー/インポーターUNIFI、dhcp.leases、PiHoleなどを有効化できます。<br/><br/>注スキャン時間自体は確認するIPアドレス数に依存するため、適切なネットワークマスクとインターフェースで慎重に設定してください。",
"SCAN_SUBNETS_name": "スキャン対象ネットワーク", "SCAN_SUBNETS_name": "スキャン対象ネットワーク",
@@ -638,7 +623,7 @@
"Setting_Override": "上書き値", "Setting_Override": "上書き値",
"Setting_Override_Description": "このオプションを有効にすると、アプリが提供するデフォルト値が上記で指定された値で上書きされます。", "Setting_Override_Description": "このオプションを有効にすると、アプリが提供するデフォルト値が上記で指定された値で上書きされます。",
"Settings_Metadata_Toggle": "指定された設定のメタデータを表示/非表示にする。", "Settings_Metadata_Toggle": "指定された設定のメタデータを表示/非表示にする。",
"Settings_Show_Description": "説明を表示", "Settings_Show_Description": "設定の説明を表示する。",
"Settings_device_Scanners_desync": "⚠デバイススキャナーのスケジュールが同期されていません。", "Settings_device_Scanners_desync": "⚠デバイススキャナーのスケジュールが同期されていません。",
"Settings_device_Scanners_desync_popup": "デバイススキャナーのスケジュール(<code>*_RUN_SCHD</code>)は同一ではありません。これにより、デバイスのオンライン/オフライン通知に一貫性が生じます。意図的な場合を除き、有効化されているすべての<b>🔍デバイススキャナー</b>で同一のスケジュールを使用してください。", "Settings_device_Scanners_desync_popup": "デバイススキャナーのスケジュール(<code>*_RUN_SCHD</code>)は同一ではありません。これにより、デバイスのオンライン/オフライン通知に一貫性が生じます。意図的な場合を除き、有効化されているすべての<b>🔍デバイススキャナー</b>で同一のスケジュールを使用してください。",
"Speedtest_Results": "スピードテスト結果", "Speedtest_Results": "スピードテスト結果",
@@ -804,4 +789,4 @@
"settings_system_label": "システム", "settings_system_label": "システム",
"settings_update_item_warning": "以下の値を更新してください。以前のフォーマットに従うよう注意してください。<b>検証は行われません。</b>", "settings_update_item_warning": "以下の値を更新してください。以前のフォーマットに従うよう注意してください。<b>検証は行われません。</b>",
"test_event_tooltip": "設定をテストする前に、まず変更を保存してください。" "test_event_tooltip": "設定をテストする前に、まず変更を保存してください。"
} }

View File

@@ -2,24 +2,46 @@
// ################################### // ###################################
// ## Languages // ## Languages
// ## Look-up here: http://www.lingoes.net/en/translator/langcode.htm
// ################################### // ###################################
$defaultLang = "en_us"; $defaultLang = "en_us";
$allLanguages = [ "ar_ar", "ca_ca", "cs_cz", "de_de",
"en_us", "es_es", "fa_fa", "fr_fr",
"it_it", "ja_jp", "nb_no", "pl_pl",
"pt_br", "pt_pt", "ru_ru", "sv_sv",
"tr_tr", "uk_ua", "vi_vn", "zh_cn"];
// Load the canonical language list from languages.json — do not hardcode here.
$_langJsonPath = dirname(__FILE__) . '/language_definitions/languages.json';
$_langJson = json_decode(file_get_contents($_langJsonPath), true);
$allLanguages = array_column($_langJson['languages'], 'code');
global $db; global $db;
$result = $db->querySingle("SELECT setValue FROM Settings WHERE setKey = 'UI_LANG'"); $result = $db->querySingle("SELECT setValue FROM Settings WHERE setKey = 'UI_LANG'");
// Extract the language code from the display value, e.g. "English (en_us)" => "en_us". // below has to match exactly the values in /front/php/templates/language/lang.php & /front/js/common.js
// This regex means lang.php never needs updating when a new language is added. switch($result){
preg_match('/\(([a-z]{2}_[a-z]{2})\)\s*$/i', (string) $result, $_langMatch); case 'Arabic (ar_ar)': $pia_lang_selected = 'ar_ar'; break;
$pia_lang_selected = isset($_langMatch[1]) ? strtolower($_langMatch[1]) : $defaultLang; case 'Catalan (ca_ca)': $pia_lang_selected = 'ca_ca'; break;
case 'Czech (cs_cz)': $pia_lang_selected = 'cs_cz'; break;
case 'German (de_de)': $pia_lang_selected = 'de_de'; break;
case 'English (en_us)': $pia_lang_selected = 'en_us'; break;
case 'Spanish (es_es)': $pia_lang_selected = 'es_es'; break;
case 'Farsi (fa_fa)': $pia_lang_selected = 'fa_fa'; break;
case 'French (fr_fr)': $pia_lang_selected = 'fr_fr'; break;
case 'Italian (it_it)': $pia_lang_selected = 'it_it'; break;
case 'Japanese (ja_jp)': $pia_lang_selected = 'ja_jp'; break;
case 'Norwegian (nb_no)': $pia_lang_selected = 'nb_no'; break;
case 'Polish (pl_pl)': $pia_lang_selected = 'pl_pl'; break;
case 'Portuguese (pt_br)': $pia_lang_selected = 'pt_br'; break;
case 'Portuguese (pt_pt)': $pia_lang_selected = 'pt_pt'; break;
case 'Russian (ru_ru)': $pia_lang_selected = 'ru_ru'; break;
case 'Swedish (sv_sv)': $pia_lang_selected = 'sv_sv'; break;
case 'Turkish (tr_tr)': $pia_lang_selected = 'tr_tr'; break;
case 'Ukrainian (uk_ua)': $pia_lang_selected = 'uk_ua'; break;
case 'Vietnamese (vi_vn)': $pia_lang_selected = 'vi_vn'; break;
case 'Chinese (zh_cn)': $pia_lang_selected = 'zh_cn'; break;
default: $pia_lang_selected = 'en_us'; break;
}
if (isset($pia_lang_selected) == FALSE or (strlen($pia_lang_selected) == 0)) {$pia_lang_selected = $defaultLang;}
$result = $db->query("SELECT * FROM Plugins_Language_Strings"); $result = $db->query("SELECT * FROM Plugins_Language_Strings");
$strings = array(); $strings = array();

View File

@@ -1,26 +0,0 @@
{
"default": "en_us",
"languages": [
{ "code": "ar_ar", "display": "Arabic (ar_ar)" },
{ "code": "ca_ca", "display": "Catalan (ca_ca)" },
{ "code": "cs_cz", "display": "Czech (cs_cz)" },
{ "code": "de_de", "display": "German (de_de)" },
{ "code": "en_us", "display": "English (en_us)" },
{ "code": "es_es", "display": "Spanish (es_es)" },
{ "code": "fa_fa", "display": "Farsi (fa_fa)" },
{ "code": "id_id", "display": "Indonesian (id_id)" },
{ "code": "fr_fr", "display": "French (fr_fr)" },
{ "code": "it_it", "display": "Italian (it_it)" },
{ "code": "ja_jp", "display": "Japanese (ja_jp)" },
{ "code": "nb_no", "display": "Norwegian (nb_no)" },
{ "code": "pl_pl", "display": "Polish (pl_pl)" },
{ "code": "pt_br", "display": "Portuguese (pt_br)" },
{ "code": "pt_pt", "display": "Portuguese (pt_pt)" },
{ "code": "ru_ru", "display": "Russian (ru_ru)" },
{ "code": "sv_sv", "display": "Swedish (sv_sv)" },
{ "code": "tr_tr", "display": "Turkish (tr_tr)" },
{ "code": "uk_ua", "display": "Ukrainian (uk_ua)" },
{ "code": "vi_vn", "display": "Vietnamese (vi_vn)" },
{ "code": "zh_cn", "display": "Chinese (zh_cn)" }
]
}

View File

@@ -31,22 +31,13 @@ def merge_translations(main_file, other_files):
f.truncate() f.truncate()
def load_language_codes(languages_json_path):
"""Read language codes from languages.json, guaranteeing en_us is first."""
with open(languages_json_path, "r", encoding="utf-8") as f:
data = json.load(f)
codes = [entry["code"] for entry in data["languages"]]
# Ensure en_us (the master) is always first
if "en_us" in codes:
codes.remove("en_us")
codes.insert(0, "en_us")
return codes
if __name__ == "__main__": if __name__ == "__main__":
current_path = os.path.dirname(os.path.abspath(__file__)) current_path = os.path.dirname(os.path.abspath(__file__))
# language codes are loaded from languages.json — add a new language there # language codes can be found here: http://www.lingoes.net/en/translator/langcode.htm
languages_json = os.path.join(current_path, "language_definitions/languages.json") # ⚠ "en_us.json" has to be first!
codes = load_language_codes(languages_json) json_files = ["en_us.json", "ar_ar.json", "ca_ca.json", "cs_cz.json", "de_de.json",
file_paths = [os.path.join(current_path, f"{code}.json") for code in codes] "es_es.json", "fa_fa.json", "fr_fr.json", "it_it.json", "ja_jp.json",
"nb_no.json", "pl_pl.json", "pt_br.json", "pt_pt.json", "ru_ru.json",
"sv_sv.json", "tr_tr.json", "vi_vn.json", "uk_ua.json", "zh_cn.json"]
file_paths = [os.path.join(current_path, file) for file in json_files]
merge_translations(file_paths[0], file_paths[1:]) merge_translations(file_paths[0], file_paths[1:])

View File

@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "Flerhandlinger:", "Device_MultiEdit_MassActions": "Flerhandlinger:",
"Device_MultiEdit_No_Devices": "", "Device_MultiEdit_No_Devices": "",
"Device_MultiEdit_Tooltip": "Forsiktig. Ved å klikke på denne vil verdien til venstre brukes på alle enhetene som er valgt ovenfor.", "Device_MultiEdit_Tooltip": "Forsiktig. Ved å klikke på denne vil verdien til venstre brukes på alle enhetene som er valgt ovenfor.",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "", "Device_Save_Failed": "",
"Device_Save_Unauthorized": "", "Device_Save_Unauthorized": "",
"Device_Saved_Success": "", "Device_Saved_Success": "",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "Søk", "Device_Searchbox": "Søk",
"Device_Shortcut_AllDevices": "Mine Enheter", "Device_Shortcut_AllDevices": "Mine Enheter",
"Device_Shortcut_AllNodes": "", "Device_Shortcut_AllNodes": "",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "Favoritter", "Device_Shortcut_Favorites": "Favoritter",
"Device_Shortcut_NewDevices": "Nye Enheter", "Device_Shortcut_NewDevices": "Nye Enheter",
"Device_Shortcut_OnlineChart": "Enhetens tilstedeværelse", "Device_Shortcut_OnlineChart": "Enhetens tilstedeværelse",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "", "Device_TableHead_AlertDown": "",
"Device_TableHead_Connected_Devices": "Tilkoblinger", "Device_TableHead_Connected_Devices": "Tilkoblinger",
"Device_TableHead_CustomProps": "", "Device_TableHead_CustomProps": "",
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "Favoritt", "Device_TableHead_Favorite": "Favoritt",
"Device_TableHead_FirstSession": "Første Økt", "Device_TableHead_FirstSession": "Første Økt",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Gruppe", "Device_TableHead_Group": "Gruppe",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "", "Gen_AddDevice": "",
"Gen_Add_All": "Legg til alle", "Gen_Add_All": "Legg til alle",
"Gen_All_Devices": "", "Gen_All_Devices": "",
"Gen_Archived": "",
"Gen_AreYouSure": "Er du sikker?", "Gen_AreYouSure": "Er du sikker?",
"Gen_Backup": "Kjør sikkerhetskopiering", "Gen_Backup": "Kjør sikkerhetskopiering",
"Gen_Cancel": "Avbryt", "Gen_Cancel": "Avbryt",
@@ -333,16 +324,13 @@
"Gen_Delete": "Slett", "Gen_Delete": "Slett",
"Gen_DeleteAll": "Slett alle", "Gen_DeleteAll": "Slett alle",
"Gen_Description": "", "Gen_Description": "",
"Gen_Down": "",
"Gen_Error": "Feil", "Gen_Error": "Feil",
"Gen_Filter": "Filter", "Gen_Filter": "Filter",
"Gen_Flapping": "",
"Gen_Generate": "", "Gen_Generate": "",
"Gen_InvalidMac": "", "Gen_InvalidMac": "",
"Gen_Invalid_Value": "", "Gen_Invalid_Value": "",
"Gen_LockedDB": "FEIL - DB kan være låst - Sjekk F12 Dev tools -> Konsoll eller prøv senere.", "Gen_LockedDB": "FEIL - DB kan være låst - Sjekk F12 Dev tools -> Konsoll eller prøv senere.",
"Gen_NetworkMask": "", "Gen_NetworkMask": "",
"Gen_New": "",
"Gen_Offline": "Frakoblet", "Gen_Offline": "Frakoblet",
"Gen_Okay": "Ok", "Gen_Okay": "Ok",
"Gen_Online": "", "Gen_Online": "",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "", "Gen_SelectIcon": "",
"Gen_SelectToPreview": "", "Gen_SelectToPreview": "",
"Gen_Selected_Devices": "Valgte Enheter:", "Gen_Selected_Devices": "Valgte Enheter:",
"Gen_Sleeping": "",
"Gen_Subnet": "", "Gen_Subnet": "",
"Gen_Switch": "Bytt", "Gen_Switch": "Bytt",
"Gen_Upd": "Oppdatering vellykket", "Gen_Upd": "Oppdatering vellykket",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "Oppdater verdi", "Gen_Update_Value": "Oppdater verdi",
"Gen_ValidIcon": "", "Gen_ValidIcon": "",
"Gen_Warning": "Advarsel", "Gen_Warning": "Advarsel",
"Gen_Work_In_Progress": "Work in progress, gjerne kom med tilbakemeldinger på https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Work in progress, gjerne kom med tilbakemeldinger på https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "", "Gen_create_new_device": "",
"Gen_create_new_device_info": "", "Gen_create_new_device_info": "",
"General_display_name": "Generelt", "General_display_name": "Generelt",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "er for øyeblikket deaktivert", "Maintenance_arp_status_off": "er for øyeblikket deaktivert",
"Maintenance_arp_status_on": "skanning(er) som kjører", "Maintenance_arp_status_on": "skanning(er) som kjører",
"Maintenance_built_on": "Bygd på", "Maintenance_built_on": "Bygd på",
"Maintenance_current_version": "Du er oppdatert. Sjekk ut hva<a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">jeg jobber med</a>.", "Maintenance_current_version": "Du er oppdatert. Sjekk ut hva<a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">jeg jobber med</a>.",
"Maintenance_database_backup": "Database-sikkerhetskopier", "Maintenance_database_backup": "Database-sikkerhetskopier",
"Maintenance_database_backup_found": "Sikkerhetskopier ble funnet", "Maintenance_database_backup_found": "Sikkerhetskopier ble funnet",
"Maintenance_database_backup_total": "total diskbruk", "Maintenance_database_backup_total": "total diskbruk",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "Velg språk", "Maintenance_lang_selector_empty": "Velg språk",
"Maintenance_lang_selector_lable": "Velg språk", "Maintenance_lang_selector_lable": "Velg språk",
"Maintenance_lang_selector_text": "Endringen skjer på klientsiden, så den påvirker bare den nåværende nettleseren.", "Maintenance_lang_selector_text": "Endringen skjer på klientsiden, så den påvirker bare den nåværende nettleseren.",
"Maintenance_new_version": "En ny versjon er tilgjengelig. Sjekk ut <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">utgivelsesnotater</a>.", "Maintenance_new_version": "En ny versjon er tilgjengelig. Sjekk ut <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">utgivelsesnotater</a>.",
"Maintenance_themeselector_apply": "Bruk", "Maintenance_themeselector_apply": "Bruk",
"Maintenance_themeselector_empty": "Velg ett skinn", "Maintenance_themeselector_empty": "Velg ett skinn",
"Maintenance_themeselector_lable": "Velg skinn", "Maintenance_themeselector_lable": "Velg skinn",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "Aktiver innlogging", "PIALERT_WEB_PROTECTION_name": "Aktiver innlogging",
"PLUGINS_KEEP_HIST_description": "Hvor mange oppføringer av plugins historie skanneresultater som skal oppbevares (per plugin, og ikke enhetsspesifikt).", "PLUGINS_KEEP_HIST_description": "Hvor mange oppføringer av plugins historie skanneresultater som skal oppbevares (per plugin, og ikke enhetsspesifikt).",
"PLUGINS_KEEP_HIST_name": "Plugins historie", "PLUGINS_KEEP_HIST_name": "Plugins historie",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "Slett alle (filtre blir ignorert)", "Plugins_DeleteAll": "Slett alle (filtre blir ignorert)",
"Plugins_Filters_Mac": "Mac filter", "Plugins_Filters_Mac": "Mac filter",
"Plugins_History": "Hendelses historikk", "Plugins_History": "Hendelses historikk",

View File

@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "Operacje zbiorcze:", "Device_MultiEdit_MassActions": "Operacje zbiorcze:",
"Device_MultiEdit_No_Devices": "", "Device_MultiEdit_No_Devices": "",
"Device_MultiEdit_Tooltip": "Uwaga. Kliknięcie tego spowoduje zastosowanie wartości po lewej stronie do wszystkich wybranych powyżej urządzeń.", "Device_MultiEdit_Tooltip": "Uwaga. Kliknięcie tego spowoduje zastosowanie wartości po lewej stronie do wszystkich wybranych powyżej urządzeń.",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "", "Device_Save_Failed": "",
"Device_Save_Unauthorized": "", "Device_Save_Unauthorized": "",
"Device_Saved_Success": "", "Device_Saved_Success": "",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "Szukaj", "Device_Searchbox": "Szukaj",
"Device_Shortcut_AllDevices": "Moje urządzenia", "Device_Shortcut_AllDevices": "Moje urządzenia",
"Device_Shortcut_AllNodes": "", "Device_Shortcut_AllNodes": "",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "Ulubione", "Device_Shortcut_Favorites": "Ulubione",
"Device_Shortcut_NewDevices": "Nowe urządzenia", "Device_Shortcut_NewDevices": "Nowe urządzenia",
"Device_Shortcut_OnlineChart": "Obecność urządzenia", "Device_Shortcut_OnlineChart": "Obecność urządzenia",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "Alert niedostępny", "Device_TableHead_AlertDown": "Alert niedostępny",
"Device_TableHead_Connected_Devices": "Połączenia", "Device_TableHead_Connected_Devices": "Połączenia",
"Device_TableHead_CustomProps": "Właściwości / Akcje", "Device_TableHead_CustomProps": "Właściwości / Akcje",
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Ulubione", "Device_TableHead_Favorite": "Ulubione",
"Device_TableHead_FirstSession": "Pierwsza sesja", "Device_TableHead_FirstSession": "Pierwsza sesja",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grupa", "Device_TableHead_Group": "Grupa",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "Dodaj urządzenie", "Gen_AddDevice": "Dodaj urządzenie",
"Gen_Add_All": "Dodaj wszystko", "Gen_Add_All": "Dodaj wszystko",
"Gen_All_Devices": "Wszystkie urządzenia", "Gen_All_Devices": "Wszystkie urządzenia",
"Gen_Archived": "",
"Gen_AreYouSure": "Jesteś pewien?", "Gen_AreYouSure": "Jesteś pewien?",
"Gen_Backup": "Uruchom kopię zapasową", "Gen_Backup": "Uruchom kopię zapasową",
"Gen_Cancel": "Anuluj", "Gen_Cancel": "Anuluj",
@@ -333,16 +324,13 @@
"Gen_Delete": "Usuń", "Gen_Delete": "Usuń",
"Gen_DeleteAll": "Usuń wszystko", "Gen_DeleteAll": "Usuń wszystko",
"Gen_Description": "Opis", "Gen_Description": "Opis",
"Gen_Down": "",
"Gen_Error": "Błąd", "Gen_Error": "Błąd",
"Gen_Filter": "Filtr", "Gen_Filter": "Filtr",
"Gen_Flapping": "",
"Gen_Generate": "Wygeneruj", "Gen_Generate": "Wygeneruj",
"Gen_InvalidMac": "", "Gen_InvalidMac": "",
"Gen_Invalid_Value": "", "Gen_Invalid_Value": "",
"Gen_LockedDB": "Błąd - Baza danych może być zablokowana - Sprawdź narzędzia deweloperskie F12 -> Konsola lub spróbuj później.", "Gen_LockedDB": "Błąd - Baza danych może być zablokowana - Sprawdź narzędzia deweloperskie F12 -> Konsola lub spróbuj później.",
"Gen_NetworkMask": "", "Gen_NetworkMask": "",
"Gen_New": "",
"Gen_Offline": "Niedostępne", "Gen_Offline": "Niedostępne",
"Gen_Okay": "Ok", "Gen_Okay": "Ok",
"Gen_Online": "Dostępne", "Gen_Online": "Dostępne",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Wybierz, aby podglądnąć", "Gen_SelectToPreview": "Wybierz, aby podglądnąć",
"Gen_Selected_Devices": "Wybrane urządzenia:", "Gen_Selected_Devices": "Wybrane urządzenia:",
"Gen_Sleeping": "",
"Gen_Subnet": "", "Gen_Subnet": "",
"Gen_Switch": "Switch", "Gen_Switch": "Switch",
"Gen_Upd": "Zaktualizowano pomyślnie", "Gen_Upd": "Zaktualizowano pomyślnie",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "Aktualizuj wartość", "Gen_Update_Value": "Aktualizuj wartość",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Ostrzeżenie", "Gen_Warning": "Ostrzeżenie",
"Gen_Work_In_Progress": "Prace w toku, to dobry moment na przesłanie opinii na https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Prace w toku, to dobry moment na przesłanie opinii na https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Nowe urządzenie", "Gen_create_new_device": "Nowe urządzenie",
"Gen_create_new_device_info": "Urządzenia są zazwyczaj wykrywane za pomocą <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">wtyczek</a>. Jednak w niektórych przypadkach może być konieczne dodanie urządzeń ręcznie. Aby zapoznać się z konkretnymi scenariuszami, sprawdź <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">dokumentację dotyczącą sieci zdalnych</a>.", "Gen_create_new_device_info": "Urządzenia są zazwyczaj wykrywane za pomocą <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">wtyczek</a>. Jednak w niektórych przypadkach może być konieczne dodanie urządzeń ręcznie. Aby zapoznać się z konkretnymi scenariuszami, sprawdź <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">dokumentację dotyczącą sieci zdalnych</a>.",
"General_display_name": "Ogólne", "General_display_name": "Ogólne",
@@ -385,7 +372,7 @@
"Loading": "Ładowanie…", "Loading": "Ładowanie…",
"Login_Box": "Wprowadź swoje hasło", "Login_Box": "Wprowadź swoje hasło",
"Login_Default_PWD": "Domyślne hasło „123456” nadal jest aktywne.", "Login_Default_PWD": "Domyślne hasło „123456” nadal jest aktywne.",
"Login_Info": "Hasła są ustawiane za pomocą wtyczki Set Password. Jeśli masz problemy z logowaniem, sprawdź <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/set_password\">dokumentację SETPWD</a>.", "Login_Info": "Hasła są ustawiane za pomocą wtyczki Set Password. Jeśli masz problemy z logowaniem, sprawdź <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">dokumentację SETPWD</a>.",
"Login_Psw-box": "Hasło", "Login_Psw-box": "Hasło",
"Login_Psw_alert": "Alert hasła!", "Login_Psw_alert": "Alert hasła!",
"Login_Psw_folder": "w folderze konfiguracyjnym.", "Login_Psw_folder": "w folderze konfiguracyjnym.",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "jest obecnie wyłączony", "Maintenance_arp_status_off": "jest obecnie wyłączony",
"Maintenance_arp_status_on": "skanowanie w toku", "Maintenance_arp_status_on": "skanowanie w toku",
"Maintenance_built_on": "Zbudowany na", "Maintenance_built_on": "Zbudowany na",
"Maintenance_current_version": "Jesteś na bieżąco. Zobacz, <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">nad czym aktualnie pracuję</a>.", "Maintenance_current_version": "Jesteś na bieżąco. Zobacz, <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">nad czym aktualnie pracuję</a>.",
"Maintenance_database_backup": "Kopia zapasowa bazy danych", "Maintenance_database_backup": "Kopia zapasowa bazy danych",
"Maintenance_database_backup_found": "znaleziono kopie zapasowe", "Maintenance_database_backup_found": "znaleziono kopie zapasowe",
"Maintenance_database_backup_total": "całkowite wykorzystanie dysku", "Maintenance_database_backup_total": "całkowite wykorzystanie dysku",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "Wybierz język", "Maintenance_lang_selector_empty": "Wybierz język",
"Maintenance_lang_selector_lable": "Wybierz język", "Maintenance_lang_selector_lable": "Wybierz język",
"Maintenance_lang_selector_text": "Zmiana odbywa się po stronie klienta, więc dotyczy tylko bieżącej przeglądarki.", "Maintenance_lang_selector_text": "Zmiana odbywa się po stronie klienta, więc dotyczy tylko bieżącej przeglądarki.",
"Maintenance_new_version": "Dostępna jest nowa wersja. Sprawdź <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">informacje o wydaniu</a>.", "Maintenance_new_version": "Dostępna jest nowa wersja. Sprawdź <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">informacje o wydaniu</a>.",
"Maintenance_themeselector_apply": "Zastosuj", "Maintenance_themeselector_apply": "Zastosuj",
"Maintenance_themeselector_empty": "Wybierz skórkę", "Maintenance_themeselector_empty": "Wybierz skórkę",
"Maintenance_themeselector_lable": "Zastosuj skórkę", "Maintenance_themeselector_lable": "Zastosuj skórkę",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "Włącz logowanie", "PIALERT_WEB_PROTECTION_name": "Włącz logowanie",
"PLUGINS_KEEP_HIST_description": "Ile wpisów wyników skanowania historii wtyczek powinno być przechowywanych (dla każdej wtyczki, a nie specyficznie dla urządzenia).", "PLUGINS_KEEP_HIST_description": "Ile wpisów wyników skanowania historii wtyczek powinno być przechowywanych (dla każdej wtyczki, a nie specyficznie dla urządzenia).",
"PLUGINS_KEEP_HIST_name": "Historia wtyczek", "PLUGINS_KEEP_HIST_name": "Historia wtyczek",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "Usuń wszystkie (filtry są ignorowane)", "Plugins_DeleteAll": "Usuń wszystkie (filtry są ignorowane)",
"Plugins_Filters_Mac": "Filtr MAC", "Plugins_Filters_Mac": "Filtr MAC",
"Plugins_History": "Historia zdarzeń", "Plugins_History": "Historia zdarzeń",

View File

@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "Ações em massa:", "Device_MultiEdit_MassActions": "Ações em massa:",
"Device_MultiEdit_No_Devices": "", "Device_MultiEdit_No_Devices": "",
"Device_MultiEdit_Tooltip": "Cuidadoso. Clicar aqui aplicará o valor à esquerda a todos os dispositivos selecionados acima.", "Device_MultiEdit_Tooltip": "Cuidadoso. Clicar aqui aplicará o valor à esquerda a todos os dispositivos selecionados acima.",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "", "Device_Save_Failed": "",
"Device_Save_Unauthorized": "", "Device_Save_Unauthorized": "",
"Device_Saved_Success": "", "Device_Saved_Success": "",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "Procurar", "Device_Searchbox": "Procurar",
"Device_Shortcut_AllDevices": "Meus dispositivos", "Device_Shortcut_AllDevices": "Meus dispositivos",
"Device_Shortcut_AllNodes": "", "Device_Shortcut_AllNodes": "",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "Favoritos", "Device_Shortcut_Favorites": "Favoritos",
"Device_Shortcut_NewDevices": "Novos dispositivos", "Device_Shortcut_NewDevices": "Novos dispositivos",
"Device_Shortcut_OnlineChart": "Presença do dispositivo", "Device_Shortcut_OnlineChart": "Presença do dispositivo",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "Alerta em baixo", "Device_TableHead_AlertDown": "Alerta em baixo",
"Device_TableHead_Connected_Devices": "Conexões", "Device_TableHead_Connected_Devices": "Conexões",
"Device_TableHead_CustomProps": "", "Device_TableHead_CustomProps": "",
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "Favorito", "Device_TableHead_Favorite": "Favorito",
"Device_TableHead_FirstSession": "Primeira sessão", "Device_TableHead_FirstSession": "Primeira sessão",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grupo", "Device_TableHead_Group": "Grupo",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "Adicionar dispositivo", "Gen_AddDevice": "Adicionar dispositivo",
"Gen_Add_All": "Adicionar todos", "Gen_Add_All": "Adicionar todos",
"Gen_All_Devices": "Todos os Dispositivos", "Gen_All_Devices": "Todos os Dispositivos",
"Gen_Archived": "",
"Gen_AreYouSure": "Tem certeza?", "Gen_AreYouSure": "Tem certeza?",
"Gen_Backup": "Executar backup", "Gen_Backup": "Executar backup",
"Gen_Cancel": "Cancelar", "Gen_Cancel": "Cancelar",
@@ -333,16 +324,13 @@
"Gen_Delete": "Excluir", "Gen_Delete": "Excluir",
"Gen_DeleteAll": "Excluir todos", "Gen_DeleteAll": "Excluir todos",
"Gen_Description": "Descrição", "Gen_Description": "Descrição",
"Gen_Down": "",
"Gen_Error": "Erro", "Gen_Error": "Erro",
"Gen_Filter": "Filtro", "Gen_Filter": "Filtro",
"Gen_Flapping": "",
"Gen_Generate": "Gerar", "Gen_Generate": "Gerar",
"Gen_InvalidMac": "", "Gen_InvalidMac": "",
"Gen_Invalid_Value": "", "Gen_Invalid_Value": "",
"Gen_LockedDB": "ERRO - O banco de dados pode estar bloqueado - Verifique F12 Ferramentas de desenvolvimento -> Console ou tente mais tarde.", "Gen_LockedDB": "ERRO - O banco de dados pode estar bloqueado - Verifique F12 Ferramentas de desenvolvimento -> Console ou tente mais tarde.",
"Gen_NetworkMask": "", "Gen_NetworkMask": "",
"Gen_New": "",
"Gen_Offline": "Offline", "Gen_Offline": "Offline",
"Gen_Okay": "Ok", "Gen_Okay": "Ok",
"Gen_Online": "Online", "Gen_Online": "Online",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Selecionar para pré-visualizar", "Gen_SelectToPreview": "Selecionar para pré-visualizar",
"Gen_Selected_Devices": "Dispositivos selecionados:", "Gen_Selected_Devices": "Dispositivos selecionados:",
"Gen_Sleeping": "",
"Gen_Subnet": "", "Gen_Subnet": "",
"Gen_Switch": "Trocar", "Gen_Switch": "Trocar",
"Gen_Upd": "Atualizado com sucesso", "Gen_Upd": "Atualizado com sucesso",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "Atualizar valor", "Gen_Update_Value": "Atualizar valor",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Aviso", "Gen_Warning": "Aviso",
"Gen_Work_In_Progress": "Trabalho em andamento, um bom momento para enviar feedback em https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Trabalho em andamento, um bom momento para enviar feedback em https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Novo dispositivo", "Gen_create_new_device": "Novo dispositivo",
"Gen_create_new_device_info": "Os dispositivos são normalmente descobertos usando <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>. No entanto, em certos casos, pode ser necessário adicionar dispositivos manualmente. Para explorar cenários específicos, verifique a <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">documentação de Redes Remotas</a>.", "Gen_create_new_device_info": "Os dispositivos são normalmente descobertos usando <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>. No entanto, em certos casos, pode ser necessário adicionar dispositivos manualmente. Para explorar cenários específicos, verifique a <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">documentação de Redes Remotas</a>.",
"General_display_name": "Geral", "General_display_name": "Geral",
@@ -385,7 +372,7 @@
"Loading": "Carregando...", "Loading": "Carregando...",
"Login_Box": "Introduza a sua palavra-passe", "Login_Box": "Introduza a sua palavra-passe",
"Login_Default_PWD": "A palavra-passe predefinida “123456” ainda está ativa.", "Login_Default_PWD": "A palavra-passe predefinida “123456” ainda está ativa.",
"Login_Info": "As palavra-passes são definidas por meio do plugin Definir palavra-passe. Verifique a <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/set_password\">documentação do SETPWD</a> se tiver problemas para fazer login.", "Login_Info": "As palavra-passes são definidas por meio do plugin Definir palavra-passe. Verifique a <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">documentação do SETPWD</a> se tiver problemas para fazer login.",
"Login_Psw-box": "Palavra-passe", "Login_Psw-box": "Palavra-passe",
"Login_Psw_alert": "Alerta de palavra-passe!", "Login_Psw_alert": "Alerta de palavra-passe!",
"Login_Psw_folder": "na pasta de configuração.", "Login_Psw_folder": "na pasta de configuração.",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "está actualmente desativado", "Maintenance_arp_status_off": "está actualmente desativado",
"Maintenance_arp_status_on": "scan(s) atualmente em execução", "Maintenance_arp_status_on": "scan(s) atualmente em execução",
"Maintenance_built_on": "Construído em", "Maintenance_built_on": "Construído em",
"Maintenance_current_version": "Estás actualizado. Confira o que <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\"> Estou trabalhando em</a>.", "Maintenance_current_version": "Estás actualizado. Confira o que <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\"> Estou trabalhando em</a>.",
"Maintenance_database_backup": "Backups DB", "Maintenance_database_backup": "Backups DB",
"Maintenance_database_backup_found": "foram encontrados backups", "Maintenance_database_backup_found": "foram encontrados backups",
"Maintenance_database_backup_total": "uso total do disco", "Maintenance_database_backup_total": "uso total do disco",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "Selecionar a língua", "Maintenance_lang_selector_empty": "Selecionar a língua",
"Maintenance_lang_selector_lable": "Selecionar a língua", "Maintenance_lang_selector_lable": "Selecionar a língua",
"Maintenance_lang_selector_text": "A mudança ocorre no lado do cliente, por isso afeta apenas o navegador atual.", "Maintenance_lang_selector_text": "A mudança ocorre no lado do cliente, por isso afeta apenas o navegador atual.",
"Maintenance_new_version": "Uma nova versão está disponível. Confira as <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">notas de lançamento</a>.", "Maintenance_new_version": "Uma nova versão está disponível. Confira as <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">notas de lançamento</a>.",
"Maintenance_themeselector_apply": "Aplicar", "Maintenance_themeselector_apply": "Aplicar",
"Maintenance_themeselector_empty": "Escolha uma Skin", "Maintenance_themeselector_empty": "Escolha uma Skin",
"Maintenance_themeselector_lable": "Selecionar Skin", "Maintenance_themeselector_lable": "Selecionar Skin",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "", "PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "", "PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "", "PLUGINS_KEEP_HIST_name": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "", "Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "", "Plugins_Filters_Mac": "",
"Plugins_History": "", "Plugins_History": "",

View File

@@ -109,7 +109,7 @@
"DevDetail_Network_Node_hover": "Selecione o dispositivo de rede principal ao qual o dispositivo atual está conectado, para preencher a árvore Rede.", "DevDetail_Network_Node_hover": "Selecione o dispositivo de rede principal ao qual o dispositivo atual está conectado, para preencher a árvore Rede.",
"DevDetail_Network_Port_hover": "A porta a que este dispositivo está ligado no dispositivo de rede principal. Se for deixado vazio, é apresentado um ícone wifi na árvore Rede.", "DevDetail_Network_Port_hover": "A porta a que este dispositivo está ligado no dispositivo de rede principal. Se for deixado vazio, é apresentado um ícone wifi na árvore Rede.",
"DevDetail_Nmap_Scans": "Varreduras manuais do Nmap", "DevDetail_Nmap_Scans": "Varreduras manuais do Nmap",
"DevDetail_Nmap_Scans_desc": "Aqui pode executar análises NMAP manuais. Também pode agendar análises NMAP automáticas regulares através do plugin Serviços & Portos (NMAP). Aceda à https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_scan para saber mais", "DevDetail_Nmap_Scans_desc": "Aqui pode executar análises NMAP manuais. Também pode agendar análises NMAP automáticas regulares através do plugin Serviços & Portos (NMAP). Aceda à https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan para saber mais",
"DevDetail_Nmap_buttonDefault": "Verificação predefinida", "DevDetail_Nmap_buttonDefault": "Verificação predefinida",
"DevDetail_Nmap_buttonDefault_text": "Scan padrão: Nmap verifica as 1.000 portas superiores para cada protocolo de digitalização solicitado. Isto atinge cerca de 93% das portas TCP e 49% das portas UDP. (cerca de 5 segundos)", "DevDetail_Nmap_buttonDefault_text": "Scan padrão: Nmap verifica as 1.000 portas superiores para cada protocolo de digitalização solicitado. Isto atinge cerca de 93% das portas TCP e 49% das portas UDP. (cerca de 5 segundos)",
"DevDetail_Nmap_buttonDetail": "Verificação Detalhada", "DevDetail_Nmap_buttonDetail": "Verificação Detalhada",
@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "Ações em massa:", "Device_MultiEdit_MassActions": "Ações em massa:",
"Device_MultiEdit_No_Devices": "Nenhum dispositivo selecionado.", "Device_MultiEdit_No_Devices": "Nenhum dispositivo selecionado.",
"Device_MultiEdit_Tooltip": "Cuidadoso. Clicar aqui aplicará o valor à esquerda a todos os dispositivos selecionados acima.", "Device_MultiEdit_Tooltip": "Cuidadoso. Clicar aqui aplicará o valor à esquerda a todos os dispositivos selecionados acima.",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "", "Device_Save_Failed": "",
"Device_Save_Unauthorized": "", "Device_Save_Unauthorized": "",
"Device_Saved_Success": "", "Device_Saved_Success": "",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "Procurar", "Device_Searchbox": "Procurar",
"Device_Shortcut_AllDevices": "Os meus dispositivos", "Device_Shortcut_AllDevices": "Os meus dispositivos",
"Device_Shortcut_AllNodes": "Todos os Nodes", "Device_Shortcut_AllNodes": "Todos os Nodes",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "Favoritos", "Device_Shortcut_Favorites": "Favoritos",
"Device_Shortcut_NewDevices": "Novo dispostivo", "Device_Shortcut_NewDevices": "Novo dispostivo",
"Device_Shortcut_OnlineChart": "Presença do dispositivo", "Device_Shortcut_OnlineChart": "Presença do dispositivo",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "Alerta em baixo", "Device_TableHead_AlertDown": "Alerta em baixo",
"Device_TableHead_Connected_Devices": "Conexões", "Device_TableHead_Connected_Devices": "Conexões",
"Device_TableHead_CustomProps": "Propriedades / Ações", "Device_TableHead_CustomProps": "Propriedades / Ações",
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Favorito", "Device_TableHead_Favorite": "Favorito",
"Device_TableHead_FirstSession": "Primeira sessão", "Device_TableHead_FirstSession": "Primeira sessão",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grupo", "Device_TableHead_Group": "Grupo",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "Adicionar dispositivo", "Gen_AddDevice": "Adicionar dispositivo",
"Gen_Add_All": "Adicionar todos", "Gen_Add_All": "Adicionar todos",
"Gen_All_Devices": "Todos os dispostivos", "Gen_All_Devices": "Todos os dispostivos",
"Gen_Archived": "",
"Gen_AreYouSure": "Tem certeza?", "Gen_AreYouSure": "Tem certeza?",
"Gen_Backup": "Executar backup", "Gen_Backup": "Executar backup",
"Gen_Cancel": "Cancelar", "Gen_Cancel": "Cancelar",
@@ -333,16 +324,13 @@
"Gen_Delete": "Apagar", "Gen_Delete": "Apagar",
"Gen_DeleteAll": "Apagar todos", "Gen_DeleteAll": "Apagar todos",
"Gen_Description": "Descrição", "Gen_Description": "Descrição",
"Gen_Down": "",
"Gen_Error": "Erro", "Gen_Error": "Erro",
"Gen_Filter": "Filtro", "Gen_Filter": "Filtro",
"Gen_Flapping": "",
"Gen_Generate": "Gerar", "Gen_Generate": "Gerar",
"Gen_InvalidMac": "Endereço MAC Inválido.", "Gen_InvalidMac": "Endereço MAC Inválido.",
"Gen_Invalid_Value": "", "Gen_Invalid_Value": "",
"Gen_LockedDB": "ERRO - A base de dados pode estar bloqueada - Verifique F12 Ferramentas de desenvolvimento -> Console ou tente mais tarde.", "Gen_LockedDB": "ERRO - A base de dados pode estar bloqueada - Verifique F12 Ferramentas de desenvolvimento -> Console ou tente mais tarde.",
"Gen_NetworkMask": "Máscara de Rede", "Gen_NetworkMask": "Máscara de Rede",
"Gen_New": "",
"Gen_Offline": "Offline", "Gen_Offline": "Offline",
"Gen_Okay": "Ok", "Gen_Okay": "Ok",
"Gen_Online": "Online", "Gen_Online": "Online",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Selecionar para pré-visualizar", "Gen_SelectToPreview": "Selecionar para pré-visualizar",
"Gen_Selected_Devices": "Seleciona dispostivos:", "Gen_Selected_Devices": "Seleciona dispostivos:",
"Gen_Sleeping": "",
"Gen_Subnet": "Sub-rede", "Gen_Subnet": "Sub-rede",
"Gen_Switch": "Trocar", "Gen_Switch": "Trocar",
"Gen_Upd": "Atualizado com sucesso", "Gen_Upd": "Atualizado com sucesso",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "Atualizar valor", "Gen_Update_Value": "Atualizar valor",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Aviso", "Gen_Warning": "Aviso",
"Gen_Work_In_Progress": "Trabalho em andamento, um bom momento para enviar feedback em https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Trabalho em andamento, um bom momento para enviar feedback em https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Novo dispositivo", "Gen_create_new_device": "Novo dispositivo",
"Gen_create_new_device_info": "Os dispositivos são normalmente descobertos usando <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>. No entanto, em certos casos, pode ser necessário adicionar dispositivos manualmente. Para explorar cenários específicos, verifique a <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">documentação de Redes Remotas</a>.", "Gen_create_new_device_info": "Os dispositivos são normalmente descobertos usando <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>. No entanto, em certos casos, pode ser necessário adicionar dispositivos manualmente. Para explorar cenários específicos, verifique a <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">documentação de Redes Remotas</a>.",
"General_display_name": "Geral", "General_display_name": "Geral",
@@ -385,7 +372,7 @@
"Loading": "A carregar…", "Loading": "A carregar…",
"Login_Box": "Introduza a sua palavra-passe", "Login_Box": "Introduza a sua palavra-passe",
"Login_Default_PWD": "A palavra-passe predefinida “123456” ainda está ativa.", "Login_Default_PWD": "A palavra-passe predefinida “123456” ainda está ativa.",
"Login_Info": "As palavra-passes são definidas por meio do plugin Definir palavra-passe. Verifique a <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/set_password\">documentação do SETPWD</a> se tiver problemas para fazer login.", "Login_Info": "As palavra-passes são definidas por meio do plugin Definir palavra-passe. Verifique a <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">documentação do SETPWD</a> se tiver problemas para fazer login.",
"Login_Psw-box": "Palavra-passe", "Login_Psw-box": "Palavra-passe",
"Login_Psw_alert": "Alerta de palavra-passe!", "Login_Psw_alert": "Alerta de palavra-passe!",
"Login_Psw_folder": "na pasta de configuração.", "Login_Psw_folder": "na pasta de configuração.",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "está atualmente desativado", "Maintenance_arp_status_off": "está atualmente desativado",
"Maintenance_arp_status_on": "Scan em curso", "Maintenance_arp_status_on": "Scan em curso",
"Maintenance_built_on": "Construído em", "Maintenance_built_on": "Construído em",
"Maintenance_current_version": "Você está atualizado. Confira o que <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\"> estou a trabalhar em</a>.", "Maintenance_current_version": "Você está atualizado. Confira o que <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\"> estou a trabalhar em</a>.",
"Maintenance_database_backup": "Backups DB", "Maintenance_database_backup": "Backups DB",
"Maintenance_database_backup_found": "foram encontrados backups", "Maintenance_database_backup_found": "foram encontrados backups",
"Maintenance_database_backup_total": "uso total do disco", "Maintenance_database_backup_total": "uso total do disco",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "Escolha a lingua", "Maintenance_lang_selector_empty": "Escolha a lingua",
"Maintenance_lang_selector_lable": "Escolha a lingua", "Maintenance_lang_selector_lable": "Escolha a lingua",
"Maintenance_lang_selector_text": "A mudança ocorre no lado do cliente, por isso afeta apenas o navegador atual.", "Maintenance_lang_selector_text": "A mudança ocorre no lado do cliente, por isso afeta apenas o navegador atual.",
"Maintenance_new_version": "Uma nova versão está disponível. Confira as <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">notas de lançamento</a>.", "Maintenance_new_version": "Uma nova versão está disponível. Confira as <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">notas de lançamento</a>.",
"Maintenance_themeselector_apply": "Aplicar", "Maintenance_themeselector_apply": "Aplicar",
"Maintenance_themeselector_empty": "Escolha uma Skin", "Maintenance_themeselector_empty": "Escolha uma Skin",
"Maintenance_themeselector_lable": "Selecionar Skin", "Maintenance_themeselector_lable": "Selecionar Skin",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "", "PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "", "PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "", "PLUGINS_KEEP_HIST_name": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "", "Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "", "Plugins_Filters_Mac": "",
"Plugins_History": "", "Plugins_History": "",

View File

@@ -109,7 +109,7 @@
"DevDetail_Network_Node_hover": "Выберите родительское сетевое устройство, к которому подключено текущее устройство, чтобы заполнить дерево сети.", "DevDetail_Network_Node_hover": "Выберите родительское сетевое устройство, к которому подключено текущее устройство, чтобы заполнить дерево сети.",
"DevDetail_Network_Port_hover": "Порт, к которому подключено это устройство на родительском сетевом устройстве. Если оставить пустым, в дереве сети отобразится значок Wi-Fi.", "DevDetail_Network_Port_hover": "Порт, к которому подключено это устройство на родительском сетевом устройстве. Если оставить пустым, в дереве сети отобразится значок Wi-Fi.",
"DevDetail_Nmap_Scans": "Ручные сканеры Nmap", "DevDetail_Nmap_Scans": "Ручные сканеры Nmap",
"DevDetail_Nmap_Scans_desc": "Здесь вы можете выполнить сканирование NMAP вручную. Вы также можете запланировать регулярное автоматическое сканирование NMAP с помощью плагина «Службы и порты» (NMAP). Чтобы узнать больше, перейдите в <a href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Документацию</a>", "DevDetail_Nmap_Scans_desc": "Здесь вы можете выполнить сканирование NMAP вручную. Вы также можете запланировать регулярное автоматическое сканирование NMAP с помощью плагина «Службы и порты» (NMAP). Чтобы узнать больше, перейдите в <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Документацию</a>",
"DevDetail_Nmap_buttonDefault": "Сканирование по умолчанию", "DevDetail_Nmap_buttonDefault": "Сканирование по умолчанию",
"DevDetail_Nmap_buttonDefault_text": "Сканирование по умолчанию: Nmap сканирует 1000 верхних портов для каждого запрошенного протокола сканирования. Это перехватывает примерно 93% портов TCP и 49% портов UDP. (около 5 секунд)", "DevDetail_Nmap_buttonDefault_text": "Сканирование по умолчанию: Nmap сканирует 1000 верхних портов для каждого запрошенного протокола сканирования. Это перехватывает примерно 93% портов TCP и 49% портов UDP. (около 5 секунд)",
"DevDetail_Nmap_buttonDetail": "Детальное сканирование", "DevDetail_Nmap_buttonDetail": "Детальное сканирование",
@@ -139,7 +139,7 @@
"DevDetail_SessionTable_Duration": "Продолжительность", "DevDetail_SessionTable_Duration": "Продолжительность",
"DevDetail_SessionTable_IP": "IP", "DevDetail_SessionTable_IP": "IP",
"DevDetail_SessionTable_Order": "Порядок", "DevDetail_SessionTable_Order": "Порядок",
"DevDetail_Shortcut_CurrentStatus": "Статус", "DevDetail_Shortcut_CurrentStatus": "Текущий статус",
"DevDetail_Shortcut_DownAlerts": "Оповещения о сбое", "DevDetail_Shortcut_DownAlerts": "Оповещения о сбое",
"DevDetail_Shortcut_Presence": "Присутствие", "DevDetail_Shortcut_Presence": "Присутствие",
"DevDetail_Shortcut_Sessions": "Сеансы", "DevDetail_Shortcut_Sessions": "Сеансы",
@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "Массовые действия:", "Device_MultiEdit_MassActions": "Массовые действия:",
"Device_MultiEdit_No_Devices": "Устройства не выбраны.", "Device_MultiEdit_No_Devices": "Устройства не выбраны.",
"Device_MultiEdit_Tooltip": "Осторожно. При нажатии на эту кнопку значение слева будет применено ко всем устройствам, выбранным выше.", "Device_MultiEdit_Tooltip": "Осторожно. При нажатии на эту кнопку значение слева будет применено ко всем устройствам, выбранным выше.",
"Device_NextScan_Imminent": "Предстоящий...",
"Device_NextScan_In": "Следующее сканирование примерно через· ",
"Device_NoData_Help": "Если устройства не отображаются после сканирования, проверьте настройку SCAN_SUBNETS и <a href=\"https://docs.netalertx.com/SUBNETS\" target=\"_blank\">документацию</a>.",
"Device_NoData_Scanning": "Ожидание первого сканирования — это может занять несколько минут после первоначальной настройки.",
"Device_NoData_Title": "Устройства пока не найдены",
"Device_Save_Failed": "Не удалось сохранить устройство", "Device_Save_Failed": "Не удалось сохранить устройство",
"Device_Save_Unauthorized": "Не авторизован - недействительный токен API", "Device_Save_Unauthorized": "Не авторизован - недействительный токен API",
"Device_Saved_Success": "Устройство успешно сохранено", "Device_Saved_Success": "Устройство успешно сохранено",
"Device_Saved_Unexpected": "Обновление устройства дало неожиданный ответ", "Device_Saved_Unexpected": "Обновление устройства дало неожиданный ответ",
"Device_Scanning": "Сканирование...",
"Device_Searchbox": "Поиск", "Device_Searchbox": "Поиск",
"Device_Shortcut_AllDevices": "Мои устройства", "Device_Shortcut_AllDevices": "Мои устройства",
"Device_Shortcut_AllNodes": "Все узлы", "Device_Shortcut_AllNodes": "Все узлы",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "Избранные", "Device_Shortcut_Favorites": "Избранные",
"Device_Shortcut_NewDevices": "Новые устройства", "Device_Shortcut_NewDevices": "Новые устройства",
"Device_Shortcut_OnlineChart": "Присутствие устройств", "Device_Shortcut_OnlineChart": "Присутствие устройств",
"Device_Shortcut_Unstable": "Нестабильный",
"Device_TableHead_AlertDown": "Оповещение о сост. ВЫКЛ", "Device_TableHead_AlertDown": "Оповещение о сост. ВЫКЛ",
"Device_TableHead_Connected_Devices": "Соединения", "Device_TableHead_Connected_Devices": "Соединения",
"Device_TableHead_CustomProps": "Свойства / Действия", "Device_TableHead_CustomProps": "Свойства / Действия",
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Избранное", "Device_TableHead_Favorite": "Избранное",
"Device_TableHead_FirstSession": "Первый сеанс", "Device_TableHead_FirstSession": "Первый сеанс",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Группа", "Device_TableHead_Group": "Группа",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "Добавить устройство", "Gen_AddDevice": "Добавить устройство",
"Gen_Add_All": "Добавить все", "Gen_Add_All": "Добавить все",
"Gen_All_Devices": "Все устройства", "Gen_All_Devices": "Все устройства",
"Gen_Archived": "Архивировано",
"Gen_AreYouSure": "Вы уверены?", "Gen_AreYouSure": "Вы уверены?",
"Gen_Backup": "Запустить резервное копирование", "Gen_Backup": "Запустить резервное копирование",
"Gen_Cancel": "Отмена", "Gen_Cancel": "Отмена",
@@ -333,16 +324,13 @@
"Gen_Delete": "Удалить", "Gen_Delete": "Удалить",
"Gen_DeleteAll": "Удалить все", "Gen_DeleteAll": "Удалить все",
"Gen_Description": "Описание", "Gen_Description": "Описание",
"Gen_Down": "Лежит",
"Gen_Error": "Ошибка", "Gen_Error": "Ошибка",
"Gen_Filter": "Фильтр", "Gen_Filter": "Фильтр",
"Gen_Flapping": "",
"Gen_Generate": "Генерировать", "Gen_Generate": "Генерировать",
"Gen_InvalidMac": "Неверный Mac-адрес.", "Gen_InvalidMac": "Неверный Mac-адрес.",
"Gen_Invalid_Value": "Введено некорректное значение", "Gen_Invalid_Value": "Введено некорректное значение",
"Gen_LockedDB": "ОШИБКА - Возможно, база данных заблокирована. Проверьте инструменты разработчика F12 -> Консоль или повторите попытку позже.", "Gen_LockedDB": "ОШИБКА - Возможно, база данных заблокирована. Проверьте инструменты разработчика F12 -> Консоль или повторите попытку позже.",
"Gen_NetworkMask": "Маска сети", "Gen_NetworkMask": "Маска сети",
"Gen_New": "Новый",
"Gen_Offline": "Оффлайн", "Gen_Offline": "Оффлайн",
"Gen_Okay": "OK", "Gen_Okay": "OK",
"Gen_Online": "Онлайн", "Gen_Online": "Онлайн",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Выберите для предварительного просмотра", "Gen_SelectToPreview": "Выберите для предварительного просмотра",
"Gen_Selected_Devices": "Выбранные устройства:", "Gen_Selected_Devices": "Выбранные устройства:",
"Gen_Sleeping": "Спящий",
"Gen_Subnet": "Подсеть", "Gen_Subnet": "Подсеть",
"Gen_Switch": "Переключить", "Gen_Switch": "Переключить",
"Gen_Upd": "Успешное обновление", "Gen_Upd": "Успешное обновление",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "Обновить значение", "Gen_Update_Value": "Обновить значение",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Предупреждение", "Gen_Warning": "Предупреждение",
"Gen_Work_In_Progress": "Работа продолжается, самое время оставить отзыв на https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Работа продолжается, самое время оставить отзыв на https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Новое устройство", "Gen_create_new_device": "Новое устройство",
"Gen_create_new_device_info": "Устройства обычно обнаруживаются с помощью <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">плагинов</a>. Однако в некоторых случаях вам может потребоваться добавить устройства вручную. Для изучения конкретных сценариев ознакомьтесь с документацией <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">Remote Networks</a>.", "Gen_create_new_device_info": "Устройства обычно обнаруживаются с помощью <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">плагинов</a>. Однако в некоторых случаях вам может потребоваться добавить устройства вручную. Для изучения конкретных сценариев ознакомьтесь с документацией <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">Remote Networks</a>.",
"General_display_name": "Главное", "General_display_name": "Главное",
@@ -385,7 +372,7 @@
"Loading": "Загрузка…", "Loading": "Загрузка…",
"Login_Box": "Введите пароль", "Login_Box": "Введите пароль",
"Login_Default_PWD": "Пароль по умолчанию «123456» все еще активен.", "Login_Default_PWD": "Пароль по умолчанию «123456» все еще активен.",
"Login_Info": "Пароли устанавливаются через плагин Set Password. Если у вас возникли проблемы со входом в систему, проверьте <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/set_password\">SEPWD документацию</a>.", "Login_Info": "Пароли устанавливаются через плагин Set Password. Если у вас возникли проблемы со входом в систему, проверьте <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">SEPWD документацию</a>.",
"Login_Psw-box": "Пароль", "Login_Psw-box": "Пароль",
"Login_Psw_alert": "Предупреждение о пароле!", "Login_Psw_alert": "Предупреждение о пароле!",
"Login_Psw_folder": "в папке конфигурации.", "Login_Psw_folder": "в папке конфигурации.",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "в настоящее время отключен", "Maintenance_arp_status_off": "в настоящее время отключен",
"Maintenance_arp_status_on": "выполняется сканирование", "Maintenance_arp_status_on": "выполняется сканирование",
"Maintenance_built_on": "Сборка от", "Maintenance_built_on": "Сборка от",
"Maintenance_current_version": "Вы в курсе событий. Узнайте, над чем <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">я работаю</a>.", "Maintenance_current_version": "Вы в курсе событий. Узнайте, над чем <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">я работаю</a>.",
"Maintenance_database_backup": "Резервные копии БД", "Maintenance_database_backup": "Резервные копии БД",
"Maintenance_database_backup_found": "резервные копии были найдены", "Maintenance_database_backup_found": "резервные копии были найдены",
"Maintenance_database_backup_total": "общее использование диска", "Maintenance_database_backup_total": "общее использование диска",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "Выберите язык", "Maintenance_lang_selector_empty": "Выберите язык",
"Maintenance_lang_selector_lable": "Выбрать язык", "Maintenance_lang_selector_lable": "Выбрать язык",
"Maintenance_lang_selector_text": "Изменение происходит на стороне клиента, поэтому оно влияет только на текущий браузер.", "Maintenance_lang_selector_text": "Изменение происходит на стороне клиента, поэтому оно влияет только на текущий браузер.",
"Maintenance_new_version": "Доступна новая версия. Ознакомьтесь с <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">примечаниями к выпуску</a>.", "Maintenance_new_version": "Доступна новая версия. Ознакомьтесь с <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">примечаниями к выпуску</a>.",
"Maintenance_themeselector_apply": "Применить", "Maintenance_themeselector_apply": "Применить",
"Maintenance_themeselector_empty": "Выбрать скин", "Maintenance_themeselector_empty": "Выбрать скин",
"Maintenance_themeselector_lable": "Выбрать Скин", "Maintenance_themeselector_lable": "Выбрать Скин",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "Включить вход", "PIALERT_WEB_PROTECTION_name": "Включить вход",
"PLUGINS_KEEP_HIST_description": "Сколько записей результатов сканирования истории плагинов следует хранить (для каждого плагина, а не для конкретного устройства).", "PLUGINS_KEEP_HIST_description": "Сколько записей результатов сканирования истории плагинов следует хранить (для каждого плагина, а не для конкретного устройства).",
"PLUGINS_KEEP_HIST_name": "История плагинов", "PLUGINS_KEEP_HIST_name": "История плагинов",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "Максимальный размер SQLite WAL (журнал упреждающей записи) в МБ перед запуском автоматических контрольных точек. Более низкие значения (1020 МБ) уменьшают использование диска/хранилища, но увеличивают загрузку ЦП во время сканирования. Более высокие значения (50100 МБ) уменьшают нагрузку на процессор во время операций, но могут использовать больше оперативной памяти и дискового пространства. Значение по умолчанию <code>50 МБ</code> компенсирует и то, и другое. Полезно для систем с ограниченными ресурсами, таких как устройства NAS с SD-картами. Перезапустите сервер, чтобы изменения вступили в силу после сохранения настроек.",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "Ограничение размера WAL (МБ)",
"Plugins_DeleteAll": "Удалить все (фильтры игнорируются)", "Plugins_DeleteAll": "Удалить все (фильтры игнорируются)",
"Plugins_Filters_Mac": "Фильтр MAC-адреса", "Plugins_Filters_Mac": "Фильтр MAC-адреса",
"Plugins_History": "История событий", "Plugins_History": "История событий",

View File

@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "", "Device_MultiEdit_MassActions": "",
"Device_MultiEdit_No_Devices": "", "Device_MultiEdit_No_Devices": "",
"Device_MultiEdit_Tooltip": "", "Device_MultiEdit_Tooltip": "",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "", "Device_Save_Failed": "",
"Device_Save_Unauthorized": "", "Device_Save_Unauthorized": "",
"Device_Saved_Success": "", "Device_Saved_Success": "",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "", "Device_Searchbox": "",
"Device_Shortcut_AllDevices": "", "Device_Shortcut_AllDevices": "",
"Device_Shortcut_AllNodes": "", "Device_Shortcut_AllNodes": "",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "", "Device_Shortcut_Favorites": "",
"Device_Shortcut_NewDevices": "", "Device_Shortcut_NewDevices": "",
"Device_Shortcut_OnlineChart": "", "Device_Shortcut_OnlineChart": "",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "", "Device_TableHead_AlertDown": "",
"Device_TableHead_Connected_Devices": "", "Device_TableHead_Connected_Devices": "",
"Device_TableHead_CustomProps": "", "Device_TableHead_CustomProps": "",
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "", "Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "", "Device_TableHead_FirstSession": "",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "", "Device_TableHead_GUID": "",
"Device_TableHead_Group": "", "Device_TableHead_Group": "",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "", "Gen_AddDevice": "",
"Gen_Add_All": "", "Gen_Add_All": "",
"Gen_All_Devices": "", "Gen_All_Devices": "",
"Gen_Archived": "",
"Gen_AreYouSure": "", "Gen_AreYouSure": "",
"Gen_Backup": "", "Gen_Backup": "",
"Gen_Cancel": "", "Gen_Cancel": "",
@@ -333,16 +324,13 @@
"Gen_Delete": "", "Gen_Delete": "",
"Gen_DeleteAll": "", "Gen_DeleteAll": "",
"Gen_Description": "", "Gen_Description": "",
"Gen_Down": "",
"Gen_Error": "", "Gen_Error": "",
"Gen_Filter": "", "Gen_Filter": "",
"Gen_Flapping": "",
"Gen_Generate": "", "Gen_Generate": "",
"Gen_InvalidMac": "", "Gen_InvalidMac": "",
"Gen_Invalid_Value": "", "Gen_Invalid_Value": "",
"Gen_LockedDB": "", "Gen_LockedDB": "",
"Gen_NetworkMask": "", "Gen_NetworkMask": "",
"Gen_New": "",
"Gen_Offline": "", "Gen_Offline": "",
"Gen_Okay": "", "Gen_Okay": "",
"Gen_Online": "", "Gen_Online": "",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "", "Gen_SelectIcon": "",
"Gen_SelectToPreview": "", "Gen_SelectToPreview": "",
"Gen_Selected_Devices": "", "Gen_Selected_Devices": "",
"Gen_Sleeping": "",
"Gen_Subnet": "", "Gen_Subnet": "",
"Gen_Switch": "", "Gen_Switch": "",
"Gen_Upd": "", "Gen_Upd": "",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "", "PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "", "PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "", "PLUGINS_KEEP_HIST_name": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "", "Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "", "Plugins_Filters_Mac": "",
"Plugins_History": "", "Plugins_History": "",

View File

@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "Toplu komutlar:", "Device_MultiEdit_MassActions": "Toplu komutlar:",
"Device_MultiEdit_No_Devices": "", "Device_MultiEdit_No_Devices": "",
"Device_MultiEdit_Tooltip": "Dikkat. Buna tıklamak, soldaki değeri yukarıda seçilen tüm cihazlara uygulayacaktır.", "Device_MultiEdit_Tooltip": "Dikkat. Buna tıklamak, soldaki değeri yukarıda seçilen tüm cihazlara uygulayacaktır.",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "", "Device_Save_Failed": "",
"Device_Save_Unauthorized": "", "Device_Save_Unauthorized": "",
"Device_Saved_Success": "", "Device_Saved_Success": "",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "Arama", "Device_Searchbox": "Arama",
"Device_Shortcut_AllDevices": "Cihazlarım", "Device_Shortcut_AllDevices": "Cihazlarım",
"Device_Shortcut_AllNodes": "", "Device_Shortcut_AllNodes": "",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "Favoriler", "Device_Shortcut_Favorites": "Favoriler",
"Device_Shortcut_NewDevices": "Yeni Cİhazlar", "Device_Shortcut_NewDevices": "Yeni Cİhazlar",
"Device_Shortcut_OnlineChart": "Cihaz Durumu", "Device_Shortcut_OnlineChart": "Cihaz Durumu",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "Çalışmama Alarmı", "Device_TableHead_AlertDown": "Çalışmama Alarmı",
"Device_TableHead_Connected_Devices": "Bağlantılar", "Device_TableHead_Connected_Devices": "Bağlantılar",
"Device_TableHead_CustomProps": "Özellikler / Eylemler", "Device_TableHead_CustomProps": "Özellikler / Eylemler",
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "Favori", "Device_TableHead_Favorite": "Favori",
"Device_TableHead_FirstSession": "İlk Oturum", "Device_TableHead_FirstSession": "İlk Oturum",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grup", "Device_TableHead_Group": "Grup",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "Cihaz Ekle", "Gen_AddDevice": "Cihaz Ekle",
"Gen_Add_All": "Tümünü ekle", "Gen_Add_All": "Tümünü ekle",
"Gen_All_Devices": "Tüm Cihazlar", "Gen_All_Devices": "Tüm Cihazlar",
"Gen_Archived": "",
"Gen_AreYouSure": "Emin misiniz?", "Gen_AreYouSure": "Emin misiniz?",
"Gen_Backup": "Yedeklemeyi Çalıştır", "Gen_Backup": "Yedeklemeyi Çalıştır",
"Gen_Cancel": "İptal", "Gen_Cancel": "İptal",
@@ -333,16 +324,13 @@
"Gen_Delete": "Sil", "Gen_Delete": "Sil",
"Gen_DeleteAll": "Tümünü sil", "Gen_DeleteAll": "Tümünü sil",
"Gen_Description": "Açıklama", "Gen_Description": "Açıklama",
"Gen_Down": "",
"Gen_Error": "Hata", "Gen_Error": "Hata",
"Gen_Filter": "Filtre", "Gen_Filter": "Filtre",
"Gen_Flapping": "",
"Gen_Generate": "Oluştur", "Gen_Generate": "Oluştur",
"Gen_InvalidMac": "", "Gen_InvalidMac": "",
"Gen_Invalid_Value": "", "Gen_Invalid_Value": "",
"Gen_LockedDB": "HATA - Veritabanı kilitlenmiş olabilir - F12 Geliştirici araçlarını -> Konsol kısmını kontrol edin veya daha sonra tekrar deneyin.", "Gen_LockedDB": "HATA - Veritabanı kilitlenmiş olabilir - F12 Geliştirici araçlarını -> Konsol kısmını kontrol edin veya daha sonra tekrar deneyin.",
"Gen_NetworkMask": "", "Gen_NetworkMask": "",
"Gen_New": "",
"Gen_Offline": "Çevrimdışı", "Gen_Offline": "Çevrimdışı",
"Gen_Okay": "Tamam", "Gen_Okay": "Tamam",
"Gen_Online": "Çevrimiçi", "Gen_Online": "Çevrimiçi",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Önizleme yapmak için seçin", "Gen_SelectToPreview": "Önizleme yapmak için seçin",
"Gen_Selected_Devices": "Seçilmiş Cihazlar:", "Gen_Selected_Devices": "Seçilmiş Cihazlar:",
"Gen_Sleeping": "",
"Gen_Subnet": "", "Gen_Subnet": "",
"Gen_Switch": "Switch", "Gen_Switch": "Switch",
"Gen_Upd": "Başarılı bir şekilde güncellendi", "Gen_Upd": "Başarılı bir şekilde güncellendi",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "Değeri Güncelle", "Gen_Update_Value": "Değeri Güncelle",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Uyarı", "Gen_Warning": "Uyarı",
"Gen_Work_In_Progress": "Çalışma devam ediyor, geri bildirimde bulunmak için iyi bir zaman: https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Çalışma devam ediyor, geri bildirimde bulunmak için iyi bir zaman: https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Yeni cihaz", "Gen_create_new_device": "Yeni cihaz",
"Gen_create_new_device_info": "Cihazlar genellikle <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">eklentiler</a> kullanılarak keşfedilir. Ancak, bazı durumlarda cihazları manuel olarak eklemeniz gerekebilir. Belirli senaryoları incelemek için <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">Uzak Ağlar belgelerini</a> kontrol edin.", "Gen_create_new_device_info": "Cihazlar genellikle <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">eklentiler</a> kullanılarak keşfedilir. Ancak, bazı durumlarda cihazları manuel olarak eklemeniz gerekebilir. Belirli senaryoları incelemek için <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">Uzak Ağlar belgelerini</a> kontrol edin.",
"General_display_name": "Genel", "General_display_name": "Genel",
@@ -385,7 +372,7 @@
"Loading": "Yükleniyor...", "Loading": "Yükleniyor...",
"Login_Box": "Şifrenizi giriniz", "Login_Box": "Şifrenizi giriniz",
"Login_Default_PWD": "Varsayılan şifre \"123456\" hâlâ aktif.", "Login_Default_PWD": "Varsayılan şifre \"123456\" hâlâ aktif.",
"Login_Info": "Parolalar, Set Password eklentisi aracılığıyla ayarlanır. Giriş yapmakta sorun yaşıyorsanız, <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/set_password\">SETPWD belgelerini</a> kontrol edin.", "Login_Info": "Parolalar, Set Password eklentisi aracılığıyla ayarlanır. Giriş yapmakta sorun yaşıyorsanız, <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">SETPWD belgelerini</a> kontrol edin.",
"Login_Psw-box": "Şİfre", "Login_Psw-box": "Şİfre",
"Login_Psw_alert": "Parola Uyarısı!", "Login_Psw_alert": "Parola Uyarısı!",
"Login_Psw_folder": "Konfigürasyon klasöründe.", "Login_Psw_folder": "Konfigürasyon klasöründe.",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "", "PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "", "PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "", "PLUGINS_KEEP_HIST_name": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "", "Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "", "Plugins_Filters_Mac": "",
"Plugins_History": "", "Plugins_History": "",

View File

@@ -109,7 +109,7 @@
"DevDetail_Network_Node_hover": "Виберіть батьківський мережевий пристрій, до якого підключено поточний пристрій, щоб заповнити дерево мережі.", "DevDetail_Network_Node_hover": "Виберіть батьківський мережевий пристрій, до якого підключено поточний пристрій, щоб заповнити дерево мережі.",
"DevDetail_Network_Port_hover": "Порт, до якого підключено цей пристрій на батьківському мережевому пристрої. Якщо залишити пустим, у дереві мережі відобразиться значок Wi-Fi.", "DevDetail_Network_Port_hover": "Порт, до якого підключено цей пристрій на батьківському мережевому пристрої. Якщо залишити пустим, у дереві мережі відобразиться значок Wi-Fi.",
"DevDetail_Nmap_Scans": "Сканування Nmap вручну", "DevDetail_Nmap_Scans": "Сканування Nmap вручну",
"DevDetail_Nmap_Scans_desc": "Тут ви можете виконувати ручні сканування NMAP. Ви також можете запланувати регулярні автоматичні сканування NMAP за допомогою плагіна Services & Ports (NMAP). Щоб дізнатися більше, перейдіть до <a href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Документації</a>", "DevDetail_Nmap_Scans_desc": "Тут ви можете виконувати ручні сканування NMAP. Ви також можете запланувати регулярні автоматичні сканування NMAP за допомогою плагіна Services & Ports (NMAP). Щоб дізнатися більше, перейдіть до <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Документації</a>",
"DevDetail_Nmap_buttonDefault": "Сканування за замовчуванням", "DevDetail_Nmap_buttonDefault": "Сканування за замовчуванням",
"DevDetail_Nmap_buttonDefault_text": "Сканування за замовчуванням: Nmap сканує 1000 найпопулярніших портів для кожного запитуваного протоколу сканування. Це перехоплює приблизно 93% портів TCP і 49% портів UDP. (приблизно 5 секунд)", "DevDetail_Nmap_buttonDefault_text": "Сканування за замовчуванням: Nmap сканує 1000 найпопулярніших портів для кожного запитуваного протоколу сканування. Це перехоплює приблизно 93% портів TCP і 49% портів UDP. (приблизно 5 секунд)",
"DevDetail_Nmap_buttonDetail": "Детальне сканування", "DevDetail_Nmap_buttonDetail": "Детальне сканування",
@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "Масові акції:", "Device_MultiEdit_MassActions": "Масові акції:",
"Device_MultiEdit_No_Devices": "Не вибрано жодного пристрою.", "Device_MultiEdit_No_Devices": "Не вибрано жодного пристрою.",
"Device_MultiEdit_Tooltip": "Обережно. Якщо натиснути це, значення зліва буде застосовано до всіх пристроїв, вибраних вище.", "Device_MultiEdit_Tooltip": "Обережно. Якщо натиснути це, значення зліва буде застосовано до всіх пристроїв, вибраних вище.",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "Не вдалося зберегти пристрій", "Device_Save_Failed": "Не вдалося зберегти пристрій",
"Device_Save_Unauthorized": "Неавторизовано недійсний токен API", "Device_Save_Unauthorized": "Неавторизовано недійсний токен API",
"Device_Saved_Success": "Пристрій успішно збережено", "Device_Saved_Success": "Пристрій успішно збережено",
"Device_Saved_Unexpected": "Оновлення пристрою повернуло неочікувану відповідь", "Device_Saved_Unexpected": "Оновлення пристрою повернуло неочікувану відповідь",
"Device_Scanning": "",
"Device_Searchbox": "Пошук", "Device_Searchbox": "Пошук",
"Device_Shortcut_AllDevices": "Мої пристрої", "Device_Shortcut_AllDevices": "Мої пристрої",
"Device_Shortcut_AllNodes": "Усі вузли", "Device_Shortcut_AllNodes": "Усі вузли",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "Вибране", "Device_Shortcut_Favorites": "Вибране",
"Device_Shortcut_NewDevices": "Нові пристрої", "Device_Shortcut_NewDevices": "Нові пристрої",
"Device_Shortcut_OnlineChart": "Наявність пристрою", "Device_Shortcut_OnlineChart": "Наявність пристрою",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "Агент Вниз", "Device_TableHead_AlertDown": "Агент Вниз",
"Device_TableHead_Connected_Devices": "Зв'язки", "Device_TableHead_Connected_Devices": "Зв'язки",
"Device_TableHead_CustomProps": "Реквізит / дії", "Device_TableHead_CustomProps": "Реквізит / дії",
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Улюблений", "Device_TableHead_Favorite": "Улюблений",
"Device_TableHead_FirstSession": "Перша сесія", "Device_TableHead_FirstSession": "Перша сесія",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Група", "Device_TableHead_Group": "Група",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "Додати пристрій", "Gen_AddDevice": "Додати пристрій",
"Gen_Add_All": "Додати все", "Gen_Add_All": "Додати все",
"Gen_All_Devices": "Усі пристрої", "Gen_All_Devices": "Усі пристрої",
"Gen_Archived": "",
"Gen_AreYouSure": "Ви впевнені?", "Gen_AreYouSure": "Ви впевнені?",
"Gen_Backup": "Запустіть резервне копіювання", "Gen_Backup": "Запустіть резервне копіювання",
"Gen_Cancel": "Скасувати", "Gen_Cancel": "Скасувати",
@@ -333,16 +324,13 @@
"Gen_Delete": "Видалити", "Gen_Delete": "Видалити",
"Gen_DeleteAll": "Видалити все", "Gen_DeleteAll": "Видалити все",
"Gen_Description": "Опис", "Gen_Description": "Опис",
"Gen_Down": "",
"Gen_Error": "Помилка", "Gen_Error": "Помилка",
"Gen_Filter": "Фільтр", "Gen_Filter": "Фільтр",
"Gen_Flapping": "",
"Gen_Generate": "Генерувати", "Gen_Generate": "Генерувати",
"Gen_InvalidMac": "Недійсна Mac-адреса.", "Gen_InvalidMac": "Недійсна Mac-адреса.",
"Gen_Invalid_Value": "Введено недійсне значення", "Gen_Invalid_Value": "Введено недійсне значення",
"Gen_LockedDB": "ПОМИЛКА БД може бути заблоковано перевірте F12 Інструменти розробника -> Консоль або спробуйте пізніше.", "Gen_LockedDB": "ПОМИЛКА БД може бути заблоковано перевірте F12 Інструменти розробника -> Консоль або спробуйте пізніше.",
"Gen_NetworkMask": "Маска мережі", "Gen_NetworkMask": "Маска мережі",
"Gen_New": "",
"Gen_Offline": "Офлайн", "Gen_Offline": "Офлайн",
"Gen_Okay": "Гаразд", "Gen_Okay": "Гаразд",
"Gen_Online": "Онлайн", "Gen_Online": "Онлайн",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Виберіть для попереднього перегляду", "Gen_SelectToPreview": "Виберіть для попереднього перегляду",
"Gen_Selected_Devices": "Вибрані пристрої:", "Gen_Selected_Devices": "Вибрані пристрої:",
"Gen_Sleeping": "",
"Gen_Subnet": "Підмережа", "Gen_Subnet": "Підмережа",
"Gen_Switch": "Перемикач", "Gen_Switch": "Перемикач",
"Gen_Upd": "Оновлено успішно", "Gen_Upd": "Оновлено успішно",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "Оновити значення", "Gen_Update_Value": "Оновити значення",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Попередження", "Gen_Warning": "Попередження",
"Gen_Work_In_Progress": "Робота триває, час залишити відгук на https://github.com/netalertx/NetAlertX/issues", "Gen_Work_In_Progress": "Робота триває, час залишити відгук на https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Новий пристрій", "Gen_create_new_device": "Новий пристрій",
"Gen_create_new_device_info": "Пристрої зазвичай виявляють за допомогою <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">плагінів</a>. Однак у деяких випадках може знадобитися додати пристрої вручну. Щоб дослідити конкретні сценарії, перегляньте <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">документацію щодо віддалених мереж</a>.", "Gen_create_new_device_info": "Пристрої зазвичай виявляють за допомогою <a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">плагінів</a>. Однак у деяких випадках може знадобитися додати пристрої вручну. Щоб дослідити конкретні сценарії, перегляньте <a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">документацію щодо віддалених мереж</a>.",
"General_display_name": "Загальний", "General_display_name": "Загальний",
@@ -385,7 +372,7 @@
"Loading": "Завантаження…", "Loading": "Завантаження…",
"Login_Box": "Введіть свій пароль", "Login_Box": "Введіть свій пароль",
"Login_Default_PWD": "Стандартний пароль \"123456\" все ще активний.", "Login_Default_PWD": "Стандартний пароль \"123456\" все ще активний.",
"Login_Info": "Паролі встановлюються за допомогою плагіна Set Password. Перегляньте <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/set_password\">документи SETPWD</a>, якщо у вас виникли проблеми з входом.", "Login_Info": "Паролі встановлюються за допомогою плагіна Set Password. Перегляньте <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">документи SETPWD</a>, якщо у вас виникли проблеми з входом.",
"Login_Psw-box": "Пароль", "Login_Psw-box": "Пароль",
"Login_Psw_alert": "Захист пароля!", "Login_Psw_alert": "Захист пароля!",
"Login_Psw_folder": "в папці config.", "Login_Psw_folder": "в папці config.",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "наразі вимкнено", "Maintenance_arp_status_off": "наразі вимкнено",
"Maintenance_arp_status_on": "триває сканування", "Maintenance_arp_status_on": "триває сканування",
"Maintenance_built_on": "Побудований на", "Maintenance_built_on": "Побудований на",
"Maintenance_current_version": "Ви в курсі подій. Перегляньте, над чим <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">я працюю</a>.", "Maintenance_current_version": "Ви в курсі подій. Перегляньте, над чим <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">я працюю</a>.",
"Maintenance_database_backup": "Резервне копіювання DB", "Maintenance_database_backup": "Резервне копіювання DB",
"Maintenance_database_backup_found": "резервних копій знайдено", "Maintenance_database_backup_found": "резервних копій знайдено",
"Maintenance_database_backup_total": "загальне використання диска", "Maintenance_database_backup_total": "загальне використання диска",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "Виберіть мову", "Maintenance_lang_selector_empty": "Виберіть мову",
"Maintenance_lang_selector_lable": "Виберіть мови", "Maintenance_lang_selector_lable": "Виберіть мови",
"Maintenance_lang_selector_text": "Зміна відбувається на стороні клієнта, тому вона впливає лише на поточний браузер.", "Maintenance_lang_selector_text": "Зміна відбувається на стороні клієнта, тому вона впливає лише на поточний браузер.",
"Maintenance_new_version": "Доступна нова версія. Перегляньте <a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">примітки до випуску</a>.", "Maintenance_new_version": "Доступна нова версія. Перегляньте <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">примітки до випуску</a>.",
"Maintenance_themeselector_apply": "Застосувати", "Maintenance_themeselector_apply": "Застосувати",
"Maintenance_themeselector_empty": "Виберіть скін", "Maintenance_themeselector_empty": "Виберіть скін",
"Maintenance_themeselector_lable": "Виберіть Скін", "Maintenance_themeselector_lable": "Виберіть Скін",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "Увімкнути вхід", "PIALERT_WEB_PROTECTION_name": "Увімкнути вхід",
"PLUGINS_KEEP_HIST_description": "Скільки записів результатів сканування історії плагінів слід зберігати (для кожного плагіна, а не для конкретного пристрою).", "PLUGINS_KEEP_HIST_description": "Скільки записів результатів сканування історії плагінів слід зберігати (для кожного плагіна, а не для конкретного пристрою).",
"PLUGINS_KEEP_HIST_name": "Історія плагінів", "PLUGINS_KEEP_HIST_name": "Історія плагінів",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "Видалити все (фільтри ігноруються)", "Plugins_DeleteAll": "Видалити все (фільтри ігноруються)",
"Plugins_Filters_Mac": "Фільтр Mac", "Plugins_Filters_Mac": "Фільтр Mac",
"Plugins_History": "Історія подій", "Plugins_History": "Історія подій",
@@ -804,4 +789,4 @@
"settings_system_label": "Система", "settings_system_label": "Система",
"settings_update_item_warning": "Оновіть значення нижче. Слідкуйте за попереднім форматом. <b>Перевірка не виконана.</b>", "settings_update_item_warning": "Оновіть значення нижче. Слідкуйте за попереднім форматом. <b>Перевірка не виконана.</b>",
"test_event_tooltip": "Перш ніж перевіряти налаштування, збережіть зміни." "test_event_tooltip": "Перш ніж перевіряти налаштування, збережіть зміни."
} }

View File

@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "", "Device_MultiEdit_MassActions": "",
"Device_MultiEdit_No_Devices": "", "Device_MultiEdit_No_Devices": "",
"Device_MultiEdit_Tooltip": "", "Device_MultiEdit_Tooltip": "",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "", "Device_Save_Failed": "",
"Device_Save_Unauthorized": "", "Device_Save_Unauthorized": "",
"Device_Saved_Success": "", "Device_Saved_Success": "",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "",
"Device_Scanning": "",
"Device_Searchbox": "", "Device_Searchbox": "",
"Device_Shortcut_AllDevices": "", "Device_Shortcut_AllDevices": "",
"Device_Shortcut_AllNodes": "", "Device_Shortcut_AllNodes": "",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "", "Device_Shortcut_Favorites": "",
"Device_Shortcut_NewDevices": "", "Device_Shortcut_NewDevices": "",
"Device_Shortcut_OnlineChart": "", "Device_Shortcut_OnlineChart": "",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "", "Device_TableHead_AlertDown": "",
"Device_TableHead_Connected_Devices": "", "Device_TableHead_Connected_Devices": "",
"Device_TableHead_CustomProps": "", "Device_TableHead_CustomProps": "",
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "", "Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "", "Device_TableHead_FirstSession": "",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "", "Device_TableHead_GUID": "",
"Device_TableHead_Group": "", "Device_TableHead_Group": "",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "", "Gen_AddDevice": "",
"Gen_Add_All": "", "Gen_Add_All": "",
"Gen_All_Devices": "", "Gen_All_Devices": "",
"Gen_Archived": "",
"Gen_AreYouSure": "", "Gen_AreYouSure": "",
"Gen_Backup": "", "Gen_Backup": "",
"Gen_Cancel": "", "Gen_Cancel": "",
@@ -333,16 +324,13 @@
"Gen_Delete": "", "Gen_Delete": "",
"Gen_DeleteAll": "", "Gen_DeleteAll": "",
"Gen_Description": "", "Gen_Description": "",
"Gen_Down": "",
"Gen_Error": "", "Gen_Error": "",
"Gen_Filter": "", "Gen_Filter": "",
"Gen_Flapping": "",
"Gen_Generate": "", "Gen_Generate": "",
"Gen_InvalidMac": "", "Gen_InvalidMac": "",
"Gen_Invalid_Value": "", "Gen_Invalid_Value": "",
"Gen_LockedDB": "", "Gen_LockedDB": "",
"Gen_NetworkMask": "", "Gen_NetworkMask": "",
"Gen_New": "",
"Gen_Offline": "", "Gen_Offline": "",
"Gen_Okay": "", "Gen_Okay": "",
"Gen_Online": "", "Gen_Online": "",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "", "Gen_SelectIcon": "",
"Gen_SelectToPreview": "", "Gen_SelectToPreview": "",
"Gen_Selected_Devices": "", "Gen_Selected_Devices": "",
"Gen_Sleeping": "",
"Gen_Subnet": "", "Gen_Subnet": "",
"Gen_Switch": "", "Gen_Switch": "",
"Gen_Upd": "", "Gen_Upd": "",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "", "PIALERT_WEB_PROTECTION_name": "",
"PLUGINS_KEEP_HIST_description": "", "PLUGINS_KEEP_HIST_description": "",
"PLUGINS_KEEP_HIST_name": "", "PLUGINS_KEEP_HIST_name": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "", "Plugins_DeleteAll": "",
"Plugins_Filters_Mac": "", "Plugins_Filters_Mac": "",
"Plugins_History": "", "Plugins_History": "",

View File

@@ -27,7 +27,7 @@
"AppEvents_ObjectType": "对象类型", "AppEvents_ObjectType": "对象类型",
"AppEvents_Plugin": "插件", "AppEvents_Plugin": "插件",
"AppEvents_Type": "类型", "AppEvents_Type": "类型",
"BACKEND_API_URL_description": "用来允许前端和后端通信。 默认情况下,这被设为 <code>服务器</code>,通常不应更改。", "BACKEND_API_URL_description": "用于生成后端API URL。如果您使用反向代理映射到您的<code>GRAPHQL_PORT</code>,请指定。请输入以<code>http://</code>开头的完整URL包括端口号末尾不带斜杠<code>/</code>。",
"BACKEND_API_URL_name": "后端 API 网址", "BACKEND_API_URL_name": "后端 API 网址",
"BackDevDetail_Actions_Ask_Run": "您要执行此操作吗?", "BackDevDetail_Actions_Ask_Run": "您要执行此操作吗?",
"BackDevDetail_Actions_Not_Registered": "未注册的操作: ", "BackDevDetail_Actions_Not_Registered": "未注册的操作: ",
@@ -109,7 +109,7 @@
"DevDetail_Network_Node_hover": "选择当前设备连接到的父网络设备,以填充网络树。", "DevDetail_Network_Node_hover": "选择当前设备连接到的父网络设备,以填充网络树。",
"DevDetail_Network_Port_hover": "此设备连接到父网络设备上的端口。如果留空,则网络树中会显示一个 wifi 图标。", "DevDetail_Network_Port_hover": "此设备连接到父网络设备上的端口。如果留空,则网络树中会显示一个 wifi 图标。",
"DevDetail_Nmap_Scans": "手动 Nmap 扫描", "DevDetail_Nmap_Scans": "手动 Nmap 扫描",
"DevDetail_Nmap_Scans_desc": "您可以在此处执行手动 NMAP 扫描。您还可以通过服务和端口 (NMAP) 插件安排定期自动 NMAP 扫描。前往<a href= \"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Docs</a>了解更多信息", "DevDetail_Nmap_Scans_desc": "您可以在此处执行手动 NMAP 扫描。您还可以通过服务和端口 (NMAP) 插件安排定期自动 NMAP 扫描。前往<a href= \"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Docs</a>了解更多信息",
"DevDetail_Nmap_buttonDefault": "默认扫描", "DevDetail_Nmap_buttonDefault": "默认扫描",
"DevDetail_Nmap_buttonDefault_text": "默认扫描Nmap 会扫描请求的每个扫描协议的前 1,000 个端口。这将捕获大约 93% 的 TCP 端口和 49% 的 UDP 端口。(大约 5 秒)", "DevDetail_Nmap_buttonDefault_text": "默认扫描Nmap 会扫描请求的每个扫描协议的前 1,000 个端口。这将捕获大约 93% 的 TCP 端口和 49% 的 UDP 端口。(大约 5 秒)",
"DevDetail_Nmap_buttonDetail": "详细扫描", "DevDetail_Nmap_buttonDetail": "详细扫描",
@@ -139,7 +139,7 @@
"DevDetail_SessionTable_Duration": "时长", "DevDetail_SessionTable_Duration": "时长",
"DevDetail_SessionTable_IP": "IP", "DevDetail_SessionTable_IP": "IP",
"DevDetail_SessionTable_Order": "排序", "DevDetail_SessionTable_Order": "排序",
"DevDetail_Shortcut_CurrentStatus": "状态", "DevDetail_Shortcut_CurrentStatus": "当前状态",
"DevDetail_Shortcut_DownAlerts": "下线警报", "DevDetail_Shortcut_DownAlerts": "下线警报",
"DevDetail_Shortcut_Presence": "存在", "DevDetail_Shortcut_Presence": "存在",
"DevDetail_Shortcut_Sessions": "会话", "DevDetail_Shortcut_Sessions": "会话",
@@ -203,16 +203,10 @@
"Device_MultiEdit_MassActions": "谨慎操作:", "Device_MultiEdit_MassActions": "谨慎操作:",
"Device_MultiEdit_No_Devices": "未选择设备。", "Device_MultiEdit_No_Devices": "未选择设备。",
"Device_MultiEdit_Tooltip": "小心。 单击此按钮会将左侧的值应用到上面选择的所有设备。", "Device_MultiEdit_Tooltip": "小心。 单击此按钮会将左侧的值应用到上面选择的所有设备。",
"Device_NextScan_Imminent": "",
"Device_NextScan_In": "",
"Device_NoData_Help": "",
"Device_NoData_Scanning": "",
"Device_NoData_Title": "",
"Device_Save_Failed": "保存设备失败", "Device_Save_Failed": "保存设备失败",
"Device_Save_Unauthorized": "未授权 - API 令牌无效", "Device_Save_Unauthorized": "未授权 - API 令牌无效",
"Device_Saved_Success": "设备保存成功", "Device_Saved_Success": "设备保存成功",
"Device_Saved_Unexpected": "设备更新返回了一个意外的响应", "Device_Saved_Unexpected": "设备更新返回了一个意外的响应",
"Device_Scanning": "",
"Device_Searchbox": "搜索", "Device_Searchbox": "搜索",
"Device_Shortcut_AllDevices": "我的设备", "Device_Shortcut_AllDevices": "我的设备",
"Device_Shortcut_AllNodes": "全部节点", "Device_Shortcut_AllNodes": "全部节点",
@@ -224,14 +218,12 @@
"Device_Shortcut_Favorites": "收藏", "Device_Shortcut_Favorites": "收藏",
"Device_Shortcut_NewDevices": "新设备", "Device_Shortcut_NewDevices": "新设备",
"Device_Shortcut_OnlineChart": "设备统计", "Device_Shortcut_OnlineChart": "设备统计",
"Device_Shortcut_Unstable": "",
"Device_TableHead_AlertDown": "提醒宕机", "Device_TableHead_AlertDown": "提醒宕机",
"Device_TableHead_Connected_Devices": "链接", "Device_TableHead_Connected_Devices": "链接",
"Device_TableHead_CustomProps": "属性", "Device_TableHead_CustomProps": "属性",
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "收藏", "Device_TableHead_Favorite": "收藏",
"Device_TableHead_FirstSession": "加入", "Device_TableHead_FirstSession": "加入",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "组", "Device_TableHead_Group": "组",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",
@@ -322,7 +314,6 @@
"Gen_AddDevice": "添加设备", "Gen_AddDevice": "添加设备",
"Gen_Add_All": "全部添加", "Gen_Add_All": "全部添加",
"Gen_All_Devices": "所有设备", "Gen_All_Devices": "所有设备",
"Gen_Archived": "",
"Gen_AreYouSure": "你确定吗?", "Gen_AreYouSure": "你确定吗?",
"Gen_Backup": "运行备份", "Gen_Backup": "运行备份",
"Gen_Cancel": "取消", "Gen_Cancel": "取消",
@@ -333,16 +324,13 @@
"Gen_Delete": "删除", "Gen_Delete": "删除",
"Gen_DeleteAll": "全部删除", "Gen_DeleteAll": "全部删除",
"Gen_Description": "描述", "Gen_Description": "描述",
"Gen_Down": "",
"Gen_Error": "错误", "Gen_Error": "错误",
"Gen_Filter": "筛选", "Gen_Filter": "筛选",
"Gen_Flapping": "",
"Gen_Generate": "生成", "Gen_Generate": "生成",
"Gen_InvalidMac": "无效的 Mac 地址。", "Gen_InvalidMac": "无效的 Mac 地址。",
"Gen_Invalid_Value": "输入了无效的值", "Gen_Invalid_Value": "输入了无效的值",
"Gen_LockedDB": "错误 - DB 可能被锁定 - 检查 F12 开发工具 -> 控制台或稍后重试。", "Gen_LockedDB": "错误 - DB 可能被锁定 - 检查 F12 开发工具 -> 控制台或稍后重试。",
"Gen_NetworkMask": "网络掩码", "Gen_NetworkMask": "网络掩码",
"Gen_New": "",
"Gen_Offline": "离线", "Gen_Offline": "离线",
"Gen_Okay": "Ok", "Gen_Okay": "Ok",
"Gen_Online": "在线", "Gen_Online": "在线",
@@ -360,7 +348,6 @@
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>", "Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "选择预览", "Gen_SelectToPreview": "选择预览",
"Gen_Selected_Devices": "选定的设备:", "Gen_Selected_Devices": "选定的设备:",
"Gen_Sleeping": "",
"Gen_Subnet": "子网", "Gen_Subnet": "子网",
"Gen_Switch": "交换", "Gen_Switch": "交换",
"Gen_Upd": "已成功更新", "Gen_Upd": "已成功更新",
@@ -369,7 +356,7 @@
"Gen_Update_Value": "更新值", "Gen_Update_Value": "更新值",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>", "Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "警告", "Gen_Warning": "警告",
"Gen_Work_In_Progress": "工作正在进行中,欢迎在 https://github.com/netalertx/NetAlertX/issues 上反馈", "Gen_Work_In_Progress": "工作正在进行中,欢迎在 https://github.com/jokob-sk/NetAlertX/issues 上反馈",
"Gen_create_new_device": "新设备", "Gen_create_new_device": "新设备",
"Gen_create_new_device_info": "通常使用<a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>来发现设备。但是,在某些情况下,您可能需要手动添加设备。要探索特定场景,请查看<a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">远程网络文档</a>。", "Gen_create_new_device_info": "通常使用<a target=\"_blank\" href=\"https://docs.netalertx.com/PLUGINS\">plugins</a>来发现设备。但是,在某些情况下,您可能需要手动添加设备。要探索特定场景,请查看<a target=\"_blank\" href=\"https://docs.netalertx.com/REMOTE_NETWORKS\">远程网络文档</a>。",
"General_display_name": "通用", "General_display_name": "通用",
@@ -385,7 +372,7 @@
"Loading": "加载中…", "Loading": "加载中…",
"Login_Box": "输入密码", "Login_Box": "输入密码",
"Login_Default_PWD": "默认密码“123456”仍然有效。", "Login_Default_PWD": "默认密码“123456”仍然有效。",
"Login_Info": "密码通过 Set Password 插件设置。如果有登录问题,请查看 <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/tree/main/front/plugins/set_password\">SETPWD 文档</a> 。", "Login_Info": "设置密码使用设置密码插件。如果您无法登录,请查看<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">SETPWD文档</a>。",
"Login_Psw-box": "密码", "Login_Psw-box": "密码",
"Login_Psw_alert": "密码警报!", "Login_Psw_alert": "密码警报!",
"Login_Psw_folder": "在配置文件夹中。", "Login_Psw_folder": "在配置文件夹中。",
@@ -427,8 +414,8 @@
"Maintenance_Tool_ImportPastedConfig": "设置导入(粘贴)", "Maintenance_Tool_ImportPastedConfig": "设置导入(粘贴)",
"Maintenance_Tool_ImportPastedConfig_noti_text": "您确认要导入粘贴的设置吗?这会完全<b>覆盖</b><code>app.conf</code>的内容。", "Maintenance_Tool_ImportPastedConfig_noti_text": "您确认要导入粘贴的设置吗?这会完全<b>覆盖</b><code>app.conf</code>的内容。",
"Maintenance_Tool_ImportPastedConfig_text": "导入包含所有应用程序设置的<code>app.conf</code>文件。建议先通过<b>设置导出</b>功能下载当前的<code>app.conf</code>文件。", "Maintenance_Tool_ImportPastedConfig_text": "导入包含所有应用程序设置的<code>app.conf</code>文件。建议先通过<b>设置导出</b>功能下载当前的<code>app.conf</code>文件。",
"Maintenance_Tool_UnlockFields": "解锁设备字段", "Maintenance_Tool_UnlockFields": "清除所有设备来源",
"Maintenance_Tool_UnlockFields_noti": "解锁设备字段", "Maintenance_Tool_UnlockFields_noti": "清除所有设备来源",
"Maintenance_Tool_UnlockFields_noti_text": "您确定要清除所有设备字段(锁定/用户)的所有源值吗?(请注意:此操作将永久删除这些值,无法恢复)这一行为无法挽回。", "Maintenance_Tool_UnlockFields_noti_text": "您确定要清除所有设备字段(锁定/用户)的所有源值吗?(请注意:此操作将永久删除这些值,无法恢复)这一行为无法挽回。",
"Maintenance_Tool_UnlockFields_text": "此工具将从所有设备的每个跟踪字段中删除所有原始数据,从而为插件和用户完全解锁所有字段。请谨慎使用,因为这将影响您整个设备的库存情况。", "Maintenance_Tool_UnlockFields_text": "此工具将从所有设备的每个跟踪字段中删除所有原始数据,从而为插件和用户完全解锁所有字段。请谨慎使用,因为这将影响您整个设备的库存情况。",
"Maintenance_Tool_arpscansw": "切换 arp 扫描(开/关)", "Maintenance_Tool_arpscansw": "切换 arp 扫描(开/关)",
@@ -499,7 +486,7 @@
"Maintenance_arp_status_off": "当前已禁用", "Maintenance_arp_status_off": "当前已禁用",
"Maintenance_arp_status_on": "正在运行扫描", "Maintenance_arp_status_on": "正在运行扫描",
"Maintenance_built_on": "建立于", "Maintenance_built_on": "建立于",
"Maintenance_current_version": "已是最新版。查看 <a href=\"https://github.com/netalertx/NetAlertX/issues/138\" target=\"_blank\">我正在做什么</a>。", "Maintenance_current_version": "您已了解最新情况。查看<a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">我正在处理的内容</a>。",
"Maintenance_database_backup": "数据库备份", "Maintenance_database_backup": "数据库备份",
"Maintenance_database_backup_found": "找到备份", "Maintenance_database_backup_found": "找到备份",
"Maintenance_database_backup_total": "总磁盘使用量", "Maintenance_database_backup_total": "总磁盘使用量",
@@ -511,7 +498,7 @@
"Maintenance_lang_selector_empty": "选择语言", "Maintenance_lang_selector_empty": "选择语言",
"Maintenance_lang_selector_lable": "选择语言", "Maintenance_lang_selector_lable": "选择语言",
"Maintenance_lang_selector_text": "该更改发生在客户端,因此只影响当前浏览器。", "Maintenance_lang_selector_text": "该更改发生在客户端,因此只影响当前浏览器。",
"Maintenance_new_version": "有新版本可用。查看<a href=\"https://github.com/netalertx/NetAlertX/releases\" target=\"_blank\">发行说明</a>。", "Maintenance_new_version": "有新版本可用。查看<a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">发行说明</a>。",
"Maintenance_themeselector_apply": "应用", "Maintenance_themeselector_apply": "应用",
"Maintenance_themeselector_empty": "选择皮肤", "Maintenance_themeselector_empty": "选择皮肤",
"Maintenance_themeselector_lable": "选择皮肤", "Maintenance_themeselector_lable": "选择皮肤",
@@ -590,8 +577,6 @@
"PIALERT_WEB_PROTECTION_name": "启用登录", "PIALERT_WEB_PROTECTION_name": "启用登录",
"PLUGINS_KEEP_HIST_description": "应保留多少个插件历史扫描结果条目(每个插件,而不是特定于设备)。", "PLUGINS_KEEP_HIST_description": "应保留多少个插件历史扫描结果条目(每个插件,而不是特定于设备)。",
"PLUGINS_KEEP_HIST_name": "插件历史", "PLUGINS_KEEP_HIST_name": "插件历史",
"PRAGMA_JOURNAL_SIZE_LIMIT_description": "",
"PRAGMA_JOURNAL_SIZE_LIMIT_name": "",
"Plugins_DeleteAll": "全部删除(忽略过滤器)", "Plugins_DeleteAll": "全部删除(忽略过滤器)",
"Plugins_Filters_Mac": "Mac 过滤器", "Plugins_Filters_Mac": "Mac 过滤器",
"Plugins_History": "事件历史", "Plugins_History": "事件历史",
@@ -804,4 +789,4 @@
"settings_system_label": "系统", "settings_system_label": "系统",
"settings_update_item_warning": "更新下面的值。请注意遵循先前的格式。<b>未执行验证。</b>", "settings_update_item_warning": "更新下面的值。请注意遵循先前的格式。<b>未执行验证。</b>",
"test_event_tooltip": "在测试设置之前,请先保存更改。" "test_event_tooltip": "在测试设置之前,请先保存更改。"
} }

View File

@@ -83,7 +83,7 @@ if ($nax_WebProtection == 'true') {
$isLoggedIn = isset($_SESSION['login']) && $_SESSION['login'] == 1; $isLoggedIn = isset($_SESSION['login']) && $_SESSION['login'] == 1;
// Determine if the user should be redirected // Determine if the user should be redirected
if ($isLoggedIn || $isLogonPage) { if ($isLoggedIn || $isLogonPage || (isset($_COOKIE[COOKIE_SAVE_LOGIN_NAME]) && $nax_Password === $_COOKIE[COOKIE_SAVE_LOGIN_NAME])) {
// Logged in or stay on this page if we are on the index.php already // Logged in or stay on this page if we are on the index.php already
} else { } else {
// We need to redirect // We need to redirect

View File

@@ -1,7 +1,7 @@
<?php <?php
#---------------------------------------------------------------------------------# #---------------------------------------------------------------------------------#
# NetAlertX # # NetAlertX #
# Open Source Network Guard / WIFI & LAN intrusion detector # # Open Source Network Guard / WIFI & LAN intrusion detector #
# # # #
# version.php - Templates module Template to display the current version # # version.php - Templates module Template to display the current version #
#---------------------------------------------------------------------------------# #---------------------------------------------------------------------------------#
@@ -18,11 +18,11 @@ if(file_exists($filename)) {
if(trim($fileContents) === 'Dev') { if(trim($fileContents) === 'Dev') {
echo date('H:i:s') . " - " . $fileContents; echo date('H:i:s') . " - " . $fileContents;
} else { } else {
echo trim($fileContents); echo $fileContents;
} }
} }
else { else {
echo date('H:i:s') . " - N/A"; echo date('H:i:s') . " - N/A";
} }
?> ?>

View File

@@ -400,11 +400,11 @@
"description": [ "description": [
{ {
"language_code": "en_us", "language_code": "en_us",
"string": "The Webhook payload data format for the <code>body</code> > <code>attachments</code> > <code>text</code> attribute in the payload json. See an example of the payload <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">here</a>. (e.g.: for discord use <code>text</code>)" "string": "The Webhook payload data format for the <code>body</code> > <code>attachments</code> > <code>text</code> attribute in the payload json. See an example of the payload <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">here</a>. (e.g.: for discord use <code>text</code>)"
}, },
{ {
"language_code": "es_es", "language_code": "es_es",
"string": "El formato de datos de carga de Webhook para el atributo <code>body</code> > <code>attachments</code> > <code>text</code> en el json de carga. Vea un ejemplo de la carga <a target=\"_blank\" href=\"https://github.com/netalertx/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">aquí</a>. (por ejemplo: para discord use <code>text</code>)" "string": "El formato de datos de carga de Webhook para el atributo <code>body</code> > <code>attachments</code> > <code>text</code> en el json de carga. Vea un ejemplo de la carga <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">aquí</a>. (por ejemplo: para discord use <code>text</code>)"
} }
] ]
}, },

View File

@@ -96,15 +96,6 @@ def cleanup_database(
cursor.execute(sql) cursor.execute(sql)
mylog("verbose", [f"[{pluginName}] Events deleted rows: {cursor.rowcount}"]) mylog("verbose", [f"[{pluginName}] Events deleted rows: {cursor.rowcount}"])
# -----------------------------------------------------
# Sessions (derived snapshot — trimmed to the same window as Events so the
# two tables stay in sync without introducing a separate setting)
mylog("verbose", f"[{pluginName}] Sessions: Delete all older than {str(DAYS_TO_KEEP_EVENTS)} days (reuses DAYS_TO_KEEP_EVENTS)")
sql = f"""DELETE FROM Sessions WHERE ses_DateTimeConnection <= date('now', '-{str(DAYS_TO_KEEP_EVENTS)} day')"""
mylog("verbose", [f"[{pluginName}] SQL : {sql}"])
cursor.execute(sql)
mylog("verbose", [f"[{pluginName}] Sessions deleted rows: {cursor.rowcount}"])
# ----------------------------------------------------- # -----------------------------------------------------
# Plugins_History # Plugins_History
mylog("verbose", f"[{pluginName}] Plugins_History: Trim to {str(PLUGINS_KEEP_HIST)} per Plugin") mylog("verbose", f"[{pluginName}] Plugins_History: Trim to {str(PLUGINS_KEEP_HIST)} per Plugin")
@@ -208,19 +199,9 @@ def cleanup_database(
cursor.execute("PRAGMA wal_checkpoint(FULL);") cursor.execute("PRAGMA wal_checkpoint(FULL);")
mylog("verbose", [f"[{pluginName}] WAL checkpoint executed to truncate file."]) mylog("verbose", [f"[{pluginName}] WAL checkpoint executed to truncate file."])
# Refresh query-planner statistics after bulk deletes so SQLite chooses
# the right indexes on the next scan cycle (fixes CPU scaling with DB size)
cursor.execute("ANALYZE;")
mylog("verbose", [f"[{pluginName}] ANALYZE completed"])
mylog("verbose", [f"[{pluginName}] Shrink Database"]) mylog("verbose", [f"[{pluginName}] Shrink Database"])
cursor.execute("VACUUM;") cursor.execute("VACUUM;")
# Lightweight incremental ANALYZE at connection close — near-zero cost,
# only re-analyzes tables whose statistics have drifted >25%
cursor.execute("PRAGMA optimize;")
mylog("verbose", [f"[{pluginName}] PRAGMA optimize completed"])
conn.close() conn.close()

View File

@@ -1191,41 +1191,6 @@
} }
] ]
}, },
{
"function": "devCanSleep",
"type": {
"dataType": "integer",
"elements": [
{
"elementType": "input",
"elementOptions": [
{
"type": "checkbox"
}
],
"transformers": []
}
]
},
"default_value": 0,
"options": [],
"localized": [
"name",
"description"
],
"name": [
{
"language_code": "en_us",
"string": "Can Sleep"
}
],
"description": [
{
"language_code": "en_us",
"string": "When enabled, the device will appear as <em>Sleeping</em> instead of <em>Down</em> or <em>Off-line</em> while it has been absent for less than the <b>Sleep Window</b> (<code>NTFPRCS_sleep_time</code>). Once the sleep window expires the device becomes subject to the normal <code>Alert Down</code> condition. Database column name: <code>devCanSleep</code>."
}
]
},
{ {
"function": "devSkipRepeated", "function": "devSkipRepeated",
"type": { "type": {
@@ -1711,7 +1676,7 @@
"description": [ "description": [
{ {
"language_code": "en_us", "language_code": "en_us",
"string": "The name of the Sync Node. Uneditable - Auto-populated via the <a href=\"https://github.com/netalertx/NetAlertX/blob/main/front/plugins/sync/README.md\" target=\"_blank\">Sync plugin</a> if enabled. Database column name: <code>devSyncHubNode</code>." "string": "The name of the Sync Node. Uneditable - Auto-populated via the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/sync/README.md\" target=\"_blank\">Sync plugin</a> if enabled. Database column name: <code>devSyncHubNode</code>."
} }
] ]
}, },

View File

@@ -105,34 +105,6 @@
} }
] ]
}, },
{
"function": "sleep_time",
"type": {
"dataType": "integer",
"elements": [
{
"elementType": "input",
"elementOptions": [{ "type": "number" }],
"transformers": []
}
]
},
"default_value": 30,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Sleep Window"
}
],
"description": [
{
"language_code": "en_us",
"string": "How many minutes a device with <code>Can Sleep</code> enabled is shown as <em>Sleeping</em> before it becomes subject to the <code>Alert Down</code> condition. Changes take effect after saving settings."
}
]
},
{ {
"function": "new_dev_condition", "function": "new_dev_condition",
"type": { "type": {

View File

@@ -224,7 +224,7 @@
"description": [ "description": [
{ {
"language_code": "en_us", "language_code": "en_us",
"string": "Omada SDN site IDs. For now, we only process the first site listed since NetAlertX's other probes won't traverse across NAT and routers. But if needed please submit an issue in github with your specific use case for consideration: <code>https://github.com/netalertx/NetAlertX/issues </code> " "string": "Omada SDN site IDs. For now, we only process the first site listed since NetAlertX's other probes won't traverse across NAT and routers. But if needed please submit an issue in github with your specific use case for consideration: <code>https://github.com/jokob-sk/NetAlertX/issues </code> "
} }
] ]
}, },

View File

@@ -483,11 +483,11 @@
"description": [ "description": [
{ {
"language_code": "en_us", "language_code": "en_us",
"string": "A list of <code>snmpwalk</code> commands to execute against IP addresses of routers/switches with SNMP turned on. <br/> <br/> Example with the router on the IP <code>192.168.1.1</code> (the <code>-OXsq</code> is a required parameter): <br/> <code>snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1.2.1.3.1.1.2</code> <br/><br/> Only IPv4 supported. Authentication is not supported. More info on the plugin <a href='https://github.com/netalertx/NetAlertX/tree/main/front/plugins/snmp_discovery' target='_blank'>here</a>." "string": "A list of <code>snmpwalk</code> commands to execute against IP addresses of routers/switches with SNMP turned on. <br/> <br/> Example with the router on the IP <code>192.168.1.1</code> (the <code>-OXsq</code> is a required parameter): <br/> <code>snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1.2.1.3.1.1.2</code> <br/><br/> Only IPv4 supported. Authentication is not supported. More info on the plugin <a href='https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/snmp_discovery' target='_blank'>here</a>."
}, },
{ {
"language_code": "es_es", "language_code": "es_es",
"string": "Una lista de comandos <code>snmpwalk</code> para ejecutar en direcciones IP de computadoras/conmutadores con SNMP activado. <br/> <br/> Ejemplo con el enrutador en la IP <code>192.168.1.1</code>: <br/> <code>snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1. 2.1.3.1.1.2</code> <br/><br/> Solo se admite IPv4. No se admite la autenticación. Más información sobre el complemento <a href='https://github.com/netalertx/NetAlertX/tree/main/front/plugins/snmp_discovery' target='_blank'>aquí</a>." "string": "Una lista de comandos <code>snmpwalk</code> para ejecutar en direcciones IP de computadoras/conmutadores con SNMP activado. <br/> <br/> Ejemplo con el enrutador en la IP <code>192.168.1.1</code>: <br/> <code>snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1. 2.1.3.1.1.2</code> <br/><br/> Solo se admite IPv4. No se admite la autenticación. Más información sobre el complemento <a href='https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/snmp_discovery' target='_blank'>aquí</a>."
} }
] ]
}, },

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