ntfy disable cert #1117, initial nics work #724

This commit is contained in:
jokob-sk
2025-07-12 15:40:08 +10:00
parent 7980554924
commit 6f536f9952
35 changed files with 539 additions and 78 deletions

View File

@@ -39,6 +39,8 @@
| `devSourcePlugin` | Source plugin that discovered the device. | `ARPSCAN` |
| `devCustomProps` | [Custom properties](./CUSTOM_PROPERTIES.md) related to the device. The value is a base64-encoded JSON object. | `PHN2ZyB...` |
| `devFQDN` | Fully qualified domain name. | `raspberrypi.local` |
| `devParentRelType` | The type of relationship between the current device and it's parent node. By default, selecting `nic` will hide it from lists. | `nic` |
| `devReqNicsOnline` | If all NICs are required to be online to mark teh current device online. | `0` |
To understand how values of these fields influuence application behavior, such as Notifications or Network topology, see also:

View File

@@ -1,14 +1,14 @@
# 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).
> 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. Alternatively, 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:
- Manual: Direct commands to stop, remove, and rebuild containers.
- Dockcheck: Semi-automated with more control, suited for bulk updates.
- Watchtower: Fully automated, runs continuously to check and update containers.
- Portainer: Setup depending, mostly manual with UI.
- Portainer: Manual with UI.
You can choose any approach that fits your workflow.
@@ -122,13 +122,10 @@ This assumes you're using Portainer to manage Docker (or Docker Swarm) and want
2. Go to **"Containers"** in the left sidebar.
3. Find the container you want to update, click its name.
4. Click **"Recreate"** (top right).
5. **Tick**:
* **Pull latest image** (this ensures Portainer fetches the newest version from Docker Hub or your registry).
5. **Tick**: _Pull latest image_ (this ensures Portainer fetches the newest version from Docker Hub or your registry).
6. Click **"Recreate"** again.
7. Wait for the container to be stopped, removed, and recreated with the updated image.
---
### 4.2 For Docker Swarm Services
If you're using Docker Swarm (under **"Stacks"** or **"Services"**):
@@ -137,14 +134,16 @@ If you're using Docker Swarm (under **"Stacks"** or **"Services"**):
2. Select the stack managing the container.
3. Click **"Editor"** (or "Update the Stack").
4. Add a version tag or use `:latest` if your image tag is `latest` (not recommended for production).
5. Click **"Update the Stack"**.
> ⚠ Portainer will not pull the new image unless the tag changes OR the stack is forced to recreate.
5. Click **"Update the Stack"**. ⚠ Portainer will not pull the new image unless the tag changes OR the stack is forced to recreate.
6. If image tag hasn't changed, go to **"Services"**, find the service, and click **"Force Update"**.
## Summary
- Manual: Ideal for individual or critical updates.
- Dockcheck: Suitable for controlled, mass updates.
- Watchtower: Fully automated, best for continuous deployment setups.
| Method | Type | Pros | Cons |
|------------|--------------|----------------------------------|------------------------------|
| Manual | CLI | Full control, no dependencies | Tedious for many containers |
| Dockcheck | CLI Script | Great for batch updates | Needs setup, semi-automated |
| Watchtower | Daemonized | Fully automated updates | Less control, version drift |
| Portainer | UI | Easy via web interface | No auto-updates |
These approaches allow you to maintain flexibility in how you update Docker containers, depending on the urgency and scale of the update.

View File

@@ -1399,7 +1399,8 @@ input[readonly] {
cursor: -webkit-grab;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice
#settingsPage .select2-container--default .select2-selection--multiple .select2-selection__choice,
#maintenancePage .select2-container--default .select2-selection--multiple .select2-selection__choice
{
background-color:#258744 !important;
}
@@ -1413,6 +1414,12 @@ input[readonly] {
background-color:#606060 !important;
}
.select2-container--default .select2-selection--multiple
{
border-radius: 0px !important;
border-color: #3d444b !important;
}
.helpIconSmallTopRight{
position: absolute;
font-size: x-small;
@@ -1539,6 +1546,44 @@ input[readonly] {
display: none;
}
#deviceDetailsEdit .select2-container--default .select2-selection--multiple .select2-selection__choice
{
height: 30px;
background-color: #606060;
}
#deviceDetailsEdit .select2-container--default .select2-selection--multiple .select2-selection__choice span
{
font-size: 15px;
}
#deviceDetailsEdit .select2-selection
{
width: initial;
display: inline-block;
}
#deviceDetailsEdit .form-control
{
min-height: 42px;
}
#deviceDetailsEdit .select2-selection
{
background-color: rgb(96, 96, 96);
}
#deviceDetailsEdit .select2-container
{
width: 100% !important;
}
#deviceDetailsEdit .select2-container .selection
{
width: 100% !important;
display: inline-grid;
}
/* ----------------------------------------------------------------- */
/* MODAL popups */
/* ----------------------------------------------------------------- */

View File

@@ -5,7 +5,7 @@
?>
<div class="row">
<div class="row" id="deviceDetailsEdit">
<div class="box-body form-horizontal">
<form id="edit-form">
<!-- Form fields will be appended here -->
@@ -85,7 +85,7 @@
},
// Group for event and alert settings
DevDetail_EveandAl_Title: {
data: ["devAlertEvents", "devAlertDown", "devSkipRepeated"],
data: ["devAlertEvents", "devAlertDown", "devSkipRepeated", "devReqNicsOnline"],
docs: "https://github.com/jokob-sk/NetAlertX/blob/main/docs/NOTIFICATIONS.md",
iconClass: "fa fa-bell",
inputGroupClasses: "field-group alert-group col-lg-4 col-sm-6 col-xs-12",
@@ -94,7 +94,7 @@
},
// Group for network details
DevDetail_MainInfo_Network_Title: {
data: ["devParentMAC", "devParentPort", "devSSID", "devSite", "devSyncHubNode"],
data: ["devParentMAC", "devParentRelType", "devParentPort", "devSSID", "devSite", "devSyncHubNode"],
docs: "https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md",
iconClass: "fa fa-network-wired",
inputGroupClasses: "field-group network-group col-lg-4 col-sm-6 col-xs-12",
@@ -119,6 +119,15 @@
labelClasses: "col-sm-4 col-xs-12 control-label",
inputClasses: "col-sm-8 col-xs-12 input-group"
},
// Group for Children.
DevDetail_Children_Title: {
data: ["devChildrenDynamic"],
docs: "https://github.com/jokob-sk/NetAlertX/blob/main/docs/CUSTOM_PROPERTIES.md",
iconClass: "fa fa-list",
inputGroupClasses: "field-group cutprop-group col-lg-12 col-sm-12 col-xs-12",
labelClasses: "col-sm-12 col-xs-12 control-label",
inputClasses: "col-sm-12 col-xs-12 input-group"
},
// Group for Custom properties.
DevDetail_CustomProperties_Title: {
data: ["devCustomProps"],
@@ -167,6 +176,7 @@
// Get the field data (replace 'NEWDEV_' prefix from the key)
fieldData = deviceData[setting.setKey.replace('NEWDEV_', '')]
fieldData = fieldData == null ? "" : fieldData;
fieldOptionsOverride = null;
// console.log(setting.setKey);
// console.log(fieldData);
@@ -208,6 +218,15 @@
</span>`;
}
// handle devChildrenDynamic - selected values and options are the same
if (setting.setKey == "NEWDEV_devChildrenDynamic" && Array.isArray(fieldData)) {
fieldDataNew = []
fieldData.forEach(child => {
fieldDataNew.push(child.devMac)
})
fieldData = fieldDataNew;
fieldOptionsOverride = fieldDataNew;
}
// Generate the input field HTML
const inputFormHtml = `<div class="form-group col-xs-12">
@@ -219,7 +238,7 @@
</i>
</label>
<div class="${obj.inputClasses}">
${generateFormHtml(settingsData, setting, fieldData.toString(), null, null)}
${generateFormHtml(settingsData, setting, fieldData.toString(), fieldOptionsOverride, null)}
${inlineControl}
</div>
</div>`;

View File

@@ -539,7 +539,9 @@ function mapColumnIndexToFieldName(index, tableColumnVisible) {
"devPresentLastScan",
"devAlertDown",
"devCustomProps",
"devFQDN"
"devFQDN",
"devParentRelType",
"devReqNicsOnline"
];
// console.log("OrderBy: " + columnNames[tableColumnOrder[index]]);
@@ -650,6 +652,8 @@ function initializeDatatable (status) {
devIpLong
devCustomProps
devFQDN
devParentRelType
devReqNicsOnline
}
count
}
@@ -725,7 +729,9 @@ function initializeDatatable (status) {
device.devPresentLastScan || "",
device.devAlertDown || "",
device.devCustomProps || "",
device.devFQDN || ""
device.devFQDN || "",
device.devParentRelType || "",
device.devReqNicsOnline || 0
];
const newRow = [];
@@ -893,25 +899,14 @@ function initializeDatatable (status) {
tmp_devPresentLastScan = rowData[mapIndx(24)]
tmp_devAlertDown = rowData[mapIndx(25)]
if (tmp_devPresentLastScan == 1)
{
css = "green text-white statusOnline"
icon = '<i class="fa-solid fa-plug"></i>'
} else if (tmp_devPresentLastScan != 1 && tmp_devAlertDown == 1)
{
css = "red text-white statusDown"
icon = '<i class="fa-solid fa-triangle-exclamation"></i>'
} else if(tmp_devPresentLastScan != 1)
{
css = "gray text-white statusOffline"
icon = '<i class="fa-solid fa-xmark"></i>'
} else
{
css = "gray text-white statusUnknown"
icon = '<i class="fa-solid fa-question"></i>'
}
const badgeHtml = getStatusBadgeHtml(
rowData[mapIndx(24)], // tmp_devPresentLastScan
rowData[mapIndx(25)], // tmp_devAlertDown
rowData[mapIndx(11)], // MAC
cellData // optional text
);
$(td).html (`<a href="deviceDetails.php?mac=${rowData[mapIndx(11)]}" class="badge bg-${css}">${icon} ${cellData.replace('-', '')}</a>`);
$(td).html (badgeHtml);
} },
],

View File

@@ -363,8 +363,6 @@ function removeAllOptions(element) {
function selectAll(element) {
settingsChanged();
// Get the <select> element with the class 'deviceSelector'
// var selectElement = $('.deviceSelector select');
var selectElement = $(`#${$(element).attr("my-input-to")}`);
// Iterate over each option within the select element
@@ -381,8 +379,6 @@ function selectAll(element) {
// UN-Select All
function unselectAll(element) {
settingsChanged();
// Get the <select> element with the class 'deviceSelector'
// var selectElement = $('.deviceSelector select');
var selectElement = $(`#${$(element).attr("my-input-to")}`);
// Iterate over each option within the select element
@@ -399,8 +395,7 @@ function unselectAll(element) {
// Trigger change to open up the dropdown filed
function selectChange(element) {
settingsChanged();
// Get the <select> element with the class 'deviceSelector'
// var selectElement = $('.deviceSelector select');
var selectElement = $(`#${$(element).attr("my-input-to")}`);
selectElement.parent().find("input").focus().click();
@@ -624,6 +619,7 @@ function generateOptionsOrSetOptions(
// console.log( setKey);
// NOTE {value} options to replace with a setting or SQL value are handled in the cacheSettings() function
// obj.push({ id: item, name: item })
options = arrayToObject(createArray(overrideOptions ? overrideOptions : getSettingOptions(setKey)))
@@ -689,6 +685,10 @@ function reverseTransformers(val, transformers) {
// retrieve string
val = getString(val);
break;
case "deviceChip":
mac = val // value is mac
val = `${getDevDataByMac(mac, "devName")}`
break;
default:
console.warn(`Unknown transformer: ${transformer}`);
}
@@ -822,6 +822,8 @@ function arrayToObject(array) {
// -----------------------------------------------------------------------------
// Processor to generate options
// options - available options
// valuesArray - values = selected options
function generateOptions(options, valuesArray, targetField, transformers, placeholder) {
var optionsHtml = "";
@@ -1007,10 +1009,12 @@ function generateFormHtml(settingsData, set, overrideValue, overrideOptions, ori
class="form-control ${addCss} ${cssClasses}"
name="${setKey}"
id="${setKey}"
my-transformers=${transformers}
my-customparams="${customParams}"
my-customid="${customId}"
my-originalSetKey="${originalSetKey}"
${multi}>
${multi}
${readOnly ? "disabled" : ""}>
<option value="" id="${setKey + "_temp_"}"></option>
</select>`;

View File

@@ -128,9 +128,6 @@ function getRandomBytes(elem, length) {
targetElement.val(formattedHex);
}
// ----------------------------------------------
// Updates the icon preview
function updateAllIconPreviews() {
@@ -574,19 +571,9 @@ function showIconSelection() {
}
// "Device_TableHead_Owner",
// "Device_TableHead_Type",
// "Device_TableHead_Group",
// "Device_TableHead_Status",
// "Device_TableHead_Location",
// "Device_TableHead_Vendor",
// "Device_TableHead_SyncHubNodeName",
// "Device_TableHead_NetworkSite",
// "Device_TableHead_SSID",
// "Device_TableHead_SourcePlugin"
// -----------------------------------------------------------------------------
// Get teh correct db column code name based on table header title string
// Get the correct db column code name based on table header title string
function getColumnNameFromLangString(headStringKey) {
columnNameMap = {
"Device_TableHead_Name": "devName",
@@ -621,6 +608,28 @@ function getColumnNameFromLangString(headStringKey) {
return columnNameMap[headStringKey] || "";
}
// Generating the device status chip
function getStatusBadgeHtml(tmp_devPresentLastScan, tmp_devAlertDown, macAddress, statusText = '') {
let css = 'gray text-white statusUnknown';
let icon = '<i class="fa-solid fa-question"></i>';
if (tmp_devPresentLastScan == 1) {
css = 'green text-white statusOnline';
icon = '<i class="fa-solid fa-plug"></i>';
} else if (tmp_devAlertDown == 1) {
css = 'red text-white statusDown';
icon = '<i class="fa-solid fa-triangle-exclamation"></i>';
} else if (tmp_devPresentLastScan != 1) {
css = 'gray text-white statusOffline';
icon = '<i class="fa-solid fa-xmark"></i>';
}
// Remove dashes from statusText
const cleanedText = statusText.replace(/-/g, '');
return `<a href="deviceDetails.php?mac=${macAddress}" class="badge bg-${css}">${icon} ${cleanedText}</a>`;
}
// -----------------------------------------------------------------------------
// initialize
@@ -636,7 +645,6 @@ function initSelect2() {
{
// prepare HTML DOM before initializing the frotend
initDeviceSelectors(devicesListAll_JSON)
// --------------------------------------------------------
//Initialize Select2 Elements and make them sortable
@@ -644,7 +652,46 @@ function initSelect2() {
$(function () {
// Iterate over each Select2 dropdown
$('.select2').each(function() {
var selectEl = $(this).select2();
if($(this).attr("my-transformers") == "deviceChip")
{
var selectEl = $(this).select2({
templateSelection: function (data, container) {
if (!data.id) return data.text; // default for placeholder etc.
// Custom HTML
const html = $(`
<span class="custom-chip">
<span class="iconPreview">${atob(getDevDataByMac(data.id, "devIcon"))}</span>
${data.text}
<span>
${getStatusBadgeHtml(
getDevDataByMac(data.id, "devPresentLastScan"),
getDevDataByMac(data.id, "devAlertDown"),
data.id
)}
</span
</span>
`);
// Attach click listener (you can also use event delegation outside)
html.find('.chip-btn').on('click', function (e) {
// e.stopPropagation(); // prevent dropdown toggle
alert('Button clicked for ID: ' + data.id);
});
return html;
},
escapeMarkup: function (m) {
return m; // Allow HTML
}
});
} else
{
var selectEl = $(this).select2();
}
// Apply sortable functionality to the dropdown's dropdown-container
selectEl.next().children().children().children().sortable({
@@ -671,7 +718,7 @@ function initSelect2() {
{
setTimeout(() => {
initSelect2()
}, 1000);
}, 500);
}
}
@@ -681,7 +728,7 @@ window.addEventListener("load", function() {
setTimeout(() => {
initSelect2()
// initializeiCheck();
}, 1000);
}, 500);
});

View File

@@ -113,7 +113,9 @@ function getServerDeviceData() {
"devEvents" => 0,
"devDownAlerts" => 0,
"devPresenceHours" => 0,
"devFQDN" => ""
"devFQDN" => "",
"devParentRelType" => "default",
"devReqNicsOnline" => 0
];
echo json_encode($deviceData);
return;
@@ -139,6 +141,19 @@ function getServerDeviceData() {
$deviceData['devIsRandomMAC'] = isRandomMAC($mac);
// devChildrenDynamic
$sql = 'SELECT rowid, * FROM Devices WHERE devParentMAC = "' . $mac . '"';
$result = $db->query($sql);
$children = [];
if ($result) {
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$children[] = $row;
}
}
$deviceData['devChildrenDynamic'] = $children;
// Count Totals
$condition = ' WHERE eve_MAC="'. $mac .'" AND eve_DateTime >= '. $periodDate;

View File

@@ -587,7 +587,9 @@ function getDevicesColumns(){
"devSSID",
"devSourcePlugin",
"devCustomProps",
"devFQDN"
"devFQDN",
"devParentRelType",
"devReqNicsOnline"
];
return $columns;

View File

@@ -297,6 +297,9 @@
<li>
<a href="devices.php#archived" onclick="forceLoadUrl('devices.php#archived')" > <?= lang("Device_Shortcut_Archived");?> </a>
</li>
<li>
<a href="devices.php#all" onclick="forceLoadUrl('devices.php#all_nodes')" > <?= lang("Device_Shortcut_AllNodes");?> </a>
</li>
</ul>
</li>

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "مدة الاحتفاظ بالأحداث",
"DISCOVER_PLUGINS_description": "اكتشاف المكونات الإضافية المتاحة",
"DISCOVER_PLUGINS_name": "اكتشاف المكونات الإضافية",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "نسخ التفاصيل من الجهاز",
"DevDetail_Copy_Device_Tooltip": "انسخ تفاصيل الجهاز من القائمة المنسدلة. سيتم استبدال كل ما في هذه الصفحة.",
"DevDetail_CustomProperties_Title": "الخصائص المخصصة",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "النوع",
"DevDetail_MainInfo_Vendor": "المصنع",
"DevDetail_MainInfo_mac": "عنوان MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "انقر للذهاب إلى عقدة الشبكة",
"DevDetail_Network_Port_hover": "منفذ الشبكة",
"DevDetail_Nmap_Scans": "عمليات فحص Nmap",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "تعديل الأجهزة المحددة",
"Device_Searchbox": "بحث",
"Device_Shortcut_AllDevices": "جميع الأجهزة",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "مؤرشف",
"Device_Shortcut_Connected": "متصل",
"Device_Shortcut_Devices": "الأجهزة",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "الاسم",
"Device_TableHead_NetworkSite": "موقع الشبكة",
"Device_TableHead_Owner": "المالك",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "عنوان MAC الأصل",
"Device_TableHead_Port": "المنفذ",
"Device_TableHead_PresentLastScan": "موجود في آخر فحص",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "معرف الصف",
"Device_TableHead_Rowid": "معرف الصف",
"Device_TableHead_SSID": "معرف الشبكة اللاسلكية",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Esborrar esdeveniments més vells de",
"DISCOVER_PLUGINS_description": "Desactiva aquesta opció per accelerar la inicialització i l'estalvi de configuració. Quan està desactivat, els connectors no es descobreixen, i no podeu afegir nous connectors a la configuració <code>LOADED_PLUGINS</code>.",
"DISCOVER_PLUGINS_name": "Descobreix els plugins",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copiar detalls des del dispositiu",
"DevDetail_Copy_Device_Tooltip": "Copiar detalls del dispositius des de la llista desplegable. Tot el d'aquesta pàgina es sobre-escriurà",
"DevDetail_CustomProperties_Title": "Propietats personalitzades",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "Tipus",
"DevDetail_MainInfo_Vendor": "Venedor",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "Seleccioneu el dispositiu de xarxa al qual aquest dispositiu està connectat, per poder omplir l'arbre de xarxa.",
"DevDetail_Network_Port_hover": "El port on el dispositiu està connectat al dispositiu de xarxa del pare. Si es deixa buit, sortirà una icona wifi a la representació de la Xarxa.",
"DevDetail_Nmap_Scans": "Escaneig manual Nmap",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "Atenció. Si feu clic a això s'aplicarà el valor de l'esquerra a tots els dispositius seleccionats a dalt.",
"Device_Searchbox": "Cerca",
"Device_Shortcut_AllDevices": "Els meus dispositius",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "Arxivat",
"Device_Shortcut_Connected": "Connectat",
"Device_Shortcut_Devices": "Dispositius",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "Nom",
"Device_TableHead_NetworkSite": "Network Site",
"Device_TableHead_Owner": "Propietari",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "Node pare de xarxa",
"Device_TableHead_Port": "Port",
"Device_TableHead_PresentLastScan": "Presència",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "ID de fila",
"Device_TableHead_Rowid": "ID de fila",
"Device_TableHead_SSID": "SSID",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "",
"DISCOVER_PLUGINS_description": "",
"DISCOVER_PLUGINS_name": "",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "",
"DevDetail_Copy_Device_Tooltip": "",
"DevDetail_CustomProperties_Title": "",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "",
"DevDetail_MainInfo_Vendor": "",
"DevDetail_MainInfo_mac": "",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "",
"DevDetail_Network_Port_hover": "",
"DevDetail_Nmap_Scans": "",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "",
"Device_Searchbox": "",
"Device_Shortcut_AllDevices": "",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "",
"Device_Shortcut_Connected": "",
"Device_Shortcut_Devices": "",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "",
"Device_TableHead_NetworkSite": "",
"Device_TableHead_Owner": "",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "",
"Device_TableHead_Port": "",
"Device_TableHead_PresentLastScan": "",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "",
"Device_TableHead_Rowid": "",
"Device_TableHead_SSID": "",

View File

@@ -78,6 +78,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Ereignisse löschen, die älter sind als",
"DISCOVER_PLUGINS_description": "Deaktiviere diese Option, um Initialisierung und Speichern der Einstellungen zu beschleunigen. Wenn es deaktiviert ist, werden keine neuen Plugins gefunden und es können keine manuell hinzugefügt werden.",
"DISCOVER_PLUGINS_name": "Entdecke Erweiterungen",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "Details von Gerät kopieren",
"DevDetail_Copy_Device_Tooltip": "Details vom Gerät aus der Dropdown-Liste kopieren. Alles auf dieser Seite wird überschrieben",
"DevDetail_CustomProperties_Title": "Benutzerdefinierte Eigenschaften",
@@ -114,6 +115,7 @@
"DevDetail_MainInfo_Type": "Typ",
"DevDetail_MainInfo_Vendor": "Hersteller",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "Wählen Sie das Elternnetzgerät aus, an das das aktuelle Gerät angeschlossen ist, um den Netzwerkbaum zu erstellen.",
"DevDetail_Network_Port_hover": "Der Port, mit dem dieses Gerät am übergeordneten Netzwerkgerät verbunden ist. Bleibt er leer, wird ein WLAN-Symbol in der Netzwerkstruktur angezeigt.",
"DevDetail_Nmap_Scans": "Nmap Scans",
@@ -212,6 +214,7 @@
"Device_MultiEdit_Tooltip": "Achtung! Beim Drücken werden alle Werte auf die oben ausgewählten Geräte übertragen.",
"Device_Searchbox": "Suche",
"Device_Shortcut_AllDevices": "Meine Geräte",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "Archiviert",
"Device_Shortcut_Connected": "Verbunden",
"Device_Shortcut_Devices": "Geräte",
@@ -238,9 +241,11 @@
"Device_TableHead_Name": "Name",
"Device_TableHead_NetworkSite": "Netzwerkseite",
"Device_TableHead_Owner": "Eigentümer",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "Übergeordneter Netzwerkknoten",
"Device_TableHead_Port": "Port",
"Device_TableHead_PresentLastScan": "Anwesenheit",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "Zeilen ID",
"Device_TableHead_Rowid": "Zeilennummer",
"Device_TableHead_SSID": "SSID",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Delete events older than",
"DISCOVER_PLUGINS_description": "Disable this option to speed up initialization and settings saving. When disabled, plugins are not discovered, and you cannot add new plugins to the <code>LOADED_PLUGINS</code> setting.",
"DISCOVER_PLUGINS_name": "Discover plugins",
"DevDetail_Children_Title": "Children Relationships",
"DevDetail_Copy_Device_Title": "Copy details from device",
"DevDetail_Copy_Device_Tooltip": "Copy details from device from the dropdown list. Everything on this page will be overwritten",
"DevDetail_CustomProperties_Title": "Custom Properties",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "Type",
"DevDetail_MainInfo_Vendor": "Vendor",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "Open children node",
"DevDetail_Network_Node_hover": "Select the parent network device the current device is connected to, to populate the Network tree.",
"DevDetail_Network_Port_hover": "The port this device is connected to on the parent network device. If left empty a wifi icon is displayed in the Network tree.",
"DevDetail_Nmap_Scans": "Manual Nmap Scans",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "Careful. Clicking this will apply the value on the left to all devices selected above.",
"Device_Searchbox": "Search",
"Device_Shortcut_AllDevices": "My Devices",
"Device_Shortcut_AllNodes": "All Nodes",
"Device_Shortcut_Archived": "Archived",
"Device_Shortcut_Connected": "Connected",
"Device_Shortcut_Devices": "Devices",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "Name",
"Device_TableHead_NetworkSite": "Network Site",
"Device_TableHead_Owner": "Owner",
"Device_TableHead_ParentRelType": "Relationship Type",
"Device_TableHead_Parent_MAC": "Parent network node",
"Device_TableHead_Port": "Port",
"Device_TableHead_PresentLastScan": "Presence",
"Device_TableHead_ReqNicsOnline": "Require NICs Online",
"Device_TableHead_RowID": "Row ID",
"Device_TableHead_Rowid": "Row ID",
"Device_TableHead_SSID": "SSID",

View File

@@ -76,6 +76,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Eliminar eventos anteriores a",
"DISCOVER_PLUGINS_description": "Desactive esta opción para acelerar la inicialización y el ahorro de ajustes. Cuando está desactivado, los plugins no se descubren y no puede añadir nuevos plugins a la configuración <code>LOADED_PLUGINS</code>.",
"DISCOVER_PLUGINS_name": "Descubrir plugins",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "Copiar detalles del dispositivo",
"DevDetail_Copy_Device_Tooltip": "Copiar detalles del dispositivo de la lista desplegable. Todo en esta página se sobrescribirá",
"DevDetail_CustomProperties_Title": "Propiedades personalizadas",
@@ -112,6 +113,7 @@
"DevDetail_MainInfo_Type": "Tipo",
"DevDetail_MainInfo_Vendor": "Proveedor",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "Seleccione el dispositivo de red principal al que está conectado el dispositivo actual para completar el árbol de Red.",
"DevDetail_Network_Port_hover": "El puerto al que está conectado este dispositivo en el dispositivo de red principal. Si se deja vacío, se muestra un icono de wifi en el árbol de Red.",
"DevDetail_Nmap_Scans": "Escaneos de Nmap",
@@ -210,6 +212,7 @@
"Device_MultiEdit_Tooltip": "Cuidado. Al hacer clic se aplicará el valor de la izquierda a todos los dispositivos seleccionados anteriormente.",
"Device_Searchbox": "Búsqueda",
"Device_Shortcut_AllDevices": "Mis dispositivos",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "Archivado(s)",
"Device_Shortcut_Connected": "Conectado(s)",
"Device_Shortcut_Devices": "Dispositivos",
@@ -236,9 +239,11 @@
"Device_TableHead_Name": "Nombre",
"Device_TableHead_NetworkSite": "Lugar de la red",
"Device_TableHead_Owner": "Propietario",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "Nodo principal de la red",
"Device_TableHead_Port": "Puerto",
"Device_TableHead_PresentLastScan": "Historial",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "ID de fila",
"Device_TableHead_Rowid": "ID de fila",
"Device_TableHead_SSID": "SSID",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Supprimer les événements plus anciens que",
"DISCOVER_PLUGINS_description": "Désactivez cette option pour accélérer le démarrage et l'enregistrement de paramètres. Quand elle est désactivée, les plugins ne sont pas découverts, et vous ne pouvez près ajouter de nouveaux plugins au paramètre <code>LOADED_PLUGINS</code>.",
"DISCOVER_PLUGINS_name": "Découvrir des plugins",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "Copier les détails de l'appareil",
"DevDetail_Copy_Device_Tooltip": "Copier les détails de l'appareil dans la liste déroulante. Tout ce qui se trouve sur cette page sera remplacé",
"DevDetail_CustomProperties_Title": "Champs personnalisés",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "Type",
"DevDetail_MainInfo_Vendor": "Fabricant",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "Sélectionner l'appareil du réseau principal auquel cet appareil est connecté afin de compléter l'arborescence du Réseau.",
"DevDetail_Network_Port_hover": "Le port auquel cet appareil est connecté sur l'appareil du réseau principal. Si vide, une icône Wifi est affichée dans l'arborescence du Réseau.",
"DevDetail_Nmap_Scans": "Scans manuels via Nmap",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "Attention. Ceci va appliquer la valeur de gauche à tous les appareils sélectionnés au-dessus.",
"Device_Searchbox": "Rechercher",
"Device_Shortcut_AllDevices": "Mes appareils",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "Archivés",
"Device_Shortcut_Connected": "Connectés",
"Device_Shortcut_Devices": "Appareils",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "Nom",
"Device_TableHead_NetworkSite": "Site Réseau",
"Device_TableHead_Owner": "Propriétaire",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "Nœud réseau principal",
"Device_TableHead_Port": "Port",
"Device_TableHead_PresentLastScan": "Présence",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "ID de colonne",
"Device_TableHead_Rowid": "ID de colonne",
"Device_TableHead_SSID": "SSID",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Elimina eventi più vecchi di",
"DISCOVER_PLUGINS_description": "Disattiva questa opzione per velocizzare l'inizializzazione e il salvataggio delle impostazioni. Quando è disattivata, i plugin non vengono scoperti e non puoi aggiungere nuovi plugin all'impostazione <code>LOADED_PLUGINS</code>.",
"DISCOVER_PLUGINS_name": "Scopri i plugin",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "Copia dettagli dal dispositivo",
"DevDetail_Copy_Device_Tooltip": "Copia i dettagli dal dispositivo dall'elenco a discesa. Tutto in questa pagina verrà sovrascritto",
"DevDetail_CustomProperties_Title": "Proprietà personalizzate",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "Tipo",
"DevDetail_MainInfo_Vendor": "Produttore",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "Seleziona il dispositivo di rete principale a cui è connesso il dispositivo corrente per popolare la struttura di rete.",
"DevDetail_Network_Port_hover": "La porta a cui è connesso questo dispositivo sul dispositivo di rete principale. Se lasciato vuoto, verrà visualizzata un'icona Wi-Fi nella struttura di rete.",
"DevDetail_Nmap_Scans": "Scansioni Nmap manuali",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "Attento. Facendo clic verrà applicato il valore sulla sinistra a tutti i dispositivi selezionati sopra.",
"Device_Searchbox": "Cerca",
"Device_Shortcut_AllDevices": "Miei dispositivi",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "Archiviati",
"Device_Shortcut_Connected": "Connessi",
"Device_Shortcut_Devices": "Dispositivi",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "Nome",
"Device_TableHead_NetworkSite": "Sito di rete",
"Device_TableHead_Owner": "Proprietario",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "Nodo di rete principale",
"Device_TableHead_Port": "Porta",
"Device_TableHead_PresentLastScan": "Presenza",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "ID riga",
"Device_TableHead_Rowid": "ID riga",
"Device_TableHead_SSID": "SSID",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Slett hendelser eldre enn",
"DISCOVER_PLUGINS_description": "",
"DISCOVER_PLUGINS_name": "",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Kopier detaljer fra enhet",
"DevDetail_Copy_Device_Tooltip": "Kopier detaljer fra enheten via nedtrekks menyen. Alt på denne siden vil bli overskrevet",
"DevDetail_CustomProperties_Title": "",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "Type",
"DevDetail_MainInfo_Vendor": "Leverandør",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "Velg overordnet nettverksenhet til enheten som er tilkoblet, for å fylle nettverkstreet.",
"DevDetail_Network_Port_hover": "Porten denne enheten er koblet til på overordnet nettverksenhet. Hvis den er tom, vises et wifi-ikon i nettverkstreet i stedet.",
"DevDetail_Nmap_Scans": "Manuelle Nmap-skanninger",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "Forsiktig. Ved å klikke på denne vil verdien til venstre brukes på alle enhetene som er valgt ovenfor.",
"Device_Searchbox": "Søk",
"Device_Shortcut_AllDevices": "Mine Enheter",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "Arkivert",
"Device_Shortcut_Connected": "Tilkoblet",
"Device_Shortcut_Devices": "Enheter",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "Navn",
"Device_TableHead_NetworkSite": "",
"Device_TableHead_Owner": "Eier",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "Overordnet node MAC",
"Device_TableHead_Port": "Port",
"Device_TableHead_PresentLastScan": "",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "Rad ID",
"Device_TableHead_Rowid": "Rad ID",
"Device_TableHead_SSID": "",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Usuń wydarzenia starsze niż",
"DISCOVER_PLUGINS_description": "",
"DISCOVER_PLUGINS_name": "",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i>Kopiuj opis z urządzenia",
"DevDetail_Copy_Device_Tooltip": "Kopiuj opis z urządzenia z listy rozwijanej. Wszystko na tej stronie zostanie nadpisane",
"DevDetail_CustomProperties_Title": "",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "Typ",
"DevDetail_MainInfo_Vendor": "Dostawca",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "Wybierz sieciowe urządzenie rodzica do którego urządzenia jest aktualnie podłączone by wypełnić Drzewo Sieci.",
"DevDetail_Network_Port_hover": "Port na którym urządzenie jest podłączone do urządzenia sieciowego rodzica. Jeżeli będzie puste ikona wifi zostanie wyświetlona w Drzewku Sieci.",
"DevDetail_Nmap_Scans": "Ręczny Skan Nmap",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "Ostrożnie. Klikając to zastosują się wartości po lewej stronie do wszystkich wybranych powyżej urządzeń.",
"Device_Searchbox": "Szukaj",
"Device_Shortcut_AllDevices": "Moje Urządzenia",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "Zarchiwizowane",
"Device_Shortcut_Connected": "Połączone",
"Device_Shortcut_Devices": "Urządzenia",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "Nazwa",
"Device_TableHead_NetworkSite": "Lokalizacja sieciowa",
"Device_TableHead_Owner": "Właściciel",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "MAC rodzica węzła",
"Device_TableHead_Port": "Port",
"Device_TableHead_PresentLastScan": "",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "ID wiersza",
"Device_TableHead_Rowid": "ID wiersza",
"Device_TableHead_SSID": "SSID",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Excluir eventos mais antigos que",
"DISCOVER_PLUGINS_description": "Desative esta opção para acelerar a inicialização e a gravação de definições. Quando desativada, os plug-ins não são descobertos e não é possível adicionar novos plug-ins à definição<code>LOADED_PLUGINS</code>.",
"DISCOVER_PLUGINS_name": "Descobrir plugins",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "Copiar detalhes do dispositivo",
"DevDetail_Copy_Device_Tooltip": "Copiar detalhes do dispositivo a partir da lista pendente. Tudo o que se encontra nesta página será substituído",
"DevDetail_CustomProperties_Title": "Propriedades personalizadas",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "Tipo",
"DevDetail_MainInfo_Vendor": "Vendedor",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "Selecione o dispositivo de rede principal ao qual o dispositivo atual está conectado, para preencher a árvore Rede.",
"DevDetail_Network_Port_hover": "A porta a que este dispositivo está ligado no dispositivo de rede principal. Se for deixado vazio, é apresentado um ícone wifi na árvore Rede.",
"DevDetail_Nmap_Scans": "Varreduras manuais do Nmap",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "Cuidadoso. Clicar aqui aplicará o valor à esquerda a todos os dispositivos selecionados acima.",
"Device_Searchbox": "Procurar",
"Device_Shortcut_AllDevices": "Meus dispositivos",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "Arquivado",
"Device_Shortcut_Connected": "Conectado",
"Device_Shortcut_Devices": "Dispositivos",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "Nome",
"Device_TableHead_NetworkSite": "Site da rede",
"Device_TableHead_Owner": "Proprietário",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "Nó pai MAC",
"Device_TableHead_Port": "Porta",
"Device_TableHead_PresentLastScan": "Presente",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "ID da linha",
"Device_TableHead_Rowid": "ID da linha",
"Device_TableHead_SSID": "SSID",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Удалить события старше",
"DISCOVER_PLUGINS_description": "Отключите эту опцию, чтобы ускорить инициализацию и сохранение настроек. При отключении этой опции плагины не обнаруживаются, и вы не можете добавлять новые плагины в параметр <code>LOADED_PLUGINS</code>.",
"DISCOVER_PLUGINS_name": "Обзор плагинов",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "Скопировать данные с устройства",
"DevDetail_Copy_Device_Tooltip": "Скопируйте данные с устройства из раскрывающегося списка. Все на этой странице будет перезаписано",
"DevDetail_CustomProperties_Title": "Пользовательские свойства",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "Тип",
"DevDetail_MainInfo_Vendor": "Поставщик",
"DevDetail_MainInfo_mac": "MAC адрес",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "Выберите родительское сетевое устройство, к которому подключено текущее устройство, чтобы заполнить дерево сети.",
"DevDetail_Network_Port_hover": "Порт, к которому подключено это устройство на родительском сетевом устройстве. Если оставить пустым, в дереве сети отобразится значок Wi-Fi.",
"DevDetail_Nmap_Scans": "Ручные сканеры Nmap",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "Осторожно. При нажатии на эту кнопку значение слева будет применено ко всем устройствам, выбранным выше.",
"Device_Searchbox": "Поиск",
"Device_Shortcut_AllDevices": "Мои устройства",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "Архив",
"Device_Shortcut_Connected": "Подключенные",
"Device_Shortcut_Devices": "Устройства",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "Имя",
"Device_TableHead_NetworkSite": "Сайт устройства",
"Device_TableHead_Owner": "Владелец",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "Родительский узел сети",
"Device_TableHead_Port": "Порт",
"Device_TableHead_PresentLastScan": "Присутствие",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "ID строки",
"Device_TableHead_Rowid": "ID строки",
"Device_TableHead_SSID": "SSID",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Şu tarihten eski olayları sil",
"DISCOVER_PLUGINS_description": "Bu seçeneği devre dışı bırakmak, başlatma süresini ve ayarların kaydedilmesini hızlandırır. Devre dışı bırakıldığında, eklentiler keşfedilmez ve <code>LOADED_PLUGINS</code> ayarına yeni eklentiler eklenemez.",
"DISCOVER_PLUGINS_name": "Eklentileri keşfet",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "Cihazdan detayları kopyala",
"DevDetail_Copy_Device_Tooltip": "Aşağıdaki açılır listeden cihazın detaylarını kopyalayın. Bu sayfadaki her şey üzerine yazılacaktır",
"DevDetail_CustomProperties_Title": "Özelleştirilmiş Özellikler",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "Tür",
"DevDetail_MainInfo_Vendor": "Üretici",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "Cihazın bağlı olduğu üst ağ cihazını seçerek Ağ ağacının doldurulmasını sağlayın.",
"DevDetail_Network_Port_hover": "Bu cihazın, üst ağ cihazı üzerindeki bağlı olduğu port. Boş bırakılırsa, Ağ ağacında bir Wi-Fi simgesi görüntülenir.",
"DevDetail_Nmap_Scans": "Manuel Nmap Taramaları",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "Dikkat. Buna tıklamak, soldaki değeri yukarıda seçilen tüm cihazlara uygulayacaktır.",
"Device_Searchbox": "Arama",
"Device_Shortcut_AllDevices": "Cihazlarım",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "Arşivlenmiş",
"Device_Shortcut_Connected": "Bağlandı",
"Device_Shortcut_Devices": "Cihazlar",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "İsim",
"Device_TableHead_NetworkSite": "Ağ Alanı",
"Device_TableHead_Owner": "Kurucu",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "Üst ağ düğümü",
"Device_TableHead_Port": "Port",
"Device_TableHead_PresentLastScan": "Varlık",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "Satır ID",
"Device_TableHead_Rowid": "Satır ID",
"Device_TableHead_SSID": "SSID",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "Видалити події, старші за",
"DISCOVER_PLUGINS_description": "Вимкніть цю опцію, щоб прискорити ініціалізацію та збереження налаштувань. Якщо вимкнено, плагіни не виявляються, і ви не можете додавати нові плагіни до параметра <code>LOADED_PLUGINS</code>.",
"DISCOVER_PLUGINS_name": "Відкрийте для себе плагіни",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "Скопіюйте деталі з пристрою",
"DevDetail_Copy_Device_Tooltip": "Скопіюйте деталі пристрою зі спадного списку. Усе на цій сторінці буде перезаписано",
"DevDetail_CustomProperties_Title": "Спеціальні властивості",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "Тип",
"DevDetail_MainInfo_Vendor": "Продавець",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "Виберіть батьківський мережевий пристрій, до якого підключено поточний пристрій, щоб заповнити дерево мережі.",
"DevDetail_Network_Port_hover": "Порт, до якого підключено цей пристрій на батьківському мережевому пристрої. Якщо залишити пустим, у дереві мережі відобразиться значок Wi-Fi.",
"DevDetail_Nmap_Scans": "Сканування Nmap вручну",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "Обережно. Якщо натиснути це, значення зліва буде застосовано до всіх пристроїв, вибраних вище.",
"Device_Searchbox": "Пошук",
"Device_Shortcut_AllDevices": "Мої пристрої",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "Архівовано",
"Device_Shortcut_Connected": "Підключено",
"Device_Shortcut_Devices": "Пристрої",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "Ім'я",
"Device_TableHead_NetworkSite": "Мережевий сайт",
"Device_TableHead_Owner": "Власник",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "Узел родительской сети",
"Device_TableHead_Port": "Порт",
"Device_TableHead_PresentLastScan": "Присутність",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "ID рядка",
"Device_TableHead_Rowid": "ID рядка",
"Device_TableHead_SSID": "SSID",

View File

@@ -66,6 +66,7 @@
"DAYS_TO_KEEP_EVENTS_name": "删除早于",
"DISCOVER_PLUGINS_description": "禁用此选项可加快初始化和设置保存的速度。当禁用时,插件不会被发现,并且您无法将新插件添加到 <code>LOADED_PLUGINS</code>设置中。",
"DISCOVER_PLUGINS_name": "",
"DevDetail_Children_Title": "",
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> 从设备复制详细信息",
"DevDetail_Copy_Device_Tooltip": "从下拉列表中复制设备的详细信息。此页面上的所有内容都将被覆盖",
"DevDetail_CustomProperties_Title": "自定义属性",
@@ -102,6 +103,7 @@
"DevDetail_MainInfo_Type": "类型",
"DevDetail_MainInfo_Vendor": "制造商",
"DevDetail_MainInfo_mac": "MAC",
"DevDetail_NavToChildNode": "",
"DevDetail_Network_Node_hover": "选择当前设备连接到的父网络设备,以填充网络树。",
"DevDetail_Network_Port_hover": "此设备连接到父网络设备上的端口。如果留空,则网络树中会显示一个 wifi 图标。",
"DevDetail_Nmap_Scans": "手动 Nmap 扫描",
@@ -200,6 +202,7 @@
"Device_MultiEdit_Tooltip": "小心。 单击此按钮会将左侧的值应用到上面选择的所有设备。",
"Device_Searchbox": "搜索",
"Device_Shortcut_AllDevices": "我的设备",
"Device_Shortcut_AllNodes": "",
"Device_Shortcut_Archived": "已存档",
"Device_Shortcut_Connected": "在线设备",
"Device_Shortcut_Devices": "设备管理",
@@ -226,9 +229,11 @@
"Device_TableHead_Name": "名字",
"Device_TableHead_NetworkSite": "网络站点",
"Device_TableHead_Owner": "所有者",
"Device_TableHead_ParentRelType": "",
"Device_TableHead_Parent_MAC": "父节点",
"Device_TableHead_Port": "端口",
"Device_TableHead_PresentLastScan": "",
"Device_TableHead_ReqNicsOnline": "",
"Device_TableHead_RowID": "排行",
"Device_TableHead_Rowid": "排行",
"Device_TableHead_SSID": "SSID",

View File

@@ -527,6 +527,34 @@
"string": "All NTFY messages have a priority, which defines how urgently your phone notifies you. On Android, you can set custom notification sounds and vibration patterns on your phone to map to these priorities (see <a href=\"https://docs.ntfy.sh/subscribe/phone/\">Android config</a>)."
}
]
},
{
"function": "VERIFY_SSL",
"type": {
"dataType": "boolean",
"elements": [
{
"elementType": "input",
"elementOptions": [{ "type": "checkbox" }],
"transformers": []
}
]
},
"default_value": false,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Verify SSL"
}
],
"description": [
{
"language_code": "en_us",
"string": "Enable TLS support. Disable if you are using a self-signed certificate."
}
]
}
]
}

View File

@@ -98,6 +98,7 @@ def send(html, text):
token = get_setting_value('NTFY_TOKEN')
user = get_setting_value('NTFY_USER')
pwd = get_setting_value('NTFY_PASSWORD')
verify_ssl = get_setting_value('NTFY_VERIFY_SSL')
# prepare request headers
headers = {
@@ -121,7 +122,8 @@ def send(html, text):
response = requests.post("{}/{}".format( get_setting_value('NTFY_HOST'),
get_setting_value('NTFY_TOPIC')),
data = text,
headers = headers)
headers = headers,
verify = verify_ssl)
response_status_code = response.status_code

View File

@@ -1373,13 +1373,43 @@
"name": [
{
"language_code": "en_us",
"string": "Network Node"
"string": "Parent Node"
}
],
"description": [
{
"language_code": "en_us",
"string": "The MAC address of the network node."
"string": "The MAC address of the Parent network node."
}
]
},
{
"function": "devParentRelType",
"type": {
"dataType": "string",
"elements": [
{ "elementType": "select", "elementOptions": [], "transformers": [] }
]
},
"default_value": "default",
"options": [
"default",
"child",
"logical",
"nic",
"virtual"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Relationship Type"
}
],
"description": [
{
"language_code": "en_us",
"string": "Defines the relationship between this device and its parent. Selecting <code>nic</code> links it as a network interface, allowing the parents online status to be evaluated using its <code>devReqNicsOnline</code> (“Require NICs Online”) setting. Some relationship types may hide the device from lists; see the <code>UI_hide_rel_types</code> setting for details."
}
]
},
@@ -1404,7 +1434,7 @@
"name": [
{
"language_code": "en_us",
"string": "Network Node Port"
"string": "Parent Node Port"
}
],
"description": [
@@ -1414,6 +1444,34 @@
}
]
},
{
"function": "devChildrenDynamic",
"type": {
"dataType": "array",
"elements": [
{
"elementType": "select",
"elementOptions": [{ "multiple": "true", "ordeable": "true", "readonly": "true" }],
"transformers": ["deviceChip"]
}
]
},
"default_value": [],
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Children Nodes"
}
],
"description": [
{
"language_code": "en_us",
"string": "Children nodes assigned to this device. Navigate to the child device directly to edit the relationship and details."
}
]
},
{
"function": "devSSID",
"type": {
@@ -1665,6 +1723,41 @@
"string": "Fully Qualified Domain Name - Autodetected and Uneditable. Can be auto-refreshed by enabling the <code>REFRESH_FQDN</code> setting."
}
]
},
{
"function": "devReqNicsOnline",
"type": {
"dataType": "integer",
"elements": [
{
"elementType": "input",
"elementOptions": [
{
"type": "checkbox"
}
],
"transformers": []
}
]
},
"default_value": 0,
"options": [],
"localized": [
"name",
"description"
],
"name": [
{
"language_code": "en_us",
"string": "Require NICs Online"
}
],
"description": [
{
"language_code": "en_us",
"string": "Indicates whether this device should be considered online only if all associated NICs (devices with the <code>nic</code> relationship type) are online. If disabled, the device is considered online if any NIC is online."
}
]
}
],
"required": [],

View File

@@ -378,7 +378,9 @@
"Device_TableHead_PresentLastScan",
"Device_TableHead_AlertDown",
"Device_TableHead_CustomProps",
"Device_TableHead_FQDN"
"Device_TableHead_FQDN",
"Device_TableHead_ParentRelType",
"Device_TableHead_ReqNicsOnline"
],
"localized": ["name", "description"],
"name": [
@@ -515,6 +517,43 @@
}
]
},
{
"function": "hide_rel_types",
"type": {
"dataType": "array",
"elements": [
{
"elementType": "select",
"elementOptions": [{ "multiple": "true", "ordeable": "true" }],
"transformers": []
}
]
},
"maxLength": 50,
"default_value": [
"nic",
"virtual"
],
"options": [
"child",
"logical",
"nic",
"virtual"
],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Relationships to hide"
}
],
"description": [
{
"language_code": "en_us",
"string": "Specifies which device relationships to their parent node should be hidden from the devices lists. Devices with a matching <code>devParentRelType</code> will be excluded from most lists."
}
]
},
{
"function": "hide_empty",
"type": {

View File

@@ -44,7 +44,8 @@ let fieldOptions = [
"devLastIP", "devStaticIP", "devScan", "devLogEvents", "devAlertEvents",
"devAlertDown", "devSkipRepeated", "devLastNotification", "devPresentLastScan",
"devIsNew", "devLocation", "devIsArchived", "devParentMAC", "devParentPort",
"devIcon", "devSite", "devSSID", "devSyncHubNode", "devSourcePlugin", "devFQDN"
"devIcon", "devSite", "devSSID", "devSyncHubNode", "devSourcePlugin", "devFQDN",
"devParentRelType", "devReqNicsOnline"
];
let triggerTypes = [

View File

@@ -47,7 +47,7 @@ sql_devices_all = """
IFNULL(devAlertDown, '') AS devAlertDown,
IFNULL(devSkipRepeated, '') AS devSkipRepeated,
IFNULL(devLastNotification, '') AS devLastNotification,
IFNULL(devPresentLastScan, '') AS devPresentLastScan,
IFNULL(devPresentLastScan, 0) AS devPresentLastScan,
IFNULL(devIsNew, '') AS devIsNew,
IFNULL(devLocation, '') AS devLocation,
IFNULL(devIsArchived, '') AS devIsArchived,
@@ -61,6 +61,8 @@ sql_devices_all = """
IFNULL(devSourcePlugin, '') AS devSourcePlugin,
IFNULL(devCustomProps, '') AS devCustomProps,
IFNULL(devFQDN, '') AS devFQDN,
IFNULL(devParentRelType, '') AS devParentRelType,
IFNULL(devReqNicsOnline, '') AS devReqNicsOnline,
CASE
WHEN devIsNew = 1 THEN 'New'
WHEN devPresentLastScan = 1 THEN 'On-line'

View File

@@ -87,6 +87,14 @@ class DB():
# devFQDN
if ensure_column(self.sql, "Devices", "devFQDN", "TEXT") is False:
return # addition failed
# devParentRelType
if ensure_column(self.sql, "Devices", "devParentRelType", "TEXT") is False:
return # addition failed
# devRequireNicsOnline
if ensure_column(self.sql, "Devices", "devReqNicsOnline", "INTEGER") is False:
return # addition failed
# Settings table setup
ensure_Settings(self.sql)

View File

@@ -74,6 +74,8 @@ class Device(ObjectType):
devIpLong = Int()
devFilterStatus = String()
devFQDN = String()
devParentRelType = String()
devReqNicsOnline = Int()
class DeviceResult(ObjectType):
@@ -133,12 +135,19 @@ class Query(ObjectType):
status = options.status
mylog('verbose', f'[graphql_schema] Applying status filter: {status}')
# Example filtering based on the "status"
# Filtering based on the "status"
if status == "my_devices":
# Include devices matching criteria in UI_MY_DEVICES
allowed_statuses = get_setting_value("UI_MY_DEVICES")
hidden_relationships = get_setting_value("UI_hide_rel_types") # 🆕
mylog('verbose', f'[graphql_schema] allowed_statuses: {allowed_statuses}')
mylog('verbose', f'[graphql_schema] hidden_relationships: {hidden_relationships}')
devices_data = [
device for device in devices_data
if ( device.get("devParentRelType") not in hidden_relationships)
]
devices_data = [
device for device in devices_data
@@ -165,6 +174,8 @@ class Query(ObjectType):
devices_data = [device for device in devices_data if device["devIsArchived"] == 1]
elif status == "offline":
devices_data = [device for device in devices_data if device["devPresentLastScan"] == 0]
elif status == "all_nodes":
devices_data = devices_data # keep all
# additional filters
if options.filters:
@@ -175,13 +186,13 @@ class Query(ObjectType):
if str(device.get(filter.filterColumn, "")).lower() == str(filter.filterValue).lower()
]
# Filter data if a search term is provided
# Search data if a search term is provided
if options.search:
# Define static list of searchable fields
searchable_fields = [
"devName", "devMac", "devOwner", "devType", "devVendor", "devLastIP",
"devGroup", "devComments", "devLocation", "devStatus",
"devSSID", "devSite", "devSourcePlugin", "devSyncHubNode", "devFQDN"
"devGroup", "devComments", "devLocation", "devStatus", "devSSID",
"devSite", "devSourcePlugin", "devSyncHubNode", "devFQDN", "devParentRelType"
]
search_term = options.search.lower()

View File

@@ -214,6 +214,9 @@ def update_devices_data_from_scan (db):
if len(recordsToUpdate) > 0:
sql.executemany ("UPDATE Devices SET devVendor = ? WHERE devMac = ? ", recordsToUpdate )
# Update devPresentLastScan based on NICs presence
update_devPresentLastScan_based_on_nics(db)
# Guess ICONS
recordsToUpdate = []
@@ -396,7 +399,10 @@ def create_new_devices (db):
devComments,
devLogEvents,
devLocation,
devCustomProps"""
devCustomProps,
devParentRelType,
devReqNicsOnline
"""
newDevDefaults = f"""{get_setting_value('NEWDEV_devAlertEvents')},
{get_setting_value('NEWDEV_devAlertDown')},
@@ -411,7 +417,9 @@ def create_new_devices (db):
'{sanitize_SQL_input(get_setting_value('NEWDEV_devComments'))}',
{get_setting_value('NEWDEV_devLogEvents')},
'{sanitize_SQL_input(get_setting_value('NEWDEV_devLocation'))}',
'{sanitize_SQL_input(get_setting_value('NEWDEV_devCustomProps'))}'
'{sanitize_SQL_input(get_setting_value('NEWDEV_devCustomProps'))}',
'{sanitize_SQL_input(get_setting_value('NEWDEV_devParentRelType'))}',
{sanitize_SQL_input(get_setting_value('NEWDEV_devReqNicsOnline'))}
"""
# Fetch data from CurrentScan skipping ignored devices by IP and MAC
@@ -581,8 +589,69 @@ def update_devices_names(db):
# Commit all database changes
db.commitDB()
#-------------------------------------------------------------------------------
# Updates devPresentLastScan for parent devices based on the presence of their NICs
def update_devPresentLastScan_based_on_nics(db):
"""
Updates devPresentLastScan in the Devices table for parent devices
based on the presence of their NICs and the devReqNicsOnline setting.
Args:
db: A database object with `.execute()` and `.fetchall()` methods.
"""
sql = db.sql
# Step 1: Load all devices from the DB
devices = sql.execute("SELECT * FROM Devices").fetchall()
# Convert rows to dicts (assumes sql.row_factory = sqlite3.Row or similar)
devices = [dict(row) for row in devices]
# Build MAC -> NICs map
mac_to_nics = {}
for device in devices:
if device.get("devParentRelType") == "nic":
parent_mac = device.get("devParentMAC")
if parent_mac:
mac_to_nics.setdefault(parent_mac, []).append(device)
# Step 2: For each non-NIC device, determine new devPresentLastScan
updates = []
for device in devices:
if device.get("devParentRelType") == "nic":
continue # skip NICs
mac = device.get("devMac")
if not mac:
continue
req_all = str(device.get("devReqNicsOnline")) == "1"
nics = mac_to_nics.get(mac, [])
original = device.get("devPresentLastScan", 0)
new_present = original
if nics:
nic_statuses = [nic.get("devPresentLastScan") == 1 for nic in nics]
if req_all:
new_present = int(all(nic_statuses))
else:
new_present = int(any(nic_statuses))
# Only add update if changed
if original != new_present:
updates.append((new_present, mac))
# Step 3: Execute batch update
for present, mac in updates:
sql.execute(
"UPDATE Devices SET devPresentLastScan = ? WHERE devMac = ?",
(present, mac)
)
db.commitDB()
return len(updates)
#-------------------------------------------------------------------------------
# Check if the variable contains a valid MAC address or "Internet"

View File

@@ -87,9 +87,11 @@ def insert_devices(db_path, num_entries=1):
devSyncHubNode,
devSourcePlugin,
devCustomProps,
devFQDN
devFQDN,
devParentRelType,
devReqNicsOnline
)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
"""
# List of device types, vendors, groups, locations