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

--

-

+

@@ -403,9 +403,9 @@ function filterDataByStatus(data, status) { return item.dev_Favorite === 1; case 'new': return item.dev_NewDevice === 1; + case 'offline': + return item.dev_PresentLastScan === 0; case 'down': - return (item.dev_PresentLastScan === 0 && item.dev_AlertDeviceDown !== 0) || item.dev_PresentLastScan === 0; - case 'down_only': return (item.dev_PresentLastScan === 0 && item.dev_AlertDeviceDown !== 0); case 'archived': return item.dev_Archived === 1; @@ -460,7 +460,7 @@ function initializeDatatable (status) { case 'connected': tableTitle = getString('Device_Shortcut_Connected'); color = 'green'; break; case 'favorites': tableTitle = getString('Device_Shortcut_Favorites'); color = 'yellow'; break; case 'new': tableTitle = getString('Device_Shortcut_NewDevices'); color = 'yellow'; break; - case 'down': tableTitle = getString('Device_Shortcut_DownAlerts'); color = 'red'; break; + case 'down': tableTitle = getString('Device_Shortcut_DownOnly'); color = 'red'; break; case 'archived': tableTitle = getString('Device_Shortcut_Archived'); color = 'gray'; break; default: tableTitle = getString('Device_Shortcut_Devices'); color = 'gray'; break; } diff --git a/front/js/settings_utils.js b/front/js/settings_utils.js index 99a9b1cd..ff5f3a3f 100755 --- a/front/js/settings_utils.js +++ b/front/js/settings_utils.js @@ -20,7 +20,7 @@ } // ------------------------------------------------------------------- - // Get plugin type base on prefix + // Get plugin code name base on prefix function getPluginCodeName(pluginsData, prefix) { var result = "" @@ -58,6 +58,25 @@ return result; } + // ------------------------------------------------------------------- + // Get plugin config based on prefix + function getPluginConfig(pluginsData, prefix) + { + + result = "" + + pluginsData.forEach((plug) => { + + if (plug.unique_prefix == prefix ) { + + // console.log(id) + result = plug; + } + }); + + return result; + } + // ------------------------------------------------------------------- // Generate plugin HTML card based on prefixes in an array function pluginCards(prefixesOfEnabledPlugins, includeSettings) diff --git a/front/php/server/devices.php b/front/php/server/devices.php index 15439930..2847f04c 100755 --- a/front/php/server/devices.php +++ b/front/php/server/devices.php @@ -26,11 +26,8 @@ case 'setDeviceData': setDeviceData(); break; case 'deleteDevice': deleteDevice(); break; case 'deleteAllWithEmptyMACs': deleteAllWithEmptyMACs(); break; - case 'createBackupDB': createBackupDB(); break; case 'deleteAllDevices': deleteAllDevices(); break; - case 'runScan15min': runScan15min(); break; - case 'runScan1min': runScan1min(); break; case 'deleteUnknownDevices': deleteUnknownDevices(); break; case 'deleteEvents': deleteEvents(); break; case 'deleteEvents30': deleteEvents30(); break; diff --git a/front/php/templates/header.php b/front/php/templates/header.php index 7b64220c..021df71c 100755 --- a/front/php/templates/header.php +++ b/front/php/templates/header.php @@ -254,10 +254,10 @@ if ($ENABLED_DARKMODE === True) {
  • - +
  • - +
  • diff --git a/front/php/templates/language/de_de.json b/front/php/templates/language/de_de.json index f8f974f1..78d48405 100755 --- a/front/php/templates/language/de_de.json +++ b/front/php/templates/language/de_de.json @@ -285,6 +285,7 @@ "Gen_Error": "Fehler", "Gen_Filter": "", "Gen_LockedDB": "ERROR - DB eventuell gesperrt - Nutze die Konsole in den Entwickler Werkzeugen (F12) zur \u00dcberpr\u00fcfung oder probiere es sp\u00e4ter erneut.", + "Gen_Offline": "", "Gen_Okay": "Ok", "Gen_Purge": "Aufr\u00e4umen", "Gen_ReadDocs": "Mehr in der Dokumentation", diff --git a/front/php/templates/language/en_us.json b/front/php/templates/language/en_us.json index 7d323eea..cbfd1496 100755 --- a/front/php/templates/language/en_us.json +++ b/front/php/templates/language/en_us.json @@ -273,6 +273,7 @@ "Gen_Error": "Error", "Gen_Filter": "Filter", "Gen_LockedDB": "ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.", + "Gen_Offline": "Offline", "Gen_Okay": "Ok", "Gen_Purge": "Purge", "Gen_ReadDocs": "Read more in the docs.", diff --git a/front/php/templates/language/es_es.json b/front/php/templates/language/es_es.json old mode 100644 new mode 100755 index 7c5b6366..289d7816 --- a/front/php/templates/language/es_es.json +++ b/front/php/templates/language/es_es.json @@ -1,27 +1,27 @@ { - "API_CUSTOM_SQL_description": "Puede especificar una consulta SQL personalizada que generará un archivo JSON y luego lo expondrá a través del archivo table_custom_endpoint.json.", + "API_CUSTOM_SQL_description": "Puede especificar una consulta SQL personalizada que generar\u00e1 un archivo JSON y luego lo expondr\u00e1 a trav\u00e9s del archivo table_custom_endpoint.json.", "API_CUSTOM_SQL_name": "Endpoint personalizado", "API_display_name": "API", "API_icon": "", "APPRISE_HOST_description": "URL del host de Apprise que comienza con http:// o https://. (no olvide incluir /notify al final)", "APPRISE_HOST_name": "URL del host de Apprise", - "APPRISE_PAYLOAD_description": "Seleccione el tipo de carga útil enviada a Apprise. Por ejemplo, html funciona bien con correos electrónicos, text con aplicaciones de chat, como Telegram.", + "APPRISE_PAYLOAD_description": "Seleccione el tipo de carga \u00fatil enviada a Apprise. Por ejemplo, html funciona bien con correos electr\u00f3nicos, text con aplicaciones de chat, como Telegram.", "APPRISE_PAYLOAD_name": "Tipo de carga", - "APPRISE_SIZE_description": "El tamaño máximo de la carga útil de información como número de caracteres en la cadena pasada. Si supera el límite, se truncará y se agregará un mensaje (text was truncated).", - "APPRISE_SIZE_name": "Tamaño máximo de carga útil", - "APPRISE_URL_description": "Informar de la URL de destino de la notificación. Por ejemplo, para Telegram sería tgram://{bot_token}/{chat_id}.", - "APPRISE_URL_name": "URL de notificación de Apprise", - "About_Design": "Diseñado para:", + "APPRISE_SIZE_description": "El tama\u00f1o m\u00e1ximo de la carga \u00fatil de informaci\u00f3n como n\u00famero de caracteres en la cadena pasada. Si supera el l\u00edmite, se truncar\u00e1 y se agregar\u00e1 un mensaje (text was truncated).", + "APPRISE_SIZE_name": "Tama\u00f1o m\u00e1ximo de carga \u00fatil", + "APPRISE_URL_description": "Informar de la URL de destino de la notificaci\u00f3n. Por ejemplo, para Telegram ser\u00eda tgram://{bot_token}/{chat_id}.", + "APPRISE_URL_name": "URL de notificaci\u00f3n de Apprise", + "About_Design": "Dise\u00f1ado para:", "About_Exit": "Salir", - "About_Title": "Escáner de seguridad de la red y marco de notificaciones", + "About_Title": "Esc\u00e1ner de seguridad de la red y marco de notificaciones", "AppEvents_DateTimeCreated": "Registrado", "AppEvents_Extra": "Extra", - "AppEvents_GUID": "GUID del evento de aplicación", + "AppEvents_GUID": "GUID del evento de aplicaci\u00f3n", "AppEvents_Helper1": "Ayudante 1", "AppEvents_Helper2": "Ayudante 2", "AppEvents_Helper3": "Ayudante 3", "AppEvents_ObjectForeignKey": "Clave externa", - "AppEvents_ObjectIndex": "Índice", + "AppEvents_ObjectIndex": "\u00cdndice", "AppEvents_ObjectIsArchived": "Se archiva (en el momento del registro)", "AppEvents_ObjectIsNew": "Es nuevo (en el momento del registro)", "AppEvents_ObjectPlugin": "Complemento vinculado", @@ -34,106 +34,106 @@ "AppEvents_Type": "Tipo", "Apprise_display_name": "Apprise", "Apprise_icon": "", - "BackDevDetail_Actions_Ask_Run": "¿Desea ejecutar la acción?", - "BackDevDetail_Actions_Not_Registered": "Acción no registrada: ", - "BackDevDetail_Actions_Title_Run": "Ejecutar acción", - "BackDevDetail_Copy_Ask": "¿Copiar detalles del dispositivo de la lista desplegable (se sobrescribirá todo en esta página)?", + "BackDevDetail_Actions_Ask_Run": "\u00bfDesea ejecutar la acci\u00f3n?", + "BackDevDetail_Actions_Not_Registered": "Acci\u00f3n no registrada: ", + "BackDevDetail_Actions_Title_Run": "Ejecutar acci\u00f3n", + "BackDevDetail_Copy_Ask": "\u00bfCopiar detalles del dispositivo de la lista desplegable (se sobrescribir\u00e1 todo en esta p\u00e1gina)?", "BackDevDetail_Copy_Title": "Copiar detalles", "BackDevDetail_Tools_WOL_error": "Ha ocurrido un error al ejectuar el comando.", "BackDevDetail_Tools_WOL_okay": "El comando se ha ejecutado correctamente.", "BackDevices_Arpscan_disabled": "Arp-Scan Desactivado", "BackDevices_Arpscan_enabled": "Arp-Scan Activado", "BackDevices_Backup_CopError": "La base de datos original no se pudo guardar.", - "BackDevices_Backup_Failed": "La copia de seguridad se ejecutó parcialmente con éxito. El archivo no se puede crear o está vacío.", - "BackDevices_Backup_okay": "La copia de seguridad ejecutada con éxito con el nuevo archivo", - "BackDevices_DBTools_DelDevError_a": "Error de eliminación del dispositivo", - "BackDevices_DBTools_DelDevError_b": "Error de eliminación de dispositivos", + "BackDevices_Backup_Failed": "La copia de seguridad se ejecut\u00f3 parcialmente con \u00e9xito. El archivo no se puede crear o est\u00e1 vac\u00edo.", + "BackDevices_Backup_okay": "La copia de seguridad ejecutada con \u00e9xito con el nuevo archivo", + "BackDevices_DBTools_DelDevError_a": "Error de eliminaci\u00f3n del dispositivo", + "BackDevices_DBTools_DelDevError_b": "Error de eliminaci\u00f3n de dispositivos", "BackDevices_DBTools_DelDev_a": "Dispositivo eliminado", "BackDevices_DBTools_DelDev_b": "Dispositivos eliminados", "BackDevices_DBTools_DelEvents": "Eventos eliminados", - "BackDevices_DBTools_DelEventsError": "Error de eliminación de eventos", + "BackDevices_DBTools_DelEventsError": "Error de eliminaci\u00f3n de eventos", "BackDevices_DBTools_ImportCSV": "Los dispositivos del archivo CSV han sido importados correctamente.", - "BackDevices_DBTools_ImportCSVError": "El archivo CSV no pudo ser importado. Asegúrate de que el formato es correcto.", + "BackDevices_DBTools_ImportCSVError": "El archivo CSV no pudo ser importado. Aseg\u00farate de que el formato es correcto.", "BackDevices_DBTools_ImportCSVMissing": "El archivo CSV no se pudo encontrar en /config/devices.csv.", - "BackDevices_DBTools_Purge": "Las copias de seguridad más antiguas fueron eliminadas", - "BackDevices_DBTools_UpdDev": "Dispositivo actualizado con éxito", + "BackDevices_DBTools_Purge": "Las copias de seguridad m\u00e1s antiguas fueron eliminadas", + "BackDevices_DBTools_UpdDev": "Dispositivo actualizado con \u00e9xito", "BackDevices_DBTools_UpdDevError": "Error al actualizar el dispositivo", "BackDevices_DBTools_Upgrade": "Base de datos actualizada correctamente", - "BackDevices_DBTools_UpgradeError": "Falló la actualización de la base de datos", - "BackDevices_Device_UpdDevError": "Fallo al actualizar dispositivos, pruebe de nuevo más tarde. La base de datos probablemente esté bloqueada por una tarea en curso.", + "BackDevices_DBTools_UpgradeError": "Fall\u00f3 la actualizaci\u00f3n de la base de datos", + "BackDevices_Device_UpdDevError": "Fallo al actualizar dispositivos, pruebe de nuevo m\u00e1s tarde. La base de datos probablemente est\u00e9 bloqueada por una tarea en curso.", "BackDevices_Restore_CopError": "La base de datos original no se pudo guardar.", - "BackDevices_Restore_Failed": "La restauración falló. Restaurar la copia de seguridad manualmente.", - "BackDevices_Restore_okay": "Restauración ejecutado con éxito.", + "BackDevices_Restore_Failed": "La restauraci\u00f3n fall\u00f3. Restaurar la copia de seguridad manualmente.", + "BackDevices_Restore_okay": "Restauraci\u00f3n ejecutado con \u00e9xito.", "BackDevices_darkmode_disabled": "Darkmode Desactivado", "BackDevices_darkmode_enabled": "Darkmode Activado", - "DAYS_TO_KEEP_EVENTS_description": "Esta es una configuración de mantenimiento. Esto especifica el número de días de entradas de eventos que se guardarán. Todos los eventos anteriores se eliminarán periódicamente.", + "DAYS_TO_KEEP_EVENTS_description": "Esta es una configuraci\u00f3n de mantenimiento. Esto especifica el n\u00famero de d\u00edas de entradas de eventos que se guardar\u00e1n. Todos los eventos anteriores se eliminar\u00e1n peri\u00f3dicamente.", "DAYS_TO_KEEP_EVENTS_name": "Eliminar eventos anteriores a", "DevDetail_Copy_Device_Title": " Copiar detalles del dispositivo", - "DevDetail_Copy_Device_Tooltip": "Copiar detalles del dispositivo de la lista desplegable. Todo en esta página se sobrescribirá", + "DevDetail_Copy_Device_Tooltip": "Copiar detalles del dispositivo de la lista desplegable. Todo en esta p\u00e1gina se sobrescribir\u00e1", "DevDetail_EveandAl_AlertAllEvents": "Alerta a todos los eventos", - "DevDetail_EveandAl_AlertDown": "Alerta de caída", + "DevDetail_EveandAl_AlertDown": "Alerta de ca\u00edda", "DevDetail_EveandAl_Archived": "Archivada", "DevDetail_EveandAl_NewDevice": "Nuevo dispositivo", - "DevDetail_EveandAl_NewDevice_Tooltip": "Mostrará el estado Nuevo para el dispositivo y lo incluirá en las listas cuando el filtro Nuevos dispositivos esté activo. No afecta a las notificaciones.", + "DevDetail_EveandAl_NewDevice_Tooltip": "Mostrar\u00e1 el estado Nuevo para el dispositivo y lo incluir\u00e1 en las listas cuando el filtro Nuevos dispositivos est\u00e9 activo. No afecta a las notificaciones.", "DevDetail_EveandAl_RandomMAC": "MAC al azar", "DevDetail_EveandAl_ScanCycle": "Ciclo de escaneo", "DevDetail_EveandAl_ScanCycle_a": "Escanear Dispositivo", "DevDetail_EveandAl_ScanCycle_z": "No Escanear Dispositivo", "DevDetail_EveandAl_Skip": "Omitir notificaciones repetidas durante", - "DevDetail_EveandAl_Title": " Configuración de eventos y alertas", - "DevDetail_Events_CheckBox": "Ocultar eventos de conexión", - "DevDetail_GoToNetworkNode": "Navegar a la página de Internet del nodo seleccionado.", + "DevDetail_EveandAl_Title": " Configuraci\u00f3n de eventos y alertas", + "DevDetail_Events_CheckBox": "Ocultar eventos de conexi\u00f3n", + "DevDetail_GoToNetworkNode": "Navegar a la p\u00e1gina de Internet del nodo seleccionado.", "DevDetail_Icon": "Icono", "DevDetail_Icon_Descr": "Ingrese un nombre de icono de fuente awesome sin el prefijo fa- o con clase completa, por ejemplo: fa fa-skin fa-apple.", "DevDetail_Loading": "Cargando ...", "DevDetail_MainInfo_Comments": "Comentario", "DevDetail_MainInfo_Favorite": "Favorito", "DevDetail_MainInfo_Group": "Grupo", - "DevDetail_MainInfo_Location": "Ubicación", + "DevDetail_MainInfo_Location": "Ubicaci\u00f3n", "DevDetail_MainInfo_Name": "Nombre", "DevDetail_MainInfo_Network": " Nodo (MAC)", "DevDetail_MainInfo_Network_Port": " Puerto de Red HW", "DevDetail_MainInfo_Network_Title": " Red", "DevDetail_MainInfo_Owner": "Propietario", - "DevDetail_MainInfo_Title": " Información principal", + "DevDetail_MainInfo_Title": " Informaci\u00f3n principal", "DevDetail_MainInfo_Type": "Tipo", "DevDetail_MainInfo_Vendor": "Proveedor", "DevDetail_MainInfo_mac": "MAC", - "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_Node_hover": "Seleccione el dispositivo de red principal al que est\u00e1 conectado el dispositivo actual para completar el \u00e1rbol de Red.", + "DevDetail_Network_Port_hover": "El puerto al que est\u00e1 conectado este dispositivo en el dispositivo de red principal. Si se deja vac\u00edo, se muestra un icono de wifi en el \u00e1rbol de Red.", "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 Configuración para obtener más información", + "DevDetail_Nmap_Scans_desc": "Aqu\u00ed puede ejecutar escaneos NMAP manuales. Tambi\u00e9n puede programar escaneos NMAP autom\u00e1ticos regulares a trav\u00e9s del complemento Servicios y puertos (NMAP). Dir\u00edgete a Configuraci\u00f3n para obtener m\u00e1s informaci\u00f3n", "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_buttonDetail": "Escaneo detallado", - "DevDetail_Nmap_buttonDetail_text": "Escaneo detallado: escaneo predeterminado con detección de sistema operativo habilitado, detección de versiones, escaneo de script y traceroute (hasta 30 segundos o más)", - "DevDetail_Nmap_buttonFast": "Exploración rápida", - "DevDetail_Nmap_buttonFast_text": "Escaneo rápido: escanee menos puertos (100) que el escaneo predeterminado (unos pocos segundos)", - "DevDetail_Nmap_buttonSkipDiscovery": "Omitir detección de host", - "DevDetail_Nmap_buttonSkipDiscovery_text": "Omitir detección de host (-Pn opción): Escaneo predeterminado sin detección de host", - "DevDetail_Nmap_resultsLink": "Puedes abandonar esta página después de empezar un escaneo. Los resultados también estarán disponibles en el archivo app_front.log.", - "DevDetail_Owner_hover": "¿Quién es el propietario de este dispositivo? Campo de texto libre.", - "DevDetail_Periodselect_All": "Toda la información", + "DevDetail_Nmap_buttonDetail_text": "Escaneo detallado: escaneo predeterminado con detecci\u00f3n de sistema operativo habilitado, detecci\u00f3n de versiones, escaneo de script y traceroute (hasta 30 segundos o m\u00e1s)", + "DevDetail_Nmap_buttonFast": "Exploraci\u00f3n r\u00e1pida", + "DevDetail_Nmap_buttonFast_text": "Escaneo r\u00e1pido: escanee menos puertos (100) que el escaneo predeterminado (unos pocos segundos)", + "DevDetail_Nmap_buttonSkipDiscovery": "Omitir detecci\u00f3n de host", + "DevDetail_Nmap_buttonSkipDiscovery_text": "Omitir detecci\u00f3n de host (-Pn opci\u00f3n): Escaneo predeterminado sin detecci\u00f3n de host", + "DevDetail_Nmap_resultsLink": "Puedes abandonar esta p\u00e1gina despu\u00e9s de empezar un escaneo. Los resultados tambi\u00e9n estar\u00e1n disponibles en el archivo app_front.log.", + "DevDetail_Owner_hover": "\u00bfQui\u00e9n es el propietario de este dispositivo? Campo de texto libre.", + "DevDetail_Periodselect_All": "Toda la informaci\u00f3n", "DevDetail_Periodselect_LastMonth": "El mes pasado", "DevDetail_Periodselect_LastWeek": "La semana pasada", - "DevDetail_Periodselect_LastYear": "El año pasado", + "DevDetail_Periodselect_LastYear": "El a\u00f1o pasado", "DevDetail_Periodselect_today": "Hoy", - "DevDetail_Run_Actions_Title": " Ejecutar acción en el dispositivo", - "DevDetail_Run_Actions_Tooltip": "Ejecutar la acción del desplegable sobre el dispositivo actual.", - "DevDetail_SessionInfo_FirstSession": "1ra. sesión", - "DevDetail_SessionInfo_LastIP": "Última IP", - "DevDetail_SessionInfo_LastSession": "Última sesión", - "DevDetail_SessionInfo_StaticIP": "IP estática", + "DevDetail_Run_Actions_Title": " Ejecutar acci\u00f3n en el dispositivo", + "DevDetail_Run_Actions_Tooltip": "Ejecutar la acci\u00f3n del desplegable sobre el dispositivo actual.", + "DevDetail_SessionInfo_FirstSession": "1ra. sesi\u00f3n", + "DevDetail_SessionInfo_LastIP": "\u00daltima IP", + "DevDetail_SessionInfo_LastSession": "\u00daltima sesi\u00f3n", + "DevDetail_SessionInfo_StaticIP": "IP est\u00e1tica", "DevDetail_SessionInfo_Status": "Estado", - "DevDetail_SessionInfo_Title": " Información de sesión", - "DevDetail_SessionTable_Additionalinfo": "Información adicional", - "DevDetail_SessionTable_Connection": "Conexión", - "DevDetail_SessionTable_Disconnection": "Desconexión", - "DevDetail_SessionTable_Duration": "Duración", - "DevDetail_SessionTable_IP": "Dirección IP", + "DevDetail_SessionInfo_Title": " Informaci\u00f3n de sesi\u00f3n", + "DevDetail_SessionTable_Additionalinfo": "Informaci\u00f3n adicional", + "DevDetail_SessionTable_Connection": "Conexi\u00f3n", + "DevDetail_SessionTable_Disconnection": "Desconexi\u00f3n", + "DevDetail_SessionTable_Duration": "Duraci\u00f3n", + "DevDetail_SessionTable_IP": "Direcci\u00f3n IP", "DevDetail_SessionTable_Order": "Ordenar", "DevDetail_Shortcut_CurrentStatus": "Estado actual", - "DevDetail_Shortcut_DownAlerts": "Alerta(s) de caída(s)", + "DevDetail_Shortcut_DownAlerts": "Alerta(s) de ca\u00edda(s)", "DevDetail_Shortcut_Presence": "Historial", "DevDetail_Shortcut_Sessions": "Sesiones", "DevDetail_Tab_Details": " Detalles", @@ -141,77 +141,77 @@ "DevDetail_Tab_EventsTableDate": "Fecha", "DevDetail_Tab_EventsTableEvent": "Tipo de evento", "DevDetail_Tab_EventsTableIP": "IP", - "DevDetail_Tab_EventsTableInfo": "Información adicional", + "DevDetail_Tab_EventsTableInfo": "Informaci\u00f3n adicional", "DevDetail_Tab_Nmap": " Nmap", - "DevDetail_Tab_NmapEmpty": "Ningún puerto detectado en este dispositivo con Nmap.", + "DevDetail_Tab_NmapEmpty": "Ning\u00fan puerto detectado en este dispositivo con Nmap.", "DevDetail_Tab_NmapTableExtra": "Extra", "DevDetail_Tab_NmapTableHeader": "Resultados del escaneo programado", - "DevDetail_Tab_NmapTableIndex": "Índice", + "DevDetail_Tab_NmapTableIndex": "\u00cdndice", "DevDetail_Tab_NmapTablePort": "Puerto", "DevDetail_Tab_NmapTableService": "Servicio", "DevDetail_Tab_NmapTableState": "Estado", - "DevDetail_Tab_NmapTableText": "Establece la programación en los Ajustes", + "DevDetail_Tab_NmapTableText": "Establece la programaci\u00f3n en los Ajustes", "DevDetail_Tab_NmapTableTime": "Tiempo", "DevDetail_Tab_Plugins": " Plugins", "DevDetail_Tab_Presence": " Historial", "DevDetail_Tab_Sessions": " Sesiones", "DevDetail_Tab_Tools": " Herramientas", - "DevDetail_Tab_Tools_Internet_Info_Description": "La herramienta de información de internet muestra información sobre la conexión a Internet, como dirección IP, ciudad, país, código de área y zona horaria.", + "DevDetail_Tab_Tools_Internet_Info_Description": "La herramienta de informaci\u00f3n de internet muestra informaci\u00f3n sobre la conexi\u00f3n a Internet, como direcci\u00f3n IP, ciudad, pa\u00eds, c\u00f3digo de \u00e1rea y zona horaria.", "DevDetail_Tab_Tools_Internet_Info_Error": "Se ha producido un error", - "DevDetail_Tab_Tools_Internet_Info_Start": "Iniciar información de Internet", - "DevDetail_Tab_Tools_Internet_Info_Title": "Información de Internet", - "DevDetail_Tab_Tools_Nslookup_Description": "Nslookup es una herramienta de línea de comandos que se utiliza para realizar consultas al Sistema de nombres de dominio (DNS). El DNS es un sistema que traduce nombres de dominio, como www.google.com, a direcciones IP, como 172.217.0.142.", - "DevDetail_Tab_Tools_Nslookup_Error": "Error: la dirección IP no es válida", + "DevDetail_Tab_Tools_Internet_Info_Start": "Iniciar informaci\u00f3n de Internet", + "DevDetail_Tab_Tools_Internet_Info_Title": "Informaci\u00f3n de Internet", + "DevDetail_Tab_Tools_Nslookup_Description": "Nslookup es una herramienta de l\u00ednea de comandos que se utiliza para realizar consultas al Sistema de nombres de dominio (DNS). El DNS es un sistema que traduce nombres de dominio, como www.google.com, a direcciones IP, como 172.217.0.142.", + "DevDetail_Tab_Tools_Nslookup_Error": "Error: la direcci\u00f3n IP no es v\u00e1lida", "DevDetail_Tab_Tools_Nslookup_Start": "Iniciar Nslookup", "DevDetail_Tab_Tools_Nslookup_Title": "Nslookup", - "DevDetail_Tab_Tools_Speedtest_Description": "La herramienta Speedtest mide la velocidad de descarga, la velocidad de subida y la latencia de la conexión a Internet.", + "DevDetail_Tab_Tools_Speedtest_Description": "La herramienta Speedtest mide la velocidad de descarga, la velocidad de subida y la latencia de la conexi\u00f3n a Internet.", "DevDetail_Tab_Tools_Speedtest_Start": "Iniciar Speedtest", "DevDetail_Tab_Tools_Speedtest_Title": "Prueba Speedtest", - "DevDetail_Tab_Tools_Traceroute_Description": "Traceroute es un comando de diagnóstico de red que se utiliza para rastrear la ruta que toman los paquetes de datos desde un host a otro.

    El comando utiliza el protocolo de mensajes de control de Internet (ICMP) para enviar paquetes a los nodos intermedios en la ruta, cada nodo intermedio responde con un paquete ICMP de tiempo de vida agotado (TTL agotado).

    La salida del comando traceroute muestra la dirección IP de cada nodo intermedio en la ruta.

    El comando traceroute se puede usar para diagnosticar problemas de red, como retrasos, pérdida de paquetes y rutas bloqueadas.

    También se puede usar para identificar la ubicación de un nodo intermedio en una red.", - "DevDetail_Tab_Tools_Traceroute_Error": "Error: la dirección IP no es válida", + "DevDetail_Tab_Tools_Traceroute_Description": "Traceroute es un comando de diagn\u00f3stico de red que se utiliza para rastrear la ruta que toman los paquetes de datos desde un host a otro.

    El comando utiliza el protocolo de mensajes de control de Internet (ICMP) para enviar paquetes a los nodos intermedios en la ruta, cada nodo intermedio responde con un paquete ICMP de tiempo de vida agotado (TTL agotado).

    La salida del comando traceroute muestra la direcci\u00f3n IP de cada nodo intermedio en la ruta.

    El comando traceroute se puede usar para diagnosticar problemas de red, como retrasos, p\u00e9rdida de paquetes y rutas bloqueadas.

    Tambi\u00e9n se puede usar para identificar la ubicaci\u00f3n de un nodo intermedio en una red.", + "DevDetail_Tab_Tools_Traceroute_Error": "Error: la direcci\u00f3n IP no es v\u00e1lida", "DevDetail_Tab_Tools_Traceroute_Start": "Iniciar Traceroute", "DevDetail_Tab_Tools_Traceroute_Title": "Traceroute", "DevDetail_Tools_WOL": "Enviar comando WOL a ", "DevDetail_Tools_WOL_noti": "Wake-on-LAN", - "DevDetail_Tools_WOL_noti_text": "El comando de Wake-on-LAN en enviado a la dirección de escucha. Si el dispositivo no está en la misma subred/vlan que NetAlertX, el dispositivo no responderá.", - "DevDetail_Type_hover": "El tipo de dispositivo. Si selecciona cualquiera de los dispositivos de la red predefinidos (por ejemplo: AP, Firewall, enrutador, conmutador...), aparecerán en la configuración del árbol de redes como posibles nodos de la red principal.", - "DevDetail_Vendor_hover": "El proveedor debe ser detectado automáticamente. Puede sobrescribir o agregar su valor personalizado.", + "DevDetail_Tools_WOL_noti_text": "El comando de Wake-on-LAN en enviado a la direcci\u00f3n de escucha. Si el dispositivo no est\u00e1 en la misma subred/vlan que NetAlertX, el dispositivo no responder\u00e1.", + "DevDetail_Type_hover": "El tipo de dispositivo. Si selecciona cualquiera de los dispositivos de la red predefinidos (por ejemplo: AP, Firewall, enrutador, conmutador...), aparecer\u00e1n en la configuraci\u00f3n del \u00e1rbol de redes como posibles nodos de la red principal.", + "DevDetail_Vendor_hover": "El proveedor debe ser detectado autom\u00e1ticamente. Puede sobrescribir o agregar su valor personalizado.", "DevDetail_WOL_Title": " Wake-on-LAN", - "DevDetail_button_AddIcon": "Añadir un nuevo icono", - "DevDetail_button_AddIcon_Help": "Pegue una etiqueta html SVG o un icono de etiqueta html Font Awesome. Lea los documentos Iconos para obtener más información.", - "DevDetail_button_AddIcon_Tooltip": "Añade un nuevo icono a este dispositivo que aún no está disponible en el menú desplegable.", + "DevDetail_button_AddIcon": "A\u00f1adir un nuevo icono", + "DevDetail_button_AddIcon_Help": "Pegue una etiqueta html SVG o un icono de etiqueta html Font Awesome. Lea los documentos Iconos para obtener m\u00e1s informaci\u00f3n.", + "DevDetail_button_AddIcon_Tooltip": "A\u00f1ade un nuevo icono a este dispositivo que a\u00fan no est\u00e1 disponible en el men\u00fa desplegable.", "DevDetail_button_Delete": "Eliminar dispositivo", "DevDetail_button_DeleteEvents": "Eliminar eventos", - "DevDetail_button_DeleteEvents_Warning": "¿Desea eliminar todos los eventos de este dispositivo?

    (se eliminarán el Historial de eventos y las Sesiones, y puede ayudar en el caso de notificaciones constantes)", + "DevDetail_button_DeleteEvents_Warning": "\u00bfDesea eliminar todos los eventos de este dispositivo?

    (se eliminar\u00e1n el Historial de eventos y las Sesiones, y puede ayudar en el caso de notificaciones constantes)", "DevDetail_button_OverwriteIcons": "Sobreescribir iconos", "DevDetail_button_OverwriteIcons_Tooltip": "Sobreescribir los iconos de todos los dispositivos con el mismo tipo", - "DevDetail_button_OverwriteIcons_Warning": "¿Sobreescribir todos los iconos de todos los dispositivos con el mismo tipo que el dispositivo actual?", + "DevDetail_button_OverwriteIcons_Warning": "\u00bfSobreescribir todos los iconos de todos los dispositivos con el mismo tipo que el dispositivo actual?", "DevDetail_button_Reset": "Restablecer cambios", "DevDetail_button_Save": "Guardar", - "Device_MultiEdit": "Edición múltiple", - "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 (haga clic para descargar ). Lea cómo recuperar dispositivos de este archivo en la documentación de Copia de seguridad.", + "Device_MultiEdit": "Edici\u00f3n m\u00faltiple", + "Device_MultiEdit_Backup": "Tenga cuidado, ingresar valores incorrectos o romper\u00e1 su configuraci\u00f3n. Por favor, haga una copia de seguridad de su base de datos o de la configuraci\u00f3n de los dispositivos primero (haga clic para descargar ). Lea c\u00f3mo recuperar dispositivos de este archivo en la documentaci\u00f3n de Copia de seguridad.", "Device_MultiEdit_Fields": "Editar campos:", "Device_MultiEdit_MassActions": "Acciones masivas:", - "Device_MultiEdit_Tooltip": "Cuidado. Al hacer clic se aplicará el valor de la izquierda a todos los dispositivos seleccionados anteriormente.", - "Device_Searchbox": "Búsqueda", + "Device_MultiEdit_Tooltip": "Cuidado. Al hacer clic se aplicar\u00e1 el valor de la izquierda a todos los dispositivos seleccionados anteriormente.", + "Device_Searchbox": "B\u00fasqueda", "Device_Shortcut_AllDevices": "Mis dispositivos", "Device_Shortcut_Archived": "Archivado(s)", "Device_Shortcut_Connected": "Conectado(s)", "Device_Shortcut_Devices": "Dispositivos", - "Device_Shortcut_DownAlerts": "Caído y sin conexión", - "Device_Shortcut_DownOnly": "Caído", + "Device_Shortcut_DownAlerts": "Ca\u00eddo y sin conexi\u00f3n", + "Device_Shortcut_DownOnly": "Ca\u00eddo", "Device_Shortcut_Favorites": "Favorito(s)", "Device_Shortcut_NewDevices": "Nuevo(s)", "Device_Shortcut_OnlineChart": "Presencia del dispositivo a lo largo del tiempo", "Device_TableHead_Connected_Devices": "Conexiones", "Device_TableHead_Favorite": "Favorito", - "Device_TableHead_FirstSession": "1ra. sesión", + "Device_TableHead_FirstSession": "1ra. sesi\u00f3n", "Device_TableHead_Group": "Grupo", "Device_TableHead_Icon": "Icon", - "Device_TableHead_LastIP": "Última IP", - "Device_TableHead_LastIPOrder": "Última orden de IP", - "Device_TableHead_LastSession": "Última sesión", - "Device_TableHead_Location": "Ubicación", + "Device_TableHead_LastIP": "\u00daltima IP", + "Device_TableHead_LastIPOrder": "\u00daltima orden de IP", + "Device_TableHead_LastSession": "\u00daltima sesi\u00f3n", + "Device_TableHead_Location": "Ubicaci\u00f3n", "Device_TableHead_MAC": "MAC aleatoria", "Device_TableHead_MAC_full": "MAC completa", "Device_TableHead_Name": "Nombre", @@ -220,10 +220,10 @@ "Device_TableHead_Port": "Puerto", "Device_TableHead_RowID": "Row ID", "Device_TableHead_Rowid": "Row ID", - "Device_TableHead_Status": "Situación", + "Device_TableHead_Status": "Situaci\u00f3n", "Device_TableHead_Type": "Tipo", "Device_TableHead_Vendor": "Fabricante", - "Device_Table_Not_Network_Device": "No está configurado como dispositivo de red", + "Device_Table_Not_Network_Device": "No est\u00e1 configurado como dispositivo de red", "Device_Table_info": "Mostrando el INICIO y el FINAL de TODAS las entradas", "Device_Table_nav_next": "Siguiente", "Device_Table_nav_prev": "Anterior", @@ -232,63 +232,64 @@ "Device_Title": "Dispositivos", "Donations_Others": "Otros", "Donations_Platforms": "Plataforma de patrocinadores", - "Donations_Text": "¡Hola! 👋
    Gracias por hacer clic en este elemento 😅 del menú

    , estoy tratando de recolectar algunas donaciones para mejorar el software. Además, me ayudaría a no quemarse, por lo que puedo apoyar esta aplicación por más tiempo. Cualquier pequeño patrocinio (recurrente o no) me hace querer esforzarme más en esta aplicación.
    Me encantaría acortar mi semana de trabajo y en el tiempo que me queda centrarme por completo en NetAlertX. Obtendrías más funcionalidad, una aplicación más pulida y menos errores.

    Gracias por leer, agradezco cualquier apoyo ❤🙏

    TL; DR: Al apoyarme, obtienes:

    • Actualizaciones periódicas para mantener tus datos y tu familia seguros 🔄
    • Menos errores 🐛🔫
    • Mejor y más funcionalidad➕
    • No me quemo 🔥🤯
    • Lanzamientos 💨menos apresurados
    • Mejores documentos📚
    • Soporte más rápido y mejor con problemas 🆘

    📧Envíame un correo electrónico a jokob@duck.com si quieres ponerte en contacto o si debo añadir otras plataformas de patrocinio.
    ", + "Donations_Text": "\u00a1Hola! \ud83d\udc4b
    Gracias por hacer clic en este elemento \ud83d\ude05 del men\u00fa

    , estoy tratando de recolectar algunas donaciones para mejorar el software. Adem\u00e1s, me ayudar\u00eda a no quemarse, por lo que puedo apoyar esta aplicaci\u00f3n por m\u00e1s tiempo. Cualquier peque\u00f1o patrocinio (recurrente o no) me hace querer esforzarme m\u00e1s en esta aplicaci\u00f3n.
    Me encantar\u00eda acortar mi semana de trabajo y en el tiempo que me queda centrarme por completo en NetAlertX. Obtendr\u00edas m\u00e1s funcionalidad, una aplicaci\u00f3n m\u00e1s pulida y menos errores.

    Gracias por leer, agradezco cualquier apoyo \u2764\ud83d\ude4f

    TL; DR: Al apoyarme, obtienes:

    • Actualizaciones peri\u00f3dicas para mantener tus datos y tu familia seguros \ud83d\udd04
    • Menos errores \ud83d\udc1b\ud83d\udd2b
    • Mejor y m\u00e1s funcionalidad\u2795
    • No me quemo \ud83d\udd25\ud83e\udd2f
    • Lanzamientos \ud83d\udca8menos apresurados
    • Mejores documentos\ud83d\udcda
    • Soporte m\u00e1s r\u00e1pido y mejor con problemas \ud83c\udd98

    \ud83d\udce7Env\u00edame un correo electr\u00f3nico a jokob@duck.com si quieres ponerte en contacto o si debo a\u00f1adir otras plataformas de patrocinio.
    ", "Donations_Title": "Donaciones", - "ENABLE_PLUGINS_description": "Habilita la funcionalidad de los complementos. Cargar los complementos requiere más recursos de hardware, así que quizás quieras desactivarlo en hardware poco potente.", + "ENABLE_PLUGINS_description": "Habilita la funcionalidad de los complementos. Cargar los complementos requiere m\u00e1s recursos de hardware, as\u00ed que quiz\u00e1s quieras desactivarlo en hardware poco potente.", "ENABLE_PLUGINS_name": "Habilitar complementos", "Email_display_name": "Email", "Email_icon": "", "Events_Loading": "Cargando...", - "Events_Periodselect_All": "Toda la información", + "Events_Periodselect_All": "Toda la informaci\u00f3n", "Events_Periodselect_LastMonth": "El mes pasado", "Events_Periodselect_LastWeek": "La semana pasada", - "Events_Periodselect_LastYear": "El año pasado", + "Events_Periodselect_LastYear": "El a\u00f1o pasado", "Events_Periodselect_today": "Hoy", - "Events_Searchbox": "Búsqueda", + "Events_Searchbox": "B\u00fasqueda", "Events_Shortcut_AllEvents": "Todos los eventos", - "Events_Shortcut_DownAlerts": "Alerta(s) de caída(s)", + "Events_Shortcut_DownAlerts": "Alerta(s) de ca\u00edda(s)", "Events_Shortcut_Events": "Eventos", "Events_Shortcut_MissSessions": "Sesiones faltantes", "Events_Shortcut_NewDevices": "Nuevo(s)", "Events_Shortcut_Sessions": "Sesiones", "Events_Shortcut_VoidSessions": "Sesiones anuladas", - "Events_TableHead_AdditionalInfo": "Información adicional", - "Events_TableHead_Connection": "Conexión", + "Events_TableHead_AdditionalInfo": "Informaci\u00f3n adicional", + "Events_TableHead_Connection": "Conexi\u00f3n", "Events_TableHead_Date": "Fecha", "Events_TableHead_Device": "Dispositivo", - "Events_TableHead_Disconnection": "Desconexión", - "Events_TableHead_Duration": "Duración", - "Events_TableHead_DurationOrder": "Orden de duración", + "Events_TableHead_Disconnection": "Desconexi\u00f3n", + "Events_TableHead_Duration": "Duraci\u00f3n", + "Events_TableHead_DurationOrder": "Orden de duraci\u00f3n", "Events_TableHead_EventType": "Tipo de evento", - "Events_TableHead_IP": "Dirección IP", + "Events_TableHead_IP": "Direcci\u00f3n IP", "Events_TableHead_IPOrder": "Orden de IP", "Events_TableHead_Order": "Ordenar", "Events_TableHead_Owner": "Propietario", "Events_Table_info": "Mostrando el INICIO y el FINAL de TODAS las entradas", "Events_Table_nav_next": "Siguiente", "Events_Table_nav_prev": "Anterior", - "Events_Tablelenght": "Mostrando entradas del MENÚ", + "Events_Tablelenght": "Mostrando entradas del MEN\u00da", "Events_Tablelenght_all": "Todos", "Events_Title": "Eventos", - "Gen_Action": "Acción", - "Gen_Add": "Añadir", - "Gen_Add_All": "Añadir todo", - "Gen_AreYouSure": "¿Estás seguro?", + "Gen_Action": "Acci\u00f3n", + "Gen_Add": "A\u00f1adir", + "Gen_Add_All": "A\u00f1adir todo", + "Gen_AreYouSure": "\u00bfEst\u00e1s seguro?", "Gen_Backup": "Ejecutar copia de seguridad", "Gen_Cancel": "Cancelar", "Gen_Copy": "Ejecutar", - "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\u00e1 ejecutando un escaneo.", "Gen_Delete": "Eliminar", "Gen_DeleteAll": "Eliminar todo", "Gen_Error": "Error", "Gen_Filter": "Filtro", - "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\u00e1s tarde.", + "Gen_Offline": "", "Gen_Okay": "Aceptar", "Gen_Purge": "Purgar", - "Gen_ReadDocs": "Lee más en los documentos.", + "Gen_ReadDocs": "Lee m\u00e1s en los documentos.", "Gen_Remove_All": "Quitar todo", - "Gen_Remove_Last": "Quitar el último", - "Gen_Restore": "Ejecutar restauración", + "Gen_Remove_Last": "Quitar el \u00faltimo", + "Gen_Restore": "Ejecutar restauraci\u00f3n", "Gen_Run": "Ejecutar", "Gen_Save": "Guardar", "Gen_Saved": "Guardado", @@ -303,176 +304,176 @@ "Gen_Work_In_Progress": "Trabajo en curso, un buen momento para hacer comentarios en https://github.com/jokob-sk/NetAlertX/issues", "General_display_name": "General", "General_icon": "", - "HRS_TO_KEEP_NEWDEV_description": "Esta es una configuración de mantenimiento. Si está habilitado (0 está deshabilitado), los dispositivos marcados como Nuevo dispositivo se eliminarán si su Primera sesión el tiempo era anterior a las horas especificadas en esta configuración. Utilice esta configuración si desea eliminar automáticamente Nuevos dispositivos después de X horas.", + "HRS_TO_KEEP_NEWDEV_description": "Esta es una configuraci\u00f3n de mantenimiento. Si est\u00e1 habilitado (0 est\u00e1 deshabilitado), los dispositivos marcados como Nuevo dispositivo se eliminar\u00e1n si su Primera sesi\u00f3n el tiempo era anterior a las horas especificadas en esta configuraci\u00f3n. Utilice esta configuraci\u00f3n si desea eliminar autom\u00e1ticamente Nuevos dispositivos despu\u00e9s de X horas.", "HRS_TO_KEEP_NEWDEV_name": "Guardar nuevos dispositivos para", "HelpFAQ_Cat_Detail": "Detalles", - "HelpFAQ_Cat_Detail_300_head": "¿Qué significa? ", - "HelpFAQ_Cat_Detail_300_text_a": "significa un dispositivo de red (un dispositivo del tipo AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router,Adaptador LAN USB, Adaptador WIFI USB o Internet). Los tipos personalizados pueden añadirse mediante el ajuste NETWORK_DEVICE_TYPES.", - "HelpFAQ_Cat_Detail_300_text_b": "designa el número de puerto en el que el dispositivo actualmente editado está conectado a este dispositivo de red. Lea esta guía para obtener más información.", - "HelpFAQ_Cat_Detail_301_head_a": "¿Cuándo está escaneando ahora? En ", - "HelpFAQ_Cat_Detail_301_head_b": " dice 1min pero el gráfico muestra intervalos de 5min.", - "HelpFAQ_Cat_Detail_301_text": "El intervalo de tiempo entre los escaneos está definido por el \"Cronjob\", que está fijado en 5min por defecto. La designación \"1min\" se refiere a la duración prevista de la exploración. Dependiendo de la configuración de la red, este tiempo puede variar. Para editar el cronjob, puedes utilizar el siguiente comando en el terminal/consola crontab -ey cambiar el intervalo.", - "HelpFAQ_Cat_Detail_302_head_a": "¿Qué significa? ", - "HelpFAQ_Cat_Detail_302_head_b": "¿y por qué no puedo seleccionarlo?", - "HelpFAQ_Cat_Detail_302_text": "Algunos dispositivos modernos generan direcciones MAC aleatorias por razones de privacidad, que ya no pueden asociarse a ningún fabricante y que vuelven a cambiar con cada nueva conexión. NetAlertX detecta si se trata de una dirección MAC aleatoria y activa este \"campo\" automáticamente. Para deshabilitar este comportamiento, debe buscar en su dispositivo cómo deshabilitar la aleatorización de direcciones MAC.", - "HelpFAQ_Cat_Detail_303_head": "¿Qué es Nmap y para qué sirve?", - "HelpFAQ_Cat_Detail_303_text": "Nmap es un escáner de red con múltiples capacidades.
    Cuando aparece un nuevo dispositivo en su lista, tiene la posibilidad de obtener información más detallada sobre el dispositivo a través del escaneo de Nmap.", - "HelpFAQ_Cat_Device_200_head": "Tengo dispositivos en mi lista que no conozco. Después de borrarlos, siempre vuelven a aparecer.", - "HelpFAQ_Cat_Device_200_text": "Si utiliza Pi-hole, tenga en cuenta que NetAlertX recupera información de Pi-hole. Ponga en pausa NetAlertX, vaya a la página de configuración de Pi-hole y elimine la concesión DHCP si es necesario. Luego, también en Pi-hole, revise en Herramientas -> Red para ver si puede encontrar los hosts recurrentes allí. Si es así, elimínelos también allí. Ahora puede volver a iniciar NetAlertX. Ahora el dispositivo(s) no debería aparecer más.", + "HelpFAQ_Cat_Detail_300_head": "\u00bfQu\u00e9 significa? ", + "HelpFAQ_Cat_Detail_300_text_a": "significa un dispositivo de red (un dispositivo del tipo AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router,Adaptador LAN USB, Adaptador WIFI USB o Internet). Los tipos personalizados pueden a\u00f1adirse mediante el ajuste NETWORK_DEVICE_TYPES.", + "HelpFAQ_Cat_Detail_300_text_b": "designa el n\u00famero de puerto en el que el dispositivo actualmente editado est\u00e1 conectado a este dispositivo de red. Lea esta gu\u00eda para obtener m\u00e1s informaci\u00f3n.", + "HelpFAQ_Cat_Detail_301_head_a": "\u00bfCu\u00e1ndo est\u00e1 escaneando ahora? En ", + "HelpFAQ_Cat_Detail_301_head_b": " dice 1min pero el gr\u00e1fico muestra intervalos de 5min.", + "HelpFAQ_Cat_Detail_301_text": "El intervalo de tiempo entre los escaneos est\u00e1 definido por el \"Cronjob\", que est\u00e1 fijado en 5min por defecto. La designaci\u00f3n \"1min\" se refiere a la duraci\u00f3n prevista de la exploraci\u00f3n. Dependiendo de la configuraci\u00f3n de la red, este tiempo puede variar. Para editar el cronjob, puedes utilizar el siguiente comando en el terminal/consola crontab -ey cambiar el intervalo.", + "HelpFAQ_Cat_Detail_302_head_a": "\u00bfQu\u00e9 significa? ", + "HelpFAQ_Cat_Detail_302_head_b": "\u00bfy por qu\u00e9 no puedo seleccionarlo?", + "HelpFAQ_Cat_Detail_302_text": "Algunos dispositivos modernos generan direcciones MAC aleatorias por razones de privacidad, que ya no pueden asociarse a ning\u00fan fabricante y que vuelven a cambiar con cada nueva conexi\u00f3n. NetAlertX detecta si se trata de una direcci\u00f3n MAC aleatoria y activa este \"campo\" autom\u00e1ticamente. Para deshabilitar este comportamiento, debe buscar en su dispositivo c\u00f3mo deshabilitar la aleatorizaci\u00f3n de direcciones MAC.", + "HelpFAQ_Cat_Detail_303_head": "\u00bfQu\u00e9 es Nmap y para qu\u00e9 sirve?", + "HelpFAQ_Cat_Detail_303_text": "Nmap es un esc\u00e1ner de red con m\u00faltiples capacidades.
    Cuando aparece un nuevo dispositivo en su lista, tiene la posibilidad de obtener informaci\u00f3n m\u00e1s detallada sobre el dispositivo a trav\u00e9s del escaneo de Nmap.", + "HelpFAQ_Cat_Device_200_head": "Tengo dispositivos en mi lista que no conozco. Despu\u00e9s de borrarlos, siempre vuelven a aparecer.", + "HelpFAQ_Cat_Device_200_text": "Si utiliza Pi-hole, tenga en cuenta que NetAlertX recupera informaci\u00f3n de Pi-hole. Ponga en pausa NetAlertX, vaya a la p\u00e1gina de configuraci\u00f3n de Pi-hole y elimine la concesi\u00f3n DHCP si es necesario. Luego, tambi\u00e9n en Pi-hole, revise en Herramientas -> Red para ver si puede encontrar los hosts recurrentes all\u00ed. Si es as\u00ed, elim\u00ednelos tambi\u00e9n all\u00ed. Ahora puede volver a iniciar NetAlertX. Ahora el dispositivo(s) no deber\u00eda aparecer m\u00e1s.", "HelpFAQ_Cat_General": "General", "HelpFAQ_Cat_General_100_head": "El reloj en la parte superior derecha y el tiempo de los eventos/presencia no son correctos (diferencia de tiempo).", - "HelpFAQ_Cat_General_100_text_a": "En su PC, la siguiente zona horaria está configurada para el entorno PHP:", - "HelpFAQ_Cat_General_100_text_b": "Si esta no es la zona horaria en la que se encuentra, debe cambiar la zona horaria en el archivo de configuración de PHP. Puedes encontrarlo en este directorio:", - "HelpFAQ_Cat_General_100_text_c": "Busque en este archivo la entrada \"date.timezone\", elimine el \";\" inicial si es necesario e introduzca la zona horaria deseada. Puede encontrar una lista con las zonas horarias compatibles aquí (Link)", + "HelpFAQ_Cat_General_100_text_a": "En su PC, la siguiente zona horaria est\u00e1 configurada para el entorno PHP:", + "HelpFAQ_Cat_General_100_text_b": "Si esta no es la zona horaria en la que se encuentra, debe cambiar la zona horaria en el archivo de configuraci\u00f3n de PHP. Puedes encontrarlo en este directorio:", + "HelpFAQ_Cat_General_100_text_c": "Busque en este archivo la entrada \"date.timezone\", elimine el \";\" inicial si es necesario e introduzca la zona horaria deseada. Puede encontrar una lista con las zonas horarias compatibles aqu\u00ed (Link)", "HelpFAQ_Cat_General_101_head": "Mi red parece ralentizarse, el streaming se \"congela\".", - "HelpFAQ_Cat_General_101_text": "Es muy posible que los dispositivos de baja potencia alcancen sus límites de rendimiento con la forma en que NetAlertX detecta nuevos dispositivos en la red. Esto se amplifica aún más, si estos dispositivos se comunican con la red a través de WLAN. Las soluciones aquí serían cambiar a una conexión por cable si es posible o, si el dispositivo sólo se va a utilizar durante un período de tiempo limitado, utilizar el arp scan. pausar el arp scan en la página de mantenimiento.", - "HelpFAQ_Cat_General_102_head": "Me aparece el mensaje de que la base de datos es de sólo de lectura.", - "HelpFAQ_Cat_General_102_text": "Compruebe en el directorio NetAlertX si la carpeta de la base de datos (db) tiene asignados los permisos correctos:
    drwxrwx--- 2 (nombre de usuario) www-data
    Si el permiso no es correcto, puede establecerlo de nuevo con los siguientes comandos en la terminal o la consola:
    sudo chgrp -R www-data /app/db
    chmod -R 770 /app/db

    Si la base de datos sigue siendo de sólo lectura, intente reinstalar o restaurar una copia de seguridad de la base de datos desde la página de mantenimiento.", - "HelpFAQ_Cat_General_102docker_head": "(🐳 Solo Docker) Problemas con la base de datos (errores de AJAX, solo lectura, no encontrado)", - "HelpFAQ_Cat_General_102docker_text": "Comprueba que has seguido las instrucciones del dockerfile (la información más actualizada).

    • Descarga la base de datos original desde GitHub.
    • Mapea el archivo app.db ( no carpeta) de arriba a /app/db/app.db (puedes comprobar los ejemplos para más detalles).
    • Si aparecen problemas (errores de AJAX, no se puede escribir a la base de datos, etc,) asegúrate que los permisos están establecidos correctamente. También puedes comprobar los registros en /app/front/log.
    • Para arreglar los problemas de los permisos, puedes probar a crear una copia de seguridad de la base de datos y después restaurarla desde la sección Mantenimiento > Copia de seguridad/Restaurar.
    • Si la base de datos está en modo solo lectura, lo puedes arreglar ejecutando el siguiente comando para establecer el propietario y grupo en el sistema host: docker exec netalertx chown -R www-data:www-data /app/db/app.db.
    ", - "HelpFAQ_Cat_General_103_head": "La página de inicio de sesión no aparece, incluso después de cambiar la contraseña.", - "HelpFAQ_Cat_General_103_text": "Además de la contraseña, el archivo de configuración debe contener /app/config/app.conf además el parámetro PIALERT_WEB_PROTECTION debe ajustarse a True.", - "HelpFAQ_Cat_Network_600_head": "¿Para qué sirve esta sección?", - "HelpFAQ_Cat_Network_600_text": "Esta página debería ofrecerle la posibilidad de asignar los dispositivos de su red. Para ello, puede crear uno o varios conmutadores, WLAN, routers, etc., proporcionarles un número de puerto si es necesario y asignarles dispositivos ya detectados. Esta asignación se realiza en la vista detallada del dispositivo a asignar. Así podrás determinar rápidamente a qué puerto está conectado un host y si está en línea. Lea esta guía para obtener más información.", - "HelpFAQ_Cat_Network_601_head": "¿Hay otros documentos?", - "HelpFAQ_Cat_Network_601_text": "¡Sí, los hay! Marque todos los documentos para más información.", + "HelpFAQ_Cat_General_101_text": "Es muy posible que los dispositivos de baja potencia alcancen sus l\u00edmites de rendimiento con la forma en que NetAlertX detecta nuevos dispositivos en la red. Esto se amplifica a\u00fan m\u00e1s, si estos dispositivos se comunican con la red a trav\u00e9s de WLAN. Las soluciones aqu\u00ed ser\u00edan cambiar a una conexi\u00f3n por cable si es posible o, si el dispositivo s\u00f3lo se va a utilizar durante un per\u00edodo de tiempo limitado, utilizar el arp scan. pausar el arp scan en la p\u00e1gina de mantenimiento.", + "HelpFAQ_Cat_General_102_head": "Me aparece el mensaje de que la base de datos es de s\u00f3lo de lectura.", + "HelpFAQ_Cat_General_102_text": "Compruebe en el directorio NetAlertX si la carpeta de la base de datos (db) tiene asignados los permisos correctos:
    drwxrwx--- 2 (nombre de usuario) www-data
    Si el permiso no es correcto, puede establecerlo de nuevo con los siguientes comandos en la terminal o la consola:
    sudo chgrp -R www-data /app/db
    chmod -R 770 /app/db

    Si la base de datos sigue siendo de s\u00f3lo lectura, intente reinstalar o restaurar una copia de seguridad de la base de datos desde la p\u00e1gina de mantenimiento.", + "HelpFAQ_Cat_General_102docker_head": "(\ud83d\udc33 Solo Docker) Problemas con la base de datos (errores de AJAX, solo lectura, no encontrado)", + "HelpFAQ_Cat_General_102docker_text": "Comprueba que has seguido las instrucciones del dockerfile (la informaci\u00f3n m\u00e1s actualizada).

    • Descarga la base de datos original desde GitHub.
    • Mapea el archivo app.db (\u26a0 no carpeta) de arriba a /app/db/app.db (puedes comprobar los ejemplos para m\u00e1s detalles).
    • Si aparecen problemas (errores de AJAX, no se puede escribir a la base de datos, etc,) aseg\u00farate que los permisos est\u00e1n establecidos correctamente. Tambi\u00e9n puedes comprobar los registros en /app/front/log.
    • Para arreglar los problemas de los permisos, puedes probar a crear una copia de seguridad de la base de datos y despu\u00e9s restaurarla desde la secci\u00f3n Mantenimiento > Copia de seguridad/Restaurar.
    • Si la base de datos est\u00e1 en modo solo lectura, lo puedes arreglar ejecutando el siguiente comando para establecer el propietario y grupo en el sistema host: docker exec netalertx chown -R www-data:www-data /app/db/app.db.
    ", + "HelpFAQ_Cat_General_103_head": "La p\u00e1gina de inicio de sesi\u00f3n no aparece, incluso despu\u00e9s de cambiar la contrase\u00f1a.", + "HelpFAQ_Cat_General_103_text": "Adem\u00e1s de la contrase\u00f1a, el archivo de configuraci\u00f3n debe contener /app/config/app.conf adem\u00e1s el par\u00e1metro PIALERT_WEB_PROTECTION debe ajustarse a True.", + "HelpFAQ_Cat_Network_600_head": "\u00bfPara qu\u00e9 sirve esta secci\u00f3n?", + "HelpFAQ_Cat_Network_600_text": "Esta p\u00e1gina deber\u00eda ofrecerle la posibilidad de asignar los dispositivos de su red. Para ello, puede crear uno o varios conmutadores, WLAN, routers, etc., proporcionarles un n\u00famero de puerto si es necesario y asignarles dispositivos ya detectados. Esta asignaci\u00f3n se realiza en la vista detallada del dispositivo a asignar. As\u00ed podr\u00e1s determinar r\u00e1pidamente a qu\u00e9 puerto est\u00e1 conectado un host y si est\u00e1 en l\u00ednea. Lea esta gu\u00eda para obtener m\u00e1s informaci\u00f3n.", + "HelpFAQ_Cat_Network_601_head": "\u00bfHay otros documentos?", + "HelpFAQ_Cat_Network_601_text": "\u00a1S\u00ed, los hay! Marque todos los documentos para m\u00e1s informaci\u00f3n.", "HelpFAQ_Cat_Presence_400_head": "Los dispositivos se muestran con un marcador amarillo y la nota \"evento faltante\".", - "HelpFAQ_Cat_Presence_400_text": "Si esto ocurre, tiene la opción de borrar los eventos del dispositivo en cuestión (vista detallada). Otra posibilidad sería encender el dispositivo y esperar a que NetAlertX detecte el dispositivo como \"en línea\" con el siguiente escaneo y luego simplemente apagarlo de nuevo NetAlertX debería ahora anotar correctamente el estado del dispositivo en la base de datos con el siguiente escaneo.", - "HelpFAQ_Cat_Presence_401_head": "Un dispositivo se muestra como presente aunque esté \"Offline\".", - "HelpFAQ_Cat_Presence_401_text": "Si esto ocurre, tiene la posibilidad de borrar los eventos del dispositivo en cuestión (vista de detalles). Otra posibilidad sería encender el dispositivo y esperar hasta que NetAlertX reconozca el dispositivo como \"en línea\" con el siguiente escaneo y, a continuación, simplemente apagar el dispositivo de nuevo. Ahora NetAlertX debería anotar correctamente el estado del dispositivo en la base de datos con el siguiente escaneo.", + "HelpFAQ_Cat_Presence_400_text": "Si esto ocurre, tiene la opci\u00f3n de borrar los eventos del dispositivo en cuesti\u00f3n (vista detallada). Otra posibilidad ser\u00eda encender el dispositivo y esperar a que NetAlertX detecte el dispositivo como \"en l\u00ednea\" con el siguiente escaneo y luego simplemente apagarlo de nuevo NetAlertX deber\u00eda ahora anotar correctamente el estado del dispositivo en la base de datos con el siguiente escaneo.", + "HelpFAQ_Cat_Presence_401_head": "Un dispositivo se muestra como presente aunque est\u00e9 \"Offline\".", + "HelpFAQ_Cat_Presence_401_text": "Si esto ocurre, tiene la posibilidad de borrar los eventos del dispositivo en cuesti\u00f3n (vista de detalles). Otra posibilidad ser\u00eda encender el dispositivo y esperar hasta que NetAlertX reconozca el dispositivo como \"en l\u00ednea\" con el siguiente escaneo y, a continuaci\u00f3n, simplemente apagar el dispositivo de nuevo. Ahora NetAlertX deber\u00eda anotar correctamente el estado del dispositivo en la base de datos con el siguiente escaneo.", "HelpFAQ_Title": "Ayuda / FAQ", - "LOADED_PLUGINS_description": "¿Qué plugins cargar?. Agregar complementos puede ralentizar la aplicación. Obtén más información sobre qué plugins deben habilitarse, los tipos o las opciones de escaneo en los documentos de plugins. Los plugins descargados perderán tu configuración. Solo se pueden descargar los complementos deshabilitados.", + "LOADED_PLUGINS_description": "\u00bfQu\u00e9 plugins cargar?. Agregar complementos puede ralentizar la aplicaci\u00f3n. Obt\u00e9n m\u00e1s informaci\u00f3n sobre qu\u00e9 plugins deben habilitarse, los tipos o las opciones de escaneo en los documentos de plugins. Los plugins descargados perder\u00e1n tu configuraci\u00f3n. Solo se pueden descargar los complementos deshabilitados.", "LOADED_PLUGINS_name": "Plugins cargados", - "LOG_LEVEL_description": "Esto hará que el registro tenga más información. Util para depurar que eventos se van guardando en la base de datos.", + "LOG_LEVEL_description": "Esto har\u00e1 que el registro tenga m\u00e1s informaci\u00f3n. Util para depurar que eventos se van guardando en la base de datos.", "LOG_LEVEL_name": "Imprimir registros adicionales", "Loading": "Cargando...", - "Login_Box": "Ingrese su contraseña", - "Login_Default_PWD": "La contraseña por defecto \"123456\" sigue activa.", - "Login_Psw-box": "Contraseña", - "Login_Psw_alert": "¡Alerta de Contraseña!", + "Login_Box": "Ingrese su contrase\u00f1a", + "Login_Default_PWD": "La contrase\u00f1a por defecto \"123456\" sigue activa.", + "Login_Psw-box": "Contrase\u00f1a", + "Login_Psw_alert": "\u00a1Alerta de Contrase\u00f1a!", "Login_Psw_folder": "en la carpeta config.", - "Login_Psw_new": "nueva_contraseña", - "Login_Psw_run": "Para cambiar contraseña ejecute:", + "Login_Psw_new": "nueva_contrase\u00f1a", + "Login_Psw_run": "Para cambiar contrase\u00f1a ejecute:", "Login_Remember": "Recordar", - "Login_Remember_small": "(válido por 7 días)", + "Login_Remember_small": "(v\u00e1lido por 7 d\u00edas)", "Login_Submit": "Ingresar", - "Login_Toggle_Alert_headline": "Alerta de Contraseña!", - "Login_Toggle_Info": "Información sobre la contraseña", - "Login_Toggle_Info_headline": "Información sobre la contraseña", + "Login_Toggle_Alert_headline": "Alerta de Contrase\u00f1a!", + "Login_Toggle_Info": "Informaci\u00f3n sobre la contrase\u00f1a", + "Login_Toggle_Info_headline": "Informaci\u00f3n sobre la contrase\u00f1a", "MQTT_BROKER_description": "URL del host MQTT (no incluya http:// o https://).", "MQTT_BROKER_name": "URL del broker MQTT", - "MQTT_DELAY_SEC_description": "Un pequeño truco: retrase la adición a la cola en caso de que el proceso se reinicie y los procesos de publicación anteriores se anulen (se necesitan ~2s para actualizar la configuración de un sensor en el intermediario). Probado con 2-3 segundos de retraso. Este retraso solo se aplica cuando se crean dispositivos (durante el primer bucle de notificación). No afecta los escaneos o notificaciones posteriores.", + "MQTT_DELAY_SEC_description": "Un peque\u00f1o truco: retrase la adici\u00f3n a la cola en caso de que el proceso se reinicie y los procesos de publicaci\u00f3n anteriores se anulen (se necesitan ~2s para actualizar la configuraci\u00f3n de un sensor en el intermediario). Probado con 2-3 segundos de retraso. Este retraso solo se aplica cuando se crean dispositivos (durante el primer bucle de notificaci\u00f3n). No afecta los escaneos o notificaciones posteriores.", "MQTT_DELAY_SEC_name": "Retraso de MQTT por dispositivo", - "MQTT_PASSWORD_description": "Contraseña utilizada para iniciar sesión en su instancia de agente de MQTT.", - "MQTT_PASSWORD_name": "Contraseña de MQTT", + "MQTT_PASSWORD_description": "Contrase\u00f1a utilizada para iniciar sesi\u00f3n en su instancia de agente de MQTT.", + "MQTT_PASSWORD_name": "Contrase\u00f1a de MQTT", "MQTT_PORT_description": "Puerto donde escucha el broker MQTT. Normalmente 1883.", "MQTT_PORT_name": "Puerto del broker MQTT", - "MQTT_QOS_description": "Configuración de calidad de servicio para el envío de mensajes MQTT. 0: baja calidad a 2: alta calidad. Cuanto mayor sea la calidad, mayor será el retraso.", + "MQTT_QOS_description": "Configuraci\u00f3n de calidad de servicio para el env\u00edo de mensajes MQTT. 0: baja calidad a 2: alta calidad. Cuanto mayor sea la calidad, mayor ser\u00e1 el retraso.", "MQTT_QOS_name": "Calidad de servicio MQTT", - "MQTT_USER_description": "Nombre de usuario utilizado para iniciar sesión en su instancia de agente de MQTT.", + "MQTT_USER_description": "Nombre de usuario utilizado para iniciar sesi\u00f3n en su instancia de agente de MQTT.", "MQTT_USER_name": "Usuario de MQTT", "MQTT_display_name": "MQTT", "MQTT_icon": "", - "Maintenance_Running_Version": "Versión instalada", - "Maintenance_Status": "Situación", + "Maintenance_Running_Version": "Versi\u00f3n instalada", + "Maintenance_Status": "Situaci\u00f3n", "Maintenance_Title": "Herramientas de mantenimiento", - "Maintenance_Tool_ExportCSV": "Exportación CSV", - "Maintenance_Tool_ExportCSV_noti": "Exportación CSV", - "Maintenance_Tool_ExportCSV_noti_text": "¿Está seguro de que quiere generar un archivo CSV?", - "Maintenance_Tool_ExportCSV_text": "Genere un archivo CSV (valor separado por comas) que contenga la lista de Dispositivos incluyendo las relaciones de red entre los Nodos de red y los dispositivos conectados. También puedes activarlo accediendo a esta URL your NetAlertX url/php/server/devices.php?action=ExportCSV o activando el plugin Copia de seguridad CSV.", - "Maintenance_Tool_ImportCSV": "Importación CSV", - "Maintenance_Tool_ImportCSV_noti": "Importación CSV", - "Maintenance_Tool_ImportCSV_noti_text": "¿Está seguro de que quiere importar el archivo CSV? Esto sobrescribirá completamente los dispositivos de su base de datos.", - "Maintenance_Tool_ImportCSV_text": "Antes de usar esta función, haga una copia de seguridad. Importe un archivo CSV (valor separado por comas) que contiene la lista de dispositivos, incluidas las relaciones de red entre nodos de red y dispositivos conectados. Para hacer eso, coloque el archivo CSV llamado devices.csv en su carpeta /config .", + "Maintenance_Tool_ExportCSV": "Exportaci\u00f3n CSV", + "Maintenance_Tool_ExportCSV_noti": "Exportaci\u00f3n CSV", + "Maintenance_Tool_ExportCSV_noti_text": "\u00bfEst\u00e1 seguro de que quiere generar un archivo CSV?", + "Maintenance_Tool_ExportCSV_text": "Genere un archivo CSV (valor separado por comas) que contenga la lista de Dispositivos incluyendo las relaciones de red entre los Nodos de red y los dispositivos conectados. Tambi\u00e9n puedes activarlo accediendo a esta URL your NetAlertX url/php/server/devices.php?action=ExportCSV o activando el plugin Copia de seguridad CSV.", + "Maintenance_Tool_ImportCSV": "Importaci\u00f3n CSV", + "Maintenance_Tool_ImportCSV_noti": "Importaci\u00f3n CSV", + "Maintenance_Tool_ImportCSV_noti_text": "\u00bfEst\u00e1 seguro de que quiere importar el archivo CSV? Esto sobrescribir\u00e1 completamente los dispositivos de su base de datos.", + "Maintenance_Tool_ImportCSV_text": "Antes de usar esta funci\u00f3n, haga una copia de seguridad. Importe un archivo CSV (valor separado por comas) que contiene la lista de dispositivos, incluidas las relaciones de red entre nodos de red y dispositivos conectados. Para hacer eso, coloque el archivo CSV llamado devices.csv en su carpeta /config .", "Maintenance_Tool_arpscansw": "Activar arp-scan (on/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_text": "Encender o desactivar el arp-scan. Cuando el escaneo se ha apagado, permanece apagado hasta que se active nuevamente. Los escaneos activos no se cancelan.", "Maintenance_Tool_backup": "Respaldar DB", "Maintenance_Tool_backup_noti": "Respaldar DB", - "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_noti_text": "\u00bfEst\u00e1s seguro de que quieres exactos la copia de seguridad de DB? Aseg\u00farese de que ning\u00fan escaneo se est\u00e9 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\u00f3n. No hay un n\u00famero m\u00e1ximo de copias de seguridad.", "Maintenance_Tool_check_visible": "Desactivar para ocultar columna.", "Maintenance_Tool_darkmode": "Cambiar Modo (Dark/Light)", "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_text": "Alternar entre el modo oscuro y el modo de luz. Si el interruptor no funciona correctamente, intente borrar el caché del navegador. El cambio tiene lugar en el lado del servidor, por lo que afecta todos los dispositivos en uso.", + "Maintenance_Tool_darkmode_noti_text": "Despu\u00e9s del cambio de tema, la p\u00e1gina intenta volver a cargar para activar el cambio. Si es necesario, el cach\u00e9 debe ser eliminado.", + "Maintenance_Tool_darkmode_text": "Alternar entre el modo oscuro y el modo de luz. Si el interruptor no funciona correctamente, intente borrar el cach\u00e9 del navegador. El cambio tiene lugar en el lado del servidor, por lo que afecta todos los dispositivos en uso.", "Maintenance_Tool_del_ActHistory": "Eliminar la actividad de la red", "Maintenance_Tool_del_ActHistory_noti": "Borrar la actividad de la red", - "Maintenance_Tool_del_ActHistory_noti_text": "¿Está seguro de restablecer la actividad de la red?", - "Maintenance_Tool_del_ActHistory_text": "El gráfico de actividad de la red se resetea. Esto no afecta a los eventos.", + "Maintenance_Tool_del_ActHistory_noti_text": "\u00bfEst\u00e1 seguro de restablecer la actividad de la red?", + "Maintenance_Tool_del_ActHistory_text": "El gr\u00e1fico de actividad de la red se resetea. Esto no afecta a los eventos.", "Maintenance_Tool_del_alldev": "Eliminar todos los dispositivos", "Maintenance_Tool_del_alldev_noti": "Eliminar dispositivos", - "Maintenance_Tool_del_alldev_noti_text": "¿Estás seguro de que quieres eliminar todos los dispositivos?", - "Maintenance_Tool_del_alldev_text": "Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Todos los dispositivos se eliminarán de la base de datos.", + "Maintenance_Tool_del_alldev_noti_text": "\u00bfEst\u00e1s seguro de que quieres eliminar todos los dispositivos?", + "Maintenance_Tool_del_alldev_text": "Antes de usar esta funci\u00f3n, haga una copia de seguridad. La eliminaci\u00f3n no se puede deshacer. Todos los dispositivos se eliminar\u00e1n de la base de datos.", "Maintenance_Tool_del_allevents": "Eliminar todo (Restablecer historial)", - "Maintenance_Tool_del_allevents30": "Eliminar eventos antiguos (30 días)", + "Maintenance_Tool_del_allevents30": "Eliminar eventos antiguos (30 d\u00edas)", "Maintenance_Tool_del_allevents30_noti": "Eliminar eventos", - "Maintenance_Tool_del_allevents30_noti_text": "¿Está seguro de eliminar todos los eventos mayores a 30 días? Esto restablece la presencia de todos los dispositivos.", - "Maintenance_Tool_del_allevents30_text": "Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Se eliminarán todos los eventos mayores a 30 días en la base de datos. En ese momento se restablecerá la presencia de todos los dispositivos. Esto puede conducir a sesiones no válidas. Esto significa que los dispositivos se muestran como \"presentes\", aunque están fuera de línea. Un escaneo mientras el dispositivo en cuestión está en línea resuelve el problema.", + "Maintenance_Tool_del_allevents30_noti_text": "\u00bfEst\u00e1 seguro de eliminar todos los eventos mayores a 30 d\u00edas? Esto restablece la presencia de todos los dispositivos.", + "Maintenance_Tool_del_allevents30_text": "Antes de usar esta funci\u00f3n, haga una copia de seguridad. La eliminaci\u00f3n no se puede deshacer. Se eliminar\u00e1n todos los eventos mayores a 30 d\u00edas en la base de datos. En ese momento se restablecer\u00e1 la presencia de todos los dispositivos. Esto puede conducir a sesiones no v\u00e1lidas. Esto significa que los dispositivos se muestran como \"presentes\", aunque est\u00e1n fuera de l\u00ednea. Un escaneo mientras el dispositivo en cuesti\u00f3n est\u00e1 en l\u00ednea resuelve el problema.", "Maintenance_Tool_del_allevents_noti": "Eliminar eventos", - "Maintenance_Tool_del_allevents_noti_text": "¿Estás seguro de que quieres eliminar todos los eventos? Esto restablece la presencia de todos los dispositivos.", - "Maintenance_Tool_del_allevents_text": "Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Se eliminarán todos los eventos en la base de datos. En ese momento se restablecerá la presencia de todos los dispositivos. Esto puede conducir a sesiones no válidas. Esto significa que los dispositivos se muestran como \"presentes\", aunque están fuera de línea. Un escaneo mientras el dispositivo en cuestión está en línea resuelve el problema.", - "Maintenance_Tool_del_empty_macs": "Eliminar dispositivos con MACs vacíos", + "Maintenance_Tool_del_allevents_noti_text": "\u00bfEst\u00e1s seguro de que quieres eliminar todos los eventos? Esto restablece la presencia de todos los dispositivos.", + "Maintenance_Tool_del_allevents_text": "Antes de usar esta funci\u00f3n, haga una copia de seguridad. La eliminaci\u00f3n no se puede deshacer. Se eliminar\u00e1n todos los eventos en la base de datos. En ese momento se restablecer\u00e1 la presencia de todos los dispositivos. Esto puede conducir a sesiones no v\u00e1lidas. Esto significa que los dispositivos se muestran como \"presentes\", aunque est\u00e1n fuera de l\u00ednea. Un escaneo mientras el dispositivo en cuesti\u00f3n est\u00e1 en l\u00ednea resuelve el problema.", + "Maintenance_Tool_del_empty_macs": "Eliminar dispositivos con MACs vac\u00edos", "Maintenance_Tool_del_empty_macs_noti": "Eliminar dispositivos", - "Maintenance_Tool_del_empty_macs_noti_text": "¿Estás seguro de que quieres eliminar todos los dispositivos con direcciones MAC vacías?
    (tal vez prefiera archivarlo)", - "Maintenance_Tool_del_empty_macs_text": "Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Todos los dispositivos sin Mac se eliminarán de la base de datos.", + "Maintenance_Tool_del_empty_macs_noti_text": "\u00bfEst\u00e1s seguro de que quieres eliminar todos los dispositivos con direcciones MAC vac\u00edas?
    (tal vez prefiera archivarlo)", + "Maintenance_Tool_del_empty_macs_text": "Antes de usar esta funci\u00f3n, haga una copia de seguridad. La eliminaci\u00f3n no se puede deshacer. Todos los dispositivos sin Mac se eliminar\u00e1n de la base de datos.", "Maintenance_Tool_del_selecteddev": "Borrar dispositivos seleccionados", - "Maintenance_Tool_del_selecteddev_text": "Antes de utilizar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Los dispositivos seleccionados se eliminarán de la base de datos.", + "Maintenance_Tool_del_selecteddev_text": "Antes de utilizar esta funci\u00f3n, haga una copia de seguridad. La eliminaci\u00f3n no se puede deshacer. Los dispositivos seleccionados se eliminar\u00e1n de la base de datos.", "Maintenance_Tool_del_unknowndev": "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_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_displayed_columns_text": "Cambia la visibilidad y el orden de las columnas en la página Dispositivos.", + "Maintenance_Tool_del_unknowndev_noti_text": "\u00bfEst\u00e1s seguro de que quieres eliminar todos los dispositivos (desconocidos)?", + "Maintenance_Tool_del_unknowndev_text": "Antes de usar esta funci\u00f3n, haga una copia de seguridad. La eliminaci\u00f3n no se puede deshacer. Todos los dispositivos nombrados (desconocidos) se eliminar\u00e1n de la base de datos.", + "Maintenance_Tool_displayed_columns_text": "Cambia la visibilidad y el orden de las columnas en la p\u00e1gina Dispositivos.", "Maintenance_Tool_drag_me": "Coger para rearrastrar columnas.", "Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text", "Maintenance_Tool_purgebackup": "Purgar Respaldos", "Maintenance_Tool_purgebackup_noti": "Purgar Respaldos", - "Maintenance_Tool_purgebackup_noti_text": "¿Está seguro de borrar todas las copias de seguridad excepto las 3 últimas?", - "Maintenance_Tool_purgebackup_text": "Todas las copias de seguridad serán eliminadas, excepto las 3 últimas.", + "Maintenance_Tool_purgebackup_noti_text": "\u00bfEst\u00e1 seguro de borrar todas las copias de seguridad excepto las 3 \u00faltimas?", + "Maintenance_Tool_purgebackup_text": "Todas las copias de seguridad ser\u00e1n eliminadas, excepto las 3 \u00faltimas.", "Maintenance_Tool_restore": "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_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_noti_text": "\u00bfEst\u00e1s seguro de que quieres hacer exactos la restauraci\u00f3n de DB? Aseg\u00farese de que ning\u00fan escaneo se est\u00e9 ejecutando actualmente.", + "Maintenance_Tool_restore_text": "La \u00faltima copia de seguridad se puede restaurar a trav\u00e9s del bot\u00f3n, pero las copias de seguridad anteriores solo se pueden restaurar manualmente. Despu\u00e9s de la restauraci\u00f3n, realice una verificaci\u00f3n de integridad en la base de datos por seguridad, en caso de que el DB estuviera actualmente en acceso de escritura cuando se cre\u00f3 la copia de seguridad.", "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?
    (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_noti_text": "\u00bfEst\u00e1s seguro de que quieres actualizar la base de datos?
    (tal vez prefieras archivarla)", + "Maintenance_Tool_upgrade_database_text": "Este bot\u00f3n actualizar\u00e1 la base de datos para habilitar la actividad de la red en las \u00faltimas 12 horas. Haga una copia de seguridad de su base de datos en caso de problemas.", "Maintenance_Tools_Tab_BackupRestore": "Respaldo / Restaurar", "Maintenance_Tools_Tab_Logging": "Registros", "Maintenance_Tools_Tab_Settings": "Ajustes", "Maintenance_Tools_Tab_Tools": "Herramientas", "Maintenance_Tools_Tab_UISettings": "Ajustes de interfaz", - "Maintenance_arp_status": "Estado de la exploración", - "Maintenance_arp_status_off": "está actualmente deshabilitado", - "Maintenance_arp_status_on": "escaneo(s) actualmente en ejecución", + "Maintenance_arp_status": "Estado de la exploraci\u00f3n", + "Maintenance_arp_status_off": "est\u00e1 actualmente deshabilitado", + "Maintenance_arp_status_on": "escaneo(s) actualmente en ejecuci\u00f3n", "Maintenance_built_on": "Creada", - "Maintenance_current_version": "No hay actualizaciones disponibles. Comprueba en que se está trabajando.", + "Maintenance_current_version": "No hay actualizaciones disponibles. Comprueba en que se est\u00e1 trabajando.", "Maintenance_database_backup": "Copias de seguridad de BD", "Maintenance_database_backup_found": "copia(s) de seguridad encontrada(s)", "Maintenance_database_backup_total": "Uso total de disco", - "Maintenance_database_lastmod": "Última modificación", + "Maintenance_database_lastmod": "\u00daltima modificaci\u00f3n", "Maintenance_database_path": "Ruta de la base de datos", "Maintenance_database_rows": "Tabla (Filas)", - "Maintenance_database_size": "Tamaño de base de datos", + "Maintenance_database_size": "Tama\u00f1o de base de datos", "Maintenance_lang_selector_apply": "Aplicar", "Maintenance_lang_selector_empty": "Elija un 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_new_version": "🆕 Una nueva versión está disponible. Comprueba las notas de lanzamiento.", + "Maintenance_lang_selector_text": "El cambio se produce en el lado del cliente, por lo que s\u00f3lo afecta al navegador actual.", + "Maintenance_new_version": "\ud83c\udd95 Una nueva versi\u00f3n est\u00e1 disponible. Comprueba las notas de lanzamiento.", "Maintenance_themeselector_apply": "Aplicar", "Maintenance_themeselector_empty": "Elige un tema", "Maintenance_themeselector_lable": "Seleccionar tema", "Maintenance_themeselector_text": "El cambio se produce en el lado del servidor, por lo que afecta a todos los dispositivos en uso.", - "Maintenance_version": "Actualizaciones de la aplicación", - "NETWORK_DEVICE_TYPES_description": "Qué tipos de dispositivos pueden usarse como dispositivos de red en la vista Red. El tipo de dispositivo debe coincidir exactamente con la configuración Tipo en un dispositivo específico en los Detalles del dispositivo. No elimine los tipos existentes, solo agregue nuevos.", + "Maintenance_version": "Actualizaciones de la aplicaci\u00f3n", + "NETWORK_DEVICE_TYPES_description": "Qu\u00e9 tipos de dispositivos pueden usarse como dispositivos de red en la vista Red. El tipo de dispositivo debe coincidir exactamente con la configuraci\u00f3n Tipo en un dispositivo espec\u00edfico en los Detalles del dispositivo. No elimine los tipos existentes, solo agregue nuevos.", "NETWORK_DEVICE_TYPES_name": "Tipos de dispositivos de red", - "NTFY_HOST_description": "URL de host NTFY que comienza con http:// o https://. Puede usar la instancia alojada en https://ntfy.sh simplemente ingresando https://ntfy. sh.", + "NTFY_HOST_description": "URL de host NTFY que comienza con http:// o https://. Puede usar la instancia alojada en https://ntfy.sh simplemente ingresando https://ntfy. sh.", "NTFY_HOST_name": "URL del host NTFY", - "NTFY_PASSWORD_description": "Ingrese la contraseña si necesita (host) una instancia con autenticación habilitada.", - "NTFY_PASSWORD_name": "Contraseña de NTFY", + "NTFY_PASSWORD_description": "Ingrese la contrase\u00f1a si necesita (host) una instancia con autenticaci\u00f3n habilitada.", + "NTFY_PASSWORD_name": "Contrase\u00f1a de NTFY", "NTFY_TOPIC_description": "Tu tema secreto.", "NTFY_TOPIC_name": "Tema de NTFY", - "NTFY_USER_description": "Ingrese usuario si necesita (alojar) una instancia con autenticación habilitada.", + "NTFY_USER_description": "Ingrese usuario si necesita (alojar) una instancia con autenticaci\u00f3n habilitada.", "NTFY_USER_name": "Usuario de NTFY", "NTFY_display_name": "NTFY", "NTFY_icon": "", @@ -484,24 +485,24 @@ "Navigation_HelpFAQ": "Ayuda / FAQ", "Navigation_Integrations": "Integraciones", "Navigation_Maintenance": "Mantenimiento", - "Navigation_Monitoring": "Supervisión", + "Navigation_Monitoring": "Supervisi\u00f3n", "Navigation_Network": "Red", "Navigation_Plugins": "Plugins", "Navigation_Presence": "Historial", "Navigation_Report": "Reporte", - "Navigation_Settings": "Configuración", + "Navigation_Settings": "Configuraci\u00f3n", "Navigation_SystemInfo": "Info del sistema", "Navigation_Workflows": "Flujo de trabajo", "Network_Assign": "Conectar al nodo de red", "Network_Cant_Assign": "No se puede asignar el nodo principal de Internet como nodo secundario.", - "Network_Configuration_Error": "Error en la configuración", + "Network_Configuration_Error": "Error en la configuraci\u00f3n", "Network_Connected": "Dispositivos conectados", - "Network_ManageAdd": "Añadir dispositivo", + "Network_ManageAdd": "A\u00f1adir dispositivo", "Network_ManageAdd_Name": "Nombre del dispositivo", "Network_ManageAdd_Name_text": "Nombre sin caracteres especiales", "Network_ManageAdd_Port": "Recuento de puertos", "Network_ManageAdd_Port_text": "dejar en blanco para WiFi y Powerline", - "Network_ManageAdd_Submit": "Añadir dispositivo", + "Network_ManageAdd_Submit": "A\u00f1adir dispositivo", "Network_ManageAdd_Type": "Tipo de dispositivo", "Network_ManageAdd_Type_text": "-- Seleccionar tipo --", "Network_ManageAssign": "Asignar", @@ -520,26 +521,26 @@ "Network_ManageEdit_Submit": "Guardar los cambios", "Network_ManageEdit_Type": "Nuevo tipo de dispositivo", "Network_ManageEdit_Type_text": "-- Seleccione tipo --", - "Network_ManageLeaf": "Gestionar asignación", + "Network_ManageLeaf": "Gestionar asignaci\u00f3n", "Network_ManageUnassign": "Desasignar", - "Network_NoAssignedDevices": "Este nodo de red no tiene ningún dispositivo asignado (nodos hoja). Asigna uno desde abajo o ve a la pestaña Detalles de cualquier dispositivo en Dispositivos, y asígnalo a un Nodo (MAC) de red y Puerto allí.", + "Network_NoAssignedDevices": "Este nodo de red no tiene ning\u00fan dispositivo asignado (nodos hoja). Asigna uno desde abajo o ve a la pesta\u00f1a Detalles de cualquier dispositivo en Dispositivos, y as\u00edgnalo a un Nodo (MAC) de red y Puerto all\u00ed.", "Network_NoDevices": "No hay dispositivos que configurar", "Network_Node": "Nodo de red", "Network_Node_Name": "Nombre de nodo", "Network_Parent": "Dispositivo primario de la red", "Network_Root": "Nodo principal", - "Network_Root_Not_Configured": "Seleccione un tipo de dispositivo de red, por ejemplo un Gateway, en el campo Tipo del dispositivo principal de Internet para empezar a configurar esta pantalla.

    Puede encontrar más documentación en la guía ¿Cómo configurar su página de Red?", + "Network_Root_Not_Configured": "Seleccione un tipo de dispositivo de red, por ejemplo un Gateway, en el campo Tipo del dispositivo principal de Internet para empezar a configurar esta pantalla.

    Puede encontrar m\u00e1s documentaci\u00f3n en la gu\u00eda \u00bfC\u00f3mo configurar su p\u00e1gina de Red?", "Network_Root_Unconfigurable": "Root no configurable", "Network_Table_Hostname": "Nombre de host", - "Network_Table_IP": "Dirección IP", + "Network_Table_IP": "Direcci\u00f3n IP", "Network_Table_State": "Estado", - "Network_Title": "Descripción general de la red", + "Network_Title": "Descripci\u00f3n general de la red", "Network_UnassignedDevices": "Dispositivos sin asignar", - "PIALERT_WEB_PASSWORD_description": "Por defecto, la contraseña es 123456.Para cambiar la contraseña ejecute /app/back/pialert-cli en el contenedor o utilice el SETPWD_RUN Establecer contraseña plugin.", - "PIALERT_WEB_PASSWORD_name": "Contraseña de inicio de sesión", - "PIALERT_WEB_PROTECTION_description": "Cuando está habilitado, se muestra un cuadro de diálogo de inicio de sesión. Lea detenidamente a continuación si se le bloquea el acceso a su instancia.", - "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!).", + "PIALERT_WEB_PASSWORD_description": "Por defecto, la contrase\u00f1a es 123456.Para cambiar la contrase\u00f1a ejecute /app/back/pialert-cli en el contenedor o utilice el SETPWD_RUN Establecer contrase\u00f1a plugin.", + "PIALERT_WEB_PASSWORD_name": "Contrase\u00f1a de inicio de sesi\u00f3n", + "PIALERT_WEB_PROTECTION_description": "Cuando est\u00e1 habilitado, se muestra un cuadro de di\u00e1logo de inicio de sesi\u00f3n. Lea detenidamente a continuaci\u00f3n si se le bloquea el acceso a su instancia.", + "PIALERT_WEB_PROTECTION_name": "Habilitar inicio de sesi\u00f3n", + "PLUGINS_KEEP_HIST_description": "\u00bfCu\u00e1ntas entradas de los resultados del an\u00e1lisis del historial de complementos deben conservarse (globalmente, no espec\u00edfico del dispositivo!).", "PLUGINS_KEEP_HIST_name": "Historial de complementos", "PUSHSAFER_TOKEN_description": "Su clave secreta de la API de Pushsafer (token).", "PUSHSAFER_TOKEN_name": "Token de Pushsafer", @@ -551,75 +552,75 @@ "Plugins_Objects": "Objetos del Plugin", "Plugins_Out_of": "de", "Plugins_Unprocessed_Events": "Eventos sin procesar", - "Plugins_no_control": "No se ha encontrado ningún control para el formulario, para que muestre este valor.", - "Presence_CalHead_day": "día", + "Plugins_no_control": "No se ha encontrado ning\u00fan control para el formulario, para que muestre este valor.", + "Presence_CalHead_day": "d\u00eda", "Presence_CalHead_lang": "es-es", "Presence_CalHead_month": "mes", "Presence_CalHead_quarter": "trimestre", "Presence_CalHead_week": "semana", - "Presence_CalHead_year": "año", + "Presence_CalHead_year": "a\u00f1o", "Presence_CallHead_Devices": "Dispositivos", "Presence_Loading": "Cargando...", "Presence_Shortcut_AllDevices": "Mis dispositivos", "Presence_Shortcut_Archived": "Archivado(s)", "Presence_Shortcut_Connected": "Conectado(s)", "Presence_Shortcut_Devices": "Dispositivos", - "Presence_Shortcut_DownAlerts": "Alerta(s) de caída(s)", + "Presence_Shortcut_DownAlerts": "Alerta(s) de ca\u00edda(s)", "Presence_Shortcut_Favorites": "Favorito(s)", "Presence_Shortcut_NewDevices": "Nuevo(s)", "Presence_Title": "Historial por dispositivo", - "REPORT_APPRISE_description": "Habilitar el envío de notificaciones a través de Apprise.", + "REPORT_APPRISE_description": "Habilitar el env\u00edo de notificaciones a trav\u00e9s de Apprise.", "REPORT_APPRISE_name": "Habilitar Apprise", - "REPORT_DASHBOARD_URL_description": "Esta URL se utiliza como base para generar enlaces en los correos electrónicos. Ingrese la URL completa que comienza con http://, incluido el número de puerto (sin barra inclinada al final /).", + "REPORT_DASHBOARD_URL_description": "Esta URL se utiliza como base para generar enlaces en los correos electr\u00f3nicos. Ingrese la URL completa que comienza con http://, incluido el n\u00famero de puerto (sin barra inclinada al final /).", "REPORT_DASHBOARD_URL_name": "URL de NetAlertX", - "REPORT_ERROR": "La página que está buscando no está disponible temporalmente, inténtelo de nuevo después de unos segundos", - "REPORT_FROM_description": "Asunto del correo electrónico de notificación.", + "REPORT_ERROR": "La p\u00e1gina que est\u00e1 buscando no est\u00e1 disponible temporalmente, int\u00e9ntelo de nuevo despu\u00e9s de unos segundos", + "REPORT_FROM_description": "Asunto del correo electr\u00f3nico de notificaci\u00f3n.", "REPORT_FROM_name": "Asunto del email", - "REPORT_MAIL_description": "Si está activada, se envía un correo electrónico con una lista de los cambios a los que se ha suscrito. Por favor, rellene también todos los ajustes restantes relacionados con la configuración SMTP a continuación. Si tiene problemas, ajuste LOG_LEVEL a debug y compruebe el registro de errores.", + "REPORT_MAIL_description": "Si est\u00e1 activada, se env\u00eda un correo electr\u00f3nico con una lista de los cambios a los que se ha suscrito. Por favor, rellene tambi\u00e9n todos los ajustes restantes relacionados con la configuraci\u00f3n SMTP a continuaci\u00f3n. Si tiene problemas, ajuste LOG_LEVEL a debug y compruebe el registro de errores.", "REPORT_MAIL_name": "Habilitar email", - "REPORT_MQTT_description": "Habilitar el envío de notificaciones a través de MQTT a su Home Assistance.", + "REPORT_MQTT_description": "Habilitar el env\u00edo de notificaciones a trav\u00e9s de MQTT a su Home Assistance.", "REPORT_MQTT_name": "Habilitar MQTT", - "REPORT_NTFY_description": "Habilitar el envío de notificaciones a través de NTFY.", + "REPORT_NTFY_description": "Habilitar el env\u00edo de notificaciones a trav\u00e9s de NTFY.", "REPORT_NTFY_name": "Habilitar NTFY", - "REPORT_PUSHSAFER_description": "Habilitar el envío de notificaciones a través de Pushsafer.", + "REPORT_PUSHSAFER_description": "Habilitar el env\u00edo de notificaciones a trav\u00e9s de Pushsafer.", "REPORT_PUSHSAFER_name": "Habilitar Pushsafer", "REPORT_TITLE": "Reporte", - "REPORT_TO_description": "Dirección de correo electrónico a la que se enviará la notificación.", + "REPORT_TO_description": "Direcci\u00f3n de correo electr\u00f3nico a la que se enviar\u00e1 la notificaci\u00f3n.", "REPORT_TO_name": "Enviar el email a", - "REPORT_WEBHOOK_description": "Habilite webhooks para notificaciones. Los webhooks lo ayudan a conectarse a muchas herramientas de terceros, como IFTTT, Zapier o n8n, por nombrar algunas. Consulte esta sencilla guía de n8n aquí para obtener comenzó. Si está habilitado, configure los ajustes relacionados a continuación.", + "REPORT_WEBHOOK_description": "Habilite webhooks para notificaciones. Los webhooks lo ayudan a conectarse a muchas herramientas de terceros, como IFTTT, Zapier o n8n, por nombrar algunas. Consulte esta sencilla gu\u00eda de n8n aqu\u00ed para obtener comenz\u00f3. Si est\u00e1 habilitado, configure los ajustes relacionados a continuaci\u00f3n.", "REPORT_WEBHOOK_name": "Habilitar webhooks", - "RandomMAC_hover": "Autodetectado - indica si el dispositivo aleatoriza su dirección MAC.", - "SCAN_SUBNETS_description": "La mayoría de los escáneres en red (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) se basan en el escaneo de interfaces de red y subredes específicas. Consulte la documentación sobre subredes para obtener ayuda sobre esta configuración, especialmente VLANs, qué VLANs son compatibles, o cómo averiguar la máscara de red y su interfaz.

    Una alternativa a los escáneres en red es habilitar algunos otros escáneres/importadores de dispositivos que no dependen de que NetALertX tenga acceso a la red (UNIFI, dhcp.leases, PiHole, etc.).

    Nota: El tiempo de escaneo en sí depende del número de direcciones IP a comprobar, así que configure esto cuidadosamente con la máscara de red y la interfaz adecuadas.", + "RandomMAC_hover": "Autodetectado - indica si el dispositivo aleatoriza su direcci\u00f3n MAC.", + "SCAN_SUBNETS_description": "La mayor\u00eda de los esc\u00e1neres en red (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) se basan en el escaneo de interfaces de red y subredes espec\u00edficas. Consulte la documentaci\u00f3n sobre subredes para obtener ayuda sobre esta configuraci\u00f3n, especialmente VLANs, qu\u00e9 VLANs son compatibles, o c\u00f3mo averiguar la m\u00e1scara de red y su interfaz.

    Una alternativa a los esc\u00e1neres en red es habilitar algunos otros esc\u00e1neres/importadores de dispositivos que no dependen de que NetALertX tenga acceso a la red (UNIFI, dhcp.leases, PiHole, etc.).

    Nota: El tiempo de escaneo en s\u00ed depende del n\u00famero de direcciones IP a comprobar, as\u00ed que configure esto cuidadosamente con la m\u00e1scara de red y la interfaz adecuadas.", "SCAN_SUBNETS_name": "Subredes para escanear", "SMTP_FORCE_SSL_description": "Forzar SSL al conectarse a su servidor SMTP", "SMTP_FORCE_SSL_name": "Forzar SSL", - "SMTP_PASS_description": "La contraseña del servidor SMTP.", - "SMTP_PASS_name": "Contraseña de SMTP", - "SMTP_PORT_description": "Número de puerto utilizado para la conexión SMTP. Establézcalo en 0 si no desea utilizar un puerto al conectarse al servidor SMTP.", + "SMTP_PASS_description": "La contrase\u00f1a del servidor SMTP.", + "SMTP_PASS_name": "Contrase\u00f1a de SMTP", + "SMTP_PORT_description": "N\u00famero de puerto utilizado para la conexi\u00f3n SMTP. Establ\u00e9zcalo en 0 si no desea utilizar un puerto al conectarse al servidor SMTP.", "SMTP_PORT_name": "Puerto del servidor SMTP", - "SMTP_SERVER_description": "La URL del host del servidor SMTP. Por ejemplo, smtp-relay.sendinblue.com. Para utilizar Gmail como servidor SMTP siga esta guía", + "SMTP_SERVER_description": "La URL del host del servidor SMTP. Por ejemplo, smtp-relay.sendinblue.com. Para utilizar Gmail como servidor SMTP siga esta gu\u00eda", "SMTP_SERVER_name": "URL del servidor SMTP", - "SMTP_SKIP_LOGIN_description": "No utilice la autenticación cuando se conecte al servidor SMTP.", - "SMTP_SKIP_LOGIN_name": "Omitir autenticación", + "SMTP_SKIP_LOGIN_description": "No utilice la autenticaci\u00f3n cuando se conecte al servidor SMTP.", + "SMTP_SKIP_LOGIN_name": "Omitir autenticaci\u00f3n", "SMTP_SKIP_TLS_description": "Deshabilite TLS cuando se conecte a su servidor SMTP.", "SMTP_SKIP_TLS_name": "No usar TLS", - "SMTP_USER_description": "El nombre de usuario utilizado para iniciar sesión en el servidor SMTP (a veces, una dirección de correo electrónico completa).", + "SMTP_USER_description": "El nombre de usuario utilizado para iniciar sesi\u00f3n en el servidor SMTP (a veces, una direcci\u00f3n de correo electr\u00f3nico completa).", "SMTP_USER_name": "Nombre de usuario SMTP", - "SYSTEM_TITLE": "Información del sistema", + "SYSTEM_TITLE": "Informaci\u00f3n del sistema", "Setting_Override": "Sobreescribir el valor", - "Setting_Override_Description": "Habilitar esta opción anulará un valor predeterminado proporcionado por la aplicación con el valor especificado anteriormente.", - "Settings_Metadata_Toggle": "Mostrar/ocultar los metadatos de la configuración.", - "Settings_Title": " Configuración", - "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 ( *_RUN_SCHD ) 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. 🔍Escáneres de dispositivos .", + "Setting_Override_Description": "Habilitar esta opci\u00f3n anular\u00e1 un valor predeterminado proporcionado por la aplicaci\u00f3n con el valor especificado anteriormente.", + "Settings_Metadata_Toggle": "Mostrar/ocultar los metadatos de la configuraci\u00f3n.", + "Settings_Title": " Configuraci\u00f3n", + "Settings_device_Scanners_desync": "\u26a0 Los horarios del esc\u00e1ner de los dispositivos no est\u00e1n sincronizados.", + "Settings_device_Scanners_desync_popup": "Los horarios de esc\u00e1neres de dispositivos ( *_RUN_SCHD ) no son lo mismo. Esto resultar\u00e1 en notificaciones inconsistentes del dispositivo en l\u00ednea/fuera de l\u00ednea. A menos que sea as\u00ed, utilice el mismo horario para todos los habilitados. \ud83d\udd0dEsc\u00e1neres de dispositivos .", "Speedtest_Results": "Resultados de la prueba de velocidad", "Systeminfo_CPU": "CPU", - "Systeminfo_CPU_Cores": "Núcleos de CPU:", + "Systeminfo_CPU_Cores": "N\u00facleos de CPU:", "Systeminfo_CPU_Name": "Nombre de la CPU:", "Systeminfo_CPU_Speed": "Velocidad de la CPU:", "Systeminfo_CPU_Temp": "Temperatura de la CPU:", "Systeminfo_CPU_Vendor": "Proveedor de CPU:", - "Systeminfo_Client_Resolution": "Resolución del navegador:", + "Systeminfo_Client_Resolution": "Resoluci\u00f3n del navegador:", "Systeminfo_Client_User_Agent": "Agente de usuario:", "Systeminfo_General": "General", "Systeminfo_General_Date": "Fecha:", @@ -636,40 +637,40 @@ "Systeminfo_Motherboard_BIOS_Vendor": "Proveedor de BIOS:", "Systeminfo_Motherboard_Manufactured": "Fabricado por:", "Systeminfo_Motherboard_Name": "Nombre:", - "Systeminfo_Motherboard_Revision": "Revisión:", + "Systeminfo_Motherboard_Revision": "Revisi\u00f3n:", "Systeminfo_Network": "Red", - "Systeminfo_Network_Accept_Encoding": "Codificación aceptada:", + "Systeminfo_Network_Accept_Encoding": "Codificaci\u00f3n aceptada:", "Systeminfo_Network_Accept_Language": "Idioma aceptado:", - "Systeminfo_Network_Connection_Port": "Puerto de conexión:", + "Systeminfo_Network_Connection_Port": "Puerto de conexi\u00f3n:", "Systeminfo_Network_HTTP_Host": "Host HTTP:", "Systeminfo_Network_HTTP_Referer": "Referido HTTP:", "Systeminfo_Network_HTTP_Referer_String": "Sin referencia HTTP", "Systeminfo_Network_Hardware": "Hardware de red", - "Systeminfo_Network_Hardware_Interface_Mask": "Máscara de red", + "Systeminfo_Network_Hardware_Interface_Mask": "M\u00e1scara de red", "Systeminfo_Network_Hardware_Interface_Name": "Nombre de la interfaz", "Systeminfo_Network_Hardware_Interface_RX": "Recibido", "Systeminfo_Network_Hardware_Interface_TX": "Transmitido", "Systeminfo_Network_IP": "IP Internet:", - "Systeminfo_Network_IP_Connection": "Conexión IP:", + "Systeminfo_Network_IP_Connection": "Conexi\u00f3n IP:", "Systeminfo_Network_IP_Server": "IP del servidor:", "Systeminfo_Network_MIME": "MIME:", - "Systeminfo_Network_Request_Method": "Método de solicitud:", + "Systeminfo_Network_Request_Method": "M\u00e9todo de solicitud:", "Systeminfo_Network_Request_Time": "Hora de solicitud:", "Systeminfo_Network_Request_URI": "URI de solicitud:", - "Systeminfo_Network_Secure_Connection": "Conexión segura:", + "Systeminfo_Network_Secure_Connection": "Conexi\u00f3n segura:", "Systeminfo_Network_Secure_Connection_String": "No (HTTP)", "Systeminfo_Network_Server_Name": "Nombre del servidor:", "Systeminfo_Network_Server_Name_String": "Nombre del servidor no encontrado", "Systeminfo_Network_Server_Query": "Consulta del servidor:", "Systeminfo_Network_Server_Query_String": "Sin cadena de consulta", - "Systeminfo_Network_Server_Version": "Versión del servidor:", + "Systeminfo_Network_Server_Version": "Versi\u00f3n del servidor:", "Systeminfo_Services": "Servicios", - "Systeminfo_Services_Description": "Descripción del servicio", + "Systeminfo_Services_Description": "Descripci\u00f3n del servicio", "Systeminfo_Services_Name": "Nombre del servicio", "Systeminfo_Storage": "Almacenamiento", "Systeminfo_Storage_Device": "Dispositivo:", "Systeminfo_Storage_Mount": "Punto de montaje:", - "Systeminfo_Storage_Size": "Tamaño:", + "Systeminfo_Storage_Size": "Tama\u00f1o:", "Systeminfo_Storage_Type": "Tipo:", "Systeminfo_Storage_Usage": "Uso de almacenamiento", "Systeminfo_Storage_Usage_Free": "Libre:", @@ -679,7 +680,7 @@ "Systeminfo_System": "Sistema", "Systeminfo_System_AVG": "Cargar promedio:", "Systeminfo_System_Architecture": "Arquitectura:", - "Systeminfo_System_Kernel": "Núcleo:", + "Systeminfo_System_Kernel": "N\u00facleo:", "Systeminfo_System_OSVersion": "Sistema Operativo:", "Systeminfo_System_Running_Processes": "Procesos corriendo:", "Systeminfo_System_System": "Sistema:", @@ -687,66 +688,66 @@ "Systeminfo_System_Uptime": "Tiempo de actividad:", "Systeminfo_This_Client": "Este cliente", "Systeminfo_USB_Devices": "Dispositivos USB", - "TICKER_MIGRATE_TO_NETALERTX": "⚠ Ubicaciones de montaje antiguas detectadas. Siga esta guía para migrar a las nuevas carpetas /app/config y /app/db y el contenedor netalertx.", - "TIMEZONE_description": "La zona horaria para mostrar las estadísticas correctamente. Encuentra tu zona horaria aquí.", + "TICKER_MIGRATE_TO_NETALERTX": "\u26a0 Ubicaciones de montaje antiguas detectadas. Siga esta gu\u00eda para migrar a las nuevas carpetas /app/config y /app/db y el contenedor netalertx.", + "TIMEZONE_description": "La zona horaria para mostrar las estad\u00edsticas correctamente. Encuentra tu zona horaria aqu\u00ed.", "TIMEZONE_name": "Zona horaria", - "UI_DEV_SECTIONS_description": "Seleccione los elementos de la interfaz de usuario que desea ocultar en las páginas de dispositivos.", + "UI_DEV_SECTIONS_description": "Seleccione los elementos de la interfaz de usuario que desea ocultar en las p\u00e1ginas de dispositivos.", "UI_DEV_SECTIONS_name": "Ocultar secciones de los dispositivos", - "UI_ICONS_description": "Una lista de iconos predefinidos. Proceda con cautela, la forma preferida de añadir iconos se describe en la sección Iconos documentación. Puede añadir una etiqueta SVG HTML o Font-awesome HTML codificada con base64.", + "UI_ICONS_description": "Una lista de iconos predefinidos. Proceda con cautela, la forma preferida de a\u00f1adir iconos se describe en la secci\u00f3n Iconos documentaci\u00f3n. Puede a\u00f1adir una etiqueta SVG HTML o Font-awesome HTML codificada con base64.", "UI_ICONS_name": "Iconos predefinidos", - "UI_LANG_description": "Seleccione el idioma preferido para la interfaz de usuario. Ayude a traducir o sugiera idiomas en el portal en línea de Weblate.", + "UI_LANG_description": "Seleccione el idioma preferido para la interfaz de usuario. Ayude a traducir o sugiera idiomas en el portal en l\u00ednea de Weblate.", "UI_LANG_name": "Idioma de interfaz", "UI_MY_DEVICES_description": "Dispositivos cuyos estados deben mostrarse en la vista por defecto Mis dispositivos. (CTRL + Click para seleccionar/deseleccionar)", "UI_MY_DEVICES_name": "Mostrar en Mis dispositivos", - "UI_NOT_RANDOM_MAC_description": "Prefijos Mac que no deberían marcarse como dispositivos aleatorios. Introduzca por ejemplo 52 para excluir los dispositivos que empiecen por 52:xx:xx:xx:xx para ser marcados como dispositivos con una dirección MAC aleatoria.", + "UI_NOT_RANDOM_MAC_description": "Prefijos Mac que no deber\u00edan marcarse como dispositivos aleatorios. Introduzca por ejemplo 52 para excluir los dispositivos que empiecen por 52:xx:xx:xx:xx para ser marcados como dispositivos con una direcci\u00f3n MAC aleatoria.", "UI_NOT_RANDOM_MAC_name": "No marcar como aleatoria", - "UI_PRESENCE_description": "Elige que estados del dispositivo deben mostrarse en la gráfica de Presencia del dispositivo a lo largo del tiempo de la página de Dispositivos. (CTRL + Clic para seleccionar / deseleccionar)", - "UI_PRESENCE_name": "Mostrar en el gráfico de presencia", - "UI_REFRESH_description": "Ingrese el número de segundos después de los cuales se recarga la interfaz de usuario. Ajustado a 0 para desactivar.", - "UI_REFRESH_name": "Actualización automática de la interfaz de usuario", - "WEBHOOK_PAYLOAD_description": "El formato de datos de carga de Webhook para el atributo body > attachments > text en el json de carga. Vea un ejemplo de la carga aquí. (por ejemplo: para discord use text)", + "UI_PRESENCE_description": "Elige que estados del dispositivo deben mostrarse en la gr\u00e1fica de Presencia del dispositivo a lo largo del tiempo de la p\u00e1gina de Dispositivos. (CTRL + Clic para seleccionar / deseleccionar)", + "UI_PRESENCE_name": "Mostrar en el gr\u00e1fico de presencia", + "UI_REFRESH_description": "Ingrese el n\u00famero de segundos despu\u00e9s de los cuales se recarga la interfaz de usuario. Ajustado a 0 para desactivar.", + "UI_REFRESH_name": "Actualizaci\u00f3n autom\u00e1tica de la interfaz de usuario", + "WEBHOOK_PAYLOAD_description": "El formato de datos de carga de Webhook para el atributo body > attachments > text en el json de carga. Vea un ejemplo de la carga aqu\u00ed. (por ejemplo: para discord use text)", "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_name": "Método de solicitud", - "WEBHOOK_SIZE_description": "El tamaño máximo de la carga útil del webhook como número de caracteres en la cadena pasada. Si supera el límite, se truncará y se agregará un mensaje (text was truncated).", - "WEBHOOK_SIZE_name": "Tamaño máximo de carga útil", + "WEBHOOK_REQUEST_METHOD_description": "El m\u00e9todo de solicitud HTTP que se utilizar\u00e1 para la llamada de webhook.", + "WEBHOOK_REQUEST_METHOD_name": "M\u00e9todo de solicitud", + "WEBHOOK_SIZE_description": "El tama\u00f1o m\u00e1ximo de la carga \u00fatil del webhook como n\u00famero de caracteres en la cadena pasada. Si supera el l\u00edmite, se truncar\u00e1 y se agregar\u00e1 un mensaje (text was truncated).", + "WEBHOOK_SIZE_name": "Tama\u00f1o m\u00e1ximo de carga \u00fatil", "WEBHOOK_URL_description": "URL de destino comienza con http:// o https://.", "WEBHOOK_URL_name": "URL de destino", "Webhooks_display_name": "Webhooks", "Webhooks_icon": "", "Webhooks_settings_group": " Webhooks", "devices_old": "Volviendo a actualizar....", - "general_event_description": "El evento que has activado puede tardar un poco hasta que finalicen los procesos en segundo plano. La ejecución finalizó una vez que se vació la cola de ejecución de abajo (Compruebe el registro de errores si encuentra problemas).

    Cola de ejecución:", + "general_event_description": "El evento que has activado puede tardar un poco hasta que finalicen los procesos en segundo plano. La ejecuci\u00f3n finaliz\u00f3 una vez que se vaci\u00f3 la cola de ejecuci\u00f3n de abajo (Compruebe el registro de errores si encuentra problemas).

    Cola de ejecuci\u00f3n:", "general_event_title": "Ejecutar un evento ad-hoc", - "report_guid": "Guía de las notificaciones:", - "report_guid_missing": "No se encontró la notificación vinculada. Es posible que la notificación seleccionada se haya eliminado durante el mantenimiento especificado en el ajuste DBCLNP_NOTIFI_HIST. En su lugar se muestra la última notificación. La notificación que falta tiene el siguiente GUID:", + "report_guid": "Gu\u00eda de las notificaciones:", + "report_guid_missing": "No se encontr\u00f3 la notificaci\u00f3n vinculada. Es posible que la notificaci\u00f3n seleccionada se haya eliminado durante el mantenimiento especificado en el ajuste DBCLNP_NOTIFI_HIST. En su lugar se muestra la \u00faltima notificaci\u00f3n. La notificaci\u00f3n que falta tiene el siguiente GUID:", "report_select_format": "Selecciona el formato:", - "report_time": "Hora de la notificación:", + "report_time": "Hora de la notificaci\u00f3n:", "run_event_icon": "fa-play", "run_event_tooltip": "Activa el ajuste y guarda tus cambios antes de ejecutarlo.", "settings_core_icon": "fa-solid fa-gem", - "settings_core_label": "Núcleo", - "settings_device_scanners": "Los escáneres de los dispositivos se utilizan para descubrir dispositivos que escriben en la tabla de base de datos de CurrentScan.", + "settings_core_label": "N\u00facleo", + "settings_device_scanners": "Los esc\u00e1neres de los dispositivos se utilizan para descubrir dispositivos que escriben en la tabla de base de datos de CurrentScan.", "settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus", - "settings_device_scanners_label": "Escáneres de dispositivos", - "settings_enabled": "Configuración activada", + "settings_device_scanners_label": "Esc\u00e1neres de dispositivos", + "settings_enabled": "Configuraci\u00f3n activada", "settings_enabled_icon": "fa-solid fa-toggle-on", "settings_expand_all": "Expandir todo", - "settings_imported": "Última vez que los ajustes fueron importados desde el archivo app.conf", - "settings_imported_label": "Configuración importada", - "settings_missing": "Actualiza la página, no todos los ajustes se han cargado. Probablemente sea por una sobrecarga de la base de datos.", - "settings_missing_block": "No puedes guardar los ajustes sin establecer todas las claves. Actualiza la página. Problabmente esté causado por una sobrecarga de la base de datos.", + "settings_imported": "\u00daltima vez que los ajustes fueron importados desde el archivo app.conf", + "settings_imported_label": "Configuraci\u00f3n importada", + "settings_missing": "Actualiza la p\u00e1gina, no todos los ajustes se han cargado. Probablemente sea por una sobrecarga de la base de datos.", + "settings_missing_block": "No puedes guardar los ajustes sin establecer todas las claves. Actualiza la p\u00e1gina. Problabmente est\u00e9 causado por una sobrecarga de la base de datos.", "settings_old": "Importar ajustes y reiniciar...", - "settings_other_scanners": "Otros plugins de escáner no relacionados con dispositivos que están activados actualmente.", + "settings_other_scanners": "Otros plugins de esc\u00e1ner no relacionados con dispositivos que est\u00e1n activados actualmente.", "settings_other_scanners_icon": "fa-solid fa-recycle", - "settings_other_scanners_label": "Otros escáneres", - "settings_publishers": "Puertas de enlace para las notificación habilitadas: editores, que enviarán una notificación según su configuración.", + "settings_other_scanners_label": "Otros esc\u00e1neres", + "settings_publishers": "Puertas de enlace para las notificaci\u00f3n habilitadas: editores, que enviar\u00e1n una notificaci\u00f3n seg\u00fan su configuraci\u00f3n.", "settings_publishers_icon": "fa-solid fa-comment-dots", "settings_publishers_label": "Editores", - "settings_saved": "
    Configuración guardada en el archivo app.conf .

    Una copia de seguridad con marca de tiempo del archivo anterior.

    Recargando...
    ", + "settings_saved": "
    Configuraci\u00f3n guardada en el archivo app.conf .

    Una copia de seguridad con marca de tiempo del archivo anterior.

    Recargando...
    ", "settings_system_icon": "fa-solid fa-gear", "settings_system_label": "Sistema", - "settings_update_item_warning": "Actualice el valor a continuación. Tenga cuidado de seguir el formato anterior. O la validación no se realiza.", + "settings_update_item_warning": "Actualice el valor a continuaci\u00f3n. Tenga cuidado de seguir el formato anterior. O la validaci\u00f3n no se realiza.", "test_event_icon": "fa-vial-circle-check", "test_event_tooltip": "Guarda tus cambios antes de probar nuevos ajustes." -} +} \ No newline at end of file diff --git a/front/php/templates/language/fr_fr.json b/front/php/templates/language/fr_fr.json index e2603e68..84b1234b 100755 --- a/front/php/templates/language/fr_fr.json +++ b/front/php/templates/language/fr_fr.json @@ -273,6 +273,7 @@ "Gen_Error": "Erreur", "Gen_Filter": "", "Gen_LockedDB": "", + "Gen_Offline": "", "Gen_Okay": "OK", "Gen_Purge": "Purger", "Gen_ReadDocs": "", diff --git a/front/php/templates/language/it_it.json b/front/php/templates/language/it_it.json old mode 100644 new mode 100755 index 91f1dff7..843ba222 --- a/front/php/templates/language/it_it.json +++ b/front/php/templates/language/it_it.json @@ -1,5 +1,5 @@ { - "API_CUSTOM_SQL_description": "Puoi specificare una query SQL personalizzata che genererà un file JSON e quindi lo esporrà tramite l'table_custom_endpoint.jsonendpoint del file.", + "API_CUSTOM_SQL_description": "Puoi specificare una query SQL personalizzata che generer\u00e0 un file JSON e quindi lo esporr\u00e0 tramite l'table_custom_endpoint.jsonendpoint del file.", "API_CUSTOM_SQL_name": "Endpoint personalizzato", "API_display_name": "API", "API_icon": "", @@ -27,15 +27,15 @@ "BackDevDetail_Actions_Ask_Run": "Vuoi eseguire questa azione?", "BackDevDetail_Actions_Not_Registered": "Azione non registrata: ", "BackDevDetail_Actions_Title_Run": "Esegui azione", - "BackDevDetail_Copy_Ask": "Copiare i dettagli dal dispositivo dall'elenco a discesa (tutto in questa pagina verrà sovrascritto)?", + "BackDevDetail_Copy_Ask": "Copiare i dettagli dal dispositivo dall'elenco a discesa (tutto in questa pagina verr\u00e0 sovrascritto)?", "BackDevDetail_Copy_Title": "Copia dettagli", - "BackDevDetail_Tools_WOL_error": "Il comando NON è stato eseguito.", - "BackDevDetail_Tools_WOL_okay": "Il comando è stato eseguito.", + "BackDevDetail_Tools_WOL_error": "Il comando NON \u00e8 stato eseguito.", + "BackDevDetail_Tools_WOL_okay": "Il comando \u00e8 stato eseguito.", "BackDevices_Arpscan_disabled": "Arp-Scan Disabilitata", "BackDevices_Arpscan_enabled": "Arp-Scan Abilitata", - "BackDevices_Backup_CopError": "Non è stato possibile salvare il database originale.", - "BackDevices_Backup_Failed": "Il backup è stato eseguito parzialmente. L'archivio non è stato creato o è vuoto.", - "BackDevices_Backup_okay": "Il backup è stato eseguito correttamente con il nuovo archivio", + "BackDevices_Backup_CopError": "Non \u00e8 stato possibile salvare il database originale.", + "BackDevices_Backup_Failed": "Il backup \u00e8 stato eseguito parzialmente. L'archivio non \u00e8 stato creato o \u00e8 vuoto.", + "BackDevices_Backup_okay": "Il backup \u00e8 stato eseguito correttamente con il nuovo archivio", "BackDevices_DBTools_DelDevError_a": "Errore durante l'eliminazione del Dispositivo", "BackDevices_DBTools_DelDevError_b": "Errore durante l'eliminazione dei Dispositivi", "BackDevices_DBTools_DelDev_a": "Dispositivo eliminato", @@ -43,28 +43,28 @@ "BackDevices_DBTools_DelEvents": "Eventi eliminati", "BackDevices_DBTools_DelEventsError": "Errore durante l'eliminazione degli Eventi", "BackDevices_DBTools_ImportCSV": "I dispositivi sono stati importati correttamente dal file CSV.", - "BackDevices_DBTools_ImportCSVError": "Non è stato possibile importare il file CSV. Assicurati che il formato del file sia corretto.", - "BackDevices_DBTools_ImportCSVMissing": "Il file CSV non è stato trovato in /config/devices.csv.", + "BackDevices_DBTools_ImportCSVError": "Non \u00e8 stato possibile importare il file CSV. Assicurati che il formato del file sia corretto.", + "BackDevices_DBTools_ImportCSVMissing": "Il file CSV non \u00e8 stato trovato in /config/devices.csv.", "BackDevices_DBTools_Purge": "I backup meno recenti sono stati eliminati", "BackDevices_DBTools_UpdDev": "Dispositivo aggiornato correttamente", "BackDevices_DBTools_UpdDevError": "Errore durante l'aggiornamento del Dispositivo", "BackDevices_DBTools_Upgrade": "Database aggiornato correttamente", "BackDevices_DBTools_UpgradeError": "Aggiornamento del Database fallito", - "BackDevices_Device_UpdDevError": "Errore durante l'aggiornamento dei dispositivi, riprova più tardi. Il database è probabilmente bloccato a causa di un'attività in corso.", - "BackDevices_Restore_CopError": "Non è stato possibile salvare il database originale.", + "BackDevices_Device_UpdDevError": "Errore durante l'aggiornamento dei dispositivi, riprova pi\u00f9 tardi. Il database \u00e8 probabilmente bloccato a causa di un'attivit\u00e0 in corso.", + "BackDevices_Restore_CopError": "Non \u00e8 stato possibile salvare il database originale.", "BackDevices_Restore_Failed": "Ripristino fallito. Per favore effettuare il ripristino del backup manualmente.", "BackDevices_Restore_okay": "Ripristino eseguito correttamente.", "BackDevices_darkmode_disabled": "Darkmode Disabilitata", "BackDevices_darkmode_enabled": "Darkmode Abilitata", - "DAYS_TO_KEEP_EVENTS_description": "Questa è un'impostazione di manutenzione. Specifica il numero di giorni delle voci degli eventi che verranno conservati. Tutti gli eventi più vecchi verranno eliminati periodicamente. Si applica anche alla cronologia degli eventi del plugin (Plugin Events History).", + "DAYS_TO_KEEP_EVENTS_description": "Questa \u00e8 un'impostazione di manutenzione. Specifica il numero di giorni delle voci degli eventi che verranno conservati. Tutti gli eventi pi\u00f9 vecchi verranno eliminati periodicamente. Si applica anche alla cronologia degli eventi del plugin (Plugin Events History).", "DAYS_TO_KEEP_EVENTS_name": "Elimina eventi meno recenti di", "DevDetail_Copy_Device_Title": " Copia dettagli dal dispositivo", - "DevDetail_Copy_Device_Tooltip": "Copia i dettagli dal dispositivo dall'elenco a discesa. Tutto in questa pagina verrà sovrascritto", + "DevDetail_Copy_Device_Tooltip": "Copia i dettagli dal dispositivo dall'elenco a discesa. Tutto in questa pagina verr\u00e0 sovrascritto", "DevDetail_EveandAl_AlertAllEvents": "Notifica Tutti gli Eventi", "DevDetail_EveandAl_AlertDown": "Avviso se down", "DevDetail_EveandAl_Archived": "Archiviato", "DevDetail_EveandAl_NewDevice": "Nuovo Dispositivo", - "DevDetail_EveandAl_NewDevice_Tooltip": "Mostrerà il Nuovo stato del dispositivo e lo includerà negli elenchi quando il filtro Nuovi dispositivi è attivo. Non influisce sulle notifiche.", + "DevDetail_EveandAl_NewDevice_Tooltip": "Mostrer\u00e0 il Nuovo stato del dispositivo e lo includer\u00e0 negli elenchi quando il filtro Nuovi dispositivi \u00e8 attivo. Non influisce sulle notifiche.", "DevDetail_EveandAl_RandomMAC": "Indirizzo MAC casuale", "DevDetail_EveandAl_ScanCycle": "Scansiona dispositivo", "DevDetail_EveandAl_ScanCycle_a": "Scansiona dispositivo", @@ -89,27 +89,27 @@ "DevDetail_MainInfo_Type": "Tipo", "DevDetail_MainInfo_Vendor": "Venditore", "DevDetail_MainInfo_mac": "MAC", - "DevDetail_Network_Node_hover": "Seleziona il nodo padre a cui il dispositivo è connesso, per popolare l'Alberatura di Rete.", - "DevDetail_Network_Port_hover": "La porta del nodo padre a cui questo dispositivo è connesso. Se lasciato vuoto, verrà mostrata l'icona WiFi all'interno dell'Alberatura di Rete.", + "DevDetail_Network_Node_hover": "Seleziona il nodo padre a cui il dispositivo \u00e8 connesso, per popolare l'Alberatura di Rete.", + "DevDetail_Network_Port_hover": "La porta del nodo padre a cui questo dispositivo \u00e8 connesso. Se lasciato vuoto, verr\u00e0 mostrata l'icona WiFi all'interno dell'Alberatura di Rete.", "DevDetail_Nmap_Scans": "Scansione Nmap manuale", - "DevDetail_Nmap_Scans_desc": "Qui puoi eseguire scansioni manuali NMAP. Puoi anche pianificare scansioni automatiche NMAP attraverso il plugin Servizi e Porte (NMAP). Vai alle Impostazioni per scoprire 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 alle Impostazioni per scoprire di pi\u00f9", "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_buttonDetail": "Scansione dettagliata", - "DevDetail_Nmap_buttonDetail_text": "Scansione dettagliata: scansione predefinita con rilevamento del sistema operativo abilitato, rilevamento della versione, scansione degli script e traceroute (fino a 30 secondi o più)", + "DevDetail_Nmap_buttonDetail_text": "Scansione dettagliata: scansione predefinita con rilevamento del sistema operativo abilitato, rilevamento della versione, scansione degli script e traceroute (fino a 30 secondi o pi\u00f9)", "DevDetail_Nmap_buttonFast": "Scansione Veloce", "DevDetail_Nmap_buttonFast_text": "Scansione Veloce: Scansiona meno porte (100) della scansione predefinita (pochi secondi)", "DevDetail_Nmap_buttonSkipDiscovery": "Salta rilevazione host", "DevDetail_Nmap_buttonSkipDiscovery_text": "Salta rilevamento host (opzione -Pn): scansione predefinita senza rilevamento host", "DevDetail_Nmap_resultsLink": "Puoi lasciare questa pagina dopo aver avviato una scansione. I risultati saranno disponibili nel file app_front.log.", - "DevDetail_Owner_hover": "Chi è il proprietario di questo dispositivo. Campo a testo libero.", + "DevDetail_Owner_hover": "Chi \u00e8 il proprietario di questo dispositivo. Campo a testo libero.", "DevDetail_Periodselect_All": "Tutte le info", "DevDetail_Periodselect_LastMonth": "Ultimo Mese", "DevDetail_Periodselect_LastWeek": "Ultima Settimana", "DevDetail_Periodselect_LastYear": "Ultimo Anno", "DevDetail_Periodselect_today": "Oggi", "DevDetail_Run_Actions_Title": " Esegui azione su questo dispositivo", - "DevDetail_Run_Actions_Tooltip": "Esegui un'azione sul dispositivo corrente dal menù a tendina.", + "DevDetail_Run_Actions_Tooltip": "Esegui un'azione sul dispositivo corrente dal men\u00f9 a tendina.", "DevDetail_SessionInfo_FirstSession": "Prima Sessione", "DevDetail_SessionInfo_LastIP": "Ultimo IP", "DevDetail_SessionInfo_LastSession": "Ultima Sessione", @@ -146,43 +146,43 @@ "DevDetail_Tab_Presence": " Presenza", "DevDetail_Tab_Sessions": " Sessioni", "DevDetail_Tab_Tools": " Strumenti", - "DevDetail_Tab_Tools_Internet_Info_Description": "Lo strumento Informazioni Internet visualizza informazioni sulla connessione Internet, come indirizzo IP, città, paese, prefisso e fuso orario.", - "DevDetail_Tab_Tools_Internet_Info_Error": "Si è verificato un errore", + "DevDetail_Tab_Tools_Internet_Info_Description": "Lo strumento Informazioni Internet visualizza informazioni sulla connessione Internet, come indirizzo IP, citt\u00e0, paese, prefisso e fuso orario.", + "DevDetail_Tab_Tools_Internet_Info_Error": "Si \u00e8 verificato un errore", "DevDetail_Tab_Tools_Internet_Info_Start": "Avvia Info Internet", "DevDetail_Tab_Tools_Internet_Info_Title": "Info Internet", - "DevDetail_Tab_Tools_Nslookup_Description": "Nslookup è uno strumento a riga di comando utilizzato per interrogare il Domain Name System (DNS). DNS è u sistema di traduzione dei domini, come www.google.com, in indirizzi IP, come 172.217.0.142.", - "DevDetail_Tab_Tools_Nslookup_Error": "Errore: l'indirizzo IP non è valido", + "DevDetail_Tab_Tools_Nslookup_Description": "Nslookup \u00e8 uno strumento a riga di comando utilizzato per interrogare il Domain Name System (DNS). DNS \u00e8 u sistema di traduzione dei domini, come www.google.com, in indirizzi IP, come 172.217.0.142.", + "DevDetail_Tab_Tools_Nslookup_Error": "Errore: l'indirizzo IP non \u00e8 valido", "DevDetail_Tab_Tools_Nslookup_Start": "Avvia Nslookup", "DevDetail_Tab_Tools_Nslookup_Title": "Nslookup", - "DevDetail_Tab_Tools_Speedtest_Description": "The strumento Speedtest misura la velocità di download, la velocità di upload e la latenza della connessione internet.", + "DevDetail_Tab_Tools_Speedtest_Description": "The strumento Speedtest misura la velocit\u00e0 di download, la velocit\u00e0 di upload e la latenza della connessione internet.", "DevDetail_Tab_Tools_Speedtest_Start": "Avvia Speedtest", - "DevDetail_Tab_Tools_Speedtest_Title": "Test velocità online", - "DevDetail_Tab_Tools_Traceroute_Description": "Traceroute è un comando diagnostico di rete utilizzato per tracciare il percorso seguito dai pacchetti di dati da un host a un altro.

    Il comando utilizza l'Internet Control Message Protocol (ICMP) per inviare pacchetti ai nodi intermedi sul percorso, ciascun nodo intermedio risponde con un pacchetto di timeout ICMP (TTL timeout).

    L'output del comando traceroute visualizza l'indirizzo IP di ciascun nodo intermedio sul percorso.

    Il comando traceroute può essere utilizzato per diagnosticare problemi di rete, come ritardi, perdita di pacchetti e percorsi bloccati.

    Può anche essere utilizzato per identificare la posizione di un nodo intermedio su una rete.", - "DevDetail_Tab_Tools_Traceroute_Error": "Errore: l'indirizzo IP non è valido", + "DevDetail_Tab_Tools_Speedtest_Title": "Test velocit\u00e0 online", + "DevDetail_Tab_Tools_Traceroute_Description": "Traceroute \u00e8 un comando diagnostico di rete utilizzato per tracciare il percorso seguito dai pacchetti di dati da un host a un altro.

    Il comando utilizza l'Internet Control Message Protocol (ICMP) per inviare pacchetti ai nodi intermedi sul percorso, ciascun nodo intermedio risponde con un pacchetto di timeout ICMP (TTL timeout).

    L'output del comando traceroute visualizza l'indirizzo IP di ciascun nodo intermedio sul percorso.

    Il comando traceroute pu\u00f2 essere utilizzato per diagnosticare problemi di rete, come ritardi, perdita di pacchetti e percorsi bloccati.

    Pu\u00f2 anche essere utilizzato per identificare la posizione di un nodo intermedio su una rete.", + "DevDetail_Tab_Tools_Traceroute_Error": "Errore: l'indirizzo IP non \u00e8 valido", "DevDetail_Tab_Tools_Traceroute_Start": "Avvia Traceroute", "DevDetail_Tab_Tools_Traceroute_Title": "Traceroute", "DevDetail_Tools_WOL": "Invia comando WoL (Wake-on-LAN) a ", "DevDetail_Tools_WOL_noti": "Wake-on-LAN", - "DevDetail_Tools_WOL_noti_text": "Il comando Wake-on-LAN viene inviato all'indirizzo di broadcast. Se il destinatario non è nella subnet/VLAN di NetAlertX, egli non risponderà.", - "DevDetail_Type_hover": "Il Tipo del dispositivo. Se selezioni uno dei dispositivi di rete predefiniti (es.: AP, Firewall, Router, Switch...) verrà mostrato nell'alberatura di Rete come un possibile nodo padre.", + "DevDetail_Tools_WOL_noti_text": "Il comando Wake-on-LAN viene inviato all'indirizzo di broadcast. Se il destinatario non \u00e8 nella subnet/VLAN di NetAlertX, egli non risponder\u00e0.", + "DevDetail_Type_hover": "Il Tipo del dispositivo. Se selezioni uno dei dispositivi di rete predefiniti (es.: AP, Firewall, Router, Switch...) verr\u00e0 mostrato nell'alberatura di Rete come un possibile nodo padre.", "DevDetail_Vendor_hover": "Il Venditore dovrebbe essere auto-popolato. Puoi sovrascrivere o aggiungere un valore personalizzato.", "DevDetail_WOL_Title": " Wake-on-LAN", "DevDetail_button_AddIcon": "Aggiungi nuova Icona", "DevDetail_button_AddIcon_Help": "Inserisci un tag html SVG o un tag html Font Awesome. Leggi Icons docs per ulteriori dettagli.", - "DevDetail_button_AddIcon_Tooltip": "Aggiungi una nuova icona non disponibile nel menù a tendina a questo dispositivo.", + "DevDetail_button_AddIcon_Tooltip": "Aggiungi una nuova icona non disponibile nel men\u00f9 a tendina a questo dispositivo.", "DevDetail_button_Delete": "Elimina Dispositivo", "DevDetail_button_DeleteEvents": "Elimina Eventi", - "DevDetail_button_DeleteEvents_Warning": "Sei sicuro di voler eliminare tutti gli eventi di questo dispositivo?

    (questa azione cancellerà la Cronologia eventi e le Sessioni e potrebbe aiutare con costanti (persistenti ) notifiche)", + "DevDetail_button_DeleteEvents_Warning": "Sei sicuro di voler eliminare tutti gli eventi di questo dispositivo?

    (questa azione canceller\u00e0 la Cronologia eventi e le Sessioni e potrebbe aiutare con costanti (persistenti ) notifiche)", "DevDetail_button_OverwriteIcons": "Sovrascrivi Icone", "DevDetail_button_OverwriteIcons_Tooltip": "Sovrascrivi le icone di tutti i dispositivi con lo stesso Tipo Dispositivo", "DevDetail_button_OverwriteIcons_Warning": "Sei sicuro di voler sovrascrivere l'icona di tutti i dispositivi della stessa tipologia di quello selezionato?", "DevDetail_button_Reset": "Ripristina cambiamenti", "DevDetail_button_Save": "Salva", "Device_MultiEdit": "Modifica multipla", - "Device_MultiEdit_Backup": "Attenzione, l'inserimento di valori errati di seguito interromperà la configurazione. Effettua prima il backup del database o della configurazione dei dispositivi (fai clic per scaricare ). Leggi come ripristinare i dispositivi da questo file nella Documentazione di backup.", + "Device_MultiEdit_Backup": "Attenzione, l'inserimento di valori errati di seguito interromper\u00e0 la configurazione. Effettua prima il backup del database o della configurazione dei dispositivi (fai clic per scaricare ). Leggi come ripristinare i dispositivi da questo file nella Documentazione di backup.", "Device_MultiEdit_Fields": "Modifica campi:", "Device_MultiEdit_MassActions": "Azioni di massa:", - "Device_MultiEdit_Tooltip": "Attenzione. Cliccando verrà applicato il valore sulla sinistra a tutti i dispositivi selezionati.", + "Device_MultiEdit_Tooltip": "Attenzione. Cliccando verr\u00e0 applicato il valore sulla sinistra a tutti i dispositivi selezionati.", "Device_Searchbox": "Cerca", "Device_Shortcut_AllDevices": "I Miei Dispositivi", "Device_Shortcut_Archived": "Archiviati", @@ -222,9 +222,9 @@ "Device_Title": "Dispositivi", "Donations_Others": "Altri", "Donations_Platforms": "Piattaforme Sponsor", - "Donations_Text": "Hey 👋!
    Grazie per aver cliccato su questa voce di menù 😅

    Sto cercando di ricevere donazioni per poter fornire un software migliore. Inoltre potrebbe aiutarmi a non andare in burnout, in modo da poter supportare questa app più a lungo. Ogni piccola (ricorrente o non) sponsorizzazione mi invoglia a mettere più impegno nello sviluppo di questa app.
    Mi piacerebbe accorciare la mia settimana lavorativa e nel tempo rimanente, dedicarmi completamente su NetAlertX. Riceverete più funzionalità, un'applicazione più rifinita e con meno bug.

    Grazie per aver letto - Sono grato per ogni tipo di supporto ❤🙏

    TL;DR: Supportandomi otterrai:

    • Aggiornamenti più regolari per mantenere i tuoi dati e la tua famiglia sicuri 🔄
    • Meno bug 🐛🔫
    • Funzionalità migliori e più numerose➕
    • Io non vado in burnout 🔥🤯
    • Rilasci meno affrettati 💨
    • Migliore documentazione 📚
    • Supporto migliore e più veloce in caso di problemi 🆘

    📧Invia una mail a jokob@duck.com se vuoi contattarmi o chiedermi di aggiungere altre piattaforme di sponsorizzazione.
    ", + "Donations_Text": "Hey \ud83d\udc4b!
    Grazie per aver cliccato su questa voce di men\u00f9 \ud83d\ude05

    Sto cercando di ricevere donazioni per poter fornire un software migliore. Inoltre potrebbe aiutarmi a non andare in burnout, in modo da poter supportare questa app pi\u00f9 a lungo. Ogni piccola (ricorrente o non) sponsorizzazione mi invoglia a mettere pi\u00f9 impegno nello sviluppo di questa app.
    Mi piacerebbe accorciare la mia settimana lavorativa e nel tempo rimanente, dedicarmi completamente su NetAlertX. Riceverete pi\u00f9 funzionalit\u00e0, un'applicazione pi\u00f9 rifinita e con meno bug.

    Grazie per aver letto - Sono grato per ogni tipo di supporto \u2764\ud83d\ude4f

    TL;DR: Supportandomi otterrai:

    • Aggiornamenti pi\u00f9 regolari per mantenere i tuoi dati e la tua famiglia sicuri \ud83d\udd04
    • Meno bug \ud83d\udc1b\ud83d\udd2b
    • Funzionalit\u00e0 migliori e pi\u00f9 numerose\u2795
    • Io non vado in burnout \ud83d\udd25\ud83e\udd2f
    • Rilasci meno affrettati \ud83d\udca8
    • Migliore documentazione \ud83d\udcda
    • Supporto migliore e pi\u00f9 veloce in caso di problemi \ud83c\udd98

    \ud83d\udce7Invia una mail a jokob@duck.com se vuoi contattarmi o chiedermi di aggiungere altre piattaforme di sponsorizzazione.
    ", "Donations_Title": "Donazioni", - "ENABLE_PLUGINS_description": "Abilita la funzionalità plugin. Utilizzare i plugin richiede più risorse hardware, potresti voler disabilitare questa opzione sui dispositivi meno performanti.", + "ENABLE_PLUGINS_description": "Abilita la funzionalit\u00e0 plugin. Utilizzare i plugin richiede pi\u00f9 risorse hardware, potresti voler disabilitare questa opzione sui dispositivi meno performanti.", "ENABLE_PLUGINS_name": "Abilita Plugin", "Email_display_name": "Email", "Email_icon": "", @@ -267,15 +267,16 @@ "Gen_Backup": "Esegui Backup", "Gen_Cancel": "Annulla", "Gen_Copy": "Esegui", - "Gen_DataUpdatedUITakesTime": "OK: l'aggiornamento dell'interfaccia utente potrebbe richiedere del tempo se è in esecuzione una scansione.", + "Gen_DataUpdatedUITakesTime": "OK: l'aggiornamento dell'interfaccia utente potrebbe richiedere del tempo se \u00e8 in esecuzione una scansione.", "Gen_Delete": "Elimina", "Gen_DeleteAll": "Elimina tutti", "Gen_Error": "Errore", "Gen_Filter": "Filtra", - "Gen_LockedDB": "ERRORE - Il DB potrebbe essere bloccato - Controlla gli strumenti sviluppatore (F12) -> Console o riprova più tardi.", + "Gen_LockedDB": "ERRORE - Il DB potrebbe essere bloccato - Controlla gli strumenti sviluppatore (F12) -> Console o riprova pi\u00f9 tardi.", + "Gen_Offline": "", "Gen_Okay": "Ok", "Gen_Purge": "Svuota", - "Gen_ReadDocs": "Leggi di più nella documentazione.", + "Gen_ReadDocs": "Leggi di pi\u00f9 nella documentazione.", "Gen_Remove_All": "Rimuovi tutti", "Gen_Remove_Last": "Rimuovi ultimo", "Gen_Restore": "Esegui Ripristino", @@ -290,54 +291,54 @@ "Gen_Update": "Aggiorna", "Gen_Update_Value": "Aggiorna valore", "Gen_Warning": "Avviso", - "Gen_Work_In_Progress": "Work in progress, è un buon momento per un feedback a https://github.com/jokob-sk/NetAlertX/issues", + "Gen_Work_In_Progress": "Work in progress, \u00e8 un buon momento per un feedback a https://github.com/jokob-sk/NetAlertX/issues", "General_display_name": "Generale", "General_icon": "", - "HRS_TO_KEEP_NEWDEV_description": "Questa è un'opzione di manutenzione. Se abilitata (0 è disabilitata), tutti i dispositivi marcati con Nuovo Dispositivo verranno eliminati se l'orario della Prima Sessione è precedente all'orario di questa impostazione. Usa questa impostazione se vuoi eliminare automaticamente i Nuovi Dispositivi dopo X ore.", + "HRS_TO_KEEP_NEWDEV_description": "Questa \u00e8 un'opzione di manutenzione. Se abilitata (0 \u00e8 disabilitata), tutti i dispositivi marcati con Nuovo Dispositivo verranno eliminati se l'orario della Prima Sessione \u00e8 precedente all'orario di questa impostazione. Usa questa impostazione se vuoi eliminare automaticamente i Nuovi Dispositivi dopo X ore.", "HRS_TO_KEEP_NEWDEV_name": "Mantieni nuovi dispositivi per", "HelpFAQ_Cat_Detail": "Dettagli", "HelpFAQ_Cat_Detail_300_head": "Cosa significa ", "HelpFAQ_Cat_Detail_300_text_a": "rappresenta un dispositivo di rete (un dispositivo di tipo AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router, USB LAN Adapter, USB WIFI Adapter, o Internet). Tipi personalizzati possono essere aggiunti attraverso l'impostazione NETWORK_DEVICE_TYPES.", - "HelpFAQ_Cat_Detail_300_text_b": "indica il numero di porta del Nodo di Rete a cui il dispositivo corrente è connesso. Leggi questa guida per maggiori dettagli.", + "HelpFAQ_Cat_Detail_300_text_b": "indica il numero di porta del Nodo di Rete a cui il dispositivo corrente \u00e8 connesso. Leggi questa guida per maggiori dettagli.", "HelpFAQ_Cat_Detail_301_head_a": "Ogni quanto viene effettuata la scansione? In ", "HelpFAQ_Cat_Detail_301_head_b": " dice 1 minuto ma il grafico mostra intervalli di 5 minuti.", - "HelpFAQ_Cat_Detail_301_text": "L'intervallo di tempo tra le scansioni è definito dal \"Cronjob\", che è impostato a 5 minuti. La dicitura \"1 minuto\" si riferisci alla durata attesa di una scansione. In base alla configurazione di rete, questo valore potrebbe variare. Per modificare il \"Cronjob\", puoi usare il comando crontab -e sul terminale/console e cambiare l'intervallo di esecuzione.", + "HelpFAQ_Cat_Detail_301_text": "L'intervallo di tempo tra le scansioni \u00e8 definito dal \"Cronjob\", che \u00e8 impostato a 5 minuti. La dicitura \"1 minuto\" si riferisci alla durata attesa di una scansione. In base alla configurazione di rete, questo valore potrebbe variare. Per modificare il \"Cronjob\", puoi usare il comando crontab -e sul terminale/console e cambiare l'intervallo di esecuzione.", "HelpFAQ_Cat_Detail_302_head_a": "Cosa significa ", - "HelpFAQ_Cat_Detail_302_head_b": "e perché non posso selezionarlo?", - "HelpFAQ_Cat_Detail_302_text": "Alcuni dispositivi di recente produzione generano indirizzi MAC casuali per questioni di privacy, i quali non possono quindi essere associati ad una produttore e che cambiano ad ogni nuova connessione. NetAlertX rileva se il dispositivo utilizza un MAC casuale e abilita automaticamente questo campo. Per disabilitare questo comportamento è necessario agire direttamente sulle impostazioni di rete del dispositivo.", - "HelpFAQ_Cat_Detail_303_head": "Cosa è Nmap e a cosa serve?", - "HelpFAQ_Cat_Detail_303_text": "Nmap è uno scanner di rete con molteplici funzionalità.
    Quando un nuovo dispositivo appare nella lista, hai la possibilità di ottenere ulteriori dettagli sul dispositivo attraverso una scansione Nmap.", + "HelpFAQ_Cat_Detail_302_head_b": "e perch\u00e9 non posso selezionarlo?", + "HelpFAQ_Cat_Detail_302_text": "Alcuni dispositivi di recente produzione generano indirizzi MAC casuali per questioni di privacy, i quali non possono quindi essere associati ad una produttore e che cambiano ad ogni nuova connessione. NetAlertX rileva se il dispositivo utilizza un MAC casuale e abilita automaticamente questo campo. Per disabilitare questo comportamento \u00e8 necessario agire direttamente sulle impostazioni di rete del dispositivo.", + "HelpFAQ_Cat_Detail_303_head": "Cosa \u00e8 Nmap e a cosa serve?", + "HelpFAQ_Cat_Detail_303_text": "Nmap \u00e8 uno scanner di rete con molteplici funzionalit\u00e0.
    Quando un nuovo dispositivo appare nella lista, hai la possibilit\u00e0 di ottenere ulteriori dettagli sul dispositivo attraverso una scansione Nmap.", "HelpFAQ_Cat_Device_200_head": "Nella mia lista sono presenti dispositivi che non conosco. Dopo averli eliminati, riappaiono costantemente.", - "HelpFAQ_Cat_Device_200_text": "Se utilizzi Pi-hole, tieni presente che NetAlertX recupera le informazioni da Pi-hole. Metti in pausa NetAlertX, vai alla pagina delle impostazioni in Pi-hole ed elimina il lease DHCP, se necessario. Quindi, sempre in Pi-hole, guarda in Tools -> Network per vedere se riesci a trovare lì gli host ricorrenti. Se sì, eliminali anche lì. Ora puoi riavviare NetAlertX. Ora i dispositivi non dovrebbero più essere visualizzati.", + "HelpFAQ_Cat_Device_200_text": "Se utilizzi Pi-hole, tieni presente che NetAlertX recupera le informazioni da Pi-hole. Metti in pausa NetAlertX, vai alla pagina delle impostazioni in Pi-hole ed elimina il lease DHCP, se necessario. Quindi, sempre in Pi-hole, guarda in Tools -> Network per vedere se riesci a trovare l\u00ec gli host ricorrenti. Se s\u00ec, eliminali anche l\u00ec. Ora puoi riavviare NetAlertX. Ora i dispositivi non dovrebbero pi\u00f9 essere visualizzati.", "HelpFAQ_Cat_General": "Generale", "HelpFAQ_Cat_General_100_head": "L'orario in alto a destra e l'orario degli eventi/presenze non sono corretti (orario sfasato).", - "HelpFAQ_Cat_General_100_text_a": "Sul tuo PC è impostato il seguente fuso orario per l'ambiente PHP:", - "HelpFAQ_Cat_General_100_text_b": "Se questa time zone non è corretta, dovresti cambiarla nel file di configurazione PHP. Puoi trovarlo nella seguente directory:", - "HelpFAQ_Cat_General_100_text_c": "Cerca in questo file il valore \"date.timezone\", rimuovi il \";\" ad inizio riga se presente e inserisci la time zone desiderata. Una lista con le time zone supportate è presente qui (Link)", + "HelpFAQ_Cat_General_100_text_a": "Sul tuo PC \u00e8 impostato il seguente fuso orario per l'ambiente PHP:", + "HelpFAQ_Cat_General_100_text_b": "Se questa time zone non \u00e8 corretta, dovresti cambiarla nel file di configurazione PHP. Puoi trovarlo nella seguente directory:", + "HelpFAQ_Cat_General_100_text_c": "Cerca in questo file il valore \"date.timezone\", rimuovi il \";\" ad inizio riga se presente e inserisci la time zone desiderata. Una lista con le time zone supportate \u00e8 presente qui (Link)", "HelpFAQ_Cat_General_101_head": "La mia rete sembra rallentare, lo streaming si \"freeza\".", - "HelpFAQ_Cat_General_101_text": "Potrebbe essere che i dispositivi meno potenti raggiungano il loro limite di prestazioni nella modalità con cui NetAlertX identifica i nuovi dispositivi sulla rete. Questo è ancor più amplificato se i dispositivi comunicano con la rete attraverso la WLAN. Una soluzione potrebbe essere quella di passare ad una connessione cablata se possibile, o se il dispositivo viene utilizzato per un periodo di tempo limitato, utilizzare arp scan.", - "HelpFAQ_Cat_General_102_head": "Ottengo il messaggio che dice che il database è in modalità sola lettura.", + "HelpFAQ_Cat_General_101_text": "Potrebbe essere che i dispositivi meno potenti raggiungano il loro limite di prestazioni nella modalit\u00e0 con cui NetAlertX identifica i nuovi dispositivi sulla rete. Questo \u00e8 ancor pi\u00f9 amplificato se i dispositivi comunicano con la rete attraverso la WLAN. Una soluzione potrebbe essere quella di passare ad una connessione cablata se possibile, o se il dispositivo viene utilizzato per un periodo di tempo limitato, utilizzare arp scan.", + "HelpFAQ_Cat_General_102_head": "Ottengo il messaggio che dice che il database \u00e8 in modalit\u00e0 sola lettura.", "HelpFAQ_Cat_General_102_text": "Controlla all'interno della cartella di NetAlertX se la cartella del database (db) ha i permessi corretti:
    drwxrwx--- 2 (il tuo username) www-data
    Se i permessi non sono corretti, puoi reimpostarli con i seguenti comandi attraverso il terminale:
    sudo chgrp -R www-data /app/db
    chmod -R 770 /app/db

    Se il database risulta ancora come read-only, prova a reinstallare o a ripristinare un backup del database dalla pagina di manutenzione.", "HelpFAQ_Cat_General_102docker_head": "Problemi con il database (errori AJAX, read-only, not found)", - "HelpFAQ_Cat_General_102docker_text": "Controlla nuovamente di aver seguito il readme dockerfile (info più aggiornate).

    • Scarica il database originale da GitHub.
    • Mappa il file app.db () non cartella) visto sopra a /app/db/app.db (vedi gli esempi per maggiori dettagli).
    • Se riscontri problemi (errori AJAX, impossibile scrivere sul DB, ecc.) assicurati che i permessi siano correttamente impostati, in alternativa controlla i log presenti in /app/front/log.
    • Per risolvere i problemi relativi ai permessi puoi provare a creare un backup del database e poi eseguire un Ripristino DB dalla sezione Manutenzione > Backup/Ripristino.
    • Se il database risulta in modalità sola lettura puoi risolvere impostando l'owner e il gruppo eseguento questo comando sull'host system: docker exec netalertx chown -R www-data:www-data /app/db/app.db.
    ", + "HelpFAQ_Cat_General_102docker_text": "Controlla nuovamente di aver seguito il readme dockerfile (info pi\u00f9 aggiornate).

    • Scarica il database originale da GitHub.
    • Mappa il file app.db ()\u26a0 non cartella) visto sopra a /app/db/app.db (vedi gli esempi per maggiori dettagli).
    • Se riscontri problemi (errori AJAX, impossibile scrivere sul DB, ecc.) assicurati che i permessi siano correttamente impostati, in alternativa controlla i log presenti in /app/front/log.
    • Per risolvere i problemi relativi ai permessi puoi provare a creare un backup del database e poi eseguire un Ripristino DB dalla sezione Manutenzione > Backup/Ripristino.
    • Se il database risulta in modalit\u00e0 sola lettura puoi risolvere impostando l'owner e il gruppo eseguento questo comando sull'host system: docker exec netalertx chown -R www-data:www-data /app/db/app.db.
    ", "HelpFAQ_Cat_General_103_head": "La pagina di login non appare, anche dopo aver cambiato la password.", "HelpFAQ_Cat_General_103_text": "Oltre alla password, il file di configurazione /app/config/app.conf deve contenere anche il parametro PIALERT_WEB_PROTECTION impostato a True.", "HelpFAQ_Cat_Network_600_head": "A cosa serve questa pagina?", - "HelpFAQ_Cat_Network_600_text": "Questa pagina dovrebbe offrire la possibilità di mappare l'assegnazione dei tuoi dispositivi di rete. A questo scopo, puoi creare uno o più switch, WLAN, router, ecc., associargli un numero di porte se necessario, ed assegnare ad essi i dispositivi di rete già individuati. Questo assegnamento può essere fatto all'interno della vista di dettaglio del dispostivo da assegnare. In questo modo è possibile determinare velocemente a quale porta un host è collegato e se è online. Leggi questa guida per maggiori informazioni.", + "HelpFAQ_Cat_Network_600_text": "Questa pagina dovrebbe offrire la possibilit\u00e0 di mappare l'assegnazione dei tuoi dispositivi di rete. A questo scopo, puoi creare uno o pi\u00f9 switch, WLAN, router, ecc., associargli un numero di porte se necessario, ed assegnare ad essi i dispositivi di rete gi\u00e0 individuati. Questo assegnamento pu\u00f2 essere fatto all'interno della vista di dettaglio del dispostivo da assegnare. In questo modo \u00e8 possibile determinare velocemente a quale porta un host \u00e8 collegato e se \u00e8 online. Leggi questa guida per maggiori informazioni.", "HelpFAQ_Cat_Network_601_head": "Esiste ulteriore documentazione?", "HelpFAQ_Cat_Network_601_text": "Si, esiste! Visita tutta la documentazione per ulteriori informazioni.", "HelpFAQ_Cat_Presence_400_head": "I dispositivi sono visualizzati con un simbolo giallo e la nota \"evento mancante\".", - "HelpFAQ_Cat_Presence_400_text": "In questo caso, hai la possibilità di eliminare gli eventi per il dispositivo in questione (vista dettagliata). Un'altra possibilità è quella di accendere il dispositivo e aspettare che NetAlertX lo rilevi come \"online\" durante la successiva scansione, successivamente spegnere nuovamente il dispositivo. Ora NetAlertX dovrebbe salvare correttamente lo stato del dispositivo nel database alla successiva scansione.", - "HelpFAQ_Cat_Presence_401_head": "Un dispositivo viene segnalato come presente anche se è \"Offline\".", - "HelpFAQ_Cat_Presence_401_text": "Se questo accade, hai la possibilità di eliminare gli eventi per il dispositivo in questione (vista di dettaglio). Un'altra possibilità potrebbe essere quella di accendere il dispositivo, attendere finchè NetAlertX riconosca il dispositivo come \"online\" con la scansione successiva e poi spegnere il dispositivo. Ora NetAlertX dovrebbe tenere traccia dello stato del dispositivo correttamente con la prossima scansione.", + "HelpFAQ_Cat_Presence_400_text": "In questo caso, hai la possibilit\u00e0 di eliminare gli eventi per il dispositivo in questione (vista dettagliata). Un'altra possibilit\u00e0 \u00e8 quella di accendere il dispositivo e aspettare che NetAlertX lo rilevi come \"online\" durante la successiva scansione, successivamente spegnere nuovamente il dispositivo. Ora NetAlertX dovrebbe salvare correttamente lo stato del dispositivo nel database alla successiva scansione.", + "HelpFAQ_Cat_Presence_401_head": "Un dispositivo viene segnalato come presente anche se \u00e8 \"Offline\".", + "HelpFAQ_Cat_Presence_401_text": "Se questo accade, hai la possibilit\u00e0 di eliminare gli eventi per il dispositivo in questione (vista di dettaglio). Un'altra possibilit\u00e0 potrebbe essere quella di accendere il dispositivo, attendere finch\u00e8 NetAlertX riconosca il dispositivo come \"online\" con la scansione successiva e poi spegnere il dispositivo. Ora NetAlertX dovrebbe tenere traccia dello stato del dispositivo correttamente con la prossima scansione.", "HelpFAQ_Title": "Aiuto / FAQ", - "LOADED_PLUGINS_description": "Quali Plugin caricare. Aggiungere plugin potrebbe rallentare l'applicazione. Leggi di più su quali plugin necessitano di essere abilitati, tipi e opzioni di scansione nella documentazione plugin. I plugin disinstallati perdono la loro configurazione. Solo i plugin disabilitati possono essere disinstallati.", + "LOADED_PLUGINS_description": "Quali Plugin caricare. Aggiungere plugin potrebbe rallentare l'applicazione. Leggi di pi\u00f9 su quali plugin necessitano di essere abilitati, tipi e opzioni di scansione nella documentazione plugin. I plugin disinstallati perdono la loro configurazione. Solo i plugin disabilitati possono essere disinstallati.", "LOADED_PLUGINS_name": "Plugin caricati", - "LOG_LEVEL_description": "Questa impostazione abilita logging più dettagliato. Utile per il debugging degli eventi salvati sul database.", + "LOG_LEVEL_description": "Questa impostazione abilita logging pi\u00f9 dettagliato. Utile per il debugging degli eventi salvati sul database.", "LOG_LEVEL_name": "Stampa logging aggiuntivo", "Loading": "Caricamento...", "Login_Box": "Inserisci la tua password", - "Login_Default_PWD": "La password predefinita \"123456\" è ancora attiva.", + "Login_Default_PWD": "La password predefinita \"123456\" \u00e8 ancora attiva.", "Login_Psw-box": "Password", "Login_Psw_alert": "Avviso password!", "Login_Psw_folder": "nella cartella di configurazione.", @@ -358,8 +359,8 @@ "Maintenance_Tool_ExportCSV_text": "Genera un file CSV (comma separated value) contenente la lista dei Dispositivi incluse le relazioni di Rete tra i Nodi di Rete e i dispositivi connessi. Puoi anche eseguire questa azione accedendo all'URL il tuo NetAlertX/php/server/devices.php?action=ExportCSV o abilitando il plugin CSV Backup.", "Maintenance_Tool_ImportCSV": "Importa CSV", "Maintenance_Tool_ImportCSV_noti": "Importa CSV", - "Maintenance_Tool_ImportCSV_noti_text": "Sei sicuro di voler importare il file CSV? Questa operazione sovrascriverà tutti i dispositivi presenti nel database.", - "Maintenance_Tool_ImportCSV_text": "Prima di utilizzare questa funzionalità, per favore esegui un backup. Importa un file CSV (comma separated value) contenente la lista dei Dispositivi incluse le Relazioni di Rete tra i Nodi di Rete e i dispositivi connessi. Per far ciò posiziona il file CSV denominato devices.csv nella cartella /config.", + "Maintenance_Tool_ImportCSV_noti_text": "Sei sicuro di voler importare il file CSV? Questa operazione sovrascriver\u00e0 tutti i dispositivi presenti nel database.", + "Maintenance_Tool_ImportCSV_text": "Prima di utilizzare questa funzionalit\u00e0, per favore esegui un backup. Importa un file CSV (comma separated value) contenente la lista dei Dispositivi incluse le Relazioni di Rete tra i Nodi di Rete e i dispositivi connessi. Per far ci\u00f2 posiziona il file CSV denominato devices.csv nella cartella /config.", "Maintenance_Tool_arpscansw": "Abilita arp-scan (on/off)", "Maintenance_Tool_arpscansw_noti": "Abilita arp-scan on o off", "Maintenance_Tool_arpscansw_noti_text": "Quando una scansione viene disabilitata, rimane disabilitata fino a che non viene abilitata nuovamente.", @@ -369,37 +370,37 @@ "Maintenance_Tool_backup_noti_text": "Sei sicuro di voler eseguire un backup del database? Assicurati che nessuna scansione sia attualmente in esecuzione.", "Maintenance_Tool_backup_text": "I backup del database sono posizionati nella cartella del database come archivi zip, nominati con la data di creazione. Non esiste un numero massimo di backup.", "Maintenance_Tool_check_visible": "Deseleziona per nascondere la colonna.", - "Maintenance_Tool_darkmode": "Cambia modalità (Scuro/Chiaro)", - "Maintenance_Tool_darkmode_noti": "Cambia modalità", + "Maintenance_Tool_darkmode": "Cambia modalit\u00e0 (Scuro/Chiaro)", + "Maintenance_Tool_darkmode_noti": "Cambia modalit\u00e0", "Maintenance_Tool_darkmode_noti_text": "Dopo aver cambiato tema, la pagina prova a ricaricarsi in automatico per attivare le modifiche. Se necessario, la cache deve essere ripulita.", - "Maintenance_Tool_darkmode_text": "Cambia tra modalità chiara e scura. Se il cambio non avviene correttamente, prova a ripulire la cache del browser. La modifica avviene lato server, quindi influenza tutti i dispositivi in uso.", - "Maintenance_Tool_del_ActHistory": "Eliminazione delle attività di rete", - "Maintenance_Tool_del_ActHistory_noti": "Elimina attività di rete", - "Maintenance_Tool_del_ActHistory_noti_text": "Sei sicuro di voler resettare le attività di rete?", - "Maintenance_Tool_del_ActHistory_text": "Il grafico delle attività di rete viene resettato. Questo non influenza gli eventi.", + "Maintenance_Tool_darkmode_text": "Cambia tra modalit\u00e0 chiara e scura. Se il cambio non avviene correttamente, prova a ripulire la cache del browser. La modifica avviene lato server, quindi influenza tutti i dispositivi in uso.", + "Maintenance_Tool_del_ActHistory": "Eliminazione delle attivit\u00e0 di rete", + "Maintenance_Tool_del_ActHistory_noti": "Elimina attivit\u00e0 di rete", + "Maintenance_Tool_del_ActHistory_noti_text": "Sei sicuro di voler resettare le attivit\u00e0 di rete?", + "Maintenance_Tool_del_ActHistory_text": "Il grafico delle attivit\u00e0 di rete viene resettato. Questo non influenza gli eventi.", "Maintenance_Tool_del_alldev": "Elimina tutti i Dispositivi", "Maintenance_Tool_del_alldev_noti": "Elimina Dispositivi", "Maintenance_Tool_del_alldev_noti_text": "Sei sicuro di voler eliminare tutti i dispositivi?", - "Maintenance_Tool_del_alldev_text": "Prima di utilizzare questa funzione, per favore esegui un backup. L'eliminazione non può essere annullata. Tutti i dispositivi verranno eliminati dal database.", + "Maintenance_Tool_del_alldev_text": "Prima di utilizzare questa funzione, per favore esegui un backup. L'eliminazione non pu\u00f2 essere annullata. Tutti i dispositivi verranno eliminati dal database.", "Maintenance_Tool_del_allevents": "Elimina eventi (Reset Presenze)", "Maintenance_Tool_del_allevents30": "Elimina tutti gli eventi meno recenti di 30 giorni", "Maintenance_Tool_del_allevents30_noti": "Elimina eventi", - "Maintenance_Tool_del_allevents30_noti_text": "Sei sicuro di voler eliminare tutti gli eventi meno recenti di 30 giorni? Questo resetterà la Presenza dei Dispositivi.", - "Maintenance_Tool_del_allevents30_text": "Prima di utilizzare questa funzionalità, per favore esegui un backup. L'eliminazione non può essere annullata. Tutti gli eventi meno recenti di 30 giorni presenti nel database verranno eliminati. La presenza di tutti i dispositivi verrà resettata. Questo può portare a sessioni invalide. Questo significa che i dispositivi verranno mostrati come \"presenti\" anche se sono offline. Una scansione mentre il dispositivo è online risolverà il problema.", + "Maintenance_Tool_del_allevents30_noti_text": "Sei sicuro di voler eliminare tutti gli eventi meno recenti di 30 giorni? Questo resetter\u00e0 la Presenza dei Dispositivi.", + "Maintenance_Tool_del_allevents30_text": "Prima di utilizzare questa funzionalit\u00e0, per favore esegui un backup. L'eliminazione non pu\u00f2 essere annullata. Tutti gli eventi meno recenti di 30 giorni presenti nel database verranno eliminati. La presenza di tutti i dispositivi verr\u00e0 resettata. Questo pu\u00f2 portare a sessioni invalide. Questo significa che i dispositivi verranno mostrati come \"presenti\" anche se sono offline. Una scansione mentre il dispositivo \u00e8 online risolver\u00e0 il problema.", "Maintenance_Tool_del_allevents_noti": "Elimina eventi", - "Maintenance_Tool_del_allevents_noti_text": "Sei sicuro di voler eliminare tutti gli Eventi? Questo resetterà la Presenza di tutti i Dispositivi.", - "Maintenance_Tool_del_allevents_text": "Prima di utilizzare questa funzionalità, per favore esegui un backup. L'eliminazione non può essere annullata. Tutti gli eventi nel database verranno eliminati. La presenza di tutti i dispositivi verrà resettata. Questo può portare a sessioni invalide. Questo significa che i dispositivi verranno mostrati come \"presenti\" anche se sono offline. Una scansione mentre il dispositivo è online risolverà il problema.", + "Maintenance_Tool_del_allevents_noti_text": "Sei sicuro di voler eliminare tutti gli Eventi? Questo resetter\u00e0 la Presenza di tutti i Dispositivi.", + "Maintenance_Tool_del_allevents_text": "Prima di utilizzare questa funzionalit\u00e0, per favore esegui un backup. L'eliminazione non pu\u00f2 essere annullata. Tutti gli eventi nel database verranno eliminati. La presenza di tutti i dispositivi verr\u00e0 resettata. Questo pu\u00f2 portare a sessioni invalide. Questo significa che i dispositivi verranno mostrati come \"presenti\" anche se sono offline. Una scansione mentre il dispositivo \u00e8 online risolver\u00e0 il problema.", "Maintenance_Tool_del_empty_macs": "Elimina Dispositivi senza indirizzo MAC", "Maintenance_Tool_del_empty_macs_noti": "Elimina Dispositivi", "Maintenance_Tool_del_empty_macs_noti_text": "Sei sicuro di voler eliminare tutti i dispositivi senza indirizzo MAC?
    (forse preferisci archiviarli)", - "Maintenance_Tool_del_empty_macs_text": "Prima di utilizzare questa funzione, per favore esegui un backup. L'eliminazione non può essere annullata. Tutti i dispositivi senza indirizzo MAC verranno eliminati dal database.", + "Maintenance_Tool_del_empty_macs_text": "Prima di utilizzare questa funzione, per favore esegui un backup. L'eliminazione non pu\u00f2 essere annullata. Tutti i dispositivi senza indirizzo MAC verranno eliminati dal database.", "Maintenance_Tool_del_selecteddev": "Elimina dispositivi selezionati", - "Maintenance_Tool_del_selecteddev_text": "Prima di utilizzare questa funzione, per favore esegui un backup. L'eliminazione non può essere annullata. Tutti i dispositivi selezionati verranno eliminati dal database.", + "Maintenance_Tool_del_selecteddev_text": "Prima di utilizzare questa funzione, per favore esegui un backup. L'eliminazione non pu\u00f2 essere annullata. Tutti i dispositivi selezionati verranno eliminati dal database.", "Maintenance_Tool_del_unknowndev": "Elimina dispositivi (sconosciuti)", "Maintenance_Tool_del_unknowndev_noti": "Elimina dispositivi (sconosciuti)", "Maintenance_Tool_del_unknowndev_noti_text": "Sei sicuro di voler eliminare tutti i dispositivi (sconosciuti) e (senza nome)?", - "Maintenance_Tool_del_unknowndev_text": "Prima di utilizzare questa funzione, per favore esegui un backup. L'eliminazione non può essere annullata. Tutti i dispositivi (sconosciuti) verranno eliminati dal database.", - "Maintenance_Tool_displayed_columns_text": "Cambia la visibilità e l'ordine delle colonne nella pagina Dispositivi.", + "Maintenance_Tool_del_unknowndev_text": "Prima di utilizzare questa funzione, per favore esegui un backup. L'eliminazione non pu\u00f2 essere annullata. Tutti i dispositivi (sconosciuti) verranno eliminati dal database.", + "Maintenance_Tool_displayed_columns_text": "Cambia la visibilit\u00e0 e l'ordine delle colonne nella pagina Dispositivi.", "Maintenance_Tool_drag_me": "Trascinami per riordinare le colonne.", "Maintenance_Tool_order_columns_text": "", "Maintenance_Tool_purgebackup": "Svuota Backup", @@ -409,20 +410,20 @@ "Maintenance_Tool_restore": "Ripristino DB", "Maintenance_Tool_restore_noti": "Ripristino DB", "Maintenance_Tool_restore_noti_text": "Sei sicuro di voler eseguire il ripristino del Database? Assicurati che non ci siano scansioni in esecuzione.", - "Maintenance_Tool_restore_text": "Il backup più recente può essere ripristinato attraverso questo pulsante, ma gli altri backup possono essere solo ripristinati manualmente. Dopo il ripristino, esegui un controllo d'integrità del database per sicurezza, nel caso in cui il database fosse in scrittura nel momento in cui il backup è stato creato.", + "Maintenance_Tool_restore_text": "Il backup pi\u00f9 recente pu\u00f2 essere ripristinato attraverso questo pulsante, ma gli altri backup possono essere solo ripristinati manualmente. Dopo il ripristino, esegui un controllo d'integrit\u00e0 del database per sicurezza, nel caso in cui il database fosse in scrittura nel momento in cui il backup \u00e8 stato creato.", "Maintenance_Tool_upgrade_database_noti": "Aggiorna database", "Maintenance_Tool_upgrade_database_noti_text": "Sei sicuro di voler aggiornare il database?
    (forse preferisci archiviarlo)", - "Maintenance_Tool_upgrade_database_text": "Questo pulsante effettuerà l'upgrade del database per abilitare le attività di Rete delle scorse 12 ore. Per favore esegui un backup del database in caso di errori.", + "Maintenance_Tool_upgrade_database_text": "Questo pulsante effettuer\u00e0 l'upgrade del database per abilitare le attivit\u00e0 di Rete delle scorse 12 ore. Per favore esegui un backup del database in caso di errori.", "Maintenance_Tools_Tab_BackupRestore": "Backup / Ripristino", "Maintenance_Tools_Tab_Logging": "Log", "Maintenance_Tools_Tab_Settings": "Impostazioni", "Maintenance_Tools_Tab_Tools": "Strumenti", "Maintenance_Tools_Tab_UISettings": "Impostazioni UI", "Maintenance_arp_status": "Stato scansione", - "Maintenance_arp_status_off": "è attualmente disabilitato", + "Maintenance_arp_status_off": "\u00e8 attualmente disabilitato", "Maintenance_arp_status_on": "scansione/i attualmente in esecuzione", "Maintenance_built_on": "Rilasciato il", - "Maintenance_current_version": "L'applicazione è aggiornata all'ultima versione. Controlla a cosa sto lavorando.", + "Maintenance_current_version": "L'applicazione \u00e8 aggiornata all'ultima versione. Controlla a cosa sto lavorando.", "Maintenance_database_backup": "Backup Database", "Maintenance_database_backup_found": "backup sono stati trovati", "Maintenance_database_backup_total": "utilizzo totale disco", @@ -434,13 +435,13 @@ "Maintenance_lang_selector_empty": "Scegli lingua", "Maintenance_lang_selector_lable": "Seleziona lingua", "Maintenance_lang_selector_text": "Questa modifica avviene lato client, quindi influenza solo il browser attualmente in uso.", - "Maintenance_new_version": "🆕 E' disponibile una nuova versione. Controlla le note di rilascio.", + "Maintenance_new_version": "\ud83c\udd95 E' disponibile una nuova versione. Controlla le note di rilascio.", "Maintenance_themeselector_apply": "Applica", "Maintenance_themeselector_empty": "Seleziona una Skin", "Maintenance_themeselector_lable": "Seleziona Skin", "Maintenance_themeselector_text": "Questa modifica avviene lato server, quindi influenza tutti i dispositivi in uso.", "Maintenance_version": "Aggiornamenti App", - "NETWORK_DEVICE_TYPES_description": "Quali tipi di dispositivi possono essere utilizzati come dispositivi di rete nella vista di Rete. La tipologia del dispositivo deve essere uguale all'opzione Tipo presente nella vista di dettaglio dello specifico Dispositivo. Non rimuovere i tipi già presenti, aggiungili soltanto.", + "NETWORK_DEVICE_TYPES_description": "Quali tipi di dispositivi possono essere utilizzati come dispositivi di rete nella vista di Rete. La tipologia del dispositivo deve essere uguale all'opzione Tipo presente nella vista di dettaglio dello specifico Dispositivo. Non rimuovere i tipi gi\u00e0 presenti, aggiungili soltanto.", "NETWORK_DEVICE_TYPES_name": "Tipologie Dispositivi di Rete", "Navigation_About": "Informazioni su", "Navigation_Devices": "Dispositivi", @@ -458,7 +459,7 @@ "Navigation_SystemInfo": "Info sistema", "Navigation_Workflows": "Workflow", "Network_Assign": "Connetti a questo Nodo di Rete", - "Network_Cant_Assign": "Non è possibile assegnare il nodo Internet come nodo foglia.", + "Network_Cant_Assign": "Non \u00e8 possibile assegnare il nodo Internet come nodo foglia.", "Network_Configuration_Error": "Errore di configurazione", "Network_Connected": "Dispositivi connessi", "Network_ManageAdd": "Aggiungi Dispositivo", @@ -500,7 +501,7 @@ "Network_Table_State": "Stato", "Network_Title": "Panoramica di Rete", "Network_UnassignedDevices": "Dispositivi non assegnati", - "PIALERT_WEB_PASSWORD_description": "La password predefinita è 123456. Per cambiare la password esegui /app/back/pialert-cli nel container o usa il plugin per impostare la password SETPWD_RUN.", + "PIALERT_WEB_PASSWORD_description": "La password predefinita \u00e8 123456. Per cambiare la password esegui /app/back/pialert-cli nel container o usa il plugin per impostare la password SETPWD_RUN.", "PIALERT_WEB_PASSWORD_name": "Password login", "PIALERT_WEB_PROTECTION_description": "Se abilitato, una finestra di login viene mostrata. Leggi attentamente qui sotto nel caso in cui si rimanga bloccati fuori dalla propria istanza.", "PIALERT_WEB_PROTECTION_name": "Abilita login", @@ -512,7 +513,7 @@ "Plugins_Objects": "Oggetti plugin", "Plugins_Out_of": "di", "Plugins_Unprocessed_Events": "Eventi non processati", - "Plugins_no_control": "Non è stato trovato nessun form control per visualizzare questo valore.", + "Plugins_no_control": "Non \u00e8 stato trovato nessun form control per visualizzare questo valore.", "Presence_CalHead_day": "giorno", "Presence_CalHead_lang": "en-us", "Presence_CalHead_month": "mese", @@ -531,23 +532,23 @@ "Presence_Title": "Presenza per Dispositivo", "REPORT_DASHBOARD_URL_description": "Questo URL viene usato come base per generare i link nei report HTML (es. email). Inserisci l'URL completo partendo da http:// e includendo il numero di porta (senza slash finale /).", "REPORT_DASHBOARD_URL_name": "URL NetAlertX", - "REPORT_ERROR": "La pagina a cui stai cercando di accedere è temporaneamente non disponibile, per favore riprova tra qualche secondo", + "REPORT_ERROR": "La pagina a cui stai cercando di accedere \u00e8 temporaneamente non disponibile, per favore riprova tra qualche secondo", "REPORT_MAIL_description": "Se abilitato, una mail viene inviata con la lista dei cambiamenti a cui ti sei iscritto. Per favore compila anche le altre impostazioni relative alla configurazione SMTP. Se riscontri qualche problema, imposta LOG_LEVEL a debug e controlla i log di errore.", "REPORT_MAIL_name": "Abilita email", "REPORT_TITLE": "Report", - "RandomMAC_hover": "Autorilevato - indica se l'indirizzo MAC del dispositivo è casuale.", + "RandomMAC_hover": "Autorilevato - indica se l'indirizzo MAC del dispositivo \u00e8 casuale.", "SCAN_SUBNETS_description": "", "SYSTEM_TITLE": "Informazioni di Sistema", "Setting_Override": "Sovrascrivi valore", - "Setting_Override_Description": "Abilitando questa opzione verrà sovrascritto un valore di default dell'App con il valore specificato sopra.", + "Setting_Override_Description": "Abilitando questa opzione verr\u00e0 sovrascritto un valore di default dell'App con il valore specificato sopra.", "Settings_Metadata_Toggle": "Mostra/Nascondi metadati per questa impostazione.", - "Settings_device_Scanners_desync": "⚠ Le programmazioni dello scanner dispositivi sono desincronizzate.", - "Settings_device_Scanners_desync_popup": "Le programmazioni degli Scanner Dispositivi (*_RUN_SCHD) non sono uguali. Questo risulterà in notifiche per i dispositivi online/offline inconsistenti. A meno che questo non sia il comportamento voluto, per favore utilizza la stessa programmazione per tutti gli 🔍Scanner Dispositivi abilitati.", + "Settings_device_Scanners_desync": "\u26a0 Le programmazioni dello scanner dispositivi sono desincronizzate.", + "Settings_device_Scanners_desync_popup": "Le programmazioni degli Scanner Dispositivi (*_RUN_SCHD) non sono uguali. Questo risulter\u00e0 in notifiche per i dispositivi online/offline inconsistenti. A meno che questo non sia il comportamento voluto, per favore utilizza la stessa programmazione per tutti gli \ud83d\udd0dScanner Dispositivi abilitati.", "Speedtest_Results": "Risultati Speedtest", "Systeminfo_CPU": "CPU", "Systeminfo_CPU_Cores": "Core CPU:", "Systeminfo_CPU_Name": "Nome CPU:", - "Systeminfo_CPU_Speed": "Velocità CPU:", + "Systeminfo_CPU_Speed": "Velocit\u00e0 CPU:", "Systeminfo_CPU_Temp": "Temperatura CPU:", "Systeminfo_CPU_Vendor": "Produttore CPU:", "Systeminfo_Client_Resolution": "Risoluzione del browser:", @@ -615,7 +616,7 @@ "Systeminfo_System_Running_Processes": "Processi in esecuzione:", "Systeminfo_System_System": "Sistema:", "Systeminfo_System_Uname": "Uname:", - "Systeminfo_System_Uptime": "Tempo di attività:", + "Systeminfo_System_Uptime": "Tempo di attivit\u00e0:", "Systeminfo_This_Client": "Questo Client", "Systeminfo_USB_Devices": "Dispositivi USB", "TICKER_MIGRATE_TO_NETALERTX": "", @@ -623,7 +624,7 @@ "TIMEZONE_name": "Fuso orario", "UI_DEV_SECTIONS_description": "Seleziona quali elementi della UI nascondere nella pagina dei Dispositivi.", "UI_DEV_SECTIONS_name": "Nascondi sezioni Dispositivi", - "UI_ICONS_description": "Una lista di icone predefinite. Procedi con cautela, la modalità preferita per aggiungere icone è descritta nella documentazione icone. Puoi aggiungere tag HTML SVG (base64-encoded) o un tag HTML Font-Awesome.", + "UI_ICONS_description": "Una lista di icone predefinite. Procedi con cautela, la modalit\u00e0 preferita per aggiungere icone \u00e8 descritta nella documentazione icone. Puoi aggiungere tag HTML SVG (base64-encoded) o un tag HTML Font-Awesome.", "UI_ICONS_name": "Icone predefinite", "UI_LANG_description": "Seleziona la lingua UI preferita. Aiuta nella traduzione o suggerisci una nuova lingua sul portale online di Weblate.", "UI_LANG_name": "Lingua UI", @@ -655,7 +656,7 @@ "settings_imported": "L'ultima volta le impostazioni sono state importate dal file app.conf", "settings_imported_label": "Impostazioni importate", "settings_missing": "Non tutte le impostazioni sono state caricate, ricarica la pagina! Questo potrebbe essere causato da un alto carico del database o dalla sequenza di avvio dell'applicazione.", - "settings_missing_block": "Non puoi salvare le impostazioni senza specificare tutte le chiavi. Ricarica la pagina. Questo è probabilmente causato da un alto carico del database.", + "settings_missing_block": "Non puoi salvare le impostazioni senza specificare tutte le chiavi. Ricarica la pagina. Questo \u00e8 probabilmente causato da un alto carico del database.", "settings_old": "Importazione delle impostazioni e re-inizializzazione...", "settings_other_scanners": "Altri plugin, non scanner per dispositivi, che sono attualmente abilitati.", "settings_other_scanners_icon": "fa-solid fa-recycle", @@ -669,4 +670,4 @@ "settings_update_item_warning": "Aggiorna il valore qui sotto. Presta attenzione a seguire la formattazione del valore precedente.La validazione non viene eseguita.", "test_event_icon": "fa-vial-circle-check", "test_event_tooltip": "Salva i cambiamenti prima di testare le nuove impostazioni." -} +} \ No newline at end of file diff --git a/front/php/templates/language/nb_no.json b/front/php/templates/language/nb_no.json index 5e4735e2..220e8012 100755 --- a/front/php/templates/language/nb_no.json +++ b/front/php/templates/language/nb_no.json @@ -273,6 +273,7 @@ "Gen_Error": "", "Gen_Filter": "", "Gen_LockedDB": "", + "Gen_Offline": "", "Gen_Okay": "", "Gen_Purge": "", "Gen_ReadDocs": "", diff --git a/front/php/templates/language/pl_pl.json b/front/php/templates/language/pl_pl.json index bb72f8b2..745dea30 100755 --- a/front/php/templates/language/pl_pl.json +++ b/front/php/templates/language/pl_pl.json @@ -273,6 +273,7 @@ "Gen_Error": "B\u0142\u0105d", "Gen_Filter": "Filtr", "Gen_LockedDB": "B\u0141\u0104D - BAZA DANYCH mo\u017ce by\u0107 zablokowana - Sprawd\u017a F12 narz\u0119dzia dewelopera -> Konsola lub spr\u00f3buj ponownie p\u00f3\u017aniej.", + "Gen_Offline": "", "Gen_Okay": "Ok", "Gen_Purge": "Wyczy\u015b\u0107", "Gen_ReadDocs": "Przeczytaj wi\u0119cej w dokumentacji.", diff --git a/front/php/templates/language/pt_br.json b/front/php/templates/language/pt_br.json index edebd8fd..d4fb415f 100755 --- a/front/php/templates/language/pt_br.json +++ b/front/php/templates/language/pt_br.json @@ -273,6 +273,7 @@ "Gen_Error": "", "Gen_Filter": "", "Gen_LockedDB": "", + "Gen_Offline": "", "Gen_Okay": "", "Gen_Purge": "", "Gen_ReadDocs": "", diff --git a/front/php/templates/language/ru_ru.json b/front/php/templates/language/ru_ru.json index fa4c70ff..cf9091a1 100755 --- a/front/php/templates/language/ru_ru.json +++ b/front/php/templates/language/ru_ru.json @@ -273,6 +273,7 @@ "Gen_Error": "\u041e\u0448\u0438\u0431\u043a\u0430", "Gen_Filter": "\u0424\u0438\u043b\u044c\u0442\u0440", "Gen_LockedDB": "\u041e\u0428\u0418\u0411\u041a\u0410 - \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 F12 -> \u041a\u043e\u043d\u0441\u043e\u043b\u044c \u0438\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435.", + "Gen_Offline": "", "Gen_Okay": "OK", "Gen_Purge": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c", "Gen_ReadDocs": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.", diff --git a/front/php/templates/language/zh_cn.json b/front/php/templates/language/zh_cn.json index 9ead45aa..cfb6dc24 100755 --- a/front/php/templates/language/zh_cn.json +++ b/front/php/templates/language/zh_cn.json @@ -273,6 +273,7 @@ "Gen_Error": "", "Gen_Filter": "", "Gen_LockedDB": "", + "Gen_Offline": "", "Gen_Okay": "", "Gen_Purge": "", "Gen_ReadDocs": "", diff --git a/front/plugins/README.md b/front/plugins/README.md index 887c7281..f3e279df 100755 --- a/front/plugins/README.md +++ b/front/plugins/README.md @@ -44,736 +44,8 @@ > \** The Undiscoverables plugin (`UNDIS`) inserts only user-specified dummy devices. > [!NOTE] -> You soft-disable plugins via Settings or completely ignore plugins by placing a `ignore_plugin` file into the plugin directory. The difference is that ignored plugins don't show up anywhere in the UI (Settings, Device details, Plugins pages). The app skips ignored plugins completely. Device-detecting plugins insert values into the `CurrentScan` database table. The plugins that are not required are safe to ignore, however it makes sense to have a least some device-detecting plugins (that insert entries into the `CurrentScan` table) enabled, such as `ARPSCAN` or `PIHOLE`. +> You soft-disable plugins via Settings or completely ignore plugins by placing a `ignore_plugin` file into the plugin directory. The difference is that ignored plugins don't show up anywhere in the UI (Settings, Device details, Plugins pages). The app skips ignored plugins completely. Device-detecting plugins insert values into the `CurrentScan` database table. The plugins that are not required are safe to ignore, however it makes sense to have a least some device-detecting plugins (that insert entries into the `CurrentScan` table) enabled, such as `ARPSCAN` or `PIHOLE`. You can also load/unload Plugins with the `LOADED_PLUGINS` setting. > It's recommended to use the same schedule interval for all plugins responsible for discovering new devices. -## 🌟 Create a custom plugin: Overview - -| ![Screen 1][screen1] | ![Screen 2][screen2] | ![Screen 3][screen3] | -|----------------------|----------------------| ----------------------| -| ![Screen 4][screen4] | ![Screen 5][screen5] | - -NetAlertX comes with a plugin system to feed events from third-party scripts into the UI and then send notifications, if desired. The highlighted core functionality this plugin system supports, is: - -* dynamic creation of a simple UI to interact with the discovered objects, -* filtering of displayed values in the Devices UI -* surface settings of plugins in the UI, -* different column types for reported values to e.g. link back to a device -* import objects into existing NetAlertX database tables - -> (Currently, update/overwriting of existing objects is not supported.) - -Example use cases for plugins could be: - -* Monitor a web service and alert me if it's down -* Import devices from dhcp.leases files instead/complementary to using PiHole or arp-scans -* Creating ad-hoc UI tables from existing data in the NetAlertX database, e.g. to show all open ports on devices, to list devices that disconnected in the last hour, etc. -* Using other device discovery methods on the network and importing the data as new devices -* Creating a script to create FAKE devices based on user input via custom settings -* ...at this point the limitation is mostly the creativity rather than the capability (there might be edge cases and a need to support more form controls for user input off custom settings, but you probably get the idea) - -If you wish to develop a plugin, please check the existing plugin structure. Once the settings are saved by the user they need to be removed from the `app.conf` file manually if you want to re-initialize them from the `config.json` of the plugin. - -Again, please read the below carefully if you'd like to contribute with a plugin yourself. This documentation file might be outdated, so double-check the sample plugins as well. - -## ⚠ Disclaimer - -Follow the below very carefully and check example plugin(s) if you'd like to write one yourself. Plugin UI is not my priority right now, happy to approve PRs if you are interested in extending/improving the UI experience (See [Frontend guidelines](/docs/FRONTEND_DEVELOPMENT.md)). Example improvements for the taking: - -* Making the tables sortable/filterable -* Using the same approach to display table data as in the Devices section (solves above) -* Adding form controls supported to display the data (Currently supported ones are listed in the section "UI settings in database_column_definitions" below) -* ... - -## ❗ Known limitations: - -These issues will be hopefully fixed with time, so please don't report them. Instead, if you know how, feel free to investigate and submit a PR to fix the below. Keep the PRs small as it's easier to approve them: - -* Existing plugin objects are sometimes not interpreted correctly and a new object is created instead, resulting in duplicate entries. (race condition?) -* Occasional (experienced twice) hanging of processing plugin script file. -* UI displays outdated values until the API endpoints get refreshed. - -## Plugin file structure overview - -> ⚠️Folder name must be the same as the code name value in: `"code_name": ""` -> Unique prefix needs to be unique compared to the other settings prefixes, e.g.: the prefix `APPRISE` is already in use. - - | File | Required (plugin type) | Description | - |----------------------|----------------------|----------------------| - | `config.json` | yes | Contains the plugin configuration (manifest) including the settings available to the user. | - | `script.py` | no | The Python script itself. You may call any valid linux command. | - | `last_result.log` | no | The file used to interface between NetAlertX and the plugin. Required for a script plugin if you want to feed data into the app. | - | `script.log` | no | Logging output (recommended) | - | `README.md` | yes | Any setup considerations or overview | - -More on specifics below. - -### Column order and values - -> [!IMPORTANT] -> Spend some time reading and trying to understand the below table. This is the interface between the Plugins and the core application. - - | Order | Represented Column | Value Required | Description | - |----------------------|----------------------|----------------------|----------------------| - | 0 | `Object_PrimaryID` | yes | The primary ID used to group Events under. | - | 1 | `Object_SecondaryID` | no | Optional secondary ID to create a relationship beween other entities, such as a MAC address | - | 2 | `DateTime` | yes | When the event occured in the format `2023-01-02 15:56:30` | - | 3 | `Watched_Value1` | yes | A value that is watched and users can receive notifications if it changed compared to the previously saved entry. For example IP address | - | 4 | `Watched_Value2` | no | As above | - | 5 | `Watched_Value3` | no | As above | - | 6 | `Watched_Value4` | no | As above | - | 7 | `Extra` | no | Any other data you want to pass and display in NetAlertX and the notifications | - | 8 | `ForeignKey` | no | A foreign key that can be used to link to the parent object (usually a MAC address) | - -> [!NOTE] -> De-duplication is run once an hour on the `Plugins_Objects` database table and duplicate entries with the same value in columns `Object_PrimaryID`, `Object_SecondaryID`, `Plugin` (auto-filled based on `unique_prefix` of the plugin), `UserData` (can be populated with the `"type": "textbox_save"` column type) are removed. - -# config.json structure - -The `config.json` file is the manifest of the plugin. It contains mainly settings definitions and the mapping of Plugin objects to NetAlertX objects. - -## Supported data sources - -Currently, these data sources are supported (valid `data_source` value). - -| Name | `data_source` value | Needs to return a "table"* | Overview (more details on this page below) | -|----------------------|----------------------|----------------------|----------------------| -| Script | `script` | no | Executes any linux command in the `CMD` setting. | -| NetAlertX DB query | `app-db-query` | yes | Executes a SQL query on the NetAlertX database in the `CMD` setting. | -| Template | `template` | no | Used to generate internal settings, such as default values. | -| External SQLite DB query | `sqlite-db-query` | yes | Executes a SQL query from the `CMD` setting on an external SQLite database mapped in the `DB_PATH` setting. | -| Plugin type | `plugin_type` | no | Specifies the type of the plugin and in which section the Plugin settings are displayed ( one of `general/system/scanner/other/publisher` ). | - -> * "Needs to return a "table" means that the application expects a `last_result.log` file with some results. It's not a blocker, however warnings in the `app.log` might be logged. - -> 🔎Example ->```json ->"data_source": "app-db-query" ->``` -If you want to display plugin objects or import devices into the app, data sources have to return a "table" of the exact structure as outlined above. - -You can show or hide the UI on the "Plugins" page and "Plugins" tab for a plugin on devices via the `show_ui` property: - -> 🔎Example ->```json -> "show_ui": true, -> ``` - -### "data_source": "script" - - If the `data_source` is set to `script` the `CMD` setting (that you specify in the `settings` array section in the `config.json`) contains an executable Linux command, that usually generates a `last_result.log` file (not required if you don't import any data into the app). The `last_result.log` file needs to be saved in the same folder as the plugin. - -> [!IMPORTANT] -> A lot of the work is taken care of by the [`plugin_helper.py` library](/front/plugins/plugin_helper.py). You don't need to manage the `last_result.log` file if using the helper objects. Check other `script.py` of other plugins for details (The [Undicoverables plugins `script.py` file](/front/plugins/undiscoverables/script.py) is a good example). - - The content of the `last_result.log` file needs to contain the columns as defined in the "Column order and values" section above. The order of columns can't be changed. After every scan it should contain only the results from the latest scan/execution. - -- The format of the `last_result.log` is a `csv`-like file with the pipe `|` as a separator. -- 9 (nine) values need to be supplied, so every line needs to contain 8 pipe separators. Empty values are represented by `null`. -- Don't render "headers" for these "columns". -Every scan result/event entry needs to be on a new line. -- You can find which "columns" need to be present, and if the value is required or optional, in the "Column order and values" section. -- The order of these "columns" can't be changed. - -#### 🔎 last_result.log examples - -Valid CSV: - -```csv - -https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|null|null|null|null -https://www.duckduckgo.com|192.168.0.1|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|ff:ee:ff:11:ff:11 - -``` - -Invalid CSV with different errors on each line: - -```csv - -https://www.google.com|null|2023-01-02 15:56:30|200|0.7898||null|null|null -https://www.duckduckgo.com|null|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine| -|https://www.duckduckgo.com|null|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|null -null|192.168.1.1|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine -https://www.duckduckgo.com|192.168.1.1|2023-01-02 15:56:30|null|0.9898|null|null|Best search engine -https://www.google.com|null|2023-01-02 15:56:30|200|0.7898||| -https://www.google.com|null|2023-01-02 15:56:30|200|0.7898| - -``` - -### "data_source": "app-db-query" - -If the `data_source` is set to `app-db-query`, the `CMD` setting needs to contain a SQL query rendering the columns as defined in the "Column order and values" section above. The order of columns is important. - -This SQL query is executed on the `app.db` SQLite database file. - -> 🔎Example -> -> SQL query example: -> -> ```SQL -> SELECT dv.dev_Name as Object_PrimaryID, -> cast(dv.dev_LastIP as VARCHAR(100)) || ':' || cast( SUBSTR(ns.Port ,0, INSTR(ns.Port , '/')) as VARCHAR(100)) as Object_SecondaryID, -> datetime() as DateTime, -> ns.Service as Watched_Value1, -> ns.State as Watched_Value2, -> 'null' as Watched_Value3, -> 'null' as Watched_Value4, -> ns.Extra as Extra, -> dv.dev_MAC as ForeignKey -> FROM -> (SELECT * FROM Nmap_Scan) ns -> LEFT JOIN -> (SELECT dev_Name, dev_MAC, dev_LastIP FROM Devices) dv -> ON ns.MAC = dv.dev_MAC -> ``` -> -> Required `CMD` setting example with above query (you can set `"type": "label"` if you want it to make uneditable in the UI): -> -> ```json -> { -> "function": "CMD", -> "type": "text", -> "default_value":"SELECT dv.dev_Name as Object_PrimaryID, cast(dv.dev_LastIP as VARCHAR(100)) || ':' || cast( SUBSTR(ns.Port ,0, INSTR(ns.Port , '/')) as VARCHAR(100)) as Object_SecondaryID, datetime() as DateTime, ns.Service as Watched_Value1, ns.State as Watched_Value2, 'null' as Watched_Value3, 'null' as Watched_Value4, ns.Extra as Extra FROM (SELECT * FROM Nmap_Scan) ns LEFT JOIN (SELECT dev_Name, dev_MAC, dev_LastIP FROM Devices) dv ON ns.MAC = dv.dev_MAC", -> "options": [], -> "localized": ["name", "description"], -> "name" : [{ -> "language_code":"en_us", -> "string" : "SQL to run" -> }], -> "description": [{ -> "language_code":"en_us", -> "string" : "This SQL query is used to populate the coresponding UI tables under the Plugins section." -> }] -> } -> ``` - -### "data_source": "template" - -In most cases, it is used to initialize settings. Check the `newdev_template` plugin for details. - -### "data_source": "sqlite-db-query" - -You can execute a SQL query on an external database connected to the current NetAlertX database via a temporary `EXTERNAL_.` prefix. - -For example for `PIHOLE` (`"unique_prefix": "PIHOLE"`) it is `EXTERNAL_PIHOLE.`. The external SQLite database file has to be mapped in the container to the path specified in the `DB_PATH` setting: - -> 🔎Example -> ->```json -> ... ->{ -> "function": "DB_PATH", -> "type": "readonly", -> "default_value":"/etc/pihole/pihole-FTL.db", -> "options": [], -> "localized": ["name", "description"], -> "name" : [{ -> "language_code":"en_us", -> "string" : "DB Path" -> }], -> "description": [{ -> "language_code":"en_us", -> "string" : "Required setting for the sqlite-db-query plugin type. Is used to mount an external SQLite database and execute the SQL query stored in the CMD setting." -> }] -> } -> ... ->``` - -The actual SQL query you want to execute is then stored as a `CMD` setting, similar to a Plugin of the `app-db-query` plugin type. The format has to adhere to the format outlined in the "Column order and values" section above. - -> 🔎Example -> -> Notice the `EXTERNAL_PIHOLE.` prefix. -> ->```json ->{ -> "function": "CMD", -> "type": "text", -> "default_value":"SELECT hwaddr as Object_PrimaryID, cast('http://' || (SELECT ip FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1) as VARCHAR(100)) || ':' || cast( SUBSTR((SELECT name FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1), 0, INSTR((SELECT name FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1), '/')) as VARCHAR(100)) as Object_SecondaryID, datetime() as DateTime, macVendor as Watched_Value1, lastQuery as Watched_Value2, (SELECT name FROM EXTERNAL_PIHOLE.network_addresses WHERE network_id = id ORDER BY lastseen DESC, ip LIMIT 1) as Watched_Value3, 'null' as Watched_Value4, '' as Extra, hwaddr as ForeignKey FROM EXTERNAL_PIHOLE.network WHERE hwaddr NOT LIKE 'ip-%' AND hwaddr <> '00:00:00:00:00:00'; ", -> "options": [], -> "localized": ["name", "description"], -> "name" : [{ -> "language_code":"en_us", -> "string" : "SQL to run" -> }], -> "description": [{ -> "language_code":"en_us", -> "string" : "This SQL query is used to populate the coresponding UI tables under the Plugins section. This particular one selects data from a mapped PiHole SQLite database and maps it to the corresponding Plugin columns." -> }] -> } -> ``` - -## 🕳 Filters - -Plugin entries can be filtered in the UI based on values entered into filter fields. The `txtMacFilter` textbox/field contains the Mac address of the currently viewed device, or simply a Mac address that's available in the `mac` query string (`?mac=aa:22:aa:22:aa:22:aa`). - - | Property | Required | Description | - |----------------------|----------------------|----------------------| - | `compare_column` | yes | Plugin column name that's value is used for comparison (**Left** side of the equation) | - | `compare_operator` | yes | JavaScript comparison operator | - | `compare_field_id` | yes | The `id` of a input text field containing a value is used for comparison (**Right** side of the equation)| - | `compare_js_template` | yes | JavaScript code used to convert left and right side of the equation. `{value}` is replaced with input values. | - | `compare_use_quotes` | yes | If `true` then the end result of the `compare_js_template` i swrapped in `"` quotes. Use to compare strings. | - - Filters are only applied if a filter is specified, and the `txtMacFilter` is not `undefined`, or empty (`--`). - -> 🔎Example: -> -> ```json -> "data_filters": [ -> { -> "compare_column" : "Object_PrimaryID", -> "compare_operator" : "==", -> "compare_field_id": "txtMacFilter", -> "compare_js_template": "'{value}'.toString()", -> "compare_use_quotes": true -> } -> ], -> ``` -> ->1. On the `pluginsCore.php` page is an input field with the id `txtMacFilter`: -> ->```html -> ->``` -> ->2. This input field is initialized via the `&mac=` query string. -> ->3. The app then proceeds to use this Mac value from this field and compares it to the value of the `Object_PrimaryID` database field. The `compare_operator` is `==`. -> ->4. Both values, from the database field `Object_PrimaryID` and from the `txtMacFilter` are wrapped and evaluated with the `compare_js_template`, that is `'{value}.toString()'`. -> ->5. `compare_use_quotes` is set to `true` so `'{value}'.toString()` is wrappe dinto `"` quotes. -> ->6. This results in for example this code: -> ->```javascript -> // left part of the expression coming from compare_column and right from the input field -> // notice the added quotes ()") around the left and right part of teh expression -> "eval('ac:82:ac:82:ac:82".toString()')" == "eval('ac:82:ac:82:ac:82".toString()')" ->``` -> - - -### 🗺 Mapping the plugin results into a database table - -Plugin results are always inserted into the standard `Plugin_Objects` database table. Optionally, NetAlertX can take the results of the plugin execution, and insert these results into an additional database table. This is enabled by with the property `"mapped_to_table"` in the `config.json` file. The mapping of the columns is defined in the `database_column_definitions` array. - -> [!NOTE] -> If results are mapped to the `CurrentScan` table, the data is then included into the regular scan loop, so for example notification for devices are sent out. - - ->🔍 Example: -> ->For example, this approach is used to implement the `DHCPLSS` plugin. The script parses all supplied "dhcp.leases" files, gets the results in the generic table format outlined in the "Column order and values" section above, takes individual values, and inserts them into the `CurrentScan` database table in the NetAlertX database. All this is achieved by: -> ->1. Specifying the database table into which the results are inserted by defining `"mapped_to_table": "CurrentScan"` in the root of the `config.json` file as shown below: -> ->```json ->{ -> "code_name": "dhcp_leases", -> "unique_prefix": "DHCPLSS", -> ... -> "data_source": "script", -> "localized": ["display_name", "description", "icon"], -> "mapped_to_table": "CurrentScan", -> ... ->} ->``` ->2. Defining the target column with the `mapped_to_column` property for individual columns in the `database_column_definitions` array of the `config.json` file. For example in the `DHCPLSS` plugin, I needed to map the value of the `Object_PrimaryID` column returned by the plugin, to the `cur_MAC` column in the NetAlertX database table `CurrentScan`. Notice the `"mapped_to_column": "cur_MAC"` key-value pair in the sample below. -> ->```json ->{ -> "column": "Object_PrimaryID", -> "mapped_to_column": "cur_MAC", -> "css_classes": "col-sm-2", -> "show": true, -> "type": "device_mac", -> "default_value":"", -> "options": [], -> "localized": ["name"], -> "name":[{ -> "language_code":"en_us", -> "string" : "MAC address" -> }] -> } ->``` -> ->3. That's it. The app takes care of the rest. It loops thru the objects discovered by the plugin, takes the results line-by-line, and inserts them into the database table specified in `"mapped_to_table"`. The columns are translated from the generic plugin columns to the target table columns via the `"mapped_to_column"` property in the column definitions. - -> [!NOTE] -> You can create a column mapping with a default value via the `mapped_to_column_data` property. This means that the value of the given column will always be this value. That also menas that the `"column": "NameDoesntMatter"` is not important as there is no database source column. - - ->🔍 Example: -> ->```json ->{ -> "column": "NameDoesntMatter", -> "mapped_to_column": "cur_ScanMethod", -> "mapped_to_column_data": { -> "value": "DHCPLSS" -> }, -> "css_classes": "col-sm-2", -> "show": true, -> "type": "device_mac", -> "default_value":"", -> "options": [], -> "localized": ["name"], -> "name":[{ -> "language_code":"en_us", -> "string" : "MAC address" -> }] -> } ->``` - -#### params - -> [!IMPORTANT] -> An esier way to access settings in scripts is the `get_setting_value` method. -> ```python -> from helper import get_setting_value -> -> ... -> NTFY_TOPIC = get_setting_value('NTFY_TOPIC') -> ... -> -> ``` - -The `params` array in the `config.json` is used to enable the user to change the parameters of the executed script. For example, the user wants to monitor a specific URL. - -> 🔎 Example: -> Passing user-defined settings to a command. Let's say, you want to have a script, that is called with a user-defined parameter called `urls`: -> -> ```bash -> root@server# python3 /app/front/plugins/website_monitor/script.py urls=https://google.com,https://duck.com -> ``` - -* You can allow the user to add URLs to a setting with the `function` property set to a custom name, such as `urls_to_check` (this is not a reserved name from the section "Supported settings `function` values" below). -* You specify the parameter `urls` in the `params` section of the `config.json` the following way (`WEBMON_` is the plugin prefix automatically added to all the settings): -```json -{ - "params" : [ - { - "name" : "urls", - "type" : "setting", - "value" : "WEBMON_urls_to_check" - }] -} -``` -* Then you use this setting as an input parameter for your command in the `CMD` setting. Notice `urls={urls}` in the below json: - -```json - { - "function": "CMD", - "type": "text", - "default_value":"python3 /app/front/plugins/website_monitor/script.py urls={urls}", - "options": [], - "localized": ["name", "description"], - "name" : [{ - "language_code":"en_us", - "string" : "Command" - }], - "description": [{ - "language_code":"en_us", - "string" : "Command to run" - }] - } -``` - -During script execution, the app will take the command `"python3 /app/front/plugins/website_monitor/script.py urls={urls}"`, take the `{urls}` wildcard and replace it with the value from the `WEBMON_urls_to_check` setting. This is because: - -1. The app checks the `params` entries -2. It finds `"name" : "urls"` -3. Checks the type of the `urls` params and finds `"type" : "setting"` -4. Gets the setting name from `"value" : "WEBMON_urls_to_check"` - - IMPORTANT: in the `config.json` this setting is identified by `"function":"urls_to_check"`, not `"function":"WEBMON_urls_to_check"` - - You can also use a global setting, or a setting from a different plugin -5. The app gets the user defined value from the setting with the code name `WEBMON_urls_to_check` - - let's say the setting with the code name `WEBMON_urls_to_check` contains 2 values entered by the user: - - `WEBMON_urls_to_check=['https://google.com','https://duck.com']` -6. The app takes the value from `WEBMON_urls_to_check` and replaces the `{urls}` wildcard in the setting where `"function":"CMD"`, so you go from: - - `python3 /app/front/plugins/website_monitor/script.py urls={urls}` - - to - - `python3 /app/front/plugins/website_monitor/script.py urls=https://google.com,https://duck.com` - -Below are some general additional notes, when defining `params`: - -- `"name":"name_value"` - is used as a wildcard replacement in the `CMD` setting value by using curly brackets `{name_value}`. The wildcard is replaced by the result of the `"value" : "param_value"` and `"type":"type_value"` combo configuration below. -- `"type":""` - is used to specify the type of the params, currently only 2 supported (`sql`,`setting`). - - `"type":"sql"` - will execute the SQL query specified in the `value` property. The sql query needs to return only one column. The column is flattened and separated by commas (`,`), e.g: `SELECT dev_MAC from DEVICES` -> `Internet,74:ac:74:ac:74:ac,44:44:74:ac:74:ac`. This is then used to replace the wildcards in the `CMD` setting. - - `"type":"setting"` - The setting code name. A combination of the value from `unique_prefix` + `_` + `function` value, or otherwise the code name you can find in the Settings page under the Setting display name, e.g. `PIHOLE_RUN`. -- `"value": "param_value"` - Needs to contain a setting code name or SQL query without wildcards. -- `"timeoutMultiplier" : true` - used to indicate if the value should multiply the max timeout for the whole script run by the number of values in the given parameter. -- `"base64": true` - use base64 encoding to pass the value to the script (e.g. if there are spaces) - - -> 🔎Example: -> -> ```json -> { -> "params" : [{ -> "name" : "ips", -> "type" : "sql", -> "value" : "SELECT dev_LastIP from DEVICES", -> "timeoutMultiplier" : true -> }, -> { -> "name" : "macs", -> "type" : "sql", -> "value" : "SELECT dev_MAC from DEVICES" -> }, -> { -> "name" : "timeout", -> "type" : "setting", -> "value" : "NMAP_RUN_TIMEOUT" -> }, -> { -> "name" : "args", -> "type" : "setting", -> "value" : "NMAP_ARGS", -> "base64" : true -> }] -> } -> ``` - - -#### ⚙ Setting object structure - -> [!NOTE] -> The settings flow and when Plugin specific settings are applied is described under the [Settings system](/docs/SETTINGS_SYSTEM.md). - -Required attributes are: - -| Property | Description | -| -------- | ----------- | -| `"function"` | Specifies the function the setting drives or a simple unique code name. See Supported settings function values for options. | -| `"type"` | Specifies the form control used for the setting displayed in the Settings page and what values are accepted. Supported options include: | -| | - `text` | -| | - `integer` | -| | - `boolean` | -| | - `password` | -| | - `readonly` | -| | - `integer.select` | -| | - `text.select` | -| | - `text.multiselect` | -| | - `list` | -| | - `list.select` | -| | - `integer.checkbox` | -| | - `text.template` | -| `"localized"` | A list of properties on the current JSON level that need to be localized. | -| `"name"` | Displayed on the Settings page. An array of localized strings. See Localized strings below. | -| `"description"` | Displayed on the Settings page. An array of localized strings. See Localized strings below. | -| (optional) `"events"` | Specifies whether to generate an execution button next to the input field of the setting. Supported values: | -| | - `"test"` - For notification plugins testing | -| | - `"run"` - Regular plugins testing | -| (optional) `"override_value"` | Used to determine a user-defined override for the setting. Useful for template-based plugins, where you can choose to leave the current value or override it with the value defined in the setting. (Work in progress) | -| (optional) `"events"` | Used to trigger the plugin. Usually used on the `RUN` setting. Not fully tested in all scenarios. Will show a play button next to the setting. After clicking, an event is generated for the backend in the `Parameters` database table to process the front-end event on the next run. | - - -##### Supported settings `function` values - -You can have any `"function": "my_custom_name"` custom name, however, the ones listed below have a specific functionality attached to them. If you use a custom name, then the setting is mostly used as an input parameter for the `params` section. - -| Setting | Description | -| ------- | ----------- | -| `RUN` | (required) Specifies when the service is executed. | -| | Supported Options: | -| | - "disabled" - do not run | -| | - "once" - run on app start or on settings saved | -| | - "schedule" - if included, then a `RUN_SCHD` setting needs to be specified to determine the schedule | -| | - "always_after_scan" - run always after a scan is finished | -| | - "before_name_updates" - run before device names are updated (for name discovery plugins) | -| | - "on_new_device" - run when a new device is detected | -| | - "before_config_save" - run before the config is marked as saved. Useful if your plugin needs to modify the `app.conf` file. | -| `RUN_SCHD` | (required if you include "schedule" in the above `RUN` function) Cron-like scheduling is used if the `RUN` setting is set to `schedule`. | -| `CMD` | (required) Specifies the command that should be executed. | -| `API_SQL` | (not implemented) Generates a `table_` + `code_name` + `.json` file as per [API docs](https://github.com/jokob-sk/NetAlertX/blob/main/docs/API.md). | -| `RUN_TIMEOUT` | (optional) Specifies the maximum execution time of the script. If not specified, a default value of 10 seconds is used to prevent hanging. | -| `WATCH` | (optional) Specifies which database columns are watched for changes for this particular plugin. If not specified, no notifications are sent. | -| `REPORT_ON` | (optional) Specifies when to send a notification. Supported options are: | -| | - `new` means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. | -| | - `watched-changed` - means that selected `Watched_ValueN` columns changed | -| | - `watched-not-changed` - reports even on events where selected `Watched_ValueN` did not change | -| | - `missing-in-last-scan` - if the object is missing compared to previous scans | - - -> 🔎 Example: -> -> ```json -> { -> "function": "RUN", -> "type": "text.select", -> "default_value":"disabled", -> "options": ["disabled", "once", "schedule", "always_after_scan", "on_new_device"], -> "localized": ["name", "description"], -> "name" :[{ -> "language_code":"en_us", -> "string" : "When to run" -> }], -> "description": [{ -> "language_code":"en_us", -> "string" : "Enable a regular scan of your services. If you select schedule the scheduling settings from below are applied. If you select once the scan is run only once on start of the application (container) for the time specified in WEBMON_RUN_TIMEOUT setting." -> }] -> } -> ``` - -##### 🌍Localized strings - -- `"language_code":""` - code name of the language string. Only these three are currently supported. At least the `"language_code":"en_us"` variant has to be defined. -- `"string"` - The string to be displayed in the given language. - -> 🔎 Example: -> -> ```json -> -> { -> "language_code":"en_us", -> "string" : "When to run" -> } -> -> ``` - -##### UI settings in database_column_definitions - -The UI will adjust how columns are displayed in the UI based on the resolvers definition of the `database_column_definitions` object. These are the supported form controls and related functionality: - -- Only columns with `"show": true` and also with at least an English translation will be shown in the UI. - -| Supported Types | Description | -| -------------- | ----------- | -| `label` | Displays a column only. | -| `textarea_readonly` | Generates a read only text area and cleans up the text to display it somewhat formatted with new lines preserved. | -| See below for information on `threshold`, `replace`. | | -| | | -| `options` Property | Used in conjunction with types like `threshold`, `replace`, `regex`. | -| `options_params` Property | Used in conjunction with a `"options": "[{value}]"` template and `text.select`/`list.select`. Can specify SQL query (needs to return 2 columns `SELECT dev_Name as name, dev_Mac as id`) or Setting (not tested) to populate the dropdown. Check example below or have a look at the `NEWDEV` plugin `config.json` file. | -| `threshold` | The `options` array contains objects ordered from the lowest `maximum` to the highest. The corresponding `hexColor` is used for the value background color if it's less than the specified `maximum` but more than the previous one in the `options` array. | -| `replace` | The `options` array contains objects with an `equals` property, which is compared to the "value." If the values are the same, the string in `replacement` is displayed in the UI instead of the actual "value". | -| `regex` | Applies a regex to the value. The `options` array contains objects with an `type` (must be set to `regex`) and `param` (must contain the regex itself) property. | -| | | -| Type Definitions | | -| `device_mac` | The value is considered to be a MAC address, and a link pointing to the device with the given MAC address is generated. | -| `device_ip` | The value is considered to be an IP address. A link pointing to the device with the given IP is generated. The IP is checked against the last detected IP address and translated into a MAC address, which is then used for the link itself. | -| `device_name_mac` | The value is considered to be a MAC address, and a link pointing to the device with the given IP is generated. The link label is resolved as the target device name. | -| `url` | The value is considered to be a URL, so a link is generated. | -| `textbox_save` | Generates an editable and saveable text box that saves values in the database. Primarily intended for the `UserData` database column in the `Plugins_Objects` table. | -| `url_http_https` | Generates two links with the `https` and `http` prefix as lock icons. | -| `eval` | Evaluates as JavaScript. Use the variable `value` to use the given column value as input (e.g. `'${value}'` (replace ' with ` in your code) ) | - - -> [!NOTE] -> Supports chaining. You can chain multiple resolvers with `.`. For example `regex.url_http_https`. This will apply the `regex` resolver and then the `url_http_https` resolver. - - -```json - "function": "dev_DeviceType", - "type": "text.select", - "maxLength": 30, - "default_value": "", - "options": ["{value}"], - "options_params" : [ - { - "name" : "value", - "type" : "sql", - "value" : "SELECT '' as id, '' as name UNION SELECT dev_DeviceType as id, dev_DeviceType as name FROM (SELECT dev_DeviceType FROM Devices UNION SELECT 'Smartphone' UNION SELECT 'Tablet' UNION SELECT 'Laptop' UNION SELECT 'PC' UNION SELECT 'Printer' UNION SELECT 'Server' UNION SELECT 'NAS' UNION SELECT 'Domotic' UNION SELECT 'Game Console' UNION SELECT 'SmartTV' UNION SELECT 'Clock' UNION SELECT 'House Appliance' UNION SELECT 'Phone' UNION SELECT 'AP' UNION SELECT 'Gateway' UNION SELECT 'Firewall' UNION SELECT 'Switch' UNION SELECT 'WLAN' UNION SELECT 'Router' UNION SELECT 'Other') AS all_devices ORDER BY id;" - }, - { - "name" : "uilang", - "type" : "setting", - "value" : "UI_LANG" - } - ] -``` - - -```json -{ - "column": "Watched_Value1", - "css_classes": "col-sm-2", - "show": true, - "type": "threshold", - "default_value":"", - "options": [ - { - "maximum": 199, - "hexColor": "#792D86" - }, - { - "maximum": 299, - "hexColor": "#5B862D" - }, - { - "maximum": 399, - "hexColor": "#7D862D" - }, - { - "maximum": 499, - "hexColor": "#BF6440" - }, - { - "maximum": 599, - "hexColor": "#D33115" - } - ], - "localized": ["name"], - "name":[{ - "language_code":"en_us", - "string" : "Status code" - }] - }, - { - "column": "Status", - "show": true, - "type": "replace", - "default_value":"", - "options": [ - { - "equals": "watched-not-changed", - "replacement": "" - }, - { - "equals": "watched-changed", - "replacement": "" - }, - { - "equals": "new", - "replacement": "" - } - ], - "localized": ["name"], - "name":[{ - "language_code":"en_us", - "string" : "Status" - }] - }, - { - "column": "Watched_Value3", - "css_classes": "col-sm-1", - "show": true, - "type": "regex.url_http_https", - "default_value":"", - "options": [ - { - "type": "regex", - "param": "([\\d.:]+)" - } - ], - "localized": ["name"], - "name":[{ - "language_code":"en_us", - "string" : "HTTP/s links" - }, - { - "language_code":"es_es", - "string" : "N/A" - }] - } -``` - -[screen1]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins.png "Screen 1" -[screen2]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_settings.png "Screen 2" -[screen3]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_json_settings.png "Screen 3" -[screen4]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_json_ui.png "Screen 4" -[screen5]: https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/plugins_device_details.png "Screen 5" +If you want to develop a custom plugin, please read this [Plugin development guide](/docs/PLUGINS_DEV.md). \ No newline at end of file diff --git a/front/settings.php b/front/settings.php index 680f1dc3..fda8af61 100755 --- a/front/settings.php +++ b/front/settings.php @@ -192,14 +192,21 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) { $.get('api/table_settings.json?nocache=' + Date.now(), function(res) { - settingsData = res["data"]; + settingsData = res["data"]; + + // Wrong number of settings processing + if(settingsNumberDB != settingsData.length) + { + showModalOk('WARNING', ""); + } else + { + $.get('api/plugins.json?nocache=' + Date.now(), function(res) { - $.get('api/plugins.json?nocache=' + Date.now(), function(res) { + pluginsData = res["data"]; - pluginsData = res["data"]; - - initSettingsPage(settingsData, pluginsData, generateDropdownOptions); - }) + initSettingsPage(settingsData, pluginsData, generateDropdownOptions); + }) + } }) } @@ -292,13 +299,16 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) { ` } + console.log(pluginsData); + // Start constructing the main settings HTML let pluginHtml = ` @@ -650,10 +660,11 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) { // display the name of the first person // echo $settingsJson[0]->name; - var settingsNumber = data)?>; + var settingsNumberDB = ; + var settingsNumberJSON = data)?>; // Wrong number of settings processing - if( != settingsNumber) + if(settingsNumberJSON != settingsNumberDB) { showModalOk('WARNING', ""); } @@ -705,7 +716,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) { // --------------------------------------------------------- function saveSettings() { - if( != settingsNumber) + if(settingsNumberJSON != settingsNumberDB) { showModalOk('WARNING', ""); } else @@ -720,7 +731,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) { settingsJSON = res; - data = settingsJSON["data"]; + data = settingsJSON["data"]; data.forEach(set => { if (noConversion.includes(set['Type'])) { @@ -766,9 +777,14 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) { { sanityCheck_notOK = isEmpty(value[3]) } - }); + // if ok, double check the number collected of settings is correct + if(sanityCheck_notOK == false) + { + sanityCheck_notOK = settingsNumberDB != settingsArray.length; + } + if(sanityCheck_notOK == false) { // trigger a save settings event in the backend diff --git a/server/initialise.py b/server/initialise.py index 501c966d..848d9d04 100755 --- a/server/initialise.py +++ b/server/initialise.py @@ -189,7 +189,7 @@ def importConfigs (db, all_plugins): for plugin in all_plugins: # Header on the frontend and the app_state.json - updateState(f"Import plugin {index} of {len(all_plugins)}") + updateState(f"Check plugin {index} of {len(all_plugins)}") index +=1