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.
@@ -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.writeAppConf())
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:
@@ -1,38 +1,55 @@
1
- from dataclasses import dataclass
2
- from contentctl.input.director import DirectorInputDto
3
- from contentctl.output.conf_output import ConfOutput
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, input_dto: ACSDeployInputDto) -> None:
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
- appinspect_token = conf_output.inspectAppAPI(input_dto.splunk_api_username, input_dto.splunk_api_password, input_dto.stack_type)
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
- if input_dto.splunk_cloud_jwt_token is None or input_dto.splunk_cloud_stack is None:
27
- if input_dto.splunk_cloud_jwt_token is None:
28
- raise Exception("Cannot deploy app via ACS, --splunk_cloud_jwt_token was not defined on command line.")
29
- else:
30
- raise Exception("Cannot deploy app via ACS, --splunk_cloud_stack was not defined on command line.")
31
-
32
- conf_output.deploy_via_acs(input_dto.splunk_cloud_jwt_token,
33
- input_dto.splunk_cloud_stack,
34
- appinspect_token,
35
- input_dto.stack_type)
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
- #This is a bit challenging to get to work with the default values.
99
- raise Exception("deploy acs not yet implemented")
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:
@@ -294,6 +294,7 @@ class StackType(StrEnum):
294
294
 
295
295
 
296
296
  class inspect(build):
297
+
297
298
  splunk_api_username: str = Field(
298
299
  description="Splunk API username used for appinspect and Splunkbase downloads."
299
300
  )
@@ -264,7 +264,7 @@ class CorrelationSearch(BaseModel):
264
264
  :returns: the search path
265
265
  :rtype: str
266
266
  """
267
- return f"/saved/searches/{self.name}"
267
+ return f"saved/searches/{self.name}"
268
268
 
269
269
  @computed_field
270
270
  @cached_property
@@ -330,7 +330,6 @@ class SecurityDomain(str, enum.Enum):
330
330
  IDENTITY = "identity"
331
331
  ACCESS = "access"
332
332
  AUDIT = "audit"
333
- CLOUD = "cloud"
334
333
 
335
334
  class AssetType(str, enum.Enum):
336
335
  AWS_ACCOUNT = "AWS Account"
@@ -57,19 +57,26 @@ class ConfOutput:
57
57
  pass
58
58
 
59
59
 
60
- def writeAppConf(self)->set[pathlib.Path]:
60
+
61
+
62
+ def writeMiscellaneousAppFiles(self)->set[pathlib.Path]:
61
63
  written_files:set[pathlib.Path] = set()
62
- for output_app_path, template_name in [ ("default/app.conf", "app.conf.j2"),
63
- ("default/content-version.conf", "content-version.j2")]:
64
- written_files.add(ConfWriter.writeConfFile(pathlib.Path(output_app_path),
65
- template_name,
66
- self.config,
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
 
@@ -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 = {{ objects[0].build }}
7
+ build = {{ app.build }}
8
8
 
9
9
  [triggers]
10
- reload.analytic_stories = simple
11
- reload.usage_searches = simple
12
- reload.use_case_library = simple
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 = {{ objects[0].author_company }}
23
- version = {{ objects[0].version }}
24
- description = {{ objects[0].description | escapeNewlines() }}
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 = {{ objects[0].title }}
21
+ label = {{ app.title }}
29
22
 
30
23
  [package]
31
- id = {{ objects[0].appid }}
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,5 +1,6 @@
1
1
  {
2
- "schemaVersion": "1.0.0",
2
+ "schemaVersion": "1.0.0",
3
+ "targetWorkloads": ["_search_heads"],
3
4
  "info": {
4
5
  "title": "{{ objects[0].title }}",
5
6
  "id": {
@@ -0,0 +1,4 @@
1
+ [shclustering]
2
+ {% for custom_conf_file in custom_conf_files%}
3
+ conf_replication_include.{{custom_conf_file}} = true
4
+ {% endfor %}
@@ -1,6 +1,6 @@
1
1
  ## shared Application-level permissions
2
2
  []
3
- access = read : [ * ], write : [ admin ]
3
+ access = read : [ * ], write : [ admin, sc_admin ]
4
4
  export = system
5
5
 
6
6
  [savedsearches]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: contentctl
3
- Version: 4.4.1
3
+ Version: 4.4.4
4
4
  Summary: Splunk Content Control Tool
5
5
  License: Apache 2.0
6
6
  Author: STRT
@@ -1,6 +1,6 @@
1
1
  contentctl/__init__.py,sha256=IMjkMO3twhQzluVTo8Z6rE7Eg-9U79_LGKMcsWLKBkY,22
2
- contentctl/actions/build.py,sha256=htuFSKjavKOSUMxcjw7y84teLI6XFkG_U7cnLn5eGnA,5173
3
- contentctl/actions/deploy_acs.py,sha256=mf3uk495H1EU_LNN-TiOsYCo18HMGoEBMb6ojeTr0zw,1418
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=CLYQ1kpVcUkOXPGrGyE7SwAkEtvjq2kHENWyy81gwsM,10400
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=XYkDRHeULwCzOfYKnj8xsLcHrZ_HdUlR-XsO0mupXGo,50474
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=_BlHgLmmY5OdrV3f301radrH1cE2Gpr1GqVTmCxWP44,46272
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=wwPC9IWOMxdZrFhXM-nDEnSvMvY8nN9Md5Mt9ELiYG0,14241
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=gmO180RpPPB1H1_tkNpQERkai--l0iRS7qV-kMtFir0,10136
97
- contentctl/output/conf_writer.py,sha256=o0lpCGKuOtFrf_7uV4Qq8nCBL69fivCkEavmxGXFuvs,9575
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=Y9vDwdU1yRTQZ7jBQWLFo0XAEerN_6IXrkXdS3xkcuM,737
109
- contentctl/output/templates/app.manifest.j2,sha256=n9TBpikEOD-HQzsad4Fmd0iH5cosRQ12SiXXYZhcO0g,1063
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=tcYHZkDF44ApDoDQ_rp8MCA8cuT3DVd5atHgulR1Tvc,423
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.1.dist-info/LICENSE.md,sha256=hQWUayRk-pAiOZbZnuy8djmoZkjKBx8MrCFpW-JiOgo,11344
171
- contentctl-4.4.1.dist-info/METADATA,sha256=zVFQfn81KezVcmp4T2cbTvaX3Abvvtp-qnp5p3NWpAo,21536
172
- contentctl-4.4.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
173
- contentctl-4.4.1.dist-info/entry_points.txt,sha256=5bjZ2NkbQfSwK47uOnA77yCtjgXhvgxnmCQiynRF_-U,57
174
- contentctl-4.4.1.dist-info/RECORD,,
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
@@ -1,2 +0,0 @@
1
- [content-version]
2
- version = 4.9.0