@oneuptime/common 14.0.3 → 14.0.5
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/DatabaseModels/Alert.ts +55 -0
- package/Models/DatabaseModels/DatabaseServer.ts +1650 -0
- package/Models/DatabaseModels/DatabaseServerEndpoint.ts +540 -0
- package/Models/DatabaseModels/DatabaseServerFeed.ts +625 -0
- package/Models/DatabaseModels/DatabaseServerLabelRule.ts +514 -0
- package/Models/DatabaseModels/DatabaseServerOwnerRule.ts +596 -0
- package/Models/DatabaseModels/DatabaseServerOwnerTeam.ts +491 -0
- package/Models/DatabaseModels/DatabaseServerOwnerUser.ts +490 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Index.ts +16 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +26 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
- package/Models/DatabaseModels/TelemetryException.ts +2 -0
- package/Models/DatabaseModels/UserProjectSsoConsent.ts +146 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.ts +673 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Middleware/MultipartFormData.ts +1 -1
- package/Server/Middleware/TelemetryIngest.ts +15 -8
- package/Server/Services/AlertReminderRuleService.ts +100 -24
- package/Server/Services/DatabaseServerEndpointService.ts +895 -0
- package/Server/Services/DatabaseServerFeedService.ts +128 -0
- package/Server/Services/DatabaseServerLabelRuleEngineService.ts +340 -0
- package/Server/Services/DatabaseServerLabelRuleService.ts +14 -0
- package/Server/Services/DatabaseServerOwnerRuleEngineService.ts +425 -0
- package/Server/Services/DatabaseServerOwnerRuleService.ts +14 -0
- package/Server/Services/DatabaseServerOwnerTeamService.ts +180 -0
- package/Server/Services/DatabaseServerOwnerUserService.ts +173 -0
- package/Server/Services/DatabaseServerService.ts +4546 -0
- package/Server/Services/DatabaseService.ts +14 -8
- package/Server/Services/DockerResourceService.ts +43 -2
- package/Server/Services/IncidentReminderRuleService.ts +103 -23
- package/Server/Services/Index.ts +16 -0
- package/Server/Services/InventoryItemService.ts +113 -5
- package/Server/Services/IoTDeviceService.ts +145 -37
- package/Server/Services/OpenTelemetryIngestService.ts +19 -0
- package/Server/Services/PodmanResourceService.ts +43 -2
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
- package/Server/Services/ServiceService.ts +1 -1
- package/Server/Services/TelemetryUsageBillingService.ts +29 -2
- package/Server/Services/UserProjectSsoConsentService.ts +74 -0
- package/Server/Services/UserService.ts +14 -1
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
- package/Server/Types/Database/QueryHelper.ts +30 -1
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +69 -1
- package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +188 -6
- package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2262 -755
- package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
- package/Server/Utils/Monitor/MonitorResource.ts +47 -11
- package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
- package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
- package/Server/Utils/StartServer.ts +26 -6
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
- package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
- package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
- package/Server/Utils/Telemetry/Telemetry.ts +16 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
- package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
- package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
- package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
- package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
- package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
- package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
- package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
- package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
- package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
- package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
- package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
- package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
- package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
- package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
- package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
- package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
- package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
- package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
- package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
- package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
- package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
- package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
- package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
- package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
- package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
- package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
- package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
- package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
- package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
- package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
- package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
- package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
- package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
- package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
- package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
- package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
- package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
- package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
- package/Tests/ClassStrings.ts +178 -0
- package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
- package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
- package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/RenderedMarkup.ts +518 -0
- package/Tests/ResponsiveVisibility.test.ts +490 -4
- package/Tests/ResponsiveVisibility.ts +505 -52
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
- package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
- package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
- package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
- package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
- package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
- package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
- package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
- package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
- package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
- package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
- package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
- package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
- package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
- package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
- package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
- package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
- package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
- package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
- package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
- package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
- package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
- package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
- package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
- package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
- package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
- package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
- package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
- package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
- package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1719 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
- package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
- package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
- package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
- package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
- package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
- package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
- package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
- package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
- package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
- package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
- package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
- package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
- package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +298 -0
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +271 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
- package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
- package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +181 -0
- package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
- package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
- package/Tests/UI/Components/Card.test.tsx +93 -2
- package/Tests/UI/Components/FeedOptions.test.ts +6 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
- package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
- package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
- package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
- package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
- package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
- package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
- package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
- package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
- package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
- package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +70 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +21 -0
- package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
- package/Tests/UI/Utils/Navigation.test.ts +102 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
- package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
- package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
- package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
- package/Tests/Utils/ValueFormatter.test.ts +50 -0
- package/Tests/tsconfig.json +16 -0
- package/Types/AI/AIResourceContext.ts +7 -0
- package/Types/Dashboard/DashboardTemplates.ts +2 -1
- package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
- package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
- package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
- package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
- package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
- package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
- package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
- package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/CephAlertTemplates.ts +18 -0
- package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
- package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
- package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
- package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
- package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
- package/Types/Permission.ts +267 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
- package/Types/Rules/RuleRun.ts +12 -0
- package/Types/Telemetry/EntityType.ts +23 -0
- package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
- package/Types/Telemetry/ServiceType.ts +8 -0
- package/UI/Components/Banner/Banner.tsx +1 -1
- package/UI/Components/Card/Card.tsx +1 -1
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
- package/UI/Components/Charts/Line/LineChart.tsx +7 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
- package/UI/Components/Date/StartAndEndDate.tsx +5 -5
- package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
- package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
- package/UI/Components/Forms/BasicForm.tsx +1 -1
- package/UI/Components/Header/Header.tsx +1 -1
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
- package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
- package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
- package/UI/Components/Modal/ModalFooter.tsx +1 -1
- package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +4 -4
- package/UI/Components/Navbar/NavBar.tsx +9 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
- package/UI/Components/Page/Page.tsx +1 -1
- package/UI/Components/Pagination/Pagination.tsx +3 -3
- package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
- package/UI/Components/SideMenu/SideMenu.tsx +4 -1
- package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
- package/UI/Components/StatusPage/ResourceList.tsx +6 -6
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
- package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
- package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
- package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
- package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
- package/UI/Styles/Theme.css +8 -1
- package/UI/Utils/Navigation.ts +89 -42
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
- package/UI/Utils/TelemetryService.ts +4 -3
- package/Utils/LabelRuleImportExport.ts +2 -0
- package/Utils/MetricUnitUtil.ts +103 -11
- package/Utils/Monitor/MetricValueFormatter.ts +66 -13
- package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
- package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
- package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
- package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
- package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
- package/Utils/Telemetry/EntityKey.ts +176 -0
- package/Utils/ValueFormatter.ts +16 -0
- package/build/dist/Models/DatabaseModels/Alert.js +54 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +54 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +16 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
- package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
- package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
- package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
- package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
- package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
- package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseService.js +8 -4
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerResourceService.js +30 -3
- package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +16 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +88 -5
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/IoTDeviceService.js +111 -24
- package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PodmanResourceService.js +30 -3
- package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +1 -1
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
- package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
- package/build/dist/Server/Services/UserService.js +13 -1
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +26 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +46 -0
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +134 -13
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
- package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +20 -4
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
- package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
- package/build/dist/Types/AI/AIResourceContext.js +7 -0
- package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +2 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
- package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
- package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
- package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
- package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
- package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
- package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
- package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
- package/build/dist/Types/Permission.js +234 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +23 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +8 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Banner/Banner.js +1 -1
- package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +1 -1
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
- package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
- package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
- package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -4
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/Page/Page.js +1 -1
- package/build/dist/UI/Components/Page/Page.js.map +1 -1
- package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
- package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
- package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
- package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
- package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +66 -33
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +3 -2
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +2 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/MetricUnitUtil.js +77 -13
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
- package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
- package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
- package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
- package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/ValueFormatter.js +15 -0
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/package.json +1 -1
- package/tsconfig.tests.json +7 -5
|
@@ -0,0 +1,801 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* "Does this container run the database server, or something else that
|
|
3
|
+
* happens to use a database image?" — read from the program a Kubernetes
|
|
4
|
+
* container starts (`command` followed by `args`).
|
|
5
|
+
*
|
|
6
|
+
* It fails OPEN: a container is a possible server unless its command line
|
|
7
|
+
* proves otherwise. Proof is
|
|
8
|
+
* - a client, dump or admin tool as the program itself (`psql`,
|
|
9
|
+
* `redis-cli`, `pg_dump`, `mongosh`) — "client";
|
|
10
|
+
* - a keep-alive as the program itself (`sleep infinity`, `tail -f
|
|
11
|
+
* /dev/null`, `cat`), or a shell with no script to run (`bash`,
|
|
12
|
+
* `sh -i`) — "keep-alive";
|
|
13
|
+
* - a Redis-family Sentinel (`redis-sentinel`, `redis-server … --sentinel`)
|
|
14
|
+
* — "companion";
|
|
15
|
+
* - a `sh -c` script EVERY command of which is one of those, a shell
|
|
16
|
+
* keyword or builtin, or a plain utility (`echo`, `set -x`, `until …; do
|
|
17
|
+
* sleep 1; done`, `cp`) — so a script that starts anything else
|
|
18
|
+
* (`exec postgres`, a start script, `"$@"`, a nested shell) is a possible
|
|
19
|
+
* server however it begins.
|
|
20
|
+
* A launcher that runs the rest of its arguments as the command — `env`
|
|
21
|
+
* (with its flags and `NAME=value` words), `nohup`, `setsid`, `tini [--]`,
|
|
22
|
+
* `dumb-init [--]`, or an official image's `docker-entrypoint.sh` followed by
|
|
23
|
+
* a program — is looked through to the program it starts, at most
|
|
24
|
+
* MAX_WRAPPER_WORDS words deep; inside a script, `exec`, `env` and `nohup`
|
|
25
|
+
* (and `NAME=value` prefixes) are looked through the same way.
|
|
26
|
+
* `docker-entrypoint.sh -c …` starts the image's server with those flags.
|
|
27
|
+
* Whatever cannot be read — a script FILE (`bash /start.sh`), a launcher
|
|
28
|
+
* whose program is not a plain word (`gosu user …`, `timeout 30 …`), a
|
|
29
|
+
* heredoc, a script longer than MAX_SCRIPT_CHARACTERS, a script the
|
|
30
|
+
* projection lost — is a possible server: a false positive auto-archives
|
|
31
|
+
* later, a server that is never discovered is never seen at all.
|
|
32
|
+
*
|
|
33
|
+
* The rules read a REDUCED command line, which Postgres computes before a
|
|
34
|
+
* pod spec leaves the database (containerCommandProjectionSql) and
|
|
35
|
+
* reduceContainerCommand, its JavaScript twin, computes from a full spec:
|
|
36
|
+
* the launchers dropped, then the program's first word; for a shell, each of its first
|
|
37
|
+
* MAX_SHELL_ARGUMENTS arguments as either a flag or the set of command names
|
|
38
|
+
* it would run — each one on CONTAINER_COMMAND_KNOWN_WORDS or replaced by
|
|
39
|
+
* "?". Argument values, environment variables and every other word stay in
|
|
40
|
+
* Postgres. classifyContainerCommand always reduces first, and reducing a
|
|
41
|
+
* reduction changes nothing, so a full spec and a projected one classify
|
|
42
|
+
* alike by construction. Both twins are built from the same regular
|
|
43
|
+
* expression sources, written in the subset JavaScript and Postgres ARE
|
|
44
|
+
* read the same way (no `\s`, `.` or POSIX classes; whitespace spelled out),
|
|
45
|
+
* and DatabaseContainerCommandPostgres.test.ts holds them together.
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
export type ContainerCommandRole =
|
|
49
|
+
// The image's own entrypoint, or anything not proven to be something else.
|
|
50
|
+
| "server"
|
|
51
|
+
// A client, dump, restore or admin tool — or a script that runs only those.
|
|
52
|
+
| "client"
|
|
53
|
+
// A sleep / tail / cat, an interactive shell, or a script that only waits.
|
|
54
|
+
| "keep-alive"
|
|
55
|
+
// Part of the deployment but never the database (Redis-family Sentinel).
|
|
56
|
+
| "companion";
|
|
57
|
+
|
|
58
|
+
export interface ContainerCommandLike {
|
|
59
|
+
command?: Array<string | null> | undefined;
|
|
60
|
+
args?: Array<string | null> | undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// The engines' clients, dump / restore / admin tools and benchmarks.
|
|
64
|
+
const CLIENT_PROGRAMS: ReadonlySet<string> = new Set<string>([
|
|
65
|
+
"arangodump",
|
|
66
|
+
"arangoexport",
|
|
67
|
+
"arangoimport",
|
|
68
|
+
"arangorestore",
|
|
69
|
+
"arangosh",
|
|
70
|
+
"bsondump",
|
|
71
|
+
"cassandra-stress",
|
|
72
|
+
"cbq",
|
|
73
|
+
"clickhouse-benchmark",
|
|
74
|
+
"clickhouse-client",
|
|
75
|
+
"clusterdb",
|
|
76
|
+
"cqlsh",
|
|
77
|
+
"createdb",
|
|
78
|
+
"createuser",
|
|
79
|
+
"cypher-shell",
|
|
80
|
+
"dropdb",
|
|
81
|
+
"dropuser",
|
|
82
|
+
"etcdctl",
|
|
83
|
+
"influx",
|
|
84
|
+
"keydb-benchmark",
|
|
85
|
+
"keydb-cli",
|
|
86
|
+
"mariabackup",
|
|
87
|
+
"mariadb",
|
|
88
|
+
"mariadb-admin",
|
|
89
|
+
"mariadb-backup",
|
|
90
|
+
"mariadb-binlog",
|
|
91
|
+
"mariadb-check",
|
|
92
|
+
"mariadb-dump",
|
|
93
|
+
"mariadb-import",
|
|
94
|
+
"mariadb-slap",
|
|
95
|
+
"memtier_benchmark",
|
|
96
|
+
"mongo",
|
|
97
|
+
"mongodump",
|
|
98
|
+
"mongoexport",
|
|
99
|
+
"mongofiles",
|
|
100
|
+
"mongoimport",
|
|
101
|
+
"mongorestore",
|
|
102
|
+
"mongosh",
|
|
103
|
+
"mongostat",
|
|
104
|
+
"mongotop",
|
|
105
|
+
"mysql",
|
|
106
|
+
"mysqladmin",
|
|
107
|
+
"mysqlbinlog",
|
|
108
|
+
"mysqlcheck",
|
|
109
|
+
"mysqldump",
|
|
110
|
+
"mysqlimport",
|
|
111
|
+
"mysqlpump",
|
|
112
|
+
"mysqlsh",
|
|
113
|
+
"mysqlslap",
|
|
114
|
+
"nodetool",
|
|
115
|
+
"pg_amcheck",
|
|
116
|
+
"pg_basebackup",
|
|
117
|
+
"pg_dump",
|
|
118
|
+
"pg_dumpall",
|
|
119
|
+
"pg_isready",
|
|
120
|
+
"pg_receivewal",
|
|
121
|
+
"pg_restore",
|
|
122
|
+
"pg_verifybackup",
|
|
123
|
+
"pgbench",
|
|
124
|
+
"psql",
|
|
125
|
+
"redis-benchmark",
|
|
126
|
+
"redis-check-aof",
|
|
127
|
+
"redis-check-rdb",
|
|
128
|
+
"redis-cli",
|
|
129
|
+
"reindexdb",
|
|
130
|
+
"sqlcmd",
|
|
131
|
+
"sqlplus",
|
|
132
|
+
"vacuumdb",
|
|
133
|
+
"valkey-benchmark",
|
|
134
|
+
"valkey-check-aof",
|
|
135
|
+
"valkey-check-rdb",
|
|
136
|
+
"valkey-cli",
|
|
137
|
+
"xtrabackup",
|
|
138
|
+
"ycqlsh",
|
|
139
|
+
"ysqlsh",
|
|
140
|
+
]);
|
|
141
|
+
|
|
142
|
+
// Commands that only hold a debug pod open.
|
|
143
|
+
const KEEP_ALIVE_PROGRAMS: ReadonlySet<string> = new Set<string>([
|
|
144
|
+
"cat",
|
|
145
|
+
"sleep",
|
|
146
|
+
"tail",
|
|
147
|
+
"true",
|
|
148
|
+
]);
|
|
149
|
+
|
|
150
|
+
const COMPANION_PROGRAMS: ReadonlySet<string> = new Set<string>([
|
|
151
|
+
"keydb-sentinel",
|
|
152
|
+
"redis-sentinel",
|
|
153
|
+
"valkey-sentinel",
|
|
154
|
+
]);
|
|
155
|
+
|
|
156
|
+
// Servers that run as a Sentinel when given this flag.
|
|
157
|
+
const SENTINEL_FLAG: string = "--sentinel";
|
|
158
|
+
const SENTINEL_CAPABLE_SERVERS: ReadonlySet<string> = new Set<string>([
|
|
159
|
+
"keydb-server",
|
|
160
|
+
"redis-server",
|
|
161
|
+
"valkey-server",
|
|
162
|
+
]);
|
|
163
|
+
|
|
164
|
+
/*
|
|
165
|
+
* Shell keywords, builtins and utilities that never start a server. Nothing
|
|
166
|
+
* here may run another program: `env`, `exec`, `eval`, `source` / `.`,
|
|
167
|
+
* `xargs`, `find`, `timeout`, `nohup`, `su`, `gosu` and the shells
|
|
168
|
+
* themselves are absent on purpose.
|
|
169
|
+
*/
|
|
170
|
+
const SCRIPT_UTILITIES: ReadonlySet<string> = new Set<string>([
|
|
171
|
+
"!",
|
|
172
|
+
":",
|
|
173
|
+
"[",
|
|
174
|
+
"[[",
|
|
175
|
+
"{",
|
|
176
|
+
"}",
|
|
177
|
+
"awk",
|
|
178
|
+
"base64",
|
|
179
|
+
"basename",
|
|
180
|
+
"break",
|
|
181
|
+
"case",
|
|
182
|
+
"cd",
|
|
183
|
+
"chmod",
|
|
184
|
+
"chown",
|
|
185
|
+
"continue",
|
|
186
|
+
"cp",
|
|
187
|
+
"curl",
|
|
188
|
+
"cut",
|
|
189
|
+
"date",
|
|
190
|
+
"declare",
|
|
191
|
+
"dirname",
|
|
192
|
+
"do",
|
|
193
|
+
"done",
|
|
194
|
+
"echo",
|
|
195
|
+
"elif",
|
|
196
|
+
"else",
|
|
197
|
+
"envsubst",
|
|
198
|
+
"esac",
|
|
199
|
+
"exit",
|
|
200
|
+
"export",
|
|
201
|
+
"expr",
|
|
202
|
+
"false",
|
|
203
|
+
"fi",
|
|
204
|
+
"for",
|
|
205
|
+
"getent",
|
|
206
|
+
"grep",
|
|
207
|
+
"gzip",
|
|
208
|
+
"head",
|
|
209
|
+
"hostname",
|
|
210
|
+
"id",
|
|
211
|
+
"if",
|
|
212
|
+
"in",
|
|
213
|
+
"install",
|
|
214
|
+
"jq",
|
|
215
|
+
"kill",
|
|
216
|
+
"ln",
|
|
217
|
+
"local",
|
|
218
|
+
"ls",
|
|
219
|
+
"mkdir",
|
|
220
|
+
"mktemp",
|
|
221
|
+
"mv",
|
|
222
|
+
"nslookup",
|
|
223
|
+
"printf",
|
|
224
|
+
"pwd",
|
|
225
|
+
"read",
|
|
226
|
+
"readonly",
|
|
227
|
+
"return",
|
|
228
|
+
"rm",
|
|
229
|
+
"sed",
|
|
230
|
+
"seq",
|
|
231
|
+
"set",
|
|
232
|
+
"shift",
|
|
233
|
+
"shopt",
|
|
234
|
+
"sort",
|
|
235
|
+
"tee",
|
|
236
|
+
"test",
|
|
237
|
+
"then",
|
|
238
|
+
"touch",
|
|
239
|
+
"tr",
|
|
240
|
+
"trap",
|
|
241
|
+
"typeset",
|
|
242
|
+
"ulimit",
|
|
243
|
+
"umask",
|
|
244
|
+
"uniq",
|
|
245
|
+
"unset",
|
|
246
|
+
"until",
|
|
247
|
+
"wait",
|
|
248
|
+
"wc",
|
|
249
|
+
"wget",
|
|
250
|
+
"while",
|
|
251
|
+
]);
|
|
252
|
+
|
|
253
|
+
const SHELL_PROGRAMS: ReadonlySet<string> = new Set<string>([
|
|
254
|
+
"ash",
|
|
255
|
+
"bash",
|
|
256
|
+
"dash",
|
|
257
|
+
"sh",
|
|
258
|
+
"zsh",
|
|
259
|
+
]);
|
|
260
|
+
|
|
261
|
+
/*
|
|
262
|
+
* Launchers that run the rest of their arguments as the command, after
|
|
263
|
+
* their own flags (`env -i`, `tini -g --`, `dumb-init --single-child`) and,
|
|
264
|
+
* for `env`, `NAME=value` words. A flag that takes a separate value
|
|
265
|
+
* (`env -u NAME`, `tini -e 143`) leaves that value as the "program", which
|
|
266
|
+
* reads as a possible server — never as a client.
|
|
267
|
+
*/
|
|
268
|
+
const WRAPPER_PROGRAMS: ReadonlyArray<string> = [
|
|
269
|
+
"dumb-init",
|
|
270
|
+
"env",
|
|
271
|
+
"nohup",
|
|
272
|
+
"setsid",
|
|
273
|
+
"tini",
|
|
274
|
+
"tini-static",
|
|
275
|
+
];
|
|
276
|
+
|
|
277
|
+
/*
|
|
278
|
+
* An official image's entrypoint: it runs its first argument as the
|
|
279
|
+
* command, unless that argument is a flag — then it starts the image's own
|
|
280
|
+
* server with those flags (`docker-entrypoint.sh -c max_connections=200`).
|
|
281
|
+
*/
|
|
282
|
+
const ENTRYPOINT_PROGRAMS: ReadonlyArray<string> = ["docker-entrypoint.sh"];
|
|
283
|
+
|
|
284
|
+
// Launcher words read before the program; a longer chain is unreadable.
|
|
285
|
+
const MAX_WRAPPER_WORDS: number = 8;
|
|
286
|
+
|
|
287
|
+
/*
|
|
288
|
+
* The command names that may leave Postgres as themselves; any other
|
|
289
|
+
* command name leaves it as UNKNOWN_WORD. None of them can start a server.
|
|
290
|
+
*/
|
|
291
|
+
export const CONTAINER_COMMAND_KNOWN_WORDS: ReadonlyArray<string> = Array.from(
|
|
292
|
+
new Set<string>([
|
|
293
|
+
...Array.from(CLIENT_PROGRAMS),
|
|
294
|
+
...Array.from(KEEP_ALIVE_PROGRAMS),
|
|
295
|
+
...Array.from(COMPANION_PROGRAMS),
|
|
296
|
+
...Array.from(SCRIPT_UTILITIES),
|
|
297
|
+
]),
|
|
298
|
+
).sort();
|
|
299
|
+
|
|
300
|
+
const KNOWN_WORDS: ReadonlySet<string> = new Set<string>(
|
|
301
|
+
CONTAINER_COMMAND_KNOWN_WORDS,
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
// A command name that is not a known word (or text that cannot be read).
|
|
305
|
+
const UNKNOWN_WORD: string = "?";
|
|
306
|
+
|
|
307
|
+
// A shell's arguments read after its program; more are marked UNKNOWN_WORD.
|
|
308
|
+
const MAX_SHELL_ARGUMENTS: number = 8;
|
|
309
|
+
|
|
310
|
+
/*
|
|
311
|
+
* A longer shell argument is not read (it reduces to "?"): it bounds what
|
|
312
|
+
* the candidate-pod query spends per container on a pathological inline
|
|
313
|
+
* script. Counted in characters (code points), as Postgres length() counts.
|
|
314
|
+
*/
|
|
315
|
+
const MAX_SCRIPT_CHARACTERS: number = 16384;
|
|
316
|
+
|
|
317
|
+
// ---- the shared regular expressions ----------------------------------------
|
|
318
|
+
|
|
319
|
+
// Whitespace, spelled out: `\s` and [[:space:]] do not agree.
|
|
320
|
+
const WS: string = " \\t\\n\\r\\f\\v";
|
|
321
|
+
|
|
322
|
+
// The first word of argv[0], after any leading whitespace.
|
|
323
|
+
const PROGRAM_SOURCE: string = `^[${WS}]*([^${WS};&|=]+)`;
|
|
324
|
+
|
|
325
|
+
const SHELL_PROGRAM_SOURCE: string = "(^|/)(sh|bash|ash|dash|zsh)$";
|
|
326
|
+
|
|
327
|
+
// `-ecx`, `+o`, `--`, `--noprofile`: a shell argument kept verbatim.
|
|
328
|
+
const SHELL_OPTION_SOURCE: string =
|
|
329
|
+
"^([-+][A-Za-z]{0,8}|--|--[A-Za-z][A-Za-z-]{0,23})$";
|
|
330
|
+
|
|
331
|
+
// A launcher's flag (`-i`, `--`, `--single-child`) and an `env` NAME=value word.
|
|
332
|
+
const FLAG_WORD_SOURCE: string = "^-";
|
|
333
|
+
const ASSIGNMENT_WORD_SOURCE: string = "^[A-Za-z_][A-Za-z0-9_]*=";
|
|
334
|
+
|
|
335
|
+
/*
|
|
336
|
+
* A script is cleaned in this order, then its command names are read:
|
|
337
|
+
* line continuations → a space; backslash escapes → "?"; comments (outside
|
|
338
|
+
* quotes) dropped; quoted strings and `$( )` / `${ }` / backquote
|
|
339
|
+
* substitutions → "?"; redirections → a space; `NAME=value` words dropped.
|
|
340
|
+
*/
|
|
341
|
+
const LINE_CONTINUATION_SOURCE: string = "\\\\\\r?\\n";
|
|
342
|
+
const ESCAPED_CHARACTER_SOURCE: string = "\\\\[^\\n]";
|
|
343
|
+
const COMMENT_SOURCE: string = `('[^']*'|"[^"]*")|(^|[${WS};&|()])#[^\\n]*`;
|
|
344
|
+
const QUOTED_SOURCE: string =
|
|
345
|
+
"'[^']*'|\"[^\"]*\"|`[^`]*`|\\$\\([^()]*\\)|\\$\\{[^}]*\\}";
|
|
346
|
+
const REDIRECTION_SOURCE: string = "&?[0-9]*[<>]+&?[0-9]*-?";
|
|
347
|
+
const ASSIGNMENT_SOURCE: string = `(^|[${WS};&|()])[A-Za-z_][A-Za-z0-9_]*=[^${WS};&|()]*`;
|
|
348
|
+
|
|
349
|
+
/*
|
|
350
|
+
* A command name: the first word after the start, a newline or one of
|
|
351
|
+
* `; & | ( )`, past any keyword that is followed by a command (`then`, `do`,
|
|
352
|
+
* `!`, `exec` …) or launcher that runs one (`env`, `nohup`; `NAME=value`
|
|
353
|
+
* words are already gone).
|
|
354
|
+
*/
|
|
355
|
+
const COMMAND_WORD_SOURCE: string = `(?:^|[;&|()\\n])[${WS}]*(?:(?:if|then|else|elif|do|while|until|exec|time|env|nohup|!|\\{)[${WS}]+)*([^${WS};&|()]+)`;
|
|
356
|
+
|
|
357
|
+
const PROGRAM_REGEX: RegExp = new RegExp(PROGRAM_SOURCE);
|
|
358
|
+
const SHELL_PROGRAM_REGEX: RegExp = new RegExp(SHELL_PROGRAM_SOURCE, "i");
|
|
359
|
+
const SHELL_OPTION_REGEX: RegExp = new RegExp(SHELL_OPTION_SOURCE);
|
|
360
|
+
const FLAG_WORD_REGEX: RegExp = new RegExp(FLAG_WORD_SOURCE);
|
|
361
|
+
const ASSIGNMENT_WORD_REGEX: RegExp = new RegExp(ASSIGNMENT_WORD_SOURCE);
|
|
362
|
+
const WRAPPER_PROGRAM_SET: ReadonlySet<string> = new Set<string>(
|
|
363
|
+
WRAPPER_PROGRAMS,
|
|
364
|
+
);
|
|
365
|
+
const ENTRYPOINT_PROGRAM_SET: ReadonlySet<string> = new Set<string>(
|
|
366
|
+
ENTRYPOINT_PROGRAMS,
|
|
367
|
+
);
|
|
368
|
+
const LINE_CONTINUATION_REGEX: RegExp = new RegExp(
|
|
369
|
+
LINE_CONTINUATION_SOURCE,
|
|
370
|
+
"g",
|
|
371
|
+
);
|
|
372
|
+
const ESCAPED_CHARACTER_REGEX: RegExp = new RegExp(
|
|
373
|
+
ESCAPED_CHARACTER_SOURCE,
|
|
374
|
+
"g",
|
|
375
|
+
);
|
|
376
|
+
const COMMENT_REGEX: RegExp = new RegExp(COMMENT_SOURCE, "g");
|
|
377
|
+
const QUOTED_REGEX: RegExp = new RegExp(QUOTED_SOURCE, "g");
|
|
378
|
+
const REDIRECTION_REGEX: RegExp = new RegExp(REDIRECTION_SOURCE, "g");
|
|
379
|
+
const ASSIGNMENT_REGEX: RegExp = new RegExp(ASSIGNMENT_SOURCE, "g");
|
|
380
|
+
|
|
381
|
+
// A single-dash flag cluster with `c`: the shell runs its operand as a script.
|
|
382
|
+
const SCRIPT_FLAG_REGEX: RegExp = /^-[A-Za-z]*c/;
|
|
383
|
+
// `-o` / `+o` / `-O` / `+O` last in a cluster: the next argument is its value.
|
|
384
|
+
const VALUED_FLAG_REGEX: RegExp = /^[-+][A-Za-z]*[oO]$/;
|
|
385
|
+
|
|
386
|
+
// ---- the JavaScript twin -----------------------------------------------------
|
|
387
|
+
|
|
388
|
+
// A JSON array element as Postgres `->>` reads it.
|
|
389
|
+
function toText(value: unknown): string | null {
|
|
390
|
+
if (typeof value === "string") {
|
|
391
|
+
return value;
|
|
392
|
+
}
|
|
393
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
394
|
+
return String(value);
|
|
395
|
+
}
|
|
396
|
+
return null;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
function isLongerThan(value: string, characters: number): boolean {
|
|
400
|
+
// UTF-16 length is an upper bound on the code point count.
|
|
401
|
+
return value.length > characters && Array.from(value).length > characters;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
function baseName(value: string): string {
|
|
405
|
+
return value.substring(value.lastIndexOf("/") + 1).toLowerCase();
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// The command names a script runs, as a sorted "\n"-joined set.
|
|
409
|
+
function reduceScript(script: string): string {
|
|
410
|
+
const cleaned: string = script
|
|
411
|
+
.replace(LINE_CONTINUATION_REGEX, " ")
|
|
412
|
+
.replace(ESCAPED_CHARACTER_REGEX, "?")
|
|
413
|
+
.replace(COMMENT_REGEX, "$1$2")
|
|
414
|
+
.replace(QUOTED_REGEX, "?")
|
|
415
|
+
.replace(REDIRECTION_REGEX, " ")
|
|
416
|
+
.replace(ASSIGNMENT_REGEX, "$1");
|
|
417
|
+
|
|
418
|
+
const names: Set<string> = new Set<string>();
|
|
419
|
+
const commandWords: RegExp = new RegExp(COMMAND_WORD_SOURCE, "g");
|
|
420
|
+
let match: RegExpExecArray | null = commandWords.exec(cleaned);
|
|
421
|
+
while (match) {
|
|
422
|
+
const name: string = baseName(match[1]!);
|
|
423
|
+
names.add(KNOWN_WORDS.has(name) ? name : UNKNOWN_WORD);
|
|
424
|
+
match = commandWords.exec(cleaned);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
return Array.from(names).sort().join("\n");
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
type LauncherWordKind =
|
|
431
|
+
| "wrapper"
|
|
432
|
+
| "entrypoint"
|
|
433
|
+
| "flag"
|
|
434
|
+
| "assignment"
|
|
435
|
+
| "other";
|
|
436
|
+
|
|
437
|
+
// What one argv word is to the launcher walk (the Postgres twin's CASE, in order).
|
|
438
|
+
function launcherWordKind(value: unknown): LauncherWordKind {
|
|
439
|
+
const text: string | null = toText(value);
|
|
440
|
+
if (text === null) {
|
|
441
|
+
return "other";
|
|
442
|
+
}
|
|
443
|
+
if (FLAG_WORD_REGEX.test(text)) {
|
|
444
|
+
return "flag";
|
|
445
|
+
}
|
|
446
|
+
if (ASSIGNMENT_WORD_REGEX.test(text)) {
|
|
447
|
+
return "assignment";
|
|
448
|
+
}
|
|
449
|
+
const program: RegExpExecArray | null = PROGRAM_REGEX.exec(text);
|
|
450
|
+
if (!program) {
|
|
451
|
+
return "other";
|
|
452
|
+
}
|
|
453
|
+
const name: string = baseName(program[1]!);
|
|
454
|
+
if (WRAPPER_PROGRAM_SET.has(name)) {
|
|
455
|
+
return "wrapper";
|
|
456
|
+
}
|
|
457
|
+
return ENTRYPOINT_PROGRAM_SET.has(name) ? "entrypoint" : "other";
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/*
|
|
461
|
+
* `command ++ args` from the program a chain of launchers starts: the whole
|
|
462
|
+
* argv when it starts with no launcher; from the first word that is not a
|
|
463
|
+
* launcher, a launcher's flag or an `env` assignment; just the first
|
|
464
|
+
* launcher (a possible server) when that program is out of reach — more
|
|
465
|
+
* than MAX_WRAPPER_WORDS words deep, missing, or a flag handed to an
|
|
466
|
+
* image's entrypoint (which then starts the server with it).
|
|
467
|
+
*/
|
|
468
|
+
function unwrapLaunchers(argv: ReadonlyArray<unknown>): ReadonlyArray<unknown> {
|
|
469
|
+
let previous: LauncherWordKind | null = null;
|
|
470
|
+
const last: number = Math.min(argv.length - 1, MAX_WRAPPER_WORDS);
|
|
471
|
+
|
|
472
|
+
for (let index: number = 0; index <= last; index++) {
|
|
473
|
+
const kind: LauncherWordKind = launcherWordKind(argv[index]);
|
|
474
|
+
const skipped: boolean =
|
|
475
|
+
kind === "wrapper" ||
|
|
476
|
+
kind === "entrypoint" ||
|
|
477
|
+
((kind === "flag" || kind === "assignment") &&
|
|
478
|
+
(previous === "wrapper" ||
|
|
479
|
+
previous === "flag" ||
|
|
480
|
+
previous === "assignment"));
|
|
481
|
+
|
|
482
|
+
if (!skipped) {
|
|
483
|
+
if (index === 0) {
|
|
484
|
+
return argv;
|
|
485
|
+
}
|
|
486
|
+
return kind === "flag" || kind === "assignment"
|
|
487
|
+
? argv.slice(0, 1)
|
|
488
|
+
: argv.slice(index);
|
|
489
|
+
}
|
|
490
|
+
previous = kind;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
return argv.slice(0, 1);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* The reduced command line containerCommandProjectionSql computes in
|
|
498
|
+
* Postgres, from a full `command ++ args`: launchers dropped (see
|
|
499
|
+
* unwrapLaunchers), then [] when there is no program; `[program]` (plus
|
|
500
|
+
* "--sentinel" when present) for anything but a shell; for a shell,
|
|
501
|
+
* `[program, …]` with each of its first MAX_SHELL_ARGUMENTS arguments kept
|
|
502
|
+
* when it is a flag and reduced to the command names it runs otherwise ("?"
|
|
503
|
+
* when longer than MAX_SCRIPT_CHARACTERS), and "?" appended when there are
|
|
504
|
+
* more.
|
|
505
|
+
*/
|
|
506
|
+
export function reduceContainerCommand(
|
|
507
|
+
argv: ReadonlyArray<unknown>,
|
|
508
|
+
): Array<string | null> {
|
|
509
|
+
return reduceProgramCommand(unwrapLaunchers(argv));
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
// reduceContainerCommand once the launchers are gone.
|
|
513
|
+
function reduceProgramCommand(
|
|
514
|
+
argv: ReadonlyArray<unknown>,
|
|
515
|
+
): Array<string | null> {
|
|
516
|
+
const first: string | null = toText(argv[0]);
|
|
517
|
+
const program: RegExpExecArray | null =
|
|
518
|
+
first === null ? null : PROGRAM_REGEX.exec(first);
|
|
519
|
+
if (!program) {
|
|
520
|
+
return [];
|
|
521
|
+
}
|
|
522
|
+
const name: string = program[1]!;
|
|
523
|
+
|
|
524
|
+
if (!SHELL_PROGRAM_REGEX.test(name)) {
|
|
525
|
+
return argv.includes(SENTINEL_FLAG) ? [name, SENTINEL_FLAG] : [name];
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
const reduced: Array<string | null> = [name];
|
|
529
|
+
const last: number = Math.min(argv.length - 1, MAX_SHELL_ARGUMENTS);
|
|
530
|
+
for (let index: number = 1; index <= last; index++) {
|
|
531
|
+
const word: string | null = toText(argv[index]);
|
|
532
|
+
if (word === null) {
|
|
533
|
+
reduced.push(null);
|
|
534
|
+
} else if (SHELL_OPTION_REGEX.test(word)) {
|
|
535
|
+
reduced.push(word);
|
|
536
|
+
} else if (isLongerThan(word, MAX_SCRIPT_CHARACTERS)) {
|
|
537
|
+
reduced.push(UNKNOWN_WORD);
|
|
538
|
+
} else {
|
|
539
|
+
reduced.push(reduceScript(word));
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
if (argv.length > MAX_SHELL_ARGUMENTS + 1) {
|
|
543
|
+
reduced.push(UNKNOWN_WORD);
|
|
544
|
+
}
|
|
545
|
+
return reduced;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// ---- the rules ----------------------------------------------------------------
|
|
549
|
+
|
|
550
|
+
function roleOfScript(script: string): ContainerCommandRole {
|
|
551
|
+
let runsClient: boolean = false;
|
|
552
|
+
let runsCompanion: boolean = false;
|
|
553
|
+
|
|
554
|
+
for (const name of reduceScript(script).split("\n")) {
|
|
555
|
+
if (!name) {
|
|
556
|
+
continue;
|
|
557
|
+
}
|
|
558
|
+
if (COMPANION_PROGRAMS.has(name)) {
|
|
559
|
+
runsCompanion = true;
|
|
560
|
+
} else if (CLIENT_PROGRAMS.has(name)) {
|
|
561
|
+
runsClient = true;
|
|
562
|
+
} else if (!KEEP_ALIVE_PROGRAMS.has(name) && !SCRIPT_UTILITIES.has(name)) {
|
|
563
|
+
// Anything else, a nested shell or an unreadable word included.
|
|
564
|
+
return "server";
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
if (runsCompanion) {
|
|
569
|
+
return "companion";
|
|
570
|
+
}
|
|
571
|
+
return runsClient ? "client" : "keep-alive";
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
function roleOfReducedCommand(
|
|
575
|
+
reduced: ReadonlyArray<string | null>,
|
|
576
|
+
): ContainerCommandRole {
|
|
577
|
+
// A gap (null) ends what can be trusted about the command line.
|
|
578
|
+
const words: Array<string> = [];
|
|
579
|
+
for (const word of reduced) {
|
|
580
|
+
if (typeof word !== "string") {
|
|
581
|
+
break;
|
|
582
|
+
}
|
|
583
|
+
words.push(word);
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
if (words.length === 0) {
|
|
587
|
+
// Neither command nor args: the image's entrypoint, i.e. the server.
|
|
588
|
+
return "server";
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
const program: string = baseName(words[0]!);
|
|
592
|
+
|
|
593
|
+
if (!SHELL_PROGRAMS.has(program)) {
|
|
594
|
+
if (
|
|
595
|
+
COMPANION_PROGRAMS.has(program) ||
|
|
596
|
+
(SENTINEL_CAPABLE_SERVERS.has(program) && words.includes(SENTINEL_FLAG))
|
|
597
|
+
) {
|
|
598
|
+
return "companion";
|
|
599
|
+
}
|
|
600
|
+
if (CLIENT_PROGRAMS.has(program)) {
|
|
601
|
+
return "client";
|
|
602
|
+
}
|
|
603
|
+
if (KEEP_ALIVE_PROGRAMS.has(program) || SCRIPT_UTILITIES.has(program)) {
|
|
604
|
+
return "keep-alive";
|
|
605
|
+
}
|
|
606
|
+
return "server";
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// A shell: walk its flags to its operand.
|
|
610
|
+
let runsScript: boolean = false;
|
|
611
|
+
let index: number = 1;
|
|
612
|
+
while (index < words.length) {
|
|
613
|
+
const word: string = words[index]!;
|
|
614
|
+
if (word === "--" || word === "-") {
|
|
615
|
+
index++;
|
|
616
|
+
break;
|
|
617
|
+
}
|
|
618
|
+
if (!SHELL_OPTION_REGEX.test(word)) {
|
|
619
|
+
break;
|
|
620
|
+
}
|
|
621
|
+
if (SCRIPT_FLAG_REGEX.test(word)) {
|
|
622
|
+
runsScript = true;
|
|
623
|
+
}
|
|
624
|
+
index += VALUED_FLAG_REGEX.test(word) ? 2 : 1;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
const operand: string | undefined = words[index];
|
|
628
|
+
if (operand === undefined) {
|
|
629
|
+
// `bash`, `sh -i` are interactive; `sh -c` with its script lost is unreadable.
|
|
630
|
+
return runsScript ? "server" : "keep-alive";
|
|
631
|
+
}
|
|
632
|
+
if (!runsScript) {
|
|
633
|
+
// A script FILE: whatever it starts cannot be read here.
|
|
634
|
+
return "server";
|
|
635
|
+
}
|
|
636
|
+
return roleOfScript(operand);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
/**
|
|
640
|
+
* What a Kubernetes container runs, from its `command` and `args` — a full
|
|
641
|
+
* spec's or the reduction CANDIDATE_PODS_SQL projects (pass that as
|
|
642
|
+
* `command`). See the file header for the rules.
|
|
643
|
+
*/
|
|
644
|
+
export function classifyContainerCommand(
|
|
645
|
+
container: ContainerCommandLike,
|
|
646
|
+
): ContainerCommandRole {
|
|
647
|
+
const command: unknown = container?.command;
|
|
648
|
+
const args: unknown = container?.args;
|
|
649
|
+
const argv: Array<unknown> = [
|
|
650
|
+
...(Array.isArray(command) ? command : []),
|
|
651
|
+
...(Array.isArray(args) ? args : []),
|
|
652
|
+
];
|
|
653
|
+
return roleOfReducedCommand(reduceContainerCommand(argv));
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// True when the container is proven to run a client, keep-alive or Sentinel — not a server.
|
|
657
|
+
export function isNonServerCommand(container: ContainerCommandLike): boolean {
|
|
658
|
+
return classifyContainerCommand(container) !== "server";
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// ---- the Postgres twin ------------------------------------------------------
|
|
662
|
+
|
|
663
|
+
// A dollar-quoted literal: read verbatim whatever standard_conforming_strings is.
|
|
664
|
+
function sqlLiteral(value: string): string {
|
|
665
|
+
if (value.includes("$re$")) {
|
|
666
|
+
throw new Error("a projection literal cannot contain its own quote tag");
|
|
667
|
+
}
|
|
668
|
+
return `$re$${value}$re$`;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
function sqlTextArray(values: ReadonlyArray<string>): string {
|
|
672
|
+
return `ARRAY[${values.map(sqlLiteral).join(", ")}]::text[]`;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
/**
|
|
676
|
+
* The Postgres expression reduceContainerCommand is the twin of: a jsonb
|
|
677
|
+
* array computed from `argv` (a SQL expression for the jsonb array
|
|
678
|
+
* `command || args`), with `knownWords` (a SQL expression for a text[]
|
|
679
|
+
* holding CONTAINER_COMMAND_KNOWN_WORDS) deciding which command names may
|
|
680
|
+
* leave as themselves.
|
|
681
|
+
*/
|
|
682
|
+
export function containerCommandProjectionSql(data: {
|
|
683
|
+
argv: string;
|
|
684
|
+
knownWords: string;
|
|
685
|
+
}): string {
|
|
686
|
+
const argv: string = data.argv;
|
|
687
|
+
const launcherName: string = `lower(regexp_replace(substring(lw.word from ${sqlLiteral(PROGRAM_SOURCE)}), '^.*/', ''))`;
|
|
688
|
+
|
|
689
|
+
// unwrapLaunchers' twin: the argv from the program a chain of launchers starts.
|
|
690
|
+
return `(
|
|
691
|
+
SELECT ${programCommandProjectionSql({
|
|
692
|
+
argv: "lu.argv",
|
|
693
|
+
knownWords: data.knownWords,
|
|
694
|
+
})}
|
|
695
|
+
FROM (
|
|
696
|
+
SELECT CASE
|
|
697
|
+
WHEN lf.position = 1 THEN ${argv}
|
|
698
|
+
WHEN lf.position IS NULL OR lf.kind IN ('flag', 'assignment')
|
|
699
|
+
THEN jsonb_build_array(${argv} -> 0)
|
|
700
|
+
ELSE (
|
|
701
|
+
SELECT jsonb_agg(le.value ORDER BY le.position)
|
|
702
|
+
FROM jsonb_array_elements(${argv}) WITH ORDINALITY AS le(value, position)
|
|
703
|
+
WHERE le.position >= lf.position
|
|
704
|
+
)
|
|
705
|
+
END AS argv
|
|
706
|
+
FROM (SELECT 1) AS lone
|
|
707
|
+
LEFT JOIN LATERAL (
|
|
708
|
+
SELECT lk.position, lk.kind
|
|
709
|
+
FROM (
|
|
710
|
+
SELECT lc.position, lc.kind,
|
|
711
|
+
lag(lc.kind) OVER (ORDER BY lc.position) AS previous
|
|
712
|
+
FROM (
|
|
713
|
+
SELECT lw.position,
|
|
714
|
+
CASE
|
|
715
|
+
WHEN lw.word ~ ${sqlLiteral(FLAG_WORD_SOURCE)} THEN 'flag'
|
|
716
|
+
WHEN lw.word ~ ${sqlLiteral(ASSIGNMENT_WORD_SOURCE)} THEN 'assignment'
|
|
717
|
+
WHEN ${launcherName} = ANY(${sqlTextArray(WRAPPER_PROGRAMS)}) THEN 'wrapper'
|
|
718
|
+
WHEN ${launcherName} = ANY(${sqlTextArray(ENTRYPOINT_PROGRAMS)}) THEN 'entrypoint'
|
|
719
|
+
ELSE 'other'
|
|
720
|
+
END AS kind
|
|
721
|
+
FROM jsonb_array_elements_text(${argv}) WITH ORDINALITY AS lw(word, position)
|
|
722
|
+
WHERE lw.position <= ${MAX_WRAPPER_WORDS + 1}
|
|
723
|
+
) AS lc
|
|
724
|
+
) AS lk
|
|
725
|
+
WHERE NOT (
|
|
726
|
+
lk.kind IN ('wrapper', 'entrypoint')
|
|
727
|
+
OR (
|
|
728
|
+
lk.kind IN ('flag', 'assignment')
|
|
729
|
+
AND COALESCE(lk.previous IN ('wrapper', 'flag', 'assignment'), false)
|
|
730
|
+
)
|
|
731
|
+
)
|
|
732
|
+
ORDER BY lk.position
|
|
733
|
+
LIMIT 1
|
|
734
|
+
) AS lf ON true
|
|
735
|
+
) AS lu
|
|
736
|
+
)`;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
// reduceProgramCommand's twin: `argv` has no launcher in front any more.
|
|
740
|
+
function programCommandProjectionSql(data: {
|
|
741
|
+
argv: string;
|
|
742
|
+
knownWords: string;
|
|
743
|
+
}): string {
|
|
744
|
+
const argv: string = data.argv;
|
|
745
|
+
|
|
746
|
+
const cleanedScript: string = [
|
|
747
|
+
[LINE_CONTINUATION_SOURCE, " "],
|
|
748
|
+
[ESCAPED_CHARACTER_SOURCE, "?"],
|
|
749
|
+
[COMMENT_SOURCE, "\\1\\2"],
|
|
750
|
+
[QUOTED_SOURCE, "?"],
|
|
751
|
+
[REDIRECTION_SOURCE, " "],
|
|
752
|
+
[ASSIGNMENT_SOURCE, "\\1"],
|
|
753
|
+
].reduce((expression: string, step: Array<string>): string => {
|
|
754
|
+
return `regexp_replace(${expression}, ${sqlLiteral(step[0]!)}, ${sqlLiteral(step[1]!)}, 'g')`;
|
|
755
|
+
}, "w.word");
|
|
756
|
+
|
|
757
|
+
return `(
|
|
758
|
+
SELECT CASE
|
|
759
|
+
WHEN p.program IS NULL THEN '[]'::jsonb
|
|
760
|
+
WHEN p.program !~* ${sqlLiteral(SHELL_PROGRAM_SOURCE)}
|
|
761
|
+
THEN jsonb_build_array(p.program)
|
|
762
|
+
|| CASE WHEN ${argv} ? '${SENTINEL_FLAG}'
|
|
763
|
+
THEN '["${SENTINEL_FLAG}"]'::jsonb ELSE '[]'::jsonb END
|
|
764
|
+
ELSE jsonb_build_array(p.program)
|
|
765
|
+
|| COALESCE((
|
|
766
|
+
SELECT jsonb_agg(
|
|
767
|
+
CASE
|
|
768
|
+
WHEN w.word IS NULL THEN NULL
|
|
769
|
+
WHEN w.word ~ ${sqlLiteral(SHELL_OPTION_SOURCE)} THEN w.word
|
|
770
|
+
WHEN length(w.word) > ${MAX_SCRIPT_CHARACTERS} THEN '${UNKNOWN_WORD}'
|
|
771
|
+
ELSE COALESCE((
|
|
772
|
+
SELECT string_agg(DISTINCT n.name COLLATE "C", chr(10) ORDER BY n.name COLLATE "C")
|
|
773
|
+
FROM (
|
|
774
|
+
SELECT CASE
|
|
775
|
+
WHEN b.name = ANY(${data.knownWords}) THEN b.name
|
|
776
|
+
ELSE '${UNKNOWN_WORD}'
|
|
777
|
+
END AS name
|
|
778
|
+
FROM regexp_matches(
|
|
779
|
+
${cleanedScript},
|
|
780
|
+
${sqlLiteral(COMMAND_WORD_SOURCE)},
|
|
781
|
+
'g'
|
|
782
|
+
) AS m(parts)
|
|
783
|
+
CROSS JOIN LATERAL (
|
|
784
|
+
SELECT lower(regexp_replace(m.parts[1], '^.*/', '')) AS name
|
|
785
|
+
) AS b
|
|
786
|
+
) AS n
|
|
787
|
+
), '')
|
|
788
|
+
END
|
|
789
|
+
ORDER BY w.position
|
|
790
|
+
)
|
|
791
|
+
FROM jsonb_array_elements_text(${argv}) WITH ORDINALITY AS w(word, position)
|
|
792
|
+
WHERE w.position BETWEEN 2 AND ${MAX_SHELL_ARGUMENTS + 1}
|
|
793
|
+
), '[]'::jsonb)
|
|
794
|
+
|| CASE WHEN jsonb_array_length(${argv}) > ${MAX_SHELL_ARGUMENTS + 1}
|
|
795
|
+
THEN '["${UNKNOWN_WORD}"]'::jsonb ELSE '[]'::jsonb END
|
|
796
|
+
END
|
|
797
|
+
FROM (
|
|
798
|
+
SELECT substring(${argv} ->> 0 from ${sqlLiteral(PROGRAM_SOURCE)}) AS program
|
|
799
|
+
) AS p
|
|
800
|
+
)`;
|
|
801
|
+
}
|