55 * 2.0.
66 */
77
8- import { pick } from 'lodash' ;
98import { transformError } from '@kbn/securitysolution-es-utils' ;
109import type { Logger , KibanaRequest , KibanaResponseFactory } from '@kbn/core/server' ;
11- import { SkipRuleInstallReason } from '../../../../../../common/api/detection_engine/prebuilt_rules' ;
1210import type {
1311 PerformRuleInstallationResponseBody ,
14- SkippedRuleInstall ,
1512 PerformRuleInstallationRequestBody ,
16- InstalledRuleBasicInfo ,
1713} from '../../../../../../common/api/detection_engine/prebuilt_rules' ;
1814import type { SecuritySolutionRequestHandlerContext } from '../../../../../types' ;
1915import { buildSiemResponse } from '../../../routes/utils' ;
2016import { aggregatePrebuiltRuleErrors } from '../../logic/aggregate_prebuilt_rule_errors' ;
2117import { ensureLatestRulesPackageInstalled } from '../../logic/integrations/ensure_latest_rules_package_installed' ;
2218import { createPrebuiltRuleAssetsClient } from '../../logic/rule_assets/prebuilt_rule_assets_client' ;
23- import { PREBUILT_RULE_BATCH_SIZE } from '../../constants' ;
24- import { createPrebuiltRules } from '../../logic/rule_objects/create_prebuilt_rules' ;
25- import { createPrebuiltRuleObjectsClient } from '../../logic/rule_objects/prebuilt_rule_objects_client' ;
2619import { performTimelinesInstallation } from '../../logic/perform_timelines_installation' ;
27- import type { RuleSignatureId , RuleVersion } from '../../../../../../common/api/detection_engine' ;
28- import { excludeLicenseRestrictedRules } from '../../logic/utils' ;
2920
3021export const performRuleInstallationHandler = async (
3122 context : SecuritySolutionRequestHandlerContext ,
@@ -38,12 +29,9 @@ export const performRuleInstallationHandler = async (
3829 try {
3930 const ctx = await context . resolve ( [ 'core' , 'alerting' , 'securitySolution' ] ) ;
4031 const soClient = ctx . core . savedObjects . client ;
41- const rulesClient = await ctx . alerting . getRulesClient ( ) ;
4232 const detectionRulesClient = ctx . securitySolution . getDetectionRulesClient ( ) ;
4333 const ruleAssetsClient = createPrebuiltRuleAssetsClient ( soClient ) ;
44- const ruleObjectsClient = createPrebuiltRuleObjectsClient ( rulesClient ) ;
4534 const exceptionsListClient = ctx . securitySolution . getExceptionListClient ( ) ;
46- const mlAuthz = ctx . securitySolution . getMlAuthz ( ) ;
4735
4836 const { mode } = request . body ;
4937
@@ -54,93 +42,16 @@ export const performRuleInstallationHandler = async (
5442 // pages first, the rules package might be missing.
5543 await ensureLatestRulesPackageInstalled ( ruleAssetsClient , ctx . securitySolution , logger ) ;
5644
57- const ruleInstallQueue : Array < {
58- rule_id : RuleSignatureId ;
59- version : RuleVersion ;
60- } > = [ ] ;
61- const ruleErrors = [ ] ;
62- const installedRules : InstalledRuleBasicInfo [ ] = [ ] ;
63- const skippedRules : SkippedRuleInstall [ ] = [ ] ;
64-
65- // Perform all the checks we can before we start the upgrade process
66- if ( mode === 'SPECIFIC_RULES' ) {
67- const requestedRuleIds = request . body . rules . map ( ( rule ) => rule . rule_id ) ;
68- const [ latestVersions , installedVersions ] = await Promise . all ( [
69- ruleAssetsClient . fetchLatestVersions ( { ruleIds : requestedRuleIds } ) ,
70- ruleObjectsClient . fetchInstalledRuleVersionsByIds ( { ruleIds : requestedRuleIds } ) ,
71- ] ) ;
72- const installedRuleIds = new Set ( installedVersions . map ( ( version ) => version . rule_id ) ) ;
73- const installableRuleIds = new Set (
74- latestVersions
75- . filter ( ( version ) => ! installedRuleIds . has ( version . rule_id ) )
76- . map ( ( version ) => version . rule_id )
77- ) ;
78-
79- request . body . rules . forEach ( ( rule ) => {
80- // Check that the requested rule is not installed yet
81- if ( installedRuleIds . has ( rule . rule_id ) ) {
82- skippedRules . push ( {
83- rule_id : rule . rule_id ,
84- reason : SkipRuleInstallReason . ALREADY_INSTALLED ,
85- } ) ;
86- return ;
87- }
88-
89- // Check that the requested rule is installable
90- if ( ! installableRuleIds . has ( rule . rule_id ) ) {
91- ruleErrors . push ( {
92- error : new Error (
93- `Rule with ID "${ rule . rule_id } " and version "${ rule . version } " not found`
94- ) ,
95- item : rule ,
96- } ) ;
97- return ;
98- }
99-
100- ruleInstallQueue . push ( rule ) ;
101- } ) ;
102- } else if ( mode === 'ALL_RULES' ) {
103- const allLatestVersions = await ruleAssetsClient . fetchLatestVersions ( ) ;
104- const currentRuleVersions = await ruleObjectsClient . fetchInstalledRuleVersions ( ) ;
105- const currentRuleVersionsMap = new Map (
106- currentRuleVersions . map ( ( version ) => [ version . rule_id , version ] )
107- ) ;
108- const allInstallableRules = allLatestVersions . filter (
109- ( latestVersion ) => ! currentRuleVersionsMap . has ( latestVersion . rule_id )
110- ) ;
111- ruleInstallQueue . push ( ...( await excludeLicenseRestrictedRules ( allInstallableRules , mlAuthz ) ) ) ;
112- }
113-
114- const changeTracking = {
115- metadata : {
116- bulkCount : ruleInstallQueue . length ,
117- } ,
118- } ;
119-
120- while ( ruleInstallQueue . length > 0 ) {
121- const rulesToInstall = ruleInstallQueue . splice ( 0 , PREBUILT_RULE_BATCH_SIZE ) ;
122- const { assets : ruleAssets } = await ruleAssetsClient . fetchAssetsByVersion ( rulesToInstall ) ;
123-
124- const { results, errors } = await createPrebuiltRules (
125- detectionRulesClient ,
126- ruleAssets ,
127- changeTracking ,
128- logger
129- ) ;
130-
131- const batchInstalledRules = results . map ( ( { result : rule } ) =>
132- pick ( rule , [ 'id' , 'rule_id' , 'version' ] )
133- ) ;
134-
135- installedRules . push ( ...batchInstalledRules ) ;
136- ruleErrors . push ( ...errors ) ;
137- }
45+ const { installedRules, skippedRules, errors } =
46+ mode === 'SPECIFIC_RULES'
47+ ? await detectionRulesClient . installPrebuiltRules ( { ruleSpecifiers : request . body . rules } )
48+ : await detectionRulesClient . installAllPrebuiltRules ( ) ;
13849
13950 const { error : timelineInstallationError } = await performTimelinesInstallation (
14051 ctx . securitySolution
14152 ) ;
14253
143- const allErrors = aggregatePrebuiltRuleErrors ( ruleErrors ) ;
54+ const allErrors = aggregatePrebuiltRuleErrors ( errors ) ;
14455 if ( timelineInstallationError ) {
14556 allErrors . push ( {
14657 message : timelineInstallationError ,
@@ -150,10 +61,10 @@ export const performRuleInstallationHandler = async (
15061
15162 const body : PerformRuleInstallationResponseBody = {
15263 summary : {
153- total : installedRules . length + skippedRules . length + ruleErrors . length ,
64+ total : installedRules . length + skippedRules . length + errors . length ,
15465 succeeded : installedRules . length ,
15566 skipped : skippedRules . length ,
156- failed : ruleErrors . length ,
67+ failed : errors . length ,
15768 } ,
15869 results : {
15970 created : installedRules ,
0 commit comments