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

@@ -10,6 +10,9 @@ from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.aws.s
10
10
  from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.azure.azure_devops import (
11
11
  AzureDevops,
12
12
  )
13
+ from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.github.github_actions import (
14
+ GithubActions,
15
+ )
13
16
  from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.runtime_local.runtime_local import (
14
17
  RuntimeLocal,
15
18
  )
@@ -45,7 +48,7 @@ def parse_choices(choices):
45
48
  def get_inputs_from_cli(args):
46
49
  parser = argparse.ArgumentParser()
47
50
  parser.add_argument("-v", "--version", action='version', version='{version}'.format(version=version))
48
- parser.add_argument("-pd", "--platform_devops", choices=["azure", "local"], type=str, required=True, help="Platform where is executed")
51
+ parser.add_argument("-pd", "--platform_devops", choices=["azure", "github", "local"], type=str, required=True, help="Platform where is executed")
49
52
  parser.add_argument("-rcf" ,"--remote_config_repo", type=str, required=True, help="Name or Folder Path of Config Repo")
50
53
  parser.add_argument("-t",
51
54
  "--tool",
@@ -114,7 +117,11 @@ def application_core():
114
117
  # Define driven adapters for gateways
115
118
  vulnerability_management_gateway = DefectDojoPlatform()
116
119
  secrets_manager_gateway = SecretsManager()
117
- devops_platform_gateway = AzureDevops() if args["platform_devops"] == "azure" else RuntimeLocal()
120
+ devops_platform_gateway = {
121
+ "azure": AzureDevops(),
122
+ "github": GithubActions(),
123
+ "local": RuntimeLocal()
124
+ }.get(args["platform_devops"])
118
125
  printer_table_gateway = PrinterPrettyTable()
119
126
  metrics_manager_gateway = S3Manager()
120
127
 
@@ -0,0 +1,96 @@
1
+ from dataclasses import dataclass
2
+ from devsecops_engine_tools.engine_core.src.domain.model.gateway.devops_platform_gateway import (
3
+ DevopsPlatformGateway,
4
+ )
5
+ from devsecops_engine_tools.engine_utilities.github.models.GithubPredefinedVariables import (
6
+ BuildVariables,
7
+ SystemVariables,
8
+ ReleaseVariables,
9
+ AgentVariables
10
+ )
11
+ from devsecops_engine_tools.engine_utilities.github.infrastructure.github_api import (
12
+ GithubApi,
13
+ )
14
+ import os
15
+
16
+
17
+ @dataclass
18
+ class GithubActions(DevopsPlatformGateway):
19
+ OKGREEN = "\033[92m"
20
+ FAIL = "\033[91m"
21
+ ENDC = "\033[0m"
22
+ ICON_FAIL = "\u2718"
23
+ ICON_SUCCESS = "\u2714"
24
+
25
+ def get_remote_config(self, repository, path):
26
+
27
+ github_repository = SystemVariables.github_repository.value()
28
+ split = github_repository.split("/")
29
+ owner = split[0]
30
+
31
+ utils_github = GithubApi(
32
+ personal_access_token=SystemVariables.github_access_token.value()
33
+ )
34
+
35
+ git_client = utils_github.get_github_connection()
36
+ json_config = utils_github.get_remote_json_config(git_client, owner, repository, path)
37
+
38
+ return json_config
39
+
40
+ def message(self, type, message):
41
+ formats = {
42
+ "succeeded": f"::group::{message}",
43
+ "info": f"::notice::{message}",
44
+ "warning": f"::warning::{message}",
45
+ "error": f"::error::{message}"
46
+ }
47
+ return formats.get(type, message)
48
+
49
+ def result_pipeline(self, type):
50
+ results = {
51
+ "failed": f"{self.FAIL}{self.ICON_FAIL}Failed{self.ENDC}",
52
+ "succeeded": f"{self.OKGREEN}{self.ICON_SUCCESS}Succeeded{self.ENDC}"
53
+ }
54
+ return results.get(type)
55
+
56
+ def get_source_code_management_uri(self):
57
+ return f"{SystemVariables.github_server_url}/{SystemVariables.github_repository}"
58
+
59
+ def get_base_compact_remote_config_url(self, remote_config_repo):
60
+ github_repository = SystemVariables.github_repository.value()
61
+ split = github_repository.split("/")
62
+ owner = split[0]
63
+ return f"{SystemVariables.github_server_url}/{owner}/{remote_config_repo}"
64
+
65
+ def get_variable(self, variable):
66
+ variable_map = {
67
+ "branch_name": BuildVariables.github_ref,
68
+ "build_id": BuildVariables.github_run_number,
69
+ "build_execution_id": BuildVariables.github_run_id,
70
+ "commit_hash": BuildVariables.github_sha,
71
+ "environment": ReleaseVariables.github_env,
72
+ "release_id": ReleaseVariables.github_run_number,
73
+ "branch_tag": BuildVariables.github_ref,
74
+ "access_token": SystemVariables.github_access_token,
75
+ "organization": f"{SystemVariables.github_server_url}/{SystemVariables.github_repository}",
76
+ "project_name": SystemVariables.github_repository,
77
+ "repository": BuildVariables.github_repository,
78
+ "pipeline_name": (
79
+ BuildVariables.github_workflow
80
+ if SystemVariables.build.value() == "build"
81
+ else ReleaseVariables.github_workflow
82
+ ),
83
+ "stage": SystemVariables.build,
84
+ "path_directory": SystemVariables.github_workspace,
85
+ "os": AgentVariables.runner_os,
86
+ "work_folder": AgentVariables.github_workspace,
87
+ "temp_directory": AgentVariables.runner_tool_cache,
88
+ "agent_directory": AgentVariables.runner_workspace,
89
+ "target_branch": SystemVariables.github_event_base_ref,
90
+ "source_branch": SystemVariables.github_ref,
91
+ "repository_provider": BuildVariables.GitHub,
92
+ }
93
+ try:
94
+ return variable_map.get(variable).value()
95
+ except ValueError:
96
+ return None
@@ -1,7 +1,6 @@
1
1
  from dataclasses import dataclass
2
2
  import os
3
3
  import subprocess
4
- import git
5
4
  from urllib.parse import quote
6
5
  from devsecops_engine_tools.engine_sast.engine_secret.src.domain.model.gateway.git_gateway import GitGateway
7
6
 
@@ -44,15 +43,16 @@ class GitRun(GitGateway):
44
43
  os.chdir(sys_working_dir)
45
44
  subprocess.run(["git", "clone", url_with_token, path_new_folder], capture_output=True, text=True)
46
45
  os.chdir(path_new_folder)
47
-
48
- repository = git.Repo(path_new_folder)
49
-
46
+
50
47
  source_branch = source_branch.replace("refs/heads/", "")
51
- subprocess.run(["git", "checkout", f"origin/{source_branch}"], capture_output=True, text=True)
48
+ subprocess.run(["git", "checkout", "-b", source_branch], capture_output=True, text=True)
49
+ command = ["git","-c","user.email=you@example.com","-c","user.name=Your Name","pull","--rebase","-X", "theirs","--no-edit","origin",source_branch]
50
+ subprocess.run(command, capture_output=True, text=True)
51
+
52
52
  if source_branch != None:
53
- diff = repository.git.diff(f"origin/{source_branch}..origin/{target_branch}", name_only=True)
53
+ diff = subprocess.run(['git', 'diff', '--name-only', f'{source_branch}..{target_branch}'], capture_output=True, text=True)
54
54
  if diff:
55
- diff_files = diff.strip().split("\n")
55
+ diff_files = diff.stdout.strip().split("\n")
56
56
  print("Pull Requests Associated Files:",len(diff_files))
57
57
  return diff_files
58
58
  except Exception as e:
@@ -1,13 +1,16 @@
1
1
  import requests
2
2
  import zipfile
3
+ import json
4
+ from github import Github
5
+ from devsecops_engine_tools.engine_utilities.utils.api_error import ApiError
3
6
 
4
7
 
5
8
  class GithubApi:
6
9
  def __init__(
7
- self,
8
- token: str = ""
10
+ self,
11
+ personal_access_token: str = ""
9
12
  ):
10
- self.token = token
13
+ self.__personal_access_token = personal_access_token
11
14
 
12
15
  def unzip_file(self, zip_file_path, extract_path):
13
16
  with zipfile.ZipFile(zip_file_path, "r") as zip_ref:
@@ -18,7 +21,7 @@ class GithubApi:
18
21
  ):
19
22
  url = f"https://api.github.com/repos/{owner}/{repository}/releases/latest"
20
23
 
21
- headers = {"Authorization": f"token {self.token}"}
24
+ headers = {"Authorization": f"token {self.__personal_access_token}"}
22
25
 
23
26
  response = requests.get(url, headers=headers)
24
27
 
@@ -47,3 +50,19 @@ class GithubApi:
47
50
  print(
48
51
  f"Error getting the assets of the last release. Status code: {response.status_code}"
49
52
  )
53
+
54
+ def get_github_connection(self):
55
+ git_client = Github(self.__personal_access_token)
56
+
57
+ return git_client
58
+
59
+ def get_remote_json_config(self, git_client: Github, owner, repository, path):
60
+ try:
61
+ repo = git_client.get_repo(f"{owner}/{repository}")
62
+ file_content = repo.get_contents(path)
63
+ data = file_content.decoded_content.decode()
64
+ content_json = json.loads(data)
65
+
66
+ return content_json
67
+ except Exception as e:
68
+ raise ApiError("Error getting remote github configuration file: " + str(e))
@@ -0,0 +1,56 @@
1
+ import os
2
+ from enum import Enum
3
+ from devsecops_engine_tools.engine_utilities.input_validations.env_utils import EnvVariables
4
+
5
+
6
+ class EnvVariables:
7
+ @staticmethod
8
+ def get_value(env_name):
9
+ env_var = os.environ.get(env_name)
10
+ if env_var is None:
11
+ raise ValueError(f"La variable de entorno {env_name} no está definida")
12
+ return env_var
13
+
14
+
15
+ class BaseEnum(Enum):
16
+ @property
17
+ def env_name(self):
18
+ return self._value_.replace(".", "_").upper()
19
+
20
+ def value(self):
21
+ return EnvVariables.get_value(self.env_name)
22
+
23
+
24
+ class SystemVariables(BaseEnum):
25
+ github_access_token = "github.access.token"
26
+ github_workspace = "github.workspace"
27
+ build = "build"
28
+ github_server_url = "github.server.url"
29
+ github_repository = "github.repository"
30
+ github_event_number = "github.event.number"
31
+ github_event_base_ref = "github.event.base.ref"
32
+ github_ref = "github.ref"
33
+
34
+
35
+ class BuildVariables(BaseEnum):
36
+ github_run_id = "github.run.id"
37
+ github_run_number = "github.run.number"
38
+ github_workflow = "github.workflow"
39
+ github_repository = "github.repository"
40
+ github_ref = "github.ref"
41
+ runner_temp = "runner.temp"
42
+ github_sha = "github.sha"
43
+ GitHub = "GitHub"
44
+
45
+
46
+ class ReleaseVariables(BaseEnum):
47
+ github_workflow = "github.workflow"
48
+ github_env = "github.env"
49
+ github_run_number = "github.run.number"
50
+
51
+
52
+ class AgentVariables(BaseEnum):
53
+ runner_workspace = "runner.workspace"
54
+ github_workspace = "github.workspace"
55
+ runner_os = "runner.os"
56
+ runner_tool_cache = "runner.tool.cache"
@@ -1 +1 @@
1
- version = '1.7.21'
1
+ version = '1.7.23'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: devsecops-engine-tools
3
- Version: 1.7.21
3
+ Version: 1.7.23
4
4
  Summary: Tool for DevSecOps strategy
5
5
  Home-page: https://github.com/bancolombia/devsecops-engine-tools
6
6
  Author: Bancolombia DevSecOps Team
@@ -23,6 +23,7 @@ Requires-Dist: python-decouple ==3.8
23
23
  Requires-Dist: requests-toolbelt ==1.0.0
24
24
  Requires-Dist: python-dateutil ==2.8.2
25
25
  Requires-Dist: pexpect ==4.9.0
26
+ Requires-Dist: PyGithub ==2.3.0
26
27
 
27
28
  # DevSecOps Engine Tools
28
29
 
@@ -63,7 +64,7 @@ pip3 install devsecops-engine-tools
63
64
  ### Scan running - flags (CLI)
64
65
 
65
66
  ```bash
66
- devsecops-engine-tools --platform_devops ["local","azure"] --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 ["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
68
  ```
68
69
 
69
70
  ### Structure Remote Config
@@ -1,9 +1,9 @@
1
1
  devsecops_engine_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- devsecops_engine_tools/version.py,sha256=OswmJbbdP6j-8j-P6qOqozXr7DTBdHZC5V7RnSqE-YQ,19
2
+ devsecops_engine_tools/version.py,sha256=QMGesPOoNc-S-Q4OAGkG93FJLERtxasiwcJiAGieylA,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
6
- devsecops_engine_tools/engine_core/src/applications/runner_engine_core.py,sha256=CbLdGjyZkgpSYPe-7Q3Xus83BHq5wWwwMaFB29VaILA,5748
6
+ devsecops_engine_tools/engine_core/src/applications/runner_engine_core.py,sha256=4eJwsuSRAD3psUBvWZVWu9XR9rwvagFs6FqnKFz0eEU,5965
7
7
  devsecops_engine_tools/engine_core/src/deployment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  devsecops_engine_tools/engine_core/src/deployment/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  devsecops_engine_tools/engine_core/src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -37,6 +37,8 @@ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/__in
37
37
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/azure_devops.py,sha256=Ot1j5my-iEpU-ZYy9yNXkwmwLOmJ3f95JyyAUcpFN5g,4967
38
38
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py,sha256=qOqipt7P6THEjoaBwpIPO8OEN9OKpW6u_X_c4DeGhx8,10903
40
+ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/github_actions.py,sha256=PsDCUfVHgUJL9AKwB2FyQ6VdUtgawyYTtvRcSscX_9A,3723
40
42
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/printer_pretty_table/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
43
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/printer_pretty_table/printer_pretty_table.py,sha256=Tz056qYuIKrdYGKyoPo7xFdOpfN3A0YMd3cCSAGVrYQ,3828
42
44
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/runtime_local/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -118,7 +120,7 @@ devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/set_input_c
118
120
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
121
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
122
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/git_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
- devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/git_cli/git_run.py,sha256=xKIUAnNK4u0pTHgo5tFrzmnquBegBQgN2-3jU6V6vxQ,2642
123
+ devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/git_cli/git_run.py,sha256=ImINYwL3OSj5wMsEik3zDM6b_J7ma_lBD3lRAQqv6zw,2826
122
124
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
125
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_deserealizator.py,sha256=HZcNUa9VvK1InsDY94HiuDQuEH_R6pJIeAN3Zwi8CBA,1825
124
126
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_run.py,sha256=cvCSKTDN-4oL9H5EZF_-WrP5bNamFt0WfeCwaMO_Nfo,5345
@@ -226,7 +228,8 @@ devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapt
226
228
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/repository/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
227
229
  devsecops_engine_tools/engine_utilities/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
228
230
  devsecops_engine_tools/engine_utilities/github/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
229
- devsecops_engine_tools/engine_utilities/github/infrastructure/github_api.py,sha256=sb9qQNoag87eCrCdXTht2b4TDV9oF-3faOS4TDtDYjU,1657
231
+ devsecops_engine_tools/engine_utilities/github/infrastructure/github_api.py,sha256=AURk8GGAkNuHCqTEsiS6UxClL_YYJoqtBrWGBSYgWO4,2436
232
+ devsecops_engine_tools/engine_utilities/github/models/GithubPredefinedVariables.py,sha256=uPoiBRo0tlxQ69cqob40hmIdNk1BSbKqF1hpjsvhXdQ,1579
230
233
  devsecops_engine_tools/engine_utilities/github/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
231
234
  devsecops_engine_tools/engine_utilities/input_validations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
232
235
  devsecops_engine_tools/engine_utilities/input_validations/env_utils.py,sha256=nHp9YIuG1k-IvxssQslrE9ny62juJMovmBTzcM7PPk0,258
@@ -241,8 +244,8 @@ devsecops_engine_tools/engine_utilities/utils/logger_info.py,sha256=4Mz8Bwlm9Mku
241
244
  devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGaxYSDe0ZRh6VHRf53H4sXPcb-vNP_i81PUn3I,307
242
245
  devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=GAslbWaBpwP3mP6fBsgVl07TTBgcCggQTy8h2M9ibeo,612
243
246
  devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=yNtlT-8Legz1sHbGPH8LNYjL-LgDUE0zXG2rYjiab7U,290
244
- devsecops_engine_tools-1.7.21.dist-info/METADATA,sha256=OFB3Zu1FeDt3y40b88HAY4wCs5isbf8WKfYsBV8QWs8,4840
245
- devsecops_engine_tools-1.7.21.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
246
- devsecops_engine_tools-1.7.21.dist-info/entry_points.txt,sha256=9IjXF_7Zpgowq_SY6OSmsA9vZze18a8_AeHwkQVrgKk,131
247
- devsecops_engine_tools-1.7.21.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
248
- devsecops_engine_tools-1.7.21.dist-info/RECORD,,
247
+ devsecops_engine_tools-1.7.23.dist-info/METADATA,sha256=SLAil6N__fvnC22sThN1En0EV8CWQYKvjSegSJ9YLJM,4881
248
+ devsecops_engine_tools-1.7.23.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
249
+ devsecops_engine_tools-1.7.23.dist-info/entry_points.txt,sha256=9IjXF_7Zpgowq_SY6OSmsA9vZze18a8_AeHwkQVrgKk,131
250
+ devsecops_engine_tools-1.7.23.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
251
+ devsecops_engine_tools-1.7.23.dist-info/RECORD,,