@oneuptime/common 12.0.32 → 12.0.33
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/Span.ts +14 -0
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/Index.ts +10 -0
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +176 -1
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/TelemetryException.ts +119 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
- package/Server/API/EnterpriseLicenseAPI.ts +391 -64
- package/Server/API/LlmProviderAPI.ts +137 -22
- package/Server/EnvironmentConfig.ts +14 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Infrastructure/QueueWorker.ts +38 -8
- package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
- package/Server/Middleware/ProjectAuthorization.ts +11 -0
- package/Server/Middleware/SCIMAuthorization.ts +12 -0
- package/Server/Middleware/TelemetryIngest.ts +11 -0
- package/Server/Services/AIBillingService.ts +101 -27
- package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/Index.ts +10 -0
- package/Server/Services/MonitorService.ts +143 -21
- package/Server/Services/MonitorStatusTimelineService.ts +150 -8
- package/Server/Services/MonitorTemplateService.ts +217 -1
- package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
- package/Server/Services/NetworkAlertPolicyService.ts +944 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
- package/Server/Services/NetworkDeviceService.ts +1032 -73
- package/Server/Services/NetworkSiteService.ts +1502 -129
- package/Server/Services/NetworkSiteTypeService.ts +1216 -0
- package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
- package/Server/Services/NotificationService.ts +118 -28
- package/Server/Services/ProjectService.ts +105 -48
- package/Server/Services/StatusPagePrivateUserService.ts +103 -3
- package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
- package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
- package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
- package/Server/Services/UserNotificationSettingService.ts +62 -25
- package/Server/Services/UserService.ts +95 -0
- package/Server/Types/Database/QueryHelper.ts +2 -2
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
- package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
- package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
- package/Server/Utils/DataSource/HttpFetch.ts +9 -2
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
- package/Server/Utils/LLM/LLMService.ts +78 -0
- package/Server/Utils/LogRedaction.ts +8 -0
- package/Server/Utils/Logger.ts +79 -1
- package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
- package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
- package/Server/Utils/OutboundUserAgent.ts +152 -0
- package/Server/Utils/StartServer.ts +51 -19
- package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
- package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
- package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
- package/Server/Utils/Telemetry.ts +198 -51
- package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
- package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
- package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
- package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
- package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
- package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
- package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
- package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
- package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
- package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
- package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
- package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
- package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
- package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
- package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
- package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
- package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
- package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
- package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
- package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
- package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
- package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
- package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
- package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
- package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
- package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
- package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
- package/Tests/Server/Utils/Captcha.test.ts +422 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
- package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
- package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
- package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
- package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
- package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
- package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
- package/Tests/Server/Utils/Telemetry.test.ts +456 -66
- package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
- package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
- package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
- package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
- package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
- package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
- package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
- package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
- package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
- package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
- package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
- package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
- package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
- package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
- package/Types/AI/ExceptionAIClassification.ts +10 -24
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
- package/Types/Exception/ApiException.ts +10 -0
- package/Types/Exception/BadDataException.ts +11 -0
- package/Types/Exception/BadRequestException.ts +11 -0
- package/Types/Exception/Exception.ts +65 -0
- package/Types/Exception/ForbiddenException.ts +10 -0
- package/Types/Exception/NotAuthenticatedException.ts +10 -0
- package/Types/Exception/NotAuthorizedException.ts +10 -0
- package/Types/Exception/NotFoundException.ts +11 -0
- package/Types/Exception/PayloadTooLargeException.ts +11 -0
- package/Types/Exception/PaymentRequiredException.ts +10 -0
- package/Types/Exception/ServiceUnavailableException.ts +10 -0
- package/Types/Exception/SsoAuthorizationException.ts +10 -0
- package/Types/Exception/TenantNotFoundException.ts +11 -0
- package/Types/Exception/TimeoutException.ts +10 -0
- package/Types/Exception/TooManyRequestsException.ts +10 -0
- package/Types/Exception/UnableToReachServer.ts +10 -0
- package/Types/Exception/WebsiteRequestException.ts +10 -0
- package/Types/Monitor/CriteriaFilter.ts +60 -2
- package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
- package/Types/Monitor/MonitorMetricType.ts +71 -0
- package/Types/Monitor/MonitorStep.ts +76 -0
- package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
- package/Types/Monitor/MonitorType.ts +47 -1
- package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
- package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
- package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
- package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
- package/Types/Permission.ts +90 -0
- package/Types/Probe/ProbeMonitorResponse.ts +16 -0
- package/Types/Telemetry/ErrorClass.ts +274 -0
- package/Types/Telemetry/UnitOfWork.ts +59 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
- package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
- package/UI/Components/Modal/Modal.tsx +2 -8
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/SideMenu.tsx +123 -5
- package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
- package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
- package/UI/Components/SideOver/SideOver.tsx +21 -20
- package/UI/Utils/PageScrollLock.ts +79 -3
- package/UI/Utils/PermissionGate.ts +61 -0
- package/UI/Utils/SensitiveUrlToken.ts +112 -0
- package/UI/Utils/TestLLMProvider.ts +11 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
- package/Utils/Monitor/MonitorMetricType.ts +153 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
- package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
- package/build/dist/Models/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +10 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/LlmProviderAPI.js +108 -13
- package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +12 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +70 -16
- package/build/dist/Server/Services/AIBillingService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +10 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +119 -21
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
- package/build/dist/Server/Services/NotificationService.js +80 -17
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +66 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +90 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
- package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +8 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +63 -1
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +38 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +162 -46
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
- package/build/dist/Types/AI/ExceptionAIClassification.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/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
- package/build/dist/Types/Exception/ApiException.js +9 -0
- package/build/dist/Types/Exception/ApiException.js.map +1 -1
- package/build/dist/Types/Exception/BadDataException.js +10 -0
- package/build/dist/Types/Exception/BadDataException.js.map +1 -1
- package/build/dist/Types/Exception/BadRequestException.js +10 -0
- package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
- package/build/dist/Types/Exception/Exception.js +56 -0
- package/build/dist/Types/Exception/Exception.js.map +1 -1
- package/build/dist/Types/Exception/ForbiddenException.js +9 -0
- package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
- package/build/dist/Types/Exception/NotFoundException.js +10 -0
- package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
- package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
- package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
- package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
- package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
- package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
- package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/TimeoutException.js +9 -0
- package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
- package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
- package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
- package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
- package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
- package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +54 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +45 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
- package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +80 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
- package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -7
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +31 -3
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +42 -1
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
- package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
- package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
|
|
2
|
+
import NetworkSite from "../../../Models/DatabaseModels/NetworkSite";
|
|
3
|
+
import NetworkSnmpCredentialProfile from "../../../Models/DatabaseModels/NetworkSnmpCredentialProfile";
|
|
2
4
|
import NetworkDeviceService from "../../Services/NetworkDeviceService";
|
|
5
|
+
import NetworkSiteService from "../../Services/NetworkSiteService";
|
|
6
|
+
import NetworkSnmpCredentialProfileService from "../../Services/NetworkSnmpCredentialProfileService";
|
|
3
7
|
import MonitorStepSnmpMonitor from "../../../Types/Monitor/MonitorStepSnmpMonitor";
|
|
4
8
|
import SnmpOid from "../../../Types/Monitor/SnmpMonitor/SnmpOid";
|
|
5
9
|
import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
|
|
@@ -14,8 +18,13 @@ import SnmpSecurityLevel from "../../../Types/Monitor/SnmpMonitor/SnmpSecurityLe
|
|
|
14
18
|
import SnmpAuthProtocol from "../../../Types/Monitor/SnmpMonitor/SnmpAuthProtocol";
|
|
15
19
|
import SnmpPrivProtocol from "../../../Types/Monitor/SnmpMonitor/SnmpPrivProtocol";
|
|
16
20
|
import ObjectID from "../../../Types/ObjectID";
|
|
21
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
17
22
|
import IP from "../../../Types/IP/IP";
|
|
18
23
|
import IpCanonicalUtil from "../../../Utils/IpCanonicalUtil";
|
|
24
|
+
import {
|
|
25
|
+
SnmpCredentialCarrier,
|
|
26
|
+
hasUsableCredentials,
|
|
27
|
+
} from "../../../Utils/NetworkDevice/SnmpCredentialUtil";
|
|
19
28
|
import DnsResolutionCache from "./DnsResolutionCache";
|
|
20
29
|
import logger from "../Logger";
|
|
21
30
|
|
|
@@ -31,15 +40,111 @@ export interface HydratableMonitor {
|
|
|
31
40
|
monitorSteps?: MonitorSteps | undefined;
|
|
32
41
|
}
|
|
33
42
|
|
|
43
|
+
/*
|
|
44
|
+
* How the assigned probe polls a device on a given cycle.
|
|
45
|
+
*
|
|
46
|
+
* ping - ICMP reachability only. The device has no usable SNMP
|
|
47
|
+
* credentials anywhere, so there is nothing to walk it with.
|
|
48
|
+
* snmp - ICMP reachability AND an SNMP walk, run in parallel. The walk
|
|
49
|
+
* is never gated on the ping: ICMP-filtered SNMP gear stays Up.
|
|
50
|
+
*
|
|
51
|
+
* The mode travels both ways. The list handler stamps it on every device it
|
|
52
|
+
* hands out (so the probe knows whether to walk), and the probe stamps it on
|
|
53
|
+
* every result it reports (so the server knows whether a missing walk means
|
|
54
|
+
* "not attempted" or "lost"). A result with no mode at all comes from a
|
|
55
|
+
* probe older than ping-first polling, which only ever walked, so the
|
|
56
|
+
* ingest side reads a missing mode as "snmp".
|
|
57
|
+
*/
|
|
58
|
+
export type NetworkDevicePollMode = "ping" | "snmp";
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
* Everything needed to OPEN an SNMP session, as opposed to the three fields
|
|
62
|
+
* that decide whether one is worth opening at all (SnmpCredentialCarrier).
|
|
63
|
+
*
|
|
64
|
+
* Three different rows satisfy this shape and the resolver below picks
|
|
65
|
+
* between them per device: the device's own snmp* columns, the
|
|
66
|
+
* NetworkSnmpCredentialProfile the device points at, and the profile the
|
|
67
|
+
* device's SITE points at. Structural rather than a union of the two models
|
|
68
|
+
* on purpose — the assembly below must not be able to tell which row it was
|
|
69
|
+
* handed, or it would grow a branch that reads one of them differently.
|
|
70
|
+
*
|
|
71
|
+
* `| undefined` is spelled out on every field for the reason
|
|
72
|
+
* SnmpCredentialCarrier documents: the repo compiles with
|
|
73
|
+
* exactOptionalPropertyTypes, and a caller assembling a carrier from a
|
|
74
|
+
* partially selected row hands over explicit undefineds.
|
|
75
|
+
*/
|
|
76
|
+
export interface SnmpConnectionCredentials extends SnmpCredentialCarrier {
|
|
77
|
+
snmpPort?: number | null | undefined;
|
|
78
|
+
// Only devices have this: the pre-column-flattening v3 JSON blob.
|
|
79
|
+
snmpV3Auth?: JSONObject | null | undefined;
|
|
80
|
+
snmpV3SecurityLevel?: string | null | undefined;
|
|
81
|
+
snmpV3AuthProtocol?: string | null | undefined;
|
|
82
|
+
snmpV3AuthKey?: string | null | undefined;
|
|
83
|
+
snmpV3PrivProtocol?: string | null | undefined;
|
|
84
|
+
snmpV3PrivKey?: string | null | undefined;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/*
|
|
88
|
+
* What one device's credentials resolved to, and therefore how it is polled
|
|
89
|
+
* this cycle. `carrier` is whichever row won the resolution order; when
|
|
90
|
+
* nothing usable was found anywhere it is the device's own columns and
|
|
91
|
+
* `pollMode` is "ping", so a caller can always build a config from it
|
|
92
|
+
* without a null check — it simply must not, in ping mode.
|
|
93
|
+
*/
|
|
94
|
+
export interface ResolvedDeviceSnmpCredentials {
|
|
95
|
+
carrier: SnmpConnectionCredentials;
|
|
96
|
+
pollMode: NetworkDevicePollMode;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/*
|
|
100
|
+
* The batch answer. `unresolvedDeviceIds` are devices whose credentials
|
|
101
|
+
* depend on a row this cycle could not read (the profile or site lookup
|
|
102
|
+
* threw). They are NOT in `byDeviceId`, and every caller must skip them for
|
|
103
|
+
* the cycle rather than fall back to the device's own columns: falling back
|
|
104
|
+
* would poll a profile-credentialled device with no credentials at all,
|
|
105
|
+
* which the probe reports as Down and which therefore manufactures an
|
|
106
|
+
* outage out of a database blip.
|
|
107
|
+
*/
|
|
108
|
+
export interface ResolvedSnmpCredentialsForBatch {
|
|
109
|
+
byDeviceId: Map<string, ResolvedDeviceSnmpCredentials>;
|
|
110
|
+
unresolvedDeviceIds: Set<string>;
|
|
111
|
+
}
|
|
112
|
+
|
|
34
113
|
export default class NetworkDeviceHydrationUtil {
|
|
114
|
+
/*
|
|
115
|
+
* The poll-time decision: walk the device over SNMP, or only ping it?
|
|
116
|
+
*
|
|
117
|
+
* Purely a function of whether the credential carrier the caller resolved
|
|
118
|
+
* (see resolveSnmpCredentials: the device's own columns, its credential
|
|
119
|
+
* profile, or its site's) has enough to open an SNMP session with - see
|
|
120
|
+
* SnmpCredentialUtil.hasUsableCredentials for what "enough" means. It is
|
|
121
|
+
* deliberately NOT a function of the monitoring method: a Probe device is
|
|
122
|
+
* polled either way, and the method only says whether a probe polls it at
|
|
123
|
+
* all.
|
|
124
|
+
*/
|
|
125
|
+
public static resolvePollMode(
|
|
126
|
+
carrier: SnmpCredentialCarrier,
|
|
127
|
+
): NetworkDevicePollMode {
|
|
128
|
+
return hasUsableCredentials(carrier) ? "snmp" : "ping";
|
|
129
|
+
}
|
|
130
|
+
|
|
35
131
|
/*
|
|
36
132
|
* The device columns needed to assemble a probe-executable SNMP config.
|
|
37
133
|
* Shared by monitor hydration below and the device polling claim
|
|
38
134
|
* endpoint, so the two can never drift apart on which credentials they
|
|
39
135
|
* load.
|
|
136
|
+
*
|
|
137
|
+
* `projectId`, `siteId` and `snmpCredentialProfileId` are part of the
|
|
138
|
+
* credential set, not extras: a device's credentials may live on a
|
|
139
|
+
* profile it or its site points at, and a profile is only usable when it
|
|
140
|
+
* belongs to the same project as the device (resolveSnmpCredentials drops
|
|
141
|
+
* it otherwise, and cannot compare what it did not select).
|
|
40
142
|
*/
|
|
41
143
|
public static readonly snmpConfigSelect: {
|
|
42
144
|
_id: true;
|
|
145
|
+
projectId: true;
|
|
146
|
+
siteId: true;
|
|
147
|
+
snmpCredentialProfileId: true;
|
|
43
148
|
hostname: true;
|
|
44
149
|
snmpVersion: true;
|
|
45
150
|
snmpCommunityString: true;
|
|
@@ -53,6 +158,9 @@ export default class NetworkDeviceHydrationUtil {
|
|
|
53
158
|
snmpV3PrivKey: true;
|
|
54
159
|
} = {
|
|
55
160
|
_id: true,
|
|
161
|
+
projectId: true,
|
|
162
|
+
siteId: true,
|
|
163
|
+
snmpCredentialProfileId: true,
|
|
56
164
|
hostname: true,
|
|
57
165
|
snmpVersion: true,
|
|
58
166
|
snmpCommunityString: true,
|
|
@@ -67,24 +175,362 @@ export default class NetworkDeviceHydrationUtil {
|
|
|
67
175
|
};
|
|
68
176
|
|
|
69
177
|
/*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
178
|
+
* The columns a NetworkSnmpCredentialProfile contributes when it is the
|
|
179
|
+
* winning carrier. `projectId` is here for the tenancy comparison, which
|
|
180
|
+
* is the whole reason the profiles are loaded as root.
|
|
181
|
+
*/
|
|
182
|
+
private static readonly credentialProfileSelect: {
|
|
183
|
+
_id: true;
|
|
184
|
+
projectId: true;
|
|
185
|
+
snmpVersion: true;
|
|
186
|
+
snmpCommunityString: true;
|
|
187
|
+
snmpPort: true;
|
|
188
|
+
snmpV3SecurityLevel: true;
|
|
189
|
+
snmpV3Username: true;
|
|
190
|
+
snmpV3AuthProtocol: true;
|
|
191
|
+
snmpV3AuthKey: true;
|
|
192
|
+
snmpV3PrivProtocol: true;
|
|
193
|
+
snmpV3PrivKey: true;
|
|
194
|
+
} = {
|
|
195
|
+
_id: true,
|
|
196
|
+
projectId: true,
|
|
197
|
+
snmpVersion: true,
|
|
198
|
+
snmpCommunityString: true,
|
|
199
|
+
snmpPort: true,
|
|
200
|
+
snmpV3SecurityLevel: true,
|
|
201
|
+
snmpV3Username: true,
|
|
202
|
+
snmpV3AuthProtocol: true,
|
|
203
|
+
snmpV3AuthKey: true,
|
|
204
|
+
snmpV3PrivProtocol: true,
|
|
205
|
+
snmpV3PrivKey: true,
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
/*
|
|
209
|
+
* Resolves, for a batch of devices, WHICH row each one is walked with -
|
|
210
|
+
* and therefore whether it is walked at all.
|
|
211
|
+
*
|
|
212
|
+
* Resolution order, first row with usable credentials wins:
|
|
213
|
+
* 1. the device's own snmp* columns,
|
|
214
|
+
* 2. the NetworkSnmpCredentialProfile the device points at,
|
|
215
|
+
* 3. the profile the device's SITE points at.
|
|
216
|
+
* With none of the three the device is pinged and never walked, and the
|
|
217
|
+
* carrier handed back is the device itself so the answer is always
|
|
218
|
+
* complete.
|
|
219
|
+
*
|
|
220
|
+
* TENANCY. Both lookups run as root, because a poll batch spans projects
|
|
221
|
+
* and there is no caller tenant to scope to. Root reads mean the FK is
|
|
222
|
+
* NOT a tenancy guarantee, so every profile is compared against the
|
|
223
|
+
* device's own projectId and a mismatch is DROPPED with an error log
|
|
224
|
+
* rather than used. A device pointed at another project's profile is
|
|
225
|
+
* therefore polled with NO credentials (ping) rather than with that
|
|
226
|
+
* project's community string - which is the difference between a device
|
|
227
|
+
* that reads Pending and a cross-tenant credential leak onto the wire.
|
|
228
|
+
*
|
|
229
|
+
* COST. Three queries per batch at the very worst, and zero for the
|
|
230
|
+
* common fleet where every device carries its own credentials: profiles
|
|
231
|
+
* are only looked up for devices that have no usable columns of their
|
|
232
|
+
* own, and sites only for those of them that still have nothing.
|
|
233
|
+
*
|
|
234
|
+
* This is the single resolver for BOTH the poll list handler and monitor
|
|
235
|
+
* hydration, so the walk a probe is told to run and the walk the monitor
|
|
236
|
+
* evaluation believes ran can never be based on different credentials.
|
|
237
|
+
*/
|
|
238
|
+
public static async resolveSnmpCredentials(
|
|
239
|
+
devices: Array<NetworkDevice>,
|
|
240
|
+
): Promise<ResolvedSnmpCredentialsForBatch> {
|
|
241
|
+
const byDeviceId: Map<string, ResolvedDeviceSnmpCredentials> = new Map();
|
|
242
|
+
const unresolvedDeviceIds: Set<string> = new Set();
|
|
243
|
+
|
|
244
|
+
/*
|
|
245
|
+
* A device whose own columns already open a session needs nothing read.
|
|
246
|
+
* Everything below is scoped to the rest, so a fleet that never adopted
|
|
247
|
+
* profiles pays for none of this.
|
|
248
|
+
*/
|
|
249
|
+
const devicesNeedingLookup: Array<NetworkDevice> = [];
|
|
250
|
+
|
|
251
|
+
for (const device of devices) {
|
|
252
|
+
if (!device.id) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (hasUsableCredentials(device)) {
|
|
257
|
+
byDeviceId.set(device.id.toString(), {
|
|
258
|
+
carrier: device,
|
|
259
|
+
pollMode: NetworkDeviceHydrationUtil.resolvePollMode(device),
|
|
260
|
+
});
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (device.snmpCredentialProfileId || device.siteId) {
|
|
265
|
+
devicesNeedingLookup.push(device);
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Nothing of its own, nothing to inherit from: pinged only.
|
|
270
|
+
byDeviceId.set(device.id.toString(), {
|
|
271
|
+
carrier: device,
|
|
272
|
+
pollMode: NetworkDeviceHydrationUtil.resolvePollMode(device),
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (devicesNeedingLookup.length === 0) {
|
|
277
|
+
return {
|
|
278
|
+
byDeviceId: byDeviceId,
|
|
279
|
+
unresolvedDeviceIds: unresolvedDeviceIds,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const profilesById: Map<string, NetworkSnmpCredentialProfile> = new Map();
|
|
284
|
+
const siteProfileIdBySiteId: Map<string, string> = new Map();
|
|
285
|
+
|
|
286
|
+
try {
|
|
287
|
+
const deviceProfileIds: Array<string> = Array.from(
|
|
288
|
+
new Set(
|
|
289
|
+
devicesNeedingLookup.flatMap(
|
|
290
|
+
(device: NetworkDevice): Array<string> => {
|
|
291
|
+
return device.snmpCredentialProfileId
|
|
292
|
+
? [device.snmpCredentialProfileId.toString()]
|
|
293
|
+
: [];
|
|
294
|
+
},
|
|
295
|
+
),
|
|
296
|
+
),
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
const siteIds: Array<string> = Array.from(
|
|
300
|
+
new Set(
|
|
301
|
+
devicesNeedingLookup.flatMap(
|
|
302
|
+
(device: NetworkDevice): Array<string> => {
|
|
303
|
+
return device.siteId ? [device.siteId.toString()] : [];
|
|
304
|
+
},
|
|
305
|
+
),
|
|
306
|
+
),
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
/*
|
|
310
|
+
* Round one: the profiles the devices name, and the sites they sit in
|
|
311
|
+
* (for the profile those sites name). Issued together because neither
|
|
312
|
+
* depends on the other.
|
|
313
|
+
*/
|
|
314
|
+
const [deviceProfiles, sites]: [
|
|
315
|
+
Array<NetworkSnmpCredentialProfile>,
|
|
316
|
+
Array<NetworkSite>,
|
|
317
|
+
] = await Promise.all([
|
|
318
|
+
NetworkDeviceHydrationUtil.loadCredentialProfiles(deviceProfileIds),
|
|
319
|
+
siteIds.length === 0
|
|
320
|
+
? Promise.resolve([])
|
|
321
|
+
: NetworkSiteService.findBy({
|
|
322
|
+
query: {
|
|
323
|
+
_id: QueryHelper.any(siteIds),
|
|
324
|
+
},
|
|
325
|
+
select: {
|
|
326
|
+
_id: true,
|
|
327
|
+
projectId: true,
|
|
328
|
+
snmpCredentialProfileId: true,
|
|
329
|
+
},
|
|
330
|
+
limit: LIMIT_MAX,
|
|
331
|
+
skip: 0,
|
|
332
|
+
props: {
|
|
333
|
+
isRoot: true,
|
|
334
|
+
},
|
|
335
|
+
}),
|
|
336
|
+
]);
|
|
337
|
+
|
|
338
|
+
for (const profile of deviceProfiles) {
|
|
339
|
+
if (profile.id) {
|
|
340
|
+
profilesById.set(profile.id.toString(), profile);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
for (const site of sites) {
|
|
345
|
+
if (site.id && site.snmpCredentialProfileId) {
|
|
346
|
+
siteProfileIdBySiteId.set(
|
|
347
|
+
site.id.toString(),
|
|
348
|
+
site.snmpCredentialProfileId.toString(),
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/*
|
|
354
|
+
* Round two: the profiles the sites name that were not already loaded
|
|
355
|
+
* as a device's own. Only ever one extra statement, and only when a
|
|
356
|
+
* site actually carries a profile.
|
|
357
|
+
*/
|
|
358
|
+
const siteProfileIdsToLoad: Array<string> = Array.from(
|
|
359
|
+
new Set(siteProfileIdBySiteId.values()),
|
|
360
|
+
).filter((profileId: string) => {
|
|
361
|
+
return !profilesById.has(profileId);
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
for (const profile of await NetworkDeviceHydrationUtil.loadCredentialProfiles(
|
|
365
|
+
siteProfileIdsToLoad,
|
|
366
|
+
)) {
|
|
367
|
+
if (profile.id) {
|
|
368
|
+
profilesById.set(profile.id.toString(), profile);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
} catch (err) {
|
|
372
|
+
/*
|
|
373
|
+
* Skip these devices this cycle rather than polling them without the
|
|
374
|
+
* credentials they are configured with.
|
|
375
|
+
*
|
|
376
|
+
* The alternative - falling back to the device's own (empty) columns -
|
|
377
|
+
* would hand the probe a ping-mode device, and a device that has been
|
|
378
|
+
* answering SNMP would silently stop reporting interfaces, inventory
|
|
379
|
+
* and walk health for as long as the lookup keeps failing. Claiming
|
|
380
|
+
* has already advanced nextPollAt, so the cost of skipping is one
|
|
381
|
+
* interval; the cost of guessing is a wrong verdict.
|
|
382
|
+
*/
|
|
383
|
+
logger.error(
|
|
384
|
+
`Could not resolve SNMP credential profiles for ${devicesNeedingLookup.length} network device(s); skipping them for this cycle rather than polling them without the credentials they are configured with.`,
|
|
385
|
+
);
|
|
386
|
+
logger.error(err);
|
|
387
|
+
|
|
388
|
+
for (const device of devicesNeedingLookup) {
|
|
389
|
+
if (device.id) {
|
|
390
|
+
unresolvedDeviceIds.add(device.id.toString());
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
return {
|
|
395
|
+
byDeviceId: byDeviceId,
|
|
396
|
+
unresolvedDeviceIds: unresolvedDeviceIds,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
for (const device of devicesNeedingLookup) {
|
|
401
|
+
const deviceId: string = device.id!.toString();
|
|
402
|
+
|
|
403
|
+
const candidates: Array<NetworkSnmpCredentialProfile | undefined> = [
|
|
404
|
+
NetworkDeviceHydrationUtil.sameProjectProfile({
|
|
405
|
+
device: device,
|
|
406
|
+
profileId: device.snmpCredentialProfileId?.toString(),
|
|
407
|
+
profilesById: profilesById,
|
|
408
|
+
referencedBy: "device",
|
|
409
|
+
}),
|
|
410
|
+
NetworkDeviceHydrationUtil.sameProjectProfile({
|
|
411
|
+
device: device,
|
|
412
|
+
profileId: device.siteId
|
|
413
|
+
? siteProfileIdBySiteId.get(device.siteId.toString())
|
|
414
|
+
: undefined,
|
|
415
|
+
profilesById: profilesById,
|
|
416
|
+
referencedBy: "site",
|
|
417
|
+
}),
|
|
418
|
+
];
|
|
419
|
+
|
|
420
|
+
const winner: NetworkSnmpCredentialProfile | undefined = candidates.find(
|
|
421
|
+
(candidate: NetworkSnmpCredentialProfile | undefined) => {
|
|
422
|
+
return candidate !== undefined && hasUsableCredentials(candidate);
|
|
423
|
+
},
|
|
424
|
+
);
|
|
425
|
+
|
|
426
|
+
// No usable row anywhere: the device's own (empty) columns, pinged only.
|
|
427
|
+
const carrier: SnmpConnectionCredentials = winner || device;
|
|
428
|
+
|
|
429
|
+
byDeviceId.set(deviceId, {
|
|
430
|
+
carrier: carrier,
|
|
431
|
+
// One definition of "credentials -> mode", asked of the winning row.
|
|
432
|
+
pollMode: NetworkDeviceHydrationUtil.resolvePollMode(carrier),
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
return { byDeviceId: byDeviceId, unresolvedDeviceIds: unresolvedDeviceIds };
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
private static async loadCredentialProfiles(
|
|
440
|
+
profileIds: Array<string>,
|
|
441
|
+
): Promise<Array<NetworkSnmpCredentialProfile>> {
|
|
442
|
+
if (profileIds.length === 0) {
|
|
443
|
+
return [];
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
return await NetworkSnmpCredentialProfileService.findBy({
|
|
447
|
+
query: {
|
|
448
|
+
_id: QueryHelper.any(profileIds),
|
|
449
|
+
},
|
|
450
|
+
select: NetworkDeviceHydrationUtil.credentialProfileSelect,
|
|
451
|
+
limit: LIMIT_MAX,
|
|
452
|
+
skip: 0,
|
|
453
|
+
props: {
|
|
454
|
+
isRoot: true,
|
|
455
|
+
},
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/*
|
|
460
|
+
* The tenancy comparison, in the one place both references pass through.
|
|
461
|
+
* Returns the profile only when it exists AND belongs to the device's
|
|
462
|
+
* project; a cross-project reference is dropped loudly, because the only
|
|
463
|
+
* ways a row can get into that state are corrupted data or a write that
|
|
464
|
+
* predates the guards in NetworkDeviceService/NetworkSiteService - and in
|
|
465
|
+
* either case shipping those credentials to this project's probe is a
|
|
466
|
+
* credential leak, not a degraded poll.
|
|
467
|
+
*/
|
|
468
|
+
private static sameProjectProfile(data: {
|
|
469
|
+
device: NetworkDevice;
|
|
470
|
+
profileId: string | undefined;
|
|
471
|
+
profilesById: Map<string, NetworkSnmpCredentialProfile>;
|
|
472
|
+
referencedBy: "device" | "site";
|
|
473
|
+
}): NetworkSnmpCredentialProfile | undefined {
|
|
474
|
+
if (!data.profileId) {
|
|
475
|
+
return undefined;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
const profile: NetworkSnmpCredentialProfile | undefined =
|
|
479
|
+
data.profilesById.get(data.profileId);
|
|
480
|
+
|
|
481
|
+
if (!profile) {
|
|
482
|
+
// Deleted between the device's write and this poll; nothing to log loudly.
|
|
483
|
+
return undefined;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/*
|
|
487
|
+
* Both sides must be present AND equal. A row missing its projectId is
|
|
488
|
+
* not "unknown, therefore fine": it is a row whose tenancy cannot be
|
|
489
|
+
* established, and the credentials in it are about to be put on a
|
|
490
|
+
* specific project's wire. The only safe reading of an unverifiable
|
|
491
|
+
* reference is to refuse it.
|
|
492
|
+
*/
|
|
493
|
+
const isSameProject: boolean = Boolean(
|
|
494
|
+
profile.projectId &&
|
|
495
|
+
data.device.projectId &&
|
|
496
|
+
profile.projectId.toString() === data.device.projectId.toString(),
|
|
497
|
+
);
|
|
498
|
+
|
|
499
|
+
if (!isSameProject) {
|
|
500
|
+
logger.error(
|
|
501
|
+
`Network device ${data.device.id?.toString()} resolves (via its ${data.referencedBy}) to SNMP Credential Profile ${data.profileId}, whose project does not match the device's. Dropping the profile: the device is pinged only until the reference is corrected.`,
|
|
502
|
+
);
|
|
503
|
+
return undefined;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
return profile;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/*
|
|
510
|
+
* Assembles the concrete SNMP config a stateless probe can execute.
|
|
511
|
+
*
|
|
512
|
+
* `hostname` and `credentials` are separate parameters, and deliberately
|
|
513
|
+
* so: WHERE to connect always comes from the device, WHAT to connect with
|
|
514
|
+
* comes from whichever row won resolveSnmpCredentials' order. Passing the
|
|
515
|
+
* device for both was the old shape, and it made "poll this device with
|
|
516
|
+
* its site's profile" unrepresentable. The caller chooses what to collect
|
|
72
517
|
* (OIDs / interface walk) — for device polling those come from the
|
|
73
518
|
* device's own snmpOids/walkInterfaces columns.
|
|
74
519
|
*/
|
|
75
520
|
public static buildSnmpMonitorConfig(data: {
|
|
76
|
-
|
|
521
|
+
hostname: string;
|
|
522
|
+
credentials: SnmpConnectionCredentials;
|
|
77
523
|
oids: Array<SnmpOid>;
|
|
78
524
|
monitorInterfaces: boolean;
|
|
79
525
|
}): MonitorStepSnmpMonitor {
|
|
80
526
|
return {
|
|
81
527
|
snmpVersion: NetworkDeviceHydrationUtil.parseSnmpVersion(
|
|
82
|
-
data.
|
|
528
|
+
data.credentials.snmpVersion || undefined,
|
|
83
529
|
),
|
|
84
|
-
hostname: data.
|
|
85
|
-
port: data.
|
|
86
|
-
communityString: data.
|
|
87
|
-
snmpV3Auth: NetworkDeviceHydrationUtil.buildSnmpV3Auth(data.
|
|
530
|
+
hostname: data.hostname,
|
|
531
|
+
port: data.credentials.snmpPort || 161,
|
|
532
|
+
communityString: data.credentials.snmpCommunityString || undefined,
|
|
533
|
+
snmpV3Auth: NetworkDeviceHydrationUtil.buildSnmpV3Auth(data.credentials),
|
|
88
534
|
oids: data.oids,
|
|
89
535
|
timeout: 5000,
|
|
90
536
|
retries: 3,
|
|
@@ -152,6 +598,16 @@ export default class NetworkDeviceHydrationUtil {
|
|
|
152
598
|
}
|
|
153
599
|
}
|
|
154
600
|
|
|
601
|
+
/*
|
|
602
|
+
* The same resolver the poll list handler uses, for the same devices.
|
|
603
|
+
* Sharing it is the point: a device walked with its site's profile must
|
|
604
|
+
* be EVALUATED against that walk too, and two independent readings of
|
|
605
|
+
* "which credentials does this device use" would eventually disagree —
|
|
606
|
+
* silently, and only for the devices that use a profile.
|
|
607
|
+
*/
|
|
608
|
+
const resolvedCredentials: ResolvedSnmpCredentialsForBatch =
|
|
609
|
+
await NetworkDeviceHydrationUtil.resolveSnmpCredentials(devices);
|
|
610
|
+
|
|
155
611
|
for (const monitor of monitors) {
|
|
156
612
|
if (monitor.monitorType !== MonitorType.NetworkDevice) {
|
|
157
613
|
continue;
|
|
@@ -175,6 +631,24 @@ export default class NetworkDeviceHydrationUtil {
|
|
|
175
631
|
continue;
|
|
176
632
|
}
|
|
177
633
|
|
|
634
|
+
const resolved: ResolvedDeviceSnmpCredentials | undefined =
|
|
635
|
+
resolvedCredentials.byDeviceId.get(deviceId);
|
|
636
|
+
|
|
637
|
+
/*
|
|
638
|
+
* Only ever absent when the credential lookup failed this cycle
|
|
639
|
+
* (resolveSnmpCredentials withholds those devices). Leave the step
|
|
640
|
+
* unhydrated rather than assembling a config from the device's own
|
|
641
|
+
* empty columns: the probe would open a session with SnmpMonitor's
|
|
642
|
+
* default "public" community and report a perfectly healthy device
|
|
643
|
+
* as failing its walk.
|
|
644
|
+
*/
|
|
645
|
+
if (!resolved) {
|
|
646
|
+
logger.warn(
|
|
647
|
+
`Network Device monitor ${monitor.id?.toString()}: could not resolve SNMP credentials for device ${deviceId} this cycle. Leaving the step unhydrated rather than executing it without credentials.`,
|
|
648
|
+
);
|
|
649
|
+
continue;
|
|
650
|
+
}
|
|
651
|
+
|
|
178
652
|
/*
|
|
179
653
|
* Legacy path: reads the step's own (deprecated) oids and
|
|
180
654
|
* monitorInterfaces. Only monitor TESTS still flow through here —
|
|
@@ -183,7 +657,8 @@ export default class NetworkDeviceHydrationUtil {
|
|
|
183
657
|
*/
|
|
184
658
|
step.data.snmpMonitor =
|
|
185
659
|
NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
|
|
186
|
-
|
|
660
|
+
hostname: device.hostname,
|
|
661
|
+
credentials: resolved.carrier,
|
|
187
662
|
oids: step.data.networkDeviceMonitor?.oids || [],
|
|
188
663
|
monitorInterfaces:
|
|
189
664
|
step.data.networkDeviceMonitor?.monitorInterfaces !== false,
|
|
@@ -214,27 +689,32 @@ export default class NetworkDeviceHydrationUtil {
|
|
|
214
689
|
* a silently defaulted algorithm.
|
|
215
690
|
*/
|
|
216
691
|
private static buildSnmpV3Auth(
|
|
217
|
-
|
|
692
|
+
credentials: SnmpConnectionCredentials,
|
|
218
693
|
): SnmpV3Auth | undefined {
|
|
219
|
-
if (
|
|
694
|
+
if (credentials.snmpV3Username) {
|
|
220
695
|
return {
|
|
221
696
|
securityLevel:
|
|
222
|
-
(
|
|
697
|
+
(credentials.snmpV3SecurityLevel as SnmpSecurityLevel) ||
|
|
223
698
|
SnmpSecurityLevel.NoAuthNoPriv,
|
|
224
|
-
username:
|
|
699
|
+
username: credentials.snmpV3Username,
|
|
225
700
|
authProtocol:
|
|
226
|
-
(
|
|
701
|
+
(credentials.snmpV3AuthProtocol as SnmpAuthProtocol | undefined) ||
|
|
227
702
|
undefined,
|
|
228
|
-
authKey:
|
|
703
|
+
authKey: credentials.snmpV3AuthKey || undefined,
|
|
229
704
|
privProtocol:
|
|
230
|
-
(
|
|
705
|
+
(credentials.snmpV3PrivProtocol as SnmpPrivProtocol | undefined) ||
|
|
231
706
|
undefined,
|
|
232
|
-
privKey:
|
|
707
|
+
privKey: credentials.snmpV3PrivKey || undefined,
|
|
233
708
|
};
|
|
234
709
|
}
|
|
235
710
|
|
|
236
|
-
|
|
237
|
-
|
|
711
|
+
/*
|
|
712
|
+
* Legacy devices stored the whole object in the snmpV3Auth JSON column.
|
|
713
|
+
* Only devices ever had it — a credential profile is newer than the
|
|
714
|
+
* flattened columns — so this branch is unreachable for a profile
|
|
715
|
+
* carrier, which is exactly why the field is optional on the interface.
|
|
716
|
+
*/
|
|
717
|
+
const legacy: SnmpV3Auth | undefined = credentials.snmpV3Auth as
|
|
238
718
|
| SnmpV3Auth
|
|
239
719
|
| undefined;
|
|
240
720
|
if (legacy && legacy.username) {
|