diff --git a/front/js/common.js b/front/js/common.js
index 3fed6e92..c4c2df42 100755
--- a/front/js/common.js
+++ b/front/js/common.js
@@ -1211,11 +1211,6 @@ function resetInitializedFlag()
}
-// -----------------------------------------------------------------------------
-function isAppInitialized()
-{
- return sessionStorage.getItem(sessionStorageKey) === "true";
-}
// -----------------------------------------------------------------------------
// check if cache needs to be refreshed because of setting changes
@@ -1244,7 +1239,7 @@ $.get('api/app_state.json?nocache=' + Date.now(), function(appState) {
// Display spinner and reload page if not yet initialized
function handleFirstLoad(callback)
{
- if(!app_common_init)
+ if(!isAppInitialized())
{
setTimeout(function() {
@@ -1256,14 +1251,20 @@ function handleFirstLoad(callback)
// -----------------------------------------------------------------------------
// Check if the code has been executed before by checking sessionStorage
-var app_common_init = sessionStorage.getItem(sessionStorageKey) === "true";
var completedCalls = []
var completedCalls_final = ['cacheSettings', 'cacheStrings', 'cacheDevices'];
+
+// -----------------------------------------------------------------------------
+function isAppInitialized()
+{
+ return arraysContainSameValues(getCache("completedCalls").split(',').filter(Boolean), completedCalls_final)
+}
+
// Define a function that will execute the code only once
function executeOnce() {
- if (!arraysContainSameValues(getCache(completedCalls), completedCalls_final)) {
+ if ( !isAppInitialized()) {
showSpinner()
diff --git a/front/plugins/nmap_dev_scan/README.md b/front/plugins/nmap_dev_scan/README.md
new file mode 100755
index 00000000..900e022c
--- /dev/null
+++ b/front/plugins/nmap_dev_scan/README.md
@@ -0,0 +1,20 @@
+## Overview
+
+Arp-scan is a command-line tool that uses the ARP protocol to discover and fingerprint IP hosts on the local network. An alternative to ARP scan is to enable the `PIHOLE_RUN` PiHole integration settings. The arp-scan (and other Network-scan plugin times using the `SCAN_SUBNETS` setting) time depends on the number of IP addresses to check so set this up carefully with the appropriate network mask and interface. Check the [subnets documentation](https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md) for help on setting up VLANs, what VLANs are supported, or how to figure out the network mask and your interface.
+
+### Usage
+
+- Go to settings and set the `SCAN_SUBNETS` setting as per [subnets documentation](https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md).
+- Enable the plugin by changing the RUN parameter from disabled to your preferred run time (usually: `schedule`).
+ - Specify the schedule in the `ARPSCAN_RUN_SCHD` setting
+- Adjust the timeout if needed in the `ARPSCAN_RUN_TIMEOUT` setting
+- Review remaining settings
+- SAVE
+- Wait for the next scan to finish
+
+#### Examples
+
+Settings:
+
+
+
diff --git a/front/plugins/nmap_dev_scan/config.json b/front/plugins/nmap_dev_scan/config.json
new file mode 100755
index 00000000..466709c0
--- /dev/null
+++ b/front/plugins/nmap_dev_scan/config.json
@@ -0,0 +1,562 @@
+{
+ "code_name": "nmap_dev_scan",
+ "unique_prefix": "NMAPDEV",
+ "plugin_type": "device_scanner",
+ "enabled": true,
+ "data_source": "script",
+ "mapped_to_table": "CurrentScan",
+ "data_filters": [
+ {
+ "compare_column": "Object_PrimaryID",
+ "compare_operator": "==",
+ "compare_field_id": "txtMacFilter",
+ "compare_js_template": "'{value}'.toString()",
+ "compare_use_quotes": true
+ }
+ ],
+ "show_ui": true,
+ "localized": [
+ "display_name",
+ "description",
+ "icon"
+ ],
+ "display_name": [
+ {
+ "language_code": "en_us",
+ "string": "NMAP Device discovery"
+ }
+ ],
+ "icon": [
+ {
+ "language_code": "en_us",
+ "string": ""
+ }
+ ],
+ "description": [
+ {
+ "language_code": "en_us",
+ "string": "This plugin is to execute an NMAP scan for device discovery on the local network"
+ }
+ ],
+ "params": [
+ {
+ "name": "subnets",
+ "type": "setting",
+ "value": "SCAN_SUBNETS",
+ "base64": true
+ }
+ ],
+ "settings": [
+ {
+ "function": "RUN",
+ "type": "text.select",
+ "default_value": "disabled",
+ "options": [
+ "disabled",
+ "once",
+ "schedule",
+ "always_after_scan",
+ "on_new_device"
+ ],
+ "localized": [
+ "name",
+ "description"
+ ],
+ "events": [
+ "run"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "When to run"
+ },
+ {
+ "language_code": "es_es",
+ "string": "Cuando ejecutar"
+ },
+ {
+ "language_code": "de_de",
+ "string": "Wann ausführen"
+ }
+ ],
+ "description": [
+ {
+ "language_code": "en_us",
+ "string": "Specify when your Network-discovery scan will run. Typical setting would be schedule and then you specify a cron-like schedule in the ARPSCAN_RUN_SCHDsetting. ⚠ Use the same schedule if you have multiple Device scanners enabled."
+ },
+ {
+ "language_code": "es_es",
+ "string": "Especifique cuándo se ejecutará su análisis de descubrimiento de red. La configuración típica sería schedule y luego se especifica una programación similar a cron en la configuración ARPSCAN_RUN_SCHD "
+ },
+ {
+ "language_code": "de_de",
+ "string": "Auswählen wann der Netzwerkscan laufen soll. Typischerweise wird schedule ausgewählt und ein cron-Intervall in der ARPSCAN_RUN_SCHDEinstellung gesetzt."
+ }
+ ]
+ },
+ {
+ "function": "CMD",
+ "type": "readonly",
+ "default_value": "python3 /app/front/plugins/nmap_dev_scan/nmap_dev.py userSubnets={subnets}",
+ "options": [],
+ "localized": [
+ "name",
+ "description"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "Command"
+ },
+ {
+ "language_code": "es_es",
+ "string": "Comando"
+ },
+ {
+ "language_code": "de_de",
+ "string": "Befehl"
+ }
+ ],
+ "description": [
+ {
+ "language_code": "en_us",
+ "string": "Command to run. This should not be changed"
+ },
+ {
+ "language_code": "es_es",
+ "string": "Comando para ejecutar. Esto no debe ser cambiado"
+ },
+ {
+ "language_code": "de_de",
+ "string": "Auszuführender Befehl. Dieser sollte nicht geändert werden"
+ }
+ ]
+ },
+ {
+ "function": "RUN_TIMEOUT",
+ "type": "integer",
+ "default_value": 300,
+ "options": [],
+ "localized": [
+ "name",
+ "description"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "Run timeout"
+ },
+ {
+ "language_code": "es_es",
+ "string": "Tiempo límite de ejecución"
+ },
+ {
+ "language_code": "de_de",
+ "string": "Zeitlimit"
+ }
+ ],
+ "description": [
+ {
+ "language_code": "en_us",
+ "string": "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
+ },
+ {
+ "language_code": "es_es",
+ "string": "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, se cancela el script."
+ },
+ {
+ "language_code": "de_de",
+ "string": "Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei Überschreitung dieser Zeit wird das Skript abgebrochen."
+ }
+ ]
+ },
+ {
+ "function": "RUN_SCHD",
+ "type": "text",
+ "default_value": "*/5 * * * *",
+ "options": [],
+ "localized": [
+ "name",
+ "description"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "Schedule"
+ },
+ {
+ "language_code": "es_es",
+ "string": "Schedule"
+ },
+ {
+ "language_code": "de_de",
+ "string": "Zeitplan"
+ }
+ ],
+ "description": [
+ {
+ "language_code": "en_us",
+ "string": "Only enabled if you select schedule in the ARPSCAN_RUN setting. Make sure you enter the schedule in the correct cron-like format (e.g. validate at crontab.guru). For example entering */3 * * * * will run the scan every 3 minutes. Will be run NEXT time the time passes.
It's recommended to use the same schedule interval for all plugins responsible for discovering new devices."
+ },
+ {
+ "language_code": "es_es",
+ "string": "Solo está habilitado si selecciona schedule en la configuración ARPSCAN_RUN. Asegúrese de ingresar la programación en el formato similar a cron correcto (por ejemplo, valide en crontab.guru). Por ejemplo, ingresar */3 * * * * ejecutará el escaneo cada 3 minutos. Se ejecutará la PRÓXIMA vez que pase el tiempo.
Se recomienda utilizar el mismo intervalo de programación para todos los complementos que analizan su red."
+ },
+ {
+ "language_code": "de_de",
+ "string": "Nur aktiv, wenn schedule in der ARPSCAN_RUN Einstellung ausgewählt wurde. Sichergehen, dass das Intervall in einem korrekten cron-ähnlichen Format angegeben wurde (z.B. auf crontab.guru testen). */3 * * * * würde den Scan alle 3 Minuten starten. Wird erst beim NÄCHSTEN Intervall ausgeführt.
Es wird empfohlen, das Intervall aller Plugins, welche nach neuen Geräten suchen, auf den gleichen Wert zu setzen."
+ }
+ ]
+ },
+ {
+ "function": "WATCH",
+ "type": "text.multiselect",
+ "default_value": [
+ "Watched_Value1",
+ "Watched_Value2"
+ ],
+ "options": [
+ "Watched_Value1",
+ "Watched_Value2",
+ "Watched_Value3",
+ "Watched_Value4"
+ ],
+ "localized": [
+ "name",
+ "description"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "Watched"
+ },
+ {
+ "language_code": "es_es",
+ "string": "Watched"
+ },
+ {
+ "language_code": "de_de",
+ "string": "Überwacht"
+ }
+ ],
+ "description": [
+ {
+ "language_code": "en_us",
+ "string": "Send a notification if selected values change. Use CTRL + Click to select/deselect.
Watched_Value1 is IPWatched_Value2 is VendorWatched_Value3 is Interface Watched_Value4 is N/A CTRL + clic para seleccionar/deseleccionar. Valor_observado1 es IPValor_observado2 es ProveedorValor_observado3 es Interfaz Valor_observado4 es N/A STRG + klicken zum aus-/abwählen. Watched_Value1 ist die IPWatched_Value2 ist der HerstellerWatched_Value3 ist das Interface Watched_Value4 ist nicht in Verwendung sudo nmap -sn ."
+ }
+ ]
+ }
+ ],
+ "database_column_definitions": [
+ {
+ "column": "Object_PrimaryID",
+ "mapped_to_column": "cur_MAC",
+ "css_classes": "col-sm-2",
+ "show": true,
+ "type": "device_name_mac",
+ "default_value": "",
+ "options": [],
+ "localized": [
+ "name"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "MAC"
+ },
+ {
+ "language_code": "es_es",
+ "string": "MAC"
+ },
+ {
+ "language_code": "de_de",
+ "string": "MAC"
+ }
+ ]
+ },
+ {
+ "column": "Object_SecondaryID",
+ "mapped_to_column": "cur_IP",
+ "css_classes": "col-sm-2",
+ "show": true,
+ "type": "device_ip",
+ "default_value": "",
+ "options": [],
+ "localized": [
+ "name"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "IP"
+ },
+ {
+ "language_code": "es_es",
+ "string": "IP"
+ },
+ {
+ "language_code": "de_de",
+ "string": "IP"
+ }
+ ]
+ },
+ {
+ "column": "Watched_Value1",
+ "mapped_to_column": "cur_Name",
+ "css_classes": "col-sm-2",
+ "show": true,
+ "type": "label",
+ "default_value": "",
+ "options": [],
+ "localized": [
+ "name"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "Name"
+ }
+ ]
+ },
+ {
+ "column": "Watched_Value2",
+ "mapped_to_column": "cur_Vendor",
+ "css_classes": "col-sm-2",
+ "show": true,
+ "type": "label",
+ "default_value": "",
+ "options": [],
+ "localized": [
+ "name"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "Vendor"
+ },
+ {
+ "language_code": "es_es",
+ "string": "Proveedor"
+ },
+ {
+ "language_code": "de_de",
+ "string": "Hersteller"
+ }
+ ]
+ },
+ {
+ "column": "Watched_Value3",
+ "mapped_to_column": "cur_LastQuery",
+ "css_classes": "col-sm-2",
+ "show": true,
+ "type": "label",
+ "default_value":"",
+ "options": [],
+ "localized": ["name"],
+ "name":[{
+ "language_code":"en_us",
+ "string" : "Interface"
+ },
+ {
+ "language_code":"es_es",
+ "string" : "Interfaz"
+ }]
+ },
+ {
+ "column": "Dummy",
+ "mapped_to_column": "cur_ScanMethod",
+ "mapped_to_column_data": {
+ "value": "nmap-dev-scan"
+ },
+ "css_classes": "col-sm-2",
+ "show": true,
+ "type": "label",
+ "default_value": "",
+ "options": [],
+ "localized": [
+ "name"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "Scan method"
+ },
+ {
+ "language_code": "es_es",
+ "string": "Método de escaneo"
+ },
+ {
+ "language_code": "de_de",
+ "string": "Scanmethode"
+ }
+ ]
+ },
+ {
+ "column": "DateTimeCreated",
+ "css_classes": "col-sm-2",
+ "show": true,
+ "type": "label",
+ "default_value": "",
+ "options": [],
+ "localized": [
+ "name"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "Created"
+ },
+ {
+ "language_code": "es_es",
+ "string": "Creado"
+ },
+ {
+ "language_code": "de_de",
+ "string": "Erstellt"
+ }
+ ]
+ },
+ {
+ "column": "DateTimeChanged",
+ "css_classes": "col-sm-2",
+ "show": true,
+ "type": "label",
+ "default_value": "",
+ "options": [],
+ "localized": [
+ "name"
+ ],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "Changed"
+ },
+ {
+ "language_code": "es_es",
+ "string": "Cambiado"
+ },
+ {
+ "language_code": "de_de",
+ "string": "Geändert"
+ }
+ ]
+ },
+ {
+ "column": "Status",
+ "css_classes": "col-sm-1",
+ "show": true,
+ "type": "replace",
+ "default_value": "",
+ "options": [
+ {
+ "equals": "watched-not-changed",
+ "replacement": "