@oneuptime/common 12.0.30 → 12.0.32

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 (645) hide show
  1. package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
  2. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
  3. package/Models/DatabaseModels/AlertSeverity.ts +44 -0
  4. package/Models/DatabaseModels/AlertState.ts +0 -2
  5. package/Models/DatabaseModels/DetectionRule.ts +16 -5
  6. package/Models/DatabaseModels/Domain.ts +1 -1
  7. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
  8. package/Models/DatabaseModels/Incident.ts +1 -1
  9. package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
  10. package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
  11. package/Models/DatabaseModels/Index.ts +4 -0
  12. package/Models/DatabaseModels/MetricType.ts +0 -2
  13. package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
  14. package/Models/DatabaseModels/MonitorTest.ts +0 -2
  15. package/Models/DatabaseModels/NetworkDevice.ts +234 -5
  16. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
  17. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
  18. package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +501 -0
  19. package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
  20. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
  21. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
  22. package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
  23. package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
  24. package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
  25. package/Models/DatabaseModels/StatusPageResource.ts +0 -2
  26. package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
  27. package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
  28. package/Server/API/GlobalConfigAPI.ts +362 -183
  29. package/Server/API/TelemetryAPI.ts +42 -4
  30. package/Server/EnvironmentConfig.ts +112 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.ts +72 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  35. package/Server/Middleware/MultipartFormData.ts +118 -32
  36. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
  37. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
  38. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
  39. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
  40. package/Server/Services/AlertGroupingEngineService.ts +9 -1
  41. package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
  42. package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
  43. package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
  44. package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
  45. package/Server/Services/AlertReminderRuleService.ts +9 -1
  46. package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
  47. package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
  48. package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
  49. package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
  50. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
  51. package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
  52. package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
  53. package/Server/Services/DatabaseService.ts +39 -9
  54. package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
  55. package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
  56. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
  57. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
  58. package/Server/Services/HostLabelRuleEngineService.ts +9 -1
  59. package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
  60. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
  61. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
  62. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
  63. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
  64. package/Server/Services/IncidentGroupingEngineService.ts +9 -1
  65. package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
  66. package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
  67. package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
  68. package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
  69. package/Server/Services/IncidentReminderRuleService.ts +9 -1
  70. package/Server/Services/IncidentSlaRuleService.ts +9 -1
  71. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
  72. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
  73. package/Server/Services/Index.ts +4 -0
  74. package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
  75. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
  76. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
  77. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
  78. package/Server/Services/KubernetesResourceService.ts +5 -1
  79. package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
  80. package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
  81. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
  82. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
  83. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
  84. package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
  85. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
  86. package/Server/Services/NetworkDeviceRoleService.ts +90 -0
  87. package/Server/Services/NetworkDeviceService.ts +209 -1
  88. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
  89. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
  90. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
  91. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
  92. package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
  93. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
  94. package/Server/Services/ProjectService.ts +85 -0
  95. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
  96. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
  97. package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
  98. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
  99. package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
  100. package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
  101. package/Server/Services/RunbookRuleEngineService.ts +9 -1
  102. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
  103. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
  104. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
  105. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
  106. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
  107. package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
  108. package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
  109. package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
  110. package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
  111. package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
  112. package/Server/Services/TelemetrySourceMapService.ts +266 -23
  113. package/Server/Services/UserNotificationSettingService.ts +0 -6
  114. package/Server/Services/UserService.ts +27 -0
  115. package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
  116. package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
  117. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
  118. package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
  119. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
  120. package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
  121. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
  122. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
  123. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
  124. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
  125. package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
  126. package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
  127. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
  128. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
  129. package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
  130. package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
  131. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +31 -1
  132. package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
  133. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
  134. package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -0
  135. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
  136. package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
  137. package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +318 -0
  138. package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
  139. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +590 -0
  140. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
  141. package/Tests/App/Dashboard/SideMenuHarness.tsx +11 -3
  142. package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
  143. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
  144. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
  145. package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +543 -0
  146. package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
  147. package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
  148. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
  149. package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
  150. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
  151. package/Tests/Server/Infrastructure/Postgres/NetworkDeviceRoleTableMigration.test.ts +476 -0
  152. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
  153. package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
  154. package/Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts +215 -0
  155. package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
  156. package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
  157. package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
  158. package/Tests/Server/Services/NetworkDeviceRoleModel.test.ts +672 -0
  159. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
  160. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
  161. package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
  162. package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -0
  163. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
  164. package/Tests/Server/Services/UserNotificationSettingMonitorDefaults.test.ts +248 -0
  165. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +43 -2
  166. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
  167. package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
  168. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
  169. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
  170. package/Tests/Server/Utils/BasicCron.test.ts +283 -0
  171. package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
  172. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
  173. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
  174. package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +174 -0
  175. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
  176. package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
  177. package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
  178. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
  179. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
  180. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
  181. package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
  182. package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
  183. package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
  184. package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
  185. package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
  186. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
  187. package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
  188. package/Tests/Types/NetworkDevice/DefaultNetworkDeviceRole.test.ts +417 -0
  189. package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
  190. package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
  191. package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
  192. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
  193. package/Tests/UI/Components/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
  194. package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
  195. package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
  196. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
  197. package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
  198. package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
  199. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
  200. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
  201. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
  202. package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
  203. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
  204. package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
  205. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
  206. package/Tests/UI/Components/SideMenuItem.test.tsx +30 -0
  207. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
  208. package/Tests/UI/Components/XAxis.test.ts +270 -5
  209. package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
  210. package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
  211. package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
  212. package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
  213. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +30 -0
  214. package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
  215. package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
  216. package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -0
  217. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
  218. package/Tests/Utils/Monitor/NetworkDeviceRoleCatalog.test.ts +981 -0
  219. package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -0
  220. package/Tests/Utils/NetworkDevice/DeviceRoleKeyUtil.test.ts +538 -0
  221. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
  222. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
  223. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
  224. package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
  225. package/Tests/Utils/Slo/SloEvaluation.test.ts +171 -0
  226. package/Tests/Utils/Slug.test.ts +61 -1
  227. package/Tests/jest.setup.ts +19 -0
  228. package/Types/Date.ts +39 -0
  229. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +61 -0
  230. package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
  231. package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -0
  232. package/Types/Permission.ts +141 -0
  233. package/Types/Rum/SessionReplay.ts +21 -0
  234. package/Types/Telemetry/SourceMap.ts +8 -0
  235. package/UI/Components/Charts/Area/AreaChart.tsx +7 -0
  236. package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
  237. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
  238. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
  239. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
  240. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
  241. package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
  242. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +554 -545
  243. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +337 -371
  244. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +549 -540
  245. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
  246. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
  247. package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
  248. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  249. package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
  250. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
  251. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
  252. package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
  253. package/UI/Components/Charts/Utils/XAxis.ts +125 -18
  254. package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
  255. package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
  256. package/UI/Components/Feed/FeedItem.tsx +4 -5
  257. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
  258. package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
  259. package/UI/Components/Image/Image.tsx +20 -3
  260. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  261. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
  262. package/UI/Components/ModelTable/BaseModelTable.tsx +200 -39
  263. package/UI/Components/Navbar/NavBar.tsx +62 -13
  264. package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
  265. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
  266. package/UI/Components/SideMenu/SideMenu.tsx +12 -2
  267. package/UI/Components/SideMenu/SideMenuItem.tsx +4 -1
  268. package/UI/Components/SideMenu/SideMenuSection.tsx +14 -2
  269. package/UI/Components/Table/TableHeader.tsx +64 -48
  270. package/UI/Components/Table/TableRow.tsx +13 -3
  271. package/UI/Styles/Theme.css +38 -0
  272. package/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
  273. package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -0
  274. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
  275. package/Utils/Monitor/NetworkDeviceRoleCatalog.ts +232 -0
  276. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
  277. package/Utils/Monitor/NetworkTopologyUtil.ts +116 -33
  278. package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
  279. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
  280. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
  281. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
  282. package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
  283. package/Utils/Rules/RuleEngineLimits.ts +32 -0
  284. package/Utils/Rules/RulePatternMatchUtil.ts +1 -1
  285. package/Utils/Slug.ts +34 -1
  286. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
  287. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
  288. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
  289. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
  290. package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
  291. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
  293. package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
  295. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Domain.js +1 -1
  297. package/build/dist/Models/DatabaseModels/Domain.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
  299. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  300. package/build/dist/Models/DatabaseModels/Incident.js +1 -1
  301. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
  303. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
  305. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  307. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
  309. package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +0 -2
  311. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
  313. package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/NetworkDevice.js +239 -6
  315. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
  317. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +521 -0
  320. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
  321. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
  322. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
  323. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -1
  324. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  325. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
  326. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  327. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
  328. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
  330. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
  331. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
  332. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
  333. package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
  334. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  335. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
  336. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
  338. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
  339. package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
  340. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  341. package/build/dist/Server/API/TelemetryAPI.js +31 -3
  342. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  343. package/build/dist/Server/EnvironmentConfig.js +83 -0
  344. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js.map +1 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  353. package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
  354. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  355. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
  356. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  357. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
  358. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  359. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
  360. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  361. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
  362. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  363. package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
  364. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  365. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
  366. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  367. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
  368. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  369. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
  370. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  371. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
  372. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  373. package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
  374. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  375. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
  376. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  377. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
  378. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  379. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
  380. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  381. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
  382. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  383. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
  384. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  385. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
  386. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  387. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
  388. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  389. package/build/dist/Server/Services/DatabaseService.js +31 -5
  390. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  391. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
  392. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  393. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
  394. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  395. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
  396. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  397. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
  398. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  399. package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
  400. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  401. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
  402. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
  404. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
  406. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  407. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
  408. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  409. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
  410. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  411. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
  412. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
  414. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  415. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
  416. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  417. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
  418. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  419. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
  420. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  421. package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
  422. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  423. package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
  424. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  425. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
  426. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  427. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
  428. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  429. package/build/dist/Server/Services/Index.js +4 -0
  430. package/build/dist/Server/Services/Index.js.map +1 -1
  431. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
  432. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  433. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
  434. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  435. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
  436. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  437. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
  438. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  439. package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
  440. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  441. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
  442. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  443. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
  444. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  445. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
  446. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  447. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
  448. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  449. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
  450. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  451. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
  452. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
  453. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
  454. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  455. package/build/dist/Server/Services/NetworkDeviceRoleService.js +70 -0
  456. package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
  457. package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
  458. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  459. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
  460. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  461. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
  462. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  463. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
  464. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  465. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
  466. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  467. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
  468. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  469. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
  470. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  471. package/build/dist/Server/Services/ProjectService.js +65 -0
  472. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  473. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
  474. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  475. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
  476. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  477. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
  478. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  479. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
  480. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  481. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
  482. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  483. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
  484. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  485. package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
  486. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  487. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
  488. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  489. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
  490. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  491. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
  492. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  493. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
  494. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  495. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
  496. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  497. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
  498. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  499. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
  500. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  501. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
  502. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  503. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
  504. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  505. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
  506. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  507. package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
  508. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
  509. package/build/dist/Server/Services/UserNotificationSettingService.js +0 -1
  510. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  511. package/build/dist/Server/Services/UserService.js +25 -0
  512. package/build/dist/Server/Services/UserService.js.map +1 -1
  513. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
  514. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  515. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
  516. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  517. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
  518. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
  519. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
  520. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
  521. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
  522. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  523. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
  524. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  525. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
  526. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  527. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
  528. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  529. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
  530. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  531. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
  532. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  533. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
  534. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  535. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
  536. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
  537. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
  538. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
  539. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
  540. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  541. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
  542. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
  543. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
  544. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
  545. package/build/dist/Types/Date.js +27 -0
  546. package/build/dist/Types/Date.js.map +1 -1
  547. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
  548. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
  549. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js +105 -0
  550. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js.map +1 -0
  551. package/build/dist/Types/Permission.js +126 -0
  552. package/build/dist/Types/Permission.js.map +1 -1
  553. package/build/dist/Types/Rum/SessionReplay.js +19 -0
  554. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  555. package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
  556. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
  558. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
  560. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
  562. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
  563. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
  564. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
  565. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
  566. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
  567. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
  568. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
  569. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +262 -234
  570. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  571. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +146 -153
  572. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  573. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +261 -233
  574. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  575. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
  576. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
  577. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  578. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  579. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
  580. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
  581. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
  582. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  583. package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
  584. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  585. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
  586. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  587. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
  588. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  589. package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
  590. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  591. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
  592. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  593. package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
  594. package/build/dist/UI/Components/Image/Image.js +6 -1
  595. package/build/dist/UI/Components/Image/Image.js.map +1 -1
  596. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  597. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  598. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  599. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  600. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +143 -36
  601. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  602. package/build/dist/UI/Components/Navbar/NavBar.js +44 -9
  603. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  604. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  605. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  606. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +1 -1
  607. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  608. package/build/dist/UI/Components/SideMenu/SideMenu.js +9 -6
  609. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  610. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +1 -1
  611. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  612. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +7 -2
  613. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  614. package/build/dist/UI/Components/Table/TableHeader.js +20 -22
  615. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  616. package/build/dist/UI/Components/Table/TableRow.js +13 -4
  617. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  618. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
  619. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
  620. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
  621. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
  622. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
  623. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
  624. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js +126 -0
  625. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
  626. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
  627. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
  628. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +67 -32
  629. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  630. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js +114 -0
  631. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
  632. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  633. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
  636. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  637. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
  638. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
  639. package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
  640. package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
  641. package/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
  642. package/build/dist/Utils/Slug.js +31 -1
  643. package/build/dist/Utils/Slug.js.map +1 -1
  644. package/jest.config.json +1 -0
  645. package/package.json +2 -2
@@ -1,4 +1,5 @@
1
1
  import NetworkTopology, {
2
+ NetworkTopologyDeviceRole,
2
3
  NetworkTopologyEdge,
3
4
  NetworkTopologyEdgeEndpoint,
4
5
  NetworkTopologyLinkProtocol,
@@ -13,6 +14,13 @@ import {
13
14
  classifyEndpointRole,
14
15
  resolveDeviceRole,
15
16
  } from "./NetworkDeviceRoleUtil";
17
+ import {
18
+ TopologyDeviceRoleInput,
19
+ applyRoleStamp,
20
+ buildDeviceRoleIndex,
21
+ roleKeyForNode,
22
+ stampForRoleKey,
23
+ } from "./NetworkDeviceRoleCatalog";
16
24
  import DeviceReachabilityUtil, {
17
25
  NetworkDeviceReachability,
18
26
  } from "../NetworkDevice/DeviceReachabilityUtil";
@@ -45,11 +53,18 @@ export interface TopologyDeviceInput {
45
53
  sysDescr?: string | undefined;
46
54
  sysObjectId?: string | undefined;
47
55
  /*
48
- * The operator's own answer to what this device is, when they gave one.
49
- * Outranks the classifier below, because it is the only statement about
50
- * the role that is not an inference — and on a device nothing walks it
51
- * is the ONLY statement available at all, the classifier having nothing
52
- * but a hostname to go on.
56
+ * The KEY of the role the operator assigned this device, when they
57
+ * assigned one. Outranks the classifier below, because it is the only
58
+ * statement about the role that is not an inference — and on a device
59
+ * nothing walks it is the ONLY statement available at all, the classifier
60
+ * having nothing but a hostname to go on.
61
+ *
62
+ * A key, not a name: roles are per-project rows an operator can rename, so
63
+ * the caller reads it off the assigned row (NetworkDevice.networkDeviceRole)
64
+ * rather than passing a label. It may be a key outside the built-in twelve
65
+ * — a role the project invented — in which case `role` on the node falls
66
+ * back to the classifier and the node's roleKey/roleLabel/roleShape carry
67
+ * the configured answer instead. See buildTopology's deviceRoles argument.
53
68
  */
54
69
  deviceRole?: string | undefined;
55
70
  /*
@@ -329,9 +344,19 @@ export default class NetworkTopologyUtil {
329
344
  endpoints: Array<TopologyEndpointInput> = [],
330
345
  manualLinks: Array<TopologyManualLinkInput> = [],
331
346
  suppressedNodeKeys: ReadonlySet<string> = new Set<string>(),
347
+ deviceRoles: ReadonlyArray<TopologyDeviceRoleInput> = [],
332
348
  ): TopologyBuildResult {
333
349
  const nodes: Array<NetworkTopologyNode> = [];
334
350
 
351
+ /*
352
+ * The project's configured roles, indexed by key. Passing none is a
353
+ * supported case - the nodes then carry no role stamp and every consumer
354
+ * falls back to the built-in labels, shapes and core set, which is exactly
355
+ * the map drawn before roles were configurable.
356
+ */
357
+ const roleIndex: Map<string, TopologyDeviceRoleInput> =
358
+ buildDeviceRoleIndex(deviceRoles);
359
+
335
360
  /*
336
361
  * Index managed devices by every identifier a neighbor entry could
337
362
  * reference. A key TWO devices both claim is deleted rather than
@@ -384,26 +409,47 @@ export default class NetworkTopologyUtil {
384
409
  device.id,
385
410
  device.isNeighborDiscoveryEnabled,
386
411
  );
387
- nodes.push({
388
- id: device.id,
389
- name: device.name,
390
- isManaged: true,
391
- kind: "device",
392
- role: resolveDeviceRole(device.deviceRole, {
412
+ const deviceRole: NetworkTopologyDeviceRole = resolveDeviceRole(
413
+ device.deviceRole,
414
+ {
393
415
  sysDescr: device.sysDescr,
394
416
  sysObjectId: device.sysObjectId,
395
417
  vendor: device.vendor,
396
418
  deviceModel: device.deviceModel,
397
419
  name: device.name,
398
420
  sysName: device.sysName || device.hostname,
399
- }),
421
+ },
422
+ );
423
+
424
+ const deviceNode: NetworkTopologyNode = {
425
+ id: device.id,
426
+ name: device.name,
427
+ isManaged: true,
428
+ kind: "device",
429
+ role: deviceRole,
400
430
  status: NetworkTopologyUtil.deviceStatus(device, now),
401
431
  interfacesUp: device.interfacesUp,
402
432
  interfacesDown: device.interfacesDown,
403
433
  sysName: device.sysName,
404
434
  vendor: device.vendor,
405
435
  deviceModel: device.deviceModel,
406
- });
436
+ };
437
+
438
+ /*
439
+ * The configured role, when the project has one for this key. The
440
+ * assignment is looked up ahead of the classifier's answer, so a device
441
+ * an operator gave a CUSTOM role ("PoS Terminal") is drawn as that role
442
+ * even though `role` above can only ever be one of the built-in twelve.
443
+ */
444
+ applyRoleStamp(
445
+ deviceNode,
446
+ stampForRoleKey(
447
+ roleKeyForNode(device.deviceRole, deviceRole),
448
+ roleIndex,
449
+ ),
450
+ );
451
+
452
+ nodes.push(deviceNode);
407
453
  }
408
454
 
409
455
  const edgeByKey: Map<string, NetworkTopologyEdge> = new Map();
@@ -465,7 +511,11 @@ export default class NetworkTopologyUtil {
465
511
  NetworkTopologyUtil.propagateMatchesAcrossPeerGroups(resolvedClaims);
466
512
 
467
513
  const peerNodeIdByClaim: Map<ResolvedClaim, string> =
468
- NetworkTopologyUtil.buildUnmanagedPeerNodes(settledClaims, nodes);
514
+ NetworkTopologyUtil.buildUnmanagedPeerNodes(
515
+ settledClaims,
516
+ nodes,
517
+ roleIndex,
518
+ );
469
519
 
470
520
  for (const resolved of settledClaims) {
471
521
  const device: TopologyDeviceInput = resolved.device;
@@ -780,16 +830,18 @@ export default class NetworkTopologyUtil {
780
830
  endpoint.vendor ||
781
831
  endpoint.ipAddress ||
782
832
  endpoint.macAddress;
783
- nodes.push({
833
+ const endpointRole: NetworkTopologyDeviceRole = classifyEndpointRole({
834
+ classification: endpoint.classification,
835
+ vendor: endpoint.vendor,
836
+ name: endpointName,
837
+ });
838
+
839
+ const endpointNode: NetworkTopologyNode = {
784
840
  id: nodeId,
785
841
  name: endpointName,
786
842
  isManaged: false,
787
843
  kind: "endpoint",
788
- role: classifyEndpointRole({
789
- classification: endpoint.classification,
790
- vendor: endpoint.vendor,
791
- name: endpointName,
792
- }),
844
+ role: endpointRole,
793
845
  status: NetworkTopologyUtil.statusFromLastSeen(
794
846
  endpoint.lastSeenAt,
795
847
  now,
@@ -799,7 +851,21 @@ export default class NetworkTopologyUtil {
799
851
  ipAddress: endpoint.ipAddress,
800
852
  classification: endpoint.classification,
801
853
  vlanId: endpoint.vlanId,
802
- });
854
+ };
855
+
856
+ /*
857
+ * Endpoints are stamped too, so a project that renamed "IP phone" sees
858
+ * the new name on the handsets its switches learned. It cannot change
859
+ * where they sit: the layouts put every endpoint in its switch's group
860
+ * box before they ever look at a role, so isCoreLayerRole is inert here
861
+ * by construction rather than by omission.
862
+ */
863
+ applyRoleStamp(
864
+ endpointNode,
865
+ stampForRoleKey(roleKeyForNode(undefined, endpointRole), roleIndex),
866
+ );
867
+
868
+ nodes.push(endpointNode);
803
869
 
804
870
  // Port label + interface state on the switch end, when identifiable.
805
871
  let switchInterface: TopologyInterfaceInput | undefined = undefined;
@@ -1264,6 +1330,10 @@ export default class NetworkTopologyUtil {
1264
1330
  private static buildUnmanagedPeerNodes(
1265
1331
  resolvedClaims: Array<ResolvedClaim>,
1266
1332
  nodes: Array<NetworkTopologyNode>,
1333
+ roleIndex: Map<string, TopologyDeviceRoleInput> = new Map<
1334
+ string,
1335
+ TopologyDeviceRoleInput
1336
+ >(),
1267
1337
  ): Map<ResolvedClaim, string> {
1268
1338
  const unmanagedClaims: Array<ResolvedClaim> = resolvedClaims.filter(
1269
1339
  (resolved: ResolvedClaim) => {
@@ -1359,21 +1429,22 @@ export default class NetworkTopologyUtil {
1359
1429
  usedNodeIds.add(nodeId);
1360
1430
 
1361
1431
  const unmanagedName: string = displayName || "Unknown device";
1362
- nodes.push({
1432
+ /*
1433
+ * Classified from the whole group rather than from whichever
1434
+ * report happened to be first: the platform string is usually the
1435
+ * only real evidence about a peer, and it may well arrive on the
1436
+ * second report of it.
1437
+ */
1438
+ const unmanagedRole: NetworkTopologyDeviceRole = classifyDeviceRole({
1439
+ platform: platform,
1440
+ name: unmanagedName,
1441
+ });
1442
+ const unmanagedNode: NetworkTopologyNode = {
1363
1443
  id: nodeId,
1364
1444
  name: unmanagedName,
1365
1445
  isManaged: false,
1366
1446
  kind: "unmanaged",
1367
- /*
1368
- * Classified from the whole group rather than from whichever
1369
- * report happened to be first: the platform string is usually the
1370
- * only real evidence about a peer, and it may well arrive on the
1371
- * second report of it.
1372
- */
1373
- role: classifyDeviceRole({
1374
- platform: platform,
1375
- name: unmanagedName,
1376
- }),
1447
+ role: unmanagedRole,
1377
1448
  status: "unknown",
1378
1449
  deviceModel: platform,
1379
1450
  /*
@@ -1383,7 +1454,19 @@ export default class NetworkTopologyUtil {
1383
1454
  * they can only look at.
1384
1455
  */
1385
1456
  ipAddress: ipAddress,
1386
- });
1457
+ };
1458
+
1459
+ /*
1460
+ * Stamped for the adopt-a-neighbour flow above all: isSnmpWalkableRole
1461
+ * is what decides whether adopting this peer opens on SNMP polling or on
1462
+ * a monitor, and a peer is exactly the node an operator adopts.
1463
+ */
1464
+ applyRoleStamp(
1465
+ unmanagedNode,
1466
+ stampForRoleKey(roleKeyForNode(undefined, unmanagedRole), roleIndex),
1467
+ );
1468
+
1469
+ nodes.push(unmanagedNode);
1387
1470
 
1388
1471
  for (const resolved of groupClaims) {
1389
1472
  nodeIdByClaim.set(resolved, nodeId);
@@ -0,0 +1,137 @@
1
+ /*
2
+ * Turns a device role's NAME into its stable KEY.
3
+ *
4
+ * Device roles are per-project rows an operator can rename at will, which is
5
+ * exactly why nothing may identify one by its name. The key is what does the
6
+ * identifying: it is what the SNMP classifier's answer is matched against,
7
+ * what a topology payload carries, and what survives the role being renamed.
8
+ *
9
+ * The shape is lowerCamelCase, because the eleven built-in roles seeded into
10
+ * every project already use it ("wirelessAccessPoint", "loadBalancer") and a
11
+ * key derived from the name "Wireless AP" must be able to look like one of
12
+ * them. Anything that is not a letter or a digit is a word boundary, so
13
+ * "PoS Terminal", "pos-terminal" and "POS terminal!" all derive "posTerminal"
14
+ * - near-duplicates collapse rather than multiplying.
15
+ *
16
+ * Pure and dependency-free: the service derives keys with it on the server and
17
+ * the tests exercise it directly.
18
+ */
19
+
20
+ // Keys are stored in a ShortText column; nothing sensible is this long.
21
+ const MAX_KEY_LENGTH: number = 100;
22
+
23
+ /*
24
+ * A name of nothing but punctuation ("---") has no letters to build a key
25
+ * from. Rather than returning an empty string - which would fail the column's
26
+ * NOT NULL and surface as a database error - it falls back to this, and the
27
+ * caller's uniqueness suffixing turns the second one into "role2".
28
+ */
29
+ export const FALLBACK_DEVICE_ROLE_KEY: string = "role";
30
+
31
+ export type DeriveDeviceRoleKeyFunction = (name: string) => string;
32
+
33
+ /**
34
+ * The key for a role named `name`. Deterministic and case-insensitive over
35
+ * word separators: it is safe to call twice and get the same answer.
36
+ */
37
+ export const deriveDeviceRoleKey: DeriveDeviceRoleKeyFunction = (
38
+ name: string,
39
+ ): string => {
40
+ const words: Array<string> = (name || "")
41
+ .split(/[^a-zA-Z0-9]+/)
42
+ .filter((word: string) => {
43
+ return word.length > 0;
44
+ });
45
+
46
+ if (words.length === 0) {
47
+ return FALLBACK_DEVICE_ROLE_KEY;
48
+ }
49
+
50
+ /*
51
+ * A ONE-WORD name is only re-cased at its first letter. A MULTI-word name
52
+ * has its first word lowercased whole, and every later word capitalised at
53
+ * the front with its interior left alone.
54
+ *
55
+ * Both halves are load-bearing, and for different reasons.
56
+ *
57
+ * Lowercasing the head of a multi-word name is what makes the key readable.
58
+ * Re-casing only its first letter turns "PoS Terminal" into "poSTerminal"
59
+ * and "IP phone" into "iPPhone", and this key is a column an operator reads
60
+ * on the settings page. Later words keep their interior for the opposite
61
+ * reason: "Wireless AP" should read as "wirelessAP" and "SD-WAN Edge" as
62
+ * "sdWANEdge", because those acronyms are the boundaries a reader navigates
63
+ * by.
64
+ *
65
+ * Leaving a one-word name alone is what makes every derived key a FIXED
66
+ * POINT of this function. A derived key is always a single run of letters
67
+ * and digits, so re-deriving it takes this branch and returns it unchanged -
68
+ * "wirelessAccessPoint" stays "wirelessAccessPoint", and a key that is
69
+ * accidentally fed back in as a name cannot silently move a role's identity.
70
+ * It is also honest: a name with no word boundaries has no boundaries to
71
+ * normalise.
72
+ */
73
+ const key: string =
74
+ words.length === 1
75
+ ? words[0]!.charAt(0).toLowerCase() + words[0]!.slice(1)
76
+ : words
77
+ .map((word: string, index: number): string => {
78
+ if (index === 0) {
79
+ return word.toLowerCase();
80
+ }
81
+ return word.charAt(0).toUpperCase() + word.slice(1);
82
+ })
83
+ .join("");
84
+
85
+ /*
86
+ * A key starting with a digit ("5gRouter") is still a fine identifier here -
87
+ * it is a lookup key, not a JavaScript name - so only the length is capped.
88
+ */
89
+ return key.slice(0, MAX_KEY_LENGTH);
90
+ };
91
+
92
+ export type BuildUniqueDeviceRoleKeyFunction = (
93
+ name: string,
94
+ takenKeys: ReadonlySet<string>,
95
+ ) => string;
96
+
97
+ /**
98
+ * The key for a role named `name` that no other role in the project holds.
99
+ *
100
+ * Two differently-named roles can derive the same key ("PoS Terminal" and
101
+ * "pos_terminal" both give "posTerminal"), and the column is unique per
102
+ * project, so the second one has to move. It gets a numeric suffix rather than
103
+ * a random one so the result stays readable and stable for a given project
104
+ * state - "posTerminal2", not "posTerminal-f3a9".
105
+ *
106
+ * Comparison is case-insensitive because that is how the key is matched when
107
+ * a role is looked up; two keys differing only in case would collide there.
108
+ */
109
+ export const buildUniqueDeviceRoleKey: BuildUniqueDeviceRoleKeyFunction = (
110
+ name: string,
111
+ takenKeys: ReadonlySet<string>,
112
+ ): string => {
113
+ const taken: Set<string> = new Set<string>();
114
+ for (const key of takenKeys) {
115
+ taken.add(key.trim().toLowerCase());
116
+ }
117
+
118
+ const base: string = deriveDeviceRoleKey(name);
119
+
120
+ if (!taken.has(base.toLowerCase())) {
121
+ return base;
122
+ }
123
+
124
+ /*
125
+ * Bounded so a pathological project cannot spin here. Past the bound the
126
+ * caller gets the base key back and the database's unique constraint
127
+ * rejects the create - a loud, correct failure rather than a hang.
128
+ */
129
+ for (let suffix: number = 2; suffix < 1000; suffix++) {
130
+ const candidate: string = `${base}${suffix}`;
131
+ if (!taken.has(candidate.toLowerCase())) {
132
+ return candidate;
133
+ }
134
+ }
135
+
136
+ return base;
137
+ };
@@ -34,6 +34,12 @@ import ScanTargetUtil from "./ScanTargetUtil";
34
34
  */
35
35
  export interface AutoImportRuleCandidate {
36
36
  monitorTemplateId?: ObjectID | string | null | undefined;
37
+ /*
38
+ * The OID Collection Template imported devices are LINKED to. Purely
39
+ * carried through the matcher: it never affects whether a host matches,
40
+ * only what the resulting device collects.
41
+ */
42
+ oidTemplateId?: ObjectID | string | null | undefined;
37
43
  ipMatchTarget?: string | null | undefined;
38
44
  sysNamePattern?: string | null | undefined;
39
45
  sysDescrPattern?: string | null | undefined;
@@ -6,6 +6,7 @@ import SnmpScanConfigUtil, {
6
6
  DiscoveryScanSnmpConfig,
7
7
  } from "./SnmpScanConfigUtil";
8
8
  import { monitoringMethodForDiscoveredHost } from "./DiscoveryImportEligibility";
9
+ import { normalizeReverseDnsName } from "./ReverseDnsNameUtil";
9
10
 
10
11
  /*
11
12
  * One discovered host -> one NetworkDevice, the same way everywhere.
@@ -38,14 +39,84 @@ function truncate(value: string, maxLength: number): string {
38
39
  return value.length > maxLength ? value.substring(0, maxLength) : value;
39
40
  }
40
41
 
41
- /** The name a discovered host imports under: its sysName, or its address. */
42
- export function buildDeviceName(host: DiscoveredNetworkDevice): string {
43
- return truncate(
44
- (host.sysName || "").trim() || host.ipAddress,
45
- MAX_DEVICE_NAME_LENGTH,
42
+ /**
43
+ * What a discovered host is CALLED — in the Review dialog, and (clamped by
44
+ * `buildDeviceName`) on the device it imports as.
45
+ *
46
+ * Three sources, in this order, first non-empty wins:
47
+ *
48
+ * 1. `sysName`, the name the device gives for itself over SNMP. It stays
49
+ * first because it always has been, and because it is the one name the
50
+ * device itself asserts: demoting it would silently rename devices that
51
+ * import correctly today, which nobody asked for.
52
+ * 2. `dnsHostname`, its reverse-DNS (PTR) name (OneUptime issue #3529).
53
+ * This is the whole point of the addition, and it lands exactly where
54
+ * the complaint was: a host with no readable SNMP has no sysName, so
55
+ * before this it fell straight through to its address. On an estate that
56
+ * keeps DNS records — the reporter's does — that turns a review list of
57
+ * "10.18.166.51, 10.18.166.53, ..." into names an operator recognises.
58
+ * 3. The address, unchanged, when neither name exists.
59
+ *
60
+ * Split out of `buildDeviceName` so the dashboard row and the device it
61
+ * creates cannot disagree: the operator ticks a box next to a name, and that
62
+ * is the name the device gets. Returned UNTRUNCATED, so a caller that wants
63
+ * the full name can have it; the Review dialog and the import both go through
64
+ * `buildDeviceName`, which clamps, so that what is shown is what is created.
65
+ *
66
+ * TWO CONSEQUENCES OF NAMING A DEVICE BY DNS, both accepted deliberately:
67
+ *
68
+ * - Anything that matches on `NetworkDevice.name` now sees a name the
69
+ * SCANNED NETWORK chose. NetworkSiteAssignmentRule and the label/owner
70
+ * rule engines are the live examples: a rule written against a naming
71
+ * convention will match differently for a host that used to be called
72
+ * "10.18.166.51" and is now called "core-gw.corp.example.com". That is
73
+ * inherent to the feature — the alternative is not naming devices by DNS —
74
+ * and it is why the name is put through ReverseDnsNameUtil rather than
75
+ * trusted. Rules keyed on `hostname` are unaffected: that stays the IP.
76
+ * - Names stop being unique per host. Addresses were; PTR names are not, and
77
+ * a wildcard reverse zone over a DHCP range gives every host in it the
78
+ * same answer. `buildFallbackDeviceName` is the answer to that, and BOTH
79
+ * import paths must use it — the rule engine does, and the dashboard's
80
+ * Review-dialog import does since the same wildcard case made collisions
81
+ * ordinary rather than rare.
82
+ */
83
+ export function getDiscoveredHostDisplayName(
84
+ host: DiscoveredNetworkDevice,
85
+ ): string {
86
+ /*
87
+ * The PTR name is re-normalised here rather than trusted from the column.
88
+ * `discoveredDevices` is jsonb stored verbatim from the probe's payload, so
89
+ * "the probe already checked it" holds only for the probe version that
90
+ * wrote the row — not for a result from an older or a modified probe, and
91
+ * not for a row written straight through the API. This function is the last
92
+ * point before the value becomes a rendered line and a slugified device
93
+ * name, so it is the right place to be sure. See ReverseDnsNameUtil.
94
+ */
95
+ /*
96
+ * `sysName` is read through a typeof guard rather than trusted, for the
97
+ * same reason `dnsHostname` is normalised: both come out of the same
98
+ * verbatim jsonb blob, where the declared TypeScript type is a description
99
+ * of what the probe SHOULD send rather than a guarantee about what is
100
+ * stored. `(42).trim()` is a TypeError, and since this function became the
101
+ * dashboard's name line that TypeError would be thrown during render —
102
+ * taking out the whole Review dialog rather than one row, which is
103
+ * precisely the failure normalizeDiscoveredHosts was written to end.
104
+ */
105
+ const sysName: string =
106
+ typeof host.sysName === "string" ? host.sysName.trim() : "";
107
+
108
+ return (
109
+ sysName ||
110
+ normalizeReverseDnsName(host.dnsHostname) ||
111
+ String(host.ipAddress ?? "")
46
112
  );
47
113
  }
48
114
 
115
+ /** The name a discovered host imports under, clamped to the slug's ceiling. */
116
+ export function buildDeviceName(host: DiscoveredNetworkDevice): string {
117
+ return truncate(getDiscoveredHostDisplayName(host), MAX_DEVICE_NAME_LENGTH);
118
+ }
119
+
49
120
  /**
50
121
  * The fallback name when `buildDeviceName`'s answer is already taken.
51
122
  *
@@ -56,12 +127,42 @@ export function buildDeviceName(host: DiscoveredNetworkDevice): string {
56
127
  * ceiling.
57
128
  */
58
129
  export function buildFallbackDeviceName(host: DiscoveredNetworkDevice): string {
59
- const suffix: string = ` (${host.ipAddress})`;
130
+ /*
131
+ * The address is read through the SAME coercion the display path uses, not
132
+ * straight out of the jsonb.
133
+ *
134
+ * A raw template read turned a missing address into the literal
135
+ * " (undefined)" and an object one into " ([object Object])" — and those
136
+ * tokens are IDENTICAL for every such host, so the fallback produced the
137
+ * same name again and the retry failed on the very duplicate it was
138
+ * retrying. This function exists to break a name collision; a suffix that
139
+ * collides is worse than useless.
140
+ */
141
+ const address: string = String(host.ipAddress ?? "").trim();
142
+
143
+ /*
144
+ * An address-less host gets no suffix at all rather than an empty pair of
145
+ * brackets. There is nothing to tell it apart BY, so the honest outcome is
146
+ * the base name unchanged — the caller's create then fails on the duplicate,
147
+ * which is the truth, instead of succeeding under a name that pretends to
148
+ * carry an address.
149
+ */
150
+ const suffix: string = address ? ` (${address})` : "";
151
+
60
152
  const baseName: string = buildDeviceName(host);
61
153
 
62
- return (
154
+ /*
155
+ * Clamped as a whole, not just the base. `Math.max(1, ...)` keeps a
156
+ * character of the base name however long the suffix is, so an absurd
157
+ * address — the field is never validated on this path, it is whatever the
158
+ * probe wrote — could compose a name past the ceiling and fail the create on
159
+ * the slug's own length, which is the exact overflow the ceiling exists to
160
+ * prevent.
161
+ */
162
+ return truncate(
63
163
  truncate(baseName, Math.max(1, MAX_DEVICE_NAME_LENGTH - suffix.length)) +
64
- suffix
164
+ suffix,
165
+ MAX_DEVICE_NAME_LENGTH,
65
166
  );
66
167
  }
67
168
 
@@ -119,14 +220,40 @@ export function buildNetworkDeviceFromDiscoveredHost(data: {
119
220
  * and decides, which is the existing contract for hand-made devices.
120
221
  */
121
222
  autoApplyVendorHealthTemplate?: boolean | undefined;
223
+ /*
224
+ * The OID Collection Template an auto-import rule linked this device to.
225
+ * Set at create so the device collects its type's OIDs from its very first
226
+ * poll, with nobody having to touch it afterwards.
227
+ */
228
+ oidTemplateId?: ObjectID | undefined;
122
229
  }): NetworkDevice {
123
230
  const host: DiscoveredNetworkDevice = data.host;
124
231
 
125
232
  const device: NetworkDevice = new NetworkDevice();
126
233
  device.projectId = data.projectId;
127
234
  device.name = data.name || buildDeviceName(host);
128
- // The address is the device's hostname AND the registered-host dedup key.
129
- device.hostname = host.ipAddress;
235
+ /*
236
+ * The address is the device's hostname AND the registered-host dedup key.
237
+ *
238
+ * It stays the ADDRESS even when the host resolved a PTR name, which is
239
+ * what issue #3529 asked for in as many words ("retain the IP address as
240
+ * the address/IP field"), and what the rest of the system needs: this
241
+ * column is what the ingest path matches a scan's results against
242
+ * (NetworkDeviceService.getRegisteredHostnames), what the SNMP poller
243
+ * dials, and what a trap's source IP is correlated to. Storing a name here
244
+ * would make a device stop polling the day its reverse zone changed, and
245
+ * would make the same host import twice — once by address, once by name.
246
+ * The PTR record names the device; it does not address it.
247
+ *
248
+ * COERCED, because the dedup key has to be a string. The value comes out of
249
+ * jsonb, and `getRegisteredHostnames` matches it with `Set.has()` against
250
+ * hostnames read back from the database — and `Set.has` does not coerce, so
251
+ * a numeric address stored raw would never match its own registered device
252
+ * and the host would import again on every review. The dashboard path is
253
+ * already covered by normalizeDiscoveredHosts; this makes the builder safe
254
+ * for the rule engine and for any future caller that holds a raw row.
255
+ */
256
+ device.hostname = String(host.ipAddress ?? "").trim();
130
257
 
131
258
  if (host.sysDescr) {
132
259
  device.description = truncate(host.sysDescr, MAX_DEVICE_DESCRIPTION_LENGTH);
@@ -145,6 +272,10 @@ export function buildNetworkDeviceFromDiscoveredHost(data: {
145
272
  return device;
146
273
  }
147
274
 
275
+ if (data.oidTemplateId) {
276
+ device.oidTemplateId = data.oidTemplateId;
277
+ }
278
+
148
279
  if (data.autoApplyVendorHealthTemplate) {
149
280
  device.autoApplyVendorHealthTemplate = true;
150
281
  }
@@ -1,4 +1,5 @@
1
1
  import { DiscoveredNetworkDevice } from "../../Models/DatabaseModels/NetworkDeviceDiscoveryScan";
2
+ import { normalizeReverseDnsName } from "./ReverseDnsNameUtil";
2
3
 
3
4
  /*
4
5
  * Normalisation for a scan's stored results, shared by every reader of the
@@ -40,7 +41,12 @@ function isDiscoveredHostObject(
40
41
  * import, so whether a device already in the inventory got created a
41
42
  * second time depended on which order the probe happened to list them in.
42
43
  *
43
- * All three are fixed here rather than at each call site, so the row the
44
+ * A fourth was added with reverse DNS (issue #3529) and is not a probe bug at
45
+ * all — `dnsHostname` is a value the SCANNED NETWORK chooses, so it is
46
+ * untrusted by construction rather than by accident, and it is normalised
47
+ * here for the same reason: one reading of the payload for every reader.
48
+ *
49
+ * All of them are fixed here rather than at each call site, so the row the
44
50
  * operator sees, the badge above it, the list Import walks, and the hosts an
45
51
  * auto-import rule evaluates can never be working from different readings of
46
52
  * the same payload.
@@ -60,13 +66,59 @@ export function normalizeDiscoveredHosts(
60
66
  * truthy, so it used to pass selectability and import as a Network Device
61
67
  * whose hostname was a single space.
62
68
  */
63
- cleaned.push({
69
+ const normalized: DiscoveredNetworkDevice = {
64
70
  ...host,
65
71
  ipAddress:
66
72
  host.ipAddress === undefined || host.ipAddress === null
67
73
  ? ""
68
74
  : String(host.ipAddress).trim(),
69
- });
75
+ };
76
+
77
+ /*
78
+ * `sysName` is read straight out of the jsonb, its declared type is not
79
+ * enforced by anything, and every reader calls a string method on it. A
80
+ * numeric sysName reached getDiscoveredHostDisplayName and threw inside
81
+ * the Review dialog's render, taking out the whole modal rather than one
82
+ * row — the same failure the null-row case above is about.
83
+ *
84
+ * A non-string is blanked rather than STRINGIFIED, which is where this
85
+ * differs from the address above. `String(null)` is "null" and
86
+ * `String({})` is "[object Object]", and both are truthy — so stringifying
87
+ * would not merely fail to name the host, it would win the naming contest
88
+ * outright and create a device called "null", beating a perfectly good PTR
89
+ * record on the very same row. An empty string is falsy, so naming falls
90
+ * through to `dnsHostname` and then to the address, which is exactly what
91
+ * a host with no readable system name deserves.
92
+ *
93
+ * Only rewritten when it is NOT already a string, so a host that never had
94
+ * the key does not gain an empty one — `sysName` is optional and
95
+ * `"sysName" in host` is a question other code is entitled to ask.
96
+ */
97
+ if (host.sysName !== undefined && typeof host.sysName !== "string") {
98
+ normalized.sysName = "";
99
+ }
100
+
101
+ /*
102
+ * The PTR name gets the same treatment, for a sharper version of the same
103
+ * reason (OneUptime issue #3529): unlike every other field here, its
104
+ * value was chosen by whoever runs DNS for the scanned subnet — routinely
105
+ * not this project — and it is stored verbatim in jsonb. So the rules
106
+ * about what a name may contain are applied on the way OUT of the column
107
+ * as well as on the way in, and anything that fails them is DELETED
108
+ * rather than blanked, so a reader that checks `if (host.dnsHostname)`
109
+ * and a reader that checks `"dnsHostname" in host` cannot disagree.
110
+ */
111
+ const dnsHostname: string | undefined = normalizeReverseDnsName(
112
+ host.dnsHostname,
113
+ );
114
+
115
+ if (dnsHostname) {
116
+ normalized.dnsHostname = dnsHostname;
117
+ } else {
118
+ delete normalized.dnsHostname;
119
+ }
120
+
121
+ cleaned.push(normalized);
70
122
  }
71
123
 
72
124
  // An address the scan reports as registered is registered on every row.