Loading plugins v 0.6 🔌 + Show only Down #676 + Docs📚 + Settings page work ⚙

This commit is contained in:
jokob-sk
2024-05-24 08:01:48 +10:00
parent 5e45bf6d4a
commit 10b3e91b8a
19 changed files with 1199 additions and 1155 deletions

View File

@@ -95,7 +95,7 @@
<a href="#" onclick="javascript: initializeDatatable('down');">
<div class="small-box bg-red">
<div class="inner"><h3 id="devicesDown"> -- </h3>
<p class="infobox_label"><?= lang('Device_Shortcut_DownAlerts');?></p>
<p class="infobox_label"><?= lang('Device_Shortcut_DownOnly');?></p>
</div>
<div class="icon"><i class="fa fa-warning text-red-40"></i></div>
</div>
@@ -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;
}

View File

@@ -20,7 +20,7 @@
}
// -------------------------------------------------------------------
// Get plugin type base on prefix
// Get plugin code name base on prefix
function getPluginCodeName(pluginsData, prefix)
{
var result = ""
@@ -58,6 +58,25 @@
return result;
}
// -------------------------------------------------------------------
// Get plugin config based on prefix
function getPluginConfig(pluginsData, prefix)
{
result = ""
pluginsData.forEach((plug) => {
if (plug.unique_prefix == prefix ) {
// console.log(id)
result = plug;
}
});
return result;
}
// -------------------------------------------------------------------
// Generate plugin HTML card based on prefixes in an array
function pluginCards(prefixesOfEnabledPlugins, includeSettings)

View File

@@ -26,11 +26,8 @@
case 'setDeviceData': setDeviceData(); break;
case 'deleteDevice': deleteDevice(); break;
case 'deleteAllWithEmptyMACs': deleteAllWithEmptyMACs(); break;
case 'createBackupDB': createBackupDB(); break;
case 'deleteAllDevices': deleteAllDevices(); break;
case 'runScan15min': runScan15min(); break;
case 'runScan1min': runScan1min(); break;
case 'deleteUnknownDevices': deleteUnknownDevices(); break;
case 'deleteEvents': deleteEvents(); break;
case 'deleteEvents30': deleteEvents30(); break;

View File

@@ -254,10 +254,10 @@ if ($ENABLED_DARKMODE === True) {
<a href="devices.php#new" onclick="initializeDatatable('new')" > <?= lang("Device_Shortcut_NewDevices");?> </a>
</li>
<li>
<a href="devices.php#down" onclick="initializeDatatable('down')" > <?= lang("Device_Shortcut_DownAlerts");?> </a>
<a href="devices.php#down" onclick="initializeDatatable('down')" > <?= lang("Device_Shortcut_DownOnly");?> </a>
</li>
<li>
<a href="devices.php#down_only" onclick="initializeDatatable('down_only')" > <?= lang("Device_Shortcut_DownOnly");?> </a>
<a href="devices.php#offline" onclick="initializeDatatable('offline')" > <?= lang("Gen_Offline");?> </a>
</li>
<li>
<a href="devices.php#archived" onclick="initializeDatatable('archived')" > <?= lang("Device_Shortcut_Archived");?> </a>

View File

@@ -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",

View File

@@ -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.",

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

File diff suppressed because it is too large Load Diff

View File

@@ -273,6 +273,7 @@
"Gen_Error": "Erreur",
"Gen_Filter": "",
"Gen_LockedDB": "",
"Gen_Offline": "",
"Gen_Okay": "OK",
"Gen_Purge": "Purger",
"Gen_ReadDocs": "",

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

@@ -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'<a href=\"/api/table_custom_endpoint.json\" target=\"_blank\"><code>table_custom_endpoint.json</code>endpoint del file</a>.",
"API_CUSTOM_SQL_description": "Puoi specificare una query SQL personalizzata che generer\u00e0 un file JSON e quindi lo esporr\u00e0 tramite l'<a href=\"/api/table_custom_endpoint.json\" target=\"_blank\"><code>table_custom_endpoint.json</code>endpoint del file</a>.",
"API_CUSTOM_SQL_name": "Endpoint personalizzato",
"API_display_name": "API",
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
@@ -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 <b>/config/devices.csv.</b>",
"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 <b>/config/devices.csv.</b>",
"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": "<i class=\"fa fa-copy\"></i> 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 <a href='/settings.php' target='_blank'>Impostazioni</a> 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 <a href='/settings.php' target='_blank'>Impostazioni</a> 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 <code>app_front.log</code>.",
"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": "<i class=\"fa fa-play\"></i> 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": "<i class=\"fa fa-calendar\"></i> Presenza",
"DevDetail_Tab_Sessions": "<i class=\"fa fa-list-ol\"></i> Sessioni",
"DevDetail_Tab_Tools": "<i class=\"fa fa-screwdriver-wrench\"></i> 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.<br><br>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).<br><br>L'output del comando traceroute visualizza l'indirizzo IP di ciascun nodo intermedio sul percorso.<br><br>Il comando traceroute può essere utilizzato per diagnosticare problemi di rete, come ritardi, perdita di pacchetti e percorsi bloccati.<br><br>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.<br><br>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).<br><br>L'output del comando traceroute visualizza l'indirizzo IP di ciascun nodo intermedio sul percorso.<br><br>Il comando traceroute pu\u00f2 essere utilizzato per diagnosticare problemi di rete, come ritardi, perdita di pacchetti e percorsi bloccati.<br><br>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": "<i class=\"fa fa-power-off\"></i> 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 <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">Icons docs</a> 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?<br><br>(questa azione cancellerà la <b>Cronologia eventi</b> e le <b>Sessioni</b> e potrebbe aiutare con costanti (persistenti ) notifiche)",
"DevDetail_button_DeleteEvents_Warning": "Sei sicuro di voler eliminare tutti gli eventi di questo dispositivo?<br><br>(questa azione canceller\u00e0 la <b>Cronologia eventi</b> e le <b>Sessioni</b> 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 (<a href=\"php/server/devices.php?action=ExportCSV\">fai clic per scaricare <i class=\"fa-solid fa-download fa-bounce\"></i> </a>). Leggi come ripristinare i dispositivi da questo file nella <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\" _blank\">Documentazione di backup</a>.",
"Device_MultiEdit_Backup": "Attenzione, l'inserimento di valori errati di seguito interromper\u00e0 la configurazione. Effettua prima il backup del database o della configurazione dei dispositivi (<a href=\"php/server/devices.php?action=ExportCSV\">fai clic per scaricare <i class=\"fa-solid fa-download fa-bounce\"></i> </a>). Leggi come ripristinare i dispositivi da questo file nella <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\" _blank\">Documentazione di backup</a>.",
"Device_MultiEdit_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 👋! </br> Grazie per aver cliccato su questa voce di menù 😅 </br> </br> 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. </br> 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.</br> </br> Grazie per aver letto - Sono grato per ogni tipo di supporto ❤🙏 </br> </br> TL;DR: Supportandomi otterrai: </br> </br> <ul><li>Aggiornamenti più regolari per mantenere i tuoi dati e la tua famiglia sicuri 🔄</li><li>Meno bug 🐛🔫</li><li>Funzionalità migliori e più numerose</li><li>Io non vado in burnout 🔥🤯</li><li>Rilasci meno affrettati 💨</li><li>Migliore documentazione 📚</li><li>Supporto migliore e più veloce in caso di problemi 🆘</li></ul> </br> 📧Invia una mail a <a href='mailto:jokob@duck.com?subject=NetAlertX'>jokob@duck.com</a> se vuoi contattarmi o chiedermi di aggiungere altre piattaforme di sponsorizzazione. </br>",
"Donations_Text": "Hey \ud83d\udc4b! </br> Grazie per aver cliccato su questa voce di men\u00f9 \ud83d\ude05 </br> </br> 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. </br> 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.</br> </br> Grazie per aver letto - Sono grato per ogni tipo di supporto \u2764\ud83d\ude4f </br> </br> TL;DR: Supportandomi otterrai: </br> </br> <ul><li>Aggiornamenti pi\u00f9 regolari per mantenere i tuoi dati e la tua famiglia sicuri \ud83d\udd04</li><li>Meno bug \ud83d\udc1b\ud83d\udd2b</li><li>Funzionalit\u00e0 migliori e pi\u00f9 numerose\u2795</li><li>Io non vado in burnout \ud83d\udd25\ud83e\udd2f</li><li>Rilasci meno affrettati \ud83d\udca8</li><li>Migliore documentazione \ud83d\udcda</li><li>Supporto migliore e pi\u00f9 veloce in caso di problemi \ud83c\udd98</li></ul> </br> \ud83d\udce7Invia una mail a <a href='mailto:jokob@duck.com?subject=NetAlertX'>jokob@duck.com</a> se vuoi contattarmi o chiedermi di aggiungere altre piattaforme di sponsorizzazione. </br>",
"Donations_Title": "Donazioni",
"ENABLE_PLUGINS_description": "Abilita la funzionalità <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins\">plugin</a>. Utilizzare i plugin richiede più risorse hardware, potresti voler disabilitare questa opzione sui dispositivi meno performanti.",
"ENABLE_PLUGINS_description": "Abilita la funzionalit\u00e0 <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins\">plugin</a>. 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": "<i class=\"fa fa-at\"></i>",
@@ -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": "<i class=\"fa fa-gears\"></i>",
"HRS_TO_KEEP_NEWDEV_description": "Questa è un'opzione di manutenzione. Se abilitata (<code>0</code> è disabilitata), tutti i dispositivi marcati con <b>Nuovo Dispositivo</b> verranno eliminati se l'orario della <b>Prima Sessione</b> è precedente all'orario di questa impostazione. Usa questa impostazione se vuoi eliminare automaticamente i <b>Nuovi Dispositivi</b> dopo <code>X</code> ore.",
"HRS_TO_KEEP_NEWDEV_description": "Questa \u00e8 un'opzione di manutenzione. Se abilitata (<code>0</code> \u00e8 disabilitata), tutti i dispositivi marcati con <b>Nuovo Dispositivo</b> verranno eliminati se l'orario della <b>Prima Sessione</b> \u00e8 precedente all'orario di questa impostazione. Usa questa impostazione se vuoi eliminare automaticamente i <b>Nuovi Dispositivi</b> dopo <code>X</code> 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 <code>NETWORK_DEVICE_TYPES</code>.",
"HelpFAQ_Cat_Detail_300_text_b": "indica il numero di porta del Nodo di Rete a cui il dispositivo corrente è connesso. Leggi <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">questa guida</a> 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 <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">questa guida</a> 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 <span class=\"text-danger help_faq_code\">crontab -e</span> 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 <span class=\"text-danger help_faq_code\">crontab -e</span> 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à. <br>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. <br>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 (<a href=\"https://www.php.net/manual/en/timezones.php\" target=\"blank\">Link</a>)",
"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 (<a href=\"https://www.php.net/manual/en/timezones.php\" target=\"blank\">Link</a>)",
"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: <br> <span class=\"text-danger help_faq_code\">drwxrwx--- 2 (il tuo username) www-data</span><br> Se i permessi non sono corretti, puoi reimpostarli con i seguenti comandi attraverso il terminale:<br> <span class=\"text-danger help_faq_code\">sudo chgrp -R www-data /app/db<br>chmod -R 770 /app/db</span><br> 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 <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles\">readme dockerfile (info più aggiornate)</a>.<br/><br/><ul data-sourcepos=\"49:4-52:146\" dir=\"auto\"><li data-sourcepos=\"49:4-49:106\">Scarica il <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/db/app.db\">database originale da GitHub</a>.</li><li data-sourcepos=\"50:4-50:195\">Mappa il file <code>app.db</code> ()<g-emoji class=\"g-emoji\" alias=\"warning\" fallback-src=\"https://github.githubassets.com/images/icons/emoji/unicode/26a0.png\"></g-emoji> non cartella) visto sopra a <code>/app/db/app.db</code> (vedi gli <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles#-examples\">esempi</a> per maggiori dettagli).</li><li data-sourcepos=\"51:4-51:161\">Se riscontri problemi (errori AJAX, impossibile scrivere sul DB, ecc.) assicurati che i permessi siano correttamente impostati, in alternativa controlla i log presenti in <code>/app/front/log</code>.</li><li data-sourcepos=\"52:4-52:146\">Per risolvere i problemi relativi ai permessi puoi provare a creare un backup del database e poi eseguire un Ripristino DB dalla sezione <strong>Manutenzione &gt; Backup/Ripristino</strong>.</li><li data-sourcepos=\"53:4-53:228\">Se il database risulta in modalità sola lettura puoi risolvere impostando l'owner e il gruppo eseguento questo comando sull'host system: <code>docker exec netalertx chown -R www-data:www-data /app/db/app.db</code>.</li></ul>",
"HelpFAQ_Cat_General_102docker_text": "Controlla nuovamente di aver seguito il <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles\">readme dockerfile (info pi\u00f9 aggiornate)</a>.<br/><br/><ul data-sourcepos=\"49:4-52:146\" dir=\"auto\"><li data-sourcepos=\"49:4-49:106\">Scarica il <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/db/app.db\">database originale da GitHub</a>.</li><li data-sourcepos=\"50:4-50:195\">Mappa il file <code>app.db</code> ()<g-emoji class=\"g-emoji\" alias=\"warning\" fallback-src=\"https://github.githubassets.com/images/icons/emoji/unicode/26a0.png\">\u26a0</g-emoji> non cartella) visto sopra a <code>/app/db/app.db</code> (vedi gli <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles#-examples\">esempi</a> per maggiori dettagli).</li><li data-sourcepos=\"51:4-51:161\">Se riscontri problemi (errori AJAX, impossibile scrivere sul DB, ecc.) assicurati che i permessi siano correttamente impostati, in alternativa controlla i log presenti in <code>/app/front/log</code>.</li><li data-sourcepos=\"52:4-52:146\">Per risolvere i problemi relativi ai permessi puoi provare a creare un backup del database e poi eseguire un Ripristino DB dalla sezione <strong>Manutenzione &gt; Backup/Ripristino</strong>.</li><li data-sourcepos=\"53:4-53:228\">Se il database risulta in modalit\u00e0 sola lettura puoi risolvere impostando l'owner e il gruppo eseguento questo comando sull'host system: <code>docker exec netalertx chown -R www-data:www-data /app/db/app.db</code>.</li></ul>",
"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 <span class=\"text-danger help_faq_code\">/app/config/app.conf</span> deve contenere anche il parametro <span class=\"text-danger help_faq_code\">PIALERT_WEB_PROTECTION</span> impostato a <span class=\"text-danger help_faq_code\">True</span>.",
"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 <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">questa guida</a> 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 <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">questa guida</a> per maggiori informazioni.",
"HelpFAQ_Cat_Network_601_head": "Esiste ulteriore documentazione?",
"HelpFAQ_Cat_Network_601_text": "Si, esiste! Visita <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/\">tutta la documentazione</a> 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 <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins\">documentazione plugin</a>. I plugin disinstallati perdono la loro configurazione. Solo i plugin <code>disabilitati</code> 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 <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins\">documentazione plugin</a>. I plugin disinstallati perdono la loro configurazione. Solo i plugin <code>disabilitati</code> 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 <code>il tuo NetAlertX/php/server/devices.php?action=ExportCSV</code> o abilitando il plugin <a href=\"settings.php#CSVBCKP_header\">CSV Backup</a>.",
"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 <b>devices.csv</b> nella cartella <b>/config</b>.",
"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 <b>devices.csv</b> nella cartella <b>/config</b>.",
"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?<br>(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 <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Dispositivi</b></a>.",
"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 <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Dispositivi</b></a>.",
"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?<br>(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 href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">a cosa sto lavorando</a>.",
"Maintenance_current_version": "L'applicazione \u00e8 aggiornata all'ultima versione. Controlla <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">a cosa sto lavorando</a>.",
"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 <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">note di rilascio</a>.",
"Maintenance_new_version": "\ud83c\udd95 E' disponibile una nuova versione. Controlla le <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">note di rilascio</a>.",
"Maintenance_themeselector_apply": "Applica",
"Maintenance_themeselector_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 <code>Tipo</code> 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 <code>Tipo</code> 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 <i class=\"fa fa-server\"></i> 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 è <code>123456</code>. Per cambiare la password esegui <code>/app/back/pialert-cli</code> nel container o usa il <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\">plugin per impostare la password <code>SETPWD_RUN</code></a>.",
"PIALERT_WEB_PASSWORD_description": "La password predefinita \u00e8 <code>123456</code>. Per cambiare la password esegui <code>/app/back/pialert-cli</code> nel container o usa il <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\">plugin per impostare la password <code>SETPWD_RUN</code></a>.",
"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 <code>http://</code> e includendo il numero di porta (senza slash finale <code>/</code>).",
"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 <code>LOG_LEVEL</code> a <code>debug</code> e controlla i <a href=\"/maintenance.php#tab_Logging\">log di errore</a>.",
"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 (<code>*_RUN_SCHD</code>) 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 <b>🔍Scanner Dispositivi</b> abilitati.",
"Settings_device_Scanners_desync": "\u26a0 Le programmazioni dello scanner dispositivi sono desincronizzate.",
"Settings_device_Scanners_desync_popup": "Le programmazioni degli Scanner Dispositivi (<code>*_RUN_SCHD</code>) 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 <b>\ud83d\udd0dScanner Dispositivi</b> 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 <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">documentazione icone</a>. 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 <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">documentazione icone</a>. 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 <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
"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.<b>La validazione non viene eseguita.</b>",
"test_event_icon": "fa-vial-circle-check",
"test_event_tooltip": "Salva i cambiamenti prima di testare le nuove impostazioni."
}
}

View File

@@ -273,6 +273,7 @@
"Gen_Error": "",
"Gen_Filter": "",
"Gen_LockedDB": "",
"Gen_Offline": "",
"Gen_Okay": "",
"Gen_Purge": "",
"Gen_ReadDocs": "",

View File

@@ -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.",

View File

@@ -273,6 +273,7 @@
"Gen_Error": "",
"Gen_Filter": "",
"Gen_LockedDB": "",
"Gen_Offline": "",
"Gen_Okay": "",
"Gen_Purge": "",
"Gen_ReadDocs": "",

View File

@@ -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.",

View File

@@ -273,6 +273,7 @@
"Gen_Error": "",
"Gen_Filter": "",
"Gen_LockedDB": "",
"Gen_Offline": "",
"Gen_Okay": "",
"Gen_Purge": "",
"Gen_ReadDocs": "",

View File

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

View File

@@ -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', "<?= lang("settings_missing")?>");
} 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 = `
<div class="row table_row">
<div class="table_cell bold">
<i class="fa-regular fa-book fa-sm"></i>
${getString(group+'_description')}
<a href="https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/${getPluginCodeName(pluginsData, group)}" target="_blank">
${getString('Gen_ReadDocs')}
${getString('Gen_ReadDocs')}
</a>
</div>
</div>
@@ -650,10 +660,11 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
// display the name of the first person
// echo $settingsJson[0]->name;
var settingsNumber = <?php echo count($settingsJson->data)?>;
var settingsNumberDB = <?php echo count($settings)?>;
var settingsNumberJSON = <?php echo count($settingsJson->data)?>;
// Wrong number of settings processing
if(<?php echo count($settings)?> != settingsNumber)
if(settingsNumberJSON != settingsNumberDB)
{
showModalOk('WARNING', "<?= lang("settings_missing")?>");
}
@@ -705,7 +716,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
// ---------------------------------------------------------
function saveSettings() {
if(<?php echo count($settings)?> != settingsNumber)
if(settingsNumberJSON != settingsNumberDB)
{
showModalOk('WARNING', "<?= lang("settings_missing_block")?>");
} 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