Skip to content

Commit ff87bca

Browse files
committed
Massive reformat
1 parent 2d85d31 commit ff87bca

File tree

97 files changed

+3565
-2473
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+3565
-2473
lines changed

contentctl/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '0.1.0'
1+
__version__ = "0.1.0"

contentctl/actions/build.py

Lines changed: 87 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -15,86 +15,122 @@
1515

1616
from contentctl.objects.config import build
1717

18+
1819
@dataclass(frozen=True)
1920
class BuildInputDto:
2021
director_output_dto: DirectorOutputDto
21-
config:build
22+
config: build
2223

2324

2425
class Build:
25-
26-
27-
2826
def execute(self, input_dto: BuildInputDto) -> DirectorOutputDto:
2927
if input_dto.config.build_app:
30-
31-
updated_conf_files:set[pathlib.Path] = set()
28+
updated_conf_files: set[pathlib.Path] = set()
3229
conf_output = ConfOutput(input_dto.config)
3330

34-
3531
# Construct a path to a YML that does not actually exist.
3632
# We mock this "fake" path since the YML does not exist.
3733
# This ensures the checking for the existence of the CSV is correct
38-
data_sources_fake_yml_path = input_dto.config.getPackageDirectoryPath() / "lookups" / "data_sources.yml"
34+
data_sources_fake_yml_path = (
35+
input_dto.config.getPackageDirectoryPath()
36+
/ "lookups"
37+
/ "data_sources.yml"
38+
)
3939

4040
# Construct a special lookup whose CSV is created at runtime and
41-
# written directly into the lookups folder. We will delete this after a build,
41+
# written directly into the lookups folder. We will delete this after a build,
4242
# assuming that it is successful.
43-
data_sources_lookup_csv_path = input_dto.config.getPackageDirectoryPath() / "lookups" / "data_sources.csv"
44-
45-
46-
47-
DataSourceWriter.writeDataSourceCsv(input_dto.director_output_dto.data_sources, data_sources_lookup_csv_path)
48-
input_dto.director_output_dto.addContentToDictMappings(CSVLookup.model_construct(name="data_sources",
49-
id=uuid.UUID("b45c1403-6e09-47b0-824f-cf6e44f15ac8"),
50-
version=1,
51-
author=input_dto.config.app.author_name,
52-
date = datetime.date.today(),
53-
description= "A lookup file that will contain the data source objects for detections.",
54-
lookup_type=Lookup_Type.csv,
55-
file_path=data_sources_fake_yml_path))
43+
data_sources_lookup_csv_path = (
44+
input_dto.config.getPackageDirectoryPath()
45+
/ "lookups"
46+
/ "data_sources.csv"
47+
)
48+
49+
DataSourceWriter.writeDataSourceCsv(
50+
input_dto.director_output_dto.data_sources, data_sources_lookup_csv_path
51+
)
52+
input_dto.director_output_dto.addContentToDictMappings(
53+
CSVLookup.model_construct(
54+
name="data_sources",
55+
id=uuid.UUID("b45c1403-6e09-47b0-824f-cf6e44f15ac8"),
56+
version=1,
57+
author=input_dto.config.app.author_name,
58+
date=datetime.date.today(),
59+
description="A lookup file that will contain the data source objects for detections.",
60+
lookup_type=Lookup_Type.csv,
61+
file_path=data_sources_fake_yml_path,
62+
)
63+
)
5664
updated_conf_files.update(conf_output.writeHeaders())
57-
updated_conf_files.update(conf_output.writeLookups(input_dto.director_output_dto.lookups))
58-
updated_conf_files.update(conf_output.writeDetections(input_dto.director_output_dto.detections))
59-
updated_conf_files.update(conf_output.writeStories(input_dto.director_output_dto.stories))
60-
updated_conf_files.update(conf_output.writeBaselines(input_dto.director_output_dto.baselines))
61-
updated_conf_files.update(conf_output.writeInvestigations(input_dto.director_output_dto.investigations))
62-
updated_conf_files.update(conf_output.writeMacros(input_dto.director_output_dto.macros))
63-
updated_conf_files.update(conf_output.writeDashboards(input_dto.director_output_dto.dashboards))
65+
updated_conf_files.update(
66+
conf_output.writeLookups(input_dto.director_output_dto.lookups)
67+
)
68+
updated_conf_files.update(
69+
conf_output.writeDetections(input_dto.director_output_dto.detections)
70+
)
71+
updated_conf_files.update(
72+
conf_output.writeStories(input_dto.director_output_dto.stories)
73+
)
74+
updated_conf_files.update(
75+
conf_output.writeBaselines(input_dto.director_output_dto.baselines)
76+
)
77+
updated_conf_files.update(
78+
conf_output.writeInvestigations(
79+
input_dto.director_output_dto.investigations
80+
)
81+
)
82+
updated_conf_files.update(
83+
conf_output.writeMacros(input_dto.director_output_dto.macros)
84+
)
85+
updated_conf_files.update(
86+
conf_output.writeDashboards(input_dto.director_output_dto.dashboards)
87+
)
6488
updated_conf_files.update(conf_output.writeMiscellaneousAppFiles())
65-
6689

67-
68-
69-
#Ensure that the conf file we just generated/update is syntactically valid
90+
# Ensure that the conf file we just generated/update is syntactically valid
7091
for conf_file in updated_conf_files:
71-
ConfWriter.validateConfFile(conf_file)
72-
92+
ConfWriter.validateConfFile(conf_file)
93+
7394
conf_output.packageApp()
7495

75-
print(f"Build of '{input_dto.config.app.title}' APP successful to {input_dto.config.getPackageFilePath()}")
76-
96+
print(
97+
f"Build of '{input_dto.config.app.title}' APP successful to {input_dto.config.getPackageFilePath()}"
98+
)
7799

78-
if input_dto.config.build_api:
100+
if input_dto.config.build_api:
79101
shutil.rmtree(input_dto.config.getAPIPath(), ignore_errors=True)
80102
input_dto.config.getAPIPath().mkdir(parents=True)
81-
api_json_output = ApiJsonOutput(input_dto.config.getAPIPath(), input_dto.config.app.label)
103+
api_json_output = ApiJsonOutput(
104+
input_dto.config.getAPIPath(), input_dto.config.app.label
105+
)
82106
api_json_output.writeDetections(input_dto.director_output_dto.detections)
83107
api_json_output.writeStories(input_dto.director_output_dto.stories)
84108
api_json_output.writeBaselines(input_dto.director_output_dto.baselines)
85-
api_json_output.writeInvestigations(input_dto.director_output_dto.investigations)
109+
api_json_output.writeInvestigations(
110+
input_dto.director_output_dto.investigations
111+
)
86112
api_json_output.writeLookups(input_dto.director_output_dto.lookups)
87113
api_json_output.writeMacros(input_dto.director_output_dto.macros)
88114
api_json_output.writeDeployments(input_dto.director_output_dto.deployments)
89115

90-
91-
#create version file for sse api
92-
version_file = input_dto.config.getAPIPath()/"version.json"
93-
utc_time = datetime.datetime.now(datetime.timezone.utc).replace(microsecond=0,tzinfo=None).isoformat()
94-
version_dict = {"version":{"name":f"v{input_dto.config.app.version}","published_at": f"{utc_time}Z" }}
95-
with open(version_file,"w") as version_f:
96-
json.dump(version_dict,version_f)
97-
98-
print(f"Build of '{input_dto.config.app.title}' API successful to {input_dto.config.getAPIPath()}")
99-
100-
return input_dto.director_output_dto
116+
# create version file for sse api
117+
version_file = input_dto.config.getAPIPath() / "version.json"
118+
utc_time = (
119+
datetime.datetime.now(datetime.timezone.utc)
120+
.replace(microsecond=0, tzinfo=None)
121+
.isoformat()
122+
)
123+
version_dict = {
124+
"version": {
125+
"name": f"v{input_dto.config.app.version}",
126+
"published_at": f"{utc_time}Z",
127+
}
128+
}
129+
with open(version_file, "w") as version_f:
130+
json.dump(version_dict, version_f)
131+
132+
print(
133+
f"Build of '{input_dto.config.app.title}' API successful to {input_dto.config.getAPIPath()}"
134+
)
135+
136+
return input_dto.director_output_dto

contentctl/actions/deploy_acs.py

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,38 @@
44

55

66
class Deploy:
7-
def execute(self, config: deploy_acs, appinspect_token:str) -> None:
8-
9-
#The following common headers are used by both Clasic and Victoria
7+
def execute(self, config: deploy_acs, appinspect_token: str) -> None:
8+
# The following common headers are used by both Clasic and Victoria
109
headers = {
11-
'Authorization': f'Bearer {config.splunk_cloud_jwt_token}',
12-
'ACS-Legal-Ack': 'Y'
10+
"Authorization": f"Bearer {config.splunk_cloud_jwt_token}",
11+
"ACS-Legal-Ack": "Y",
1312
}
1413
try:
15-
16-
with open(config.getPackageFilePath(include_version=False),'rb') as app_data:
17-
#request_data = app_data.read()
14+
with open(
15+
config.getPackageFilePath(include_version=False), "rb"
16+
) as app_data:
17+
# request_data = app_data.read()
1818
if config.stack_type == StackType.classic:
1919
# Classic instead uses a form to store token and package
2020
# https://docs.splunk.com/Documentation/SplunkCloud/9.1.2308/Config/ManageApps#Manage_private_apps_using_the_ACS_API_on_Classic_Experience
2121
address = f"https://admin.splunk.com/{config.splunk_cloud_stack}/adminconfig/v2/apps"
22-
23-
form_data = {
24-
'token': (None, appinspect_token),
25-
'package': app_data
26-
}
27-
res = post(address, headers=headers, files = form_data)
22+
23+
form_data = {"token": (None, appinspect_token), "package": app_data}
24+
res = post(address, headers=headers, files=form_data)
2825
elif config.stack_type == StackType.victoria:
2926
# Victoria uses the X-Splunk-Authorization Header
3027
# It also uses --data-binary for the app content
3128
# https://docs.splunk.com/Documentation/SplunkCloud/9.1.2308/Config/ManageApps#Manage_private_apps_using_the_ACS_API_on_Victoria_Experience
32-
headers.update({'X-Splunk-Authorization': appinspect_token})
29+
headers.update({"X-Splunk-Authorization": appinspect_token})
3330
address = f"https://admin.splunk.com/{config.splunk_cloud_stack}/adminconfig/v2/apps/victoria"
3431
res = post(address, headers=headers, data=app_data.read())
3532
else:
3633
raise Exception(f"Unsupported stack type: '{config.stack_type}'")
3734
except Exception as e:
38-
raise Exception(f"Error installing to stack '{config.splunk_cloud_stack}' (stack_type='{config.stack_type}') via ACS:\n{str(e)}")
39-
35+
raise Exception(
36+
f"Error installing to stack '{config.splunk_cloud_stack}' (stack_type='{config.stack_type}') via ACS:\n{str(e)}"
37+
)
38+
4039
try:
4140
# Request went through and completed, but may have returned a non-successful error code.
4241
# This likely includes a more verbose response describing the error
@@ -48,8 +47,14 @@ def execute(self, config: deploy_acs, appinspect_token:str) -> None:
4847
except Exception:
4948
error_text = "No error text - request failed"
5049
formatted_error_text = pprint.pformat(error_text)
51-
print("While this may not be the cause of your error, ensure that the uid and appid of your Private App does not exist in Splunkbase\n"
52-
"ACS cannot deploy and app with the same uid or appid as one that exists in Splunkbase.")
53-
raise Exception(f"Error installing to stack '{config.splunk_cloud_stack}' (stack_type='{config.stack_type}') via ACS:\n{formatted_error_text}")
54-
55-
print(f"'{config.getPackageFilePath(include_version=False)}' successfully installed to stack '{config.splunk_cloud_stack}' (stack_type='{config.stack_type}') via ACS!")
50+
print(
51+
"While this may not be the cause of your error, ensure that the uid and appid of your Private App does not exist in Splunkbase\n"
52+
"ACS cannot deploy and app with the same uid or appid as one that exists in Splunkbase."
53+
)
54+
raise Exception(
55+
f"Error installing to stack '{config.splunk_cloud_stack}' (stack_type='{config.stack_type}') via ACS:\n{formatted_error_text}"
56+
)
57+
58+
print(
59+
f"'{config.getPackageFilePath(include_version=False)}' successfully installed to stack '{config.splunk_cloud_stack}' (stack_type='{config.stack_type}') via ACS!"
60+
)

0 commit comments

Comments
 (0)