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

@@ -18,6 +18,7 @@ from devsecops_engine_tools.engine_utilities.defect_dojo import (
18
18
  from devsecops_engine_tools.engine_core.src.domain.model.exclusions import Exclusions
19
19
  from devsecops_engine_tools.engine_core.src.domain.model.report import Report
20
20
  from devsecops_engine_tools.engine_utilities.utils.session_manager import SessionManager
21
+ from devsecops_engine_tools.engine_utilities.utils.utils import Utils
21
22
  from devsecops_engine_tools.engine_core.src.domain.model.customs_exceptions import (
22
23
  ExceptionVulnerabilityManagement,
23
24
  ExceptionFindingsExcepted,
@@ -28,13 +29,11 @@ from devsecops_engine_tools.engine_core.src.infrastructure.helpers.util import (
28
29
  format_date,
29
30
  )
30
31
  from functools import partial
31
-
32
32
  from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
33
33
  from devsecops_engine_tools.engine_utilities import settings
34
34
  from devsecops_engine_tools.engine_utilities.defect_dojo.domain.serializers.import_scan import (
35
35
  ImportScanSerializer,
36
36
  )
37
- import time
38
37
  import concurrent.futures
39
38
 
40
39
  logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
@@ -113,7 +112,7 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
113
112
  def request_func():
114
113
  return DefectDojo.send_import_scan(request)
115
114
 
116
- response = self._retries_requests(
115
+ response = Utils().retries_requests(
117
116
  request_func,
118
117
  vulnerability_management.config_tool["VULNERABILITY_MANAGER"][
119
118
  "DEFECT_DOJO"
@@ -166,7 +165,7 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
166
165
  else None
167
166
  )
168
167
 
169
- return self._retries_requests(request_func, dd_max_retries, retry_delay=5)
168
+ return Utils().retries_requests(request_func, dd_max_retries, retry_delay=5)
170
169
 
171
170
  except Exception as ex:
172
171
  raise ExceptionVulnerabilityManagement(
@@ -555,7 +554,7 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
555
554
  session=session_manager, service=service, **query_params
556
555
  ).results
557
556
 
558
- return self._retries_requests(request_func, max_retries, retry_delay=5)
557
+ return Utils().retries_requests(request_func, max_retries, retry_delay=5)
559
558
 
560
559
  def _get_finding_exclusion(self, session_manager, max_retries, query_params):
561
560
  def request_func():
@@ -563,21 +562,7 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
563
562
  session=session_manager, **query_params
564
563
  ).results
565
564
 
566
- return self._retries_requests(request_func, max_retries, retry_delay=5)
567
-
568
- def _retries_requests(self, request_func, max_retries, retry_delay):
569
- for attempt in range(max_retries):
570
- try:
571
- return request_func()
572
- except Exception as e:
573
- logger.error(f"Error making the request: {e}")
574
- if attempt < max_retries - 1:
575
- logger.warning(f"Retry in {retry_delay} seconds...")
576
- time.sleep(retry_delay)
577
- else:
578
- logger.error("Maximum number of retries reached, aborting.")
579
- raise e
580
-
565
+ return Utils().retries_requests(request_func, max_retries, retry_delay=5)
581
566
 
582
567
  def _date_reason_based(self, finding, date_fn, reason, tool, **kwargs):
583
568
  def get_vuln_id(finding, tool):
@@ -39,7 +39,8 @@ class SonarGateway(metaclass=ABCMeta):
39
39
  sonar_token: str,
40
40
  endpoint: str,
41
41
  data: dict,
42
- finding_type: str
42
+ finding_type: str,
43
+ sonar_max_retry: int
43
44
  ):
44
45
  "use API to change vulnerabilities state in sonar"
45
46
 
@@ -50,7 +51,8 @@ class SonarGateway(metaclass=ABCMeta):
50
51
  sonar_token: str,
51
52
  endpoint: str,
52
53
  params: dict,
53
- finding_type: str
54
+ finding_type: str,
55
+ sonar_max_retry: int
54
56
  ):
55
57
  "use API to get project findings in sonar"
56
58
 
@@ -127,7 +127,8 @@ class ReportSonar:
127
127
  "s": "CREATION_DATE",
128
128
  "asc": "false"
129
129
  },
130
- "issues"
130
+ "issues",
131
+ report_config_tool["MAX_RETRIES_QUERY_SONAR"]
131
132
  )
132
133
  sonar_hotspots = self.sonar_gateway.get_findings(
133
134
  args["sonar_url"],
@@ -138,7 +139,8 @@ class ReportSonar:
138
139
  "ps": 100,
139
140
  "p": 1,
140
141
  },
141
- "hotspots"
142
+ "hotspots",
143
+ report_config_tool["MAX_RETRIES_QUERY_SONAR"]
142
144
  )
143
145
 
144
146
  sonar_findings = sonar_vulnerabilities + sonar_hotspots
@@ -164,7 +166,8 @@ class ReportSonar:
164
166
  "issue": related_sonar_finding["key"],
165
167
  "transition": status
166
168
  },
167
- "issue"
169
+ "issue",
170
+ report_config_tool["MAX_RETRIES_QUERY_SONAR"]
168
171
  )
169
172
  else:
170
173
  resolution = None
@@ -185,7 +188,8 @@ class ReportSonar:
185
188
  secret["token_sonar"],
186
189
  "/api/hotspots/change_status",
187
190
  data,
188
- "hotspot"
191
+ "hotspot",
192
+ report_config_tool["MAX_RETRIES_QUERY_SONAR"]
189
193
  )
190
194
 
191
195
  except Exception as e:
@@ -61,47 +61,54 @@ class SonarAdapter(SonarGateway):
61
61
  def filter_by_sonarqube_tag(self, findings):
62
62
  return [finding for finding in findings if "sonarqube" in finding.tags]
63
63
 
64
- def change_finding_status(self, sonar_url, sonar_token, endpoint, data, finding_type):
64
+ def change_finding_status(self, sonar_url, sonar_token, endpoint, data, finding_type, sonar_max_retry):
65
65
  try:
66
- response = requests.post(
67
- f"{sonar_url}{endpoint}",
68
- headers={
69
- "Authorization": f"Basic {Utils().encode_token_to_base64(sonar_token)}"
70
- },
71
- data=data
72
- )
73
- response.raise_for_status()
66
+ def request_func():
67
+ response = requests.post(
68
+ f"{sonar_url}{endpoint}",
69
+ headers={
70
+ "Authorization": f"Basic {Utils().encode_token_to_base64(sonar_token)}"
71
+ },
72
+ data=data
73
+ )
74
+ response.raise_for_status()
75
+
76
+ if finding_type == "issue":
77
+ info = data["transition"]
78
+ else:
79
+ resolution_info = ""
80
+ if data.get("resolution"): resolution_info = f" ({data['resolution']})"
74
81
 
75
- if finding_type == "issue":
76
- info = data["transition"]
77
- else:
78
- resolution_info = ""
79
- if data.get("resolution"): resolution_info = f" ({data['resolution']})"
82
+ info = f"{data['status']}{resolution_info}"
80
83
 
81
- info = f"{data['status']}{resolution_info}"
84
+ print(f"The state of the {finding_type} {data[finding_type]} was changed to {info}.")
82
85
 
83
- print(f"The state of the {finding_type} {data[finding_type]} was changed to {info}.")
86
+ Utils().retries_requests(request_func, sonar_max_retry, retry_delay=5)
87
+
84
88
  except Exception as e:
85
89
  logger.warning(f"Unable to change the status of {finding_type} {data[finding_type]}. Error: {e}")
86
90
  pass
87
91
 
88
- def get_findings(self, sonar_url, sonar_token, endpoint, params, finding_type):
92
+ def get_findings(self, sonar_url, sonar_token, endpoint, params, finding_type, sonar_max_retry):
89
93
  findings = []
90
94
  try:
91
- while True:
92
- response = requests.get(
93
- f"{sonar_url}{endpoint}",
94
- headers={
95
- "Authorization": f"Basic {Utils().encode_token_to_base64(sonar_token)}"
96
- },
97
- params=params
98
- )
99
- response.raise_for_status()
100
- data = response.json()
95
+ def request_func():
96
+ while True:
97
+ response = requests.get(
98
+ f"{sonar_url}{endpoint}",
99
+ headers={
100
+ "Authorization": f"Basic {Utils().encode_token_to_base64(sonar_token)}"
101
+ },
102
+ params=params
103
+ )
104
+ response.raise_for_status()
105
+ data = response.json()
101
106
 
102
- findings.extend(data[finding_type])
103
- if len(data[finding_type]) < params["ps"]: break
104
- params["p"] = params["p"] + 1
107
+ findings.extend(data[finding_type])
108
+ if len(data[finding_type]) < params["ps"]: break
109
+ params["p"] = params["p"] + 1
110
+
111
+ Utils().retries_requests(request_func, sonar_max_retry, 5)
105
112
 
106
113
  return findings
107
114
  except Exception as e:
@@ -26,19 +26,28 @@ def init_report_sonar(
26
26
  args["remote_config_repo"], "/engine_core/ConfigTool.json", args["remote_config_branch"]
27
27
  )
28
28
  report_config_tool = devops_platform_gateway.get_remote_config(
29
- args["remote_config_repo"], "/report_sonar/ConfigTool.json"
29
+ args["remote_config_repo"], "/report_sonar/ConfigTool.json", args["remote_config_branch"]
30
30
  )
31
+ excluded_pipelines = devops_platform_gateway.get_remote_config(
32
+ args["remote_config_repo"], "/report_sonar/Exclusions.json", args["remote_config_branch"]
33
+ )
34
+
31
35
  Printers.print_logo_tool(config_tool["BANNER"])
32
36
 
33
37
  pipeline_name = devops_platform_gateway.get_variable("pipeline_name")
34
38
  branch = devops_platform_gateway.get_variable("branch_tag")
39
+
35
40
  is_valid_pipeline = not re.match(
36
- report_config_tool["IGNORE_SEARCH_PATTERN"], pipeline_name, re.IGNORECASE
37
- )
41
+ report_config_tool["IGNORE_SEARCH_PATTERN"],
42
+ pipeline_name,
43
+ re.IGNORECASE
44
+ ) and pipeline_name not in excluded_pipelines
45
+
38
46
  is_valid_branch = any(
39
47
  target_branch in str(branch)
40
48
  for target_branch in report_config_tool["TARGET_BRANCHES"]
41
49
  )
50
+
42
51
  is_enabled = config_tool["REPORT_SONAR"]["ENABLED"]
43
52
 
44
53
  if is_enabled and is_valid_pipeline and is_valid_branch:
@@ -1,6 +1,7 @@
1
1
  import zipfile
2
2
  import tarfile
3
3
  import platform
4
+ import time
4
5
  from devsecops_engine_tools.engine_utilities.github.infrastructure.github_api import (
5
6
  GithubApi,
6
7
  )
@@ -141,3 +142,16 @@ class Utils:
141
142
  )
142
143
 
143
144
  return set_threshold(match_pattern) if match_pattern else threshold
145
+
146
+ def retries_requests(self, request_func, max_retries, retry_delay):
147
+ for attempt in range(max_retries):
148
+ try:
149
+ return request_func()
150
+ except Exception as e:
151
+ logger.error(f"Error making the request: {e}")
152
+ if attempt < max_retries - 1:
153
+ logger.warning(f"Retry in {retry_delay} seconds...")
154
+ time.sleep(retry_delay)
155
+ else:
156
+ logger.error("Maximum number of retries reached, aborting.")
157
+ raise e
@@ -1 +1 @@
1
- version = '1.33.1'
1
+ version = '1.34.0'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: devsecops-engine-tools
3
- Version: 1.33.1
3
+ Version: 1.34.0
4
4
  Summary: Tool for DevSecOps strategy
5
5
  Home-page: https://github.com/bancolombia/devsecops-engine-tools
6
6
  Author: Bancolombia DevSecOps Team
@@ -1,5 +1,5 @@
1
1
  devsecops_engine_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- devsecops_engine_tools/version.py,sha256=C3tgQeyYdXECCw9lJcXqOY08lfb8673_qriiLlgXXUE,19
2
+ devsecops_engine_tools/version.py,sha256=GX9p1uQ5pMzl5fxTcEjUuh508LFzTFrl8YQ3typxofg,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
@@ -38,7 +38,7 @@ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/secret
38
38
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/azure_devops.py,sha256=buCBJ6kAg-5b_7P-gWzem6NEMbk5lK9Hx0Zuf-BQfXQ,5090
40
40
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py,sha256=QnAy_7jnjd7BGzmkSnfsbsajkJ4Ap2pEguRChASNvdk,27830
41
+ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py,sha256=ma6TTlrXnUqGJ6DXM7PQzgZyoTK6Wd-tvMXLITpOvaA,27330
42
42
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/github_actions.py,sha256=KCg6tTDncasrRZbB20QiLZNE6TKYkfgQ9zP0wPd3xe0,3925
44
44
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/printer_pretty_table/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -325,15 +325,15 @@ devsecops_engine_tools/engine_utilities/sonarqube/src/applications/runner_report
325
325
  devsecops_engine_tools/engine_utilities/sonarqube/src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
326
326
  devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
327
327
  devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/gateways/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
328
- devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/gateways/sonar_gateway.py,sha256=PCrGq7NOINAFPvmX-5V5191MGhahsnQeWXUB1-xL4Xw,1279
328
+ devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/gateways/sonar_gateway.py,sha256=mgycD3bzC_BYv7qT0tMLAro9hyNOvi4gJRzceYNF0t8,1339
329
329
  devsecops_engine_tools/engine_utilities/sonarqube/src/domain/usecases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
330
- devsecops_engine_tools/engine_utilities/sonarqube/src/domain/usecases/report_sonar.py,sha256=kC1GzbVA8mX3N1Rp7gX9P-emb6gcbQbXEEspYROOmXs,9193
330
+ devsecops_engine_tools/engine_utilities/sonarqube/src/domain/usecases/report_sonar.py,sha256=DnJowGn2mI2JvYjFTyrcZ6MOj2RrHk1xJt-kLWu0Z1k,9493
331
331
  devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
332
332
  devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
333
333
  devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/sonarqube/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
334
- devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/sonarqube/sonarqube_report.py,sha256=eKzxONP3pP4d2MIknC5sGVuxcHzgelt5D0Kun88WBMo,4514
334
+ devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/sonarqube/sonarqube_report.py,sha256=BpCLMgFQjytZc1HfZ5hXqX44E8T0JhLpAaNOVq5pFjo,4909
335
335
  devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
336
- devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/entry_points/entry_point_report_sonar.py,sha256=TiChZeYo8DxEBEzNyt6hpJY6SZtUU5rNXEKojaTJoPc,2327
336
+ devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/entry_points/entry_point_report_sonar.py,sha256=cAPH9-jjnAvF_hH5_UOSG2pndycAxJgpN9e6K8Aufso,2603
337
337
  devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
338
338
  devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/helpers/utils.py,sha256=SGOWrkzQrvOt9bRhhSfgiMzj1695e1W0B9ox9C1ihQI,294
339
339
  devsecops_engine_tools/engine_utilities/ssh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -346,9 +346,9 @@ devsecops_engine_tools/engine_utilities/utils/logger_info.py,sha256=4Mz8Bwlm9Mku
346
346
  devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGaxYSDe0ZRh6VHRf53H4sXPcb-vNP_i81PUn3I,307
347
347
  devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=amYAr9YQfYgR6jK9a2l26z3oovFPQ3FAKmhq6BKhEBA,623
348
348
  devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=Z0fdhB3r-dxU0nGSD9zW_B4r2Qol1rUnUCkhFR0U-HQ,487
349
- devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=dAklY11OGNDODjZyt9dO68Xiwu9pLJmqLOslqQ7rXa8,6112
350
- devsecops_engine_tools-1.33.1.dist-info/METADATA,sha256=2w3FO-t3Z9lQmBt-8CrAO7CRvGyvi8BojDLAC4uTFBA,11592
351
- devsecops_engine_tools-1.33.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
352
- devsecops_engine_tools-1.33.1.dist-info/entry_points.txt,sha256=MHCTFFs9bdNKo6YcWCcBW2_8X6yTisgLOlmVx-V8Rxc,276
353
- devsecops_engine_tools-1.33.1.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
354
- devsecops_engine_tools-1.33.1.dist-info/RECORD,,
349
+ devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=XFap4yOK7ItLWsqbwDhvLd7NpDhs7i-UGJAMD6jjd7w,6687
350
+ devsecops_engine_tools-1.34.0.dist-info/METADATA,sha256=kKt7j0H8HxuPAFBVW5lCEgGPWUwKW0Ep1OkUqrJqyG4,11592
351
+ devsecops_engine_tools-1.34.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
352
+ devsecops_engine_tools-1.34.0.dist-info/entry_points.txt,sha256=MHCTFFs9bdNKo6YcWCcBW2_8X6yTisgLOlmVx-V8Rxc,276
353
+ devsecops_engine_tools-1.34.0.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
354
+ devsecops_engine_tools-1.34.0.dist-info/RECORD,,