This commit is contained in:
jokob-sk
2025-06-05 13:38:43 +10:00
parent 503027c06e
commit 10e8c08ce3
29 changed files with 491 additions and 79 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,99 @@
# ⚙ 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. > [!TIP]
- Preferred method: Use the **Settings UI**. > Enable additional plugins under **Settings → `LOADED_PLUGINS`**.
- If the UI is inaccessible, manually edit [`app.conf`](https://github.com/jokob-sk/NetAlertX/tree/main/back) in `/app/config/`. > Make sure to **save** your changes and **reload the page** to activate them.
> ![Loaded plugins settings](./img/PLUGINS/loaded_plugins_setting.png)
--- ---
## 🖥️ Setting Up Scanners ### 1. Configure Scanner Plugin(s)
- Define networks to scan by entering accessible subnets. **Initial configuration**: `ARPSCAN`, `INTRNT`
- Default plugin: **ARPSCAN** → Requires at least one valid subnet + interface in `SCAN_SUBNETS`.
- 📖 [Subnet & VLAN setup guide](./SUBNETS.md) (for troubleshooting and advanced scenarios).
### 🔄 PiHole Sync > [!NOTE]
- If using **PiHole**, devices can be synced automatically. > `ARPSCAN` and `INTRNT` scan the current network. You can complement them with other `🔍 dev scanner` plugins like `NMAPDEV`, or import devices using `📥 importer` plugins.
- 📖 [PiHole configuration guide](./PIHOLE_GUIDE.md). > See the [Subnet & VLAN Setup Guide](./SUBNETS.md) and [Remote Networks](./REMOTE_NETWORKS.md) for advanced configurations.
### 📦 Bulk Import
> [!NOTE]
> You can bulk-import devices via the [CSV import method](./DEVICES_BULK_EDITING.md).
--- ---
## 🌍 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: **Initial configuration**: The app auto-selects a root node (MAC `internet`) and attempts to identify other network devices by vendor or name.
- Check if a similar issue was [already resolved](https://github.com/jokob-sk/NetAlertX/issues?q=is%3Aissue+is%3Aclosed). > [!NOTE]
- Review [common debugging tips](./DEBUG_TIPS.md). > Visualize and manage your network using the [Network Guide](./NETWORK_TREE.md).
- Check [Common Issues](./COMMON_ISSUES.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
**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
**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
**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
**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

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

@@ -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;
@@ -1418,6 +1451,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)

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

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

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

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

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": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"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",

View File

@@ -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": "",
"Maintenance_InitCheck_Checking": "",
"Maintenance_InitCheck_QuickSetupGuide": "",
"Maintenance_InitCheck_Success": "",
"Maintenance_ReCheck": "",
"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",

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

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": "清除日志", "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",