44
55from dataclasses import dataclass
66
7- from contentctl .objects .enums import SecurityContentProduct , SecurityContentType
7+ from contentctl .objects .enums import SecurityContentType
88from contentctl .input .director import Director , DirectorOutputDto
99from contentctl .output .conf_output import ConfOutput
1010from contentctl .output .conf_writer import ConfWriter
1111from contentctl .output .api_json_output import ApiJsonOutput
1212from contentctl .output .data_source_writer import DataSourceWriter
13- from contentctl .objects .lookup import Lookup
13+ from contentctl .objects .lookup import CSVLookup , Lookup_Type
1414import pathlib
1515import json
1616import datetime
17- from typing import Union
17+ import uuid
1818
1919from contentctl .objects .config import build
2020
@@ -34,27 +34,41 @@ def execute(self, input_dto: BuildInputDto) -> DirectorOutputDto:
3434 updated_conf_files :set [pathlib .Path ] = set ()
3535 conf_output = ConfOutput (input_dto .config )
3636
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+
3743 # 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 .
4046 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" ))
4547
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 ))
4659 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 ))
5467 updated_conf_files .update (conf_output .writeMiscellaneousAppFiles ())
5568
5669
5770
71+
5872 #Ensure that the conf file we just generated/update is syntactically valid
5973 for conf_file in updated_conf_files :
6074 ConfWriter .validateConfFile (conf_file )
@@ -67,17 +81,15 @@ def execute(self, input_dto: BuildInputDto) -> DirectorOutputDto:
6781 if input_dto .config .build_api :
6882 shutil .rmtree (input_dto .config .getAPIPath (), ignore_errors = True )
6983 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+
8193
8294 #create version file for sse api
8395 version_file = input_dto .config .getAPIPath ()/ "version.json"
0 commit comments