devsecops-engine-tools 1.7.27__py3-none-any.whl → 1.7.29__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.

Potentially problematic release.


This version of devsecops-engine-tools might be problematic. Click here for more details.

@@ -36,7 +36,7 @@ class S3Manager(MetricsManagerGateway):
36
36
  aws_session_token=temp_credentials["SessionToken"],
37
37
  )
38
38
  date = datetime.datetime.now()
39
- path_bucket = f'{tool}/{date.strftime("%Y")}/{date.strftime("%m")}/{date.strftime("%d")}/{file_path.split("/")[-1]}'
39
+ path_bucket = f'engine_tools/{tool}/{date.strftime("%Y")}/{date.strftime("%m")}/{date.strftime("%d")}/{file_path.split("/")[-1]}'
40
40
 
41
41
  data = self._get_s3_data(
42
42
  client, config_tool["METRICS_MANAGER"]["AWS"]["BUCKET"], path_bucket
@@ -4,14 +4,23 @@ from devsecops_engine_tools.engine_sast.engine_iac.src.infrastructure.entry_poin
4
4
  from devsecops_engine_tools.engine_sast.engine_iac.src.infrastructure.driven_adapters.checkov.checkov_tool import (
5
5
  CheckovTool
6
6
  )
7
+ from devsecops_engine_tools.engine_sast.engine_iac.src.infrastructure.driven_adapters.kubescape.kubescape_tool import (
8
+ KubescapeTool
9
+ )
7
10
 
8
11
 
9
12
  def runner_engine_iac(dict_args, tool, secret_tool, devops_platform_gateway, env):
10
13
  try:
11
14
  # Define driven adapters for gateways
12
15
  tool_gateway = None
13
- if (tool == "CHECKOV"):
14
- tool_gateway = CheckovTool()
16
+
17
+ tools = {
18
+ "CHECKOV": CheckovTool(),
19
+ "KUBESCAPE": KubescapeTool(),
20
+ }
21
+
22
+ if tool in tools:
23
+ tool_gateway = tools[tool]
15
24
 
16
25
  return init_engine_sast_rm(
17
26
  devops_platform_gateway=devops_platform_gateway,
@@ -0,0 +1,75 @@
1
+ from devsecops_engine_tools.engine_core.src.domain.model.finding import (
2
+ Category,
3
+ Finding,
4
+ )
5
+ from datetime import datetime
6
+ from dataclasses import dataclass
7
+
8
+
9
+ @dataclass
10
+ class KubescapeDeserealizator:
11
+ def get_list_finding(self, results_scan_list: list) -> "list[Finding]":
12
+ list_open_findings = []
13
+
14
+ for result in results_scan_list:
15
+ finding_open = Finding(
16
+ id=result.get("id"),
17
+ cvss=None,
18
+ where=result.get("where"),
19
+ description=result.get("description"),
20
+ severity=result.get("severity").lower(),
21
+ identification_date=datetime.now().strftime("%d%m%Y"),
22
+ published_date_cve=None,
23
+ module="engine_iac",
24
+ category=Category.VULNERABILITY,
25
+ requirements=None,
26
+ tool="kubescape"
27
+ )
28
+ list_open_findings.append(finding_open)
29
+
30
+ return list_open_findings
31
+
32
+ def extract_failed_controls(self, data):
33
+ result_extracted_data = []
34
+ results = data.get("results", [])
35
+ resources = {resource.get("resourceID"): resource for resource in data.get("resources", [])}
36
+ frameworks = data.get("summaryDetails", {}).get("frameworks", [])
37
+
38
+ for result in results:
39
+ resource_id = result.get("resourceID")
40
+ controls = result.get("controls", [])
41
+
42
+ for control in controls:
43
+ if control.get("status", {}).get("status") == "failed":
44
+ control_id = control.get("controlID")
45
+ name = control.get("name")
46
+ resource = resources.get(resource_id)
47
+
48
+ if resource:
49
+ relative_path = resource.get("source", {}).get("path", "").replace("\\", "/")
50
+ severity_score = self.get_severity_score(frameworks, control_id)
51
+
52
+ result_extracted_data.append({
53
+ "id": control_id,
54
+ "description": name,
55
+ "where": relative_path,
56
+ "severity": severity_score
57
+ })
58
+
59
+ return result_extracted_data
60
+
61
+ def get_severity_score(self, frameworks, control_id):
62
+ classifications = {
63
+ (0.0, 0.0): "none",
64
+ (0.1, 3.9): "low",
65
+ (4.0, 6.9): "medium",
66
+ (7.0, 8.9): "high",
67
+ (9.0, 10.0): "critical"
68
+ }
69
+ for framework in frameworks:
70
+ control_object = framework.get("controls", {}).get(control_id, {})
71
+ if control_object:
72
+ for range_tuple, classification in classifications.items():
73
+ if range_tuple[0] <= control_object.get("scoreFactor", 0.0) <= range_tuple[1]:
74
+ return classification
75
+ return None
@@ -0,0 +1,123 @@
1
+ import json
2
+ import subprocess
3
+ import platform
4
+ import requests
5
+ import distro
6
+ import os
7
+ from devsecops_engine_tools.engine_sast.engine_iac.src.domain.model.gateways.tool_gateway import (
8
+ ToolGateway,
9
+ )
10
+ from devsecops_engine_tools.engine_sast.engine_iac.src.domain.model.config_tool import (
11
+ ConfigTool,
12
+ )
13
+ from devsecops_engine_tools.engine_sast.engine_iac.src.infrastructure.driven_adapters.kubescape.kubescape_deserealizator import (
14
+ KubescapeDeserealizator,
15
+ )
16
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
17
+ from devsecops_engine_tools.engine_utilities import settings
18
+
19
+ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
20
+
21
+
22
+ class KubescapeTool(ToolGateway):
23
+
24
+ def download_tool(self, file, url):
25
+ try:
26
+ response = requests.get(url, allow_redirects=True)
27
+ with open(file, "wb") as binary_file:
28
+ binary_file.write(response.content)
29
+ except Exception as e:
30
+ logger.error(f"Error downloading Kubescape: {e}")
31
+
32
+ def install_tool(self, file, url):
33
+ installed = subprocess.run(
34
+ ["which", f"./{file}"],
35
+ stdout=subprocess.PIPE,
36
+ stderr=subprocess.PIPE,
37
+ )
38
+ if installed.returncode == 1:
39
+ try:
40
+ self.download_tool(file, url)
41
+ subprocess.run(["chmod", "+x", f"./{file}"])
42
+
43
+ except Exception as e:
44
+ logger.error(f"Error installing Kubescape: {e}")
45
+
46
+ def install_tool_windows(self, file, url):
47
+ try:
48
+ subprocess.run(
49
+ [f"./{file}", "version"],
50
+ stdout=subprocess.PIPE,
51
+ stderr=subprocess.PIPE,
52
+ )
53
+ except:
54
+ try:
55
+ self.download_tool(file, url)
56
+
57
+ except Exception as e:
58
+ logger.error(f"Error installing Kubescape: {e}")
59
+
60
+ def execute_kubescape(self, folders_to_scan, prefix):
61
+ command = [prefix, "scan"] + folders_to_scan + ["--format", "json", "--format-version", "v2", "--output",
62
+ "results_kubescape.json", "-v"]
63
+ try:
64
+ subprocess.run(command, capture_output=True)
65
+ except subprocess.CalledProcessError as e:
66
+ logger.error(f"Error during Kubescape execution: {e}")
67
+
68
+ def load_json(self, json_name):
69
+ try:
70
+ with open(json_name) as file:
71
+ return json.load(file)
72
+ except FileNotFoundError:
73
+ logger.error(f"The file {json_name} does not exist.")
74
+ except json.JSONDecodeError:
75
+ logger.error("The JSON result is empty.")
76
+ return None
77
+
78
+ def select_operative_system(self, os_platform, folders_to_scan, base_url):
79
+ if os_platform == "Linux":
80
+ distro_name = distro.name()
81
+ if distro_name == "Ubuntu":
82
+ file = "kubescape-ubuntu-latest"
83
+ self.install_tool(file, base_url + file)
84
+ command_prefix = f"./{file}"
85
+ else:
86
+ logger.warning(f"{distro_name} is not supported.")
87
+ return None
88
+ elif os_platform == "Windows":
89
+ file = "kubescape-windows-latest.exe"
90
+ self.install_tool_windows(file, base_url + file)
91
+ command_prefix = f"./{file}"
92
+ elif os_platform == "Darwin":
93
+ file = "kubescape-macos-latest"
94
+ self.install_tool(file, base_url + file)
95
+ command_prefix = f"./{file}"
96
+ else:
97
+ logger.warning(f"{os_platform} is not supported.")
98
+ return [], None
99
+
100
+ self.execute_kubescape(folders_to_scan, command_prefix)
101
+
102
+ def run_tool(self, config_tool: ConfigTool, folders_to_scan, environment, platform_to_scan, secret_tool):
103
+
104
+ if folders_to_scan and "k8s" in platform_to_scan:
105
+
106
+ kubescape_version = config_tool.version
107
+ os_platform = platform.system()
108
+ base_url = f"https://github.com/kubescape/kubescape/releases/download/v{kubescape_version}/"
109
+ self.select_operative_system(os_platform, folders_to_scan, base_url)
110
+
111
+ json_name = "results_kubescape.json"
112
+ data = self.load_json(json_name)
113
+
114
+ if not data:
115
+ return [], None
116
+ else:
117
+ kubescape_deserealizator = KubescapeDeserealizator()
118
+ result_extracted_data = kubescape_deserealizator.extract_failed_controls(data)
119
+ finding_list = kubescape_deserealizator.get_list_finding(result_extracted_data)
120
+ path_results = os.path.abspath(json_name)
121
+ return finding_list, path_results
122
+ else:
123
+ return [], None
@@ -71,4 +71,4 @@ def update_fields(check_result, rules_doc):
71
71
  if "category" in rule_info:
72
72
  check_result["bc_category"] = rule_info["category"]
73
73
 
74
- return check_result
74
+ return check_result
@@ -1 +1 @@
1
- version = '1.7.27'
1
+ version = '1.7.29'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: devsecops-engine-tools
3
- Version: 1.7.27
3
+ Version: 1.7.29
4
4
  Summary: Tool for DevSecOps strategy
5
5
  Home-page: https://github.com/bancolombia/devsecops-engine-tools
6
6
  Author: Bancolombia DevSecOps Team
@@ -64,7 +64,7 @@ pip3 install devsecops-engine-tools
64
64
  ### Scan running - flags (CLI)
65
65
 
66
66
  ```bash
67
- devsecops-engine-tools --platform_devops ["local","azure","github"] --remote_config_repo ["remote_config_repo"] --tool ["engine_iac", "engine_dast", "engine_secret", "engine_dependencies", "engine_container"] --folder_path ["Folder path scan engine_iac"] --platform ["eks","openshift"] --use_secrets_manager ["false", "true"] --use_vulnerability_management ["false", "true"] --send_metrics ["false", "true"] --token_cmdb ["token_cmdb"] --token_vulnerability_management ["token_vulnerability_management"] --token_engine_container ["token_engine_container"] --token_engine_dependencies ["token_engine_dependencies"]
67
+ devsecops-engine-tools --platform_devops ["local","azure","github"] --remote_config_repo ["remote_config_repo"] --tool ["engine_iac", "engine_dast", "engine_secret", "engine_dependencies", "engine_container"] --folder_path ["Folder path scan engine_iac"] --platform ["k8s","cloudformation","docker", "openapi"] --use_secrets_manager ["false", "true"] --use_vulnerability_management ["false", "true"] --send_metrics ["false", "true"] --token_cmdb ["token_cmdb"] --token_vulnerability_management ["token_vulnerability_management"] --token_engine_container ["token_engine_container"] --token_engine_dependencies ["token_engine_dependencies"]
68
68
  ```
69
69
 
70
70
  ### Structure Remote Config
@@ -87,6 +87,51 @@ devsecops-engine-tools --platform_devops ["local","azure","github"] --remote_con
87
87
  ┃ ┗ 📜ConfigTool.json
88
88
  ┃ ┗ 📜Exclusions.json
89
89
  ```
90
+
91
+ #### Tools available for the modules (Configuration engine_core/ConfigTool.json)
92
+
93
+
94
+ <table>
95
+ <tr>
96
+ <th>Module</th>
97
+ <th>Tool</th>
98
+ <th>Type</th>
99
+ </tr>
100
+ <tr>
101
+ <td rowspan="2">ENGINE_IAC</td>
102
+ <td><a href="https://www.checkov.io/">CHECKOV</a></td>
103
+ <td>Free</td>
104
+ </tr>
105
+ <tr>
106
+ <td><a href="https://kubescape.io/">KUBESCAPE</a></td>
107
+ <td>Free</td>
108
+ </tr>
109
+ <tr>
110
+ <td>ENGINE_DAST</td>
111
+ <td><a href="https://projectdiscovery.io/nuclei">NUCLEI</a></td>
112
+ <td>Free</td>
113
+ </tr>
114
+ <tr>
115
+ <td>ENGINE_SECRET</td>
116
+ <td><a href="https://trufflesecurity.com/trufflehog">TRUFFLEHOG</a></td>
117
+ <td>Free</td>
118
+ </tr>
119
+ <tr>
120
+ <td rowspan="2">ENGINE_CONTAINER</td>
121
+ <td><a href="https://www.paloaltonetworks.com/prisma/cloud">PRISMA</a></td>
122
+ <td>Paid</td>
123
+ </tr>
124
+ <tr>
125
+ <td><a href="https://trivy.dev/">TRIVY</a></td>
126
+ <td>Free</td>
127
+ </tr>
128
+ <tr>
129
+ <td>ENGINE_DEPENDENCIES</td>
130
+ <td><a href="https://jfrog.com/help/r/get-started-with-the-jfrog-platform/jfrog-xray">XRAY</a></td>
131
+ <td>Paid</td>
132
+ </tr>
133
+ </table>
134
+
90
135
  ### Scan running sample (CLI) - Local
91
136
 
92
137
  > Complete the value in **.envdetlocal** file a set in execution environment
@@ -114,8 +159,3 @@ With the flag **--send_metrics true** and the configuration of the AWS-METRICS_M
114
159
  # How can I help?
115
160
 
116
161
  Review the issues, we hear new ideas. Read more [Contributing](https://github.com/bancolombia/devsecops-engine-tools/blob/trunk/docs/CONTRIBUTING.md)
117
-
118
-
119
-
120
-
121
-
@@ -1,5 +1,5 @@
1
1
  devsecops_engine_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- devsecops_engine_tools/version.py,sha256=tS73L7HW5b7kyw7DYnu-YWbv9fwE8RiAJXc_bKgqsEQ,19
2
+ devsecops_engine_tools/version.py,sha256=1ZRQMXakbKgdqgC-xNRAgwTBDcQ7kv9IvKeDbDzIzfw,19
3
3
  devsecops_engine_tools/engine_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  devsecops_engine_tools/engine_core/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  devsecops_engine_tools/engine_core/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -31,7 +31,7 @@ devsecops_engine_tools/engine_core/src/domain/usecases/metrics_manager.py,sha256
31
31
  devsecops_engine_tools/engine_core/src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/s3_manager.py,sha256=etwlfVgW8i0xs2Fv493LRewhCALkLK2ewLfIc_Kd-Ag,1913
34
+ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/s3_manager.py,sha256=-9gFDcvOIiXDIv4TUXR9zP83GBgR3v-xgp3QgcoaCo4,1926
35
35
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/secrets_manager.py,sha256=YW5n1SkeZFCNqFK8RCPmUxdy1NNEiOc-tHcYzSVAJOM,1658
36
36
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/azure_devops.py,sha256=Ot1j5my-iEpU-ZYy9yNXkwmwLOmJ3f95JyyAUcpFN5g,4967
@@ -81,7 +81,7 @@ devsecops_engine_tools/engine_sast/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQe
81
81
  devsecops_engine_tools/engine_sast/engine_iac/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
82
  devsecops_engine_tools/engine_sast/engine_iac/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  devsecops_engine_tools/engine_sast/engine_iac/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- devsecops_engine_tools/engine_sast/engine_iac/src/applications/runner_iac_scan.py,sha256=WDHRpcbF80gv6Rv4U0l0HtM85_H4WrY-YCW6JfpuRPo,909
84
+ devsecops_engine_tools/engine_sast/engine_iac/src/applications/runner_iac_scan.py,sha256=6iHwgOQLu3rXyyQrlt7gxAsfOlLwupvyum7ejziX-dg,1151
85
85
  devsecops_engine_tools/engine_sast/engine_iac/src/deployment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
86
  devsecops_engine_tools/engine_sast/engine_iac/src/deployment/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  devsecops_engine_tools/engine_sast/engine_iac/src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -97,10 +97,13 @@ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters
97
97
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_config.py,sha256=qbE6wUO5_WFXF_QolL0JYelaRGEOUakPEZR_6HAKzzI,4355
98
98
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_deserealizator.py,sha256=gBwnQ20QExHTrN1nvErUUqb_IMHvYKJijqc55XwZHQk,1404
99
99
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_tool.py,sha256=ddPjhbOe2w-kQmiBLP6udBPmXZhVZqQLwOEdgvt1r1s,7664
100
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_deserealizator.py,sha256=i-hKFmR-OriwiiBg-3E3RKc7hjI1E8jv8Z7dQ8_Q0qE,2885
102
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_tool.py,sha256=wcornvTaU5o2MtZj_KkgWvNABW2rCd08sZkaMbbZoTI,4707
100
103
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
104
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/entry_points/entry_point_tool.py,sha256=60iaHYZZp5uTngD7a8vsQaQYsTfBzP_kp0xflfPNnk4,305
102
105
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
- devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/helpers/file_generator_tool.py,sha256=lim8ARYvVT6a2Affqw4QVxhV_wq3aKiGf-2VUskSXII,3083
106
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/helpers/file_generator_tool.py,sha256=stC0z4e20DGRAjKMp7q7cYSYkEXssvnSeGEB0xhbXSo,3084
104
107
  devsecops_engine_tools/engine_sast/engine_secret/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
108
  devsecops_engine_tools/engine_sast/engine_secret/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
109
  devsecops_engine_tools/engine_sast/engine_secret/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -244,8 +247,8 @@ devsecops_engine_tools/engine_utilities/utils/logger_info.py,sha256=4Mz8Bwlm9Mku
244
247
  devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGaxYSDe0ZRh6VHRf53H4sXPcb-vNP_i81PUn3I,307
245
248
  devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=GAslbWaBpwP3mP6fBsgVl07TTBgcCggQTy8h2M9ibeo,612
246
249
  devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=yNtlT-8Legz1sHbGPH8LNYjL-LgDUE0zXG2rYjiab7U,290
247
- devsecops_engine_tools-1.7.27.dist-info/METADATA,sha256=yyEYt9tWJu9wMI0XUPFo5jqD_V_3oE0jCGnb--2KBsE,4881
248
- devsecops_engine_tools-1.7.27.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
249
- devsecops_engine_tools-1.7.27.dist-info/entry_points.txt,sha256=9IjXF_7Zpgowq_SY6OSmsA9vZze18a8_AeHwkQVrgKk,131
250
- devsecops_engine_tools-1.7.27.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
251
- devsecops_engine_tools-1.7.27.dist-info/RECORD,,
250
+ devsecops_engine_tools-1.7.29.dist-info/METADATA,sha256=vUeXrSsQrFqqYsv9W4qKTyf9l6-sBll7JOd-yHDG2E0,5969
251
+ devsecops_engine_tools-1.7.29.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
252
+ devsecops_engine_tools-1.7.29.dist-info/entry_points.txt,sha256=9IjXF_7Zpgowq_SY6OSmsA9vZze18a8_AeHwkQVrgKk,131
253
+ devsecops_engine_tools-1.7.29.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
254
+ devsecops_engine_tools-1.7.29.dist-info/RECORD,,