@oneuptime/common 13.0.5 → 13.0.6
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.
- package/Models/AnalyticsModels/AuditLog.ts +81 -1
- package/Models/AnalyticsModels/SecurityEvent.ts +4 -4
- package/Models/DatabaseModels/Alert.ts +62 -0
- package/Models/DatabaseModels/GlobalConfig.ts +1 -1
- package/Models/DatabaseModels/Incident.ts +66 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +74 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +74 -0
- package/Models/DatabaseModels/Index.ts +6 -4
- package/Models/DatabaseModels/NetworkDevice.ts +67 -0
- package/Models/DatabaseModels/NetworkDeviceDiagnostic.ts +746 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +151 -0
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +1 -1
- package/Models/DatabaseModels/Project.ts +41 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +74 -0
- package/Models/DatabaseModels/SecurityEventConnection.ts +11 -11
- package/Models/DatabaseModels/ServiceLevelObjective.ts +185 -8
- package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +746 -43
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +575 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +582 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +16 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +16 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +75 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +1 -1
- package/Server/API/BaseAPI.ts +17 -0
- package/Server/API/BillingInvoiceAPI.ts +343 -30
- package/Server/API/BillingPaymentMethodAPI.ts +126 -5
- package/Server/API/DashboardAPI.ts +96 -2
- package/Server/API/SecurityEventConnectionAPI.ts +141 -11
- package/Server/API/StatusPageAPI.ts +308 -199
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.ts +36 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.ts +516 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.ts +98 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +138 -67
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +213 -84
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +112 -35
- package/Server/Services/AlertLabelRuleEngineService.ts +299 -217
- package/Server/Services/AlertOwnerRuleEngineService.ts +572 -396
- package/Server/Services/AlertPrivacyRuleEngineService.ts +116 -40
- package/Server/Services/AlertService.ts +111 -4
- package/Server/Services/AuditLogService.ts +612 -59
- package/Server/Services/BillingInvoiceService.ts +112 -102
- package/Server/Services/BillingService.ts +539 -11
- package/Server/Services/CephClusterLabelRuleEngineService.ts +170 -109
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +233 -115
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +163 -100
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +236 -115
- package/Server/Services/DashboardLabelRuleEngineService.ts +145 -84
- package/Server/Services/DashboardOwnerRuleEngineService.ts +213 -95
- package/Server/Services/DatabaseService.ts +171 -21
- package/Server/Services/DockerHostLabelRuleEngineService.ts +171 -110
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +233 -115
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +181 -112
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +243 -118
- package/Server/Services/HostLabelRuleEngineService.ts +167 -106
- package/Server/Services/HostOwnerRuleEngineService.ts +229 -111
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +141 -67
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +272 -72
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +112 -35
- package/Server/Services/IncidentEpisodePublicNoteService.ts +24 -0
- package/Server/Services/IncidentLabelRuleEngineService.ts +279 -204
- package/Server/Services/IncidentOwnerRuleEngineService.ts +595 -425
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +117 -44
- package/Server/Services/IncidentPublicNoteService.ts +24 -0
- package/Server/Services/IncidentService.ts +114 -3
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +147 -83
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +221 -100
- package/Server/Services/Index.ts +6 -4
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +145 -84
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +213 -95
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +181 -112
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +243 -118
- package/Server/Services/LabelService.ts +23 -28
- package/Server/Services/MonitorLabelRuleEngineService.ts +152 -92
- package/Server/Services/MonitorOwnerRuleEngineService.ts +220 -104
- package/Server/Services/MonitorProbeService.ts +20 -2
- package/Server/Services/MonitorService.ts +11 -9
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +376 -5
- package/Server/Services/NetworkDeviceDiagnosticService.ts +417 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +147 -83
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +218 -97
- package/Server/Services/NetworkDeviceService.ts +39 -2
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +151 -80
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +222 -97
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +154 -83
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +225 -100
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +171 -110
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +235 -115
- package/Server/Services/ProjectService.ts +111 -10
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +174 -110
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +239 -116
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +137 -73
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +200 -83
- package/Server/Services/RunbookLabelRuleEngineService.ts +146 -84
- package/Server/Services/RunbookOwnerRuleEngineService.ts +216 -95
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +324 -230
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +613 -428
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +24 -0
- package/Server/Services/ScheduledMaintenanceService.ts +43 -14
- package/Server/Services/SecurityEventConnectionService.ts +56 -4
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +143 -74
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +206 -85
- package/Server/Services/ServiceLabelRuleEngineService.ts +172 -110
- package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +1057 -18
- package/Server/Services/ServiceLevelObjectiveFeedService.ts +108 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +793 -97
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +1069 -0
- package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +240 -1
- package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +257 -1
- package/Server/Services/ServiceLevelObjectiveService.ts +1356 -56
- package/Server/Services/ServiceOwnerRuleEngineService.ts +238 -116
- package/Server/Services/StatusPageAnnouncementService.ts +13 -0
- package/Server/Services/StatusPageLabelRuleEngineService.ts +146 -85
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +210 -99
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +28 -232
- package/Server/Services/StatusPageSubscriberService.ts +6 -0
- package/Server/Services/TelemetryUsageBillingService.ts +38 -7
- package/Server/Services/ThreatIntelFeedService.ts +1 -1
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +173 -110
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +238 -116
- package/Server/Services/WorkflowLabelRuleEngineService.ts +145 -84
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +215 -95
- package/Server/Types/Database/UpdateByID.ts +3 -0
- package/Server/Types/Database/UpdateOneBy.ts +7 -0
- package/Server/Utils/AI/AlertAIContextBuilder.ts +19 -0
- package/Server/Utils/AI/IncidentAIContextBuilder.ts +39 -0
- package/Server/Utils/AI/Toolbox/AlertTools.ts +37 -1
- package/Server/Utils/AI/Toolbox/IncidentTools.ts +22 -1
- package/Server/Utils/AI/Toolbox/SloTools.ts +416 -51
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +151 -13
- package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +17 -4
- package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +155 -8
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +16 -0
- package/Server/Utils/Database/RelationValueUtil.ts +106 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +6 -1
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +22 -27
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +3 -1
- package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +50 -20
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +13 -1
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +6 -11
- package/Server/Utils/Rules/MonitorRulePatternValidator.ts +51 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +110 -0
- package/Server/Utils/Rules/RuleRun/RuleApplication.ts +81 -0
- package/Server/Utils/Rules/RuleRun/RuleRunPermission.ts +188 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +803 -0
- package/Server/Utils/Rules/RuleRun/RuleRunner.ts +341 -0
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +3 -2
- package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +6 -4
- package/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.ts +263 -16
- package/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.ts +2101 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +194 -14
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +1 -2
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +38 -7
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +2 -0
- package/Server/Utils/SecurityEvent/Connectors/Types.ts +242 -2
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +1 -1
- package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +3 -3
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +2 -2
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +217 -56
- package/Server/Utils/Slo/SloFeedUtil.ts +200 -0
- package/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.ts +173 -0
- package/Server/Utils/Slo/SloMetricUtil.ts +327 -0
- package/Server/Utils/Slo/SloOwnerReferenceValidator.ts +208 -0
- package/Server/Utils/Slo/SloRecordReferenceValidator.ts +169 -0
- package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +6 -43
- package/Server/Utils/StatusPageResource.ts +50 -5
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +664 -15
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +4 -1
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +307 -0
- package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +289 -0
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +598 -0
- package/Tests/App/Dashboard/BillingDefaultPaymentMethod.test.tsx +1046 -0
- package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +3 -0
- package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +201 -7
- package/Tests/App/Dashboard/BooleanSeriesCriteriaFilterText.test.ts +82 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +16 -1
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +116 -8
- package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +168 -1
- package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +1 -1
- package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +20 -3
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +1095 -1
- package/Tests/App/Dashboard/CorrelateFilterChips.test.tsx +910 -0
- package/Tests/App/Dashboard/CorrelateGraph.test.tsx +3747 -25
- package/Tests/App/Dashboard/CorrelateGraphHelpers.test.ts +1085 -0
- package/Tests/App/Dashboard/CorrelateInspector.test.tsx +1534 -0
- package/Tests/App/Dashboard/CorrelateNodeCard.test.tsx +965 -0
- package/Tests/App/Dashboard/CorrelateResultSummary.test.tsx +1525 -0
- package/Tests/App/Dashboard/CorrelationGraph.test.ts +1030 -0
- package/Tests/App/Dashboard/CorrelationGraphLayout.test.ts +526 -0
- package/Tests/App/Dashboard/DeviceDiagnostics.test.tsx +787 -0
- package/Tests/App/Dashboard/DeviceLatencyTrend.test.tsx +278 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +279 -0
- package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +87 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +443 -8
- package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +340 -0
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +98 -2
- package/Tests/App/Dashboard/ExceptionSegmentedControl.test.tsx +1020 -0
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +268 -47
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1114 -76
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +124 -2
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +279 -176
- package/Tests/App/Dashboard/InvestigationRunDetails.test.tsx +1166 -0
- package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +437 -0
- package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +65 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +5 -0
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +74 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +125 -5
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +1764 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1000 -64
- package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +448 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +739 -189
- package/Tests/App/Dashboard/SecurityEventSeverityPill.test.tsx +233 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +282 -0
- package/Tests/App/Dashboard/SloActiveBurnEventsCard.test.tsx +538 -0
- package/Tests/App/Dashboard/SloBulkActionsArchive.test.tsx +252 -0
- package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +322 -518
- package/Tests/App/Dashboard/SloElement.test.tsx +194 -0
- package/Tests/App/Dashboard/SloFeed.test.tsx +289 -0
- package/Tests/App/Dashboard/SloHistoryCharts.test.tsx +471 -0
- package/Tests/App/Dashboard/SloHistorySeries.test.tsx +607 -0
- package/Tests/App/Dashboard/SloListWidget.test.tsx +783 -0
- package/Tests/App/Dashboard/SloMetricsPage.test.tsx +346 -0
- package/Tests/App/Dashboard/SloMonitorsPage.test.tsx +661 -0
- package/Tests/App/Dashboard/SloMonitorsSummaryCard.test.tsx +489 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +437 -0
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +305 -0
- package/Tests/App/Dashboard/SloOverviewData.test.tsx +563 -0
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +311 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +426 -0
- package/Tests/App/Dashboard/SloOverviewSidebarCards.test.tsx +493 -0
- package/Tests/App/Dashboard/SloSettings.test.tsx +633 -0
- package/Tests/App/Dashboard/SloStatusSummaryCards.test.tsx +403 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +373 -0
- package/Tests/App/Dashboard/SloWidgetVariableBinding.test.tsx +689 -0
- package/Tests/App/Dashboard/TopologyConnectivitySection.test.tsx +206 -0
- package/Tests/App/Dashboard/TracesEntityNames.test.tsx +47 -15
- package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +1312 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +9 -1
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +14 -16
- package/Tests/Models/DatabaseModels/AuditLogModelConfiguration.test.ts +442 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +9 -10
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +48 -1
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +835 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +3 -2
- package/Tests/Models/DiscoveryScanNetbiosLookupColumn.test.ts +328 -0
- package/Tests/Models/DiscoveryScanShortDeviceNamesColumn.test.ts +335 -0
- package/Tests/Models/NetworkDeviceDiagnosticContract.test.ts +194 -0
- package/Tests/Models/NetworkDeviceDnsNameColumn.test.ts +321 -0
- package/Tests/Models/ProjectDataResidencyColumn.test.ts +154 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +181 -50
- package/Tests/Server/API/BaseAPI.test.ts +6 -0
- package/Tests/Server/API/BaseAPIUpdateMiscDataProps.test.ts +217 -0
- package/Tests/Server/API/BillingInvoiceAPI.test.ts +7 -0
- package/Tests/Server/API/BillingInvoiceAPIPaymentStates.test.ts +990 -0
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +498 -0
- package/Tests/Server/API/DashboardPublicSloAPI.test.ts +405 -0
- package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +901 -7
- package/Tests/Server/API/SessionReplayAPI.test.ts +116 -0
- package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +857 -0
- package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +1084 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +33 -3
- package/Tests/Server/Infrastructure/Postgres/AddDataResidencyToProjectMigration.test.ts +202 -0
- package/Tests/Server/Infrastructure/Postgres/AddNetbiosLookupToNetworkDeviceDiscoveryScanMigration.test.ts +330 -0
- package/Tests/Server/Infrastructure/Postgres/AddNetworkDeviceDnsNameAndShortDeviceNamesMigration.test.ts +340 -0
- package/Tests/Server/Infrastructure/Postgres/BackfillSloMonitorRulesAndAffectedResourcesMigration.test.ts +343 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +801 -0
- package/Tests/Server/Services/AddSubscriberUpdateNotificationStatusMigration.test.ts +307 -0
- package/Tests/Server/Services/AuditLogService.test.ts +1124 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +200 -1
- package/Tests/Server/Services/BillingInvoiceServiceMutexRelease.test.ts +254 -0
- package/Tests/Server/Services/BillingService.test.ts +70 -0
- package/Tests/Server/Services/BillingServicePayInvoiceStates.test.ts +723 -0
- package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +14 -2
- package/Tests/Server/Services/BillingServiceSubscriptionPaymentMethodSync.test.ts +1634 -0
- package/Tests/Server/Services/DatabaseServiceAuditRelationDiff.test.ts +492 -0
- package/Tests/Server/Services/DatabaseServicePasswordFieldSecrets.test.ts +629 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +431 -0
- package/Tests/Server/Services/IncidentAlertSloReferenceGuard.test.ts +358 -0
- package/Tests/Server/Services/MonitorProbeServicePastDueMonitoring.test.ts +362 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1460 -1
- package/Tests/Server/Services/NetworkDeviceDiagnosticService.test.ts +962 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +106 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +10 -1
- package/Tests/Server/Services/NetworkDeviceServicePastDueMonitoring.test.ts +335 -0
- package/Tests/Server/Services/NetworkDeviceSiteRuleDnsName.test.ts +568 -0
- package/Tests/Server/Services/ProjectDataResidencyPostgres.test.ts +344 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +187 -0
- package/Tests/Server/Services/ProjectServiceDataResidency.test.ts +369 -0
- package/Tests/Server/Services/ProjectServiceDataResidencySelfHosted.test.ts +176 -0
- package/Tests/Server/Services/ProjectServicePastDueMonitoring.test.ts +289 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +24 -8
- package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +1396 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupARun.test.ts +917 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +1262 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +902 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +1163 -0
- package/Tests/Server/Services/RuleRun/PrivacyRuleEnginesRun.test.ts +843 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +465 -0
- package/Tests/Server/Services/SecurityEventConnectionService.test.ts +525 -4
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +77 -23
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleFeedWrites.test.ts +777 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleOptions.test.ts +1399 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +67 -74
- package/Tests/Server/Services/ServiceLevelObjectiveChildRowTenancy.test.ts +906 -0
- package/Tests/Server/Services/ServiceLevelObjectiveDeleteTenancy.test.ts +1029 -0
- package/Tests/Server/Services/ServiceLevelObjectiveFeedService.test.ts +313 -0
- package/Tests/Server/Services/ServiceLevelObjectiveFeedWrites.test.ts +1214 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMarkdownLink.test.ts +289 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +1455 -430
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleLegacyLabelAdoption.test.ts +634 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +1193 -0
- package/Tests/Server/Services/{SloMonitorLabelRuleHooks.test.ts → ServiceLevelObjectiveMonitorRuleTriggers.test.ts} +135 -41
- package/Tests/Server/Services/ServiceLevelObjectiveOwnerFeedWrites.test.ts +671 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +180 -85
- package/Tests/Server/Services/ServiceLevelObjectiveServiceArchive.test.ts +537 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceLegacyMonitorLabelWrite.test.ts +870 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceMonitorRuleGuard.test.ts +343 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceReEvaluation.test.ts +246 -0
- package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +501 -0
- package/Tests/Server/Services/SloAffectedResourceLinkContract.test.ts +86 -0
- package/Tests/Server/Services/SloAffectedResourceMetricAttributes.test.ts +547 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +10 -4
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +7 -2
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +174 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateServiceVariables.test.ts +40 -0
- package/Tests/Server/Services/SubscriberUpdateNotificationHooks.test.ts +541 -0
- package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +288 -0
- package/Tests/Server/TestingUtils/PastDueMonitoringClaimSql.ts +177 -0
- package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +51 -10
- package/Tests/Server/TestingUtils/__mocks__/Stripe.mock.ts +16 -1
- package/Tests/Server/Types/Database/Permissions/ProjectDataResidencyColumn.test.ts +386 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +26 -36
- package/Tests/Server/Utils/AI/SloAffectedResourceAIContext.test.ts +445 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +423 -1
- package/Tests/Server/Utils/AI/SloToolsArchive.test.ts +294 -0
- package/Tests/Server/Utils/AI/SloToolsRuleReadPermissions.test.ts +297 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +255 -10
- package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +404 -750
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +45 -0
- package/Tests/Server/Utils/Database/RelationValueUtil.test.ts +157 -0
- package/Tests/Server/Utils/Monitor/Criteria/BooleanSeriesEvaluateOverTime.test.ts +260 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +181 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +147 -30
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.test.ts +17 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +136 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidatorLoadOrder.test.ts +472 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +48 -2
- package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +435 -475
- package/Tests/Server/Utils/Rules/MonitorRulePatternValidator.test.ts +77 -0
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +177 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +365 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunRegistry.test.ts +173 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunner.test.ts +675 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +8 -8
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorFetchSummary.test.ts +261 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +68 -13
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsAuth.test.ts → Connectors/GoogleSecOps/GoogleSecOpsAuth.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClient.test.ts → Connectors/GoogleSecOps/GoogleSecOpsClient.test.ts} +4 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.test.ts +483 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorCuratedAndLateAlerts.test.ts +676 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFetchEvents.test.ts +1994 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFixtures.ts +332 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorHttpIntegration.test.ts +680 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorRequestContract.test.ts +1206 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorTestConnection.test.ts +1136 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsCuratedRuleCounts.test.ts +407 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsErrorHandling.test.ts → Connectors/GoogleSecOps/GoogleSecOpsErrorHandling.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingAdaptiveCatchUp.test.ts +730 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClickhouseIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts} +130 -35
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFailureTaxonomy.test.ts +772 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFixtures.ts +648 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsHttpIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingHttpIntegration.test.ts} +230 -225
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingIntegration.test.ts +1390 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingLoop.test.ts +981 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingNothingImportedRegression.test.ts +290 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsRequestContract.test.ts → Connectors/GoogleSecOps/GoogleSecOpsRequestContract.test.ts} +2 -2
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsResponseParsing.test.ts → Connectors/GoogleSecOps/GoogleSecOpsResponseParsing.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsSearchDetections.test.ts → Connectors/GoogleSecOps/GoogleSecOpsSearchDetections.test.ts} +38 -5
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsTesterIntegration.test.ts +421 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +1445 -3
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +14 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +313 -4
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +352 -0
- package/Tests/Server/Utils/Slo/SloFeedUtil.test.ts +326 -0
- package/Tests/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.test.ts +260 -0
- package/Tests/Server/Utils/Slo/SloMetricUtil.test.ts +592 -0
- package/Tests/Server/Utils/Slo/SloRecordReferenceValidator.test.ts +311 -0
- package/Tests/Server/Utils/StatusPageResource.test.ts +91 -3
- package/Tests/Types/Billing/SubscriptionStatus.test.ts +176 -0
- package/Tests/Types/Billing/SubscriptionStatusPastDueMonitoring.test.ts +187 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +53 -7
- package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +816 -792
- package/Tests/Types/Monitor/CriteriaFilter.test.ts +216 -24
- package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepRetriesParsing.test.ts +201 -0
- package/Tests/Types/Rules/RuleRun.test.ts +315 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +60 -0
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +29 -4
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +217 -0
- package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +200 -0
- package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +141 -87
- package/Tests/UI/Components/AlertBanner.test.tsx +319 -0
- package/Tests/UI/Components/BulkArchiveActionsCopy.test.tsx +310 -0
- package/Tests/UI/Components/Detail/DetailIdIsUnique.test.tsx +87 -0
- package/Tests/UI/Components/Dropdown/DropdownClearable.test.tsx +393 -0
- package/Tests/UI/Components/Dropdown/DropdownMultiSelectChipAccessibleName.test.tsx +64 -0
- package/Tests/UI/Components/EmptyState/EmptyState.test.tsx +335 -4
- package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +337 -0
- package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +21 -20
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +15 -2
- package/Tests/UI/Components/LockedFilterChip.test.tsx +281 -144
- package/Tests/UI/Components/MoreMenu.test.tsx +133 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +84 -3
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/RuleRun/RuleDetailFields.test.tsx +336 -0
- package/Tests/UI/Components/RuleRun/RuleTable.test.tsx +304 -0
- package/Tests/UI/Components/RuleRun/RunRuleNowModal.test.tsx +231 -0
- package/Tests/UI/Components/RuleRun/RunRulesBulkAction.test.ts +213 -0
- package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +124 -61
- package/Tests/UI/Rum/ReplayEngine.test.ts +154 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +234 -123
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +122 -0
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +245 -0
- package/Tests/UI/Rum/ReplayRail.test.tsx +294 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +213 -1
- package/Tests/UI/Rum/ReplayStage.test.tsx +565 -172
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +260 -3
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +1391 -0
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +222 -0
- package/Tests/UI/Utils/DashboardStackingLayers.test.ts +8 -1
- package/Tests/UI/Utils/RuleRunClient.test.ts +303 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +1 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +2 -0
- package/Tests/Utils/Dashboard/Components/DashboardSloListComponent.test.ts +206 -0
- package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +36 -2
- package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +409 -588
- package/Tests/Utils/Dashboard/SloWidgetSource.test.ts +351 -0
- package/Tests/Utils/Markdown/MarkdownEscape.test.ts +361 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +1425 -118
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +188 -3
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +661 -13
- package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +349 -0
- package/Tests/Utils/NetworkDiscovery/RunImportedDeviceNaming.test.ts +656 -0
- package/Tests/Utils/NetworkDiscovery/ShortDeviceNamePlanner.test.ts +1020 -0
- package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +619 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +317 -0
- package/Tests/Utils/Project/DataResidency.test.ts +198 -0
- package/Tests/Utils/Rules/RuleRunSummary.test.ts +394 -0
- package/Tests/Utils/Slo/SloAffectedResourceMarkdown.test.ts +302 -0
- package/Tests/Utils/Slo/SloBurnRateTemplate.test.ts +468 -0
- package/Tests/Utils/Slo/SloEvaluation.test.ts +20 -4
- package/Tests/Utils/Slo/SloFeedMarkdown.test.ts +1185 -0
- package/Tests/Utils/Slo/SloHealth.test.ts +262 -0
- package/Tests/Utils/Slo/SloHistoryMetricName.test.ts +102 -0
- package/Tests/Utils/Slo/SloListWidgetFormat.test.ts +522 -0
- package/Tests/Utils/Slo/SloMetricType.test.ts +355 -0
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +387 -0
- package/Tests/Utils/Slo/SloMonitorStatusSummary.test.ts +210 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +226 -0
- package/Tests/Utils/Slo/SloProjection.test.ts +1039 -0
- package/Tests/Utils/Slo/SloWidgetFormat.test.ts +47 -0
- package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +1 -80
- package/Types/BaseDatabase/EnableAuditLogOn.ts +41 -0
- package/Types/Billing/SubscriptionStatus.ts +39 -4
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +5 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +10 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloListComponent.ts +29 -0
- package/Types/Dashboard/DashboardTemplates.ts +290 -297
- package/Types/Database/EnableAuditLog.ts +23 -1
- package/Types/Email/EmailTemplateType.ts +4 -0
- package/Types/Monitor/CriteriaFilter.ts +55 -8
- package/Types/Monitor/MonitorStep.ts +5 -2
- package/Types/Monitor/MonitorStepDnsMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepDnssecMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepDomainMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepExternalStatusPageMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepRetries.ts +59 -0
- package/Types/Monitor/MonitorStepSnmpMonitor.ts +9 -2
- package/Types/NetworkDevice/NetworkDeviceDiagnosticResult.ts +104 -0
- package/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.ts +47 -0
- package/Types/NetworkDevice/NetworkDeviceDiagnosticType.ts +47 -0
- package/Types/NetworkDevice/NetworkDevicePingMetricNames.ts +20 -0
- package/Types/Permission.ts +127 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +5 -0
- package/Types/Rules/RuleRun.ts +518 -0
- package/Types/Rum/SessionReplayApi.ts +18 -0
- package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +6 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +30 -4
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +108 -1
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +6 -2
- package/Types/ServiceLevelObjective/SloHistoryMetricName.ts +25 -0
- package/Types/ServiceLevelObjective/SloMetricType.ts +49 -0
- package/Types/StatusPage/StatusPageSubscriberNotificationEventType.ts +4 -0
- package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +331 -0
- package/Types/StatusPage/SubscriberNotificationTrigger.ts +12 -0
- package/Types/StatusPage/SubscriberUpdateNotification.ts +89 -0
- package/Types/Telemetry/LockedFilterDetail.ts +7 -28
- package/Types/Telemetry/ServiceType.ts +7 -0
- package/Typings/Index.d.ts +53 -3
- package/UI/Components/AlertBanner/AlertBanner.tsx +85 -27
- package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +21 -2
- package/UI/Components/Detail/Detail.tsx +9 -2
- package/UI/Components/Dropdown/Dropdown.tsx +64 -1
- package/UI/Components/EmptyState/EmptyState.tsx +27 -3
- package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +124 -0
- package/UI/Components/Forms/ModelForm.tsx +6 -5
- package/UI/Components/LabelRule/LabelRuleTable.tsx +8 -2
- package/UI/Components/LogsViewer/LogsViewer.tsx +2 -6
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +2 -13
- package/UI/Components/LogsViewer/types.ts +2 -2
- package/UI/Components/MoreMenu/MoreMenu.tsx +14 -3
- package/UI/Components/RuleRun/RuleDetailFields.tsx +359 -0
- package/UI/Components/RuleRun/RuleTable.tsx +183 -0
- package/UI/Components/RuleRun/RuleView.tsx +170 -0
- package/UI/Components/RuleRun/RunRuleNowModal.tsx +147 -0
- package/UI/Components/RuleRun/RunRulesBulkAction.ts +103 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +2 -6
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +38 -104
- package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +2 -18
- package/UI/Components/TelemetryViewer/types.ts +2 -2
- package/UI/Utils/Rules/RuleRunClient.ts +178 -0
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +8 -0
- package/Utils/Dashboard/Components/DashboardSloComponent.ts +19 -2
- package/Utils/Dashboard/Components/DashboardSloListComponent.ts +126 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/Dashboard/SloWidgetSource.ts +188 -0
- package/Utils/Markdown/MarkdownEscape.ts +63 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +161 -36
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +25 -0
- package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +146 -0
- package/Utils/NetworkDiscovery/RunImportedDeviceNaming.ts +390 -0
- package/Utils/NetworkDiscovery/ShortDeviceNamePlanner.ts +291 -0
- package/Utils/NetworkDiscovery/ShortHostnameUtil.ts +91 -0
- package/Utils/NetworkSite/CidrMatchUtil.ts +37 -12
- package/Utils/Project/DataResidency.ts +63 -0
- package/Utils/Rules/RuleRunSummary.ts +323 -0
- package/Utils/Slo/SloAffectedResourceMarkdown.ts +123 -0
- package/Utils/Slo/SloBurnRateTemplate.ts +373 -0
- package/Utils/Slo/SloFeedMarkdown.ts +1507 -0
- package/Utils/Slo/SloHealth.ts +96 -9
- package/Utils/Slo/SloListWidgetFormat.ts +370 -0
- package/Utils/Slo/SloMetricType.ts +237 -0
- package/Utils/Slo/SloMonitorRuleCriteria.ts +364 -0
- package/Utils/Slo/SloMonitorStatusSummary.ts +210 -0
- package/Utils/Slo/SloOverviewText.ts +265 -0
- package/Utils/Slo/SloProjection.ts +967 -0
- package/Utils/Slo/SloWidgetFormat.ts +12 -2
- package/Utils/Telemetry/LockedFilterSearch.ts +3 -49
- package/build/dist/Models/AnalyticsModels/AuditLog.js +70 -1
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +4 -4
- package/build/dist/Models/DatabaseModels/Alert.js +60 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +64 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +6 -4
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +68 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js +772 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +140 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +42 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +11 -11
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +192 -10
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +798 -96
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +596 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +590 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +16 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +16 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +75 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +1 -1
- package/build/dist/Server/API/BaseAPI.js +14 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +233 -19
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +86 -5
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +72 -2
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/SecurityEventConnectionAPI.js +102 -10
- package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +236 -154
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js +21 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js +207 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js +72 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +112 -56
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +167 -68
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +87 -26
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +270 -203
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +498 -354
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +97 -34
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +91 -8
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AuditLogService.js +408 -44
- package/build/dist/Server/Services/AuditLogService.js.map +1 -1
- package/build/dist/Server/Services/BillingInvoiceService.js +94 -85
- package/build/dist/Server/Services/BillingInvoiceService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +406 -14
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +135 -86
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +189 -100
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +125 -18
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +145 -91
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +191 -101
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +190 -102
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +112 -56
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +220 -63
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +87 -26
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +258 -192
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +519 -376
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +95 -32
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +90 -5
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +113 -65
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +6 -4
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +145 -91
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +191 -101
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +20 -25
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +123 -77
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +167 -82
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +18 -2
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +11 -9
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +287 -5
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js +333 -0
- package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +36 -2
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +117 -64
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +173 -83
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +116 -65
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +82 -10
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +111 -63
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +161 -77
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +280 -209
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +521 -376
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +24 -0
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +24 -8
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventConnectionService.js +43 -3
- package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +115 -62
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +163 -77
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +769 -18
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js +96 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +614 -87
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +844 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +207 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +221 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +997 -50
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +191 -102
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageAnnouncementService.js +12 -0
- package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +118 -70
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +158 -76
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +19 -215
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +6 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +27 -5
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +1 -1
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +17 -0
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +31 -0
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +24 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +21 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +337 -53
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +108 -15
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +2 -2
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +115 -6
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +13 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/Database/RelationValueUtil.js +82 -0
- package/build/dist/Server/Utils/Database/RelationValueUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +10 -6
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +17 -21
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +5 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +50 -10
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +13 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +6 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js +34 -0
- package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +69 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js +128 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +746 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js +221 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +6 -4
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.js +174 -14
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js +1417 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +138 -18
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +1 -2
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +23 -18
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +2 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +95 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +3 -3
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +2 -2
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +118 -40
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/Slo/SloFeedUtil.js +150 -0
- package/build/dist/Server/Utils/Slo/SloFeedUtil.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js +136 -0
- package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloMetricUtil.js +269 -0
- package/build/dist/Server/Utils/Slo/SloMetricUtil.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js +134 -0
- package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js +137 -0
- package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +6 -26
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageResource.js +31 -5
- package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
- package/build/dist/Types/Billing/SubscriptionStatus.js +37 -3
- package/build/dist/Types/Billing/SubscriptionStatus.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +5 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +275 -286
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Database/EnableAuditLog.js +19 -1
- package/build/dist/Types/Database/EnableAuditLog.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +4 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -6
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +2 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepRetries.js +47 -0
- package/build/dist/Types/Monitor/MonitorStepRetries.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js.map +1 -1
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js +29 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js +37 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js +42 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js +20 -0
- package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js.map +1 -0
- package/build/dist/Types/Permission.js +114 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +5 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +267 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +16 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +65 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +6 -2
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -1
- package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js +26 -0
- package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloMetricType.js +45 -0
- package/build/dist/Types/ServiceLevelObjective/SloMetricType.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js +4 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js.map +1 -1
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +295 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js +13 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +67 -0
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js +7 -7
- package/build/dist/Types/Telemetry/ServiceType.js +7 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/AlertBanner/AlertBanner.js +48 -19
- package/build/dist/UI/Components/AlertBanner/AlertBanner.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +10 -2
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +12 -3
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -5
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js +3 -3
- package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +47 -0
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +1 -0
- package/build/dist/UI/Components/Forms/ModelForm.js +6 -5
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +6 -2
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +0 -2
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +3 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/RuleRun/RuleDetailFields.js +226 -0
- package/build/dist/UI/Components/RuleRun/RuleDetailFields.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RuleTable.js +97 -0
- package/build/dist/UI/Components/RuleRun/RuleTable.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RuleView.js +83 -0
- package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js +74 -0
- package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js +78 -0
- package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +24 -50
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +0 -4
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Utils/Rules/RuleRunClient.js +98 -0
- package/build/dist/UI/Utils/Rules/RuleRunClient.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +8 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +16 -2
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js +94 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Dashboard/SloWidgetSource.js +125 -0
- package/build/dist/Utils/Dashboard/SloWidgetSource.js.map +1 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js +49 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +112 -34
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +22 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +129 -0
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js +255 -0
- package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js +184 -0
- package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js +79 -0
- package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +21 -12
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
- package/build/dist/Utils/Project/DataResidency.js +51 -0
- package/build/dist/Utils/Project/DataResidency.js.map +1 -0
- package/build/dist/Utils/Rules/RuleRunSummary.js +197 -0
- package/build/dist/Utils/Rules/RuleRunSummary.js.map +1 -0
- package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js +51 -0
- package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js.map +1 -0
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +228 -0
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js.map +1 -0
- package/build/dist/Utils/Slo/SloFeedMarkdown.js +934 -0
- package/build/dist/Utils/Slo/SloFeedMarkdown.js.map +1 -0
- package/build/dist/Utils/Slo/SloHealth.js +75 -9
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloListWidgetFormat.js +217 -0
- package/build/dist/Utils/Slo/SloListWidgetFormat.js.map +1 -0
- package/build/dist/Utils/Slo/SloMetricType.js +212 -0
- package/build/dist/Utils/Slo/SloMetricType.js.map +1 -0
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +216 -0
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -0
- package/build/dist/Utils/Slo/SloMonitorStatusSummary.js +129 -0
- package/build/dist/Utils/Slo/SloMonitorStatusSummary.js.map +1 -0
- package/build/dist/Utils/Slo/SloOverviewText.js +110 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -0
- package/build/dist/Utils/Slo/SloProjection.js +448 -0
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -0
- package/build/dist/Utils/Slo/SloWidgetFormat.js +4 -2
- package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -1
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js +1 -26
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -1
- package/package.json +1 -1
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +0 -447
- package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +0 -263
- package/Server/API/GoogleSecOpsConnectionAPI.ts +0 -320
- package/Server/Services/GoogleSecOpsConnectionRunService.ts +0 -10
- package/Server/Services/GoogleSecOpsConnectionService.ts +0 -116
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +0 -777
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +0 -1373
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +0 -512
- package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +0 -838
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +0 -441
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +0 -1001
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +0 -657
- package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +0 -153
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +0 -784
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +0 -823
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +0 -918
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +0 -738
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +0 -874
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +0 -1297
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +0 -1577
- package/Tests/UI/Components/LockedFilterActions.test.tsx +0 -396
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +0 -111
- package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +0 -205
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +0 -478
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +0 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +0 -287
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +0 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +0 -231
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +0 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +0 -9
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +0 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +0 -70
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +0 -537
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +0 -1034
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +0 -410
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +0 -1
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +0 -2
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +0 -1
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +0 -88
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +0 -1
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MAX_DEVICE_DESCRIPTION_LENGTH,
|
|
3
|
+
MAX_DEVICE_DNS_NAME_LENGTH,
|
|
3
4
|
MAX_DEVICE_NAME_LENGTH,
|
|
4
5
|
buildDeviceName,
|
|
5
6
|
buildFallbackDeviceName,
|
|
6
7
|
buildNetworkDeviceFromDiscoveredHost,
|
|
7
8
|
getDiscoveredHostDisplayName,
|
|
9
|
+
getDiscoveredHostFullName,
|
|
8
10
|
DiscoveredDeviceScanSource,
|
|
11
|
+
DiscoveredHostNaming,
|
|
9
12
|
} from "../../../Utils/NetworkDiscovery/DiscoveredDeviceBuilder";
|
|
10
13
|
import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
|
|
11
14
|
import { DiscoveredNetworkDevice } from "../../../Models/DatabaseModels/NetworkDeviceDiscoveryScan";
|
|
@@ -13,6 +16,7 @@ import NetworkDeviceMonitoringMethod from "../../../Types/NetworkDevice/NetworkD
|
|
|
13
16
|
import ObjectID from "../../../Types/ObjectID";
|
|
14
17
|
import { DiscoveryScanSnmpConfig } from "../../../Utils/NetworkDiscovery/SnmpScanConfigUtil";
|
|
15
18
|
import { MAX_REVERSE_DNS_NAME_LENGTH } from "../../../Utils/NetworkDiscovery/ReverseDnsNameUtil";
|
|
19
|
+
import { getShortHostname } from "../../../Utils/NetworkDiscovery/ShortHostnameUtil";
|
|
16
20
|
import ColumnLength from "../../../Types/Database/ColumnLength";
|
|
17
21
|
import Slug from "../../../Utils/Slug";
|
|
18
22
|
import { describe, expect, it, test } from "@jest/globals";
|
|
@@ -40,6 +44,18 @@ const PROJECT_ID: ObjectID = new ObjectID(
|
|
|
40
44
|
);
|
|
41
45
|
const PROBE_ID: ObjectID = new ObjectID("11111111-1111-4111-8111-111111111111");
|
|
42
46
|
|
|
47
|
+
/*
|
|
48
|
+
* The naming choice every case written before issue #3678 was written
|
|
49
|
+
* against: full names, exactly as every scan named its devices before the
|
|
50
|
+
* short-name setting existed. Spelled `false` rather than `{}` so a reader
|
|
51
|
+
* sees which behaviour the expectations below pin; the "off by default"
|
|
52
|
+
* cases further down prove `{}` means the same thing.
|
|
53
|
+
*/
|
|
54
|
+
const FULL_NAMES: DiscoveredHostNaming = { useShortDeviceNames: false };
|
|
55
|
+
|
|
56
|
+
// The scan setting from issue #3678, switched on.
|
|
57
|
+
const SHORT_NAMES: DiscoveredHostNaming = { useShortDeviceNames: true };
|
|
58
|
+
|
|
43
59
|
function snmpHost(
|
|
44
60
|
overrides: Partial<DiscoveredNetworkDevice> = {},
|
|
45
61
|
): DiscoveredNetworkDevice {
|
|
@@ -173,6 +189,14 @@ function expectNoV3Credentials(device: NetworkDevice): void {
|
|
|
173
189
|
expect(device.snmpV3PrivKey).toBeUndefined();
|
|
174
190
|
}
|
|
175
191
|
|
|
192
|
+
/*
|
|
193
|
+
* fullScanSource() with issue #3678's short-name setting switched on — the
|
|
194
|
+
* shape a scan row has when the operator ticked "Use Short Device Names".
|
|
195
|
+
*/
|
|
196
|
+
function shortNamesScan(): DiscoveredDeviceScanSource {
|
|
197
|
+
return { ...fullScanSource(), useShortDeviceNames: true };
|
|
198
|
+
}
|
|
199
|
+
|
|
176
200
|
function build(data: {
|
|
177
201
|
host?: DiscoveredNetworkDevice | undefined;
|
|
178
202
|
scan?: DiscoveredDeviceScanSource | undefined;
|
|
@@ -546,16 +570,20 @@ describe("buildNetworkDeviceFromDiscoveredHost - both kinds of host share the re
|
|
|
546
570
|
|
|
547
571
|
describe("buildDeviceName", () => {
|
|
548
572
|
it("prefers the sysName", () => {
|
|
549
|
-
expect(buildDeviceName(snmpHost())).toBe("core-switch-01");
|
|
573
|
+
expect(buildDeviceName(snmpHost(), FULL_NAMES)).toBe("core-switch-01");
|
|
550
574
|
});
|
|
551
575
|
|
|
552
576
|
// A ping-only host has no SNMP identity; the address is all there is.
|
|
553
577
|
it("falls back to the address when sysName is missing", () => {
|
|
554
|
-
expect(buildDeviceName(snmpHost({ sysName: undefined }))).toBe(
|
|
578
|
+
expect(buildDeviceName(snmpHost({ sysName: undefined }), FULL_NAMES)).toBe(
|
|
579
|
+
"10.0.0.5",
|
|
580
|
+
);
|
|
555
581
|
});
|
|
556
582
|
|
|
557
583
|
it("falls back to the address when sysName is whitespace", () => {
|
|
558
|
-
expect(buildDeviceName(snmpHost({ sysName: " " }))).toBe(
|
|
584
|
+
expect(buildDeviceName(snmpHost({ sysName: " " }), FULL_NAMES)).toBe(
|
|
585
|
+
"10.0.0.5",
|
|
586
|
+
);
|
|
559
587
|
});
|
|
560
588
|
|
|
561
589
|
/*
|
|
@@ -566,7 +594,10 @@ describe("buildDeviceName", () => {
|
|
|
566
594
|
*/
|
|
567
595
|
it("clamps a 255-character sysName to MAX_DEVICE_NAME_LENGTH", () => {
|
|
568
596
|
const longSysName: string = "x".repeat(255);
|
|
569
|
-
const name: string = buildDeviceName(
|
|
597
|
+
const name: string = buildDeviceName(
|
|
598
|
+
snmpHost({ sysName: longSysName }),
|
|
599
|
+
FULL_NAMES,
|
|
600
|
+
);
|
|
570
601
|
|
|
571
602
|
expect(name.length).toBe(MAX_DEVICE_NAME_LENGTH);
|
|
572
603
|
expect(name).toBe(longSysName.substring(0, MAX_DEVICE_NAME_LENGTH));
|
|
@@ -575,7 +606,7 @@ describe("buildDeviceName", () => {
|
|
|
575
606
|
|
|
576
607
|
describe("buildFallbackDeviceName", () => {
|
|
577
608
|
it("appends the address that tells name-twins apart", () => {
|
|
578
|
-
expect(buildFallbackDeviceName(snmpHost())).toBe(
|
|
609
|
+
expect(buildFallbackDeviceName(snmpHost(), FULL_NAMES)).toBe(
|
|
579
610
|
"core-switch-01 (10.0.0.5)",
|
|
580
611
|
);
|
|
581
612
|
});
|
|
@@ -592,6 +623,7 @@ describe("buildFallbackDeviceName", () => {
|
|
|
592
623
|
sysName: "y".repeat(255),
|
|
593
624
|
ipAddress: "255.255.255.255",
|
|
594
625
|
}),
|
|
626
|
+
FULL_NAMES,
|
|
595
627
|
);
|
|
596
628
|
|
|
597
629
|
expect(name.length).toBeLessThanOrEqual(MAX_DEVICE_NAME_LENGTH);
|
|
@@ -662,20 +694,26 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
662
694
|
test("a host with no sysName is named by its PTR record", () => {
|
|
663
695
|
// The reported case, in one line.
|
|
664
696
|
expect(
|
|
665
|
-
buildDeviceName(
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
697
|
+
buildDeviceName(
|
|
698
|
+
{
|
|
699
|
+
ipAddress: "10.18.166.51",
|
|
700
|
+
dnsHostname: "core-gw.corp.example.com",
|
|
701
|
+
},
|
|
702
|
+
FULL_NAMES,
|
|
703
|
+
),
|
|
669
704
|
).toBe("core-gw.corp.example.com");
|
|
670
705
|
});
|
|
671
706
|
|
|
672
707
|
test("sysName still wins when the host has both", () => {
|
|
673
708
|
expect(
|
|
674
|
-
buildDeviceName(
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
709
|
+
buildDeviceName(
|
|
710
|
+
{
|
|
711
|
+
ipAddress: "10.18.166.51",
|
|
712
|
+
sysName: "core-switch-01",
|
|
713
|
+
dnsHostname: "sw1.corp.example.com",
|
|
714
|
+
},
|
|
715
|
+
FULL_NAMES,
|
|
716
|
+
),
|
|
679
717
|
).toBe("core-switch-01");
|
|
680
718
|
});
|
|
681
719
|
|
|
@@ -686,11 +724,14 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
686
724
|
* device named " ".
|
|
687
725
|
*/
|
|
688
726
|
expect(
|
|
689
|
-
buildDeviceName(
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
727
|
+
buildDeviceName(
|
|
728
|
+
{
|
|
729
|
+
ipAddress: "10.18.166.51",
|
|
730
|
+
sysName: " ",
|
|
731
|
+
dnsHostname: "sw1.corp.example.com",
|
|
732
|
+
},
|
|
733
|
+
FULL_NAMES,
|
|
734
|
+
),
|
|
694
735
|
).toBe("sw1.corp.example.com");
|
|
695
736
|
});
|
|
696
737
|
|
|
@@ -710,16 +751,21 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
710
751
|
dnsHostname: "sw1.corp.example.com",
|
|
711
752
|
};
|
|
712
753
|
|
|
713
|
-
expect(getDiscoveredHostDisplayName(paddedHost)).toBe(
|
|
754
|
+
expect(getDiscoveredHostDisplayName(paddedHost, FULL_NAMES)).toBe(
|
|
755
|
+
"core-switch-01",
|
|
756
|
+
);
|
|
714
757
|
expect(build({ host: paddedHost }).name).toBe("core-switch-01");
|
|
715
758
|
});
|
|
716
759
|
|
|
717
760
|
test("the address is still the last resort", () => {
|
|
718
|
-
expect(buildDeviceName({ ipAddress: "10.18.166.51" })).toBe(
|
|
761
|
+
expect(buildDeviceName({ ipAddress: "10.18.166.51" }, FULL_NAMES)).toBe(
|
|
719
762
|
"10.18.166.51",
|
|
720
763
|
);
|
|
721
764
|
expect(
|
|
722
|
-
buildDeviceName(
|
|
765
|
+
buildDeviceName(
|
|
766
|
+
{ ipAddress: "10.18.166.51", dnsHostname: "" },
|
|
767
|
+
FULL_NAMES,
|
|
768
|
+
),
|
|
723
769
|
).toBe("10.18.166.51");
|
|
724
770
|
});
|
|
725
771
|
|
|
@@ -730,9 +776,14 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
730
776
|
* that has not been upgraded yet.
|
|
731
777
|
*/
|
|
732
778
|
expect(
|
|
733
|
-
buildDeviceName(
|
|
779
|
+
buildDeviceName(
|
|
780
|
+
{ ipAddress: "10.0.0.5", sysName: "core-switch-01" },
|
|
781
|
+
FULL_NAMES,
|
|
782
|
+
),
|
|
734
783
|
).toBe("core-switch-01");
|
|
735
|
-
expect(buildDeviceName({ ipAddress: "10.0.0.5" })).toBe(
|
|
784
|
+
expect(buildDeviceName({ ipAddress: "10.0.0.5" }, FULL_NAMES)).toBe(
|
|
785
|
+
"10.0.0.5",
|
|
786
|
+
);
|
|
736
787
|
});
|
|
737
788
|
});
|
|
738
789
|
|
|
@@ -769,9 +820,12 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
769
820
|
];
|
|
770
821
|
|
|
771
822
|
for (const discoveredHost of hosts) {
|
|
772
|
-
const displayed: string = getDiscoveredHostDisplayName(
|
|
823
|
+
const displayed: string = getDiscoveredHostDisplayName(
|
|
824
|
+
discoveredHost,
|
|
825
|
+
FULL_NAMES,
|
|
826
|
+
);
|
|
773
827
|
|
|
774
|
-
expect(buildDeviceName(discoveredHost)).toBe(
|
|
828
|
+
expect(buildDeviceName(discoveredHost, FULL_NAMES)).toBe(
|
|
775
829
|
displayed.substring(0, MAX_DEVICE_NAME_LENGTH),
|
|
776
830
|
);
|
|
777
831
|
|
|
@@ -782,7 +836,7 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
782
836
|
* naming rule would pass the assertion above and fail this one.
|
|
783
837
|
*/
|
|
784
838
|
expect(build({ host: discoveredHost }).name).toBe(
|
|
785
|
-
buildDeviceName(discoveredHost),
|
|
839
|
+
buildDeviceName(discoveredHost, FULL_NAMES),
|
|
786
840
|
);
|
|
787
841
|
}
|
|
788
842
|
|
|
@@ -791,8 +845,8 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
791
845
|
hosts.length - 1
|
|
792
846
|
] as DiscoveredNetworkDevice;
|
|
793
847
|
|
|
794
|
-
expect(getDiscoveredHostDisplayName(clampedHost)).not.toBe(
|
|
795
|
-
buildDeviceName(clampedHost),
|
|
848
|
+
expect(getDiscoveredHostDisplayName(clampedHost, FULL_NAMES)).not.toBe(
|
|
849
|
+
buildDeviceName(clampedHost, FULL_NAMES),
|
|
796
850
|
);
|
|
797
851
|
});
|
|
798
852
|
|
|
@@ -806,13 +860,19 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
806
860
|
const longName: string = `${"a".repeat(63)}.${"b".repeat(40)}.example.com`;
|
|
807
861
|
|
|
808
862
|
expect(
|
|
809
|
-
getDiscoveredHostDisplayName(
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
863
|
+
getDiscoveredHostDisplayName(
|
|
864
|
+
{
|
|
865
|
+
ipAddress: "10.0.0.1",
|
|
866
|
+
dnsHostname: longName,
|
|
867
|
+
},
|
|
868
|
+
FULL_NAMES,
|
|
869
|
+
),
|
|
813
870
|
).toBe(longName);
|
|
814
871
|
expect(
|
|
815
|
-
buildDeviceName(
|
|
872
|
+
buildDeviceName(
|
|
873
|
+
{ ipAddress: "10.0.0.1", dnsHostname: longName },
|
|
874
|
+
FULL_NAMES,
|
|
875
|
+
),
|
|
816
876
|
).toHaveLength(MAX_DEVICE_NAME_LENGTH);
|
|
817
877
|
});
|
|
818
878
|
});
|
|
@@ -828,19 +888,25 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
828
888
|
*/
|
|
829
889
|
test("falls back to the address rather than naming a device after markup", () => {
|
|
830
890
|
expect(
|
|
831
|
-
buildDeviceName(
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
891
|
+
buildDeviceName(
|
|
892
|
+
{
|
|
893
|
+
ipAddress: "10.18.166.51",
|
|
894
|
+
dnsHostname: "<script>alert(1)</script>",
|
|
895
|
+
},
|
|
896
|
+
FULL_NAMES,
|
|
897
|
+
),
|
|
835
898
|
).toBe("10.18.166.51");
|
|
836
899
|
});
|
|
837
900
|
|
|
838
901
|
test("falls back to the address for a name with whitespace in it", () => {
|
|
839
902
|
expect(
|
|
840
|
-
buildDeviceName(
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
903
|
+
buildDeviceName(
|
|
904
|
+
{
|
|
905
|
+
ipAddress: "10.18.166.51",
|
|
906
|
+
dnsHostname: "core switch",
|
|
907
|
+
},
|
|
908
|
+
FULL_NAMES,
|
|
909
|
+
),
|
|
844
910
|
).toBe("10.18.166.51");
|
|
845
911
|
});
|
|
846
912
|
|
|
@@ -850,16 +916,22 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
850
916
|
* published, which is worse than showing the address as an address.
|
|
851
917
|
*/
|
|
852
918
|
expect(
|
|
853
|
-
buildDeviceName(
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
919
|
+
buildDeviceName(
|
|
920
|
+
{
|
|
921
|
+
ipAddress: "10.18.166.51",
|
|
922
|
+
dnsHostname: "10.18.166.51",
|
|
923
|
+
},
|
|
924
|
+
FULL_NAMES,
|
|
925
|
+
),
|
|
857
926
|
).toBe("10.18.166.51");
|
|
858
927
|
expect(
|
|
859
|
-
buildDeviceName(
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
928
|
+
buildDeviceName(
|
|
929
|
+
{
|
|
930
|
+
ipAddress: "10.18.166.51",
|
|
931
|
+
dnsHostname: "51.166.18.10.in-addr.arpa",
|
|
932
|
+
},
|
|
933
|
+
FULL_NAMES,
|
|
934
|
+
),
|
|
863
935
|
).toBe("10.18.166.51");
|
|
864
936
|
});
|
|
865
937
|
|
|
@@ -873,10 +945,13 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
873
945
|
* "51" and a single all-numeric label is refused anyway.
|
|
874
946
|
*/
|
|
875
947
|
expect(
|
|
876
|
-
buildDeviceName(
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
948
|
+
buildDeviceName(
|
|
949
|
+
{
|
|
950
|
+
ipAddress: "10.18.166.51",
|
|
951
|
+
dnsHostname: 51 as unknown as string,
|
|
952
|
+
},
|
|
953
|
+
FULL_NAMES,
|
|
954
|
+
),
|
|
880
955
|
).toBe("10.18.166.51");
|
|
881
956
|
|
|
882
957
|
/*
|
|
@@ -887,19 +962,25 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
887
962
|
* address, and this line is the only thing in the file that notices.
|
|
888
963
|
*/
|
|
889
964
|
expect(
|
|
890
|
-
buildDeviceName(
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
965
|
+
buildDeviceName(
|
|
966
|
+
{
|
|
967
|
+
ipAddress: "10.18.166.51",
|
|
968
|
+
dnsHostname: true as unknown as string,
|
|
969
|
+
},
|
|
970
|
+
FULL_NAMES,
|
|
971
|
+
),
|
|
894
972
|
).toBe("10.18.166.51");
|
|
895
973
|
});
|
|
896
974
|
|
|
897
975
|
test("stores the normalised form, not the raw answer", () => {
|
|
898
976
|
expect(
|
|
899
|
-
buildDeviceName(
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
977
|
+
buildDeviceName(
|
|
978
|
+
{
|
|
979
|
+
ipAddress: "10.0.0.1",
|
|
980
|
+
dnsHostname: " gw.corp.example.com. ",
|
|
981
|
+
},
|
|
982
|
+
FULL_NAMES,
|
|
983
|
+
),
|
|
903
984
|
).toBe("gw.corp.example.com");
|
|
904
985
|
});
|
|
905
986
|
});
|
|
@@ -956,10 +1037,13 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
956
1037
|
* The address is what tells them apart.
|
|
957
1038
|
*/
|
|
958
1039
|
expect(
|
|
959
|
-
buildFallbackDeviceName(
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
1040
|
+
buildFallbackDeviceName(
|
|
1041
|
+
{
|
|
1042
|
+
ipAddress: "10.18.166.51",
|
|
1043
|
+
dnsHostname: "dhcp-pool.corp.example.com",
|
|
1044
|
+
},
|
|
1045
|
+
FULL_NAMES,
|
|
1046
|
+
),
|
|
963
1047
|
).toBe("dhcp-pool.corp.example.com (10.18.166.51)");
|
|
964
1048
|
});
|
|
965
1049
|
});
|
|
@@ -1015,10 +1099,12 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1015
1099
|
dnsHostname: "core-gw.corp.example.com",
|
|
1016
1100
|
};
|
|
1017
1101
|
|
|
1018
|
-
expect(getDiscoveredHostDisplayName(host)).toBe(
|
|
1102
|
+
expect(getDiscoveredHostDisplayName(host, FULL_NAMES)).toBe(
|
|
1103
|
+
"core-gw.corp.example.com",
|
|
1104
|
+
);
|
|
1105
|
+
expect(buildDeviceName(host, FULL_NAMES)).toBe(
|
|
1019
1106
|
"core-gw.corp.example.com",
|
|
1020
1107
|
);
|
|
1021
|
-
expect(buildDeviceName(host)).toBe("core-gw.corp.example.com");
|
|
1022
1108
|
});
|
|
1023
1109
|
|
|
1024
1110
|
test(`${untrusted.reason} sysName falls through to the address`, () => {
|
|
@@ -1028,8 +1114,10 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1028
1114
|
sysName: untrusted.value as unknown as string,
|
|
1029
1115
|
};
|
|
1030
1116
|
|
|
1031
|
-
expect(getDiscoveredHostDisplayName(host)).toBe(
|
|
1032
|
-
|
|
1117
|
+
expect(getDiscoveredHostDisplayName(host, FULL_NAMES)).toBe(
|
|
1118
|
+
"10.18.166.51",
|
|
1119
|
+
);
|
|
1120
|
+
expect(buildDeviceName(host, FULL_NAMES)).toBe("10.18.166.51");
|
|
1033
1121
|
});
|
|
1034
1122
|
}
|
|
1035
1123
|
});
|
|
@@ -1041,9 +1129,9 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1041
1129
|
*/
|
|
1042
1130
|
describe("an untrusted address as the last resort", () => {
|
|
1043
1131
|
test("a numeric address still names the row", () => {
|
|
1044
|
-
expect(
|
|
1045
|
-
|
|
1046
|
-
);
|
|
1132
|
+
expect(
|
|
1133
|
+
buildDeviceName({ ipAddress: 42 as unknown as string }, FULL_NAMES),
|
|
1134
|
+
).toBe("42");
|
|
1047
1135
|
});
|
|
1048
1136
|
|
|
1049
1137
|
test("a null address degrades to an empty name rather than a throw", () => {
|
|
@@ -1053,7 +1141,10 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1053
1141
|
* than a TypeError that removes the dialog.
|
|
1054
1142
|
*/
|
|
1055
1143
|
expect(
|
|
1056
|
-
getDiscoveredHostDisplayName(
|
|
1144
|
+
getDiscoveredHostDisplayName(
|
|
1145
|
+
{ ipAddress: null as unknown as string },
|
|
1146
|
+
FULL_NAMES,
|
|
1147
|
+
),
|
|
1057
1148
|
).toBe("");
|
|
1058
1149
|
});
|
|
1059
1150
|
|
|
@@ -1072,9 +1163,12 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1072
1163
|
* still holds, which is why the null case above is asserted too.
|
|
1073
1164
|
*/
|
|
1074
1165
|
expect(
|
|
1075
|
-
buildDeviceName(
|
|
1076
|
-
|
|
1077
|
-
|
|
1166
|
+
buildDeviceName(
|
|
1167
|
+
{
|
|
1168
|
+
ipAddress: { v4: "10.18.166.51" } as unknown as string,
|
|
1169
|
+
},
|
|
1170
|
+
FULL_NAMES,
|
|
1171
|
+
),
|
|
1078
1172
|
).toBe("[object Object]");
|
|
1079
1173
|
});
|
|
1080
1174
|
|
|
@@ -1157,7 +1251,7 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1157
1251
|
dnsHostname: answer.value as unknown as string,
|
|
1158
1252
|
};
|
|
1159
1253
|
|
|
1160
|
-
expect(getDiscoveredHostDisplayName(hostWithBadPtr)).toBe(
|
|
1254
|
+
expect(getDiscoveredHostDisplayName(hostWithBadPtr, FULL_NAMES)).toBe(
|
|
1161
1255
|
"10.18.166.51",
|
|
1162
1256
|
);
|
|
1163
1257
|
// The device, not just the name: a coercion would reach the column.
|
|
@@ -1238,13 +1332,13 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1238
1332
|
});
|
|
1239
1333
|
|
|
1240
1334
|
test("buildFallbackDeviceName tells them apart by their own address", () => {
|
|
1241
|
-
expect(buildFallbackDeviceName(firstPoolHost)).not.toBe(
|
|
1242
|
-
buildFallbackDeviceName(secondPoolHost),
|
|
1335
|
+
expect(buildFallbackDeviceName(firstPoolHost, FULL_NAMES)).not.toBe(
|
|
1336
|
+
buildFallbackDeviceName(secondPoolHost, FULL_NAMES),
|
|
1243
1337
|
);
|
|
1244
|
-
expect(buildFallbackDeviceName(firstPoolHost)).toBe(
|
|
1338
|
+
expect(buildFallbackDeviceName(firstPoolHost, FULL_NAMES)).toBe(
|
|
1245
1339
|
"dhcp-pool.corp.example.com (10.18.166.51)",
|
|
1246
1340
|
);
|
|
1247
|
-
expect(buildFallbackDeviceName(secondPoolHost)).toBe(
|
|
1341
|
+
expect(buildFallbackDeviceName(secondPoolHost, FULL_NAMES)).toBe(
|
|
1248
1342
|
"dhcp-pool.corp.example.com (10.18.166.52)",
|
|
1249
1343
|
);
|
|
1250
1344
|
});
|
|
@@ -1262,7 +1356,7 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1262
1356
|
*/
|
|
1263
1357
|
const device: NetworkDevice = build({
|
|
1264
1358
|
host: secondPoolHost,
|
|
1265
|
-
name: buildFallbackDeviceName(secondPoolHost),
|
|
1359
|
+
name: buildFallbackDeviceName(secondPoolHost, FULL_NAMES),
|
|
1266
1360
|
});
|
|
1267
1361
|
|
|
1268
1362
|
expect(device.name).toBe("dhcp-pool.corp.example.com (10.18.166.52)");
|
|
@@ -1289,7 +1383,10 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1289
1383
|
dnsHostname: WILDCARD_PTR_NAME,
|
|
1290
1384
|
} as unknown as DiscoveredNetworkDevice;
|
|
1291
1385
|
|
|
1292
|
-
const fallbackName: string = buildFallbackDeviceName(
|
|
1386
|
+
const fallbackName: string = buildFallbackDeviceName(
|
|
1387
|
+
addresslessHost,
|
|
1388
|
+
FULL_NAMES,
|
|
1389
|
+
);
|
|
1293
1390
|
|
|
1294
1391
|
expect(fallbackName).toBe(WILDCARD_PTR_NAME);
|
|
1295
1392
|
expect(fallbackName).not.toContain("undefined");
|
|
@@ -1311,8 +1408,12 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1311
1408
|
dnsHostname: WILDCARD_PTR_NAME,
|
|
1312
1409
|
};
|
|
1313
1410
|
|
|
1314
|
-
expect(buildFallbackDeviceName(nullAddressHost)).toBe(
|
|
1315
|
-
|
|
1411
|
+
expect(buildFallbackDeviceName(nullAddressHost, FULL_NAMES)).toBe(
|
|
1412
|
+
WILDCARD_PTR_NAME,
|
|
1413
|
+
);
|
|
1414
|
+
expect(
|
|
1415
|
+
buildFallbackDeviceName(nullAddressHost, FULL_NAMES),
|
|
1416
|
+
).not.toContain("null)");
|
|
1316
1417
|
});
|
|
1317
1418
|
});
|
|
1318
1419
|
|
|
@@ -1350,10 +1451,13 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1350
1451
|
*/
|
|
1351
1452
|
expect(MAXIMAL_PTR_NAME).toHaveLength(MAX_REVERSE_DNS_NAME_LENGTH);
|
|
1352
1453
|
expect(
|
|
1353
|
-
buildDeviceName(
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1454
|
+
buildDeviceName(
|
|
1455
|
+
{
|
|
1456
|
+
ipAddress: "255.255.255.255",
|
|
1457
|
+
dnsHostname: MAXIMAL_PTR_NAME,
|
|
1458
|
+
},
|
|
1459
|
+
FULL_NAMES,
|
|
1460
|
+
),
|
|
1357
1461
|
).toBe(MAXIMAL_PTR_NAME.substring(0, MAX_DEVICE_NAME_LENGTH));
|
|
1358
1462
|
});
|
|
1359
1463
|
|
|
@@ -1368,10 +1472,13 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1368
1472
|
* gives way, or the wildcard range collides again), and what precedes
|
|
1369
1473
|
* it is a genuine prefix of the PTR name rather than some other string.
|
|
1370
1474
|
*/
|
|
1371
|
-
const name: string = buildFallbackDeviceName(
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1475
|
+
const name: string = buildFallbackDeviceName(
|
|
1476
|
+
{
|
|
1477
|
+
ipAddress: "255.255.255.255",
|
|
1478
|
+
dnsHostname: MAXIMAL_PTR_NAME,
|
|
1479
|
+
},
|
|
1480
|
+
FULL_NAMES,
|
|
1481
|
+
);
|
|
1375
1482
|
|
|
1376
1483
|
expect(name).toHaveLength(MAX_DEVICE_NAME_LENGTH);
|
|
1377
1484
|
expect(name.endsWith(WIDEST_ADDRESS_SUFFIX)).toBe(true);
|
|
@@ -1392,15 +1499,21 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1392
1499
|
* differ only in their last octet.
|
|
1393
1500
|
*/
|
|
1394
1501
|
expect(
|
|
1395
|
-
buildFallbackDeviceName(
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1502
|
+
buildFallbackDeviceName(
|
|
1503
|
+
{
|
|
1504
|
+
ipAddress: "255.255.255.255",
|
|
1505
|
+
dnsHostname: MAXIMAL_PTR_NAME,
|
|
1506
|
+
},
|
|
1507
|
+
FULL_NAMES,
|
|
1508
|
+
),
|
|
1399
1509
|
).not.toBe(
|
|
1400
|
-
buildFallbackDeviceName(
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1510
|
+
buildFallbackDeviceName(
|
|
1511
|
+
{
|
|
1512
|
+
ipAddress: "255.255.255.254",
|
|
1513
|
+
dnsHostname: MAXIMAL_PTR_NAME,
|
|
1514
|
+
},
|
|
1515
|
+
FULL_NAMES,
|
|
1516
|
+
),
|
|
1404
1517
|
);
|
|
1405
1518
|
});
|
|
1406
1519
|
|
|
@@ -1420,10 +1533,13 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1420
1533
|
// Anti-vacuity: this really is the wider of the two suffixes.
|
|
1421
1534
|
expect(IPV6_SUFFIX.length).toBeGreaterThan(WIDEST_ADDRESS_SUFFIX.length);
|
|
1422
1535
|
|
|
1423
|
-
const name: string = buildFallbackDeviceName(
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1536
|
+
const name: string = buildFallbackDeviceName(
|
|
1537
|
+
{
|
|
1538
|
+
ipAddress: FULL_IPV6_ADDRESS,
|
|
1539
|
+
dnsHostname: MAXIMAL_PTR_NAME,
|
|
1540
|
+
},
|
|
1541
|
+
FULL_NAMES,
|
|
1542
|
+
);
|
|
1427
1543
|
|
|
1428
1544
|
expect(name).toHaveLength(MAX_DEVICE_NAME_LENGTH);
|
|
1429
1545
|
expect(name.endsWith(IPV6_SUFFIX)).toBe(true);
|
|
@@ -1449,15 +1565,21 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1449
1565
|
* an address that occupies 42 of the 80 characters available.
|
|
1450
1566
|
*/
|
|
1451
1567
|
expect(
|
|
1452
|
-
buildFallbackDeviceName(
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1568
|
+
buildFallbackDeviceName(
|
|
1569
|
+
{
|
|
1570
|
+
ipAddress: FULL_IPV6_ADDRESS,
|
|
1571
|
+
dnsHostname: MAXIMAL_PTR_NAME,
|
|
1572
|
+
},
|
|
1573
|
+
FULL_NAMES,
|
|
1574
|
+
),
|
|
1456
1575
|
).not.toBe(
|
|
1457
|
-
buildFallbackDeviceName(
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1576
|
+
buildFallbackDeviceName(
|
|
1577
|
+
{
|
|
1578
|
+
ipAddress: "2001:0db8:85a3:0000:0000:8a2e:0370:7335",
|
|
1579
|
+
dnsHostname: MAXIMAL_PTR_NAME,
|
|
1580
|
+
},
|
|
1581
|
+
FULL_NAMES,
|
|
1582
|
+
),
|
|
1461
1583
|
);
|
|
1462
1584
|
});
|
|
1463
1585
|
|
|
@@ -1497,10 +1619,13 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1497
1619
|
const slugSuffixLength: number =
|
|
1498
1620
|
Slug.getSlug(SLUG_PROBE).length - SLUG_PROBE.length;
|
|
1499
1621
|
|
|
1500
|
-
const name: string = buildDeviceName(
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1622
|
+
const name: string = buildDeviceName(
|
|
1623
|
+
{
|
|
1624
|
+
ipAddress: "10.18.166.51",
|
|
1625
|
+
sysName: "long-sysname-".repeat(20),
|
|
1626
|
+
},
|
|
1627
|
+
FULL_NAMES,
|
|
1628
|
+
);
|
|
1504
1629
|
|
|
1505
1630
|
expect(name).toHaveLength(MAX_DEVICE_NAME_LENGTH);
|
|
1506
1631
|
|
|
@@ -1582,3 +1707,1185 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
1582
1707
|
}
|
|
1583
1708
|
});
|
|
1584
1709
|
});
|
|
1710
|
+
|
|
1711
|
+
/*
|
|
1712
|
+
* OneUptime issue #3678 — "discovered devices are named by their full DNS
|
|
1713
|
+
* name".
|
|
1714
|
+
*
|
|
1715
|
+
* The reporter's estate is one corporate domain, so every device in the list
|
|
1716
|
+
* reads "wb-0660-kds01.wbhq.com", "wb-0660-kds02.wbhq.com", ... and the part
|
|
1717
|
+
* an operator recognises is pushed to the far left of a truncated column. The
|
|
1718
|
+
* scan setting `useShortDeviceNames` names imports by the first label
|
|
1719
|
+
* instead. What these cases pin:
|
|
1720
|
+
*
|
|
1721
|
+
* - OFF unless the setting is exactly `true`. Every scan that existed before
|
|
1722
|
+
* the setting must keep importing under the names it always did, and a
|
|
1723
|
+
* value that arrives as "true" or 1 out of an API payload must not
|
|
1724
|
+
* quietly rename a project's devices.
|
|
1725
|
+
* - ON shortens whichever name WON — sysName or PTR — and never changes
|
|
1726
|
+
* which one wins. A sysName an operator typed ("Core Switch") beats a PTR
|
|
1727
|
+
* record with the setting on exactly as it does with it off.
|
|
1728
|
+
* - What cannot be shortened safely is kept whole: an address, an OS
|
|
1729
|
+
* version string, an address spelled with dashes.
|
|
1730
|
+
* - The Review dialog's name, the device's name, and the collision fallback
|
|
1731
|
+
* all agree, because they all go through the same naming argument.
|
|
1732
|
+
*/
|
|
1733
|
+
describe("short device names (issue #3678)", () => {
|
|
1734
|
+
const CUSTOMER_PTR_NAME: string = "wb-0660-kds01.wbhq.com";
|
|
1735
|
+
|
|
1736
|
+
const customerHost: DiscoveredNetworkDevice = {
|
|
1737
|
+
ipAddress: "10.18.167.31",
|
|
1738
|
+
snmpReachable: false,
|
|
1739
|
+
dnsHostname: CUSTOMER_PTR_NAME,
|
|
1740
|
+
};
|
|
1741
|
+
|
|
1742
|
+
describe("the setting is off unless it is exactly true", () => {
|
|
1743
|
+
test("an empty naming choice imports the full name", () => {
|
|
1744
|
+
expect(buildDeviceName(customerHost, {})).toBe(CUSTOMER_PTR_NAME);
|
|
1745
|
+
expect(getDiscoveredHostDisplayName(customerHost, {})).toBe(
|
|
1746
|
+
CUSTOMER_PTR_NAME,
|
|
1747
|
+
);
|
|
1748
|
+
expect(buildFallbackDeviceName(customerHost, {})).toBe(
|
|
1749
|
+
`${CUSTOMER_PTR_NAME} (10.18.167.31)`,
|
|
1750
|
+
);
|
|
1751
|
+
});
|
|
1752
|
+
|
|
1753
|
+
test("false imports the full name", () => {
|
|
1754
|
+
expect(buildDeviceName(customerHost, FULL_NAMES)).toBe(CUSTOMER_PTR_NAME);
|
|
1755
|
+
});
|
|
1756
|
+
|
|
1757
|
+
/*
|
|
1758
|
+
* Values that are truthy but not `true`. A jsonb row, an API client that
|
|
1759
|
+
* stringifies booleans, or a form library that submits 1 — none of them
|
|
1760
|
+
* is an operator saying "rename my devices".
|
|
1761
|
+
*/
|
|
1762
|
+
const NOT_TRUE: Array<{ reason: string; value: unknown }> = [
|
|
1763
|
+
{ reason: "the string true", value: "true" },
|
|
1764
|
+
{ reason: "the number 1", value: 1 },
|
|
1765
|
+
{ reason: "null", value: null },
|
|
1766
|
+
{ reason: "undefined", value: undefined },
|
|
1767
|
+
{ reason: "an object", value: {} },
|
|
1768
|
+
{ reason: "the string yes", value: "yes" },
|
|
1769
|
+
];
|
|
1770
|
+
|
|
1771
|
+
for (const notTrue of NOT_TRUE) {
|
|
1772
|
+
test(`${notTrue.reason} imports the full name`, () => {
|
|
1773
|
+
const naming: DiscoveredHostNaming = {
|
|
1774
|
+
useShortDeviceNames: notTrue.value as boolean,
|
|
1775
|
+
};
|
|
1776
|
+
|
|
1777
|
+
expect(getDiscoveredHostDisplayName(customerHost, naming)).toBe(
|
|
1778
|
+
CUSTOMER_PTR_NAME,
|
|
1779
|
+
);
|
|
1780
|
+
expect(buildDeviceName(customerHost, naming)).toBe(CUSTOMER_PTR_NAME);
|
|
1781
|
+
expect(
|
|
1782
|
+
build({
|
|
1783
|
+
host: customerHost,
|
|
1784
|
+
scan: {
|
|
1785
|
+
...fullScanSource(),
|
|
1786
|
+
useShortDeviceNames: notTrue.value as boolean,
|
|
1787
|
+
},
|
|
1788
|
+
}).name,
|
|
1789
|
+
).toBe(CUSTOMER_PTR_NAME);
|
|
1790
|
+
});
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1793
|
+
// Anti-vacuity for the block: the same host really is shortened when on.
|
|
1794
|
+
test("true imports the short name", () => {
|
|
1795
|
+
expect(buildDeviceName(customerHost, SHORT_NAMES)).toBe("wb-0660-kds01");
|
|
1796
|
+
});
|
|
1797
|
+
});
|
|
1798
|
+
|
|
1799
|
+
describe("with the setting on", () => {
|
|
1800
|
+
test("a PTR name is shortened to its first label", () => {
|
|
1801
|
+
expect(getDiscoveredHostDisplayName(customerHost, SHORT_NAMES)).toBe(
|
|
1802
|
+
"wb-0660-kds01",
|
|
1803
|
+
);
|
|
1804
|
+
expect(buildDeviceName(customerHost, SHORT_NAMES)).toBe("wb-0660-kds01");
|
|
1805
|
+
});
|
|
1806
|
+
|
|
1807
|
+
test("a PTR name with a root dot is shortened the same way", () => {
|
|
1808
|
+
expect(
|
|
1809
|
+
buildDeviceName(
|
|
1810
|
+
{ ipAddress: "10.18.167.31", dnsHostname: `${CUSTOMER_PTR_NAME}.` },
|
|
1811
|
+
SHORT_NAMES,
|
|
1812
|
+
),
|
|
1813
|
+
).toBe("wb-0660-kds01");
|
|
1814
|
+
});
|
|
1815
|
+
|
|
1816
|
+
test("the PTR name's case is preserved", () => {
|
|
1817
|
+
expect(
|
|
1818
|
+
buildDeviceName(
|
|
1819
|
+
{ ipAddress: "10.18.167.31", dnsHostname: "WB-0660-KDS01.WBHQ.COM" },
|
|
1820
|
+
SHORT_NAMES,
|
|
1821
|
+
),
|
|
1822
|
+
).toBe("WB-0660-KDS01");
|
|
1823
|
+
});
|
|
1824
|
+
|
|
1825
|
+
/*
|
|
1826
|
+
* Network gear routinely reports its FQDN as sysName. Shortening only
|
|
1827
|
+
* PTR-named hosts would leave a list where half the switches carry the
|
|
1828
|
+
* domain and half do not, which reads as broken. The full sysName is not
|
|
1829
|
+
* lost: the poller keeps writing it to the device's sysName column.
|
|
1830
|
+
*/
|
|
1831
|
+
test("a fully qualified sysName is shortened too", () => {
|
|
1832
|
+
const host: DiscoveredNetworkDevice = snmpHost({
|
|
1833
|
+
sysName: "core-sw-01.corp.example.com",
|
|
1834
|
+
});
|
|
1835
|
+
|
|
1836
|
+
expect(getDiscoveredHostDisplayName(host, SHORT_NAMES)).toBe(
|
|
1837
|
+
"core-sw-01",
|
|
1838
|
+
);
|
|
1839
|
+
expect(build({ host: host, scan: shortNamesScan() }).name).toBe(
|
|
1840
|
+
"core-sw-01",
|
|
1841
|
+
);
|
|
1842
|
+
});
|
|
1843
|
+
|
|
1844
|
+
test("a padded fully qualified sysName is trimmed and shortened", () => {
|
|
1845
|
+
expect(
|
|
1846
|
+
buildDeviceName(
|
|
1847
|
+
snmpHost({ sysName: " core-sw-01.corp.example.com " }),
|
|
1848
|
+
SHORT_NAMES,
|
|
1849
|
+
),
|
|
1850
|
+
).toBe("core-sw-01");
|
|
1851
|
+
});
|
|
1852
|
+
|
|
1853
|
+
test("a sysName that is not a hostname is kept exactly", () => {
|
|
1854
|
+
expect(
|
|
1855
|
+
buildDeviceName(snmpHost({ sysName: "Core Switch" }), SHORT_NAMES),
|
|
1856
|
+
).toBe("Core Switch");
|
|
1857
|
+
expect(
|
|
1858
|
+
buildDeviceName(snmpHost({ sysName: "Core Switch 1.5" }), SHORT_NAMES),
|
|
1859
|
+
).toBe("Core Switch 1.5");
|
|
1860
|
+
});
|
|
1861
|
+
|
|
1862
|
+
test("a single-label sysName is kept exactly", () => {
|
|
1863
|
+
expect(buildDeviceName(snmpHost(), SHORT_NAMES)).toBe("core-switch-01");
|
|
1864
|
+
});
|
|
1865
|
+
|
|
1866
|
+
// An address has no domain. "10.18.167.31" must not become "10".
|
|
1867
|
+
test("an IPv4 address is kept whole", () => {
|
|
1868
|
+
expect(buildDeviceName({ ipAddress: "10.18.167.31" }, SHORT_NAMES)).toBe(
|
|
1869
|
+
"10.18.167.31",
|
|
1870
|
+
);
|
|
1871
|
+
});
|
|
1872
|
+
|
|
1873
|
+
test("an IPv6 address is kept whole", () => {
|
|
1874
|
+
expect(
|
|
1875
|
+
buildDeviceName(
|
|
1876
|
+
{ ipAddress: "2001:0db8:85a3:0000:0000:8a2e:0370:7334" },
|
|
1877
|
+
SHORT_NAMES,
|
|
1878
|
+
),
|
|
1879
|
+
).toBe("2001:0db8:85a3:0000:0000:8a2e:0370:7334");
|
|
1880
|
+
expect(buildDeviceName({ ipAddress: "2001:db8::5" }, SHORT_NAMES)).toBe(
|
|
1881
|
+
"2001:db8::5",
|
|
1882
|
+
);
|
|
1883
|
+
});
|
|
1884
|
+
|
|
1885
|
+
/*
|
|
1886
|
+
* Names that pass as DNS names but that the short-name rule refuses. Kept
|
|
1887
|
+
* FULL, not cut: "ubuntu-22" is a name nobody chose, and
|
|
1888
|
+
* "10-18-167-31" is an address dressed up as a hostname.
|
|
1889
|
+
*/
|
|
1890
|
+
test("a name the short-name rule refuses is kept in full", () => {
|
|
1891
|
+
for (const unshortenable of [
|
|
1892
|
+
"ubuntu-22.04",
|
|
1893
|
+
"10-18-167-31.dhcp.corp.com",
|
|
1894
|
+
"a.b.v2",
|
|
1895
|
+
]) {
|
|
1896
|
+
expect(
|
|
1897
|
+
buildDeviceName(
|
|
1898
|
+
{ ipAddress: "10.18.167.31", dnsHostname: unshortenable },
|
|
1899
|
+
SHORT_NAMES,
|
|
1900
|
+
),
|
|
1901
|
+
).toBe(unshortenable);
|
|
1902
|
+
expect(
|
|
1903
|
+
buildDeviceName(snmpHost({ sysName: unshortenable }), SHORT_NAMES),
|
|
1904
|
+
).toBe(unshortenable);
|
|
1905
|
+
}
|
|
1906
|
+
});
|
|
1907
|
+
|
|
1908
|
+
test("an untrusted PTR record still falls back to the address", () => {
|
|
1909
|
+
for (const hostile of [
|
|
1910
|
+
"<script>alert(1)</script>",
|
|
1911
|
+
"core switch.corp.example.com",
|
|
1912
|
+
"31.167.18.10.in-addr.arpa",
|
|
1913
|
+
]) {
|
|
1914
|
+
expect(
|
|
1915
|
+
buildDeviceName(
|
|
1916
|
+
{ ipAddress: "10.18.167.31", dnsHostname: hostile },
|
|
1917
|
+
SHORT_NAMES,
|
|
1918
|
+
),
|
|
1919
|
+
).toBe("10.18.167.31");
|
|
1920
|
+
}
|
|
1921
|
+
});
|
|
1922
|
+
});
|
|
1923
|
+
|
|
1924
|
+
/*
|
|
1925
|
+
* Shortening is applied to the WINNER, after the contest. If it were
|
|
1926
|
+
* applied to each candidate first, a sysName the rule refuses could lose to
|
|
1927
|
+
* a shortenable PTR record, and turning the setting on would silently
|
|
1928
|
+
* change which of the device's names it is known by.
|
|
1929
|
+
*/
|
|
1930
|
+
describe("shortening never changes which name wins", () => {
|
|
1931
|
+
test('a sysName of "Core Switch" still beats a PTR name', () => {
|
|
1932
|
+
const host: DiscoveredNetworkDevice = {
|
|
1933
|
+
ipAddress: "10.18.167.31",
|
|
1934
|
+
sysName: "Core Switch",
|
|
1935
|
+
dnsHostname: CUSTOMER_PTR_NAME,
|
|
1936
|
+
};
|
|
1937
|
+
|
|
1938
|
+
expect(getDiscoveredHostDisplayName(host, FULL_NAMES)).toBe(
|
|
1939
|
+
"Core Switch",
|
|
1940
|
+
);
|
|
1941
|
+
expect(getDiscoveredHostDisplayName(host, SHORT_NAMES)).toBe(
|
|
1942
|
+
"Core Switch",
|
|
1943
|
+
);
|
|
1944
|
+
expect(build({ host: host, scan: shortNamesScan() }).name).toBe(
|
|
1945
|
+
"Core Switch",
|
|
1946
|
+
);
|
|
1947
|
+
});
|
|
1948
|
+
|
|
1949
|
+
test("an unshortenable sysName still beats a shortenable PTR name", () => {
|
|
1950
|
+
const host: DiscoveredNetworkDevice = {
|
|
1951
|
+
ipAddress: "10.18.167.31",
|
|
1952
|
+
sysName: "ubuntu-22.04",
|
|
1953
|
+
dnsHostname: CUSTOMER_PTR_NAME,
|
|
1954
|
+
};
|
|
1955
|
+
|
|
1956
|
+
expect(buildDeviceName(host, SHORT_NAMES)).toBe("ubuntu-22.04");
|
|
1957
|
+
});
|
|
1958
|
+
|
|
1959
|
+
test("a fully qualified sysName wins and is shortened, not the PTR name", () => {
|
|
1960
|
+
const host: DiscoveredNetworkDevice = {
|
|
1961
|
+
ipAddress: "10.18.167.31",
|
|
1962
|
+
sysName: "kds-controller.corp.example.com",
|
|
1963
|
+
dnsHostname: CUSTOMER_PTR_NAME,
|
|
1964
|
+
};
|
|
1965
|
+
|
|
1966
|
+
expect(buildDeviceName(host, SHORT_NAMES)).toBe("kds-controller");
|
|
1967
|
+
});
|
|
1968
|
+
|
|
1969
|
+
/*
|
|
1970
|
+
* The general statement, over every naming combination: the short name
|
|
1971
|
+
* is always the short form of the FULL name the host would get with the
|
|
1972
|
+
* setting off, or that full name itself.
|
|
1973
|
+
*/
|
|
1974
|
+
test("the short name is always the full name or its first label", () => {
|
|
1975
|
+
const hosts: Array<DiscoveredNetworkDevice> = [
|
|
1976
|
+
{ ipAddress: "10.0.0.1" },
|
|
1977
|
+
{ ipAddress: "10.0.0.2", dnsHostname: "gw.corp.example.com" },
|
|
1978
|
+
{ ipAddress: "10.0.0.3", sysName: "sw-3" },
|
|
1979
|
+
{ ipAddress: "10.0.0.4", sysName: "sw-4.corp.example.com" },
|
|
1980
|
+
{
|
|
1981
|
+
ipAddress: "10.0.0.5",
|
|
1982
|
+
sysName: "Core Switch",
|
|
1983
|
+
dnsHostname: "sw5.corp.example.com",
|
|
1984
|
+
},
|
|
1985
|
+
{ ipAddress: "10.0.0.6", dnsHostname: "ubuntu-22.04" },
|
|
1986
|
+
{ ipAddress: "2001:db8::7", dnsHostname: "v6.corp.example.com" },
|
|
1987
|
+
];
|
|
1988
|
+
|
|
1989
|
+
for (const host of hosts) {
|
|
1990
|
+
const full: string = getDiscoveredHostDisplayName(host, FULL_NAMES);
|
|
1991
|
+
const short: string = getDiscoveredHostDisplayName(host, SHORT_NAMES);
|
|
1992
|
+
|
|
1993
|
+
expect([full, full.split(".")[0]]).toContain(short);
|
|
1994
|
+
expect(full.startsWith(short)).toBe(true);
|
|
1995
|
+
}
|
|
1996
|
+
});
|
|
1997
|
+
});
|
|
1998
|
+
|
|
1999
|
+
describe("the Review name, the device name and the fallback agree", () => {
|
|
2000
|
+
test("the device is created under the clamped short display name", () => {
|
|
2001
|
+
const longPtrName: string = `${"a".repeat(63)}.${"b".repeat(
|
|
2002
|
+
40,
|
|
2003
|
+
)}.example.com`;
|
|
2004
|
+
|
|
2005
|
+
const hosts: Array<DiscoveredNetworkDevice> = [
|
|
2006
|
+
{ ipAddress: "10.0.0.1" },
|
|
2007
|
+
customerHost,
|
|
2008
|
+
snmpHost({ sysName: "core-sw-01.corp.example.com" }),
|
|
2009
|
+
snmpHost({ sysName: "Core Switch" }),
|
|
2010
|
+
{ ipAddress: "10.0.0.5", dnsHostname: longPtrName },
|
|
2011
|
+
snmpHost({ sysName: "long-sysname-".repeat(20) }),
|
|
2012
|
+
];
|
|
2013
|
+
|
|
2014
|
+
for (const host of hosts) {
|
|
2015
|
+
const displayed: string = getDiscoveredHostDisplayName(
|
|
2016
|
+
host,
|
|
2017
|
+
SHORT_NAMES,
|
|
2018
|
+
);
|
|
2019
|
+
|
|
2020
|
+
expect(buildDeviceName(host, SHORT_NAMES)).toBe(
|
|
2021
|
+
displayed.substring(0, MAX_DEVICE_NAME_LENGTH),
|
|
2022
|
+
);
|
|
2023
|
+
expect(build({ host: host, scan: shortNamesScan() }).name).toBe(
|
|
2024
|
+
buildDeviceName(host, SHORT_NAMES),
|
|
2025
|
+
);
|
|
2026
|
+
}
|
|
2027
|
+
});
|
|
2028
|
+
|
|
2029
|
+
/*
|
|
2030
|
+
* Clamping happens AFTER shortening. A PTR name too long to be a device
|
|
2031
|
+
* name with the setting off becomes a first label that fits whole with it
|
|
2032
|
+
* on — the operator gets the entire hostname rather than an 80-character
|
|
2033
|
+
* fragment of the FQDN.
|
|
2034
|
+
*/
|
|
2035
|
+
test("a long PTR name is shortened first, so its first label is not clamped", () => {
|
|
2036
|
+
const label: string = "a".repeat(63);
|
|
2037
|
+
const host: DiscoveredNetworkDevice = {
|
|
2038
|
+
ipAddress: "10.0.0.5",
|
|
2039
|
+
dnsHostname: `${label}.${"b".repeat(40)}.example.com`,
|
|
2040
|
+
};
|
|
2041
|
+
|
|
2042
|
+
expect(buildDeviceName(host, FULL_NAMES)).toHaveLength(
|
|
2043
|
+
MAX_DEVICE_NAME_LENGTH,
|
|
2044
|
+
);
|
|
2045
|
+
expect(buildDeviceName(host, SHORT_NAMES)).toBe(label);
|
|
2046
|
+
});
|
|
2047
|
+
|
|
2048
|
+
test("a long name the rule refuses is still clamped with the setting on", () => {
|
|
2049
|
+
const name: string = buildDeviceName(
|
|
2050
|
+
snmpHost({ sysName: "x".repeat(255) }),
|
|
2051
|
+
SHORT_NAMES,
|
|
2052
|
+
);
|
|
2053
|
+
|
|
2054
|
+
expect(name).toHaveLength(MAX_DEVICE_NAME_LENGTH);
|
|
2055
|
+
|
|
2056
|
+
const versionLike: string = buildDeviceName(
|
|
2057
|
+
snmpHost({ sysName: `${"v".repeat(100)}.22.04` }),
|
|
2058
|
+
SHORT_NAMES,
|
|
2059
|
+
);
|
|
2060
|
+
|
|
2061
|
+
expect(versionLike).toBe(
|
|
2062
|
+
`${"v".repeat(100)}.22.04`.substring(0, MAX_DEVICE_NAME_LENGTH),
|
|
2063
|
+
);
|
|
2064
|
+
});
|
|
2065
|
+
|
|
2066
|
+
/*
|
|
2067
|
+
* A wildcard reverse zone gives many hosts one PTR name, so with the
|
|
2068
|
+
* setting on they share one SHORT name too, and the second create
|
|
2069
|
+
* collides. The retry name is the short name plus the address.
|
|
2070
|
+
*/
|
|
2071
|
+
test("the collision fallback is the short name plus the address", () => {
|
|
2072
|
+
expect(
|
|
2073
|
+
buildFallbackDeviceName(
|
|
2074
|
+
{ ipAddress: "10.0.0.5", dnsHostname: "web.corp.example.com" },
|
|
2075
|
+
SHORT_NAMES,
|
|
2076
|
+
),
|
|
2077
|
+
).toBe("web (10.0.0.5)");
|
|
2078
|
+
|
|
2079
|
+
expect(
|
|
2080
|
+
buildFallbackDeviceName(
|
|
2081
|
+
{ ipAddress: "2001:db8::5", dnsHostname: "web.corp.example.com" },
|
|
2082
|
+
SHORT_NAMES,
|
|
2083
|
+
),
|
|
2084
|
+
).toBe("web (2001:db8::5)");
|
|
2085
|
+
|
|
2086
|
+
expect(
|
|
2087
|
+
buildFallbackDeviceName(
|
|
2088
|
+
snmpHost({ sysName: "Core Switch" }),
|
|
2089
|
+
SHORT_NAMES,
|
|
2090
|
+
),
|
|
2091
|
+
).toBe("Core Switch (10.0.0.5)");
|
|
2092
|
+
});
|
|
2093
|
+
|
|
2094
|
+
test("the fallback still tells a wildcard range apart", () => {
|
|
2095
|
+
const first: string = buildFallbackDeviceName(
|
|
2096
|
+
{
|
|
2097
|
+
ipAddress: "10.18.166.51",
|
|
2098
|
+
dnsHostname: "dhcp-pool.corp.example.com",
|
|
2099
|
+
},
|
|
2100
|
+
SHORT_NAMES,
|
|
2101
|
+
);
|
|
2102
|
+
const second: string = buildFallbackDeviceName(
|
|
2103
|
+
{
|
|
2104
|
+
ipAddress: "10.18.166.52",
|
|
2105
|
+
dnsHostname: "dhcp-pool.corp.example.com",
|
|
2106
|
+
},
|
|
2107
|
+
SHORT_NAMES,
|
|
2108
|
+
);
|
|
2109
|
+
|
|
2110
|
+
expect(first).toBe("dhcp-pool (10.18.166.51)");
|
|
2111
|
+
expect(second).toBe("dhcp-pool (10.18.166.52)");
|
|
2112
|
+
});
|
|
2113
|
+
|
|
2114
|
+
test("the fallback with a long first label keeps the address and the ceiling", () => {
|
|
2115
|
+
const name: string = buildFallbackDeviceName(
|
|
2116
|
+
{
|
|
2117
|
+
ipAddress: "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
|
|
2118
|
+
dnsHostname: `${"a".repeat(63)}.example.com`,
|
|
2119
|
+
},
|
|
2120
|
+
SHORT_NAMES,
|
|
2121
|
+
);
|
|
2122
|
+
|
|
2123
|
+
expect(name).toHaveLength(MAX_DEVICE_NAME_LENGTH);
|
|
2124
|
+
expect(name.endsWith(" (2001:0db8:85a3:0000:0000:8a2e:0370:7334)")).toBe(
|
|
2125
|
+
true,
|
|
2126
|
+
);
|
|
2127
|
+
expect(Slug.getSlug(name).length).toBeLessThanOrEqual(ColumnLength.Slug);
|
|
2128
|
+
});
|
|
2129
|
+
});
|
|
2130
|
+
|
|
2131
|
+
describe("the builder reads the scan's own setting", () => {
|
|
2132
|
+
/*
|
|
2133
|
+
* buildNetworkDeviceFromDiscoveredHost takes no naming argument of its
|
|
2134
|
+
* own: the scan it is handed IS the naming choice. That is what makes a
|
|
2135
|
+
* caller that selected the scan without the column fail loudly (a type
|
|
2136
|
+
* error on DiscoveredDeviceScanSource) instead of importing full names
|
|
2137
|
+
* from a scan that asked for short ones.
|
|
2138
|
+
*/
|
|
2139
|
+
test("a scan with the setting on imports the short name", () => {
|
|
2140
|
+
const device: NetworkDevice = build({
|
|
2141
|
+
host: customerHost,
|
|
2142
|
+
scan: shortNamesScan(),
|
|
2143
|
+
});
|
|
2144
|
+
|
|
2145
|
+
expect(device.name).toBe("wb-0660-kds01");
|
|
2146
|
+
expect(device.hostname).toBe("10.18.167.31");
|
|
2147
|
+
});
|
|
2148
|
+
|
|
2149
|
+
test("a scan without the setting imports the full name", () => {
|
|
2150
|
+
expect(build({ host: customerHost }).name).toBe(CUSTOMER_PTR_NAME);
|
|
2151
|
+
expect(
|
|
2152
|
+
build({
|
|
2153
|
+
host: customerHost,
|
|
2154
|
+
scan: { ...fullScanSource(), useShortDeviceNames: false },
|
|
2155
|
+
}).name,
|
|
2156
|
+
).toBe(CUSTOMER_PTR_NAME);
|
|
2157
|
+
});
|
|
2158
|
+
|
|
2159
|
+
/*
|
|
2160
|
+
* Naming is independent of credentials. A multi-config scan with the
|
|
2161
|
+
* setting on must still hand each host its own config.
|
|
2162
|
+
*/
|
|
2163
|
+
test("the setting changes the name and nothing else about the device", () => {
|
|
2164
|
+
const host: DiscoveredNetworkDevice = snmpHost({
|
|
2165
|
+
sysName: "core-rtr-01.corp.example.com",
|
|
2166
|
+
snmpConfigId: CORE_CONFIG_ID,
|
|
2167
|
+
});
|
|
2168
|
+
|
|
2169
|
+
const withFullNames: NetworkDevice = build({
|
|
2170
|
+
host: host,
|
|
2171
|
+
scan: multiConfigScanSource(),
|
|
2172
|
+
});
|
|
2173
|
+
const withShortNames: NetworkDevice = build({
|
|
2174
|
+
host: host,
|
|
2175
|
+
scan: { ...multiConfigScanSource(), useShortDeviceNames: true },
|
|
2176
|
+
});
|
|
2177
|
+
|
|
2178
|
+
expect(withFullNames.name).toBe("core-rtr-01.corp.example.com");
|
|
2179
|
+
expect(withShortNames.name).toBe("core-rtr-01");
|
|
2180
|
+
|
|
2181
|
+
expect(withShortNames.hostname).toBe(withFullNames.hostname);
|
|
2182
|
+
expect(withShortNames.description).toBe(withFullNames.description);
|
|
2183
|
+
expect(withShortNames.monitoringMethod).toBe(
|
|
2184
|
+
withFullNames.monitoringMethod,
|
|
2185
|
+
);
|
|
2186
|
+
expect(withShortNames.isPollingEnabled).toBe(
|
|
2187
|
+
withFullNames.isPollingEnabled,
|
|
2188
|
+
);
|
|
2189
|
+
expect(withShortNames.probeId?.toString()).toBe(
|
|
2190
|
+
withFullNames.probeId?.toString(),
|
|
2191
|
+
);
|
|
2192
|
+
expect(withShortNames.snmpVersion).toBe("V3");
|
|
2193
|
+
expect(withShortNames.snmpV3Username).toBe("core-observer");
|
|
2194
|
+
expect(withShortNames.snmpCommunityString).toBeUndefined();
|
|
2195
|
+
});
|
|
2196
|
+
|
|
2197
|
+
/*
|
|
2198
|
+
* The collision retry passes the fallback name explicitly, and it must
|
|
2199
|
+
* be used verbatim — the builder may not shorten a name it was handed,
|
|
2200
|
+
* or "web (10.0.0.5)" and a hand-supplied FQDN would both be rewritten.
|
|
2201
|
+
*/
|
|
2202
|
+
test("an explicit name still wins, verbatim, with the setting on", () => {
|
|
2203
|
+
expect(
|
|
2204
|
+
build({
|
|
2205
|
+
host: customerHost,
|
|
2206
|
+
scan: shortNamesScan(),
|
|
2207
|
+
name: "custom-kds-name",
|
|
2208
|
+
}).name,
|
|
2209
|
+
).toBe("custom-kds-name");
|
|
2210
|
+
|
|
2211
|
+
expect(
|
|
2212
|
+
build({
|
|
2213
|
+
host: customerHost,
|
|
2214
|
+
scan: shortNamesScan(),
|
|
2215
|
+
name: "kds-override.corp.example.com",
|
|
2216
|
+
}).name,
|
|
2217
|
+
).toBe("kds-override.corp.example.com");
|
|
2218
|
+
});
|
|
2219
|
+
|
|
2220
|
+
test("the retry creates the device under the short fallback name", () => {
|
|
2221
|
+
const scan: DiscoveredDeviceScanSource = shortNamesScan();
|
|
2222
|
+
|
|
2223
|
+
const device: NetworkDevice = build({
|
|
2224
|
+
host: customerHost,
|
|
2225
|
+
scan: scan,
|
|
2226
|
+
name: buildFallbackDeviceName(customerHost, scan),
|
|
2227
|
+
});
|
|
2228
|
+
|
|
2229
|
+
expect(device.name).toBe("wb-0660-kds01 (10.18.167.31)");
|
|
2230
|
+
expect(device.hostname).toBe("10.18.167.31");
|
|
2231
|
+
expect(device.dnsName).toBe(CUSTOMER_PTR_NAME);
|
|
2232
|
+
});
|
|
2233
|
+
|
|
2234
|
+
// The scan model itself is a naming choice, structurally.
|
|
2235
|
+
test("a scan source is accepted wherever a naming choice is", () => {
|
|
2236
|
+
const scan: DiscoveredDeviceScanSource = shortNamesScan();
|
|
2237
|
+
const naming: DiscoveredHostNaming = scan;
|
|
2238
|
+
|
|
2239
|
+
expect(buildDeviceName(customerHost, naming)).toBe("wb-0660-kds01");
|
|
2240
|
+
});
|
|
2241
|
+
});
|
|
2242
|
+
});
|
|
2243
|
+
|
|
2244
|
+
/*
|
|
2245
|
+
* The unshortened winner, which the Review dialog shows beside a shortened
|
|
2246
|
+
* name so the operator can see what was cut. It must be exactly what the
|
|
2247
|
+
* display name WOULD be with short names off.
|
|
2248
|
+
*/
|
|
2249
|
+
describe("getDiscoveredHostFullName", () => {
|
|
2250
|
+
test("returns the full PTR name a short display name was cut from", () => {
|
|
2251
|
+
const host: DiscoveredNetworkDevice = {
|
|
2252
|
+
ipAddress: "10.18.167.31",
|
|
2253
|
+
dnsHostname: "wb-0660-kds01.wbhq.com.",
|
|
2254
|
+
};
|
|
2255
|
+
|
|
2256
|
+
expect(getDiscoveredHostFullName(host)).toBe("wb-0660-kds01.wbhq.com");
|
|
2257
|
+
expect(getDiscoveredHostDisplayName(host, SHORT_NAMES)).toBe(
|
|
2258
|
+
"wb-0660-kds01",
|
|
2259
|
+
);
|
|
2260
|
+
});
|
|
2261
|
+
|
|
2262
|
+
test("returns the full sysName, trimmed, when the sysName won", () => {
|
|
2263
|
+
expect(
|
|
2264
|
+
getDiscoveredHostFullName(
|
|
2265
|
+
snmpHost({ sysName: " core-sw-01.corp.example.com " }),
|
|
2266
|
+
),
|
|
2267
|
+
).toBe("core-sw-01.corp.example.com");
|
|
2268
|
+
});
|
|
2269
|
+
|
|
2270
|
+
test("keeps the sysName ahead of the PTR name", () => {
|
|
2271
|
+
expect(
|
|
2272
|
+
getDiscoveredHostFullName({
|
|
2273
|
+
ipAddress: "10.0.0.5",
|
|
2274
|
+
sysName: "Core Switch",
|
|
2275
|
+
dnsHostname: "sw.corp.example.com",
|
|
2276
|
+
}),
|
|
2277
|
+
).toBe("Core Switch");
|
|
2278
|
+
});
|
|
2279
|
+
|
|
2280
|
+
test("falls back to the address, and never throws on junk", () => {
|
|
2281
|
+
expect(getDiscoveredHostFullName({ ipAddress: "10.0.0.5" })).toBe(
|
|
2282
|
+
"10.0.0.5",
|
|
2283
|
+
);
|
|
2284
|
+
expect(
|
|
2285
|
+
getDiscoveredHostFullName({
|
|
2286
|
+
ipAddress: "10.0.0.5",
|
|
2287
|
+
sysName: 42 as unknown as string,
|
|
2288
|
+
dnsHostname: "<b>x</b>",
|
|
2289
|
+
}),
|
|
2290
|
+
).toBe("10.0.0.5");
|
|
2291
|
+
expect(
|
|
2292
|
+
getDiscoveredHostFullName({ ipAddress: null as unknown as string }),
|
|
2293
|
+
).toBe("");
|
|
2294
|
+
});
|
|
2295
|
+
|
|
2296
|
+
/*
|
|
2297
|
+
* Stated as the relationship the dialog depends on, across every naming
|
|
2298
|
+
* combination: the full name IS the display name with short names off, and
|
|
2299
|
+
* the short display name is derived from it and nothing else.
|
|
2300
|
+
*/
|
|
2301
|
+
test("is the display name with short names off, whatever the host", () => {
|
|
2302
|
+
const hosts: Array<DiscoveredNetworkDevice> = [
|
|
2303
|
+
{ ipAddress: "10.0.0.1" },
|
|
2304
|
+
{ ipAddress: "10.0.0.2", dnsHostname: "gw.corp.example.com" },
|
|
2305
|
+
{ ipAddress: "10.0.0.3", sysName: "sw-3.corp.example.com" },
|
|
2306
|
+
{ ipAddress: "10.0.0.4", sysName: " ", dnsHostname: "a.b.example" },
|
|
2307
|
+
{ ipAddress: "10.0.0.5", dnsHostname: "ubuntu-22.04" },
|
|
2308
|
+
{ ipAddress: 42 as unknown as string },
|
|
2309
|
+
];
|
|
2310
|
+
|
|
2311
|
+
for (const host of hosts) {
|
|
2312
|
+
expect(getDiscoveredHostFullName(host)).toBe(
|
|
2313
|
+
getDiscoveredHostDisplayName(host, FULL_NAMES),
|
|
2314
|
+
);
|
|
2315
|
+
expect(getDiscoveredHostFullName(host)).toBe(
|
|
2316
|
+
getDiscoveredHostDisplayName(host, {}),
|
|
2317
|
+
);
|
|
2318
|
+
}
|
|
2319
|
+
});
|
|
2320
|
+
|
|
2321
|
+
test("differs from the short display name only when something was cut", () => {
|
|
2322
|
+
expect(
|
|
2323
|
+
getDiscoveredHostFullName({ ipAddress: "10.0.0.5", sysName: "sw-3" }),
|
|
2324
|
+
).toBe(
|
|
2325
|
+
getDiscoveredHostDisplayName(
|
|
2326
|
+
{ ipAddress: "10.0.0.5", sysName: "sw-3" },
|
|
2327
|
+
SHORT_NAMES,
|
|
2328
|
+
),
|
|
2329
|
+
);
|
|
2330
|
+
expect(
|
|
2331
|
+
getDiscoveredHostFullName({
|
|
2332
|
+
ipAddress: "10.0.0.5",
|
|
2333
|
+
dnsHostname: "sw-3.corp.example.com",
|
|
2334
|
+
}),
|
|
2335
|
+
).not.toBe(
|
|
2336
|
+
getDiscoveredHostDisplayName(
|
|
2337
|
+
{ ipAddress: "10.0.0.5", dnsHostname: "sw-3.corp.example.com" },
|
|
2338
|
+
SHORT_NAMES,
|
|
2339
|
+
),
|
|
2340
|
+
);
|
|
2341
|
+
});
|
|
2342
|
+
|
|
2343
|
+
// It is the unclamped winner: the dialog shows it whole.
|
|
2344
|
+
test("is not clamped", () => {
|
|
2345
|
+
const longName: string = `${"a".repeat(63)}.${"b".repeat(40)}.example.com`;
|
|
2346
|
+
|
|
2347
|
+
expect(
|
|
2348
|
+
getDiscoveredHostFullName({
|
|
2349
|
+
ipAddress: "10.0.0.5",
|
|
2350
|
+
dnsHostname: longName,
|
|
2351
|
+
}),
|
|
2352
|
+
).toBe(longName);
|
|
2353
|
+
});
|
|
2354
|
+
});
|
|
2355
|
+
|
|
2356
|
+
/*
|
|
2357
|
+
* NetworkDevice.dnsName (issue #3678): the host's full reverse-DNS name, kept
|
|
2358
|
+
* on the device whatever it ends up being called.
|
|
2359
|
+
*
|
|
2360
|
+
* With short names on it is the ONLY place the FQDN survives, which is what
|
|
2361
|
+
* the issue's follow-up comment asked for; and it is what a site rule written
|
|
2362
|
+
* against "*.wbhq.com" still matches after the name loses the domain. So it is
|
|
2363
|
+
* a fact about the host, not a presentation choice, and these cases pin that
|
|
2364
|
+
* it is written from the PTR record, normalised, and from nowhere else.
|
|
2365
|
+
*/
|
|
2366
|
+
describe("the device's DNS name", () => {
|
|
2367
|
+
test("is the PTR name, with short names on", () => {
|
|
2368
|
+
const device: NetworkDevice = build({
|
|
2369
|
+
host: {
|
|
2370
|
+
ipAddress: "10.18.167.31",
|
|
2371
|
+
dnsHostname: "wb-0660-kds01.wbhq.com",
|
|
2372
|
+
},
|
|
2373
|
+
scan: shortNamesScan(),
|
|
2374
|
+
});
|
|
2375
|
+
|
|
2376
|
+
expect(device.name).toBe("wb-0660-kds01");
|
|
2377
|
+
expect(device.dnsName).toBe("wb-0660-kds01.wbhq.com");
|
|
2378
|
+
});
|
|
2379
|
+
|
|
2380
|
+
test("is the PTR name, with short names off", () => {
|
|
2381
|
+
const device: NetworkDevice = build({
|
|
2382
|
+
host: {
|
|
2383
|
+
ipAddress: "10.18.167.31",
|
|
2384
|
+
dnsHostname: "wb-0660-kds01.wbhq.com",
|
|
2385
|
+
},
|
|
2386
|
+
});
|
|
2387
|
+
|
|
2388
|
+
expect(device.name).toBe("wb-0660-kds01.wbhq.com");
|
|
2389
|
+
expect(device.dnsName).toBe("wb-0660-kds01.wbhq.com");
|
|
2390
|
+
});
|
|
2391
|
+
|
|
2392
|
+
test("is set even when the sysName names the device", () => {
|
|
2393
|
+
const device: NetworkDevice = build({
|
|
2394
|
+
host: snmpHost({ dnsHostname: "sw1.corp.example.com" }),
|
|
2395
|
+
scan: shortNamesScan(),
|
|
2396
|
+
});
|
|
2397
|
+
|
|
2398
|
+
expect(device.name).toBe("core-switch-01");
|
|
2399
|
+
expect(device.dnsName).toBe("sw1.corp.example.com");
|
|
2400
|
+
});
|
|
2401
|
+
|
|
2402
|
+
test("is set on a ping-only host", () => {
|
|
2403
|
+
const device: NetworkDevice = build({
|
|
2404
|
+
host: {
|
|
2405
|
+
ipAddress: "10.18.167.31",
|
|
2406
|
+
snmpReachable: false,
|
|
2407
|
+
dnsHostname: "cam-lobby.corp.example.com",
|
|
2408
|
+
},
|
|
2409
|
+
});
|
|
2410
|
+
|
|
2411
|
+
expect(device.dnsName).toBe("cam-lobby.corp.example.com");
|
|
2412
|
+
expect(device.snmpCommunityString).toBeUndefined();
|
|
2413
|
+
});
|
|
2414
|
+
|
|
2415
|
+
test("is stored normalised: no root dot, no padding, case preserved", () => {
|
|
2416
|
+
expect(
|
|
2417
|
+
build({
|
|
2418
|
+
host: {
|
|
2419
|
+
ipAddress: "10.18.167.31",
|
|
2420
|
+
dnsHostname: " WB-0660-KDS01.WbHq.com. ",
|
|
2421
|
+
},
|
|
2422
|
+
}).dnsName,
|
|
2423
|
+
).toBe("WB-0660-KDS01.WbHq.com");
|
|
2424
|
+
});
|
|
2425
|
+
|
|
2426
|
+
test("is set even when the short-name rule refuses the name", () => {
|
|
2427
|
+
const device: NetworkDevice = build({
|
|
2428
|
+
host: { ipAddress: "10.18.167.31", dnsHostname: "ubuntu-22.04" },
|
|
2429
|
+
scan: shortNamesScan(),
|
|
2430
|
+
});
|
|
2431
|
+
|
|
2432
|
+
expect(device.name).toBe("ubuntu-22.04");
|
|
2433
|
+
expect(device.dnsName).toBe("ubuntu-22.04");
|
|
2434
|
+
});
|
|
2435
|
+
|
|
2436
|
+
/*
|
|
2437
|
+
* A PTR name is at most 253 characters, which is far more than the
|
|
2438
|
+
* 80-character device name but well inside the column. It is stored WHOLE:
|
|
2439
|
+
* clamping it like the name would store half a DNS name.
|
|
2440
|
+
*/
|
|
2441
|
+
test("is stored whole at the longest name DNS allows, unlike the device name", () => {
|
|
2442
|
+
const maximalName: string = `${"a".repeat(63)}.${"b".repeat(
|
|
2443
|
+
63,
|
|
2444
|
+
)}.${"c".repeat(63)}.${"d".repeat(61)}`;
|
|
2445
|
+
|
|
2446
|
+
const device: NetworkDevice = build({
|
|
2447
|
+
host: { ipAddress: "10.18.167.31", dnsHostname: maximalName },
|
|
2448
|
+
});
|
|
2449
|
+
|
|
2450
|
+
expect(maximalName).toHaveLength(MAX_DEVICE_DNS_NAME_LENGTH);
|
|
2451
|
+
expect(device.dnsName).toBe(maximalName);
|
|
2452
|
+
expect(device.name).toHaveLength(MAX_DEVICE_NAME_LENGTH);
|
|
2453
|
+
});
|
|
2454
|
+
|
|
2455
|
+
test("its ceiling is the DNS ceiling, and fits the column", () => {
|
|
2456
|
+
expect(MAX_DEVICE_DNS_NAME_LENGTH).toBe(MAX_REVERSE_DNS_NAME_LENGTH);
|
|
2457
|
+
expect(MAX_DEVICE_DNS_NAME_LENGTH).toBeLessThanOrEqual(
|
|
2458
|
+
ColumnLength.LongText,
|
|
2459
|
+
);
|
|
2460
|
+
});
|
|
2461
|
+
|
|
2462
|
+
test("survives the collision retry's explicit name", () => {
|
|
2463
|
+
const host: DiscoveredNetworkDevice = {
|
|
2464
|
+
ipAddress: "10.18.166.52",
|
|
2465
|
+
dnsHostname: "dhcp-pool.corp.example.com",
|
|
2466
|
+
};
|
|
2467
|
+
|
|
2468
|
+
const device: NetworkDevice = build({
|
|
2469
|
+
host: host,
|
|
2470
|
+
name: buildFallbackDeviceName(host, FULL_NAMES),
|
|
2471
|
+
});
|
|
2472
|
+
|
|
2473
|
+
expect(device.name).toBe("dhcp-pool.corp.example.com (10.18.166.52)");
|
|
2474
|
+
expect(device.dnsName).toBe("dhcp-pool.corp.example.com");
|
|
2475
|
+
});
|
|
2476
|
+
|
|
2477
|
+
describe("is absent when there is no usable PTR name", () => {
|
|
2478
|
+
/*
|
|
2479
|
+
* "Absent", not "blank": an empty string is still a value on a create
|
|
2480
|
+
* payload, and a device with no PTR record should read as having no DNS
|
|
2481
|
+
* name rather than one that happens to be empty. The model initialises
|
|
2482
|
+
* the property to undefined, so undefined is what "not written" looks
|
|
2483
|
+
* like.
|
|
2484
|
+
*/
|
|
2485
|
+
const NO_USABLE_PTR: Array<{ reason: string; dnsHostname: unknown }> = [
|
|
2486
|
+
{ reason: "no PTR record", dnsHostname: undefined },
|
|
2487
|
+
{ reason: "an empty PTR answer", dnsHostname: "" },
|
|
2488
|
+
{ reason: "a blank PTR answer", dnsHostname: " " },
|
|
2489
|
+
{ reason: "markup", dnsHostname: "<script>alert(1)</script>" },
|
|
2490
|
+
{ reason: "a name with spaces", dnsHostname: "core switch" },
|
|
2491
|
+
{ reason: "the address restated", dnsHostname: "10.18.167.31" },
|
|
2492
|
+
{
|
|
2493
|
+
reason: "an in-addr.arpa echo",
|
|
2494
|
+
dnsHostname: "31.167.18.10.in-addr.arpa",
|
|
2495
|
+
},
|
|
2496
|
+
{
|
|
2497
|
+
reason: "a name longer than DNS allows",
|
|
2498
|
+
dnsHostname: ["a", "b", "c", "d", "e"]
|
|
2499
|
+
.map((letter: string): string => {
|
|
2500
|
+
return letter.repeat(60);
|
|
2501
|
+
})
|
|
2502
|
+
.join("."),
|
|
2503
|
+
},
|
|
2504
|
+
{ reason: "a number", dnsHostname: 42 },
|
|
2505
|
+
{ reason: "null", dnsHostname: null },
|
|
2506
|
+
{
|
|
2507
|
+
reason: "the resolver's whole answer array",
|
|
2508
|
+
dnsHostname: ["gw.corp.example.com"],
|
|
2509
|
+
},
|
|
2510
|
+
{
|
|
2511
|
+
reason: "a string-like object",
|
|
2512
|
+
dnsHostname: {
|
|
2513
|
+
toString: (): string => {
|
|
2514
|
+
return "gw.corp.example.com";
|
|
2515
|
+
},
|
|
2516
|
+
},
|
|
2517
|
+
},
|
|
2518
|
+
];
|
|
2519
|
+
|
|
2520
|
+
for (const noPtr of NO_USABLE_PTR) {
|
|
2521
|
+
test(`${noPtr.reason}`, () => {
|
|
2522
|
+
for (const scan of [fullScanSource(), shortNamesScan()]) {
|
|
2523
|
+
const device: NetworkDevice = build({
|
|
2524
|
+
host: {
|
|
2525
|
+
ipAddress: "10.18.167.31",
|
|
2526
|
+
dnsHostname: noPtr.dnsHostname as string,
|
|
2527
|
+
},
|
|
2528
|
+
scan: scan,
|
|
2529
|
+
});
|
|
2530
|
+
|
|
2531
|
+
expect(device.dnsName).toBeUndefined();
|
|
2532
|
+
expect(device.dnsName).not.toBe("");
|
|
2533
|
+
expect(device.name).toBe("10.18.167.31");
|
|
2534
|
+
}
|
|
2535
|
+
});
|
|
2536
|
+
}
|
|
2537
|
+
});
|
|
2538
|
+
|
|
2539
|
+
/*
|
|
2540
|
+
* sysName is the name the device gives ITSELF. It is already stored as
|
|
2541
|
+
* sysName by the first poll, and calling it a DNS name would be a claim no
|
|
2542
|
+
* resolver made — even when it looks exactly like one.
|
|
2543
|
+
*/
|
|
2544
|
+
test("is never taken from the sysName", () => {
|
|
2545
|
+
for (const scan of [fullScanSource(), shortNamesScan()]) {
|
|
2546
|
+
const device: NetworkDevice = build({
|
|
2547
|
+
host: snmpHost({ sysName: "core-sw-01.corp.example.com" }),
|
|
2548
|
+
scan: scan,
|
|
2549
|
+
});
|
|
2550
|
+
|
|
2551
|
+
expect(device.dnsName).toBeUndefined();
|
|
2552
|
+
}
|
|
2553
|
+
});
|
|
2554
|
+
|
|
2555
|
+
test("is never taken from the device name or the address", () => {
|
|
2556
|
+
const device: NetworkDevice = build({
|
|
2557
|
+
host: { ipAddress: "10.18.167.31" },
|
|
2558
|
+
name: "kds01.wbhq.com",
|
|
2559
|
+
});
|
|
2560
|
+
|
|
2561
|
+
expect(device.name).toBe("kds01.wbhq.com");
|
|
2562
|
+
expect(device.dnsName).toBeUndefined();
|
|
2563
|
+
});
|
|
2564
|
+
});
|
|
2565
|
+
|
|
2566
|
+
/*
|
|
2567
|
+
* OneUptime issue #3677 — hosts with no DNS and no SNMP show only as raw IPs.
|
|
2568
|
+
*
|
|
2569
|
+
* The reporter's 10.18.167.31-36 have no PTR record and answer no SNMP, so the
|
|
2570
|
+
* naming chain above had nothing for them but the address. A scan with NetBIOS
|
|
2571
|
+
* lookup on asks those hosts for their NetBIOS name, and the probe stores the
|
|
2572
|
+
* answer as `netbiosName`. These cases pin where that name sits in the chain
|
|
2573
|
+
* — third, below both names that existed before it — and that it is treated
|
|
2574
|
+
* as what it is: a SELF-REPORTED value read out of jsonb, normalised again at
|
|
2575
|
+
* the point of use, allowed to name the device and nothing more.
|
|
2576
|
+
*/
|
|
2577
|
+
describe("the NetBIOS name (issue #3677)", () => {
|
|
2578
|
+
// The reporter's address, and a name one of those hosts could answer with.
|
|
2579
|
+
const REPORTER_ADDRESS: string = "10.18.167.31";
|
|
2580
|
+
|
|
2581
|
+
const netbiosHost: DiscoveredNetworkDevice = {
|
|
2582
|
+
ipAddress: REPORTER_ADDRESS,
|
|
2583
|
+
snmpReachable: false,
|
|
2584
|
+
netbiosName: "reg01",
|
|
2585
|
+
};
|
|
2586
|
+
|
|
2587
|
+
describe("precedence: sysName, then PTR name, then NetBIOS name, then address", () => {
|
|
2588
|
+
test("a host with only a NetBIOS name is named by it, not by its address", () => {
|
|
2589
|
+
// The reported case, in one line.
|
|
2590
|
+
expect(buildDeviceName(netbiosHost, FULL_NAMES)).toBe("reg01");
|
|
2591
|
+
expect(getDiscoveredHostDisplayName(netbiosHost, FULL_NAMES)).toBe(
|
|
2592
|
+
"reg01",
|
|
2593
|
+
);
|
|
2594
|
+
expect(getDiscoveredHostFullName(netbiosHost)).toBe("reg01");
|
|
2595
|
+
});
|
|
2596
|
+
|
|
2597
|
+
test("the sysName beats both the PTR name and the NetBIOS name", () => {
|
|
2598
|
+
const host: DiscoveredNetworkDevice = {
|
|
2599
|
+
ipAddress: REPORTER_ADDRESS,
|
|
2600
|
+
sysName: "core-switch-01",
|
|
2601
|
+
dnsHostname: "reg01.corp.example.com",
|
|
2602
|
+
netbiosName: "workstation01",
|
|
2603
|
+
};
|
|
2604
|
+
|
|
2605
|
+
expect(buildDeviceName(host, FULL_NAMES)).toBe("core-switch-01");
|
|
2606
|
+
});
|
|
2607
|
+
|
|
2608
|
+
test("the sysName beats the NetBIOS name on its own", () => {
|
|
2609
|
+
expect(
|
|
2610
|
+
buildDeviceName(
|
|
2611
|
+
{ ...netbiosHost, sysName: "core-switch-01" },
|
|
2612
|
+
FULL_NAMES,
|
|
2613
|
+
),
|
|
2614
|
+
).toBe("core-switch-01");
|
|
2615
|
+
});
|
|
2616
|
+
|
|
2617
|
+
/*
|
|
2618
|
+
* The PTR name is published by whoever runs DNS for the subnet; the
|
|
2619
|
+
* NetBIOS name is whatever the host says about itself. Where both exist,
|
|
2620
|
+
* the published one wins.
|
|
2621
|
+
*/
|
|
2622
|
+
test("the PTR name beats the NetBIOS name", () => {
|
|
2623
|
+
const host: DiscoveredNetworkDevice = {
|
|
2624
|
+
...netbiosHost,
|
|
2625
|
+
dnsHostname: "wb-0660-kds01.wbhq.com",
|
|
2626
|
+
};
|
|
2627
|
+
|
|
2628
|
+
expect(buildDeviceName(host, FULL_NAMES)).toBe("wb-0660-kds01.wbhq.com");
|
|
2629
|
+
expect(buildDeviceName(host, SHORT_NAMES)).toBe("wb-0660-kds01");
|
|
2630
|
+
});
|
|
2631
|
+
|
|
2632
|
+
test("a whitespace sysName does not block the NetBIOS name", () => {
|
|
2633
|
+
expect(
|
|
2634
|
+
buildDeviceName({ ...netbiosHost, sysName: " " }, FULL_NAMES),
|
|
2635
|
+
).toBe("reg01");
|
|
2636
|
+
});
|
|
2637
|
+
|
|
2638
|
+
test("an unusable PTR name falls through to the NetBIOS name, not to the address", () => {
|
|
2639
|
+
expect(
|
|
2640
|
+
buildDeviceName(
|
|
2641
|
+
{ ...netbiosHost, dnsHostname: "<script>alert(1)</script>" },
|
|
2642
|
+
FULL_NAMES,
|
|
2643
|
+
),
|
|
2644
|
+
).toBe("reg01");
|
|
2645
|
+
expect(
|
|
2646
|
+
buildDeviceName(
|
|
2647
|
+
{ ...netbiosHost, dnsHostname: REPORTER_ADDRESS },
|
|
2648
|
+
FULL_NAMES,
|
|
2649
|
+
),
|
|
2650
|
+
).toBe("reg01");
|
|
2651
|
+
});
|
|
2652
|
+
|
|
2653
|
+
test("the NetBIOS name beats the address", () => {
|
|
2654
|
+
expect(buildDeviceName(netbiosHost, FULL_NAMES)).not.toBe(
|
|
2655
|
+
REPORTER_ADDRESS,
|
|
2656
|
+
);
|
|
2657
|
+
expect(buildDeviceName({ ipAddress: REPORTER_ADDRESS }, FULL_NAMES)).toBe(
|
|
2658
|
+
REPORTER_ADDRESS,
|
|
2659
|
+
);
|
|
2660
|
+
});
|
|
2661
|
+
});
|
|
2662
|
+
|
|
2663
|
+
/*
|
|
2664
|
+
* `discoveredDevices` is jsonb stored verbatim, so "the probe normalised it"
|
|
2665
|
+
* holds only for the probe that wrote the row. A row an older or modified
|
|
2666
|
+
* probe stored in the raw wire form — upper case, padded to fifteen bytes —
|
|
2667
|
+
* must name the device exactly as the normalised row would.
|
|
2668
|
+
*/
|
|
2669
|
+
describe("the raw jsonb value is normalised again at the point of use", () => {
|
|
2670
|
+
const RAW_FORMS: Array<{ reason: string; netbiosName: string }> = [
|
|
2671
|
+
{ reason: "upper case", netbiosName: "REG01" },
|
|
2672
|
+
{
|
|
2673
|
+
reason: "space-padded to fifteen bytes",
|
|
2674
|
+
netbiosName: "REG01 ",
|
|
2675
|
+
},
|
|
2676
|
+
{
|
|
2677
|
+
reason: "NUL-padded",
|
|
2678
|
+
netbiosName: `REG01${String.fromCharCode(0).repeat(10)}`,
|
|
2679
|
+
},
|
|
2680
|
+
{ reason: "leading and trailing spaces", netbiosName: " Reg01 " },
|
|
2681
|
+
];
|
|
2682
|
+
|
|
2683
|
+
for (const raw of RAW_FORMS) {
|
|
2684
|
+
test(`${raw.reason} names the device "reg01"`, () => {
|
|
2685
|
+
const host: DiscoveredNetworkDevice = {
|
|
2686
|
+
ipAddress: REPORTER_ADDRESS,
|
|
2687
|
+
netbiosName: raw.netbiosName,
|
|
2688
|
+
};
|
|
2689
|
+
|
|
2690
|
+
expect(getDiscoveredHostFullName(host)).toBe("reg01");
|
|
2691
|
+
expect(buildDeviceName(host, FULL_NAMES)).toBe("reg01");
|
|
2692
|
+
expect(build({ host: host }).name).toBe("reg01");
|
|
2693
|
+
});
|
|
2694
|
+
}
|
|
2695
|
+
});
|
|
2696
|
+
|
|
2697
|
+
describe("an unusable NetBIOS name falls through to the address", () => {
|
|
2698
|
+
const UNUSABLE: Array<{ reason: string; netbiosName: unknown }> = [
|
|
2699
|
+
{ reason: "a dotted name", netbiosName: "reg01.corp" },
|
|
2700
|
+
{ reason: "a trailing root dot", netbiosName: "REG01." },
|
|
2701
|
+
{ reason: "an inner space", netbiosName: "REG 01" },
|
|
2702
|
+
{ reason: "sixteen characters", netbiosName: "ABCDEFGHIJKLMNOP" },
|
|
2703
|
+
{ reason: "only digits", netbiosName: "123456" },
|
|
2704
|
+
{ reason: "an address spelled with dashes", netbiosName: "10-18-167" },
|
|
2705
|
+
{ reason: "markup", netbiosName: "<b>x</b>" },
|
|
2706
|
+
{
|
|
2707
|
+
reason: "the browser-election pseudo-name",
|
|
2708
|
+
netbiosName: "__MSBROWSE__",
|
|
2709
|
+
},
|
|
2710
|
+
{ reason: "only padding", netbiosName: " " },
|
|
2711
|
+
{ reason: "the empty string", netbiosName: "" },
|
|
2712
|
+
{ reason: "a number", netbiosName: 42 },
|
|
2713
|
+
{ reason: "null", netbiosName: null },
|
|
2714
|
+
{ reason: "an array", netbiosName: ["REG01"] },
|
|
2715
|
+
{
|
|
2716
|
+
reason: "a string-like object",
|
|
2717
|
+
netbiosName: {
|
|
2718
|
+
toString: (): string => {
|
|
2719
|
+
return "REG01";
|
|
2720
|
+
},
|
|
2721
|
+
},
|
|
2722
|
+
},
|
|
2723
|
+
];
|
|
2724
|
+
|
|
2725
|
+
for (const unusable of UNUSABLE) {
|
|
2726
|
+
test(`${unusable.reason}`, () => {
|
|
2727
|
+
const host: DiscoveredNetworkDevice = {
|
|
2728
|
+
ipAddress: REPORTER_ADDRESS,
|
|
2729
|
+
netbiosName: unusable.netbiosName as string,
|
|
2730
|
+
};
|
|
2731
|
+
|
|
2732
|
+
expect(() => {
|
|
2733
|
+
return getDiscoveredHostFullName(host);
|
|
2734
|
+
}).not.toThrow();
|
|
2735
|
+
|
|
2736
|
+
for (const naming of [FULL_NAMES, SHORT_NAMES]) {
|
|
2737
|
+
expect(buildDeviceName(host, naming)).toBe(REPORTER_ADDRESS);
|
|
2738
|
+
}
|
|
2739
|
+
expect(build({ host: host }).name).toBe(REPORTER_ADDRESS);
|
|
2740
|
+
});
|
|
2741
|
+
}
|
|
2742
|
+
});
|
|
2743
|
+
|
|
2744
|
+
/*
|
|
2745
|
+
* The short-name option cuts an FQDN to its first label. A NetBIOS name is
|
|
2746
|
+
* one dot-free label by construction, so there is nothing to cut — the
|
|
2747
|
+
* option must neither change it nor make it lose to anything else.
|
|
2748
|
+
*/
|
|
2749
|
+
describe("short names do not change a NetBIOS name", () => {
|
|
2750
|
+
test("getShortHostname declines a NetBIOS name, so there is nothing to cut", () => {
|
|
2751
|
+
expect(getShortHostname("reg01")).toBeUndefined();
|
|
2752
|
+
expect(getShortHostname("workstation01")).toBeUndefined();
|
|
2753
|
+
});
|
|
2754
|
+
|
|
2755
|
+
test("the name is the same with short names on, off, or unset", () => {
|
|
2756
|
+
expect(getDiscoveredHostDisplayName(netbiosHost, SHORT_NAMES)).toBe(
|
|
2757
|
+
"reg01",
|
|
2758
|
+
);
|
|
2759
|
+
expect(getDiscoveredHostDisplayName(netbiosHost, FULL_NAMES)).toBe(
|
|
2760
|
+
"reg01",
|
|
2761
|
+
);
|
|
2762
|
+
expect(getDiscoveredHostDisplayName(netbiosHost, {})).toBe("reg01");
|
|
2763
|
+
});
|
|
2764
|
+
|
|
2765
|
+
test("the device and its fallback name are the same with short names on or off", () => {
|
|
2766
|
+
for (const scan of [fullScanSource(), shortNamesScan()]) {
|
|
2767
|
+
expect(build({ host: netbiosHost, scan: scan }).name).toBe("reg01");
|
|
2768
|
+
expect(buildFallbackDeviceName(netbiosHost, scan)).toBe(
|
|
2769
|
+
"reg01 (10.18.167.31)",
|
|
2770
|
+
);
|
|
2771
|
+
}
|
|
2772
|
+
});
|
|
2773
|
+
|
|
2774
|
+
test("a raw upper-case name is lower-cased, not shortened, with short names on", () => {
|
|
2775
|
+
expect(
|
|
2776
|
+
getDiscoveredHostDisplayName(
|
|
2777
|
+
{ ipAddress: REPORTER_ADDRESS, netbiosName: "REG01 " },
|
|
2778
|
+
SHORT_NAMES,
|
|
2779
|
+
),
|
|
2780
|
+
).toBe("reg01");
|
|
2781
|
+
});
|
|
2782
|
+
});
|
|
2783
|
+
|
|
2784
|
+
/*
|
|
2785
|
+
* Several Windows hosts answering with the same name — a cloned image, a
|
|
2786
|
+
* rebuilt machine that kept its predecessor's name — collide on the device
|
|
2787
|
+
* name exactly as a wildcard PTR zone does, and the same fallback breaks
|
|
2788
|
+
* the tie.
|
|
2789
|
+
*/
|
|
2790
|
+
describe("the collision fallback", () => {
|
|
2791
|
+
test("appends the address to the NetBIOS name", () => {
|
|
2792
|
+
expect(buildFallbackDeviceName(netbiosHost, FULL_NAMES)).toBe(
|
|
2793
|
+
"reg01 (10.18.167.31)",
|
|
2794
|
+
);
|
|
2795
|
+
});
|
|
2796
|
+
|
|
2797
|
+
test("two hosts answering with one name get distinct fallback names", () => {
|
|
2798
|
+
const twin: DiscoveredNetworkDevice = {
|
|
2799
|
+
...netbiosHost,
|
|
2800
|
+
ipAddress: "10.18.167.32",
|
|
2801
|
+
};
|
|
2802
|
+
|
|
2803
|
+
expect(buildDeviceName(twin, FULL_NAMES)).toBe(
|
|
2804
|
+
buildDeviceName(netbiosHost, FULL_NAMES),
|
|
2805
|
+
);
|
|
2806
|
+
expect(buildFallbackDeviceName(twin, FULL_NAMES)).toBe(
|
|
2807
|
+
"reg01 (10.18.167.32)",
|
|
2808
|
+
);
|
|
2809
|
+
expect(buildFallbackDeviceName(twin, FULL_NAMES)).not.toBe(
|
|
2810
|
+
buildFallbackDeviceName(netbiosHost, FULL_NAMES),
|
|
2811
|
+
);
|
|
2812
|
+
});
|
|
2813
|
+
|
|
2814
|
+
test("the fallback name survives into the device through the name override", () => {
|
|
2815
|
+
const device: NetworkDevice = build({
|
|
2816
|
+
host: netbiosHost,
|
|
2817
|
+
name: buildFallbackDeviceName(netbiosHost, FULL_NAMES),
|
|
2818
|
+
});
|
|
2819
|
+
|
|
2820
|
+
expect(device.name).toBe("reg01 (10.18.167.31)");
|
|
2821
|
+
expect(device.hostname).toBe(REPORTER_ADDRESS);
|
|
2822
|
+
});
|
|
2823
|
+
});
|
|
2824
|
+
|
|
2825
|
+
/*
|
|
2826
|
+
* A NetBIOS name is what the host says about itself, not a record anyone
|
|
2827
|
+
* published. Storing it as `dnsName` would make it searchable, and matched
|
|
2828
|
+
* by site-assignment hostname patterns, as though DNS had vouched for it.
|
|
2829
|
+
* It names the device; it goes nowhere else on it.
|
|
2830
|
+
*/
|
|
2831
|
+
describe("the NetBIOS name names the device and does nothing else", () => {
|
|
2832
|
+
test("the device's DNS name is never taken from the NetBIOS name", () => {
|
|
2833
|
+
for (const scan of [fullScanSource(), shortNamesScan()]) {
|
|
2834
|
+
const device: NetworkDevice = build({ host: netbiosHost, scan: scan });
|
|
2835
|
+
|
|
2836
|
+
expect(device.name).toBe("reg01");
|
|
2837
|
+
expect(device.dnsName).toBeUndefined();
|
|
2838
|
+
}
|
|
2839
|
+
});
|
|
2840
|
+
|
|
2841
|
+
test("the device's DNS name is still the PTR name when a host has both", () => {
|
|
2842
|
+
const device: NetworkDevice = build({
|
|
2843
|
+
host: { ...netbiosHost, dnsHostname: "reg01.corp.example.com" },
|
|
2844
|
+
});
|
|
2845
|
+
|
|
2846
|
+
expect(device.dnsName).toBe("reg01.corp.example.com");
|
|
2847
|
+
});
|
|
2848
|
+
|
|
2849
|
+
test("the device's hostname stays the address", () => {
|
|
2850
|
+
const device: NetworkDevice = build({ host: netbiosHost });
|
|
2851
|
+
|
|
2852
|
+
expect(device.hostname).toBe(REPORTER_ADDRESS);
|
|
2853
|
+
expect(device.name).toBe("reg01");
|
|
2854
|
+
});
|
|
2855
|
+
|
|
2856
|
+
test("a ping-only NetBIOS-named host still carries no credentials", () => {
|
|
2857
|
+
const device: NetworkDevice = build({ host: netbiosHost });
|
|
2858
|
+
|
|
2859
|
+
expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Probe);
|
|
2860
|
+
expect(device.snmpCommunityString).toBeUndefined();
|
|
2861
|
+
expect(device.snmpVersion).toBeUndefined();
|
|
2862
|
+
expect(device.probeId?.toString()).toBe(PROBE_ID.toString());
|
|
2863
|
+
});
|
|
2864
|
+
|
|
2865
|
+
test("a NetBIOS-named device's name produces a valid slug", () => {
|
|
2866
|
+
const device: NetworkDevice = build({ host: netbiosHost });
|
|
2867
|
+
|
|
2868
|
+
expect(Slug.getSlug(device.name!)).toContain("reg01");
|
|
2869
|
+
});
|
|
2870
|
+
});
|
|
2871
|
+
|
|
2872
|
+
test("the full name is still the display name with short names off, across every source", () => {
|
|
2873
|
+
const hosts: Array<DiscoveredNetworkDevice> = [
|
|
2874
|
+
{ ipAddress: "10.0.0.1", netbiosName: "reg01" },
|
|
2875
|
+
{ ipAddress: "10.0.0.2", netbiosName: "REG02 " },
|
|
2876
|
+
{ ipAddress: "10.0.0.3", netbiosName: "not valid" },
|
|
2877
|
+
{
|
|
2878
|
+
ipAddress: "10.0.0.4",
|
|
2879
|
+
dnsHostname: "gw.corp.example.com",
|
|
2880
|
+
netbiosName: "reg04",
|
|
2881
|
+
},
|
|
2882
|
+
{ ipAddress: "10.0.0.5", sysName: "sw-5", netbiosName: "reg05" },
|
|
2883
|
+
];
|
|
2884
|
+
|
|
2885
|
+
for (const host of hosts) {
|
|
2886
|
+
expect(getDiscoveredHostFullName(host)).toBe(
|
|
2887
|
+
getDiscoveredHostDisplayName(host, FULL_NAMES),
|
|
2888
|
+
);
|
|
2889
|
+
}
|
|
2890
|
+
});
|
|
2891
|
+
});
|