From b74b803d6c6ddbc60a00283a8a881c7f736f3c64 Mon Sep 17 00:00:00 2001 From: "Jokob @NetAlertX" <96159884+jokob-sk@users.noreply.github.com> Date: Fri, 27 Feb 2026 23:29:55 +0000 Subject: [PATCH] feat: Add devFlapping attribute to device management and update related UI components --- docs/DEVICE_DISPLAY_SETTINGS.md | 10 ++++++---- front/devices.php | 15 +++++++++++---- front/js/network-api.js | 16 +++++++++------- front/js/network-init.js | 2 +- front/js/network-tabs.js | 1 + front/js/network-tree.js | 10 +++++++++- front/js/ui_components.js | 20 ++++++++++++++++---- front/php/templates/language/ar_ar.json | 1 + front/php/templates/language/ca_ca.json | 3 ++- front/php/templates/language/cs_cz.json | 1 + front/php/templates/language/de_de.json | 1 + front/php/templates/language/en_us.json | 1 + front/php/templates/language/es_es.json | 3 ++- front/php/templates/language/fa_fa.json | 1 + front/php/templates/language/fr_fr.json | 3 ++- front/php/templates/language/it_it.json | 3 ++- front/php/templates/language/ja_jp.json | 3 ++- front/php/templates/language/nb_no.json | 1 + front/php/templates/language/pl_pl.json | 1 + front/php/templates/language/pt_br.json | 1 + front/php/templates/language/pt_pt.json | 1 + front/php/templates/language/ru_ru.json | 1 + front/php/templates/language/sv_sv.json | 1 + front/php/templates/language/tr_tr.json | 1 + front/php/templates/language/uk_ua.json | 1 + front/php/templates/language/vi_vn.json | 1 + front/php/templates/language/zh_cn.json | 3 ++- front/plugins/ui_settings/config.json | 3 ++- server/api_server/graphql_endpoint.py | 2 +- 29 files changed, 82 insertions(+), 29 deletions(-) diff --git a/docs/DEVICE_DISPLAY_SETTINGS.md b/docs/DEVICE_DISPLAY_SETTINGS.md index 41eeb4db..e4ae9ba6 100755 --- a/docs/DEVICE_DISPLAY_SETTINGS.md +++ b/docs/DEVICE_DISPLAY_SETTINGS.md @@ -1,6 +1,6 @@ # 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) @@ -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". 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. -4. ✖ Offline (Grey) = A device that was not detected online in the last scan. -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`. +3. 🔌(❕) Online (Orange) - The device is unstable and flapping (3 status changes in the last hour) +4. ✖ New (Grey) = Same as No.2 but device is now offline. +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). \ No newline at end of file diff --git a/front/devices.php b/front/devices.php index 08da9254..2fd16c46 100755 --- a/front/devices.php +++ b/front/devices.php @@ -547,6 +547,7 @@ function mapColumnIndexToFieldName(index, tableColumnVisible) { "devVlan", // 30 "devPrimaryIPv4", // 31 "devPrimaryIPv6", // 32 + "devFlapping", // 33 ]; // console.log("OrderBy: " + columnNames[tableColumnOrder[index]]); @@ -666,6 +667,7 @@ function initializeDatatable (status) { devVlan devPrimaryIPv4 devPrimaryIPv6 + devFlapping } count } @@ -753,6 +755,7 @@ function initializeDatatable (status) { device.devVlan || "", device.devPrimaryIPv4 || "", device.devPrimaryIPv6 || "", + device.devFlapping || 0, ]; const newRow = []; @@ -821,6 +824,7 @@ function initializeDatatable (status) { data-status="${rowData[mapIndx(10)]}" data-present="${rowData[mapIndx(24)]}" data-alert="${rowData[mapIndx(25)]}" + data-flapping="${rowData[mapIndx(33)]}" data-icon="${rowData[mapIndx(3)]}"> ${displayedValue} @@ -964,12 +968,15 @@ function initializeDatatable (status) { tmp_devPresentLastScan = rowData[mapIndx(24)] tmp_devAlertDown = rowData[mapIndx(25)] + tmp_devMac = rowData[mapIndx(11)] + tmp_devFlapping = rowData[mapIndx(33)] const badge = getStatusBadgeParts( - rowData[mapIndx(24)], // tmp_devPresentLastScan - rowData[mapIndx(25)], // tmp_devAlertDown - rowData[mapIndx(11)], // MAC - cellData // optional text + tmp_devPresentLastScan, // tmp_devPresentLastScan + tmp_devAlertDown, // tmp_devAlertDown + tmp_devFlapping, // tmp_devFlapping + tmp_devMac, // MAC + cellData // optional text ); $(td).html (`${badge.iconHtml} ${badge.text}`); diff --git a/front/js/network-api.js b/front/js/network-api.js index ba8f9abe..4ed82e55 100644 --- a/front/js/network-api.js +++ b/front/js/network-api.js @@ -23,9 +23,10 @@ function loadNetworkNodes() { LOWER(parent.devParentMAC) AS parent_mac, parent.devIcon AS node_icon, parent.devAlertDown AS node_alert, + parent.devFlapping AS node_flapping, COUNT(child.devMac) AS node_ports_count - FROM Devices AS parent - LEFT JOIN Devices AS child + FROM DevicesView AS parent + LEFT JOIN DevicesView AS child /* CRITICAL FIX: COLLATE NOCASE ensures the join works even if devParentMAC is uppercase and devMac is lowercase */ @@ -33,7 +34,7 @@ function loadNetworkNodes() { WHERE parent.devType IN (${networkDeviceTypes}) AND parent.devIsArchived = 0 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; `; @@ -143,6 +144,7 @@ function loadDeviceTable({ sql, containerSelector, tableId, wrapperHtml = null, const badge = getStatusBadgeParts( device.devPresentLastScan, device.devAlertDown, + device.devFlapping, device.devMac, device.devStatus ); @@ -202,8 +204,8 @@ function loadDeviceTable({ sql, containerSelector, tableId, wrapperHtml = null, */ function loadUnassignedDevices() { const sql = ` - SELECT devMac, devPresentLastScan, devName, devLastIP, devVendor, devAlertDown, devParentPort - FROM Devices + SELECT devMac, devPresentLastScan, devName, devLastIP, devVendor, devAlertDown, devParentPort, devFlapping, devStatus + FROM DevicesView WHERE (devParentMAC IS NULL OR devParentMAC IN ("", " ", "undefined", "null")) AND LOWER(devMac) NOT LIKE "%internet%" AND devIsArchived = 0 @@ -237,7 +239,7 @@ function loadConnectedDevices(node_mac) { const normalized_mac = node_mac.toLowerCase(); const sql = ` - SELECT devName, devMac, devLastIP, devVendor, devPresentLastScan, devAlertDown, devParentPort, devVlan, + SELECT devName, devMac, devLastIP, devVendor, devPresentLastScan, devAlertDown, devParentPort, devVlan, devFlapping, CASE WHEN devIsNew = 1 THEN 'New' WHEN devPresentLastScan = 1 THEN 'On-line' @@ -246,7 +248,7 @@ function loadConnectedDevices(node_mac) { WHEN devPresentLastScan = 0 THEN 'Off-line' ELSE 'Unknown status' END AS devStatus - FROM Devices + FROM DevicesView /* Using COLLATE NOCASE here solves the 'TEXT' vs 'NOCASE' mismatch */ WHERE devParentMac = '${normalized_mac}' COLLATE NOCASE`; diff --git a/front/js/network-init.js b/front/js/network-init.js index 474aba27..b61ec9fe 100644 --- a/front/js/network-init.js +++ b/front/js/network-init.js @@ -32,7 +32,7 @@ function initNetworkTopology() { WHEN devType IN (${networkDeviceTypes}) THEN 1 ELSE 0 END AS devIsNetworkNodeDynamic - FROM Devices a + FROM DevicesView a `; diff --git a/front/js/network-tabs.js b/front/js/network-tabs.js index b8907b77..f358a1ce 100644 --- a/front/js/network-tabs.js +++ b/front/js/network-tabs.js @@ -54,6 +54,7 @@ function renderNetworkTabContent(nodes) { const badge = getStatusBadgeParts( node.online, node.node_alert, + node.node_flapping, node.node_mac ); diff --git a/front/js/network-tree.js b/front/js/network-tree.js index 256fa85d..a20c3a24 100644 --- a/front/js/network-tree.js +++ b/front/js/network-tree.js @@ -72,6 +72,7 @@ function getChildren(node, list, path, visited = []) ip: node.devLastIP, status: node.devStatus, presentLastScan: node.devPresentLastScan, + flapping: node.devFlapping, alertDown: node.devAlertDown, hasChildren: children.length > 0 || hiddenMacs.includes(node.devMac), relType: node.devParentRelType, @@ -266,7 +267,13 @@ function initTree(myHierarchy) ` : ""; - 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 = `
${badge.iconHtml} ${badge.status}` const html = ` diff --git a/front/php/templates/language/ar_ar.json b/front/php/templates/language/ar_ar.json index 1391389a..d465e076 100644 --- a/front/php/templates/language/ar_ar.json +++ b/front/php/templates/language/ar_ar.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "اسم النطاق الكامل", "Device_TableHead_Favorite": "مفضل", "Device_TableHead_FirstSession": "أول جلسة", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "معرف فريد", "Device_TableHead_Group": "المجموعة", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/ca_ca.json b/front/php/templates/language/ca_ca.json index c6d5fe9f..2d98f51c 100644 --- a/front/php/templates/language/ca_ca.json +++ b/front/php/templates/language/ca_ca.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "FQDN", "Device_TableHead_Favorite": "Favorit", "Device_TableHead_FirstSession": "Primera Sessió", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Grup", "Device_TableHead_IPv4": "IPv4", @@ -790,4 +791,4 @@ "settings_system_label": "Sistema", "settings_update_item_warning": "Actualitza el valor sota. Sigues curós de seguir el format anterior. No hi ha validació.", "test_event_tooltip": "Deseu els canvis primer abans de comprovar la configuració." -} +} \ No newline at end of file diff --git a/front/php/templates/language/cs_cz.json b/front/php/templates/language/cs_cz.json index 06dd9a15..8d782439 100644 --- a/front/php/templates/language/cs_cz.json +++ b/front/php/templates/language/cs_cz.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "", "Device_TableHead_Favorite": "", "Device_TableHead_FirstSession": "", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "", "Device_TableHead_Group": "", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/de_de.json b/front/php/templates/language/de_de.json index 19e1d12f..a4596ef0 100644 --- a/front/php/templates/language/de_de.json +++ b/front/php/templates/language/de_de.json @@ -229,6 +229,7 @@ "Device_TableHead_FQDN": "", "Device_TableHead_Favorite": "Favorit", "Device_TableHead_FirstSession": "Erste Sitzung", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Gruppe", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/en_us.json b/front/php/templates/language/en_us.json index 8129a5fc..ce3f8a7f 100755 --- a/front/php/templates/language/en_us.json +++ b/front/php/templates/language/en_us.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "FQDN", "Device_TableHead_Favorite": "Favorite", "Device_TableHead_FirstSession": "First Session", + "Device_TableHead_Flapping": "Flapping", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Group", "Device_TableHead_IPv4": "IPv4", diff --git a/front/php/templates/language/es_es.json b/front/php/templates/language/es_es.json index 7c1add8f..a2fd036a 100644 --- a/front/php/templates/language/es_es.json +++ b/front/php/templates/language/es_es.json @@ -227,6 +227,7 @@ "Device_TableHead_FQDN": "FQDN", "Device_TableHead_Favorite": "Favorito", "Device_TableHead_FirstSession": "1ra. sesión", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Grupo", "Device_TableHead_IPv4": "IPv4", @@ -861,4 +862,4 @@ "settings_system_label": "Sistema", "settings_update_item_warning": "Actualice el valor a continuación. Tenga cuidado de seguir el formato anterior. O la validación no se realiza.", "test_event_tooltip": "Guarda tus cambios antes de probar nuevos ajustes." -} +} \ No newline at end of file diff --git a/front/php/templates/language/fa_fa.json b/front/php/templates/language/fa_fa.json index e9e9fc84..62cac6f4 100644 --- a/front/php/templates/language/fa_fa.json +++ b/front/php/templates/language/fa_fa.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "", "Device_TableHead_Favorite": "", "Device_TableHead_FirstSession": "", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "", "Device_TableHead_Group": "", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/fr_fr.json b/front/php/templates/language/fr_fr.json index 15070f2b..4aa95a79 100644 --- a/front/php/templates/language/fr_fr.json +++ b/front/php/templates/language/fr_fr.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "Nom de domaine FQDN", "Device_TableHead_Favorite": "Favori", "Device_TableHead_FirstSession": "Première session", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Groupe", "Device_TableHead_IPv4": "IPv4", @@ -790,4 +791,4 @@ "settings_system_label": "Système", "settings_update_item_warning": "Mettre à jour la valeur ci-dessous. Veillez à bien suivre le même format qu'auparavant. Il n'y a pas de pas de contrôle.", "test_event_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage." -} +} \ No newline at end of file diff --git a/front/php/templates/language/it_it.json b/front/php/templates/language/it_it.json index b7ce9221..bb9233dd 100644 --- a/front/php/templates/language/it_it.json +++ b/front/php/templates/language/it_it.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "FQDN", "Device_TableHead_Favorite": "Preferito", "Device_TableHead_FirstSession": "Prima sessione", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Gruppo", "Device_TableHead_IPv4": "IPv4", @@ -790,4 +791,4 @@ "settings_system_label": "Sistema", "settings_update_item_warning": "Aggiorna il valore qui sotto. Fai attenzione a seguire il formato precedente. La convalida non viene eseguita.", "test_event_tooltip": "Salva le modifiche prima di provare le nuove impostazioni." -} +} \ No newline at end of file diff --git a/front/php/templates/language/ja_jp.json b/front/php/templates/language/ja_jp.json index 513399c5..061bc4d7 100644 --- a/front/php/templates/language/ja_jp.json +++ b/front/php/templates/language/ja_jp.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "FQDN", "Device_TableHead_Favorite": "お気に入り", "Device_TableHead_FirstSession": "初回セッション", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "グループ", "Device_TableHead_IPv4": "IPv4", @@ -790,4 +791,4 @@ "settings_system_label": "システム", "settings_update_item_warning": "以下の値を更新してください。以前のフォーマットに従うよう注意してください。検証は行われません。", "test_event_tooltip": "設定をテストする前に、まず変更を保存してください。" -} +} \ No newline at end of file diff --git a/front/php/templates/language/nb_no.json b/front/php/templates/language/nb_no.json index 21b66914..1bd7b439 100644 --- a/front/php/templates/language/nb_no.json +++ b/front/php/templates/language/nb_no.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "", "Device_TableHead_Favorite": "Favoritt", "Device_TableHead_FirstSession": "Første Økt", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Gruppe", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/pl_pl.json b/front/php/templates/language/pl_pl.json index a208d6a2..c8160f43 100644 --- a/front/php/templates/language/pl_pl.json +++ b/front/php/templates/language/pl_pl.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "FQDN", "Device_TableHead_Favorite": "Ulubione", "Device_TableHead_FirstSession": "Pierwsza sesja", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Grupa", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/pt_br.json b/front/php/templates/language/pt_br.json index a6ccad5b..f61cc255 100644 --- a/front/php/templates/language/pt_br.json +++ b/front/php/templates/language/pt_br.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "", "Device_TableHead_Favorite": "Favorito", "Device_TableHead_FirstSession": "Primeira sessão", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Grupo", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/pt_pt.json b/front/php/templates/language/pt_pt.json index d311d2c9..fb0e54bf 100644 --- a/front/php/templates/language/pt_pt.json +++ b/front/php/templates/language/pt_pt.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "FQDN", "Device_TableHead_Favorite": "Favorito", "Device_TableHead_FirstSession": "Primeira sessão", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Grupo", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/ru_ru.json b/front/php/templates/language/ru_ru.json index 67034818..2b58b2d1 100644 --- a/front/php/templates/language/ru_ru.json +++ b/front/php/templates/language/ru_ru.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "FQDN", "Device_TableHead_Favorite": "Избранное", "Device_TableHead_FirstSession": "Первый сеанс", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Группа", "Device_TableHead_IPv4": "IPv4", diff --git a/front/php/templates/language/sv_sv.json b/front/php/templates/language/sv_sv.json index f38ce99e..bad46da0 100644 --- a/front/php/templates/language/sv_sv.json +++ b/front/php/templates/language/sv_sv.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "", "Device_TableHead_Favorite": "", "Device_TableHead_FirstSession": "", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "", "Device_TableHead_Group": "", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/tr_tr.json b/front/php/templates/language/tr_tr.json index 8f50a7fc..92ed9d7c 100644 --- a/front/php/templates/language/tr_tr.json +++ b/front/php/templates/language/tr_tr.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "", "Device_TableHead_Favorite": "Favori", "Device_TableHead_FirstSession": "İlk Oturum", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Grup", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/uk_ua.json b/front/php/templates/language/uk_ua.json index 7fe0124e..e77981e6 100644 --- a/front/php/templates/language/uk_ua.json +++ b/front/php/templates/language/uk_ua.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "FQDN", "Device_TableHead_Favorite": "Улюблений", "Device_TableHead_FirstSession": "Перша сесія", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "Група", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/vi_vn.json b/front/php/templates/language/vi_vn.json index f38ce99e..bad46da0 100644 --- a/front/php/templates/language/vi_vn.json +++ b/front/php/templates/language/vi_vn.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "", "Device_TableHead_Favorite": "", "Device_TableHead_FirstSession": "", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "", "Device_TableHead_Group": "", "Device_TableHead_IPv4": "", diff --git a/front/php/templates/language/zh_cn.json b/front/php/templates/language/zh_cn.json index 91f28b9d..7e8c4345 100644 --- a/front/php/templates/language/zh_cn.json +++ b/front/php/templates/language/zh_cn.json @@ -225,6 +225,7 @@ "Device_TableHead_FQDN": "FQDN", "Device_TableHead_Favorite": "收藏", "Device_TableHead_FirstSession": "加入", + "Device_TableHead_Flapping": "", "Device_TableHead_GUID": "GUID", "Device_TableHead_Group": "组", "Device_TableHead_IPv4": "IPv4", @@ -790,4 +791,4 @@ "settings_system_label": "系统", "settings_update_item_warning": "更新下面的值。请注意遵循先前的格式。未执行验证。", "test_event_tooltip": "在测试设置之前,请先保存更改。" -} +} \ No newline at end of file diff --git a/front/plugins/ui_settings/config.json b/front/plugins/ui_settings/config.json index 18cee2cb..3da0bff2 100755 --- a/front/plugins/ui_settings/config.json +++ b/front/plugins/ui_settings/config.json @@ -443,7 +443,8 @@ "Device_TableHead_ReqNicsOnline", "Device_TableHead_Vlan", "Device_TableHead_IPv4", - "Device_TableHead_IPv6" + "Device_TableHead_IPv6", + "Device_TableHead_Flapping" ], "localized": ["name", "description"], "name": [ diff --git a/server/api_server/graphql_endpoint.py b/server/api_server/graphql_endpoint.py index eab23791..074d601e 100755 --- a/server/api_server/graphql_endpoint.py +++ b/server/api_server/graphql_endpoint.py @@ -100,7 +100,7 @@ class Device(ObjectType): 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)") 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):