Compare commits

...

15 Commits

Author SHA1 Message Date
jokob-sk
6fd8c2fbd9 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2025-06-07 09:36:32 +10:00
jokob-sk
a3dba96908 docs, css fixes 2025-06-07 09:35:35 +10:00
Hosted Weblate
ae6be2f525 Merge branch 'origin/main' into Weblate. 2025-06-07 01:01:33 +02:00
Massimo Pissarello
16a45c7826 Translated using Weblate (Italian)
Currently translated at 100.0% (751 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2025-06-07 01:01:31 +02:00
jokob-sk
5676b50d5d docs, has_update_devices fix, docs 2025-06-07 09:00:56 +10:00
jokob-sk
7940038728 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2025-06-07 07:14:09 +10:00
jokob-sk
1e13bf6629 devMac in wf 2025-06-07 07:14:04 +10:00
Максим Горпиніч
7dcec16152 Translated using Weblate (Ukrainian)
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Currently translated at 100.0% (751 of 751 strings)

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

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/fr/
2025-06-06 19:01:58 +02:00
Hosted Weblate
d51f79a154 Merge branch 'origin/main' into Weblate.
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
2025-06-05 08:02:32 +02:00
Sylvain Pichon
4bc5c9c8ab Translated using Weblate (French)
Currently translated at 99.8% (750 of 751 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/fr/
2025-06-05 08:02:31 +02:00
jokob-sk
d6260e6fb2 docs 2025-06-05 16:02:07 +10:00
jokob-sk
ce05ce240c Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2025-06-05 13:38:47 +10:00
jokob-sk
10e8c08ce3 initCheck #1065 2025-06-05 13:38:43 +10:00
Massimo Pissarello
71a36f2fe6 Translated using Weblate (Italian)
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
Currently translated at 100.0% (746 of 746 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2025-06-03 03:04:32 +02:00
44 changed files with 543 additions and 100 deletions

View File

@@ -18,7 +18,7 @@
# SCAN_SUBNETS = [ '192.168.1.0/24 --interface=eth1', '192.168.1.0/24 --interface=eth0' ] # SCAN_SUBNETS = [ '192.168.1.0/24 --interface=eth1', '192.168.1.0/24 --interface=eth0' ]
DISCOVER_PLUGINS=True DISCOVER_PLUGINS=True
SCAN_SUBNETS=['192.168.1.0/24 --interface=eth0'] SCAN_SUBNETS=['--localnet']
TIMEZONE='Europe/Berlin' TIMEZONE='Europe/Berlin'
LOADED_PLUGINS=['ARPSCAN','CSVBCKP','DBCLNP', 'DIGSCAN', 'INTRNT','MAINT','NEWDEV', 'NBTSCAN', 'NSLOOKUP','NTFPRCS', 'AVAHISCAN', 'SETPWD','SMTP', 'SYNC', 'VNDRPDT', 'WORKFLOWS', 'UI'] LOADED_PLUGINS=['ARPSCAN','CSVBCKP','DBCLNP', 'DIGSCAN', 'INTRNT','MAINT','NEWDEV', 'NBTSCAN', 'NSLOOKUP','NTFPRCS', 'AVAHISCAN', 'SETPWD','SMTP', 'SYNC', 'VNDRPDT', 'WORKFLOWS', 'UI']

View File

@@ -53,6 +53,7 @@ services:
- ${DEV_LOCATION}/front/plugins.php:/app/front/plugins.php - ${DEV_LOCATION}/front/plugins.php:/app/front/plugins.php
- ${DEV_LOCATION}/front/pluginsCore.php:/app/front/pluginsCore.php - ${DEV_LOCATION}/front/pluginsCore.php:/app/front/pluginsCore.php
- ${DEV_LOCATION}/front/index.php:/app/front/index.php - ${DEV_LOCATION}/front/index.php:/app/front/index.php
- ${DEV_LOCATION}/front/initCheck.php:/app/front/initCheck.php
- ${DEV_LOCATION}/front/maintenance.php:/app/front/maintenance.php - ${DEV_LOCATION}/front/maintenance.php:/app/front/maintenance.php
- ${DEV_LOCATION}/front/network.php:/app/front/network.php - ${DEV_LOCATION}/front/network.php:/app/front/network.php
- ${DEV_LOCATION}/front/presence.php:/app/front/presence.php - ${DEV_LOCATION}/front/presence.php:/app/front/presence.php

View File

@@ -1,42 +1,109 @@
# ⚙ Initial Setup # ⚡ Quick Start Guide
## 📁 Configuration Files Get **NetAlertX** up and running in a few simple steps.
- On first run, the app generates a default `app.conf` and `app.db` if unavailable.
- Preferred method: Use the **Settings UI**.
- If the UI is inaccessible, manually edit [`app.conf`](https://github.com/jokob-sk/NetAlertX/tree/main/back) in `/app/config/`.
--- ---
## 🖥️ Setting Up Scanners ### 1. Configure Scanner Plugin(s)
- Define networks to scan by entering accessible subnets. > [!TIP]
- Default plugin: **ARPSCAN** → Requires at least one valid subnet + interface in `SCAN_SUBNETS`. > Enable additional plugins under **Settings → `LOADED_PLUGINS`**.
- 📖 [Subnet & VLAN setup guide](./SUBNETS.md) (for troubleshooting and advanced scenarios). > Make sure to **save** your changes and **reload the page** to activate them.
> ![Loaded plugins settings](./img/PLUGINS/loaded_plugins_setting.png)
### 🔄 PiHole Sync **Initial configuration**: `ARPSCAN`, `INTRNT`
- If using **PiHole**, devices can be synced automatically.
- 📖 [PiHole configuration guide](./PIHOLE_GUIDE.md).
### 📦 Bulk Import > [!NOTE]
> [!NOTE] > `ARPSCAN` and `INTRNT` scan the current network. You can complement them with other `🔍 dev scanner` plugins like `NMAPDEV`, or import devices using `📥 importer` plugins.
> You can bulk-import devices via the [CSV import method](./DEVICES_BULK_EDITING.md). > See the [Subnet & VLAN Setup Guide](./SUBNETS.md) and [Remote Networks](./REMOTE_NETWORKS.md) for advanced configurations.
--- ---
## 🌍 Community Guides ### 2. Choose a Publisher Plugin
- Various community-written configuration guides in **Chinese, Korean, German, French**. **Initial configuration**: `SMTP`
- 📖 [Community Guides](./COMMUNITY_GUIDES.md)
> ⚠️ **Note:** These guides may be outdated. Always refer to the official documentation first. > [!NOTE]
> Configure your SMTP settings or enable additional `▶️ publisher` plugins to send alerts.
> For more flexibility, try [📚 `_publisher_apprise`](/front/plugins/_publisher_apprise/), which supports over 80 notification services.
--- ---
## 🛠️ Common Issues ### 3. Set Up a Network Topology Diagram
Before creating a new issue: ![Network tree](./img/NETWORK_TREE/Network_tree_details.png)
- Check if a similar issue was [already resolved](https://github.com/jokob-sk/NetAlertX/issues?q=is%3Aissue+is%3Aclosed). **Initial configuration**: The app auto-selects a root node (MAC `internet`) and attempts to identify other network devices by vendor or name.
- Review [common debugging tips](./DEBUG_TIPS.md).
- Check [Common Issues](./COMMON_ISSUES.md) > [!NOTE]
> Visualize and manage your network using the [Network Guide](./NETWORK_TREE.md).
> Some plugins (e.g., `UNFIMP`) build the topology automatically, or you can use [Custom Workflows](./WORKFLOWS.md) to generate it based on your own rules.
---
### 4. Configure Notifications
![Notification settings](./img/NOTIFICATIONS/Global-notification-settings.png)
**Initial configuration**: Notifies on `new_devices`, `down_devices`, and `events` as defined in `NTFPRCS_INCLUDED_SECTIONS`.
> [!NOTE]
> Notification settings support global, plugin-specific, and per-device rules.
> For fine-tuning, refer to the [Notification Guide](./NOTIFICATIONS.md).
---
### 5. Set Up Workflows
![Workflows](./img/WORKFLOWS/workflows.png)
**Initial configuration**: N/A
> [!NOTE]
> Automate responses to device status changes, group management, topology updates, and more.
> See the [Workflows Guide](./WORKFLOWS.md) to simplify your network operations.
---
### 6. Backup Your Configuration
![Backups](./img/BACKUPS/Maintenance_Backup_Restore.png)
**Initial configuration**: The `CSVBCKP` plugin creates a daily backup to `/config/devices.csv`.
> [!NOTE]
> For a complete backup strategy, follow the [Backup Guide](./BACKUPS.md).
---
### 7. (Optional) Create Custom Plugins
[![Custom Plugin Video](./img/YouTube_thumbnail.png)](https://youtu.be/cdbxlwiWhv8)
**Initial configuration**: N/A
> [!NOTE]
> Build your own scanner, importer, or publisher plugin.
> See the [Plugin Development Guide](./PLUGINS_DEV.md) and included video tutorials.
---
## 📁 Recommended Guides
* 📘 [PiHole Setup Guide](./PIHOLE_GUIDE.md)
* 📘 [CSV Import Method](./DEVICES_BULK_EDITING.md)
* 📘 [Community Guides (Chinese, Korean, German, French)](./COMMUNITY_GUIDES.md)
---
## 🛠️ Troubleshooting & Help
Before opening a new issue:
* 📘 [Common Issues](./COMMON_ISSUES.md)
* 🧰 [Debugging Tips](./DEBUG_TIPS.md)
* ✅ [Browse resolved GitHub issues](https://github.com/jokob-sk/NetAlertX/issues?q=is%3Aissue+is%3Aclosed)
---
Let me know if you want a condensed README version, separate pages for each section, or UI copy based on this!

View File

@@ -1,7 +1,7 @@
# Migration form PiAlert to NetAlertX # Migration form PiAlert to NetAlertX
> [!WARNING] > [!WARNING]
> Follow this guide only after you you downloaded and started NetAlert X at least once after previously using the PiAlert image. > Follow this guide only after you you downloaded and started a version of NetAlertX prior to v25.6.7 (e.g. `docker pull ghcr.io/jokob-sk/netalertx:25.5.24`) at least once after previously using the PiAlert image. Later versions don't support migration and devices and settings will have to migrated manually, e.g. via [CSV import](./DEVICES_BULK_EDITING.md).
## STEPS: ## STEPS:

View File

@@ -2,6 +2,12 @@
Name resolution in NetAlertX relies on multiple plugins to resolve device names from IP addresses. If you are seeing `(name not found)` as device names, follow these steps to diagnose and fix the issue. Name resolution in NetAlertX relies on multiple plugins to resolve device names from IP addresses. If you are seeing `(name not found)` as device names, follow these steps to diagnose and fix the issue.
> [!TIP]
> Before proceeding, make sure [Reverse DNS](./REVERSE_DNS.md) is enabled on your network.
> You can control how names are handled and cleaned using the `NEWDEV_NAME_CLEANUP_REGEX` setting.
> To auto-update Fully Qualified Domain Names (FQDN), enable the `REFRESH_FQDN` setting.
## Required Plugins ## Required Plugins
For best results, ensure the following name resolution plugins are enabled: For best results, ensure the following name resolution plugins are enabled:

View File

@@ -2,6 +2,11 @@
If you are running a DNS server, such as **AdGuard**, set up **Private reverse DNS servers** for a better name resolution on your network. Enabling this setting will enable NetAlertX to execute dig and nslookup commands to automatically resolve device names based on their IP addresses. If you are running a DNS server, such as **AdGuard**, set up **Private reverse DNS servers** for a better name resolution on your network. Enabling this setting will enable NetAlertX to execute dig and nslookup commands to automatically resolve device names based on their IP addresses.
> [!TIP]
> Before proceeding, ensure that [name resolution plugins](./NAME_RESOLUTION.md) are enabled.
> You can customize how names are cleaned using the `NEWDEV_NAME_CLEANUP_REGEX` setting.
> To auto-update Fully Qualified Domain Names (FQDN), enable the `REFRESH_FQDN` setting.
> Example 1: Reverse DNS `disabled` > Example 1: Reverse DNS `disabled`
> >

View File

@@ -1,5 +1,8 @@
# Docker Update Strategies to upgrade NetAlertX # Docker Update Strategies to upgrade NetAlertX
> [!WARNING]
> For versions prior to `v25.6.7` upgrade to version `v25.5.24` first (`docker pull ghcr.io/jokob-sk/netalertx:25.5.24`) as later versions don't support a full upgrade. Alternatovelly, devices and settings can be migrated manually, e.g. via [CSV import](./DEVICES_BULK_EDITING.md).
This guide outlines approaches for updating Docker containers, usually when upgrading to a newer version of NetAlertX. Each method offers different benefits depending on the situation. Here are the methods: This guide outlines approaches for updating Docker containers, usually when upgrading to a newer version of NetAlertX. Each method offers different benefits depending on the situation. Here are the methods:
- Manual: Direct commands to stop, remove, and rebuild containers. - Manual: Direct commands to stop, remove, and rebuild containers.

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

BIN
docs/img/netalertx_docs_old.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@@ -695,6 +695,39 @@ body
/* maintenance buttons */ /* maintenance buttons */
#file-check-list{
display: block;
}
.file-checking .icon-wrap{
width: 200px;
overflow: hidden;
text-overflow: ellipsis;
display: block;
}
.file-checking .icon-wrap i{
position: absolute;
font-size: xx-large;
right: 0;
top: 0;
opacity: 0.2;
}
.file-checking .file-name-wrap{
overflow: hidden;
text-overflow: ellipsis;
display: flex;
padding: 5px;
}
.file-checking{
display: block;
overflow: hidden;
text-overflow: ellipsis;
}
.dbtools-button { .dbtools-button {
display: inline-block; display: inline-block;
width: 160px; width: 160px;
@@ -842,6 +875,11 @@ height: 50px;
margin-bottom: 10px; margin-bottom: 10px;
} }
#notifications .notification-buttons{
margin: 10px;
padding: 10px;
}
#notificationData textarea{ #notificationData textarea{
width: 100%; width: 100%;
} }
@@ -1418,6 +1456,11 @@ input[readonly] {
cursor: default; cursor: default;
} }
.small-box:hover
{
color: inherit;
}
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */
/* Device details */ /* Device details */
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */

View File

@@ -768,8 +768,8 @@ function initializeDatatable (status) {
{width: '30px', targets: [mapIndx(3), mapIndx(10), mapIndx(13), mapIndx(18)] }, {width: '30px', targets: [mapIndx(3), mapIndx(10), mapIndx(13), mapIndx(18)] },
{orderData: [mapIndx(12)], targets: mapIndx(8) }, {orderData: [mapIndx(12)], targets: mapIndx(8) },
// Device Name // Device Name and FQDN
{targets: [mapIndx(0)], {targets: [mapIndx(0), mapIndx(27)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
// console.log(cellData) // console.log(cellData)
@@ -848,7 +848,7 @@ function initializeDatatable (status) {
{targets: [mapIndx(26)], {targets: [mapIndx(26)],
'createdCell': function (td, cellData, rowData, row, col) { 'createdCell': function (td, cellData, rowData, row, col) {
if (!emptyArr.includes(cellData)){ if (!emptyArr.includes(cellData)){
$(td).html (`<span>${renderCustomProps(cellData, rowData[mapIndx(11)])}<span>`); $(td).html (`<span>${renderCustomProps(cellData, rowData[mapIndx(11)])}</span>`);
} else { } else {
$(td).html (''); $(td).html ('');
} }

52
front/initCheck.php Executable file
View File

@@ -0,0 +1,52 @@
<?php
//------------------------------------------------------------------------------
// check if authenticated
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
?>
<div class="col-md-12">
<div class="py-5">
<div class="mt-4 text-center" id="check-status-plc" >
<div class="alert alert-warning">
<i class="fa-solid fa-spinner fa-spin text-secondary"></i> <?= lang('Maintenance_InitCheck_Checking');?>
</div>
</div>
<div class="mt-4 text-center" id="check-status" style="display: none;">
<div class="alert alert-success">
<i class="fa-solid fa-check text-success"></i> <?= lang('Maintenance_InitCheck_Success');?>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="d-flex flex-wrap gap-2 w-100" id="file-check-list"></div>
</div>
</div>
<div class="row">
<div class="text-center box box-secondary col-md-6">
<p class="text-muted"><?= lang('Maintenance_InitCheck_QuickSetupGuide');?></p>
</div>
</div>
<div class="row">
<div class="col-md-12 center text-center" >
<button type="button" class=" col-md-12 btn btn-default bg-green " onclick="retryCheck()"><?= lang('Maintenance_ReCheck');?></button>
</div>
</div>
</div>
</div>
<script>
function retryCheck() {
// re-set page
$('#file-check-list').empty();
$('#check-status').hide();
$('#check-status-plc').show();
// re-run check
checkAppInitializedJsonInit();
}
$(document).ready(() => {
checkAppInitializedJsonInit();
});
</script>

View File

@@ -113,7 +113,7 @@ function deleteAllCookies() {
function cacheSettings() function cacheSettings()
{ {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if(!getCache('completedCalls').includes('cacheSettings')) if(!getCache('cacheSettings_completed') === true)
{ {
$.get('php/server/query_json.php', { file: 'table_settings.json', nocache: Date.now() }, function(resSet) { $.get('php/server/query_json.php', { file: 'table_settings.json', nocache: Date.now() }, function(resSet) {
@@ -211,8 +211,18 @@ function getSetting (key) {
function cacheStrings() { function cacheStrings() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// Create a promise for each language // Create a promise for each language (include en_us by default as fallback)
languagesToLoad = ['en_us', getLangCode()] languagesToLoad = ['en_us']
additionalLanguage = getLangCode()
if(additionalLanguage != 'en_us')
{
languagesToLoad.push(additionalLanguage)
}
console.log(languagesToLoad);
const languagePromises = languagesToLoad.map((language_code) => { const languagePromises = languagesToLoad.map((language_code) => {
return new Promise((resolveLang, rejectLang) => { return new Promise((resolveLang, rejectLang) => {
// Fetch core strings and translations // Fetch core strings and translations
@@ -235,7 +245,7 @@ function cacheStrings() {
}); });
// Handle successful completion of language processing // Handle successful completion of language processing
handleSuccess(`cacheStrings[${language_code}]`, resolveLang); handleSuccess(`cacheStrings`, resolveLang);
}) })
.fail((pluginError) => { .fail((pluginError) => {
// Handle failure in plugin strings fetching // Handle failure in plugin strings fetching
@@ -356,9 +366,11 @@ function getLangCode() {
function localizeTimestamp(result) function localizeTimestamp(result)
{ {
// contains TZ in format Europe/Berlin // contains TZ in format Europe/Berlin
tz = getSetting("TIMEZONE") tz = getSetting("TIMEZONE")
// set default if not available or app still loading
tz == "" ? tz = 'Europe/Berlin' : tz = tz;
const date = new Date(result); // Assumes result is a timestamp or ISO string const date = new Date(result); // Assumes result is a timestamp or ISO string
const formatter = new Intl.DateTimeFormat('default', { const formatter = new Intl.DateTimeFormat('default', {
@@ -1366,8 +1378,8 @@ function restartBackend() {
const sessionStorageKey = "myScriptExecuted_common_js"; const sessionStorageKey = "myScriptExecuted_common_js";
var completedCalls = [] var completedCalls = []
var completedCalls_final = ['cacheSettings', 'cacheStrings', 'cacheDevices']; var completedCalls_final = ['cacheSettings', 'cacheStrings', 'cacheDevices'];
var completedCallsCount = 0; var lang_completedCalls = 0;
var completedCallsCount_final;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Clearing all the caches // Clearing all the caches
@@ -1453,12 +1465,27 @@ async function isGraphQLServerRunning() {
// Check if the code has been executed before by checking sessionStorage // Check if the code has been executed before by checking sessionStorage
function isAppInitialized() { function isAppInitialized() {
completedCalls = parseInt(getCache("completedCallsCount")); lang_shouldBeCompletedCalls = getLangCode() == 'en_us' ? 1 : 2;
shouldBeCompletedCalls = getLangCode() == 'en_us' ? 3 : 4;
return ( // check if each ajax call completed succesfully
completedCalls >= shouldBeCompletedCalls $.each(completedCalls_final, function(index, call_name){
);
if(getCache(call_name + "_completed") != "true")
{
console.log(`[isAppInitialized] AJAX call ${call_name} unsuccesful: ${getCache(call_name + "_completed")}`)
return false;
}
});
// check if all required languages chached
if(parseInt(getCache("cacheStringsCountCompleted")) != lang_shouldBeCompletedCalls)
{
console.log(`[isAppInitialized] AJAX call cacheStrings unsuccesful: ${getCache("cacheStringsCountCompleted")} out of ${lang_shouldBeCompletedCalls}`)
return false;
}
return true;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
@@ -1489,27 +1516,25 @@ async function executeOnce() {
// Function to handle successful completion of an AJAX call // Function to handle successful completion of an AJAX call
const handleSuccess = (callName) => { const handleSuccess = (callName) => {
console.log(`AJAX call successful: ${callName}`); console.log(`AJAX call successful: ${callName}`);
// completedCalls.push(callName);
// setCache('completedCalls', mergeUniqueArrays(getCache('completedCalls').split(','), [callName]));
val = getCache('completedCallsCount'); if(callName.includes("cacheStrings"))
if(val == "")
{ {
val = 0; completed_tmp = getCache("cacheStringsCountCompleted");
} else completed_tmp == "" ? completed_tmp = 0 : completed_tmp = completed_tmp;
{ completed_tmp++;
val = parseInt(val) setCache("cacheStringsCountCompleted", completed_tmp);
} }
setCache('completedCallsCount', val + 1) setCache(callName + "_completed", true)
}; };
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Function to handle failure of an AJAX call // Function to handle failure of an AJAX call
const handleFailure = (callName, callback) => { const handleFailure = (callName, callback) => {
console.error(`AJAX call ${callName} failed`); msg = `AJAX call ${callName} failed`
console.error(msg);
// Implement retry logic here if needed // Implement retry logic here if needed
// write_notification(msg, 'interrupt')
}; };
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@@ -433,7 +433,7 @@ function initListInteractionOptions(element) {
if (clickCounter === 1) { if (clickCounter === 1) {
// Single-click action // Single-click action
showModalFieldInput( showModalFieldInput(
`<i class="fa-regular fa-pen-to-square"></i> ${getString( `<i class="fa fa-pen-to-square"></i> ${getString(
"Gen_Update_Value" "Gen_Update_Value"
)}`, )}`,
getString("settings_update_item_warning"), getString("settings_update_item_warning"),

View File

@@ -26,6 +26,134 @@ function lockDatabase(delay=20) {
} }
const requiredFiles = [
'app_state.json',
'plugins.json',
'table_devices.json',
'table_devices_filters.json',
'table_devices_tiles.json',
'table_notifications.json',
'table_online_history.json',
'table_appevents.json',
'table_custom_endpoint.json',
'table_events_pending_alert.json',
'table_plugins_events.json',
'table_plugins_history.json',
'table_plugins_language_strings.json',
'table_plugins_objects.json',
'table_settings.json',
'user_notifications.json'
];
const internalChecks = ['isAppInitialized', 'isGraphQLServerRunning'];
const fileStatus = {}; // Track file check results
function updateFileStatusUI(file, status) {
const item = $(`#file-${file.replace(/[^a-z0-9]/gi, '-')}`);
const icon = item.find('span.icon-wrap');
if (status === 'ok') {
icon.html('<i class="fa-solid fa-check "></i>');
} else if (status === 'fail') {
icon.html('<i class="fa-solid fa-xmark "></i>');
} else {
icon.html('<i class="fa-solid fa-spinner fa-spin text-secondary"></i>');
}
}
function checkAppInitializedJson() {
requiredFiles.forEach(file => {
$.get('php/server/query_json.php', { file, nocache: Date.now() })
.done(() => {
if (fileStatus[file] !== 'ok') {
fileStatus[file] = 'ok';
updateFileStatusUI(file, 'ok');
}
})
.fail(() => {
fileStatus[file] = 'fail';
updateFileStatusUI(file, 'fail');
});
});
const allOk = requiredFiles.every(file => fileStatus[file] === 'ok');
if (allOk) {
checkInternalStatusAfterFiles();
} else {
setTimeout(checkAppInitializedJson, 1000);
}
}
function checkInternalStatusAfterFiles() {
const promises = [
waitForAppInitialized().then(() => {
fileStatus['isAppInitialized'] = 'ok';
updateFileStatusUI('isAppInitialized', 'ok');
}).catch(() => {
fileStatus['isAppInitialized'] = 'fail';
updateFileStatusUI('isAppInitialized', 'fail');
}),
waitForGraphQLServer().then(() => {
fileStatus['isGraphQLServerRunning'] = 'ok';
updateFileStatusUI('isGraphQLServerRunning', 'ok');
}).catch(() => {
fileStatus['isGraphQLServerRunning'] = 'fail';
updateFileStatusUI('isGraphQLServerRunning', 'fail');
})
];
Promise.allSettled(promises).then(() => {
const allPassed = internalChecks.every(key => fileStatus[key] === 'ok');
if (allPassed) {
$('#check-status').show();
$('#check-status-plc').hide();
} else {
setTimeout(checkInternalStatusAfterFiles, 1000);
}
});
}
function waitForAppInitialized() {
return new Promise((resolve, reject) => {
if (isAppInitialized()) {
resolve();
} else {
reject();
}
});
}
// Initial UI setup for all items
function checkAppInitializedJsonInit() {
const allItems = [...requiredFiles, ...internalChecks];
allItems.forEach(file => {
$('#file-check-list').append(`
<div class="panel panel-secondary col-xs-6 col-sm-4 col-md-3 col-lg-2 col-xxl-1 padding-5px">
<div class="file-checking border rounded p-2 d-flex flex-column justify-content-between h-100" id="file-${file.replace(/[^a-z0-9]/gi, '-')}">
<div class="d-flex align-items-center gap-2 mb-2">
<span class="file-name-wrap flex-grow-1 text-truncate" title="${file}">${file}</span>
<span class="icon-wrap align-items-center text-center"><i class="fa-solid fa-spinner fa-spin text-secondary"></i></span>
</div>
</div>
</div>
`);
fileStatus[file] = 'checking';
});
checkAppInitializedJson();
}

View File

@@ -200,9 +200,9 @@ function validateRegex(elem) {
// Validate against regex // Validate against regex
if (regex.test(value)) { if (regex.test(value)) {
iconSpan.html("<i class='fa-regular fa-check'></i>"); iconSpan.html("<i class='fa fa-check'></i>");
} else { } else {
iconSpan.html("<i class='fa-regular fa-xmark'></i>"); iconSpan.html("<i class='fa fa-xmark'></i>");
} }
} }

View File

@@ -51,7 +51,7 @@ $db->close();
<div class="box" id="Maintain-Status"> <div class="box" id="Maintain-Status">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title"> <h3 class="box-title">
<i class="fa fa-display"></i></i> <i class="fa fa-display"></i>
<?= lang('Maintenance_Status');?> <?= lang('Maintenance_Status');?>
</h3> </h3>
</div> </div>
@@ -59,7 +59,7 @@ $db->close();
<div class="db_info_table"> <div class="db_info_table">
<div class="db_info_table_row"> <div class="db_info_table_row">
<div class="db_info_table_cell" style="min-width: 140px"><?= lang('Maintenance_version');?> <div class="db_info_table_cell" style="min-width: 140px"><?= lang('Maintenance_version');?>
<a href="https://github.com/jokob-sk/NetAlertX/blob/main/docs/VERSIONS.md" target="_blank"> <span><i class="fa fa-circle-question"></i></a><span> <a href="https://github.com/jokob-sk/NetAlertX/blob/main/docs/VERSIONS.md" target="_blank"> <span><i class="fa fa-circle-question"></i></a></span>
</div> </div>
<div class="db_info_table_cell"> <div class="db_info_table_cell">
<div class="version" id="version" data-build-time="<?php echo file_get_contents( "buildtimestamp.txt");?>"> <div class="version" id="version" data-build-time="<?php echo file_get_contents( "buildtimestamp.txt");?>">
@@ -111,7 +111,7 @@ $db->close();
</div> </div>
<div class="nav-tabs-custom"> <div class="nav-tabs-custom">
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
<li class="active"> <li class="active">
<a id="tab_DBTools_id" href="#tab_DBTools" data-toggle="tab"> <a id="tab_DBTools_id" href="#tab_DBTools" data-toggle="tab">
<i class="fa fa-toolbox"></i> <i class="fa fa-toolbox"></i>
@@ -136,7 +136,13 @@ $db->close();
<?= lang('Device_MultiEdit');?> <?= lang('Device_MultiEdit');?>
</a> </a>
</li> </li>
</ul> <li>
<a id="tab_initCheck_id" href="#tab_initCheck" data-toggle="tab">
<i class="fa-solid fa-check"></i>
<?= lang('Maintenance_InitCheck');?>
</a>
</li>
</ul>
<div class="tab-content"> <div class="tab-content">
<div class="tab-pane active" id="tab_DBTools"> <div class="tab-pane active" id="tab_DBTools">
<div class="db_info_table"> <div class="db_info_table">
@@ -178,6 +184,8 @@ $db->close();
</div> </div>
</div> </div>
</div> </div>
<!-- ---------------------------Backup restore -------------------------------------------- -->
<div class="tab-pane" id="tab_BackupRestore"> <div class="tab-pane" id="tab_BackupRestore">
<div class="db_info_table"> <div class="db_info_table">
<div class="db_info_table_row"> <div class="db_info_table_row">
@@ -245,11 +253,11 @@ $db->close();
</div> </div>
</div> </div>
</div> </div>
<div class="db_info_table"> <div class="db_info_table">
<div id="logsPlc"></div> <div id="logsPlc"></div>
</div> </div>
</div> </div>
<!-- ---------------------------Bulk edit -------------------------------------------- --> <!-- ---------------------------Bulk edit -------------------------------------------- -->
<div class="tab-pane" id="tab_multiEdit"> <div class="tab-pane" id="tab_multiEdit">
<div class="db_info_table"> <div class="db_info_table">
@@ -260,35 +268,53 @@ $db->close();
</div> </div>
</div> </div>
</div>
</div> </div>
<!-- ---------------------------Init check -------------------------------------------- -->
<div class="tab-pane" id="tab_initCheck">
<div class="db_info_table">
<div class="box box-solid">
<?php
require 'initCheck.php';
?>
</div>
</div>
</div>
<!-- ------------------------------------------------------------------------------ --> <!-- ------------------------------------------------------------------------------ -->
</div> </div>
</div>
<div class="box-body" style="text-align: center;"> <div class="box-body " style="text-align: center;">
<h5 class="text-aqua" style="font-size: 16px;"> <h5 class="text-aqua" style="font-size: 16px;">
<span id="lastCommit"> <span id="lastCommit">
</span> </span>
<span id="lastDockerUpdate"> <span id="lastDockerUpdate">
</span> </span>
</h5> </h5>
</div> </div>
</div>
</section>
<!-- /.content -->
<?php
require 'php/templates/footer.php';
?>
</div> </div>
<!-- /.content-wrapper -->
</section>
<!-- /.content -->
<?php
require 'php/templates/footer.php';
?>
</div>
<!-- /.content-wrapper -->
<!-- ----------------------------------------------------------------------- --> <!-- ----------------------------------------------------------------------- -->

View File

@@ -64,10 +64,6 @@
</div> </div>
</div> </div>
</div>
<script defer> <script defer>

View File

@@ -125,8 +125,7 @@
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<br>
<div id="assignedDevices" class="box-body no-padding"> <div id="assignedDevices" class="box-body no-padding">
<div class="page-header"> <div class="page-header">
<h3> <h3>

View File

@@ -28,7 +28,7 @@
<!-- To the right --> <!-- To the right -->
<div class="pull-right no-hidden-xs"> <div class="pull-right no-hidden-xs">
| <a href="https://gurubase.io/g/netalertx" class="pointer" target="_blank" title="Ask AI"><i class="fa-regular fa-comment-dots fa-flip-horizontal"></i></a> | <a href="https://gurubase.io/g/netalertx" class="pointer" target="_blank" title="Ask AI"><i class="fa fa-comment-dots fa-flip-horizontal"></i></a>
| <a href="https://jokob-sk.github.io/NetAlertX/" class="pointer" target="_blank" title="Documentation"><i class="fa fa-book"></i></a> | <a href="https://jokob-sk.github.io/NetAlertX/" class="pointer" target="_blank" title="Documentation"><i class="fa fa-book"></i></a>
| <a href="https://github.com/jokob-sk/NetAlertX/issues" class="pointer" target="_blank"><i class="fa fa-bug" title="Report a bug"></i></a> | <a href="https://github.com/jokob-sk/NetAlertX/issues" class="pointer" target="_blank"><i class="fa fa-bug" title="Report a bug"></i></a>
| <a href="https://discord.com/invite/NczTUTWyRr" class="pointer" target="_blank"><i class="fa-brands fa-discord" title="Join Discord"></i></a> | <a href="https://discord.com/invite/NczTUTWyRr" class="pointer" target="_blank"><i class="fa-brands fa-discord" title="Join Discord"></i></a>

View File

@@ -357,6 +357,9 @@
<li> <li>
<a href="maintenance.php#tab_multiEdit" onclick="initializeTabs()"> <?= lang("Device_MultiEdit");?> </a> <a href="maintenance.php#tab_multiEdit" onclick="initializeTabs()"> <?= lang("Device_MultiEdit");?> </a>
</li> </li>
<li>
<a href="maintenance.php#tab_initCheck" onclick="initializeTabs()"> <?= lang("Maintenance_InitCheck");?> </a>
</li>
</ul> </ul>
</li> </li>

View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "", "Maint_PurgeLog": "",
"Maint_RestartServer": "", "Maint_RestartServer": "",
"Maint_Restart_Server_noti_text": "", "Maint_Restart_Server_noti_text": "",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "", "Maintenance_Running_Version": "",
"Maintenance_Status": "", "Maintenance_Status": "",
"Maintenance_Title": "", "Maintenance_Title": "",

View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "Registre de purga", "Maint_PurgeLog": "Registre de purga",
"Maint_RestartServer": "Reinici del servidor", "Maint_RestartServer": "Reinici del servidor",
"Maint_Restart_Server_noti_text": "Estàs segur que vols reiniciar el servidor backend? Això pot causar incongruència a l'aplicació. Abans fes còpia de seguretat de la vostra configuració. <br/> <br/> Nota: Això pot durar uns quants minuts.", "Maint_Restart_Server_noti_text": "Estàs segur que vols reiniciar el servidor backend? Això pot causar incongruència a l'aplicació. Abans fes còpia de seguretat de la vostra configuració. <br/> <br/> Nota: Això pot durar uns quants minuts.",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "Versió instal·lada", "Maintenance_Running_Version": "Versió instal·lada",
"Maintenance_Status": "Estat", "Maintenance_Status": "Estat",
"Maintenance_Title": "Eines de manteniment", "Maintenance_Title": "Eines de manteniment",

View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "", "Maint_PurgeLog": "",
"Maint_RestartServer": "", "Maint_RestartServer": "",
"Maint_Restart_Server_noti_text": "", "Maint_Restart_Server_noti_text": "",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "", "Maintenance_Running_Version": "",
"Maintenance_Status": "", "Maintenance_Status": "",
"Maintenance_Title": "", "Maintenance_Title": "",

View File

@@ -385,6 +385,11 @@
"Maint_PurgeLog": "Protokoll bereinigen", "Maint_PurgeLog": "Protokoll bereinigen",
"Maint_RestartServer": "Server neu starten", "Maint_RestartServer": "Server neu starten",
"Maint_Restart_Server_noti_text": "Soll der Backend-Server wirklich neu gestartet werden? Das könnte Instabilitäten verursachen. Vorher ein Backup erstellen. <br/><br/>Hinweis: Das kann einige Minuten dauern.", "Maint_Restart_Server_noti_text": "Soll der Backend-Server wirklich neu gestartet werden? Das könnte Instabilitäten verursachen. Vorher ein Backup erstellen. <br/><br/>Hinweis: Das kann einige Minuten dauern.",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "Installierte Version", "Maintenance_Running_Version": "Installierte Version",
"Maintenance_Status": "Status", "Maintenance_Status": "Status",
"Maintenance_Title": "Wartungswerkzeuge", "Maintenance_Title": "Wartungswerkzeuge",

View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "Purge log", "Maint_PurgeLog": "Purge log",
"Maint_RestartServer": "Restart server", "Maint_RestartServer": "Restart server",
"Maint_Restart_Server_noti_text": "Are you sure you want to restart the backend server? This may casue app inconsistency. Backup your setup first. <br/> <br/> Note: This may take a few minutes.", "Maint_Restart_Server_noti_text": "Are you sure you want to restart the backend server? This may casue app inconsistency. Backup your setup first. <br/> <br/> Note: This may take a few minutes.",
"Maintenance_InitCheck": "Init Check",
"Maintenance_InitCheck_Checking": "Checking...",
"Maintenance_InitCheck_QuickSetupGuide": "Make sure you followed the <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">quick setup guide</a>.",
"Maintenance_InitCheck_Success": "Application initialized succesfully!",
"Maintenance_ReCheck": "Retry Check",
"Maintenance_Running_Version": "Installed version", "Maintenance_Running_Version": "Installed version",
"Maintenance_Status": "Status", "Maintenance_Status": "Status",
"Maintenance_Title": "Maintenance tools", "Maintenance_Title": "Maintenance tools",

View File

@@ -383,6 +383,11 @@
"Maint_PurgeLog": "Purgar los registros", "Maint_PurgeLog": "Purgar los registros",
"Maint_RestartServer": "Restablecer el servidor", "Maint_RestartServer": "Restablecer el servidor",
"Maint_Restart_Server_noti_text": "¿Estás seguro de que desea reiniciar el servidor backend? Esto puede causar inconsistencia en la aplicación. Primero haga una copia de seguridad de su configuración.<br/> <br/> Nota: Esto puede tardar unos minutos.", "Maint_Restart_Server_noti_text": "¿Estás seguro de que desea reiniciar el servidor backend? Esto puede causar inconsistencia en la aplicación. Primero haga una copia de seguridad de su configuración.<br/> <br/> Nota: Esto puede tardar unos minutos.",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "Versión instalada", "Maintenance_Running_Version": "Versión instalada",
"Maintenance_Status": "Situación", "Maintenance_Status": "Situación",
"Maintenance_Title": "Herramientas de mantenimiento", "Maintenance_Title": "Herramientas de mantenimiento",

5
front/php/templates/language/fr_fr.json Normal file → Executable file
View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "Nettoyer les logs", "Maint_PurgeLog": "Nettoyer les logs",
"Maint_RestartServer": "Relancer le serveur", "Maint_RestartServer": "Relancer le serveur",
"Maint_Restart_Server_noti_text": "Êtes-vous sûr de vouloir relancer le serveur back-end? Cela peut causer des incohérences avec l'application. Sauvegarder vos paramètres en premier lieu. <br/> <br/> Remarque: cela peut prendre quelques minutes.", "Maint_Restart_Server_noti_text": "Êtes-vous sûr de vouloir relancer le serveur back-end? Cela peut causer des incohérences avec l'application. Sauvegarder vos paramètres en premier lieu. <br/> <br/> Remarque: cela peut prendre quelques minutes.",
"Maintenance_InitCheck": "Vérification initiale",
"Maintenance_InitCheck_Checking": "Vérification...",
"Maintenance_InitCheck_QuickSetupGuide": "Assurez-vous de suivre le <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">guide de démarrage rapide</a>.",
"Maintenance_InitCheck_Success": "Application initialisée avec succès!",
"Maintenance_ReCheck": "Relancer la vérification",
"Maintenance_Running_Version": "Version installée", "Maintenance_Running_Version": "Version installée",
"Maintenance_Status": "État", "Maintenance_Status": "État",
"Maintenance_Title": "Outils de maintenance", "Maintenance_Title": "Outils de maintenance",

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

@@ -211,7 +211,7 @@
"Device_TableHead_AlertDown": "Avviso disconnessione", "Device_TableHead_AlertDown": "Avviso disconnessione",
"Device_TableHead_Connected_Devices": "Connessioni", "Device_TableHead_Connected_Devices": "Connessioni",
"Device_TableHead_CustomProps": "Proprietà/Azioni", "Device_TableHead_CustomProps": "Proprietà/Azioni",
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Preferito", "Device_TableHead_Favorite": "Preferito",
"Device_TableHead_FirstSession": "Prima sessione", "Device_TableHead_FirstSession": "Prima sessione",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
@@ -359,6 +359,11 @@
"Maint_PurgeLog": "Elimina log", "Maint_PurgeLog": "Elimina log",
"Maint_RestartServer": "Riavvia server", "Maint_RestartServer": "Riavvia server",
"Maint_Restart_Server_noti_text": "Sei sicuro di voler riavviare il server backend? Questo potrebbe causare incoerenze dell'app. Prima esegui il backup della tua configurazione. <br/> <br/> Nota: l'operazione potrebbe richiedere alcuni minuti.", "Maint_Restart_Server_noti_text": "Sei sicuro di voler riavviare il server backend? Questo potrebbe causare incoerenze dell'app. Prima esegui il backup della tua configurazione. <br/> <br/> Nota: l'operazione potrebbe richiedere alcuni minuti.",
"Maintenance_InitCheck": "Controllo iniziale",
"Maintenance_InitCheck_Checking": "Controllo in corso...",
"Maintenance_InitCheck_QuickSetupGuide": "Assicurati di aver seguito la <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">guida di configurazione rapida</a>.",
"Maintenance_InitCheck_Success": "Applicazione inizializzata con successo!",
"Maintenance_ReCheck": "Riprova controllo",
"Maintenance_Running_Version": "Versione installata", "Maintenance_Running_Version": "Versione installata",
"Maintenance_Status": "Stato", "Maintenance_Status": "Stato",
"Maintenance_Title": "Strumenti di manutenzione", "Maintenance_Title": "Strumenti di manutenzione",
@@ -560,8 +565,8 @@
"Presence_Shortcut_Favorites": "Preferiti", "Presence_Shortcut_Favorites": "Preferiti",
"Presence_Shortcut_NewDevices": "Nuovi dispositivi", "Presence_Shortcut_NewDevices": "Nuovi dispositivi",
"Presence_Title": "Presenza per dispositivo", "Presence_Title": "Presenza per dispositivo",
"REFRESH_FQDN_description": "", "REFRESH_FQDN_description": "Esegue nuovamente la scansione di tutti i dispositivi e aggiorna il loro nome di dominio completo (FQDN). Se disabilitato, vengono scansionati solo i dispositivi senza nome noto per migliorare le prestazioni. In questo caso, l'FQDN viene aggiornato solo durante la rilevazione iniziale del dispositivo.",
"REFRESH_FQDN_name": "", "REFRESH_FQDN_name": "Aggiorna FQDN",
"REPORT_DASHBOARD_URL_description": "Questo URL viene utilizzato come base per generare collegamenti nei report HTML (ad esempio: e-mail). Inserisci l'URL completo che inizia con <code>http://</code> incluso il numero di porta (nessuna barra finale <code>/</code>).", "REPORT_DASHBOARD_URL_description": "Questo URL viene utilizzato come base per generare collegamenti nei report HTML (ad esempio: e-mail). Inserisci l'URL completo che inizia con <code>http://</code> incluso il numero di porta (nessuna barra finale <code>/</code>).",
"REPORT_DASHBOARD_URL_name": "URL NetAlertX", "REPORT_DASHBOARD_URL_name": "URL NetAlertX",
"REPORT_ERROR": "La pagina che stai cercando è momentaneamente non disponibile, riprova tra qualche secondo", "REPORT_ERROR": "La pagina che stai cercando è momentaneamente non disponibile, riprova tra qualche secondo",
@@ -745,4 +750,4 @@
"settings_update_item_warning": "Aggiorna il valore qui sotto. Fai attenzione a seguire il formato precedente. <b>La convalida non viene eseguita.</b>", "settings_update_item_warning": "Aggiorna il valore qui sotto. Fai attenzione a seguire il formato precedente. <b>La convalida non viene eseguita.</b>",
"test_event_icon": "fa-vial-circle-check", "test_event_icon": "fa-vial-circle-check",
"test_event_tooltip": "Salva le modifiche prima di provare le nuove impostazioni." "test_event_tooltip": "Salva le modifiche prima di provare le nuove impostazioni."
} }

View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "", "Maint_PurgeLog": "",
"Maint_RestartServer": "", "Maint_RestartServer": "",
"Maint_Restart_Server_noti_text": "", "Maint_Restart_Server_noti_text": "",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "Installert versjon", "Maintenance_Running_Version": "Installert versjon",
"Maintenance_Status": "Status", "Maintenance_Status": "Status",
"Maintenance_Title": "Vedlikeholdsverktøy", "Maintenance_Title": "Vedlikeholdsverktøy",

View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "Wyczyść Logi", "Maint_PurgeLog": "Wyczyść Logi",
"Maint_RestartServer": "Zrestartuj serwer", "Maint_RestartServer": "Zrestartuj serwer",
"Maint_Restart_Server_noti_text": "Jesteś pewien, że chcesz zrestartować serwer backend? Może spowodować to niespujności w aplikacji. Najpierw utwórz backup konfiguracji. <br/> <br/> Uwaga: Może to zająć kilkla minut.", "Maint_Restart_Server_noti_text": "Jesteś pewien, że chcesz zrestartować serwer backend? Może spowodować to niespujności w aplikacji. Najpierw utwórz backup konfiguracji. <br/> <br/> Uwaga: Może to zająć kilkla minut.",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "Zainstalowana wersja", "Maintenance_Running_Version": "Zainstalowana wersja",
"Maintenance_Status": "Status", "Maintenance_Status": "Status",
"Maintenance_Title": "Narzędzia konserwacyjne", "Maintenance_Title": "Narzędzia konserwacyjne",

View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "Limpar o registo", "Maint_PurgeLog": "Limpar o registo",
"Maint_RestartServer": "Reiniciar o servidor", "Maint_RestartServer": "Reiniciar o servidor",
"Maint_Restart_Server_noti_text": "Tem certeza de que deseja reiniciar o servidor backend? Isso pode causar inconsistência no aplicativo. Faça backup da sua configuração primeiro. <br/> <br/> Nota: Isso pode levar alguns minutos.", "Maint_Restart_Server_noti_text": "Tem certeza de que deseja reiniciar o servidor backend? Isso pode causar inconsistência no aplicativo. Faça backup da sua configuração primeiro. <br/> <br/> Nota: Isso pode levar alguns minutos.",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "Versão instalada", "Maintenance_Running_Version": "Versão instalada",
"Maintenance_Status": "Situação", "Maintenance_Status": "Situação",
"Maintenance_Title": "Ferramentas de manutenção", "Maintenance_Title": "Ferramentas de manutenção",

View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "Очистить журнал", "Maint_PurgeLog": "Очистить журнал",
"Maint_RestartServer": "Перезапустить сервер", "Maint_RestartServer": "Перезапустить сервер",
"Maint_Restart_Server_noti_text": "Вы уверены, что хотите перезапустить внутренний сервер? Это может привести к несогласованности работы приложения. Сначала создайте резервную копию настроек. <br/> <br/> Примечание: Это может занять несколько минут.", "Maint_Restart_Server_noti_text": "Вы уверены, что хотите перезапустить внутренний сервер? Это может привести к несогласованности работы приложения. Сначала создайте резервную копию настроек. <br/> <br/> Примечание: Это может занять несколько минут.",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "Установленная версия", "Maintenance_Running_Version": "Установленная версия",
"Maintenance_Status": "Статус", "Maintenance_Status": "Статус",
"Maintenance_Title": "Инструменты обслуживания", "Maintenance_Title": "Инструменты обслуживания",

View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "Kayıtları Sil", "Maint_PurgeLog": "Kayıtları Sil",
"Maint_RestartServer": "Sunucuyu Yeniden Başlat", "Maint_RestartServer": "Sunucuyu Yeniden Başlat",
"Maint_Restart_Server_noti_text": "Arka uç sunucusunu yeniden başlatmak istediğinizden emin misiniz? Bu, uygulama tutarsızlıklarına yol açabilir. Önce yapılandırmanızı yedekleyin. <br/> <br/> Not: Bu işlem birkaç dakika sürebilir.", "Maint_Restart_Server_noti_text": "Arka uç sunucusunu yeniden başlatmak istediğinizden emin misiniz? Bu, uygulama tutarsızlıklarına yol açabilir. Önce yapılandırmanızı yedekleyin. <br/> <br/> Not: Bu işlem birkaç dakika sürebilir.",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "Yüklenmiş sürüm", "Maintenance_Running_Version": "Yüklenmiş sürüm",
"Maintenance_Status": "Durum", "Maintenance_Status": "Durum",
"Maintenance_Title": "Bakım Araçları", "Maintenance_Title": "Bakım Araçları",

5
front/php/templates/language/uk_ua.json Normal file → Executable file
View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "Журнал очищення", "Maint_PurgeLog": "Журнал очищення",
"Maint_RestartServer": "Перезапустіть сервер", "Maint_RestartServer": "Перезапустіть сервер",
"Maint_Restart_Server_noti_text": "Ви впевнені, що бажаєте перезапустити внутрішній сервер? Це може спричинити неузгодженість програми. Спершу створіть резервну копію налаштувань. <br/> <br/> Примітка. Це може зайняти кілька хвилин.", "Maint_Restart_Server_noti_text": "Ви впевнені, що бажаєте перезапустити внутрішній сервер? Це може спричинити неузгодженість програми. Спершу створіть резервну копію налаштувань. <br/> <br/> Примітка. Це може зайняти кілька хвилин.",
"Maintenance_InitCheck": "Перевірка ініціалізації",
"Maintenance_InitCheck_Checking": "Перевірка...",
"Maintenance_InitCheck_QuickSetupGuide": "Переконайтеся, що ви дотримувалися інструкцій у <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">короткому посібнику з налаштування</a>.",
"Maintenance_InitCheck_Success": "Застосунок успішно ініціалізовано!",
"Maintenance_ReCheck": "Повторна спроба перевірки",
"Maintenance_Running_Version": "Встановлена версія", "Maintenance_Running_Version": "Встановлена версія",
"Maintenance_Status": "Статус", "Maintenance_Status": "Статус",
"Maintenance_Title": "Інструменти обслуговування", "Maintenance_Title": "Інструменти обслуговування",

View File

@@ -359,6 +359,11 @@
"Maint_PurgeLog": "清除日志", "Maint_PurgeLog": "清除日志",
"Maint_RestartServer": "重启服务器", "Maint_RestartServer": "重启服务器",
"Maint_Restart_Server_noti_text": "您确定要重新启动后端服务器吗?这可能会导致应用程序不一致。请先备份您的设置。<br/> <br/> 注意:这可能需要几分钟。", "Maint_Restart_Server_noti_text": "您确定要重新启动后端服务器吗?这可能会导致应用程序不一致。请先备份您的设置。<br/> <br/> 注意:这可能需要几分钟。",
"Maintenance_InitCheck": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"Maintenance_Running_Version": "安装版本", "Maintenance_Running_Version": "安装版本",
"Maintenance_Status": "状态", "Maintenance_Status": "状态",
"Maintenance_Title": "维护工具", "Maintenance_Title": "维护工具",

View File

@@ -195,7 +195,7 @@
} }
] ]
}, },
"default_value": "0 2 * * 3", "default_value": "0 2 * * *",
"options": [], "options": [],
"localized": [ "localized": [
"name", "name",
@@ -297,7 +297,7 @@
} }
] ]
}, },
"default_value": false, "default_value": true,
"options": [], "options": [],
"localized": [ "localized": [
"name", "name",

View File

@@ -354,7 +354,7 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX
enabledHtml = ` enabledHtml = `
<div class="enabled-disabled-icon"> <div class="enabled-disabled-icon">
<i class="fa-regular fa-${onOff}"></i> <i class="fa fa-${onOff}"></i>
</div> </div>
` `
} }
@@ -365,7 +365,7 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX
let pluginHtml = ` let pluginHtml = `
<div class="row table_row docs"> <div class="row table_row docs">
<div class="table_cell bold"> <div class="table_cell bold">
<i class="fa-regular fa-book fa-sm"></i> <i class="fa fa-book fa-sm"></i>
${getString(prefix+'_description')} ${getString(prefix+'_description')}
<a href="https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/${getPluginCodeName(pluginsData, prefix)}" target="_blank"> <a href="https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/${getPluginCodeName(pluginsData, prefix)}" target="_blank">
${getString('Gen_ReadDocs')} ${getString('Gen_ReadDocs')}

View File

@@ -12,7 +12,7 @@ require 'php/templates/header.php';
<div id="notifications" class="content-wrapper"> <div id="notifications" class="content-wrapper">
<section class="content"> <section class="content">
<div class="box box-gray col-xs-12" > <div class="notification-box box box-gray col-xs-12" >
<div class="box-header"> <div class="box-header">
<h3 class="box-title text-aqua"><?= lang('Notifications_All');?></h3> <h3 class="box-title text-aqua"><?= lang('Notifications_All');?></h3>
</div> </div>
@@ -33,9 +33,10 @@ require 'php/templates/header.php';
</tbody> </tbody>
</table> </table>
<div class="notification-buttons">
<button id="clearNotificationsBtn" class="btn btn-danger"><?= lang("Gen_DeleteAll");?></button> <button id="clearNotificationsBtn" class="btn btn-danger"><?= lang("Gen_DeleteAll");?></button>
<button id="notificationsMarkAllRead" class="btn btn-default"><?= lang("Notifications_Mark_All_Read");?></button> <button id="notificationsMarkAllRead" class="btn btn-default"><?= lang("Notifications_Mark_All_Read");?></button>
</div>
</div> </div>
</div> </div>

View File

@@ -39,7 +39,7 @@
let workflows = []; let workflows = [];
let fieldOptions = [ let fieldOptions = [
"devName", "devOwner", "devType", "devVendor", "devFavorite", "devName", "devMac", "devOwner", "devType", "devVendor", "devFavorite",
"devGroup", "devComments", "devFirstConnection", "devLastConnection", "devGroup", "devComments", "devFirstConnection", "devLastConnection",
"devLastIP", "devStaticIP", "devScan", "devLogEvents", "devAlertEvents", "devLastIP", "devStaticIP", "devScan", "devLogEvents", "devAlertEvents",
"devAlertDown", "devSkipRepeated", "devLastNotification", "devPresentLastScan", "devAlertDown", "devSkipRepeated", "devLastNotification", "devPresentLastScan",
@@ -144,7 +144,7 @@ function generateWorkflowUI(wf, wfIndex) {
) )
let $wfEnabledIcon = $("<i>", { let $wfEnabledIcon = $("<i>", {
class: `alignRight fa-regular ${wfEnabled ? "fa-dot-circle" : "fa-circle" }` class: `alignRight fa ${wfEnabled ? "fa-dot-circle" : "fa-circle" }`
}); });

View File

@@ -33,6 +33,7 @@ from initialise import importConfigs
from database import DB from database import DB
from messaging.reporting import get_notifications from messaging.reporting import get_notifications
from models.notification_instance import NotificationInstance from models.notification_instance import NotificationInstance
from models.user_events_queue_instance import UserEventsQueueInstance
from plugin import plugin_manager from plugin import plugin_manager
from scan.device_handling import update_devices_names from scan.device_handling import update_devices_names
from workflows.manager import WorkflowManager from workflows.manager import WorkflowManager
@@ -221,6 +222,15 @@ def main ():
updateState("Workflows: End") updateState("Workflows: End")
# check if devices list needs updating
userUpdatedDevices = UserEventsQueueInstance().has_update_devices()
mylog('debug', [f'[Plugins] Should I update API (userUpdatedDevices): {userUpdatedDevices}'])
if userUpdatedDevices:
update_api(db, all_plugins, True, ["devices"], userUpdatedDevices)
#loop #loop
time.sleep(5) # wait for N seconds time.sleep(5) # wait for N seconds

View File

@@ -562,7 +562,10 @@ def execute_plugin(db, all_plugins, plugin ):
endpoints = ["plugins_events","plugins_objects", "plugins_history", "appevents"] endpoints = ["plugins_events","plugins_objects", "plugins_history", "appevents"]
# check if we need to update devices api endpoint as well to prevent long user waits on Loading... # check if we need to update devices api endpoint as well to prevent long user waits on Loading...
userUpdatedDevices = UserEventsQueueInstance().has_update_devices userUpdatedDevices = UserEventsQueueInstance().has_update_devices()
mylog('verbose', [f'[Plugins] Should I update API (userUpdatedDevices): {userUpdatedDevices}'])
if userUpdatedDevices: if userUpdatedDevices:
endpoints += ["devices"] endpoints += ["devices"]