Skip to content

Commit e953dd2

Browse files
authored
Merge pull request #350 from splunk/the_big_cleanup
lint fixes & formatting
2 parents 3335e48 + fd94001 commit e953dd2

File tree

102 files changed

+3606
-2786
lines changed

Some content is hidden

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

102 files changed

+3606
-2786
lines changed

.git-blame-ignore-revs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ff87bcaf1741e8ecf15cb8d401438592dfef3ba7 # Mass reformat with adoption of ruff

.github/workflows/test_against_escu.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ jobs:
3535
with:
3636
path: security_content
3737
repository: splunk/security_content
38-
ref: rba_migration
3938

4039
#Install the given version of Python we will test against
4140
- name: Install Required Python Version

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: 88 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
import sys
21
import shutil
3-
import os
42

53
from dataclasses import dataclass
64

7-
from contentctl.objects.enums import SecurityContentType
8-
from contentctl.input.director import Director, DirectorOutputDto
5+
from contentctl.input.director import DirectorOutputDto
96
from contentctl.output.conf_output import ConfOutput
107
from contentctl.output.conf_writer import ConfWriter
118
from contentctl.output.api_json_output import ApiJsonOutput
@@ -18,86 +15,122 @@
1815

1916
from contentctl.objects.config import build
2017

18+
2119
@dataclass(frozen=True)
2220
class BuildInputDto:
2321
director_output_dto: DirectorOutputDto
24-
config:build
22+
config: build
2523

2624

2725
class Build:
28-
29-
30-
3126
def execute(self, input_dto: BuildInputDto) -> DirectorOutputDto:
3227
if input_dto.config.build_app:
33-
34-
updated_conf_files:set[pathlib.Path] = set()
28+
updated_conf_files: set[pathlib.Path] = set()
3529
conf_output = ConfOutput(input_dto.config)
3630

37-
3831
# Construct a path to a YML that does not actually exist.
3932
# We mock this "fake" path since the YML does not exist.
4033
# 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"
34+
data_sources_fake_yml_path = (
35+
input_dto.config.getPackageDirectoryPath()
36+
/ "lookups"
37+
/ "data_sources.yml"
38+
)
4239

4340
# Construct a special lookup whose CSV is created at runtime and
44-
# 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,
4542
# assuming that it is successful.
46-
data_sources_lookup_csv_path = input_dto.config.getPackageDirectoryPath() / "lookups" / "data_sources.csv"
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))
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+
)
5964
updated_conf_files.update(conf_output.writeHeaders())
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))
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+
)
6788
updated_conf_files.update(conf_output.writeMiscellaneousAppFiles())
68-
6989

70-
71-
72-
#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
7391
for conf_file in updated_conf_files:
74-
ConfWriter.validateConfFile(conf_file)
75-
92+
ConfWriter.validateConfFile(conf_file)
93+
7694
conf_output.packageApp()
7795

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

81-
if input_dto.config.build_api:
100+
if input_dto.config.build_api:
82101
shutil.rmtree(input_dto.config.getAPIPath(), ignore_errors=True)
83102
input_dto.config.getAPIPath().mkdir(parents=True)
84-
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+
)
85106
api_json_output.writeDetections(input_dto.director_output_dto.detections)
86107
api_json_output.writeStories(input_dto.director_output_dto.stories)
87108
api_json_output.writeBaselines(input_dto.director_output_dto.baselines)
88-
api_json_output.writeInvestigations(input_dto.director_output_dto.investigations)
109+
api_json_output.writeInvestigations(
110+
input_dto.director_output_dto.investigations
111+
)
89112
api_json_output.writeLookups(input_dto.director_output_dto.lookups)
90113
api_json_output.writeMacros(input_dto.director_output_dto.macros)
91114
api_json_output.writeDeployments(input_dto.director_output_dto.deployments)
92115

93-
94-
#create version file for sse api
95-
version_file = input_dto.config.getAPIPath()/"version.json"
96-
utc_time = datetime.datetime.now(datetime.timezone.utc).replace(microsecond=0,tzinfo=None).isoformat()
97-
version_dict = {"version":{"name":f"v{input_dto.config.app.version}","published_at": f"{utc_time}Z" }}
98-
with open(version_file,"w") as version_f:
99-
json.dump(version_dict,version_f)
100-
101-
print(f"Build of '{input_dto.config.app.title}' API successful to {input_dto.config.getAPIPath()}")
102-
103-
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: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,52 +4,57 @@
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
4342
res.raise_for_status()
4443
print(res.json())
45-
except Exception as e:
44+
except Exception:
4645
try:
4746
error_text = res.json()
48-
except Exception as e:
47+
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)