@oneuptime/common 11.7.2 → 11.7.4
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/KubernetesCostAllocation.ts +103 -0
- package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/Index.ts +5 -0
- package/Models/DatabaseModels/LogDropFilter.ts +89 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +13 -3
- package/Models/DatabaseModels/RecommendationDismissal.ts +463 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
- package/Models/DatabaseModels/StatusPageGroup.ts +95 -0
- package/Models/DatabaseModels/TableView.ts +40 -0
- package/Models/DatabaseModels/TraceDropFilter.ts +89 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +5 -1
- package/Server/API/AlertAPI.ts +32 -17
- package/Server/API/BaseAPI.ts +31 -2
- package/Server/API/BaseAnalyticsAPI.ts +36 -2
- package/Server/API/CommonAPI.ts +57 -0
- package/Server/API/IncidentAPI.ts +60 -33
- package/Server/API/IncidentEpisodeAPI.ts +31 -16
- package/Server/API/MonitorAPI.ts +30 -0
- package/Server/API/MonitorTemplateAPI.ts +8 -0
- package/Server/API/ProbeAPI.ts +196 -15
- package/Server/API/ProjectAPI.ts +79 -1
- package/Server/API/ScheduledMaintenanceAPI.ts +33 -18
- package/Server/API/StatusPageAPI.ts +74 -37
- package/Server/API/WorkspaceNotificationRuleAPI.ts +34 -4
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.ts +13 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.ts +527 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.ts +53 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Services/AlertEpisodeService.ts +47 -0
- package/Server/Services/AlertService.ts +125 -0
- package/Server/Services/BillingService.ts +98 -0
- package/Server/Services/DatabaseService.ts +184 -20
- package/Server/Services/IncidentEpisodeService.ts +47 -0
- package/Server/Services/IncidentService.ts +123 -0
- package/Server/Services/IncidentTemplateService.ts +123 -1
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/LogDropFilterService.ts +133 -0
- package/Server/Services/MonitorProbeService.ts +94 -4
- package/Server/Services/MonitorService.ts +48 -43
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +70 -0
- package/Server/Services/ProbeService.ts +66 -0
- package/Server/Services/ProjectService.ts +131 -7
- package/Server/Services/RecommendationDismissalService.ts +52 -0
- package/Server/Services/RunbookAgentJobService.ts +68 -7
- package/Server/Services/ScheduledMaintenanceService.ts +103 -0
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +90 -0
- package/Server/Services/StatusPageGroupService.ts +186 -0
- package/Server/Services/TraceDropFilterService.ts +133 -0
- package/Server/Types/Workflow/Components/API/Delete.ts +12 -0
- package/Server/Types/Workflow/Components/API/Get.ts +12 -0
- package/Server/Types/Workflow/Components/API/Patch.ts +12 -0
- package/Server/Types/Workflow/Components/API/Post.ts +12 -0
- package/Server/Types/Workflow/Components/API/Put.ts +13 -0
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +212 -0
- package/Server/Utils/DropFilterValidation.ts +127 -0
- package/Server/Utils/Errors.ts +5 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +31 -2
- package/Server/Utils/Telemetry/AppMetrics.ts +31 -0
- package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +16 -0
- package/Tests/Models/DatabaseModels/MonitorProbeColumnAccessControl.test.ts +196 -0
- package/Tests/Models/RecommendationDismissalModel.test.ts +269 -0
- package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +320 -0
- package/Tests/Server/API/BaseAnalyticsAPIUpdatePayloadValidation.test.ts +293 -0
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +164 -0
- package/Tests/Server/API/ProbeAPI.test.ts +422 -53
- package/Tests/Server/API/ProjectAPI.test.ts +180 -0
- package/Tests/Server/API/ProjectAPIExtendTrialBillingDisabled.test.ts +138 -0
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +458 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +359 -0
- package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +427 -0
- package/Tests/Server/Services/BillingServiceExtendTrial.test.ts +439 -0
- package/Tests/Server/Services/CrossProjectReferenceWriteGuard.test.ts +810 -0
- package/Tests/Server/Services/DatabaseServiceAtomicAddToColumns.test.ts +269 -0
- package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +277 -0
- package/Tests/Server/Services/DatabaseServiceSortColumnSelect.test.ts +201 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +81 -23
- package/Tests/Server/Services/DropFilterSaveValidation.test.ts +398 -0
- package/Tests/Server/Services/MonitorProbeDeleteHooks.test.ts +280 -0
- package/Tests/Server/Services/MonitorProbeServiceProbeTenancy.test.ts +304 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +262 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +614 -0
- package/Tests/Server/Services/RecommendationDismissalService.test.ts +306 -0
- package/Tests/Server/Services/RepairCrossProjectIncidentReferencesMigration.test.ts +528 -0
- package/Tests/Server/Services/StatusPageGroupNesting.test.ts +395 -0
- package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +26 -21
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +227 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +285 -0
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +463 -0
- package/Tests/Server/Utils/DropFilterValidation.test.ts +269 -0
- package/Tests/Server/Utils/Telemetry/SpanUtil.test.ts +94 -0
- package/Tests/Types/DateUserTimezone.test.ts +52 -0
- package/Tests/Types/JSONFunctions.test.ts +103 -1
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +177 -9
- package/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts +105 -0
- package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +131 -0
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +60 -0
- package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +82 -0
- package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +268 -0
- package/Tests/Types/Monitor/MonitorStepMetricMonitor.test.ts +386 -0
- package/Tests/Types/Monitor/MonitorStepProfileMonitor.test.ts +185 -0
- package/Tests/Types/Monitor/MonitorStepSnmpMonitor.test.ts +156 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +371 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +901 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +607 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +754 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +960 -0
- package/Tests/Types/RollingTime/RollingTimeUtil.test.ts +186 -0
- package/Tests/Types/Runbook/RunbookStepTimeout.test.ts +410 -0
- package/Tests/Types/Telemetry/DropFilterSampling.test.ts +241 -0
- package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +353 -0
- package/Tests/Types/Workspace/NotificationRuleUtil.test.ts +566 -0
- package/Tests/UI/Components/CodeEditor.test.tsx +174 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +555 -24
- package/Tests/UI/Components/InfoCard.test.tsx +358 -0
- package/Tests/UI/Components/LogTimeRangePicker.test.tsx +138 -0
- package/Tests/UI/Components/Modal.test.tsx +43 -5
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +679 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +397 -0
- package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +999 -0
- package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +1678 -0
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1094 -0
- package/Tests/UI/Components/Runbook/StepTimeoutInput.test.tsx +386 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +671 -0
- package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +404 -0
- package/Tests/UI/Utils/DropdownAlignment.test.ts +306 -0
- package/Tests/UI/Utils/TableFilterUrlState.test.ts +292 -0
- package/Tests/Utils/Monitor/MonitorSummaryProbeUtil.test.ts +263 -0
- package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +583 -0
- package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +1072 -0
- package/Tests/Utils/StatusPage/GroupTree.test.ts +583 -0
- package/Tests/Utils/StatusPage/ResourceUptime.test.ts +411 -0
- package/Tests/Utils/UserPreferences.test.ts +563 -0
- package/Types/Date.ts +15 -6
- package/Types/JSONFunctions.ts +7 -2
- package/Types/Kubernetes/KubernetesCostIngest.ts +37 -1
- package/Types/Monitor/KubernetesAlertTemplates.ts +205 -0
- package/Types/Monitor/MonitorStep.ts +10 -1
- package/Types/Monitor/MonitorStepMetricMonitor.ts +46 -1
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +413 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +168 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +175 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +743 -0
- package/Types/Permission.ts +45 -0
- package/Types/Recommendation/RecommendationType.ts +20 -0
- package/Types/Runbook/RunbookExecutionDeadline.ts +129 -0
- package/Types/Runbook/RunbookStepTimeout.ts +202 -0
- package/Types/Telemetry/DropFilterSampling.ts +92 -0
- package/UI/Components/AI/GenerateFromAIModal.tsx +0 -2
- package/UI/Components/Accordion/Accordion.tsx +10 -2
- package/UI/Components/BulkUpdate/BulkLabelActions.tsx +0 -1
- package/UI/Components/CodeEditor/CodeEditor.tsx +34 -20
- package/UI/Components/Date/RangeStartAndEndDateView.tsx +0 -1
- package/UI/Components/EditionLabel/EditionLabel.tsx +1 -27
- package/UI/Components/Error/PageError.tsx +0 -4
- package/UI/Components/ErrorBoundary.tsx +252 -15
- package/UI/Components/InfoCard/InfoCard.tsx +58 -1
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +34 -1
- package/UI/Components/MasterPage/MasterPage.tsx +65 -0
- package/UI/Components/Modal/Modal.tsx +16 -60
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +0 -8
- package/UI/Components/ModelTable/BaseModelTable.tsx +503 -71
- package/UI/Components/ModelTable/Column.ts +17 -0
- package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +523 -0
- package/UI/Components/ModelTable/ColumnPreference.ts +482 -0
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +326 -0
- package/UI/Components/ModelTable/TableView.tsx +24 -2
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +150 -0
- package/UI/Components/Runbook/StepTimeoutInput.tsx +173 -0
- package/UI/Components/SideMenu/SideMenu.tsx +24 -4
- package/UI/Components/StatusPage/ResourceGroupSection.tsx +231 -0
- package/UI/Components/Table/Table.tsx +14 -1
- package/UI/Components/Table/TableRow.tsx +180 -175
- package/UI/Components/Table/Types/Column.ts +2 -0
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +34 -1
- package/UI/Utils/DropdownAlignment.ts +162 -0
- package/UI/Utils/TableFilterUrlState.ts +59 -20
- package/Utils/API.ts +106 -2
- package/Utils/Monitor/MonitorSummaryProbeUtil.ts +130 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +434 -0
- package/Utils/StatusPage/GroupNestingLayout.ts +343 -0
- package/Utils/StatusPage/GroupTree.ts +307 -0
- package/Utils/StatusPage/ResourceUptime.ts +90 -17
- package/Utils/UserPreferences.ts +53 -0
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +86 -0
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +91 -0
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +14 -4
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RecommendationDismissal.js +484 -0
- package/build/dist/Models/DatabaseModels/RecommendationDismissal.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageGroup.js +94 -0
- package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TableView.js +40 -0
- package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +91 -0
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +5 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +22 -13
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +22 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +24 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +42 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +43 -26
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +21 -12
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorAPI.js +23 -0
- package/build/dist/Server/API/MonitorAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorTemplateAPI.js +4 -0
- package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -1
- package/build/dist/Server/API/ProbeAPI.js +131 -15
- package/build/dist/Server/API/ProbeAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectAPI.js +62 -3
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +23 -14
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +61 -33
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js +26 -2
- package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js +397 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +39 -0
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +95 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +71 -0
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +140 -17
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +39 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +100 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +97 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogDropFilterService.js +93 -0
- package/build/dist/Server/Services/LogDropFilterService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +73 -5
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +34 -39
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +71 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +64 -0
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +103 -7
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RecommendationDismissalService.js +50 -0
- package/build/dist/Server/Services/RecommendationDismissalService.js.map +1 -0
- package/build/dist/Server/Services/RunbookAgentJobService.js +63 -5
- package/build/dist/Server/Services/RunbookAgentJobService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +83 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +65 -0
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageGroupService.js +136 -0
- package/build/dist/Server/Services/StatusPageGroupService.js.map +1 -1
- package/build/dist/Server/Services/TraceDropFilterService.js +93 -0
- package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +12 -0
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +132 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/DropFilterValidation.js +80 -0
- package/build/dist/Server/Utils/DropFilterValidation.js.map +1 -0
- package/build/dist/Server/Utils/Errors.js +3 -0
- package/build/dist/Server/Utils/Errors.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -12
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +38 -18
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js +26 -0
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
- package/build/dist/Types/Date.js +14 -4
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +8 -3
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +192 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +6 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +32 -1
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +294 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +110 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +58 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +451 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -0
- package/build/dist/Types/Permission.js +40 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Recommendation/RecommendationType.js +21 -0
- package/build/dist/Types/Recommendation/RecommendationType.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookExecutionDeadline.js +93 -0
- package/build/dist/Types/Runbook/RunbookExecutionDeadline.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepTimeout.js +142 -0
- package/build/dist/Types/Runbook/RunbookStepTimeout.js.map +1 -0
- package/build/dist/Types/Telemetry/DropFilterSampling.js +75 -0
- package/build/dist/Types/Telemetry/DropFilterSampling.js.map +1 -0
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -2
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
- package/build/dist/UI/Components/Accordion/Accordion.js +9 -2
- package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -14
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +1 -1
- package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +2 -20
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Error/PageError.js +1 -3
- package/build/dist/UI/Components/Error/PageError.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +145 -11
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js +28 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +13 -2
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js +50 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +4 -32
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +308 -40
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +230 -0
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js +258 -0
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +168 -0
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/TableView.js +13 -2
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +84 -0
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -0
- package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +101 -0
- package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -0
- package/build/dist/UI/Components/SideMenu/SideMenu.js +15 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +73 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +15 -2
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +11 -6
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +13 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Utils/DropdownAlignment.js +98 -0
- package/build/dist/UI/Utils/DropdownAlignment.js.map +1 -0
- package/build/dist/UI/Utils/TableFilterUrlState.js +48 -15
- package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
- package/build/dist/Utils/API.js +39 -2
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js +97 -0
- package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +330 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js +280 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -0
- package/build/dist/Utils/StatusPage/GroupTree.js +214 -0
- package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js +60 -16
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/UserPreferences.js +33 -0
- package/build/dist/Utils/UserPreferences.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Scan-target parsing for network device discovery.
|
|
3
|
+
*
|
|
4
|
+
* A discovery scan's target is the IPv4 address space a probe sweeps. Two
|
|
5
|
+
* notations are accepted:
|
|
6
|
+
*
|
|
7
|
+
* CIDR 192.168.1.0/24
|
|
8
|
+
* Octet range 10.16-22.0-255.51-66
|
|
9
|
+
*
|
|
10
|
+
* Octet-range notation exists because real networks are not shaped like CIDR
|
|
11
|
+
* blocks. "The .51-.66 management addresses in every /24 of 10.16-22.x" is a
|
|
12
|
+
* single target here; expressed in CIDR it is 1,792 separate scans, and the
|
|
13
|
+
* only CIDR that covers it in one go (10.16.0.0/13) is 512k addresses, of
|
|
14
|
+
* which 98% are not worth probing.
|
|
15
|
+
*
|
|
16
|
+
* This lives in Common rather than in the Probe's SubnetScanner so the server
|
|
17
|
+
* can validate a target at write time with exactly the parser the probe will
|
|
18
|
+
* later expand it with. A target that saves is a target that scans.
|
|
19
|
+
*
|
|
20
|
+
* IPv4-only by design, same as the sweep itself: IPv6 space is far too sparse
|
|
21
|
+
* to enumerate, and IPv6 discovery will be neighbour-discovery based.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
// Which of the two notations a target string is written in.
|
|
25
|
+
export enum ScanTargetNotation {
|
|
26
|
+
Cidr = "CIDR",
|
|
27
|
+
OctetRange = "OctetRange",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// One octet's accepted values: `start` through `end`, both inclusive.
|
|
31
|
+
export interface OctetRange {
|
|
32
|
+
start: number;
|
|
33
|
+
end: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface ScanTarget {
|
|
37
|
+
notation: ScanTargetNotation;
|
|
38
|
+
/*
|
|
39
|
+
* How many addresses the target expands to. Always derived arithmetically
|
|
40
|
+
* (prefix length / range widths) and never by building the address list, so
|
|
41
|
+
* an absurd target can be rejected before anything is allocated.
|
|
42
|
+
*/
|
|
43
|
+
hostCount: number;
|
|
44
|
+
// Populated for ScanTargetNotation.OctetRange. Always exactly 4 entries.
|
|
45
|
+
octetRanges?: Array<OctetRange> | undefined;
|
|
46
|
+
// Populated for ScanTargetNotation.Cidr.
|
|
47
|
+
networkLong?: number | undefined;
|
|
48
|
+
blockSize?: number | undefined;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface ParseOutcome {
|
|
52
|
+
target?: ScanTarget | undefined;
|
|
53
|
+
/*
|
|
54
|
+
* Human-readable, shown to the operator who typed the target. Never null when
|
|
55
|
+
* `target` is absent.
|
|
56
|
+
*/
|
|
57
|
+
error?: string | undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export class ScanTargetUtil {
|
|
61
|
+
/*
|
|
62
|
+
* Hard ceiling on how many addresses one scan may sweep.
|
|
63
|
+
*
|
|
64
|
+
* The number is a wall-clock budget, not a memory one. SubnetScanner runs 32
|
|
65
|
+
* workers; a dead host costs ~1s (the ICMP pre-sweep timeout), or ~2s when
|
|
66
|
+
* the pre-sweep is unavailable and every host is SNMP-probed directly. At
|
|
67
|
+
* this ceiling that is ~17 minutes with the pre-sweep and ~34 minutes
|
|
68
|
+
* without — both comfortably inside the 2-hour window after which the server
|
|
69
|
+
* declares an In Progress scan abandoned (Workers/Jobs/
|
|
70
|
+
* NetworkDeviceDiscovery/RequeueRecurringScans.ts) and safely above the
|
|
71
|
+
* 15-minute minimum rescan interval for recurring scans.
|
|
72
|
+
*
|
|
73
|
+
* It is also still a real abuse guard: a /17 in CIDR terms. Anything larger
|
|
74
|
+
* (a /16 sweep, an unbounded 10.*.*.* octet range) is rejected at write time
|
|
75
|
+
* with a message telling the operator to narrow the target.
|
|
76
|
+
*/
|
|
77
|
+
public static readonly MAX_SCAN_HOSTS: number = 32768;
|
|
78
|
+
|
|
79
|
+
/*
|
|
80
|
+
* Longest string we will even attempt to parse. The widest well-formed
|
|
81
|
+
* target is "255-255.255-255.255-255.255-255" at 31 characters, so this is
|
|
82
|
+
* ~2x headroom and still far below the 100-character column. It exists to
|
|
83
|
+
* bound the error messages, which quote the target back — see the gate in
|
|
84
|
+
* parseWithError().
|
|
85
|
+
*/
|
|
86
|
+
public static readonly MAX_TARGET_LENGTH: number = 64;
|
|
87
|
+
|
|
88
|
+
/*
|
|
89
|
+
* Hoisted so the literals are not the object of a member expression, which
|
|
90
|
+
* `wrap-regex` and Prettier cannot agree on. Same reason as CidrMatchUtil.
|
|
91
|
+
*/
|
|
92
|
+
private static readonly CIDR_PATTERN: RegExp =
|
|
93
|
+
/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\/(\d{1,3})$/;
|
|
94
|
+
|
|
95
|
+
// A single octet term: `42` or `16-22`. Bounds are validated after parsing.
|
|
96
|
+
private static readonly OCTET_TERM_PATTERN: RegExp =
|
|
97
|
+
/^(\d{1,3})(?:-(\d{1,3}))?$/;
|
|
98
|
+
|
|
99
|
+
private static readonly EXAMPLE_CIDR: string = "192.168.1.0/24";
|
|
100
|
+
|
|
101
|
+
private static readonly EXAMPLE_OCTET_RANGE: string = "10.16-22.0-255.51-66";
|
|
102
|
+
|
|
103
|
+
/*
|
|
104
|
+
* Parses a target into the shape needed to count and expand it. Returns null
|
|
105
|
+
* for anything malformed; use getValidationError() when you need to tell the
|
|
106
|
+
* operator WHY. Size is deliberately not checked here — parse() answers "is
|
|
107
|
+
* this well-formed", the caller decides what it can afford to sweep.
|
|
108
|
+
*/
|
|
109
|
+
public static parse(target: string): ScanTarget | null {
|
|
110
|
+
return ScanTargetUtil.parseWithError(target).target || null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// True when `target` is well-formed in either notation. Ignores size.
|
|
114
|
+
public static isValid(target: string): boolean {
|
|
115
|
+
return ScanTargetUtil.parse(target) !== null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/*
|
|
119
|
+
* The notation `target` is written in, or null when it is not a valid target
|
|
120
|
+
* at all. A string containing '/' is always read as CIDR — a malformed CIDR
|
|
121
|
+
* is never silently retried as an octet range, because "10.0.0.0/99" is a
|
|
122
|
+
* typo'd prefix and deserves to say so.
|
|
123
|
+
*/
|
|
124
|
+
public static getNotation(target: string): ScanTargetNotation | null {
|
|
125
|
+
return ScanTargetUtil.parse(target)?.notation || null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/*
|
|
129
|
+
* How many addresses `target` sweeps, or 0 when it is malformed. Computed
|
|
130
|
+
* from the prefix length / range widths alone, with no allocation: expand()
|
|
131
|
+
* materializes one string per address, so a size check that ran after
|
|
132
|
+
* expansion would let a /8 allocate ~16M strings before the limit it exists
|
|
133
|
+
* to enforce was ever consulted.
|
|
134
|
+
*/
|
|
135
|
+
public static countHosts(target: string): number {
|
|
136
|
+
return ScanTargetUtil.parse(target)?.hostCount || 0;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/*
|
|
140
|
+
* The single validation entry point for a scan target: syntax first, then
|
|
141
|
+
* the size ceiling. Returns null when the target is good to scan, otherwise
|
|
142
|
+
* a message written for the operator who typed it.
|
|
143
|
+
*/
|
|
144
|
+
public static getValidationError(target: string): string | null {
|
|
145
|
+
const outcome: ParseOutcome = ScanTargetUtil.parseWithError(target);
|
|
146
|
+
|
|
147
|
+
if (!outcome.target) {
|
|
148
|
+
return outcome.error || ScanTargetUtil.getMalformedTargetMessage(target);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (outcome.target.hostCount > ScanTargetUtil.MAX_SCAN_HOSTS) {
|
|
152
|
+
return (
|
|
153
|
+
`"${String(target).trim()}" expands to ` +
|
|
154
|
+
`${outcome.target.hostCount.toLocaleString("en-US")} addresses, ` +
|
|
155
|
+
`exceeding the ${ScanTargetUtil.MAX_SCAN_HOSTS.toLocaleString("en-US")}-address scan limit. ` +
|
|
156
|
+
`Narrow the target (a smaller subnet, or tighter octet ranges) or split it into several scans.`
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/*
|
|
164
|
+
* Expands a target into the addresses to probe, in ascending address order.
|
|
165
|
+
*
|
|
166
|
+
* Returns an empty array for a malformed target — there is nothing to sweep.
|
|
167
|
+
* THROWS for a well-formed target above MAX_SCAN_HOSTS: that is a caller
|
|
168
|
+
* that skipped its size check, and quietly returning a truncated or empty
|
|
169
|
+
* list would turn it into a silently wrong scan. Callers should gate on
|
|
170
|
+
* getValidationError() (or countHosts()) first and never see this.
|
|
171
|
+
*/
|
|
172
|
+
public static expand(target: string): Array<string> {
|
|
173
|
+
const parsed: ScanTarget | null = ScanTargetUtil.parse(target);
|
|
174
|
+
|
|
175
|
+
if (!parsed) {
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (parsed.hostCount > ScanTargetUtil.MAX_SCAN_HOSTS) {
|
|
180
|
+
throw new Error(
|
|
181
|
+
ScanTargetUtil.getValidationError(target) ||
|
|
182
|
+
`Scan target "${String(target).trim()}" is too large to expand.`,
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (parsed.notation === ScanTargetNotation.Cidr) {
|
|
187
|
+
return ScanTargetUtil.expandCidrTarget(parsed);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return ScanTargetUtil.expandOctetRangeTarget(parsed);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/*
|
|
194
|
+
* Both notations in one sentence, for form hints and error messages. Kept
|
|
195
|
+
* here so the UI, the server-side validator and the probe all describe the
|
|
196
|
+
* accepted syntax identically.
|
|
197
|
+
*/
|
|
198
|
+
public static getSyntaxHint(): string {
|
|
199
|
+
return (
|
|
200
|
+
`Use CIDR notation (e.g. ${ScanTargetUtil.EXAMPLE_CIDR}) or octet-range notation, ` +
|
|
201
|
+
`where any octet may be an inclusive low-high range (e.g. ${ScanTargetUtil.EXAMPLE_OCTET_RANGE}).`
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
private static parseWithError(target: string): ParseOutcome {
|
|
206
|
+
if (typeof target !== "string" || target.trim().length === 0) {
|
|
207
|
+
return {
|
|
208
|
+
error: `A scan target is required. ${ScanTargetUtil.getSyntaxHint()}`,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const trimmed: string = target.trim();
|
|
213
|
+
|
|
214
|
+
/*
|
|
215
|
+
* Length gate BEFORE anything builds a message. Every rejection below
|
|
216
|
+
* quotes the offending target back (parseOctetRange quotes both the bad
|
|
217
|
+
* term AND the whole target, doubling it), and the server-side create
|
|
218
|
+
* hook runs ahead of the column's 100-character cap — so without this,
|
|
219
|
+
* a 50 MB request body would be reflected into a ~100 MB exception that
|
|
220
|
+
* is both logged and serialized into the response. This message is a
|
|
221
|
+
* constant and echoes nothing.
|
|
222
|
+
*/
|
|
223
|
+
if (trimmed.length > ScanTargetUtil.MAX_TARGET_LENGTH) {
|
|
224
|
+
return {
|
|
225
|
+
error:
|
|
226
|
+
`A scan target cannot be longer than ${ScanTargetUtil.MAX_TARGET_LENGTH} characters. ` +
|
|
227
|
+
ScanTargetUtil.getSyntaxHint(),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/*
|
|
232
|
+
* The '/' is the discriminator, checked before either parser runs. A
|
|
233
|
+
* string carrying a prefix is a CIDR attempt by intent, so "10.0.0.0/99"
|
|
234
|
+
* must report a bad prefix rather than fall through to the octet-range
|
|
235
|
+
* parser and report the far more confusing "not a valid scan target".
|
|
236
|
+
*/
|
|
237
|
+
if (trimmed.includes("/")) {
|
|
238
|
+
return ScanTargetUtil.parseCidr(trimmed);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return ScanTargetUtil.parseOctetRange(trimmed);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
private static parseCidr(trimmed: string): ParseOutcome {
|
|
245
|
+
const match: RegExpMatchArray | null = trimmed.match(
|
|
246
|
+
ScanTargetUtil.CIDR_PATTERN,
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
if (!match) {
|
|
250
|
+
return {
|
|
251
|
+
error:
|
|
252
|
+
`"${trimmed}" is not a valid IPv4 CIDR. ` +
|
|
253
|
+
`Expected four octets and a prefix length, e.g. ${ScanTargetUtil.EXAMPLE_CIDR}.`,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
let baseLong: number = 0;
|
|
258
|
+
for (let i: number = 1; i <= 4; i++) {
|
|
259
|
+
const octet: number = parseInt(match[i]!, 10);
|
|
260
|
+
if (octet > 255) {
|
|
261
|
+
return {
|
|
262
|
+
error:
|
|
263
|
+
`Octet "${match[i]}" in "${trimmed}" is out of range. ` +
|
|
264
|
+
`Each octet must be between 0 and 255.`,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
baseLong = baseLong * 256 + octet;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const prefix: number = parseInt(match[5]!, 10);
|
|
271
|
+
if (prefix > 32) {
|
|
272
|
+
return {
|
|
273
|
+
error:
|
|
274
|
+
`Prefix length "/${match[5]}" in "${trimmed}" is out of range. ` +
|
|
275
|
+
`An IPv4 prefix must be between /0 and /32.`,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const hostBits: number = 32 - prefix;
|
|
280
|
+
const blockSize: number = Math.pow(2, hostBits);
|
|
281
|
+
|
|
282
|
+
/*
|
|
283
|
+
* Shifting by 32 is a no-op in JS (the shift count is taken mod 32), so a
|
|
284
|
+
* /0 would mask with 0xffffffff and "expand" from the address as typed
|
|
285
|
+
* rather than from 0.0.0.0. Special-cased rather than relied upon.
|
|
286
|
+
*/
|
|
287
|
+
const mask: number = hostBits >= 32 ? 0 : (0xffffffff << hostBits) >>> 0;
|
|
288
|
+
const networkLong: number = (baseLong & mask) >>> 0;
|
|
289
|
+
|
|
290
|
+
return {
|
|
291
|
+
target: {
|
|
292
|
+
notation: ScanTargetNotation.Cidr,
|
|
293
|
+
/*
|
|
294
|
+
* /31 and /32 have no network/broadcast addresses to exclude (RFC
|
|
295
|
+
* 3021), so every address in them is a host. Larger blocks drop the
|
|
296
|
+
* first and last.
|
|
297
|
+
*/
|
|
298
|
+
hostCount: blockSize <= 2 ? blockSize : blockSize - 2,
|
|
299
|
+
networkLong: networkLong,
|
|
300
|
+
blockSize: blockSize,
|
|
301
|
+
},
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
private static parseOctetRange(trimmed: string): ParseOutcome {
|
|
306
|
+
const terms: Array<string> = trimmed.split(".");
|
|
307
|
+
|
|
308
|
+
if (terms.length !== 4) {
|
|
309
|
+
return { error: ScanTargetUtil.getMalformedTargetMessage(trimmed) };
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const octetRanges: Array<OctetRange> = [];
|
|
313
|
+
let hostCount: number = 1;
|
|
314
|
+
|
|
315
|
+
for (const term of terms) {
|
|
316
|
+
const match: RegExpMatchArray | null = term.match(
|
|
317
|
+
ScanTargetUtil.OCTET_TERM_PATTERN,
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
if (!match) {
|
|
321
|
+
return {
|
|
322
|
+
error:
|
|
323
|
+
`"${term}" in "${trimmed}" is not a valid octet. ` +
|
|
324
|
+
`Each octet must be a number (42) or an inclusive range (16-22).`,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const start: number = parseInt(match[1]!, 10);
|
|
329
|
+
// No '-' in the term means a single value: a zero-width range.
|
|
330
|
+
const end: number =
|
|
331
|
+
match[2] === undefined ? start : parseInt(match[2], 10);
|
|
332
|
+
|
|
333
|
+
if (start > 255 || end > 255) {
|
|
334
|
+
return {
|
|
335
|
+
error:
|
|
336
|
+
`Octet "${term}" in "${trimmed}" is out of range. ` +
|
|
337
|
+
`Each octet must be between 0 and 255.`,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/*
|
|
342
|
+
* Reversed bounds are a typo, not an empty set. Silently accepting
|
|
343
|
+
* "22-16" as zero addresses would produce a scan that sweeps nothing
|
|
344
|
+
* and reports success — the least debuggable outcome available.
|
|
345
|
+
*/
|
|
346
|
+
if (start > end) {
|
|
347
|
+
return {
|
|
348
|
+
error:
|
|
349
|
+
`Octet range "${term}" in "${trimmed}" is reversed. ` +
|
|
350
|
+
`Write the lower bound first, e.g. ${end}-${start}.`,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
octetRanges.push({ start: start, end: end });
|
|
355
|
+
hostCount = hostCount * (end - start + 1);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return {
|
|
359
|
+
target: {
|
|
360
|
+
notation: ScanTargetNotation.OctetRange,
|
|
361
|
+
/*
|
|
362
|
+
* Every address in the product is swept, with no network/broadcast
|
|
363
|
+
* exclusion. An octet range is an explicit enumeration, not a subnet:
|
|
364
|
+
* whoever wrote "10.0.0.0-255" asked for .0 and .255 by name, and
|
|
365
|
+
* there is no prefix length here from which a broadcast address could
|
|
366
|
+
* even be derived.
|
|
367
|
+
*/
|
|
368
|
+
hostCount: hostCount,
|
|
369
|
+
octetRanges: octetRanges,
|
|
370
|
+
},
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
private static expandCidrTarget(parsed: ScanTarget): Array<string> {
|
|
375
|
+
const networkLong: number = parsed.networkLong!;
|
|
376
|
+
const blockSize: number = parsed.blockSize!;
|
|
377
|
+
const hosts: Array<string> = [];
|
|
378
|
+
|
|
379
|
+
if (blockSize <= 2) {
|
|
380
|
+
// /31 and /32: every address is usable.
|
|
381
|
+
for (let i: number = 0; i < blockSize; i++) {
|
|
382
|
+
hosts.push(ScanTargetUtil.longToIp(networkLong + i));
|
|
383
|
+
}
|
|
384
|
+
return hosts;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// Skip network (first) and broadcast (last).
|
|
388
|
+
for (let i: number = 1; i < blockSize - 1; i++) {
|
|
389
|
+
hosts.push(ScanTargetUtil.longToIp(networkLong + i));
|
|
390
|
+
}
|
|
391
|
+
return hosts;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
private static expandOctetRangeTarget(parsed: ScanTarget): Array<string> {
|
|
395
|
+
const ranges: Array<OctetRange> = parsed.octetRanges!;
|
|
396
|
+
const hosts: Array<string> = [];
|
|
397
|
+
|
|
398
|
+
// Outer-to-inner octet order, so the result comes out address-ascending.
|
|
399
|
+
for (let a: number = ranges[0]!.start; a <= ranges[0]!.end; a++) {
|
|
400
|
+
for (let b: number = ranges[1]!.start; b <= ranges[1]!.end; b++) {
|
|
401
|
+
for (let c: number = ranges[2]!.start; c <= ranges[2]!.end; c++) {
|
|
402
|
+
for (let d: number = ranges[3]!.start; d <= ranges[3]!.end; d++) {
|
|
403
|
+
hosts.push(`${a}.${b}.${c}.${d}`);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
return hosts;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
private static getMalformedTargetMessage(target: string): string {
|
|
413
|
+
const shown: string =
|
|
414
|
+
typeof target === "string" ? target.trim() : String(target);
|
|
415
|
+
|
|
416
|
+
return (
|
|
417
|
+
`"${shown}" is not a valid scan target. ` + ScanTargetUtil.getSyntaxHint()
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
private static longToIp(long: number): string {
|
|
422
|
+
return (
|
|
423
|
+
((long >>> 24) & 0xff) +
|
|
424
|
+
"." +
|
|
425
|
+
((long >>> 16) & 0xff) +
|
|
426
|
+
"." +
|
|
427
|
+
((long >>> 8) & 0xff) +
|
|
428
|
+
"." +
|
|
429
|
+
(long & 0xff)
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
export default ScanTargetUtil;
|