contentctl 4.4.1__py3-none-any.whl → 4.4.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- contentctl/actions/build.py +3 -1
- contentctl/actions/deploy_acs.py +49 -32
- contentctl/contentctl.py +6 -2
- contentctl/objects/config.py +1 -0
- contentctl/objects/correlation_search.py +1 -1
- contentctl/objects/enums.py +0 -1
- contentctl/output/conf_output.py +14 -7
- contentctl/output/conf_writer.py +117 -5
- contentctl/output/templates/app.conf.j2 +18 -16
- contentctl/output/templates/app.manifest.j2 +2 -1
- contentctl/output/templates/server.conf.j2 +4 -0
- contentctl/templates/app_template/metadata/default.meta +1 -1
- {contentctl-4.4.1.dist-info → contentctl-4.4.4.dist-info}/METADATA +1 -1
- {contentctl-4.4.1.dist-info → contentctl-4.4.4.dist-info}/RECORD +17 -18
- contentctl/templates/app_template/default/app.conf +0 -30
- contentctl/templates/app_template/default/content-version.conf +0 -2
- {contentctl-4.4.1.dist-info → contentctl-4.4.4.dist-info}/LICENSE.md +0 -0
- {contentctl-4.4.1.dist-info → contentctl-4.4.4.dist-info}/WHEEL +0 -0
- {contentctl-4.4.1.dist-info → contentctl-4.4.4.dist-info}/entry_points.txt +0 -0
contentctl/actions/build.py
CHANGED
|
@@ -51,7 +51,9 @@ class Build:
|
|
|
51
51
|
updated_conf_files.update(conf_output.writeObjects(input_dto.director_output_dto.lookups, SecurityContentType.lookups))
|
|
52
52
|
updated_conf_files.update(conf_output.writeObjects(input_dto.director_output_dto.macros, SecurityContentType.macros))
|
|
53
53
|
updated_conf_files.update(conf_output.writeObjects(input_dto.director_output_dto.dashboards, SecurityContentType.dashboards))
|
|
54
|
-
updated_conf_files.update(conf_output.
|
|
54
|
+
updated_conf_files.update(conf_output.writeMiscellaneousAppFiles())
|
|
55
|
+
|
|
56
|
+
|
|
55
57
|
|
|
56
58
|
#Ensure that the conf file we just generated/update is syntactically valid
|
|
57
59
|
for conf_file in updated_conf_files:
|
contentctl/actions/deploy_acs.py
CHANGED
|
@@ -1,38 +1,55 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
from typing import Union
|
|
7
|
-
|
|
8
|
-
@dataclass(frozen=True)
|
|
9
|
-
class ACSDeployInputDto:
|
|
10
|
-
director_input_dto: DirectorInputDto
|
|
11
|
-
splunk_api_username: str
|
|
12
|
-
splunk_api_password: str
|
|
13
|
-
splunk_cloud_jwt_token: str
|
|
14
|
-
splunk_cloud_stack: str
|
|
15
|
-
stack_type: str
|
|
1
|
+
from contentctl.objects.config import deploy_acs, StackType
|
|
2
|
+
from requests import post
|
|
3
|
+
import pprint
|
|
16
4
|
|
|
17
5
|
|
|
18
6
|
class Deploy:
|
|
19
|
-
def execute(self,
|
|
20
|
-
|
|
21
|
-
conf_output = ConfOutput(input_dto.director_input_dto.input_path, input_dto.director_input_dto.config)
|
|
7
|
+
def execute(self, config: deploy_acs, appinspect_token:str) -> None:
|
|
22
8
|
|
|
23
|
-
|
|
9
|
+
#The following common headers are used by both Clasic and Victoria
|
|
10
|
+
headers = {
|
|
11
|
+
'Authorization': f'Bearer {config.splunk_cloud_jwt_token}',
|
|
12
|
+
'ACS-Legal-Ack': 'Y'
|
|
13
|
+
}
|
|
14
|
+
try:
|
|
15
|
+
|
|
16
|
+
with open(config.getPackageFilePath(include_version=False),'rb') as app_data:
|
|
17
|
+
#request_data = app_data.read()
|
|
18
|
+
if config.stack_type == StackType.classic:
|
|
19
|
+
# Classic instead uses a form to store token and package
|
|
20
|
+
# https://docs.splunk.com/Documentation/SplunkCloud/9.1.2308/Config/ManageApps#Manage_private_apps_using_the_ACS_API_on_Classic_Experience
|
|
21
|
+
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)
|
|
28
|
+
elif config.stack_type == StackType.victoria:
|
|
29
|
+
# Victoria uses the X-Splunk-Authorization Header
|
|
30
|
+
# It also uses --data-binary for the app content
|
|
31
|
+
# 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})
|
|
33
|
+
address = f"https://admin.splunk.com/{config.splunk_cloud_stack}/adminconfig/v2/apps/victoria"
|
|
34
|
+
res = post(address, headers=headers, data=app_data.read())
|
|
35
|
+
else:
|
|
36
|
+
raise Exception(f"Unsupported stack type: '{config.stack_type}'")
|
|
37
|
+
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)}")
|
|
24
39
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
try:
|
|
41
|
+
# Request went through and completed, but may have returned a non-successful error code.
|
|
42
|
+
# This likely includes a more verbose response describing the error
|
|
43
|
+
res.raise_for_status()
|
|
44
|
+
print(res.json())
|
|
45
|
+
except Exception as e:
|
|
46
|
+
try:
|
|
47
|
+
error_text = res.json()
|
|
48
|
+
except Exception as e:
|
|
49
|
+
error_text = "No error text - request failed"
|
|
50
|
+
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}")
|
|
37
54
|
|
|
38
|
-
|
|
55
|
+
print(f"'{config.getPackageFilePath(include_version=False)}' successfully installed to stack '{config.splunk_cloud_stack}' (stack_type='{config.stack_type}') via ACS!")
|
contentctl/contentctl.py
CHANGED
|
@@ -19,6 +19,7 @@ from contentctl.actions.test import TestInputDto
|
|
|
19
19
|
from contentctl.actions.reporting import ReportingInputDto, Reporting
|
|
20
20
|
from contentctl.actions.inspect import Inspect
|
|
21
21
|
from contentctl.input.yml_reader import YmlReader
|
|
22
|
+
from contentctl.actions.deploy_acs import Deploy
|
|
22
23
|
from contentctl.actions.release_notes import ReleaseNotes
|
|
23
24
|
|
|
24
25
|
# def print_ascii_art():
|
|
@@ -95,8 +96,11 @@ def new_func(config:new):
|
|
|
95
96
|
|
|
96
97
|
|
|
97
98
|
def deploy_acs_func(config:deploy_acs):
|
|
98
|
-
|
|
99
|
-
|
|
99
|
+
print("Building and inspecting app...")
|
|
100
|
+
token = inspect_func(config)
|
|
101
|
+
print("App successfully built and inspected.")
|
|
102
|
+
print("Deploying app...")
|
|
103
|
+
Deploy().execute(config, token)
|
|
100
104
|
|
|
101
105
|
def test_common_func(config:test_common):
|
|
102
106
|
if type(config) == test:
|
contentctl/objects/config.py
CHANGED
contentctl/objects/enums.py
CHANGED
contentctl/output/conf_output.py
CHANGED
|
@@ -57,19 +57,26 @@ class ConfOutput:
|
|
|
57
57
|
pass
|
|
58
58
|
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def writeMiscellaneousAppFiles(self)->set[pathlib.Path]:
|
|
61
63
|
written_files:set[pathlib.Path] = set()
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
[self.config.app]))
|
|
64
|
+
|
|
65
|
+
written_files.add(ConfWriter.writeConfFile(pathlib.Path("default/content-version.conf"),
|
|
66
|
+
"content-version.j2",
|
|
67
|
+
self.config,
|
|
68
|
+
[self.config.app]))
|
|
68
69
|
|
|
69
70
|
written_files.add(ConfWriter.writeManifestFile(pathlib.Path("app.manifest"),
|
|
70
71
|
"app.manifest.j2",
|
|
71
72
|
self.config,
|
|
72
73
|
[self.config.app]))
|
|
74
|
+
|
|
75
|
+
written_files.add(ConfWriter.writeServerConf(self.config))
|
|
76
|
+
|
|
77
|
+
written_files.add(ConfWriter.writeAppConf(self.config))
|
|
78
|
+
|
|
79
|
+
|
|
73
80
|
return written_files
|
|
74
81
|
|
|
75
82
|
|
contentctl/output/conf_writer.py
CHANGED
|
@@ -12,6 +12,76 @@ from contentctl.objects.dashboard import Dashboard
|
|
|
12
12
|
from contentctl.objects.config import build
|
|
13
13
|
import xml.etree.ElementTree as ET
|
|
14
14
|
|
|
15
|
+
# This list is not exhaustive of all default conf files, but should be
|
|
16
|
+
# sufficient for our purposes.
|
|
17
|
+
DEFAULT_CONF_FILES = [
|
|
18
|
+
"alert_actions.conf",
|
|
19
|
+
"app.conf",
|
|
20
|
+
"audit.conf",
|
|
21
|
+
"authentication.conf",
|
|
22
|
+
"authorize.conf",
|
|
23
|
+
"bookmarks.conf",
|
|
24
|
+
"checklist.conf",
|
|
25
|
+
"collections.conf",
|
|
26
|
+
"commands.conf",
|
|
27
|
+
"conf.conf",
|
|
28
|
+
"datamodels.conf",
|
|
29
|
+
"datatypesbnf.conf",
|
|
30
|
+
"default-mode.conf",
|
|
31
|
+
"deploymentclient.conf",
|
|
32
|
+
"distsearch.conf",
|
|
33
|
+
"event_renderers.conf",
|
|
34
|
+
"eventdiscoverer.conf",
|
|
35
|
+
"eventtypes.conf",
|
|
36
|
+
"federated.conf",
|
|
37
|
+
"fields.conf",
|
|
38
|
+
"global-banner.conf",
|
|
39
|
+
"health.conf",
|
|
40
|
+
"indexes.conf",
|
|
41
|
+
"inputs.conf",
|
|
42
|
+
"limits.conf",
|
|
43
|
+
"literals.conf",
|
|
44
|
+
"livetail.conf",
|
|
45
|
+
"macros.conf",
|
|
46
|
+
"messages.conf",
|
|
47
|
+
"metric_alerts.conf",
|
|
48
|
+
"metric_rollups.conf",
|
|
49
|
+
"multikv.conf",
|
|
50
|
+
"outputs.conf",
|
|
51
|
+
"passwords.conf",
|
|
52
|
+
"procmon-filters.conf",
|
|
53
|
+
"props.conf",
|
|
54
|
+
"pubsub.conf",
|
|
55
|
+
"restmap.conf",
|
|
56
|
+
"rolling_upgrade.conf",
|
|
57
|
+
"savedsearches.conf",
|
|
58
|
+
"searchbnf.conf",
|
|
59
|
+
"segmenters.conf",
|
|
60
|
+
"server.conf",
|
|
61
|
+
"serverclass.conf",
|
|
62
|
+
"serverclass.seed.xml.conf",
|
|
63
|
+
"source-classifier.conf",
|
|
64
|
+
"sourcetypes.conf",
|
|
65
|
+
"tags.conf",
|
|
66
|
+
"telemetry.conf",
|
|
67
|
+
"times.conf",
|
|
68
|
+
"transactiontypes.conf",
|
|
69
|
+
"transforms.conf",
|
|
70
|
+
"ui-prefs.conf",
|
|
71
|
+
"ui-tour.conf",
|
|
72
|
+
"user-prefs.conf",
|
|
73
|
+
"user-seed.conf",
|
|
74
|
+
"viewstates.conf",
|
|
75
|
+
"visualizations.conf",
|
|
76
|
+
"web-features.conf",
|
|
77
|
+
"web.conf",
|
|
78
|
+
"wmi.conf",
|
|
79
|
+
"workflow_actions.conf",
|
|
80
|
+
"workload_policy.conf",
|
|
81
|
+
"workload_pools.conf",
|
|
82
|
+
"workload_rules.conf",
|
|
83
|
+
]
|
|
84
|
+
|
|
15
85
|
class ConfWriter():
|
|
16
86
|
|
|
17
87
|
@staticmethod
|
|
@@ -57,6 +127,52 @@ class ConfWriter():
|
|
|
57
127
|
ConfWriter.validateConfFile(output_path)
|
|
58
128
|
return output_path
|
|
59
129
|
|
|
130
|
+
@staticmethod
|
|
131
|
+
def getCustomConfFileStems(config:build)->list[str]:
|
|
132
|
+
# Get all the conf files in the default directory. We must make a reload.conf_file = simple key/value for them if
|
|
133
|
+
# they are custom conf files
|
|
134
|
+
default_path = config.getPackageDirectoryPath()/"default"
|
|
135
|
+
conf_files = default_path.glob("*.conf")
|
|
136
|
+
|
|
137
|
+
custom_conf_file_stems = [conf_file.stem for conf_file in conf_files if conf_file.name not in DEFAULT_CONF_FILES]
|
|
138
|
+
return sorted(custom_conf_file_stems)
|
|
139
|
+
|
|
140
|
+
@staticmethod
|
|
141
|
+
def writeServerConf(config: build) -> pathlib.Path:
|
|
142
|
+
app_output_path = pathlib.Path("default/server.conf")
|
|
143
|
+
template_name = "server.conf.j2"
|
|
144
|
+
|
|
145
|
+
j2_env = ConfWriter.getJ2Environment()
|
|
146
|
+
template = j2_env.get_template(template_name)
|
|
147
|
+
|
|
148
|
+
output = template.render(custom_conf_files=ConfWriter.getCustomConfFileStems(config))
|
|
149
|
+
|
|
150
|
+
output_path = config.getPackageDirectoryPath()/app_output_path
|
|
151
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
152
|
+
with open(output_path, 'a') as f:
|
|
153
|
+
output = output.encode('utf-8', 'ignore').decode('utf-8')
|
|
154
|
+
f.write(output)
|
|
155
|
+
return output_path
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@staticmethod
|
|
159
|
+
def writeAppConf(config: build) -> pathlib.Path:
|
|
160
|
+
app_output_path = pathlib.Path("default/app.conf")
|
|
161
|
+
template_name = "app.conf.j2"
|
|
162
|
+
|
|
163
|
+
j2_env = ConfWriter.getJ2Environment()
|
|
164
|
+
template = j2_env.get_template(template_name)
|
|
165
|
+
|
|
166
|
+
output = template.render(custom_conf_files=ConfWriter.getCustomConfFileStems(config),
|
|
167
|
+
app=config.app)
|
|
168
|
+
|
|
169
|
+
output_path = config.getPackageDirectoryPath()/app_output_path
|
|
170
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
171
|
+
with open(output_path, 'a') as f:
|
|
172
|
+
output = output.encode('utf-8', 'ignore').decode('utf-8')
|
|
173
|
+
f.write(output)
|
|
174
|
+
return output_path
|
|
175
|
+
|
|
60
176
|
@staticmethod
|
|
61
177
|
def writeManifestFile(app_output_path:pathlib.Path, template_name : str, config: build, objects : list) -> pathlib.Path:
|
|
62
178
|
j2_env = ConfWriter.getJ2Environment()
|
|
@@ -70,6 +186,7 @@ class ConfWriter():
|
|
|
70
186
|
output = output.encode('utf-8', 'ignore').decode('utf-8')
|
|
71
187
|
f.write(output)
|
|
72
188
|
return output_path
|
|
189
|
+
|
|
73
190
|
|
|
74
191
|
|
|
75
192
|
@staticmethod
|
|
@@ -218,8 +335,3 @@ class ConfWriter():
|
|
|
218
335
|
_ = json.load(manifestFile)
|
|
219
336
|
except Exception as e:
|
|
220
337
|
raise Exception(f"Failed to validate .manifest file {str(path)} (Note that .manifest files should contain only valid JSON-formatted data): {str(e)}")
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
@@ -4,31 +4,33 @@
|
|
|
4
4
|
is_configured = false
|
|
5
5
|
state = enabled
|
|
6
6
|
state_change_requires_restart = false
|
|
7
|
-
build = {{
|
|
7
|
+
build = {{ app.build }}
|
|
8
8
|
|
|
9
9
|
[triggers]
|
|
10
|
-
|
|
11
|
-
reload.
|
|
12
|
-
|
|
13
|
-
reload.correlationsearches = simple
|
|
14
|
-
reload.analyticstories = simple
|
|
15
|
-
reload.governance = simple
|
|
16
|
-
reload.managed_configurations = simple
|
|
17
|
-
reload.postprocess = simple
|
|
18
|
-
reload.content-version = simple
|
|
19
|
-
reload.es_investigations = simple
|
|
10
|
+
{% for custom_conf_file in custom_conf_files%}
|
|
11
|
+
reload.{{custom_conf_file}} = simple
|
|
12
|
+
{% endfor %}
|
|
20
13
|
|
|
21
14
|
[launcher]
|
|
22
|
-
author = {{
|
|
23
|
-
version = {{
|
|
24
|
-
description = {{
|
|
15
|
+
author = {{ app.author_company }}
|
|
16
|
+
version = {{ app.version }}
|
|
17
|
+
description = {{ app.description | escapeNewlines() }}
|
|
25
18
|
|
|
26
19
|
[ui]
|
|
27
20
|
is_visible = true
|
|
28
|
-
label = {{
|
|
21
|
+
label = {{ app.title }}
|
|
29
22
|
|
|
30
23
|
[package]
|
|
31
|
-
id = {{
|
|
24
|
+
id = {{ app.appid }}
|
|
25
|
+
{% if app.uid == 3449 %}
|
|
26
|
+
check_for_updates = true
|
|
27
|
+
{% else %}
|
|
28
|
+
check_for_updates = false
|
|
29
|
+
{% endif %}
|
|
30
|
+
|
|
31
|
+
[id]
|
|
32
|
+
version = {{ app.version }}
|
|
33
|
+
name = {{ app.appid }}
|
|
32
34
|
|
|
33
35
|
|
|
34
36
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
contentctl/__init__.py,sha256=IMjkMO3twhQzluVTo8Z6rE7Eg-9U79_LGKMcsWLKBkY,22
|
|
2
|
-
contentctl/actions/build.py,sha256=
|
|
3
|
-
contentctl/actions/deploy_acs.py,sha256=
|
|
2
|
+
contentctl/actions/build.py,sha256=T1shTnBqJ2OfAL5RRDLBw1CdeV-Oqqp3uJ8ObEEKTIM,5201
|
|
3
|
+
contentctl/actions/deploy_acs.py,sha256=4mD3wEgudi8UWpTW9mB5n65Bcs1w4g5cG2yflj-uEck,3259
|
|
4
4
|
contentctl/actions/detection_testing/DetectionTestingManager.py,sha256=zg8JasDjCpSC-yhseEyUwO8qbDJIUJbhlus9Li9ZAnA,8818
|
|
5
5
|
contentctl/actions/detection_testing/GitService.py,sha256=cofi7yilcaq_5fugSbRpSmQjFRKFcB8nJmOdUfHVRzc,9045
|
|
6
6
|
contentctl/actions/detection_testing/generate_detection_coverage_badge.py,sha256=N5mznaeErVak3mOBwsd0RDBFJO3bku0EZvpayCyU-uk,2259
|
|
@@ -22,7 +22,7 @@ contentctl/actions/reporting.py,sha256=MJEmvmoA1WnSFZEU9QM6daL_W94oOX0WXAcX1qAM2
|
|
|
22
22
|
contentctl/actions/test.py,sha256=jv12UO_PTjZwvo4G-Dr8fE2gsuWvuvAmO2QQM4q7TL0,5917
|
|
23
23
|
contentctl/actions/validate.py,sha256=eVxXf67b65ywe4yXYqaTXJShvqbzG9vd6jlkq-YVzy8,5538
|
|
24
24
|
contentctl/api.py,sha256=O0dNE3-WkWs2zuOeAQnIicgOtBX5s2bGBhRVo3j69-8,6327
|
|
25
|
-
contentctl/contentctl.py,sha256=
|
|
25
|
+
contentctl/contentctl.py,sha256=H2tst7G9JSpfvPqR_-Vmt78ngwaRg6FmndNByWf-3tM,10517
|
|
26
26
|
contentctl/enrichments/attack_enrichment.py,sha256=i0p5ud7EqA2SMB7Gc8JQdIonUTjAeDN-hxKBV4XV-Rg,6391
|
|
27
27
|
contentctl/enrichments/cve_enrichment.py,sha256=aXpv_kCS0XP6JpC_ZEOeBPgrl38t_vkKZe9Ay35lRi4,2347
|
|
28
28
|
contentctl/enrichments/splunk_app_enrichment.py,sha256=zDNHFLZTi2dJ1gdnh0sHkD6F1VtkblqFnhacFcCMBfc,3418
|
|
@@ -42,9 +42,9 @@ contentctl/objects/base_test.py,sha256=qUtKQJrqCto_fwCBdiH68_tXqokhcv9ceu2fQlBxs
|
|
|
42
42
|
contentctl/objects/base_test_result.py,sha256=pr-rwr80bJej8hHNhiVBvw49FZmRuPfOIChLJjY22lY,5205
|
|
43
43
|
contentctl/objects/baseline.py,sha256=cnJQt1z-PQDH6mbDU-eqo-l41LSWsaKmqU0IxuJWnGk,2139
|
|
44
44
|
contentctl/objects/baseline_tags.py,sha256=fyfH2KZqUhPGCwfverYw2_ZGXQIjgkT3P7hiYDPnN4Y,1599
|
|
45
|
-
contentctl/objects/config.py,sha256=
|
|
45
|
+
contentctl/objects/config.py,sha256=m99_glCCDluLrSDsC8SXJpXt97kIom8ppsp34aG3J5s,50475
|
|
46
46
|
contentctl/objects/constants.py,sha256=scKaQlubfjkW5n2AztY5zneAgjVLXbnyK0ZBALxPUV8,5529
|
|
47
|
-
contentctl/objects/correlation_search.py,sha256=
|
|
47
|
+
contentctl/objects/correlation_search.py,sha256=N83HiS-IUcFFPPw2F7wyTn0GrrKsq9YbtWuE5iqhAKs,46271
|
|
48
48
|
contentctl/objects/dashboard.py,sha256=GKb_YqZMSP98Y97AlKffJrtVUufZzJag-zdmqRePLZ4,4114
|
|
49
49
|
contentctl/objects/data_source.py,sha256=aRr6lHu-EtGmi6J2nXKD7i2ozUPtp7X-vDkQiutvD3I,1545
|
|
50
50
|
contentctl/objects/deployment.py,sha256=9iFo3iwvBVmBMlW-VhwX4ikbh2shl5cumSPOFMdqT2Q,3044
|
|
@@ -59,7 +59,7 @@ contentctl/objects/detection_metadata.py,sha256=eCsru2cymc3VINjt9MpDyGw2zXa2HyVE
|
|
|
59
59
|
contentctl/objects/detection_stanza.py,sha256=842fHPfGDdddHF5UzgftYr8OlYblWhMWZxPQsTu2wKg,3066
|
|
60
60
|
contentctl/objects/detection_tags.py,sha256=iozG-McM6VRYuqWHhQXvKD_iVyug2rdofuTf4jeUaG4,11208
|
|
61
61
|
contentctl/objects/drilldown.py,sha256=k_U0-vXKBCKeoUKszQ_0FdYQMq9c9mJ3PsHe6rM2lAA,3914
|
|
62
|
-
contentctl/objects/enums.py,sha256=
|
|
62
|
+
contentctl/objects/enums.py,sha256=teR7tf5mUc60B5DjIhDsczbsOUJRkkOu--oh_id9JQk,14221
|
|
63
63
|
contentctl/objects/errors.py,sha256=WURmJCqhy2CZNXXCypXVtwnjSBx-VIcB6W9oFJmzoFk,5762
|
|
64
64
|
contentctl/objects/event_source.py,sha256=G9P7rtcN5hcBNQx6DG37mR3QyQufx--T6kgQGNqQuKk,415
|
|
65
65
|
contentctl/objects/integration_test.py,sha256=UBBx85f517MpQXOM7-iEasACEQ0-Ia7W4rDChOHZfno,1319
|
|
@@ -93,8 +93,8 @@ contentctl/objects/unit_test_result.py,sha256=POQfvvPpSw-jQzINBz1_IszUMJ4Wbopu8H
|
|
|
93
93
|
contentctl/output/api_json_output.py,sha256=n3OTd5z-Vkmsn7ny6QCAar_jSMNuuJfzAQa7xq_9if4,9085
|
|
94
94
|
contentctl/output/attack_nav_output.py,sha256=95iKV8U9BMMgqh6cCOw1S89Ln73xmJGgJPHTYR0L7hA,2304
|
|
95
95
|
contentctl/output/attack_nav_writer.py,sha256=64ILZLmNbh2XLmbopgENkeo6t-4SRRG8xZXBmtpNd4g,2219
|
|
96
|
-
contentctl/output/conf_output.py,sha256=
|
|
97
|
-
contentctl/output/conf_writer.py,sha256=
|
|
96
|
+
contentctl/output/conf_output.py,sha256=tJRFWSswl-XAkcggstkR-tiQUL9en4Z4x-KBZTQCQYg,10170
|
|
97
|
+
contentctl/output/conf_writer.py,sha256=LgkVrJuG1PAnilTyh3DhraNJiG2o-h19_1JU2M_7zB0,13115
|
|
98
98
|
contentctl/output/data_source_writer.py,sha256=ubFjm6XJ4T2d3oqfKwDFasITHeDj3HFmegqVN--5_ME,1635
|
|
99
99
|
contentctl/output/detection_writer.py,sha256=AzxbssNLmsNIOaYKotew5-ONoyq1cQpKSGy3pe191B0,960
|
|
100
100
|
contentctl/output/doc_md_output.py,sha256=gf7osH1uSrC6js3D_I72g4uDe9TaB3tsvtqCHi5znp0,3238
|
|
@@ -105,8 +105,8 @@ contentctl/output/svg_output.py,sha256=T2p4S085MKj5VPZKvo4tWBVOmYme32J9L7kMEBm3S
|
|
|
105
105
|
contentctl/output/templates/analyticstories_detections.j2,sha256=TZHnWEPWWwMjGgPswMoT9Dcfqs2X2E1lJCVXYwqveHY,970
|
|
106
106
|
contentctl/output/templates/analyticstories_investigations.j2,sha256=kqy9lR6W3avqETCM2tSZ8WWOlfiyOtFv6G5N4SZWSaQ,527
|
|
107
107
|
contentctl/output/templates/analyticstories_stories.j2,sha256=4rS-oN6JHAVKF3ToMxzHqK7asytw1R4OQmZGtzdRRBI,663
|
|
108
|
-
contentctl/output/templates/app.conf.j2,sha256=
|
|
109
|
-
contentctl/output/templates/app.manifest.j2,sha256=
|
|
108
|
+
contentctl/output/templates/app.conf.j2,sha256=UL80Px4IUGPD-DgcAiUrS4emHBIY7DxleSNyNXCH5tQ,623
|
|
109
|
+
contentctl/output/templates/app.manifest.j2,sha256=Q1803mcfgNvUs8s4e1zD1J3_mxfPYVtLkD8fhCO6d-I,1103
|
|
110
110
|
contentctl/output/templates/collections.j2,sha256=rDpAcqM6hRiyCQPgfRh8KcL41Mrqsc97krQ-JPFhSBQ,181
|
|
111
111
|
contentctl/output/templates/content-version.j2,sha256=2-it0TF5BvqUcmUXVFB4DEh0I01igQGDxZNJpdtDFIA,54
|
|
112
112
|
contentctl/output/templates/detection_count.j2,sha256=9U3o-P_ECkMknsooj_L3B9GZqjnsbaEzr59s3-DOK0I,670
|
|
@@ -127,6 +127,7 @@ contentctl/output/templates/panel.j2,sha256=Cw_W6p-14n6UivVfpS75KKJiJ2VpdGsSBceY
|
|
|
127
127
|
contentctl/output/templates/savedsearches_baselines.j2,sha256=BfpNrApucyByZHYW-Az63NO7hXBRYtlQCZcgBcLDv60,1683
|
|
128
128
|
contentctl/output/templates/savedsearches_detections.j2,sha256=WEpY9C81cifCM0ZC_pubn9pNIXcnPPhQGSrmr79j1aI,6672
|
|
129
129
|
contentctl/output/templates/savedsearches_investigations.j2,sha256=3jWg3OEwnexZxebpyP9_7lbZI407e5rlx1-epRs1Kpc,1170
|
|
130
|
+
contentctl/output/templates/server.conf.j2,sha256=sPZUkiuJNGm9R8rpjfRKyuAvmmQb0C4w9Q6hpmvmPeU,127
|
|
130
131
|
contentctl/output/templates/transforms.j2,sha256=-cSoie0LgJwibtW-GMhc9BQlmS6h1s1Vykm9O2M0f9Y,1456
|
|
131
132
|
contentctl/output/templates/workflow_actions.j2,sha256=DFoZVnCa8dMRHjW2AdpoydBC0THgiH_W-Nx7WI4-uR4,925
|
|
132
133
|
contentctl/output/yml_output.py,sha256=xtTD3f_WWy8O6Joi4S8gG9paot8JpQFRlwt17_ek5B4,2682
|
|
@@ -138,15 +139,13 @@ contentctl/templates/app_template/README/essoc_summary.txt,sha256=u6wYNYBqmmm7Kn
|
|
|
138
139
|
contentctl/templates/app_template/README/essoc_usage_dashboard.txt,sha256=xYUKKVtdgzPyT3mqdTccaBZuwWnC63lbc9zyYpmHN4o,2432
|
|
139
140
|
contentctl/templates/app_template/README.md,sha256=RT-J9bgRSFsEFgNr9qV6yc2LkfUH_uiMJ2RV4NM9Ymo,366
|
|
140
141
|
contentctl/templates/app_template/default/analytic_stories.conf,sha256=zWuCOOl8SiP7Kit2s-de4KRu3HySLtBSXcp1QnJx0ec,168
|
|
141
|
-
contentctl/templates/app_template/default/app.conf,sha256=PrW8TosZ5oVBfpB0SoLxa5vk2ewEAbVKQ6rG8g5WDSQ,654
|
|
142
142
|
contentctl/templates/app_template/default/commands.conf,sha256=U2ccwUeGXKKKt5jo14QY5swi-p9_TSJtaNquOkeF3Yk,319
|
|
143
|
-
contentctl/templates/app_template/default/content-version.conf,sha256=TGzX6qLdzRK7x6b0y5AE8ZF59PLU-DrRfS43fVWITqo,34
|
|
144
143
|
contentctl/templates/app_template/default/data/ui/nav/default.xml,sha256=fKN53HZCtNJbQqq_5pP8e5-5m30DRrJittr6q5s6V_0,236
|
|
145
144
|
contentctl/templates/app_template/default/data/ui/views/escu_summary.xml,sha256=jQhkIthPgEEptCJ2wUCj2lWGHBvUl6JGsKkDfONloxI,8635
|
|
146
145
|
contentctl/templates/app_template/default/data/ui/views/feedback.xml,sha256=uM71EMK2uFz8h68nOTNKGnYxob3HhE_caSL6yA-3H-k,696
|
|
147
146
|
contentctl/templates/app_template/default/use_case_library.conf,sha256=zWuCOOl8SiP7Kit2s-de4KRu3HySLtBSXcp1QnJx0ec,168
|
|
148
147
|
contentctl/templates/app_template/lookups/mitre_enrichment.csv,sha256=tifPQjFoQHtvpb78hxSP2fKHnHeehNbZDwUjdvc0aEM,66072
|
|
149
|
-
contentctl/templates/app_template/metadata/default.meta,sha256=
|
|
148
|
+
contentctl/templates/app_template/metadata/default.meta,sha256=h66ea1l3qMzDRgDUAXsJvGKeJnp5w-s2unYMZ9dJLzM,433
|
|
150
149
|
contentctl/templates/app_template/static/appIcon.png,sha256=jcJ1PNdkBX7Kl_y9Tf0SZ55OJYA2PpwjvkVvBt9_OoE,3658
|
|
151
150
|
contentctl/templates/app_template/static/appIconAlt.png,sha256=uRXjoHQQjs0-BxcK-3KNBEdck1adDNTHMvV14xR4W0g,2656
|
|
152
151
|
contentctl/templates/app_template/static/appIconAlt_2x.png,sha256=I0m-CPRqq7ak9NJQZGGmz6Ac4pmzFV_SonOUxOEDOFs,7442
|
|
@@ -167,8 +166,8 @@ contentctl/templates/detections/web/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
|
|
|
167
166
|
contentctl/templates/macros/security_content_ctime.yml,sha256=Gg1YNllHVsX_YB716H1SJLWzxXZEfuJlnsgB2fuyoHU,159
|
|
168
167
|
contentctl/templates/macros/security_content_summariesonly.yml,sha256=9BYUxAl2E4Nwh8K19F3AJS8Ka7ceO6ZDBjFiO3l3LY0,162
|
|
169
168
|
contentctl/templates/stories/cobalt_strike.yml,sha256=rlaXxMN-5k8LnKBLPafBoksyMtlmsPMHPJOjTiMiZ-M,3063
|
|
170
|
-
contentctl-4.4.
|
|
171
|
-
contentctl-4.4.
|
|
172
|
-
contentctl-4.4.
|
|
173
|
-
contentctl-4.4.
|
|
174
|
-
contentctl-4.4.
|
|
169
|
+
contentctl-4.4.4.dist-info/LICENSE.md,sha256=hQWUayRk-pAiOZbZnuy8djmoZkjKBx8MrCFpW-JiOgo,11344
|
|
170
|
+
contentctl-4.4.4.dist-info/METADATA,sha256=3zRhuCBmek4vTGSvBroXV4tHTIfmEpPugsxFRu4XBlY,21536
|
|
171
|
+
contentctl-4.4.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
172
|
+
contentctl-4.4.4.dist-info/entry_points.txt,sha256=5bjZ2NkbQfSwK47uOnA77yCtjgXhvgxnmCQiynRF_-U,57
|
|
173
|
+
contentctl-4.4.4.dist-info/RECORD,,
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
## Splunk app configuration file
|
|
2
|
-
|
|
3
|
-
[install]
|
|
4
|
-
is_configured = false
|
|
5
|
-
state = enabled
|
|
6
|
-
state_change_requires_restart = false
|
|
7
|
-
build = 16367
|
|
8
|
-
|
|
9
|
-
[triggers]
|
|
10
|
-
reload.analytic_stories = simple
|
|
11
|
-
reload.use_case_library = simple
|
|
12
|
-
reload.correlationsearches = simple
|
|
13
|
-
reload.analyticstories = simple
|
|
14
|
-
reload.governance = simple
|
|
15
|
-
reload.managed_configurations = simple
|
|
16
|
-
reload.postprocess = simple
|
|
17
|
-
reload.content-version = simple
|
|
18
|
-
reload.es_investigations = simple
|
|
19
|
-
|
|
20
|
-
[launcher]
|
|
21
|
-
author = Splunk
|
|
22
|
-
version = 4.9.0
|
|
23
|
-
description = Explore the Analytic Stories included with ES Content Updates.
|
|
24
|
-
|
|
25
|
-
[ui]
|
|
26
|
-
is_visible = true
|
|
27
|
-
label = ES Content Updates
|
|
28
|
-
|
|
29
|
-
[package]
|
|
30
|
-
id = DA-ESS-ContentUpdate
|
|
File without changes
|
|
File without changes
|
|
File without changes
|