@oneuptime/common 12.0.25 → 12.0.26
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/Index.ts +2 -0
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +413 -0
- package/Models/DatabaseModels/AlertSeverity.ts +4 -1
- package/Models/DatabaseModels/CephClusterFeed.ts +625 -0
- package/Models/DatabaseModels/CloudResourceFeed.ts +625 -0
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +13 -0
- package/Models/DatabaseModels/DetectionRule.ts +9 -3
- package/Models/DatabaseModels/DockerHostFeed.ts +625 -0
- package/Models/DatabaseModels/DockerSwarmClusterFeed.ts +628 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +9 -3
- package/Models/DatabaseModels/HostFeed.ts +625 -0
- package/Models/DatabaseModels/IncidentSeverity.ts +4 -1
- package/Models/DatabaseModels/Index.ts +22 -0
- package/Models/DatabaseModels/KubernetesClusterFeed.ts +628 -0
- package/Models/DatabaseModels/Monitor.ts +87 -0
- package/Models/DatabaseModels/NetworkDevice.ts +96 -5
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +92 -6
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +301 -31
- package/Models/DatabaseModels/NetworkSite.ts +120 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
- package/Models/DatabaseModels/PodmanHostFeed.ts +625 -0
- package/Models/DatabaseModels/ProxmoxClusterFeed.ts +626 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +67 -0
- package/Models/DatabaseModels/ServiceFeed.ts +625 -0
- package/Models/DatabaseModels/TelemetrySourceMap.ts +474 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +758 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +1 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +1 -0
- package/Models/DatabaseModels/UserWebAuthn.ts +1 -0
- package/Server/API/AlertAPI.ts +23 -1
- package/Server/API/BaseAPI.ts +14 -3
- package/Server/API/IncidentAPI.ts +41 -1
- package/Server/API/IncidentEpisodeAPI.ts +23 -1
- package/Server/API/MicrosoftTeamsAPI.ts +31 -2
- package/Server/API/ScheduledMaintenanceAPI.ts +23 -1
- package/Server/API/SlackAPI.ts +48 -0
- package/Server/API/TelemetryAPI.ts +167 -42
- package/Server/API/UserOnCallLogTimelineAPI.ts +75 -61
- package/Server/API/UserTotpAuthAPI.ts +67 -1
- package/Server/API/UserWebAuthnAPI.ts +44 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.ts +57 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.ts +54 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.ts +489 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +18 -0
- package/Server/Middleware/IdentityRateLimit.ts +53 -3
- package/Server/Services/AIService.ts +181 -41
- package/Server/Services/CephClusterFeedService.ts +99 -0
- package/Server/Services/CephClusterLabelRuleEngineService.ts +29 -0
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/CephClusterOwnerTeamService.ts +129 -0
- package/Server/Services/CephClusterOwnerUserService.ts +123 -0
- package/Server/Services/CephClusterService.ts +223 -2
- package/Server/Services/CloudResourceFeedService.ts +99 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +30 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +33 -0
- package/Server/Services/CloudResourceOwnerTeamService.ts +129 -0
- package/Server/Services/CloudResourceOwnerUserService.ts +123 -0
- package/Server/Services/CloudResourceService.ts +227 -2
- package/Server/Services/DatabaseService.ts +265 -0
- package/Server/Services/DockerHostFeedService.ts +99 -0
- package/Server/Services/DockerHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/DockerHostOwnerTeamService.ts +129 -0
- package/Server/Services/DockerHostOwnerUserService.ts +123 -0
- package/Server/Services/DockerHostService.ts +227 -2
- package/Server/Services/DockerSwarmClusterFeedService.ts +102 -0
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +133 -0
- package/Server/Services/DockerSwarmClusterOwnerUserService.ts +127 -0
- package/Server/Services/DockerSwarmClusterService.ts +229 -2
- package/Server/Services/EnterpriseLicenseService.ts +15 -7
- package/Server/Services/ExceptionAggregationService.ts +12 -2
- package/Server/Services/HostFeedService.ts +99 -0
- package/Server/Services/HostLabelRuleEngineService.ts +29 -0
- package/Server/Services/HostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/HostOwnerTeamService.ts +129 -0
- package/Server/Services/HostOwnerUserService.ts +123 -0
- package/Server/Services/HostService.ts +215 -2
- package/Server/Services/IncidentService.ts +11 -0
- package/Server/Services/Index.ts +24 -0
- package/Server/Services/KubernetesClusterFeedService.ts +99 -0
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/KubernetesClusterOwnerTeamService.ts +133 -0
- package/Server/Services/KubernetesClusterOwnerUserService.ts +127 -0
- package/Server/Services/KubernetesClusterService.ts +231 -2
- package/Server/Services/LogAggregationService.ts +23 -280
- package/Server/Services/MetricAggregationService.ts +98 -1
- package/Server/Services/MonitorService.ts +177 -13
- package/Server/Services/MonitorTemplateService.ts +111 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +777 -86
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +199 -16
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +1055 -14
- package/Server/Services/NetworkDeviceService.ts +750 -4
- package/Server/Services/NetworkInterfaceService.ts +415 -0
- package/Server/Services/NetworkSiteService.ts +485 -52
- package/Server/Services/PodmanHostFeedService.ts +99 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/PodmanHostOwnerTeamService.ts +129 -0
- package/Server/Services/PodmanHostOwnerUserService.ts +123 -0
- package/Server/Services/PodmanHostService.ts +227 -2
- package/Server/Services/ProjectService.ts +16 -10
- package/Server/Services/ProxmoxClusterFeedService.ts +99 -0
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/ProxmoxClusterOwnerTeamService.ts +131 -0
- package/Server/Services/ProxmoxClusterOwnerUserService.ts +124 -0
- package/Server/Services/ProxmoxClusterService.ts +225 -2
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +61 -0
- package/Server/Services/ServiceFeedService.ts +99 -0
- package/Server/Services/ServiceLabelRuleEngineService.ts +29 -0
- package/Server/Services/ServiceOwnerRuleEngineService.ts +26 -0
- package/Server/Services/ServiceOwnerTeamService.ts +129 -0
- package/Server/Services/ServiceOwnerUserService.ts +123 -0
- package/Server/Services/ServiceService.ts +227 -3
- package/Server/Services/StatusPageSubscriberService.ts +7 -0
- package/Server/Services/TelemetryAttributeService.ts +13 -3
- package/Server/Services/TelemetrySourceMapService.ts +307 -0
- package/Server/Services/ThreatIntelFeedService.ts +222 -0
- package/Server/Services/ThreatIntelIndicatorService.ts +428 -0
- package/Server/Services/TraceAggregationService.ts +101 -11
- package/Server/Services/UserService.ts +13 -6
- package/Server/Services/UserTwoFactorBackupCodeService.ts +127 -0
- package/Server/Services/UserWebhookService.ts +11 -2
- package/Server/Static/Brand/README.md +38 -0
- package/Server/Static/Brand/favicons/apple-touch-icon.png +0 -0
- package/Server/Static/Brand/favicons/favicon-16x16.png +0 -0
- package/Server/Static/Brand/favicons/favicon-32x32.png +0 -0
- package/Server/Static/Brand/favicons/favicon.ico +0 -0
- package/Server/Static/Brand/favicons/safari-pinned-tab.svg +31 -0
- package/Server/Static/Brand/hou-wb.svg +1 -0
- package/Server/Static/Brand/oneuptime-logo.svg +1 -0
- package/Server/Static/Brand/ou-wb.svg +1 -0
- package/Server/Static/Vendor/README.md +4 -0
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +13 -3
- package/Server/Types/Database/AggregateBy.ts +83 -0
- package/Server/Types/Database/AggregateResultUtil.ts +126 -0
- package/Server/Types/Database/JSONColumnQuery.ts +18 -0
- package/Server/Types/Database/QueryHelper.ts +40 -0
- package/Server/Types/Database/QueryUtil.ts +26 -0
- package/Server/Types/Workflow/Components/API/Utils.ts +10 -1
- package/Server/Types/Workflow/Components/JavaScript.ts +8 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +9 -0
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +18 -0
- package/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.ts +422 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +176 -0
- package/Server/Utils/DataSource/HttpFetch.ts +18 -0
- package/Server/Utils/Database/RelationIdUtil.ts +42 -0
- package/Server/Utils/Marketing/MarketingEventUtil.ts +38 -9
- package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +34 -3
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +9 -1
- package/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts +28 -10
- package/Server/Utils/Monitor/MonitorAlert.ts +541 -332
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +330 -64
- package/Server/Utils/Monitor/MonitorIncident.ts +640 -434
- package/Server/Utils/Monitor/MonitorResource.ts +226 -49
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +46 -3
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +23 -102
- package/Server/Utils/Monitor/PerEntityCriteriaFanOut.ts +329 -0
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +427 -0
- package/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.ts +310 -0
- package/Server/Utils/OnCallNotificationContext.ts +686 -0
- package/Server/Utils/PrivateNetworkWebhookConfig.ts +549 -0
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +139 -0
- package/Server/Utils/Response.ts +11 -1
- package/Server/Utils/SSRFProtection.ts +230 -60
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +106 -0
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +84 -284
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +47 -20
- package/Server/Utils/SecurityEvent/SecurityEventAlerting.ts +318 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.ts +199 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.ts +252 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +739 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +533 -0
- package/Server/Utils/StartServer.ts +83 -56
- package/Server/Utils/StatusPageSubscriberWebhook.ts +3 -0
- package/Server/Utils/Telemetry/SourceMapResolver.ts +480 -0
- package/Server/Utils/TwoFactorBackupCodeNotification.ts +106 -0
- package/Server/Utils/VM/VMAPI.ts +3 -0
- package/Server/Utils/VM/VMRunner.ts +27 -1
- package/Server/Utils/VendorAssets.ts +42 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +136 -6
- package/Server/Views/AcknowledgeUserOnCallNotification.ejs +11 -9
- package/Server/Views/Partials/Head.ejs +9 -9
- package/Server/Views/Partials/OnCallNotificationDetails.ejs +48 -0
- package/Server/Views/ViewMessage.ejs +11 -9
- package/Tests/App/Accounts/LoginTwoFactorRecovery.test.tsx +972 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +401 -0
- package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +707 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +1908 -18
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +230 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +216 -0
- package/Tests/App/Dashboard/TopologyAddToMonitoring.test.tsx +192 -0
- package/Tests/App/Dashboard/WorkspaceNotificationRuleConditions.test.tsx +439 -0
- package/Tests/Models/DatabaseModels/DateColumnDeserialization.test.ts +182 -0
- package/Tests/Models/DatabaseModels/RelationColumnModelTypeCoverage.test.ts +82 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +398 -0
- package/Tests/Models/DiscoveryScanNameColumn.test.ts +151 -16
- package/Tests/Models/DiscoveryScanSnmpEnabledColumn.test.ts +593 -0
- package/Tests/Models/NetworkDeviceCreateContract.test.ts +102 -0
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +607 -0
- package/Tests/Server/API/AIGenerationRequestBudget.test.ts +355 -0
- package/Tests/Server/API/AIKillSwitchBackstop.test.ts +602 -0
- package/Tests/Server/API/BaseAPIUpdateDateColumns.test.ts +154 -0
- package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +335 -0
- package/Tests/Server/API/UserOnCallLogTimelineAcknowledgePage.test.ts +611 -0
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +498 -4
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +682 -0
- package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +595 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +9 -0
- package/Tests/Server/Services/AIServiceProjectAccess.test.ts +6 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +18 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +590 -0
- package/Tests/Server/Services/DatabaseServiceUpdateWriteRouting.test.ts +12 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +162 -26
- package/Tests/Server/Services/EnterpriseLicenseServiceCreate.test.ts +292 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +119 -12
- package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +109 -0
- package/Tests/Server/Services/MetricAggregationAttributeOperators.test.ts +170 -0
- package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +383 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +997 -3
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +830 -0
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +528 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +3141 -1
- package/Tests/Server/Services/NetworkDeviceRegisteredHostnames.test.ts +1023 -0
- package/Tests/Server/Services/NetworkDeviceSiteAssignmentRuleSkip.test.ts +728 -0
- package/Tests/Server/Services/NetworkInterfaceServiceUpsert.test.ts +795 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +903 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +165 -24
- package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +5 -3
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +5 -2
- package/Tests/Server/Services/ResourceCreationFeedWrites.test.ts +304 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +269 -0
- package/Tests/Server/Services/ResourceOwnerFeedWrites.test.ts +245 -0
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +792 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +483 -0
- package/Tests/Server/Services/ThreatIntelFeedService.test.ts +351 -0
- package/Tests/Server/Services/ThreatIntelIndicatorService.test.ts +366 -0
- package/Tests/Server/Services/TraceAggregationAttributeOperators.test.ts +507 -0
- package/Tests/Server/Services/UserTwoFactorBackupCodeGenerateIfNone.test.ts +705 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleOnCallDutyPolicy.test.ts +306 -0
- package/Tests/Server/Types/Database/AggregateResultUtil.test.ts +386 -0
- package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +424 -0
- package/Tests/Server/Types/Database/QueryHelperWildcard.test.ts +142 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentPrivateNetwork.test.ts +163 -0
- package/Tests/Server/Types/Workflow/Components/JavaScriptPrivateNetwork.test.ts +124 -0
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +5 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +39 -1
- package/Tests/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.test.ts +338 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWildcard.test.ts +383 -0
- package/Tests/Server/Utils/Marketing/EmittedMarketingEvent.ts +23 -0
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +51 -0
- package/Tests/Server/Utils/Monitor/Criteria/SyntheticMonitorCriteria.test.ts +259 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +557 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +12 -2
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +404 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +8 -2
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +125 -98
- package/Tests/Server/Utils/Monitor/PerEntityCriteriaFanOut.test.ts +444 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1112 -0
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +717 -0
- package/Tests/Server/Utils/NetworkDevice/RulePatternValidator.test.ts +78 -0
- package/Tests/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.test.ts +363 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +35 -0
- package/Tests/Server/Utils/OnCallNotificationContext.test.ts +908 -0
- package/Tests/Server/Utils/PrivateNetworkWebhookConfig.test.ts +423 -0
- package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +191 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +597 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +381 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +417 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/SecurityEventAlerting.test.ts +246 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.test.ts +282 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.test.ts +312 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.test.ts +854 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.test.ts +437 -0
- package/Tests/Server/Utils/StartServerErrorStatus.test.ts +225 -0
- package/Tests/Server/Utils/StatusPage/MonitorRulePatternValidator.test.ts +62 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhookPrivateNetwork.test.ts +119 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +542 -0
- package/Tests/Server/Utils/TwoFactorBackupCodeNotification.test.ts +272 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +111 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +117 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +101 -4
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstallStateDiagnostics.test.ts +922 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsRosterDiagnosticMessages.test.ts +642 -0
- package/Tests/Server/Views/OnCallAcknowledgePage.test.ts +430 -0
- package/Tests/Types/API/URLQueryString.test.ts +472 -0
- package/Tests/Types/BaseDatabase/Wildcard.test.ts +163 -0
- package/Tests/Types/BaseDatabase/WildcardPattern.test.ts +149 -0
- package/Tests/Types/Database/DateColumnValue.test.ts +265 -0
- package/Tests/Types/DateToIsoStringOrNull.test.ts +67 -0
- package/Tests/Types/Log/LogQueryToFilter.test.ts +218 -43
- package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +225 -0
- package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +296 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +102 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +145 -0
- package/Tests/Types/NetworkSite/SiteHealthRollupPolicy.test.ts +58 -0
- package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +15 -0
- package/Tests/Types/Telemetry/TelemetrySearchQuery.test.ts +620 -0
- package/Tests/Types/WhatsApp/WhatsAppTemplates.test.ts +110 -0
- package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +76 -6
- package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +16 -4
- package/Tests/Types/Workspace/NotificationRules/OnCallDutyPolicyConditions.test.ts +669 -0
- package/Tests/UI/Components/DictionaryFilterOperatorWildcard.test.ts +175 -0
- package/Tests/UI/Components/IconOpticalSize.test.tsx +377 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +332 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsInstallGuidanceContent.test.tsx +643 -0
- package/Tests/Utils/Monitor/InterfaceInventoryUtil.test.ts +824 -0
- package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +626 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +718 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +59 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +287 -2
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +73 -0
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilder.test.ts +317 -0
- package/Tests/Utils/NetworkDiscovery/RescanIntervalUtil.test.ts +262 -0
- package/Tests/Utils/NetworkDiscovery/ScanModeUtil.test.ts +474 -0
- package/Tests/Utils/NetworkDiscovery/SnmpScanConfigUtil.test.ts +2442 -0
- package/Tests/Utils/NetworkSite/SiteMaintenanceUtil.test.ts +188 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +522 -0
- package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +694 -0
- package/Tests/Utils/SecurityEvent/ThreatIntel/StixPatternParser.test.ts +281 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +87 -67
- package/Types/API/URL.ts +45 -10
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +8 -0
- package/Types/BaseDatabase/NotWildcard.ts +86 -0
- package/Types/BaseDatabase/Wildcard.ts +89 -0
- package/Types/BaseDatabase/WildcardPattern.ts +176 -0
- package/Types/Database/DateColumnValue.ts +184 -0
- package/Types/Database/TableColumn.ts +40 -5
- package/Types/Date.ts +37 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/JSON.ts +8 -0
- package/Types/Log/LogQueryToFilter.ts +167 -129
- package/Types/Monitor/DockerAlertTemplates.ts +43 -12
- package/Types/Monitor/HostAlertTemplates.ts +31 -3
- package/Types/Monitor/KubernetesAlertTemplates.ts +98 -0
- package/Types/Monitor/MonitorStep.ts +49 -0
- package/Types/Monitor/PodmanAlertTemplates.ts +39 -12
- package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +14 -0
- package/Types/Monitor/SnmpMonitor/LldpNeighbor.ts +11 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +11 -4
- package/Types/NetworkAutomation/RuleRunResult.ts +191 -2
- package/Types/NetworkSite/SiteHealthRollupPolicy.ts +96 -0
- package/Types/Permission.ts +411 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +42 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +118 -0
- package/Types/SerializableObjectDictionary.ts +8 -0
- package/Types/Telemetry/SourceMap.ts +56 -0
- package/Types/Telemetry/TelemetrySearchQuery.ts +949 -0
- package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +12 -1
- package/UI/Components/Dictionary/DictionaryFilterOperator.ts +83 -0
- package/UI/Components/Icon/Icon.tsx +28 -1
- package/UI/Components/LogsViewer/components/LogSearchBar.tsx +26 -4
- package/UI/Components/LogsViewer/components/LogSearchHelp.tsx +34 -16
- package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +15 -2
- package/Utils/Metrics/MetricExplorerUrl.ts +77 -15
- package/Utils/Monitor/InterfaceInventoryUtil.ts +251 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +333 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +249 -28
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +14 -6
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +2 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +49 -18
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +215 -0
- package/Utils/NetworkDiscovery/RescanIntervalUtil.ts +148 -0
- package/Utils/NetworkDiscovery/ScanModeUtil.ts +105 -0
- package/Utils/NetworkDiscovery/SnmpScanConfigUtil.ts +827 -0
- package/Utils/NetworkSite/SiteMaintenanceUtil.ts +110 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +350 -19
- package/Utils/NetworkSite/SiteUptimeUtil.ts +422 -21
- package/Utils/SecurityEvent/ThreatIntel/StixPatternParser.ts +383 -0
- package/Utils/Telemetry/CrossSignalScope.ts +37 -39
- package/build/dist/Models/AnalyticsModels/Index.js +2 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +325 -0
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +11 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +9 -3
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +9 -3
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/HostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +22 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Monitor.js +81 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +103 -7
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +91 -6
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +276 -31
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +124 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +66 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ServiceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js +496 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +800 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +1 -0
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +1 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +18 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +8 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +35 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +18 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +30 -2
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +18 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +45 -0
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +100 -35
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +64 -59
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +65 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +42 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js +88 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js +61 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js +179 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +40 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +177 -30
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterFeedService.js +89 -0
- package/build/dist/Server/Services/CephClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +175 -1
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceFeedService.js +89 -0
- package/build/dist/Server/Services/CloudResourceFeedService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +28 -3
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +177 -1
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +201 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostFeedService.js +89 -0
- package/build/dist/Server/Services/DockerHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +177 -1
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js +90 -0
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +175 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +40 -30
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +8 -2
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostFeedService.js +89 -0
- package/build/dist/Server/Services/HostFeedService.js.map +1 -0
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/HostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/HostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +175 -1
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +10 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +24 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterFeedService.js +89 -0
- package/build/dist/Server/Services/KubernetesClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +177 -1
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +19 -196
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +59 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +115 -13
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +86 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +561 -67
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +130 -16
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +850 -8
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +594 -5
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkInterfaceService.js +306 -0
- package/build/dist/Server/Services/NetworkInterfaceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +408 -47
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostFeedService.js +89 -0
- package/build/dist/Server/Services/PodmanHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +177 -1
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +40 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js +89 -0
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +175 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +56 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceFeedService.js +89 -0
- package/build/dist/Server/Services/ServiceFeedService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +24 -0
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ServiceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ServiceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +173 -2
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +7 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryAttributeService.js +9 -3
- package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +265 -0
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js +157 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js +276 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js.map +1 -0
- package/build/dist/Server/Services/TraceAggregationService.js +62 -6
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +22 -13
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js +120 -0
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +11 -2
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +12 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/AggregateBy.js +2 -0
- package/build/dist/Server/Types/Database/AggregateBy.js.map +1 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js +90 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js.map +1 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js +14 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +42 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +18 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js +10 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +8 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +15 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js +266 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +134 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +8 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/Database/RelationIdUtil.js +31 -0
- package/build/dist/Server/Utils/Database/RelationIdUtil.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +26 -8
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +42 -17
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +9 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js +15 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +386 -271
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +278 -64
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +469 -350
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +183 -44
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +46 -3
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +18 -91
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js +194 -0
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js.map +1 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +332 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js +279 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js.map +1 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js +415 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js.map +1 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js +424 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js.map +1 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +108 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +12 -1
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +160 -58
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +89 -0
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +75 -234
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +41 -16
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js +217 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js +103 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js +168 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +527 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +70 -44
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +3 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +327 -0
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +84 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +10 -1
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +29 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +121 -6
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/API/URL.js +40 -10
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +8 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/BaseDatabase/NotWildcard.js +72 -0
- package/build/dist/Types/BaseDatabase/NotWildcard.js.map +1 -0
- package/build/dist/Types/BaseDatabase/Wildcard.js +75 -0
- package/build/dist/Types/BaseDatabase/Wildcard.js.map +1 -0
- package/build/dist/Types/BaseDatabase/WildcardPattern.js +137 -0
- package/build/dist/Types/BaseDatabase/WildcardPattern.js.map +1 -0
- package/build/dist/Types/Database/DateColumnValue.js +125 -0
- package/build/dist/Types/Database/DateColumnValue.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +18 -2
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Date.js +31 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/JSON.js +2 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/Log/LogQueryToFilter.js +111 -108
- package/build/dist/Types/Log/LogQueryToFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DockerAlertTemplates.js +40 -16
- package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/HostAlertTemplates.js +29 -7
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +98 -4
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +40 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +36 -16
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +90 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js +84 -0
- package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +354 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +100 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -0
- package/build/dist/Types/SerializableObjectDictionary.js +8 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/SourceMap.js +9 -0
- package/build/dist/Types/Telemetry/SourceMap.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetrySearchQuery.js +661 -0
- package/build/dist/Types/Telemetry/TelemetrySearchQuery.js.map +1 -0
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +12 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +67 -0
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +28 -1
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +25 -4
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js +36 -16
- package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +14 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +54 -9
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
- package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js +128 -0
- package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +190 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +206 -28
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +14 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +34 -18
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +163 -0
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js +99 -0
- package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js +85 -0
- package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js +560 -0
- package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js +56 -0
- package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +185 -10
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +248 -21
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js +255 -0
- package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js.map +1 -0
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +27 -30
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/package.json +2 -1
- package/Tests/Types/Log/LogQueryParser.test.ts +0 -186
- package/Types/Log/LogQueryParser.ts +0 -252
- package/build/dist/Types/Log/LogQueryParser.js +0 -200
- package/build/dist/Types/Log/LogQueryParser.js.map +0 -1
|
@@ -8,8 +8,9 @@ import Model from "../../Models/DatabaseModels/NetworkDevice";
|
|
|
8
8
|
import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
9
9
|
import NetworkSite from "../../Models/DatabaseModels/NetworkSite";
|
|
10
10
|
import NetworkSiteAssignmentRule from "../../Models/DatabaseModels/NetworkSiteAssignmentRule";
|
|
11
|
-
import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
|
|
11
|
+
import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
|
|
12
12
|
import CreateBy from "../Types/Database/CreateBy";
|
|
13
|
+
import DeleteBy from "../Types/Database/DeleteBy";
|
|
13
14
|
import UpdateBy from "../Types/Database/UpdateBy";
|
|
14
15
|
import Query from "../Types/Database/Query";
|
|
15
16
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
@@ -18,6 +19,7 @@ import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
|
18
19
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
19
20
|
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
20
21
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
22
|
+
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
21
23
|
import ObjectID from "../../Types/ObjectID";
|
|
22
24
|
import OneUptimeDate from "../../Types/Date";
|
|
23
25
|
import CidrMatchUtil from "../../Utils/NetworkSite/CidrMatchUtil";
|
|
@@ -25,6 +27,34 @@ import { SiteAssignmentRuleRunResult } from "../../Types/NetworkAutomation/RuleR
|
|
|
25
27
|
import { NetworkDeviceMonitoringMethodUtil } from "../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
|
|
26
28
|
import RelationIdUtil from "../Utils/Database/RelationIdUtil";
|
|
27
29
|
import { EntityManager } from "typeorm";
|
|
30
|
+
import ModelPermission from "../Types/Database/Permissions/Index";
|
|
31
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
32
|
+
import Select from "../Types/Database/Select";
|
|
33
|
+
import { AggregateRow } from "../Types/Database/AggregateBy";
|
|
34
|
+
import AggregateResultUtil from "../Types/Database/AggregateResultUtil";
|
|
35
|
+
import {
|
|
36
|
+
DEVICE_HEALTH_AGGREGATES,
|
|
37
|
+
DEVICE_HEALTH_GROUP_COLUMNS,
|
|
38
|
+
DEVICE_HEALTH_GROUP_ORDER,
|
|
39
|
+
DEVICE_HEALTH_GROUP_COLUMNS_BY_SITE,
|
|
40
|
+
DEVICE_HEALTH_NOW_PARAMETER,
|
|
41
|
+
DeviceHealthGroup,
|
|
42
|
+
parseDeviceHealthGroup,
|
|
43
|
+
} from "../Utils/NetworkDevice/DeviceHealthAggregation";
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The fleet-wide numbers the device summary strip and the network overview
|
|
47
|
+
* both print. Counted in Postgres — see `Service.getFleetSummary`.
|
|
48
|
+
*/
|
|
49
|
+
export interface DeviceFleetSummary {
|
|
50
|
+
devicesUp: number;
|
|
51
|
+
devicesDown: number;
|
|
52
|
+
devicesPending: number;
|
|
53
|
+
// Interfaces, not devices: a switch with three dark ports contributes three.
|
|
54
|
+
interfacesDown: number;
|
|
55
|
+
totalDevices: number;
|
|
56
|
+
devicesWithoutSite: number;
|
|
57
|
+
}
|
|
28
58
|
|
|
29
59
|
/*
|
|
30
60
|
* Columns a NetworkSiteAssignmentRule's hostname pattern is matched against.
|
|
@@ -92,6 +122,12 @@ export const MAX_DEVICES_PER_RULE_RUN: number = LIMIT_PER_PROJECT;
|
|
|
92
122
|
// Devices are read in pages so a large estate never lands in memory at once.
|
|
93
123
|
const RULE_RUN_PAGE_SIZE: number = 1000;
|
|
94
124
|
|
|
125
|
+
/*
|
|
126
|
+
* How many addresses one "are these already registered" lookup asks about.
|
|
127
|
+
* Bounded because the list is rendered into the statement as a literal IN.
|
|
128
|
+
*/
|
|
129
|
+
const HOSTNAME_LOOKUP_CHUNK_SIZE: number = 500;
|
|
130
|
+
|
|
95
131
|
/*
|
|
96
132
|
* The identity a rule is matched against. The hostname column holds an IP
|
|
97
133
|
* address or a DNS name depending on how the device got here, so it is passed
|
|
@@ -113,11 +149,655 @@ function toRuleMatchTarget(device: Model): {
|
|
|
113
149
|
};
|
|
114
150
|
}
|
|
115
151
|
|
|
152
|
+
/*
|
|
153
|
+
* How long "this project has no site-assignment rules at all" is trusted
|
|
154
|
+
* without asking Postgres again.
|
|
155
|
+
*
|
|
156
|
+
* Every successful walk writes `sysName`, an identity column, so
|
|
157
|
+
* onUpdateSuccess re-evaluates the rules for every device that has no site.
|
|
158
|
+
* That rule is correct and stays (see shouldReapplySiteAssignmentRules), but
|
|
159
|
+
* on a project mid-rollout — devices imported, rules not written yet — it is
|
|
160
|
+
* EVERY device, and each one re-read the same empty rule set to conclude
|
|
161
|
+
* nothing: a findOneById plus an uncached findBy per device per poll, i.e.
|
|
162
|
+
* ~160,000 queries per five-minute cycle on an 80,000-device fleet.
|
|
163
|
+
*
|
|
164
|
+
* Ten seconds is measured against the thing a user would actually notice.
|
|
165
|
+
* The earliest a newly saved rule can reach an already-imported device is
|
|
166
|
+
* that device's next poll — five minutes by default — or the rule's "Run
|
|
167
|
+
* now" button, which never consults this cache. Ten seconds is a rounding
|
|
168
|
+
* error against that window, so this can never be the reason a rule looks
|
|
169
|
+
* like it did not take.
|
|
170
|
+
*/
|
|
171
|
+
export const EMPTY_SITE_ASSIGNMENT_RULE_CACHE_TTL_IN_MS: number = 10 * 1000;
|
|
172
|
+
|
|
173
|
+
/*
|
|
174
|
+
* Bounded so an instance serving many projects cannot grow this forever.
|
|
175
|
+
* Only ever holds projects that had NO rules, so in practice it is small.
|
|
176
|
+
*/
|
|
177
|
+
const EMPTY_SITE_ASSIGNMENT_RULE_CACHE_MAX_PROJECTS: number = 10000;
|
|
178
|
+
|
|
179
|
+
/*
|
|
180
|
+
* Remembers ONLY the negative answer: "this project had zero site-assignment
|
|
181
|
+
* rules when we last looked."
|
|
182
|
+
*
|
|
183
|
+
* Deliberately not a cache of the rules themselves. A stale rule set causes a
|
|
184
|
+
* WRONG WRITE — a device assigned to a site by a rule that was edited or
|
|
185
|
+
* deleted seconds ago, and nothing ever moves it back — whereas a stale "no
|
|
186
|
+
* rules" only defers work that the polling interval already defers by
|
|
187
|
+
* minutes. The two failure modes are not comparable, so only the safe half is
|
|
188
|
+
* cached.
|
|
189
|
+
*
|
|
190
|
+
* Every read of the rule set feeds `record`, so the instant any code path in
|
|
191
|
+
* this process observes that the project does have rules, the skip is
|
|
192
|
+
* dropped. Across replicas nothing is invalidated by another replica's write
|
|
193
|
+
* — which is precisely why the TTL, not the invalidation, is the guarantee.
|
|
194
|
+
*/
|
|
195
|
+
export class EmptySiteAssignmentRuleCache {
|
|
196
|
+
private knownEmptyUntil: Map<string, number> = new Map<string, number>();
|
|
197
|
+
|
|
198
|
+
private ttlInMs: number;
|
|
199
|
+
private maxProjects: number;
|
|
200
|
+
private now: () => number;
|
|
201
|
+
|
|
202
|
+
public constructor(options?: {
|
|
203
|
+
ttlInMs?: number | undefined;
|
|
204
|
+
maxProjects?: number | undefined;
|
|
205
|
+
now?: (() => number) | undefined;
|
|
206
|
+
}) {
|
|
207
|
+
this.ttlInMs =
|
|
208
|
+
options?.ttlInMs ?? EMPTY_SITE_ASSIGNMENT_RULE_CACHE_TTL_IN_MS;
|
|
209
|
+
this.maxProjects =
|
|
210
|
+
options?.maxProjects ?? EMPTY_SITE_ASSIGNMENT_RULE_CACHE_MAX_PROJECTS;
|
|
211
|
+
/*
|
|
212
|
+
* Wrapped rather than stored as `Date.now` itself, so moving the clock
|
|
213
|
+
* (a test, or a future injected clock) is actually observed here.
|
|
214
|
+
*/
|
|
215
|
+
this.now =
|
|
216
|
+
options?.now ??
|
|
217
|
+
((): number => {
|
|
218
|
+
return Date.now();
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
public isKnownEmpty(projectId: ObjectID): boolean {
|
|
223
|
+
const key: string = projectId.toString();
|
|
224
|
+
const expiresAt: number | undefined = this.knownEmptyUntil.get(key);
|
|
225
|
+
|
|
226
|
+
if (expiresAt === undefined) {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (expiresAt <= this.now()) {
|
|
231
|
+
// Dropped on read, so an idle project's entry does not linger.
|
|
232
|
+
this.knownEmptyUntil.delete(key);
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
public record(data: { projectId: ObjectID; isEmpty: boolean }): void {
|
|
240
|
+
const key: string = data.projectId.toString();
|
|
241
|
+
|
|
242
|
+
if (!data.isEmpty) {
|
|
243
|
+
this.knownEmptyUntil.delete(key);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (
|
|
248
|
+
this.knownEmptyUntil.size >= this.maxProjects &&
|
|
249
|
+
!this.knownEmptyUntil.has(key)
|
|
250
|
+
) {
|
|
251
|
+
// Evict the oldest — a Map iterates in insertion order.
|
|
252
|
+
const oldestKey: string | undefined = this.knownEmptyUntil
|
|
253
|
+
.keys()
|
|
254
|
+
.next().value;
|
|
255
|
+
|
|
256
|
+
if (oldestKey !== undefined) {
|
|
257
|
+
this.knownEmptyUntil.delete(oldestKey);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
this.knownEmptyUntil.set(key, this.now() + this.ttlInMs);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
public clear(): void {
|
|
265
|
+
this.knownEmptyUntil.clear();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
116
269
|
export class Service extends DatabaseService<Model> {
|
|
270
|
+
/*
|
|
271
|
+
* The projects known to have no site-assignment rules. Exposed so tests can
|
|
272
|
+
* reset it between cases, and so a future invalidation hook on
|
|
273
|
+
* NetworkSiteAssignmentRuleService has something to call — note that such a
|
|
274
|
+
* hook only clears the replica that ran the write, which is why the TTL
|
|
275
|
+
* above is what actually bounds staleness.
|
|
276
|
+
*/
|
|
277
|
+
public readonly emptySiteAssignmentRuleCache: EmptySiteAssignmentRuleCache =
|
|
278
|
+
new EmptySiteAssignmentRuleCache();
|
|
279
|
+
|
|
117
280
|
public constructor() {
|
|
118
281
|
super(Model);
|
|
119
282
|
}
|
|
120
283
|
|
|
284
|
+
/**
|
|
285
|
+
* The four numbers in the summary strip above the device list, in one
|
|
286
|
+
* round trip and one SQL statement.
|
|
287
|
+
*
|
|
288
|
+
* The three status counts partition the fleet exactly — `isReachable` is
|
|
289
|
+
* true, false, or NULL — which is what lets the strip agree with the rows
|
|
290
|
+
* underneath it: the Status chip filters on the same column, so clicking a
|
|
291
|
+
* tile opens exactly the devices it counted.
|
|
292
|
+
*
|
|
293
|
+
* `interfacesDown` is a real SUM over the whole fleet. It used to be
|
|
294
|
+
* computed by fetching every device with a down interface and adding them
|
|
295
|
+
* up in the browser, which was not only slow but WRONG past ten thousand
|
|
296
|
+
* such devices — the fetch was capped, so the tile understated the fleet
|
|
297
|
+
* without saying so.
|
|
298
|
+
*/
|
|
299
|
+
@CaptureSpan()
|
|
300
|
+
public async getFleetSummary(data: {
|
|
301
|
+
projectId: ObjectID;
|
|
302
|
+
props: DatabaseCommonInteractionProps;
|
|
303
|
+
}): Promise<DeviceFleetSummary> {
|
|
304
|
+
const rows: Array<AggregateRow> = await this.aggregateBy({
|
|
305
|
+
query: {
|
|
306
|
+
projectId: data.projectId,
|
|
307
|
+
isArchived: false,
|
|
308
|
+
},
|
|
309
|
+
select: [
|
|
310
|
+
{
|
|
311
|
+
expression: `COUNT(*) FILTER (WHERE "NetworkDevice"."isReachable" = true)`,
|
|
312
|
+
alias: "devicesUp",
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
expression: `COUNT(*) FILTER (WHERE "NetworkDevice"."isReachable" = false)`,
|
|
316
|
+
alias: "devicesDown",
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
expression: `COUNT(*) FILTER (WHERE "NetworkDevice"."isReachable" IS NULL)`,
|
|
320
|
+
alias: "devicesPending",
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
expression: `COALESCE(SUM("NetworkDevice"."interfacesDown"), 0)`,
|
|
324
|
+
alias: "interfacesDown",
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
expression: `COUNT(*)`,
|
|
328
|
+
alias: "totalDevices",
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
expression: `COUNT(*) FILTER (WHERE "NetworkDevice"."siteId" IS NULL)`,
|
|
332
|
+
alias: "devicesWithoutSite",
|
|
333
|
+
},
|
|
334
|
+
],
|
|
335
|
+
props: data.props,
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
const row: AggregateRow | undefined = rows[0];
|
|
339
|
+
|
|
340
|
+
return {
|
|
341
|
+
devicesUp: AggregateResultUtil.toNumber(row, "devicesUp"),
|
|
342
|
+
devicesDown: AggregateResultUtil.toNumber(row, "devicesDown"),
|
|
343
|
+
devicesPending: AggregateResultUtil.toNumber(row, "devicesPending"),
|
|
344
|
+
interfacesDown: AggregateResultUtil.toNumber(row, "interfacesDown"),
|
|
345
|
+
totalDevices: AggregateResultUtil.toNumber(row, "totalDevices"),
|
|
346
|
+
devicesWithoutSite: AggregateResultUtil.toNumber(
|
|
347
|
+
row,
|
|
348
|
+
"devicesWithoutSite",
|
|
349
|
+
),
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* How many devices of each vendor, biggest first.
|
|
355
|
+
*
|
|
356
|
+
* `GROUP BY vendor` in the database rather than a Map built over every
|
|
357
|
+
* device row in the browser. Unenriched devices — no SNMP walk yet, so no
|
|
358
|
+
* vendor — group under the empty string here and are named by the caller,
|
|
359
|
+
* because "Unknown" is a label rather than a fact about the row.
|
|
360
|
+
*/
|
|
361
|
+
@CaptureSpan()
|
|
362
|
+
public async getVendorBreakdown(data: {
|
|
363
|
+
projectId: ObjectID;
|
|
364
|
+
limit: number;
|
|
365
|
+
props: DatabaseCommonInteractionProps;
|
|
366
|
+
}): Promise<Array<{ vendor: string; count: number }>> {
|
|
367
|
+
const rows: Array<AggregateRow> = await this.aggregateBy({
|
|
368
|
+
query: {
|
|
369
|
+
projectId: data.projectId,
|
|
370
|
+
isArchived: false,
|
|
371
|
+
},
|
|
372
|
+
groupBy: [
|
|
373
|
+
{
|
|
374
|
+
expression: `COALESCE(NULLIF(TRIM("NetworkDevice"."vendor"), ''), '')`,
|
|
375
|
+
alias: "vendor",
|
|
376
|
+
},
|
|
377
|
+
],
|
|
378
|
+
select: [
|
|
379
|
+
{
|
|
380
|
+
expression: `COUNT(*)`,
|
|
381
|
+
alias: "deviceCount",
|
|
382
|
+
},
|
|
383
|
+
],
|
|
384
|
+
orderBy: [
|
|
385
|
+
// Ties break by name so the list is stable across refreshes.
|
|
386
|
+
{ expression: `"deviceCount"`, sortOrder: SortOrder.Descending },
|
|
387
|
+
{ expression: `"vendor"`, sortOrder: SortOrder.Ascending },
|
|
388
|
+
],
|
|
389
|
+
limit: data.limit,
|
|
390
|
+
props: data.props,
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
return rows.map((row: AggregateRow) => {
|
|
394
|
+
return {
|
|
395
|
+
vendor: AggregateResultUtil.toStringOrNull(row, "vendor") || "",
|
|
396
|
+
count: AggregateResultUtil.toNumber(row, "deviceCount"),
|
|
397
|
+
};
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Which of these addresses already have a device in this project.
|
|
403
|
+
*
|
|
404
|
+
* Answers "is 10.4.2.17 already registered" for the few hundred hosts a
|
|
405
|
+
* discovery sweep actually found, rather than by loading every hostname in
|
|
406
|
+
* the project into a Set and asking the Set.
|
|
407
|
+
*
|
|
408
|
+
* That walk was not just expensive — it was WRONG in the exact scenario it
|
|
409
|
+
* served. It paged `ORDER BY createdAt`, and a bulk discovery import stamps
|
|
410
|
+
* every device it creates with the same `createdAt`: on a fleet of 80,000
|
|
411
|
+
* devices, all 80,000 shared one value, so `LIMIT 10000 OFFSET n` over a
|
|
412
|
+
* single-valued sort key returned an arbitrary, non-deterministic slice per
|
|
413
|
+
* call. Pages overlapped and skipped, and a skipped hostname reads as "not
|
|
414
|
+
* registered" — which creates a duplicate device, the very thing the paging
|
|
415
|
+
* was added to prevent.
|
|
416
|
+
*
|
|
417
|
+
* `hostname` is indexed, so each chunk here is an index lookup.
|
|
418
|
+
*/
|
|
419
|
+
@CaptureSpan()
|
|
420
|
+
public async getRegisteredHostnames(data: {
|
|
421
|
+
projectId: ObjectID;
|
|
422
|
+
hostnames: Array<string>;
|
|
423
|
+
props: DatabaseCommonInteractionProps;
|
|
424
|
+
}): Promise<Set<string>> {
|
|
425
|
+
return new Set<string>(
|
|
426
|
+
(
|
|
427
|
+
await this.getDevicesByHostnames({
|
|
428
|
+
projectId: data.projectId,
|
|
429
|
+
hostnames: data.hostnames,
|
|
430
|
+
select: { hostname: true },
|
|
431
|
+
props: data.props,
|
|
432
|
+
})
|
|
433
|
+
).keys(),
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* The devices at these addresses, keyed by hostname.
|
|
439
|
+
*
|
|
440
|
+
* The row-returning form of `getRegisteredHostnames`, for callers that need
|
|
441
|
+
* more than "does it exist" — the auto-import engine reads back the device's
|
|
442
|
+
* id and monitoring method to decide whether it also needs a monitor
|
|
443
|
+
* provisioned. Same chunked, indexed lookup; same reason for existing.
|
|
444
|
+
*/
|
|
445
|
+
@CaptureSpan()
|
|
446
|
+
public async getDevicesByHostnames(data: {
|
|
447
|
+
projectId: ObjectID;
|
|
448
|
+
hostnames: Array<string>;
|
|
449
|
+
select: Select<Model>;
|
|
450
|
+
props: DatabaseCommonInteractionProps;
|
|
451
|
+
}): Promise<Map<string, Model>> {
|
|
452
|
+
const registered: Map<string, Model> = new Map<string, Model>();
|
|
453
|
+
|
|
454
|
+
const wanted: Array<string> = Array.from(
|
|
455
|
+
new Set<string>(
|
|
456
|
+
data.hostnames.filter((hostname: string): boolean => {
|
|
457
|
+
return Boolean(hostname);
|
|
458
|
+
}),
|
|
459
|
+
),
|
|
460
|
+
);
|
|
461
|
+
|
|
462
|
+
/*
|
|
463
|
+
* Chunked, because the whole list becomes a literal `IN (...)` in the
|
|
464
|
+
* statement text. A scan may cover tens of thousands of addresses
|
|
465
|
+
* (ScanTargetUtil.MAX_SCAN_HOSTS), and a single IN list that long costs
|
|
466
|
+
* more to parse and plan than the lookups it saves.
|
|
467
|
+
*/
|
|
468
|
+
for (
|
|
469
|
+
let offset: number = 0;
|
|
470
|
+
offset < wanted.length;
|
|
471
|
+
offset += HOSTNAME_LOOKUP_CHUNK_SIZE
|
|
472
|
+
) {
|
|
473
|
+
const chunk: Array<string> = wanted.slice(
|
|
474
|
+
offset,
|
|
475
|
+
offset + HOSTNAME_LOOKUP_CHUNK_SIZE,
|
|
476
|
+
);
|
|
477
|
+
|
|
478
|
+
const found: Array<Model> = await this.findBy({
|
|
479
|
+
query: {
|
|
480
|
+
projectId: data.projectId,
|
|
481
|
+
hostname: QueryHelper.any(chunk),
|
|
482
|
+
},
|
|
483
|
+
select: {
|
|
484
|
+
...data.select,
|
|
485
|
+
hostname: true,
|
|
486
|
+
},
|
|
487
|
+
sort: {},
|
|
488
|
+
limit: LIMIT_MAX,
|
|
489
|
+
skip: 0,
|
|
490
|
+
props: data.props,
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
for (const device of found) {
|
|
494
|
+
if (device.hostname) {
|
|
495
|
+
registered.set(device.hostname, device);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
return registered;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* How many live devices are attached to each site in the project — one row
|
|
505
|
+
* per site that has any, counted in the database.
|
|
506
|
+
*
|
|
507
|
+
* The Sites page's hierarchy tree used to work this out by fetching every
|
|
508
|
+
* device in the project and tallying `siteId` in the browser. Capped at
|
|
509
|
+
* LIMIT_PER_PROJECT, that is not slow so much as WRONG: on a fleet of
|
|
510
|
+
* 80,000 devices across 1,188 sites it returned an arbitrary 10,000 of them
|
|
511
|
+
* — no ORDER BY, so which 10,000 was up to Postgres — and every store in the
|
|
512
|
+
* tree read "8 devices" when it had 65.
|
|
513
|
+
*
|
|
514
|
+
* Sites with no devices are simply absent, which is what the caller's
|
|
515
|
+
* `count || 0` already assumed.
|
|
516
|
+
*/
|
|
517
|
+
@CaptureSpan()
|
|
518
|
+
public async getDeviceCountsBySite(data: {
|
|
519
|
+
projectId: ObjectID;
|
|
520
|
+
props: DatabaseCommonInteractionProps;
|
|
521
|
+
}): Promise<Array<{ siteId: string; deviceCount: number }>> {
|
|
522
|
+
const rows: Array<AggregateRow> = await this.aggregateBy({
|
|
523
|
+
query: {
|
|
524
|
+
projectId: data.projectId,
|
|
525
|
+
isArchived: false,
|
|
526
|
+
siteId: QueryHelper.notNull(),
|
|
527
|
+
},
|
|
528
|
+
groupBy: [
|
|
529
|
+
{
|
|
530
|
+
expression: `"NetworkDevice"."siteId"`,
|
|
531
|
+
alias: "siteId",
|
|
532
|
+
},
|
|
533
|
+
],
|
|
534
|
+
select: [
|
|
535
|
+
{
|
|
536
|
+
expression: `COUNT(*)`,
|
|
537
|
+
alias: "deviceCount",
|
|
538
|
+
},
|
|
539
|
+
],
|
|
540
|
+
props: data.props,
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
const counts: Array<{ siteId: string; deviceCount: number }> = [];
|
|
544
|
+
|
|
545
|
+
for (const row of rows) {
|
|
546
|
+
const siteId: string | null = AggregateResultUtil.toStringOrNull(
|
|
547
|
+
row,
|
|
548
|
+
"siteId",
|
|
549
|
+
);
|
|
550
|
+
|
|
551
|
+
if (!siteId) {
|
|
552
|
+
continue;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
counts.push({
|
|
556
|
+
siteId: siteId,
|
|
557
|
+
deviceCount: AggregateResultUtil.toNumber(row, "deviceCount"),
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
return counts;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* Device health, bucketed by the discriminating columns and broken down by
|
|
566
|
+
* site — the input a per-site rollup needs, without reading the devices.
|
|
567
|
+
*
|
|
568
|
+
* The buckets are NOT verdicts: they are the raw facts
|
|
569
|
+
* `DeviceHealthStateUtil` classifies, so the caller runs the one real
|
|
570
|
+
* classifier over a few hundred buckets instead of eighty thousand rows.
|
|
571
|
+
* See DeviceHealthAggregation for why the rule is not reimplemented in SQL.
|
|
572
|
+
*/
|
|
573
|
+
@CaptureSpan()
|
|
574
|
+
public async getHealthGroups(data: {
|
|
575
|
+
projectId: ObjectID;
|
|
576
|
+
// Restricts to devices attached to a site. Off by default.
|
|
577
|
+
onlyAttachedToSite?: boolean | undefined;
|
|
578
|
+
groupBySite: boolean;
|
|
579
|
+
now: Date;
|
|
580
|
+
props: DatabaseCommonInteractionProps;
|
|
581
|
+
}): Promise<Array<DeviceHealthGroup>> {
|
|
582
|
+
const query: Query<Model> = {
|
|
583
|
+
projectId: data.projectId,
|
|
584
|
+
isArchived: false,
|
|
585
|
+
};
|
|
586
|
+
|
|
587
|
+
if (data.onlyAttachedToSite) {
|
|
588
|
+
query.siteId = QueryHelper.notNull();
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
const rows: Array<AggregateRow> = await this.aggregateBy({
|
|
592
|
+
query: query,
|
|
593
|
+
groupBy: data.groupBySite
|
|
594
|
+
? DEVICE_HEALTH_GROUP_COLUMNS_BY_SITE
|
|
595
|
+
: DEVICE_HEALTH_GROUP_COLUMNS,
|
|
596
|
+
select: DEVICE_HEALTH_AGGREGATES,
|
|
597
|
+
orderBy: DEVICE_HEALTH_GROUP_ORDER,
|
|
598
|
+
parameters: {
|
|
599
|
+
[DEVICE_HEALTH_NOW_PARAMETER]: data.now,
|
|
600
|
+
},
|
|
601
|
+
props: data.props,
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
return rows.map(parseDeviceHealthGroup);
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* Health buckets for the devices attached to a specific set of sites — the
|
|
609
|
+
* subtree read the persisted rollup engine runs on.
|
|
610
|
+
*
|
|
611
|
+
* Not broken down by site: the caller wants one verdict for the whole
|
|
612
|
+
* subtree, so bucketing across all of it produces the fewest rows that can
|
|
613
|
+
* still answer the question.
|
|
614
|
+
*/
|
|
615
|
+
@CaptureSpan()
|
|
616
|
+
public async getHealthGroupsForSites(data: {
|
|
617
|
+
projectId: ObjectID;
|
|
618
|
+
siteIds: Array<ObjectID>;
|
|
619
|
+
/*
|
|
620
|
+
* Whether each bucket is labelled with the site it came from. The site
|
|
621
|
+
* rollup engine wants one verdict for the whole subtree and does not care
|
|
622
|
+
* (fewer buckets); the hierarchy drill-down needs a breakdown per site.
|
|
623
|
+
*/
|
|
624
|
+
groupBySite?: boolean | undefined;
|
|
625
|
+
now: Date;
|
|
626
|
+
props: DatabaseCommonInteractionProps;
|
|
627
|
+
}): Promise<Array<DeviceHealthGroup>> {
|
|
628
|
+
if (data.siteIds.length === 0) {
|
|
629
|
+
return [];
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
const rows: Array<AggregateRow> = await this.aggregateBy({
|
|
633
|
+
query: {
|
|
634
|
+
projectId: data.projectId,
|
|
635
|
+
siteId: QueryHelper.any(data.siteIds),
|
|
636
|
+
isArchived: false,
|
|
637
|
+
},
|
|
638
|
+
groupBy: data.groupBySite
|
|
639
|
+
? DEVICE_HEALTH_GROUP_COLUMNS_BY_SITE
|
|
640
|
+
: DEVICE_HEALTH_GROUP_COLUMNS,
|
|
641
|
+
select: DEVICE_HEALTH_AGGREGATES,
|
|
642
|
+
orderBy: DEVICE_HEALTH_GROUP_ORDER,
|
|
643
|
+
parameters: {
|
|
644
|
+
[DEVICE_HEALTH_NOW_PARAMETER]: data.now,
|
|
645
|
+
},
|
|
646
|
+
props: data.props,
|
|
647
|
+
});
|
|
648
|
+
|
|
649
|
+
return rows.map(parseDeviceHealthGroup);
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
/*
|
|
653
|
+
* The provenance FK uses RESTRICT as a final race backstop: PostgreSQL must
|
|
654
|
+
* never silently remove an active monitor with its device. An ordinary
|
|
655
|
+
* service deletion therefore authorizes and resolves the exact device rows
|
|
656
|
+
* first, then deletes their automatic monitors through MonitorService so
|
|
657
|
+
* Monitor delete permissions, workspace cleanup, workflows, audit,
|
|
658
|
+
* realtime, and billing hooks all run before the devices are removed.
|
|
659
|
+
*/
|
|
660
|
+
@CaptureSpan()
|
|
661
|
+
protected override async onBeforeDelete(
|
|
662
|
+
deleteBy: DeleteBy<Model>,
|
|
663
|
+
): Promise<OnDelete<Model>> {
|
|
664
|
+
const authorizedQuery: Query<Model> =
|
|
665
|
+
await ModelPermission.checkDeleteQueryPermission(
|
|
666
|
+
Model,
|
|
667
|
+
deleteBy.query,
|
|
668
|
+
deleteBy.props,
|
|
669
|
+
);
|
|
670
|
+
|
|
671
|
+
const devices: Array<Model> = await this.findBy({
|
|
672
|
+
query: authorizedQuery,
|
|
673
|
+
select: {
|
|
674
|
+
_id: true,
|
|
675
|
+
projectId: true,
|
|
676
|
+
},
|
|
677
|
+
limit: deleteBy.limit,
|
|
678
|
+
skip: deleteBy.skip,
|
|
679
|
+
props: { isRoot: true },
|
|
680
|
+
});
|
|
681
|
+
|
|
682
|
+
const countAutomaticMonitors: (
|
|
683
|
+
query: Query<Monitor>,
|
|
684
|
+
) => Promise<number> = async (query: Query<Monitor>): Promise<number> => {
|
|
685
|
+
return (
|
|
686
|
+
await MonitorService.countBy({
|
|
687
|
+
query,
|
|
688
|
+
props: { isRoot: true },
|
|
689
|
+
})
|
|
690
|
+
).toNumber();
|
|
691
|
+
};
|
|
692
|
+
const cleanupPlans: Array<{
|
|
693
|
+
automaticMonitorQuery: Query<Monitor>;
|
|
694
|
+
monitorDeleteProps: DatabaseCommonInteractionProps;
|
|
695
|
+
monitorCount: number;
|
|
696
|
+
}> = [];
|
|
697
|
+
|
|
698
|
+
/*
|
|
699
|
+
* Preflight every device in the bulk request before deleting the first
|
|
700
|
+
* monitor. Otherwise a later inaccessible device could abort the request
|
|
701
|
+
* after earlier devices had already lost their automatic monitors.
|
|
702
|
+
*/
|
|
703
|
+
for (const device of devices) {
|
|
704
|
+
if (!device.id || !device.projectId) {
|
|
705
|
+
continue;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
const automaticMonitorQuery: Query<Monitor> = {
|
|
709
|
+
projectId: device.projectId,
|
|
710
|
+
autoProvisionedNetworkDeviceId: device.id,
|
|
711
|
+
};
|
|
712
|
+
const monitorDeleteProps: DatabaseCommonInteractionProps = {
|
|
713
|
+
...deleteBy.props,
|
|
714
|
+
tenantId: device.projectId,
|
|
715
|
+
};
|
|
716
|
+
const monitorCount: number = await countAutomaticMonitors(
|
|
717
|
+
automaticMonitorQuery,
|
|
718
|
+
);
|
|
719
|
+
|
|
720
|
+
if (monitorCount === 0) {
|
|
721
|
+
continue;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/*
|
|
725
|
+
* Prove access BEFORE deleting anything. Without this preflight an
|
|
726
|
+
* access-control query could delete only the monitors visible to the
|
|
727
|
+
* caller before the RESTRICT constraint rejects the device deletion,
|
|
728
|
+
* leaving a partially cleaned-up request. The authorized query is a
|
|
729
|
+
* subset of automaticMonitorQuery, so equal counts prove that it covers
|
|
730
|
+
* the full set at this instant.
|
|
731
|
+
*/
|
|
732
|
+
const authorizedMonitorQuery: Query<Monitor> =
|
|
733
|
+
await ModelPermission.checkDeleteQueryPermission(
|
|
734
|
+
Monitor,
|
|
735
|
+
automaticMonitorQuery,
|
|
736
|
+
monitorDeleteProps,
|
|
737
|
+
);
|
|
738
|
+
const authorizedMonitorCount: number = await countAutomaticMonitors(
|
|
739
|
+
authorizedMonitorQuery,
|
|
740
|
+
);
|
|
741
|
+
|
|
742
|
+
if (authorizedMonitorCount !== monitorCount) {
|
|
743
|
+
throw new NotAuthorizedException(
|
|
744
|
+
"You do not have permission to delete every auto-provisioned monitor linked to this Network Device.",
|
|
745
|
+
);
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
cleanupPlans.push({
|
|
749
|
+
automaticMonitorQuery,
|
|
750
|
+
monitorDeleteProps,
|
|
751
|
+
monitorCount,
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
for (const cleanupPlan of cleanupPlans) {
|
|
756
|
+
/*
|
|
757
|
+
* LIMIT_MAX is a per-service-call cap, not a lifecycle cap. Always
|
|
758
|
+
* delete from offset zero because each successful batch shrinks the
|
|
759
|
+
* result set. Recount as root after every batch: a permission change or
|
|
760
|
+
* concurrent inaccessible insert must fail closed, with the FK's
|
|
761
|
+
* RESTRICT policy remaining the last guard before device deletion.
|
|
762
|
+
*/
|
|
763
|
+
let remainingMonitorCount: number = cleanupPlan.monitorCount;
|
|
764
|
+
while (remainingMonitorCount > 0) {
|
|
765
|
+
await MonitorService.deleteBy({
|
|
766
|
+
query: cleanupPlan.automaticMonitorQuery,
|
|
767
|
+
limit: LIMIT_MAX,
|
|
768
|
+
skip: 0,
|
|
769
|
+
props: cleanupPlan.monitorDeleteProps,
|
|
770
|
+
});
|
|
771
|
+
|
|
772
|
+
const previousMonitorCount: number = remainingMonitorCount;
|
|
773
|
+
remainingMonitorCount = await countAutomaticMonitors(
|
|
774
|
+
cleanupPlan.automaticMonitorQuery,
|
|
775
|
+
);
|
|
776
|
+
|
|
777
|
+
if (remainingMonitorCount >= previousMonitorCount) {
|
|
778
|
+
throw new NotAuthorizedException(
|
|
779
|
+
"Could not delete every auto-provisioned monitor linked to this Network Device.",
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
return {
|
|
786
|
+
deleteBy: {
|
|
787
|
+
...deleteBy,
|
|
788
|
+
query: {
|
|
789
|
+
_id: QueryHelper.any(
|
|
790
|
+
devices.flatMap((device: Model): Array<ObjectID> => {
|
|
791
|
+
return device.id ? [device.id] : [];
|
|
792
|
+
}),
|
|
793
|
+
),
|
|
794
|
+
},
|
|
795
|
+
skip: 0,
|
|
796
|
+
},
|
|
797
|
+
carryForward: null,
|
|
798
|
+
};
|
|
799
|
+
}
|
|
800
|
+
|
|
121
801
|
/*
|
|
122
802
|
* The FK behind siteId only requires the NetworkSite row to exist, not that
|
|
123
803
|
* it belongs to the device's project. Without this check a tenant can point
|
|
@@ -696,7 +1376,27 @@ export class Service extends DatabaseService<Model> {
|
|
|
696
1376
|
continue;
|
|
697
1377
|
}
|
|
698
1378
|
|
|
699
|
-
|
|
1379
|
+
/*
|
|
1380
|
+
* The previous snapshot already carries the device's project, so
|
|
1381
|
+
* hand it over: it lets a project with no rules at all skip both
|
|
1382
|
+
* the device read and the rule read, which is the whole cost of
|
|
1383
|
+
* this branch for a fleet that has not been given rules yet.
|
|
1384
|
+
*
|
|
1385
|
+
* ...but ONLY for a device with no site, and that distinction is
|
|
1386
|
+
* the whole safety of the skip. Those devices are re-evaluated on
|
|
1387
|
+
* every poll, so a skip there defers work by one cycle and the next
|
|
1388
|
+
* poll picks it up. A device that already HAS a site is re-evaluated
|
|
1389
|
+
* only when its identity actually changed — a one-shot event, not a
|
|
1390
|
+
* retry. Skipping that is not a deferral, it is a LOSS: the rename
|
|
1391
|
+
* never happens again, the device keeps its old site indefinitely,
|
|
1392
|
+
* and nothing says so. Ten seconds of staleness is a fine price for
|
|
1393
|
+
* a deferral and an unacceptable one for a loss, so the identity
|
|
1394
|
+
* path always reads the rules.
|
|
1395
|
+
*/
|
|
1396
|
+
await this.applySiteAssignmentRulesToDevice(
|
|
1397
|
+
deviceId,
|
|
1398
|
+
previousDevice?.siteId ? undefined : previousDevice?.projectId,
|
|
1399
|
+
);
|
|
700
1400
|
}
|
|
701
1401
|
}
|
|
702
1402
|
} catch (error) {
|
|
@@ -754,7 +1454,26 @@ export class Service extends DatabaseService<Model> {
|
|
|
754
1454
|
@CaptureSpan()
|
|
755
1455
|
public async applySiteAssignmentRulesToDevice(
|
|
756
1456
|
deviceId: ObjectID,
|
|
1457
|
+
/*
|
|
1458
|
+
* The device's project, when the caller already knows it AND the call is
|
|
1459
|
+
* one that will happen again if it is skipped. Purely an optimisation,
|
|
1460
|
+
* and only ever a SKIP: it lets the known-empty check run before the
|
|
1461
|
+
* device read, so a project with no rules costs nothing per poll.
|
|
1462
|
+
*
|
|
1463
|
+
* Leaving it out gets the unconditional, always-fresh path, and two
|
|
1464
|
+
* callers deliberately do: device creation (a rule saved moments ago must
|
|
1465
|
+
* apply to the device being imported right now) and the identity-change
|
|
1466
|
+
* branch of onUpdateSuccess (a one-shot event — see the note there).
|
|
1467
|
+
*/
|
|
1468
|
+
projectId?: ObjectID | undefined,
|
|
757
1469
|
): Promise<void> {
|
|
1470
|
+
if (
|
|
1471
|
+
projectId &&
|
|
1472
|
+
this.emptySiteAssignmentRuleCache.isKnownEmpty(projectId)
|
|
1473
|
+
) {
|
|
1474
|
+
return;
|
|
1475
|
+
}
|
|
1476
|
+
|
|
758
1477
|
const device: Model | null = await this.findOneById({
|
|
759
1478
|
id: deviceId,
|
|
760
1479
|
select: {
|
|
@@ -794,6 +1513,17 @@ export class Service extends DatabaseService<Model> {
|
|
|
794
1513
|
},
|
|
795
1514
|
});
|
|
796
1515
|
|
|
1516
|
+
/*
|
|
1517
|
+
* Feed the answer back either way: an empty set starts (or renews) the
|
|
1518
|
+
* skip, and a non-empty one cancels it immediately — so a project that
|
|
1519
|
+
* gains its first rule stops being skipped on this replica as soon as
|
|
1520
|
+
* anything here looks at the rules, without waiting for the TTL.
|
|
1521
|
+
*/
|
|
1522
|
+
this.emptySiteAssignmentRuleCache.record({
|
|
1523
|
+
projectId: device.projectId,
|
|
1524
|
+
isEmpty: rules.length === 0,
|
|
1525
|
+
});
|
|
1526
|
+
|
|
797
1527
|
if (rules.length === 0) {
|
|
798
1528
|
return;
|
|
799
1529
|
}
|
|
@@ -883,6 +1613,17 @@ export class Service extends DatabaseService<Model> {
|
|
|
883
1613
|
},
|
|
884
1614
|
});
|
|
885
1615
|
|
|
1616
|
+
/*
|
|
1617
|
+
* Read fresh above and never from the negative cache: this is the button
|
|
1618
|
+
* an operator presses right after saving a rule, so it must see the rule
|
|
1619
|
+
* it was pressed for. Recording the answer here also means pressing it
|
|
1620
|
+
* lifts any "no rules" skip the poll path had cached for the project.
|
|
1621
|
+
*/
|
|
1622
|
+
this.emptySiteAssignmentRuleCache.record({
|
|
1623
|
+
projectId: data.projectId,
|
|
1624
|
+
isEmpty: rules.length === 0,
|
|
1625
|
+
});
|
|
1626
|
+
|
|
886
1627
|
const rule: NetworkSiteAssignmentRule | undefined = rules.find(
|
|
887
1628
|
(candidate: NetworkSiteAssignmentRule) => {
|
|
888
1629
|
return candidate._id?.toString() === data.ruleId.toString();
|
|
@@ -1086,13 +1827,18 @@ export class Service extends DatabaseService<Model> {
|
|
|
1086
1827
|
-- A monitor-backed device has no credentials to walk with. NULL is
|
|
1087
1828
|
-- every device created before the column existed: those are SNMP.
|
|
1088
1829
|
AND (nd."monitoringMethod" IS NULL OR nd."monitoringMethod" <> 'Monitor')
|
|
1089
|
-
AND
|
|
1830
|
+
AND nd."nextPollAt" <= $2
|
|
1090
1831
|
AND p."deletedAt" IS NULL
|
|
1091
1832
|
AND (p."paymentProviderSubscriptionStatus" IS NULL
|
|
1092
1833
|
OR p."paymentProviderSubscriptionStatus" IN ('active', 'trialing'))
|
|
1093
1834
|
AND (p."paymentProviderMeteredSubscriptionStatus" IS NULL
|
|
1094
1835
|
OR p."paymentProviderMeteredSubscriptionStatus" IN ('active', 'trialing'))
|
|
1095
|
-
|
|
1836
|
+
-- Plain ASC, which is the order the (probeId, nextPollAt) btree is
|
|
1837
|
+
-- already in, so this is a range scan that stops at LIMIT rather than
|
|
1838
|
+
-- a scan-and-sort of the probe's whole slice of the fleet. See the
|
|
1839
|
+
-- column's NOT NULL note on the model for why there are no NULLs to
|
|
1840
|
+
-- order around any more.
|
|
1841
|
+
ORDER BY nd."nextPollAt" ASC
|
|
1096
1842
|
LIMIT $3
|
|
1097
1843
|
FOR UPDATE OF nd SKIP LOCKED
|
|
1098
1844
|
`;
|