@oneuptime/common 11.6.1 → 11.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/Models/AnalyticsModels/Index.ts +4 -0
  2. package/Models/AnalyticsModels/KubernetesCostAllocation.ts +842 -0
  3. package/Models/AnalyticsModels/NetworkFlow.ts +54 -0
  4. package/Models/AnalyticsModels/SloHistory.ts +243 -0
  5. package/Models/DatabaseModels/Index.ts +20 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +453 -6
  7. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +7 -6
  8. package/Models/DatabaseModels/NetworkEndpoint.ts +753 -0
  9. package/Models/DatabaseModels/NetworkSite.ts +1155 -0
  10. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +517 -0
  11. package/Models/DatabaseModels/NetworkSiteLink.ts +611 -0
  12. package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +520 -0
  13. package/Models/DatabaseModels/NetworkSiteType.ts +499 -0
  14. package/Models/DatabaseModels/ServiceLevelObjective.ts +1115 -0
  15. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +762 -0
  16. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +444 -0
  17. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +443 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.ts +359 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.ts +48 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.ts +65 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.ts +88 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.ts +391 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1785066759532-MigrationName.ts +30 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  25. package/Server/Services/AnalyticsDatabaseService.ts +25 -9
  26. package/Server/Services/Index.ts +24 -0
  27. package/Server/Services/KubernetesCostAllocationService.ts +14 -0
  28. package/Server/Services/MetricService.ts +21 -2
  29. package/Server/Services/MonitorService.ts +22 -0
  30. package/Server/Services/NetworkDeviceService.ts +438 -2
  31. package/Server/Services/NetworkEndpointService.ts +414 -0
  32. package/Server/Services/NetworkSiteAssignmentRuleService.ts +98 -0
  33. package/Server/Services/NetworkSiteLinkService.ts +10 -0
  34. package/Server/Services/NetworkSiteService.ts +1254 -0
  35. package/Server/Services/NetworkSiteStatusTimelineService.ts +10 -0
  36. package/Server/Services/NetworkSiteTypeService.ts +10 -0
  37. package/Server/Services/ProjectService.ts +122 -2
  38. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +457 -0
  39. package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +10 -0
  40. package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +10 -0
  41. package/Server/Services/ServiceLevelObjectiveService.ts +685 -0
  42. package/Server/Services/SloHistoryService.ts +101 -0
  43. package/Server/Services/UserNotificationSettingService.ts +37 -0
  44. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +9 -0
  45. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +15 -0
  46. package/Server/Utils/AnalyticsDatabase/Statement.ts +39 -3
  47. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +87 -48
  48. package/Server/Utils/Memory.ts +9 -1
  49. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +190 -12
  50. package/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  51. package/Server/Utils/Monitor/DnsResolutionCache.ts +129 -0
  52. package/Server/Utils/Monitor/MonitorResource.ts +4 -30
  53. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +214 -39
  54. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +343 -0
  55. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +251 -0
  56. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +176 -142
  57. package/Server/Utils/Monitor/OuiLookupUtil.ts +49 -0
  58. package/Server/Utils/Monitor/SnmpInterfaceRateUtil.ts +17 -13
  59. package/Server/Utils/WhatsAppTemplateUtil.ts +7 -3
  60. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +135 -0
  61. package/Tests/Models/NetworkSiteHierarchy.test.ts +134 -0
  62. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +239 -0
  63. package/Tests/Server/Services/KubernetesCostAllocationAggregate.test.ts +338 -0
  64. package/Tests/Server/Services/MetricServiceAggregate.test.ts +142 -0
  65. package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +484 -0
  66. package/Tests/Server/Services/NetworkEndpointServiceUpsert.test.ts +686 -0
  67. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +185 -0
  68. package/Tests/Server/Services/NetworkSiteService.test.ts +1354 -0
  69. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +1313 -0
  70. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +1988 -0
  71. package/Tests/Server/Utils/AnalyticsDatabase/Statement.test.ts +22 -0
  72. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +404 -0
  73. package/Tests/Server/Utils/Encryption.test.ts +70 -0
  74. package/Tests/Server/Utils/FileAttachmentMarkdownUtil.test.ts +225 -0
  75. package/Tests/Server/Utils/JsonWebToken.test.ts +175 -0
  76. package/Tests/Server/Utils/LocalFile.test.ts +258 -0
  77. package/Tests/Server/Utils/Memory.test.ts +213 -0
  78. package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +30 -0
  79. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +385 -0
  80. package/Tests/Server/Utils/Monitor/DnsResolutionCache.test.ts +194 -0
  81. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +155 -0
  82. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +600 -0
  83. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +151 -124
  84. package/Tests/Server/Utils/Monitor/SnmpInterfaceRateUtil.test.ts +496 -0
  85. package/Tests/Server/Utils/MonitorCriteriaDataExtractor.test.ts +175 -0
  86. package/Tests/Server/Utils/MonitorCriteriaMessageFormatter.test.ts +282 -0
  87. package/Tests/Server/Utils/OuiLookupUtil.test.ts +59 -0
  88. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +117 -0
  89. package/Tests/Server/Utils/StackTraceParser.test.ts +370 -0
  90. package/Tests/Server/Utils/Stream.test.ts +87 -0
  91. package/Tests/Server/Utils/ValidateGlobalProviderProjectTeams.test.ts +221 -0
  92. package/Tests/Server/Utils/WhatsAppTemplateUtil.test.ts +199 -0
  93. package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +33 -0
  94. package/Tests/Types/Email.test.ts +198 -0
  95. package/Tests/Types/Kubernetes/KubernetesObjectParser.test.ts +177 -0
  96. package/Tests/Types/Log/LogQueryToFilter.test.ts +111 -0
  97. package/Tests/Types/Monitor/MonitorCriteria.test.ts +155 -0
  98. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +465 -0
  99. package/Tests/Types/Monitor/MonitorStep.test.ts +183 -0
  100. package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +141 -1
  101. package/Tests/Types/Monitor/MonitorSteps.test.ts +183 -0
  102. package/Tests/Types/Monitor/MonitorType.test.ts +59 -1
  103. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +97 -0
  104. package/Tests/Types/Monitor/SnmpEndpointDiscovery.test.ts +151 -0
  105. package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +110 -6
  106. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +129 -0
  107. package/Tests/Types/SerializableObjectDictionary.test.ts +166 -0
  108. package/Tests/Types/Time/RangeStartAndEndDateTime.test.ts +98 -0
  109. package/Tests/Types/WebsiteRequest.test.ts +230 -0
  110. package/Tests/UI/Components/EntityFilterRoundTrip.test.tsx +103 -0
  111. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +612 -0
  112. package/Tests/UI/Components/ModelTable/FilterDataToQuery.test.ts +275 -0
  113. package/Tests/UI/Utils/LogExport.test.ts +159 -0
  114. package/Tests/UI/Utils/Navigation.test.ts +183 -0
  115. package/Tests/UI/Utils/TableFilterUrlState.test.ts +539 -0
  116. package/Tests/UI/Utils/TableViewUrlState.test.ts +272 -0
  117. package/Tests/Utils/Base64.test.ts +51 -0
  118. package/Tests/Utils/Boolean.test.ts +76 -0
  119. package/Tests/Utils/Crypto.test.ts +48 -0
  120. package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +259 -0
  121. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +162 -0
  122. package/Tests/Utils/Enum.test.ts +54 -0
  123. package/Tests/Utils/IpCanonicalUtil.test.ts +85 -0
  124. package/Tests/Utils/Memory.test.ts +44 -0
  125. package/Tests/Utils/Metrics/MetricSeriesFingerprint.test.ts +160 -0
  126. package/Tests/Utils/Monitor/EndpointAttachmentUtil.test.ts +836 -0
  127. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +218 -0
  128. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +447 -0
  129. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +440 -0
  130. package/Tests/Utils/NetworkSite/MaterializedPathUtil.test.ts +205 -0
  131. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +221 -0
  132. package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +283 -0
  133. package/Tests/Utils/ObjectUtil.test.ts +30 -0
  134. package/Tests/Utils/Slo/SloBurnRateRuleState.test.ts +124 -0
  135. package/Tests/Utils/Slo/SloDuration.test.ts +148 -0
  136. package/Tests/Utils/Slo/SloHealth.test.ts +334 -0
  137. package/Tests/Utils/Slo/SloStatusColor.test.ts +89 -0
  138. package/Tests/Utils/Slo/SloUtil.test.ts +1980 -0
  139. package/Tests/Utils/Slo/SloWidgetFormat.test.ts +605 -0
  140. package/Tests/Utils/TechStack.test.ts +50 -0
  141. package/Tests/Utils/Traces/CriticalPath.test.ts +178 -0
  142. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +10 -0
  143. package/Types/BaseDatabase/EqualTo.ts +9 -1
  144. package/Types/BaseDatabase/EqualToOrNull.ts +9 -1
  145. package/Types/BaseDatabase/NotEqual.ts +9 -1
  146. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  147. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  148. package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +42 -0
  149. package/Types/Dashboard/DashboardTemplates.ts +214 -0
  150. package/Types/Email/EmailTemplateType.ts +2 -0
  151. package/Types/Kubernetes/KubernetesCostIngest.ts +79 -0
  152. package/Types/Monitor/CriteriaFilter.ts +9 -0
  153. package/Types/Monitor/MonitorStep.ts +5 -8
  154. package/Types/Monitor/MonitorStepNetworkDeviceMonitor.ts +27 -5
  155. package/Types/Monitor/MonitorType.ts +15 -5
  156. package/Types/Monitor/SnmpMonitor/ArpEntry.ts +14 -0
  157. package/Types/Monitor/SnmpMonitor/FdbEntry.ts +18 -0
  158. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +10 -3
  159. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -5
  160. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +12 -0
  161. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +231 -3
  162. package/Types/NetworkSite/DefaultNetworkSiteType.ts +20 -0
  163. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  164. package/Types/Permission.ts +449 -0
  165. package/Types/ServiceLevelObjective/SliType.ts +6 -0
  166. package/Types/ServiceLevelObjective/SloMultiMonitorMode.ts +6 -0
  167. package/Types/ServiceLevelObjective/SloStatus.ts +9 -0
  168. package/Types/ServiceLevelObjective/SloWindowType.ts +6 -0
  169. package/Types/Telemetry/ServiceType.ts +1 -0
  170. package/UI/Components/Filters/EntityFilter.tsx +16 -0
  171. package/UI/Components/Filters/FilterViewer.tsx +22 -5
  172. package/UI/Components/List/List.tsx +8 -0
  173. package/UI/Components/ModelTable/BaseModelTable.tsx +309 -106
  174. package/UI/Components/ModelTable/FilterDataToQuery.ts +172 -0
  175. package/UI/Components/Navbar/NavBar.tsx +16 -2
  176. package/UI/Components/Navbar/NavBarMenuModal.tsx +3 -3
  177. package/UI/Utils/Navigation.ts +10 -0
  178. package/UI/Utils/TableFilterUrlState.ts +204 -17
  179. package/UI/Utils/TableViewUrlState.ts +165 -0
  180. package/Utils/Dashboard/Components/DashboardSloComponent.ts +114 -0
  181. package/Utils/Dashboard/Components/Index.ts +7 -0
  182. package/Utils/IpCanonicalUtil.ts +134 -0
  183. package/Utils/Monitor/EndpointAttachmentUtil.ts +508 -0
  184. package/Utils/Monitor/NetworkTopologyUtil.ts +157 -5
  185. package/Utils/NetworkSite/CidrMatchUtil.ts +296 -0
  186. package/Utils/NetworkSite/MaterializedPathUtil.ts +115 -0
  187. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +97 -0
  188. package/Utils/NetworkSite/SiteUptimeUtil.ts +111 -0
  189. package/Utils/Slo/SloBurnRateRuleState.ts +91 -0
  190. package/Utils/Slo/SloDuration.ts +165 -0
  191. package/Utils/Slo/SloEvaluation.ts +22 -0
  192. package/Utils/Slo/SloHealth.ts +302 -0
  193. package/Utils/Slo/SloStatusColor.ts +54 -0
  194. package/Utils/Slo/SloUtil.ts +637 -0
  195. package/Utils/Slo/SloWidgetFormat.ts +383 -0
  196. package/build/dist/Models/AnalyticsModels/Index.js +4 -0
  197. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  198. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +713 -0
  199. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -0
  200. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +44 -0
  201. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
  202. package/build/dist/Models/AnalyticsModels/SloHistory.js +218 -0
  203. package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -0
  204. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  205. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/NetworkDevice.js +458 -6
  207. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +0 -6
  209. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +779 -0
  211. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -0
  212. package/build/dist/Models/DatabaseModels/NetworkSite.js +1180 -0
  213. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -0
  214. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +534 -0
  215. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -0
  216. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js +629 -0
  217. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js.map +1 -0
  218. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +538 -0
  219. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -0
  220. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +522 -0
  221. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -0
  222. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +1134 -0
  223. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -0
  224. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +769 -0
  225. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -0
  226. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +460 -0
  227. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -0
  228. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +459 -0
  229. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js +130 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js.map +1 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js +31 -0
  233. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js.map +1 -0
  234. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js +36 -0
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js.map +1 -0
  236. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js +49 -0
  237. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js.map +1 -0
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js +140 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js.map +1 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785066759532-MigrationName.js +21 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785066759532-MigrationName.js.map +1 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  244. package/build/dist/Server/Services/AnalyticsDatabaseService.js +23 -6
  245. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  246. package/build/dist/Server/Services/Index.js +24 -0
  247. package/build/dist/Server/Services/Index.js.map +1 -1
  248. package/build/dist/Server/Services/KubernetesCostAllocationService.js +12 -0
  249. package/build/dist/Server/Services/KubernetesCostAllocationService.js.map +1 -0
  250. package/build/dist/Server/Services/MetricService.js +21 -3
  251. package/build/dist/Server/Services/MetricService.js.map +1 -1
  252. package/build/dist/Server/Services/MonitorService.js +19 -0
  253. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  254. package/build/dist/Server/Services/NetworkDeviceService.js +351 -1
  255. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  256. package/build/dist/Server/Services/NetworkEndpointService.js +319 -0
  257. package/build/dist/Server/Services/NetworkEndpointService.js.map +1 -0
  258. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +90 -0
  259. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -0
  260. package/build/dist/Server/Services/NetworkSiteLinkService.js +9 -0
  261. package/build/dist/Server/Services/NetworkSiteLinkService.js.map +1 -0
  262. package/build/dist/Server/Services/NetworkSiteService.js +1038 -0
  263. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -0
  264. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js +9 -0
  265. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js.map +1 -0
  266. package/build/dist/Server/Services/NetworkSiteTypeService.js +9 -0
  267. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -0
  268. package/build/dist/Server/Services/ProjectService.js +98 -2
  269. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  270. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +358 -0
  271. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -0
  272. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +9 -0
  273. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -0
  274. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +9 -0
  275. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -0
  276. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +588 -0
  277. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -0
  278. package/build/dist/Server/Services/SloHistoryService.js +77 -0
  279. package/build/dist/Server/Services/SloHistoryService.js.map +1 -0
  280. package/build/dist/Server/Services/UserNotificationSettingService.js +20 -0
  281. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  282. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +9 -0
  283. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  284. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +15 -0
  285. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  286. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +31 -0
  287. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  288. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +76 -48
  289. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  290. package/build/dist/Server/Utils/Memory.js +9 -1
  291. package/build/dist/Server/Utils/Memory.js.map +1 -1
  292. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +132 -10
  293. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  294. package/build/dist/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  295. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js +77 -0
  296. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js.map +1 -0
  297. package/build/dist/Server/Utils/Monitor/MonitorResource.js +21 -41
  298. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  299. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +152 -40
  300. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  301. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +262 -0
  302. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -0
  303. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +201 -0
  304. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -0
  305. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +152 -120
  306. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  307. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js +44 -0
  308. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js.map +1 -0
  309. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js +10 -10
  310. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js.map +1 -1
  311. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +5 -0
  312. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  313. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +10 -0
  314. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  315. package/build/dist/Types/BaseDatabase/EqualTo.js +9 -1
  316. package/build/dist/Types/BaseDatabase/EqualTo.js.map +1 -1
  317. package/build/dist/Types/BaseDatabase/EqualToOrNull.js +9 -1
  318. package/build/dist/Types/BaseDatabase/EqualToOrNull.js.map +1 -1
  319. package/build/dist/Types/BaseDatabase/NotEqual.js +9 -1
  320. package/build/dist/Types/BaseDatabase/NotEqual.js.map +1 -1
  321. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  322. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  323. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  324. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  325. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js +23 -0
  326. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js.map +1 -0
  327. package/build/dist/Types/Dashboard/DashboardTemplates.js +205 -0
  328. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  329. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  330. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  331. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js +21 -0
  332. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -0
  333. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  334. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  335. package/build/dist/Types/Monitor/MonitorStep.js +5 -5
  336. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  337. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js +8 -0
  338. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js.map +1 -1
  339. package/build/dist/Types/Monitor/MonitorType.js +15 -5
  340. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  341. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js +2 -0
  342. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js.map +1 -0
  343. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js +2 -0
  344. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js.map +1 -0
  345. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +9 -3
  346. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  347. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +217 -3
  348. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
  349. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js +21 -0
  350. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js.map +1 -0
  351. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  352. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  353. package/build/dist/Types/Permission.js +409 -0
  354. package/build/dist/Types/Permission.js.map +1 -1
  355. package/build/dist/Types/ServiceLevelObjective/SliType.js +7 -0
  356. package/build/dist/Types/ServiceLevelObjective/SliType.js.map +1 -0
  357. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js +7 -0
  358. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js.map +1 -0
  359. package/build/dist/Types/ServiceLevelObjective/SloStatus.js +10 -0
  360. package/build/dist/Types/ServiceLevelObjective/SloStatus.js.map +1 -0
  361. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js +7 -0
  362. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js.map +1 -0
  363. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  364. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  365. package/build/dist/UI/Components/Filters/EntityFilter.js +15 -0
  366. package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
  367. package/build/dist/UI/Components/Filters/FilterViewer.js +19 -4
  368. package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
  369. package/build/dist/UI/Components/List/List.js +1 -1
  370. package/build/dist/UI/Components/List/List.js.map +1 -1
  371. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +235 -89
  372. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  373. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js +96 -0
  374. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js.map +1 -0
  375. package/build/dist/UI/Components/Navbar/NavBar.js +14 -2
  376. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  377. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +3 -2
  378. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  379. package/build/dist/UI/Utils/Navigation.js +9 -0
  380. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  381. package/build/dist/UI/Utils/TableFilterUrlState.js +159 -15
  382. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  383. package/build/dist/UI/Utils/TableViewUrlState.js +103 -0
  384. package/build/dist/UI/Utils/TableViewUrlState.js.map +1 -0
  385. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +93 -0
  386. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -0
  387. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  388. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  389. package/build/dist/Utils/IpCanonicalUtil.js +110 -0
  390. package/build/dist/Utils/IpCanonicalUtil.js.map +1 -0
  391. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js +311 -0
  392. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js.map +1 -0
  393. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +98 -5
  394. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  395. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +222 -0
  396. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -0
  397. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js +89 -0
  398. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js.map +1 -0
  399. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +60 -0
  400. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -0
  401. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +76 -0
  402. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -0
  403. package/build/dist/Utils/Slo/SloBurnRateRuleState.js +35 -0
  404. package/build/dist/Utils/Slo/SloBurnRateRuleState.js.map +1 -0
  405. package/build/dist/Utils/Slo/SloDuration.js +87 -0
  406. package/build/dist/Utils/Slo/SloDuration.js.map +1 -0
  407. package/build/dist/Utils/Slo/SloEvaluation.js +21 -0
  408. package/build/dist/Utils/Slo/SloEvaluation.js.map +1 -0
  409. package/build/dist/Utils/Slo/SloHealth.js +179 -0
  410. package/build/dist/Utils/Slo/SloHealth.js.map +1 -0
  411. package/build/dist/Utils/Slo/SloStatusColor.js +18 -0
  412. package/build/dist/Utils/Slo/SloStatusColor.js.map +1 -0
  413. package/build/dist/Utils/Slo/SloUtil.js +393 -0
  414. package/build/dist/Utils/Slo/SloUtil.js.map +1 -0
  415. package/build/dist/Utils/Slo/SloWidgetFormat.js +174 -0
  416. package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -0
  417. package/package.json +2 -2
  418. package/Types/Dashboard/DashboardComponents/Index.ts +0 -7
  419. package/build/dist/Types/Dashboard/DashboardComponents/Index.js +0 -8
  420. package/build/dist/Types/Dashboard/DashboardComponents/Index.js.map +0 -1
@@ -1,68 +1,60 @@
1
- import Monitor from "../../../Models/DatabaseModels/Monitor";
2
1
  import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
3
2
  import NetworkInterface from "../../../Models/DatabaseModels/NetworkInterface";
4
3
  import NetworkDeviceService from "../../Services/NetworkDeviceService";
4
+ import NetworkEndpointService from "../../Services/NetworkEndpointService";
5
5
  import NetworkInterfaceService from "../../Services/NetworkInterfaceService";
6
6
  import LIMIT_MAX from "../../../Types/Database/LimitMax";
7
- import MonitorStep from "../../../Types/Monitor/MonitorStep";
8
7
  import SnmpInterface from "../../../Types/Monitor/SnmpMonitor/SnmpInterface";
8
+ import SnmpMonitorResponse from "../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
9
9
  import LldpNeighbor from "../../../Types/Monitor/SnmpMonitor/LldpNeighbor";
10
10
  import CdpNeighbor from "../../../Types/Monitor/SnmpMonitor/CdpNeighbor";
11
+ import ArpEntry from "../../../Types/Monitor/SnmpMonitor/ArpEntry";
12
+ import FdbEntry from "../../../Types/Monitor/SnmpMonitor/FdbEntry";
13
+ import EndpointAttachmentUtil, {
14
+ EndpointAttachmentResult,
15
+ } from "../../../Utils/Monitor/EndpointAttachmentUtil";
11
16
  import SnmpSystemInfo from "../../../Types/Monitor/SnmpMonitor/SnmpSystemInfo";
12
17
  import SnmpEntityInfo from "../../../Types/Monitor/SnmpMonitor/SnmpEntityInfo";
13
18
  import SnmpVendorTemplateUtil from "../../../Types/Monitor/SnmpMonitor/SnmpVendorTemplate";
14
- import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
15
19
  import ObjectID from "../../../Types/ObjectID";
16
20
  import OneUptimeDate from "../../../Types/Date";
17
21
  import logger from "../Logger";
18
22
 
19
23
  /*
20
24
  * Keeps the NetworkDevice / NetworkInterface inventory in sync with each
21
- * interface walk, then prunes the in-flight response down to MONITORED
25
+ * device walk, then prunes the in-flight response down to MONITORED
22
26
  * interfaces so criteria and metrics only consider ports the user cares
23
27
  * about. Inventory rows always reflect every walked interface; the
24
28
  * isMonitored flag is user-owned and never overwritten here.
29
+ *
30
+ * Called from the device polling pipeline (NetworkDeviceWalkUtil): the
31
+ * device's assigned probe walks it on the device's own schedule, so this
32
+ * runs for every registered device — no Monitor required.
25
33
  */
26
34
  export default class NetworkInventoryUtil {
27
35
  public static async updateFromWalk(data: {
28
- monitor: Monitor;
29
- dataToProcess: ProbeMonitorResponse;
36
+ projectId: ObjectID;
37
+ deviceId: ObjectID;
38
+ snmpResponse: SnmpMonitorResponse | undefined;
39
+ isOnline: boolean | undefined;
30
40
  }): Promise<void> {
31
- const step: MonitorStep | undefined =
32
- data.monitor.monitorSteps?.data?.monitorStepsInstanceArray?.find(
33
- (monitorStep: MonitorStep) => {
34
- return (
35
- monitorStep.id.toString() ===
36
- data.dataToProcess.monitorStepId.toString()
37
- );
38
- },
39
- );
40
-
41
- const deviceIdAsString: string | undefined =
42
- step?.data?.networkDeviceMonitor?.networkDeviceId;
43
-
44
- if (!deviceIdAsString || !data.monitor.projectId) {
45
- return;
46
- }
47
-
48
- const deviceId: ObjectID = new ObjectID(deviceIdAsString);
41
+ const deviceId: ObjectID = data.deviceId;
49
42
 
50
43
  /*
51
- * The device id is read from the monitor's step JSON, which a user can
52
- * set to any UUID through the Monitor API (the dashboard dropdown is
53
- * scoped, but the API is not). Confirm the device actually belongs to
54
- * this monitor's project before writing anything with isRoot — without
55
- * this guard a crafted step could point at another project's device and
56
- * overwrite its inventory (or spawn interfaces under it).
44
+ * Confirm the device belongs to the given project before writing
45
+ * anything with isRoot the walk pipeline resolves projectId from the
46
+ * device row itself, but keep the guard so no future caller can cross
47
+ * project boundaries.
57
48
  */
58
49
  const ownedDevice: NetworkDevice | null =
59
50
  await NetworkDeviceService.findOneBy({
60
51
  query: {
61
52
  _id: deviceId,
62
- projectId: data.monitor.projectId,
53
+ projectId: data.projectId,
63
54
  },
64
55
  select: {
65
56
  _id: true,
57
+ siteId: true,
66
58
  },
67
59
  props: {
68
60
  isRoot: true,
@@ -74,15 +66,19 @@ export default class NetworkInventoryUtil {
74
66
  }
75
67
 
76
68
  const walkedInterfaces: Array<SnmpInterface> =
77
- data.dataToProcess.snmpResponse?.interfaces || [];
69
+ data.snmpResponse?.interfaces || [];
78
70
  const systemInfo: SnmpSystemInfo | undefined =
79
- data.dataToProcess.snmpResponse?.systemInfo;
71
+ data.snmpResponse?.systemInfo;
80
72
  const entityInfo: SnmpEntityInfo | undefined =
81
- data.dataToProcess.snmpResponse?.entityInfo;
73
+ data.snmpResponse?.entityInfo;
82
74
  const lldpNeighbors: Array<LldpNeighbor> | undefined =
83
- data.dataToProcess.snmpResponse?.lldpNeighbors;
75
+ data.snmpResponse?.lldpNeighbors;
84
76
  const cdpNeighbors: Array<CdpNeighbor> | undefined =
85
- data.dataToProcess.snmpResponse?.cdpNeighbors;
77
+ data.snmpResponse?.cdpNeighbors;
78
+ const arpEntries: Array<ArpEntry> | undefined =
79
+ data.snmpResponse?.arpEntries;
80
+ const fdbEntries: Array<FdbEntry> | undefined =
81
+ data.snmpResponse?.fdbEntries;
86
82
 
87
83
  const now: Date = OneUptimeDate.getCurrentDate();
88
84
 
@@ -92,9 +88,9 @@ export default class NetworkInventoryUtil {
92
88
  * derive up/down from its freshness, so bumping it on a failed poll
93
89
  * would paint an unreachable device green. A poll where the probe could
94
90
  * not reach the device reports isOnline === false; treat anything else
95
- * (reachable, or a monitor type that reports no reachability) as seen.
91
+ * (reachable, or a walk that reports no reachability) as seen.
96
92
  */
97
- const isDeviceReachable: boolean = data.dataToProcess.isOnline !== false;
93
+ const isDeviceReachable: boolean = data.isOnline !== false;
98
94
 
99
95
  try {
100
96
  // --- Device enrichment + cached counts ---
@@ -196,129 +192,167 @@ export default class NetworkInventoryUtil {
196
192
  });
197
193
  }
198
194
 
199
- if (walkedInterfaces.length === 0) {
200
- return;
201
- }
202
-
203
- // --- Interface upsert ---
204
- const existingInterfaces: Array<NetworkInterface> =
205
- await NetworkInterfaceService.findBy({
206
- query: {
207
- networkDeviceId: deviceId,
208
- },
209
- select: {
210
- _id: true,
211
- interfaceIndex: true,
212
- isMonitored: true,
213
- },
214
- limit: LIMIT_MAX,
215
- skip: 0,
216
- props: {
217
- isRoot: true,
218
- },
219
- });
195
+ if (walkedInterfaces.length > 0) {
196
+ // --- Interface upsert ---
197
+ const existingInterfaces: Array<NetworkInterface> =
198
+ await NetworkInterfaceService.findBy({
199
+ query: {
200
+ networkDeviceId: deviceId,
201
+ },
202
+ select: {
203
+ _id: true,
204
+ interfaceIndex: true,
205
+ isMonitored: true,
206
+ },
207
+ limit: LIMIT_MAX,
208
+ skip: 0,
209
+ props: {
210
+ isRoot: true,
211
+ },
212
+ });
220
213
 
221
- const existingByIndex: Map<number, NetworkInterface> = new Map();
222
- for (const existing of existingInterfaces) {
223
- if (existing.interfaceIndex !== undefined) {
224
- existingByIndex.set(existing.interfaceIndex, existing);
214
+ const existingByIndex: Map<number, NetworkInterface> = new Map();
215
+ for (const existing of existingInterfaces) {
216
+ if (existing.interfaceIndex !== undefined) {
217
+ existingByIndex.set(existing.interfaceIndex, existing);
218
+ }
225
219
  }
226
- }
227
220
 
228
- const unmonitoredIndexes: Set<number> = new Set();
221
+ const unmonitoredIndexes: Set<number> = new Set();
229
222
 
230
- for (const walked of walkedInterfaces) {
231
- const existing: NetworkInterface | undefined = existingByIndex.get(
232
- walked.interfaceIndex,
233
- );
223
+ for (const walked of walkedInterfaces) {
224
+ const existing: NetworkInterface | undefined = existingByIndex.get(
225
+ walked.interfaceIndex,
226
+ );
234
227
 
235
- if (existing && existing.isMonitored === false) {
236
- unmonitoredIndexes.add(walked.interfaceIndex);
237
- }
228
+ if (existing && existing.isMonitored === false) {
229
+ unmonitoredIndexes.add(walked.interfaceIndex);
230
+ }
238
231
 
239
- const interfaceData: Record<string, unknown> = {
240
- name: (walked.name || "").substring(0, 100),
241
- alias: walked.alias ? walked.alias.substring(0, 100) : null,
242
- macAddress: walked.macAddress
243
- ? walked.macAddress.substring(0, 100)
244
- : null,
245
- interfaceType: walked.interfaceType ?? null,
246
- isOperationallyUp: walked.isOperationallyUp,
247
- isAdministrativelyUp: walked.isAdministrativelyUp,
248
- speedInMbps:
249
- walked.speedInBitsPerSecond !== undefined
250
- ? walked.speedInBitsPerSecond / 1000000
251
- : null,
252
- inRateMbps:
253
- walked.inBitsPerSecond !== undefined
254
- ? Math.round((walked.inBitsPerSecond / 1000000) * 1000) / 1000
232
+ const interfaceData: Record<string, unknown> = {
233
+ name: (walked.name || "").substring(0, 100),
234
+ alias: walked.alias ? walked.alias.substring(0, 100) : null,
235
+ macAddress: walked.macAddress
236
+ ? walked.macAddress.substring(0, 100)
255
237
  : null,
256
- outRateMbps:
257
- walked.outBitsPerSecond !== undefined
258
- ? Math.round((walked.outBitsPerSecond / 1000000) * 1000) / 1000
259
- : null,
260
- utilizationPercent: walked.utilizationPercent ?? null,
261
- errorsPerSecond: walked.errorsPerSecond ?? null,
262
- lastSeenAt: now,
263
- };
238
+ interfaceType: walked.interfaceType ?? null,
239
+ isOperationallyUp: walked.isOperationallyUp,
240
+ isAdministrativelyUp: walked.isAdministrativelyUp,
241
+ speedInMbps:
242
+ walked.speedInBitsPerSecond !== undefined
243
+ ? walked.speedInBitsPerSecond / 1000000
244
+ : null,
245
+ inRateMbps:
246
+ walked.inBitsPerSecond !== undefined
247
+ ? Math.round((walked.inBitsPerSecond / 1000000) * 1000) / 1000
248
+ : null,
249
+ outRateMbps:
250
+ walked.outBitsPerSecond !== undefined
251
+ ? Math.round((walked.outBitsPerSecond / 1000000) * 1000) / 1000
252
+ : null,
253
+ utilizationPercent: walked.utilizationPercent ?? null,
254
+ errorsPerSecond: walked.errorsPerSecond ?? null,
255
+ lastSeenAt: now,
256
+ };
264
257
 
265
- if (existing && existing.id) {
266
- await NetworkInterfaceService.updateOneById({
267
- id: existing.id,
268
- data: interfaceData as any,
269
- props: {
270
- isRoot: true,
271
- },
272
- });
273
- } else {
274
- const newInterface: NetworkInterface = new NetworkInterface();
275
- newInterface.projectId = data.monitor.projectId;
276
- newInterface.networkDeviceId = deviceId;
277
- newInterface.interfaceIndex = walked.interfaceIndex;
278
- newInterface.name = (walked.name || "").substring(0, 100);
279
- if (walked.alias) {
280
- newInterface.alias = walked.alias.substring(0, 100);
281
- }
282
- if (walked.macAddress) {
283
- newInterface.macAddress = walked.macAddress.substring(0, 100);
284
- }
285
- if (walked.interfaceType !== undefined) {
286
- newInterface.interfaceType = walked.interfaceType;
287
- }
288
- newInterface.isMonitored = true;
289
- newInterface.isOperationallyUp = walked.isOperationallyUp;
290
- newInterface.isAdministrativelyUp = walked.isAdministrativelyUp;
291
- if (walked.speedInBitsPerSecond !== undefined) {
292
- newInterface.speedInMbps = walked.speedInBitsPerSecond / 1000000;
258
+ if (existing && existing.id) {
259
+ await NetworkInterfaceService.updateOneById({
260
+ id: existing.id,
261
+ data: interfaceData as any,
262
+ props: {
263
+ isRoot: true,
264
+ },
265
+ });
266
+ } else {
267
+ const newInterface: NetworkInterface = new NetworkInterface();
268
+ newInterface.projectId = data.projectId;
269
+ newInterface.networkDeviceId = deviceId;
270
+ newInterface.interfaceIndex = walked.interfaceIndex;
271
+ newInterface.name = (walked.name || "").substring(0, 100);
272
+ if (walked.alias) {
273
+ newInterface.alias = walked.alias.substring(0, 100);
274
+ }
275
+ if (walked.macAddress) {
276
+ newInterface.macAddress = walked.macAddress.substring(0, 100);
277
+ }
278
+ if (walked.interfaceType !== undefined) {
279
+ newInterface.interfaceType = walked.interfaceType;
280
+ }
281
+ newInterface.isMonitored = true;
282
+ newInterface.isOperationallyUp = walked.isOperationallyUp;
283
+ newInterface.isAdministrativelyUp = walked.isAdministrativelyUp;
284
+ if (walked.speedInBitsPerSecond !== undefined) {
285
+ newInterface.speedInMbps = walked.speedInBitsPerSecond / 1000000;
286
+ }
287
+ newInterface.lastSeenAt = now;
288
+
289
+ await NetworkInterfaceService.create({
290
+ data: newInterface,
291
+ props: {
292
+ isRoot: true,
293
+ },
294
+ });
293
295
  }
294
- newInterface.lastSeenAt = now;
296
+ }
295
297
 
296
- await NetworkInterfaceService.create({
297
- data: newInterface,
298
- props: {
299
- isRoot: true,
298
+ /*
299
+ * Prune the in-flight response to monitored interfaces only, so
300
+ * criteria (interface down / utilization / errors) and per-interface
301
+ * metrics ignore ports the user muted. The inventory above keeps the
302
+ * full picture.
303
+ */
304
+ if (unmonitoredIndexes.size > 0 && data.snmpResponse) {
305
+ data.snmpResponse.interfaces = walkedInterfaces.filter(
306
+ (walked: SnmpInterface) => {
307
+ return !unmonitoredIndexes.has(walked.interfaceIndex);
300
308
  },
301
- });
309
+ );
302
310
  }
303
311
  }
304
312
 
305
313
  /*
306
- * Prune the in-flight response to monitored interfaces only, so
307
- * criteria (interface down / utilization / errors) and per-interface
308
- * metrics ignore ports the user muted. The inventory above keeps the
309
- * full picture.
314
+ * --- Endpoint discovery (ARP/FDB) ---
315
+ * Only when the walk carries the endpoint arrays — walks with endpoint
316
+ * collection off omit them and must flow through this function exactly
317
+ * as before. The pure attachment logic strips uplink/self/transit
318
+ * MACs; the service applies the FDB-over-ARP precedence rules per
319
+ * (project, MAC).
310
320
  */
311
- if (unmonitoredIndexes.size > 0 && data.dataToProcess.snmpResponse) {
312
- data.dataToProcess.snmpResponse.interfaces = walkedInterfaces.filter(
313
- (walked: SnmpInterface) => {
314
- return !unmonitoredIndexes.has(walked.interfaceIndex);
315
- },
316
- );
321
+ if (fdbEntries !== undefined || arpEntries !== undefined) {
322
+ const endpointResult: EndpointAttachmentResult =
323
+ EndpointAttachmentUtil.computeEndpointAttachments({
324
+ deviceId: deviceId.toString(),
325
+ fdbEntries: fdbEntries,
326
+ arpEntries: arpEntries,
327
+ lldpNeighbors: lldpNeighbors,
328
+ cdpNeighbors: cdpNeighbors,
329
+ interfaces: walkedInterfaces.map((walked: SnmpInterface) => {
330
+ return {
331
+ interfaceIndex: walked.interfaceIndex,
332
+ name: walked.name,
333
+ macAddress: walked.macAddress,
334
+ };
335
+ }),
336
+ });
337
+
338
+ if (
339
+ endpointResult.attachments.length > 0 ||
340
+ endpointResult.ipBindings.length > 0
341
+ ) {
342
+ await NetworkEndpointService.upsertDiscoveredEndpoints({
343
+ projectId: data.projectId,
344
+ deviceId: deviceId,
345
+ deviceSiteId: ownedDevice.siteId,
346
+ attachments: endpointResult.attachments,
347
+ ipBindings: endpointResult.ipBindings,
348
+ now: now,
349
+ });
350
+ }
317
351
  }
318
352
  } catch (err) {
319
- // Inventory bookkeeping must never fail the check pipeline.
353
+ // Inventory bookkeeping must never fail the walk pipeline.
320
354
  logger.error(
321
- `Failed to update network inventory for device ${deviceIdAsString}:`,
355
+ `Failed to update network inventory for device ${deviceId.toString()}:`,
322
356
  );
323
357
  logger.error(err);
324
358
  }
@@ -0,0 +1,49 @@
1
+ import { normalizeMac } from "../../../Utils/Monitor/EndpointAttachmentUtil";
2
+ import OuiVendorsJson from "./Data/OuiVendors.json";
3
+
4
+ /*
5
+ * MAC OUI → hardware vendor lookup for discovered network endpoints.
6
+ *
7
+ * Data/OuiVendors.json is generated from the IEEE MA-L registry:
8
+ * source: https://standards-oui.ieee.org/oui/oui.csv
9
+ * fetched: 2026-07-22
10
+ * filter: organization name contains (case-insensitive substring) any of:
11
+ * Cisco, Meraki, Aruba, Hewlett Packard, HPE, Ubiquiti, MikroTik,
12
+ * Juniper, Fortinet, Palo Alto, Ruckus, Extreme, Netgear, TP-Link,
13
+ * D-Link, Zyxel, Dell, Intel, VMware, Raspberry Pi, NCR, Toshiba,
14
+ * Elo Touch, Epson, Star Micronics, Zebra, Honeywell, Datalogic,
15
+ * Verifone, Ingenico, PAX, Clover, Samsung, LG Electronics, Sony,
16
+ * Apple, Microsoft, Axis Communications, Bose, Sonos, Brother,
17
+ * Canon, Xerox, Lexmark
18
+ * shape: { "<6 lowercase hex chars, no separators>": "<Organization
19
+ * Name from the registry row>" }, keys sorted ascending.
20
+ *
21
+ * Values are the registry's own organization names ("Cisco Systems, Inc",
22
+ * "Raspberry Pi Foundation", …), not the filter labels. To refresh, re-run
23
+ * the same fetch + filter and regenerate the file; keep it well under 400KB
24
+ * (the network/POS-focused filter above lands around 240KB).
25
+ *
26
+ * Only 24-bit MA-L (OUI) prefixes are supported — the 28/36-bit MA-M/MA-S
27
+ * registries are intentionally out of scope.
28
+ */
29
+
30
+ const vendorByOuiPrefix: Record<string, string> = OuiVendorsJson as Record<
31
+ string,
32
+ string
33
+ >;
34
+
35
+ export default class OuiLookupUtil {
36
+ /*
37
+ * Returns the registered vendor for a MAC address, or undefined when the
38
+ * MAC is malformed or its OUI is not in the (filtered) registry data.
39
+ * Accepts any spelling normalizeMac understands.
40
+ */
41
+ public static lookupVendor(mac: string | undefined): string | undefined {
42
+ const normalized: string | undefined = normalizeMac(mac);
43
+ if (!normalized) {
44
+ return undefined;
45
+ }
46
+ const prefix: string = normalized.replace(/:/g, "").substring(0, 6);
47
+ return vendorByOuiPrefix[prefix];
48
+ }
49
+ }
@@ -1,35 +1,39 @@
1
1
  import { JSONObject } from "../../../Types/JSON";
2
2
  import SnmpInterface from "../../../Types/Monitor/SnmpMonitor/SnmpInterface";
3
- import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
3
+ import SnmpMonitorResponse from "../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
4
4
  import OneUptimeDate from "../../../Types/Date";
5
5
  import logger from "../Logger";
6
6
 
7
7
  /*
8
8
  * Computes per-interface rates (bandwidth, utilization, errors) for SNMP
9
- * monitors by comparing the cumulative IF-MIB counters of the current check
10
- * against the previous check stored in MonitorProbe.lastMonitoringLog.
9
+ * walks by comparing the cumulative IF-MIB counters of the current walk
10
+ * against the previous walk stored in NetworkDevice.lastWalkLog.
11
11
  *
12
12
  * Probes stay stateless — the delta is computed here, on ingest, before the
13
- * response is persisted. Negative deltas (counter wrap or device reboot) are
14
- * skipped for that interface; rates resume on the following check.
13
+ * walk is persisted. Negative deltas (counter wrap or device reboot) are
14
+ * skipped for that interface; rates resume on the following walk.
15
15
  */
16
16
  export default class SnmpInterfaceRateUtil {
17
17
  public static attachInterfaceRates(data: {
18
- probeMonitorResponse: ProbeMonitorResponse;
19
- previousStepLog: JSONObject | undefined;
18
+ snmpResponse: SnmpMonitorResponse | undefined;
19
+ /*
20
+ * The device's previous walk: `{ snmpResponse, monitoredAt }` as stored
21
+ * in NetworkDevice.lastWalkLog. Undefined on a device's first walk.
22
+ */
23
+ previousWalkLog: JSONObject | undefined;
20
24
  }): void {
21
25
  const interfaces: Array<SnmpInterface> | undefined =
22
- data.probeMonitorResponse.snmpResponse?.interfaces;
26
+ data.snmpResponse?.interfaces;
23
27
 
24
28
  if (!interfaces || interfaces.length === 0) {
25
29
  return;
26
30
  }
27
31
 
28
- if (!data.previousStepLog) {
32
+ if (!data.previousWalkLog) {
29
33
  return;
30
34
  }
31
35
 
32
- const previousSnmpResponse: JSONObject | undefined = data.previousStepLog[
36
+ const previousSnmpResponse: JSONObject | undefined = data.previousWalkLog[
33
37
  "snmpResponse"
34
38
  ] as JSONObject | undefined;
35
39
 
@@ -37,7 +41,7 @@ export default class SnmpInterfaceRateUtil {
37
41
  previousSnmpResponse?.["interfaces"] as Array<JSONObject> | undefined;
38
42
 
39
43
  const previousMonitoredAtValue: unknown =
40
- data.previousStepLog["monitoredAt"];
44
+ data.previousWalkLog["monitoredAt"];
41
45
 
42
46
  if (
43
47
  !previousInterfaces ||
@@ -56,7 +60,7 @@ export default class SnmpInterfaceRateUtil {
56
60
  }
57
61
 
58
62
  /*
59
- * lastMonitoringLog stores server receipt time as monitoredAt, so the
63
+ * lastWalkLog stores server receipt time as monitoredAt, so the
60
64
  * current side of the delta uses server time too.
61
65
  */
62
66
  const elapsedSeconds: number =
@@ -163,7 +167,7 @@ export default class SnmpInterfaceRateUtil {
163
167
  }
164
168
 
165
169
  logger.debug(
166
- `Attached SNMP interface rates for monitor ${data.probeMonitorResponse.monitorId.toString()} over ${round(elapsedSeconds)}s window`,
170
+ `Attached SNMP interface rates over ${round(elapsedSeconds)}s window`,
167
171
  );
168
172
  }
169
173
  }
@@ -68,9 +68,13 @@ const templateDashboardLinkVariableMap: Partial<
68
68
  [WhatsAppTemplateIds.VerificationCode]: "dashboard_link",
69
69
  };
70
70
 
71
- const templateIdByEventType: Record<
72
- NotificationSettingEventType,
73
- WhatsAppTemplateId
71
+ /*
72
+ * Partial: not every notification event type has a WhatsApp template (e.g.
73
+ * SLO status changes). getWhatsAppTemplateIdForEventType throws for event
74
+ * types without a registered template.
75
+ */
76
+ const templateIdByEventType: Partial<
77
+ Record<NotificationSettingEventType, WhatsAppTemplateId>
74
78
  > = {
75
79
  [NotificationSettingEventType.SEND_INCIDENT_CREATED_OWNER_NOTIFICATION]:
76
80
  WhatsAppTemplateIds.IncidentCreatedOwnerNotification,