feat: Add devFlapping attribute to device management and update related UI components

This commit is contained in:
Jokob @NetAlertX
2026-02-27 23:29:55 +00:00
parent 173ffbe3b2
commit b74b803d6c
29 changed files with 82 additions and 29 deletions

View File

@@ -1,6 +1,6 @@
# Device Display Settings # Device Display Settings
This set of settings allows you to group Devices under different views. The Archived toggle allows you to exclude a Device from most listings and notifications. This set of settings allows you to group Devices under different views. The Archived toggle allows you to exclude a Device from most listings and notifications.
![Display settings](./img/DEVICE_MANAGEMENT/DeviceDetails_DisplaySettings.png) ![Display settings](./img/DEVICE_MANAGEMENT/DeviceDetails_DisplaySettings.png)
@@ -12,9 +12,11 @@ This set of settings allows you to group Devices under different views. The Arch
1. 🔌 Online (Green) = A device that is no longer marked as a "New Device". 1. 🔌 Online (Green) = A device that is no longer marked as a "New Device".
2. 🔌 New (Green) = A newly discovered device that is online and is still marked as a "New Device". 2. 🔌 New (Green) = A newly discovered device that is online and is still marked as a "New Device".
3. ✖ New (Grey) = Same as No.2 but device is now offline. 3. 🔌(❕) Online (Orange) - The device is unstable and flapping (3 status changes in the last hour)
4.Offline (Grey) = A device that was not detected online in the last scan. 4.New (Grey) = Same as No.2 but device is now offline.
5. ⚠ Down (Red) = A device that has "Alert Down" marked and has been offline for the time set in the Setting `NTFPRCS_alert_down_time`. 5. ✖ Offline (Grey) = A device that was not detected online in the last scan.
6. ⚠ Down (Red) = A device that has "Alert Down" marked and has been offline for the time set in the Setting `NTFPRCS_alert_down_time`.
See also [Notification guide](./NOTIFICATIONS.md). See also [Notification guide](./NOTIFICATIONS.md).

View File

@@ -547,6 +547,7 @@ function mapColumnIndexToFieldName(index, tableColumnVisible) {
"devVlan", // 30 "devVlan", // 30
"devPrimaryIPv4", // 31 "devPrimaryIPv4", // 31
"devPrimaryIPv6", // 32 "devPrimaryIPv6", // 32
"devFlapping", // 33
]; ];
// console.log("OrderBy: " + columnNames[tableColumnOrder[index]]); // console.log("OrderBy: " + columnNames[tableColumnOrder[index]]);
@@ -666,6 +667,7 @@ function initializeDatatable (status) {
devVlan devVlan
devPrimaryIPv4 devPrimaryIPv4
devPrimaryIPv6 devPrimaryIPv6
devFlapping
} }
count count
} }
@@ -753,6 +755,7 @@ function initializeDatatable (status) {
device.devVlan || "", device.devVlan || "",
device.devPrimaryIPv4 || "", device.devPrimaryIPv4 || "",
device.devPrimaryIPv6 || "", device.devPrimaryIPv6 || "",
device.devFlapping || 0,
]; ];
const newRow = []; const newRow = [];
@@ -821,6 +824,7 @@ function initializeDatatable (status) {
data-status="${rowData[mapIndx(10)]}" data-status="${rowData[mapIndx(10)]}"
data-present="${rowData[mapIndx(24)]}" data-present="${rowData[mapIndx(24)]}"
data-alert="${rowData[mapIndx(25)]}" data-alert="${rowData[mapIndx(25)]}"
data-flapping="${rowData[mapIndx(33)]}"
data-icon="${rowData[mapIndx(3)]}"> data-icon="${rowData[mapIndx(3)]}">
${displayedValue} ${displayedValue}
</a> </a>
@@ -964,12 +968,15 @@ function initializeDatatable (status) {
tmp_devPresentLastScan = rowData[mapIndx(24)] tmp_devPresentLastScan = rowData[mapIndx(24)]
tmp_devAlertDown = rowData[mapIndx(25)] tmp_devAlertDown = rowData[mapIndx(25)]
tmp_devMac = rowData[mapIndx(11)]
tmp_devFlapping = rowData[mapIndx(33)]
const badge = getStatusBadgeParts( const badge = getStatusBadgeParts(
rowData[mapIndx(24)], // tmp_devPresentLastScan tmp_devPresentLastScan, // tmp_devPresentLastScan
rowData[mapIndx(25)], // tmp_devAlertDown tmp_devAlertDown, // tmp_devAlertDown
rowData[mapIndx(11)], // MAC tmp_devFlapping, // tmp_devFlapping
cellData // optional text tmp_devMac, // MAC
cellData // optional text
); );
$(td).html (`<a href="${badge.url}" class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.text}</a>`); $(td).html (`<a href="${badge.url}" class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.text}</a>`);

View File

@@ -23,9 +23,10 @@ function loadNetworkNodes() {
LOWER(parent.devParentMAC) AS parent_mac, LOWER(parent.devParentMAC) AS parent_mac,
parent.devIcon AS node_icon, parent.devIcon AS node_icon,
parent.devAlertDown AS node_alert, parent.devAlertDown AS node_alert,
parent.devFlapping AS node_flapping,
COUNT(child.devMac) AS node_ports_count COUNT(child.devMac) AS node_ports_count
FROM Devices AS parent FROM DevicesView AS parent
LEFT JOIN Devices AS child LEFT JOIN DevicesView AS child
/* CRITICAL FIX: COLLATE NOCASE ensures the join works /* CRITICAL FIX: COLLATE NOCASE ensures the join works
even if devParentMAC is uppercase and devMac is lowercase even if devParentMAC is uppercase and devMac is lowercase
*/ */
@@ -33,7 +34,7 @@ function loadNetworkNodes() {
WHERE parent.devType IN (${networkDeviceTypes}) WHERE parent.devType IN (${networkDeviceTypes})
AND parent.devIsArchived = 0 AND parent.devIsArchived = 0
GROUP BY parent.devMac, parent.devName, parent.devPresentLastScan, GROUP BY parent.devMac, parent.devName, parent.devPresentLastScan,
parent.devType, parent.devParentMAC, parent.devIcon, parent.devAlertDown parent.devType, parent.devParentMAC, parent.devIcon, parent.devAlertDown, parent.devFlapping
ORDER BY parent.devName; ORDER BY parent.devName;
`; `;
@@ -143,6 +144,7 @@ function loadDeviceTable({ sql, containerSelector, tableId, wrapperHtml = null,
const badge = getStatusBadgeParts( const badge = getStatusBadgeParts(
device.devPresentLastScan, device.devPresentLastScan,
device.devAlertDown, device.devAlertDown,
device.devFlapping,
device.devMac, device.devMac,
device.devStatus device.devStatus
); );
@@ -202,8 +204,8 @@ function loadDeviceTable({ sql, containerSelector, tableId, wrapperHtml = null,
*/ */
function loadUnassignedDevices() { function loadUnassignedDevices() {
const sql = ` const sql = `
SELECT devMac, devPresentLastScan, devName, devLastIP, devVendor, devAlertDown, devParentPort SELECT devMac, devPresentLastScan, devName, devLastIP, devVendor, devAlertDown, devParentPort, devFlapping, devStatus
FROM Devices FROM DevicesView
WHERE (devParentMAC IS NULL OR devParentMAC IN ("", " ", "undefined", "null")) WHERE (devParentMAC IS NULL OR devParentMAC IN ("", " ", "undefined", "null"))
AND LOWER(devMac) NOT LIKE "%internet%" AND LOWER(devMac) NOT LIKE "%internet%"
AND devIsArchived = 0 AND devIsArchived = 0
@@ -237,7 +239,7 @@ function loadConnectedDevices(node_mac) {
const normalized_mac = node_mac.toLowerCase(); const normalized_mac = node_mac.toLowerCase();
const sql = ` const sql = `
SELECT devName, devMac, devLastIP, devVendor, devPresentLastScan, devAlertDown, devParentPort, devVlan, SELECT devName, devMac, devLastIP, devVendor, devPresentLastScan, devAlertDown, devParentPort, devVlan, devFlapping,
CASE CASE
WHEN devIsNew = 1 THEN 'New' WHEN devIsNew = 1 THEN 'New'
WHEN devPresentLastScan = 1 THEN 'On-line' WHEN devPresentLastScan = 1 THEN 'On-line'
@@ -246,7 +248,7 @@ function loadConnectedDevices(node_mac) {
WHEN devPresentLastScan = 0 THEN 'Off-line' WHEN devPresentLastScan = 0 THEN 'Off-line'
ELSE 'Unknown status' ELSE 'Unknown status'
END AS devStatus END AS devStatus
FROM Devices FROM DevicesView
/* Using COLLATE NOCASE here solves the 'TEXT' vs 'NOCASE' mismatch */ /* Using COLLATE NOCASE here solves the 'TEXT' vs 'NOCASE' mismatch */
WHERE devParentMac = '${normalized_mac}' COLLATE NOCASE`; WHERE devParentMac = '${normalized_mac}' COLLATE NOCASE`;

View File

@@ -32,7 +32,7 @@ function initNetworkTopology() {
WHEN devType IN (${networkDeviceTypes}) THEN 1 WHEN devType IN (${networkDeviceTypes}) THEN 1
ELSE 0 ELSE 0
END AS devIsNetworkNodeDynamic END AS devIsNetworkNodeDynamic
FROM Devices a FROM DevicesView a
`; `;

View File

@@ -54,6 +54,7 @@ function renderNetworkTabContent(nodes) {
const badge = getStatusBadgeParts( const badge = getStatusBadgeParts(
node.online, node.online,
node.node_alert, node.node_alert,
node.node_flapping,
node.node_mac node.node_mac
); );

View File

@@ -72,6 +72,7 @@ function getChildren(node, list, path, visited = [])
ip: node.devLastIP, ip: node.devLastIP,
status: node.devStatus, status: node.devStatus,
presentLastScan: node.devPresentLastScan, presentLastScan: node.devPresentLastScan,
flapping: node.devFlapping,
alertDown: node.devAlertDown, alertDown: node.devAlertDown,
hasChildren: children.length > 0 || hiddenMacs.includes(node.devMac), hasChildren: children.length > 0 || hiddenMacs.includes(node.devMac),
relType: node.devParentRelType, relType: node.devParentRelType,
@@ -266,7 +267,13 @@ function initTree(myHierarchy)
<i class="fa-solid fa-hard-drive"></i> <i class="fa-solid fa-hard-drive"></i>
</span>` : ""; </span>` : "";
const badgeConf = getStatusBadgeParts(nodeData.data.presentLastScan, nodeData.data.alertDown, nodeData.data.mac, statusText = '') const badgeConf = getStatusBadgeParts(
nodeData.data.presentLastScan,
nodeData.data.alertDown,
nodeData.data.flapping,
nodeData.data.mac,
statusText = ''
);
return result = `<div return result = `<div
class="node-inner hover-node-info box pointer ${highlightedCss} ${cssNodeType}" class="node-inner hover-node-info box pointer ${highlightedCss} ${cssNodeType}"
@@ -283,6 +290,7 @@ function initTree(myHierarchy)
data-lastseen="${nodeData.data.lastseen}" data-lastseen="${nodeData.data.lastseen}"
data-firstseen="${nodeData.data.firstseen}" data-firstseen="${nodeData.data.firstseen}"
data-relationship="${nodeData.data.relType}" data-relationship="${nodeData.data.relType}"
data-flapping="${nodeData.data.flapping}"
data-status="${nodeData.data.status}" data-status="${nodeData.data.status}"
data-present="${nodeData.data.presentLastScan}" data-present="${nodeData.data.presentLastScan}"
data-alert="${nodeData.data.alertDown}" data-alert="${nodeData.data.alertDown}"

View File

@@ -765,7 +765,8 @@ function getColumnNameFromLangString(headStringKey) {
"Device_TableHead_ReqNicsOnline": "devReqNicsOnline", "Device_TableHead_ReqNicsOnline": "devReqNicsOnline",
"Device_TableHead_Vlan": "devVlan", "Device_TableHead_Vlan": "devVlan",
"Device_TableHead_IPv4": "devPrimaryIPv4", "Device_TableHead_IPv4": "devPrimaryIPv4",
"Device_TableHead_IPv6": "devPrimaryIPv6" "Device_TableHead_IPv6": "devPrimaryIPv6",
"Device_TableHead_Flapping": "devFlapping"
}; };
return columnNameMap[headStringKey] || ""; return columnNameMap[headStringKey] || "";
@@ -773,17 +774,25 @@ function getColumnNameFromLangString(headStringKey) {
//-------------------------------------------------------------- //--------------------------------------------------------------
// Generating the device status chip // Generating the device status chip
function getStatusBadgeParts(devPresentLastScan, devAlertDown, devMac, statusText = '') { function getStatusBadgeParts(devPresentLastScan, devAlertDown, devFlapping, devMac, statusText = '') {
let css = 'bg-gray text-white statusUnknown'; let css = 'bg-gray text-white statusUnknown';
let icon = '<i class="fa-solid fa-question"></i>'; let icon = '<i class="fa-solid fa-question"></i>';
let status = 'unknown'; let status = 'unknown';
let cssText = ''; let cssText = '';
if (devPresentLastScan == 1) { console.log(devFlapping);
if (devPresentLastScan == 1 && devFlapping == 0) {
css = 'bg-green text-white statusOnline'; css = 'bg-green text-white statusOnline';
cssText = 'text-green'; cssText = 'text-green';
icon = '<i class="fa-solid fa-plug"></i>'; icon = '<i class="fa-solid fa-plug"></i>';
status = 'online'; status = 'online';
} else if (devPresentLastScan == 1 && devFlapping == 1) {
css = 'bg-yellow text-white statusFlapping';
cssText = 'text-yellow';
icon = '<i class="fa-solid fa-plug-circle-exclamation"></i>';
status = 'online';
} else if (devAlertDown == 1) { } else if (devAlertDown == 1) {
css = 'bg-red text-white statusDown'; css = 'bg-red text-white statusDown';
cssText = 'text-red'; cssText = 'text-red';
@@ -958,6 +967,7 @@ function renderDeviceLink(data, container, useName = false) {
const badge = getStatusBadgeParts( const badge = getStatusBadgeParts(
device.devPresentLastScan, device.devPresentLastScan,
device.devAlertDown, device.devAlertDown,
device.devFlapping,
device.devMac device.devMac
); );
@@ -974,6 +984,7 @@ function renderDeviceLink(data, container, useName = false) {
'data-firstseen': device.devFirstConnection, 'data-firstseen': device.devFirstConnection,
'data-relationship': device.devParentRelType, 'data-relationship': device.devParentRelType,
'data-status': device.devStatus, 'data-status': device.devStatus,
'data-flapping': device.devFlapping,
'data-present': device.devPresentLastScan, 'data-present': device.devPresentLastScan,
'data-alert': device.devAlertDown, 'data-alert': device.devAlertDown,
'data-icon': device.devIcon 'data-icon': device.devIcon
@@ -1044,7 +1055,8 @@ function initHoverNodeInfo() {
const lastseen = $el.data('lastseen') || 'Unknown'; const lastseen = $el.data('lastseen') || 'Unknown';
const firstseen = $el.data('firstseen') || 'Unknown'; const firstseen = $el.data('firstseen') || 'Unknown';
const relationship = $el.data('relationship') || 'Unknown'; const relationship = $el.data('relationship') || 'Unknown';
const badge = getStatusBadgeParts( $el.data('present'), $el.data('alert'), $el.data('mac')) const flapping = $el.data('flapping') || 0;
const badge = getStatusBadgeParts( $el.data('present'), $el.data('alert'), flapping, $el.data('mac'))
const status =`<span class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.status}</span>` const status =`<span class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.status}</span>`
const html = ` const html = `

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "اسم النطاق الكامل", "Device_TableHead_FQDN": "اسم النطاق الكامل",
"Device_TableHead_Favorite": "مفضل", "Device_TableHead_Favorite": "مفضل",
"Device_TableHead_FirstSession": "أول جلسة", "Device_TableHead_FirstSession": "أول جلسة",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "معرف فريد", "Device_TableHead_GUID": "معرف فريد",
"Device_TableHead_Group": "المجموعة", "Device_TableHead_Group": "المجموعة",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Favorit", "Device_TableHead_Favorite": "Favorit",
"Device_TableHead_FirstSession": "Primera Sessió", "Device_TableHead_FirstSession": "Primera Sessió",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grup", "Device_TableHead_Group": "Grup",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",
@@ -790,4 +791,4 @@
"settings_system_label": "Sistema", "settings_system_label": "Sistema",
"settings_update_item_warning": "Actualitza el valor sota. Sigues curós de seguir el format anterior. <b>No hi ha validació.</b>", "settings_update_item_warning": "Actualitza el valor sota. Sigues curós de seguir el format anterior. <b>No hi ha validació.</b>",
"test_event_tooltip": "Deseu els canvis primer abans de comprovar la configuració." "test_event_tooltip": "Deseu els canvis primer abans de comprovar la configuració."
} }

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "", "Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "", "Device_TableHead_FirstSession": "",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "", "Device_TableHead_GUID": "",
"Device_TableHead_Group": "", "Device_TableHead_Group": "",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -229,6 +229,7 @@
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "Favorit", "Device_TableHead_Favorite": "Favorit",
"Device_TableHead_FirstSession": "Erste Sitzung", "Device_TableHead_FirstSession": "Erste Sitzung",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Gruppe", "Device_TableHead_Group": "Gruppe",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Favorite", "Device_TableHead_Favorite": "Favorite",
"Device_TableHead_FirstSession": "First Session", "Device_TableHead_FirstSession": "First Session",
"Device_TableHead_Flapping": "Flapping",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Group", "Device_TableHead_Group": "Group",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",

View File

@@ -227,6 +227,7 @@
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Favorito", "Device_TableHead_Favorite": "Favorito",
"Device_TableHead_FirstSession": "1ra. sesión", "Device_TableHead_FirstSession": "1ra. sesión",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grupo", "Device_TableHead_Group": "Grupo",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",
@@ -861,4 +862,4 @@
"settings_system_label": "Sistema", "settings_system_label": "Sistema",
"settings_update_item_warning": "Actualice el valor a continuación. Tenga cuidado de seguir el formato anterior. <b>O la validación no se realiza.</b>", "settings_update_item_warning": "Actualice el valor a continuación. Tenga cuidado de seguir el formato anterior. <b>O la validación no se realiza.</b>",
"test_event_tooltip": "Guarda tus cambios antes de probar nuevos ajustes." "test_event_tooltip": "Guarda tus cambios antes de probar nuevos ajustes."
} }

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "", "Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "", "Device_TableHead_FirstSession": "",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "", "Device_TableHead_GUID": "",
"Device_TableHead_Group": "", "Device_TableHead_Group": "",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "Nom de domaine FQDN", "Device_TableHead_FQDN": "Nom de domaine FQDN",
"Device_TableHead_Favorite": "Favori", "Device_TableHead_Favorite": "Favori",
"Device_TableHead_FirstSession": "Première session", "Device_TableHead_FirstSession": "Première session",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Groupe", "Device_TableHead_Group": "Groupe",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",
@@ -790,4 +791,4 @@
"settings_system_label": "Système", "settings_system_label": "Système",
"settings_update_item_warning": "Mettre à jour la valeur ci-dessous. Veillez à bien suivre le même format qu'auparavant. <b>Il n'y a pas de pas de contrôle.</b>", "settings_update_item_warning": "Mettre à jour la valeur ci-dessous. Veillez à bien suivre le même format qu'auparavant. <b>Il n'y a pas de pas de contrôle.</b>",
"test_event_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage." "test_event_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage."
} }

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Preferito", "Device_TableHead_Favorite": "Preferito",
"Device_TableHead_FirstSession": "Prima sessione", "Device_TableHead_FirstSession": "Prima sessione",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Gruppo", "Device_TableHead_Group": "Gruppo",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",
@@ -790,4 +791,4 @@
"settings_system_label": "Sistema", "settings_system_label": "Sistema",
"settings_update_item_warning": "Aggiorna il valore qui sotto. Fai attenzione a seguire il formato precedente. <b>La convalida non viene eseguita.</b>", "settings_update_item_warning": "Aggiorna il valore qui sotto. Fai attenzione a seguire il formato precedente. <b>La convalida non viene eseguita.</b>",
"test_event_tooltip": "Salva le modifiche prima di provare le nuove impostazioni." "test_event_tooltip": "Salva le modifiche prima di provare le nuove impostazioni."
} }

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "お気に入り", "Device_TableHead_Favorite": "お気に入り",
"Device_TableHead_FirstSession": "初回セッション", "Device_TableHead_FirstSession": "初回セッション",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "グループ", "Device_TableHead_Group": "グループ",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",
@@ -790,4 +791,4 @@
"settings_system_label": "システム", "settings_system_label": "システム",
"settings_update_item_warning": "以下の値を更新してください。以前のフォーマットに従うよう注意してください。<b>検証は行われません。</b>", "settings_update_item_warning": "以下の値を更新してください。以前のフォーマットに従うよう注意してください。<b>検証は行われません。</b>",
"test_event_tooltip": "設定をテストする前に、まず変更を保存してください。" "test_event_tooltip": "設定をテストする前に、まず変更を保存してください。"
} }

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "Favoritt", "Device_TableHead_Favorite": "Favoritt",
"Device_TableHead_FirstSession": "Første Økt", "Device_TableHead_FirstSession": "Første Økt",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Gruppe", "Device_TableHead_Group": "Gruppe",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Ulubione", "Device_TableHead_Favorite": "Ulubione",
"Device_TableHead_FirstSession": "Pierwsza sesja", "Device_TableHead_FirstSession": "Pierwsza sesja",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grupa", "Device_TableHead_Group": "Grupa",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "Favorito", "Device_TableHead_Favorite": "Favorito",
"Device_TableHead_FirstSession": "Primeira sessão", "Device_TableHead_FirstSession": "Primeira sessão",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grupo", "Device_TableHead_Group": "Grupo",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Favorito", "Device_TableHead_Favorite": "Favorito",
"Device_TableHead_FirstSession": "Primeira sessão", "Device_TableHead_FirstSession": "Primeira sessão",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grupo", "Device_TableHead_Group": "Grupo",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Избранное", "Device_TableHead_Favorite": "Избранное",
"Device_TableHead_FirstSession": "Первый сеанс", "Device_TableHead_FirstSession": "Первый сеанс",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Группа", "Device_TableHead_Group": "Группа",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "", "Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "", "Device_TableHead_FirstSession": "",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "", "Device_TableHead_GUID": "",
"Device_TableHead_Group": "", "Device_TableHead_Group": "",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "Favori", "Device_TableHead_Favorite": "Favori",
"Device_TableHead_FirstSession": "İlk Oturum", "Device_TableHead_FirstSession": "İlk Oturum",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grup", "Device_TableHead_Group": "Grup",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "Улюблений", "Device_TableHead_Favorite": "Улюблений",
"Device_TableHead_FirstSession": "Перша сесія", "Device_TableHead_FirstSession": "Перша сесія",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Група", "Device_TableHead_Group": "Група",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "", "Device_TableHead_FQDN": "",
"Device_TableHead_Favorite": "", "Device_TableHead_Favorite": "",
"Device_TableHead_FirstSession": "", "Device_TableHead_FirstSession": "",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "", "Device_TableHead_GUID": "",
"Device_TableHead_Group": "", "Device_TableHead_Group": "",
"Device_TableHead_IPv4": "", "Device_TableHead_IPv4": "",

View File

@@ -225,6 +225,7 @@
"Device_TableHead_FQDN": "FQDN", "Device_TableHead_FQDN": "FQDN",
"Device_TableHead_Favorite": "收藏", "Device_TableHead_Favorite": "收藏",
"Device_TableHead_FirstSession": "加入", "Device_TableHead_FirstSession": "加入",
"Device_TableHead_Flapping": "",
"Device_TableHead_GUID": "GUID", "Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "组", "Device_TableHead_Group": "组",
"Device_TableHead_IPv4": "IPv4", "Device_TableHead_IPv4": "IPv4",
@@ -790,4 +791,4 @@
"settings_system_label": "系统", "settings_system_label": "系统",
"settings_update_item_warning": "更新下面的值。请注意遵循先前的格式。<b>未执行验证。</b>", "settings_update_item_warning": "更新下面的值。请注意遵循先前的格式。<b>未执行验证。</b>",
"test_event_tooltip": "在测试设置之前,请先保存更改。" "test_event_tooltip": "在测试设置之前,请先保存更改。"
} }

View File

@@ -443,7 +443,8 @@
"Device_TableHead_ReqNicsOnline", "Device_TableHead_ReqNicsOnline",
"Device_TableHead_Vlan", "Device_TableHead_Vlan",
"Device_TableHead_IPv4", "Device_TableHead_IPv4",
"Device_TableHead_IPv6" "Device_TableHead_IPv6",
"Device_TableHead_Flapping"
], ],
"localized": ["name", "description"], "localized": ["name", "description"],
"name": [ "name": [

View File

@@ -100,7 +100,7 @@ class Device(ObjectType):
devParentPortSource = String(description="Source tracking for devParentPort (USER, LOCKED, NEWDEV, or plugin prefix)") devParentPortSource = String(description="Source tracking for devParentPort (USER, LOCKED, NEWDEV, or plugin prefix)")
devParentRelTypeSource = String(description="Source tracking for devParentRelType (USER, LOCKED, NEWDEV, or plugin prefix)") devParentRelTypeSource = String(description="Source tracking for devParentRelType (USER, LOCKED, NEWDEV, or plugin prefix)")
devVlanSource = String(description="Source tracking for devVlan") devVlanSource = String(description="Source tracking for devVlan")
devFlapping = String(description="ndicates flapping device (device changing between online/offline states frequently)") devFlapping = Int(description="Indicates flapping device (device changing between online/offline states frequently)")
class DeviceResult(ObjectType): class DeviceResult(ObjectType):