4
4
5
5
from dataclasses import dataclass
6
6
7
- from contentctl .objects .enums import SecurityContentProduct , SecurityContentType
7
+ from contentctl .objects .enums import SecurityContentType
8
8
from contentctl .input .director import Director , DirectorOutputDto
9
9
from contentctl .output .conf_output import ConfOutput
10
10
from contentctl .output .conf_writer import ConfWriter
11
11
from contentctl .output .api_json_output import ApiJsonOutput
12
12
from contentctl .output .data_source_writer import DataSourceWriter
13
- from contentctl .objects .lookup import Lookup
13
+ from contentctl .objects .lookup import CSVLookup , Lookup_Type
14
14
import pathlib
15
15
import json
16
16
import datetime
17
- from typing import Union
17
+ import uuid
18
18
19
19
from contentctl .objects .config import build
20
20
@@ -34,27 +34,41 @@ def execute(self, input_dto: BuildInputDto) -> DirectorOutputDto:
34
34
updated_conf_files :set [pathlib .Path ] = set ()
35
35
conf_output = ConfOutput (input_dto .config )
36
36
37
+
38
+ # Construct a path to a YML that does not actually exist.
39
+ # We mock this "fake" path since the YML does not exist.
40
+ # This ensures the checking for the existence of the CSV is correct
41
+ data_sources_fake_yml_path = input_dto .config .getPackageDirectoryPath () / "lookups" / "data_sources.yml"
42
+
37
43
# Construct a special lookup whose CSV is created at runtime and
38
- # written directly into the output folder. It is created with model_construct,
39
- # not model_validate, because the CSV does not exist yet .
44
+ # written directly into the lookups folder. We will delete this after a build,
45
+ # assuming that it is successful .
40
46
data_sources_lookup_csv_path = input_dto .config .getPackageDirectoryPath () / "lookups" / "data_sources.csv"
41
- DataSourceWriter .writeDataSourceCsv (input_dto .director_output_dto .data_sources , data_sources_lookup_csv_path )
42
- input_dto .director_output_dto .addContentToDictMappings (Lookup .model_construct (description = "A lookup file that will contain the data source objects for detections." ,
43
- filename = data_sources_lookup_csv_path ,
44
- name = "data_sources" ))
45
47
48
+
49
+
50
+ DataSourceWriter .writeDataSourceCsv (input_dto .director_output_dto .data_sources , data_sources_lookup_csv_path )
51
+ input_dto .director_output_dto .addContentToDictMappings (CSVLookup .model_construct (name = "data_sources" ,
52
+ id = uuid .UUID ("b45c1403-6e09-47b0-824f-cf6e44f15ac8" ),
53
+ version = 1 ,
54
+ author = input_dto .config .app .author_name ,
55
+ date = datetime .date .today (),
56
+ description = "A lookup file that will contain the data source objects for detections." ,
57
+ lookup_type = Lookup_Type .csv ,
58
+ file_path = data_sources_fake_yml_path ))
46
59
updated_conf_files .update (conf_output .writeHeaders ())
47
- updated_conf_files .update (conf_output .writeObjects (input_dto .director_output_dto .detections , SecurityContentType . detections ))
48
- updated_conf_files .update (conf_output .writeObjects (input_dto .director_output_dto .stories , SecurityContentType . stories ))
49
- updated_conf_files .update (conf_output .writeObjects (input_dto .director_output_dto .baselines , SecurityContentType . baselines ))
50
- updated_conf_files .update (conf_output .writeObjects (input_dto .director_output_dto .investigations , SecurityContentType . investigations ))
51
- updated_conf_files .update (conf_output .writeObjects (input_dto .director_output_dto .lookups , SecurityContentType . lookups ))
52
- updated_conf_files .update (conf_output .writeObjects (input_dto .director_output_dto . macros , SecurityContentType .macros ))
53
- updated_conf_files .update (conf_output .writeObjects (input_dto .director_output_dto . dashboards , SecurityContentType .dashboards ))
60
+ updated_conf_files .update (conf_output .writeLookups (input_dto .director_output_dto .lookups ))
61
+ updated_conf_files .update (conf_output .writeDetections (input_dto .director_output_dto .detections ))
62
+ updated_conf_files .update (conf_output .writeStories (input_dto .director_output_dto .stories ))
63
+ updated_conf_files .update (conf_output .writeBaselines (input_dto .director_output_dto .baselines ))
64
+ updated_conf_files .update (conf_output .writeInvestigations (input_dto .director_output_dto .investigations ))
65
+ updated_conf_files .update (conf_output .writeMacros (input_dto .director_output_dto .macros ))
66
+ updated_conf_files .update (conf_output .writeDashboards (input_dto .director_output_dto .dashboards ))
54
67
updated_conf_files .update (conf_output .writeMiscellaneousAppFiles ())
55
68
56
69
57
70
71
+
58
72
#Ensure that the conf file we just generated/update is syntactically valid
59
73
for conf_file in updated_conf_files :
60
74
ConfWriter .validateConfFile (conf_file )
@@ -67,17 +81,15 @@ def execute(self, input_dto: BuildInputDto) -> DirectorOutputDto:
67
81
if input_dto .config .build_api :
68
82
shutil .rmtree (input_dto .config .getAPIPath (), ignore_errors = True )
69
83
input_dto .config .getAPIPath ().mkdir (parents = True )
70
- api_json_output = ApiJsonOutput ()
71
- for output_objects , output_type in [(input_dto .director_output_dto .detections , SecurityContentType .detections ),
72
- (input_dto .director_output_dto .stories , SecurityContentType .stories ),
73
- (input_dto .director_output_dto .baselines , SecurityContentType .baselines ),
74
- (input_dto .director_output_dto .investigations , SecurityContentType .investigations ),
75
- (input_dto .director_output_dto .lookups , SecurityContentType .lookups ),
76
- (input_dto .director_output_dto .macros , SecurityContentType .macros ),
77
- (input_dto .director_output_dto .deployments , SecurityContentType .deployments )]:
78
- api_json_output .writeObjects (output_objects , input_dto .config .getAPIPath (), input_dto .config .app .label , output_type )
79
-
80
-
84
+ api_json_output = ApiJsonOutput (input_dto .config .getAPIPath (), input_dto .config .app .label )
85
+ api_json_output .writeDetections (input_dto .director_output_dto .detections )
86
+ api_json_output .writeStories (input_dto .director_output_dto .stories )
87
+ api_json_output .writeBaselines (input_dto .director_output_dto .baselines )
88
+ api_json_output .writeInvestigations (input_dto .director_output_dto .investigations )
89
+ api_json_output .writeLookups (input_dto .director_output_dto .lookups )
90
+ api_json_output .writeMacros (input_dto .director_output_dto .macros )
91
+ api_json_output .writeDeployments (input_dto .director_output_dto .deployments )
92
+
81
93
82
94
#create version file for sse api
83
95
version_file = input_dto .config .getAPIPath ()/ "version.json"
0 commit comments