devsecops-engine-tools 1.14.6__py3-none-any.whl → 1.15.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.
- devsecops_engine_tools/engine_core/src/domain/model/gateway/vulnerability_management_gateway.py +1 -1
- devsecops_engine_tools/engine_core/src/domain/model/report.py +3 -1
- devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py +7 -1
- devsecops_engine_tools/engine_utilities/sonarqube/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/applications/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/applications/runner_report_sonar.py +110 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/domain/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/gateways/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/gateways/sonar_gateway.py +63 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/domain/usecases/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/domain/usecases/report_sonar.py +194 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/sonarqube/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/sonarqube/sonarqube_report.py +112 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/entry_points/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/entry_points/entry_point_report_sonar.py +37 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/helpers/__init__.py +0 -0
- devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/helpers/utils.py +8 -0
- devsecops_engine_tools/engine_utilities/utils/utils.py +6 -1
- devsecops_engine_tools/version.py +1 -1
- {devsecops_engine_tools-1.14.6.dist-info → devsecops_engine_tools-1.15.0.dist-info}/METADATA +1 -1
- {devsecops_engine_tools-1.14.6.dist-info → devsecops_engine_tools-1.15.0.dist-info}/RECORD +28 -10
- devsecops_engine_tools-1.15.0.dist-info/entry_points.txt +3 -0
- devsecops_engine_tools-1.14.6.dist-info/entry_points.txt +0 -2
- {devsecops_engine_tools-1.14.6.dist-info → devsecops_engine_tools-1.15.0.dist-info}/WHEEL +0 -0
- {devsecops_engine_tools-1.14.6.dist-info → devsecops_engine_tools-1.15.0.dist-info}/top_level.txt +0 -0
devsecops_engine_tools/engine_core/src/domain/model/gateway/vulnerability_management_gateway.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from abc import ABCMeta, abstractmethod
|
|
2
2
|
|
|
3
3
|
from devsecops_engine_tools.engine_core.src.domain.model.vulnerability_management import VulnerabilityManagement
|
|
4
|
-
|
|
4
|
+
from devsecops_engine_tools.engine_core.src.domain.model.gateway.devops_platform_gateway import DevopsPlatformGateway
|
|
5
5
|
|
|
6
6
|
class VulnerabilityManagementGateway(metaclass=ABCMeta):
|
|
7
7
|
@abstractmethod
|
|
@@ -31,4 +31,6 @@ class Report:
|
|
|
31
31
|
self.component_name = kwargs.get("component_name", "")
|
|
32
32
|
self.component_version = kwargs.get("component_version", "")
|
|
33
33
|
self.file_path = kwargs.get("file_path", "")
|
|
34
|
-
self.endpoints = kwargs.get("endpoints", "")
|
|
34
|
+
self.endpoints = kwargs.get("endpoints", "")
|
|
35
|
+
self.unique_id_from_tool = kwargs.get("unique_id_from_tool", "")
|
|
36
|
+
self.out_of_scope = kwargs.get("out_of_scope", "")
|
devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py
CHANGED
|
@@ -5,6 +5,9 @@ from devsecops_engine_tools.engine_core.src.domain.model.gateway.vulnerability_m
|
|
|
5
5
|
from devsecops_engine_tools.engine_core.src.domain.model.vulnerability_management import (
|
|
6
6
|
VulnerabilityManagement,
|
|
7
7
|
)
|
|
8
|
+
from devsecops_engine_tools.engine_core.src.domain.model.gateway.devops_platform_gateway import (
|
|
9
|
+
DevopsPlatformGateway
|
|
10
|
+
)
|
|
8
11
|
from devsecops_engine_tools.engine_utilities.defect_dojo import (
|
|
9
12
|
DefectDojo,
|
|
10
13
|
ImportScanRequest,
|
|
@@ -67,7 +70,8 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
67
70
|
"KUBESCAPE": "Kubescape Scanner",
|
|
68
71
|
"KICS": "KICS Scanner",
|
|
69
72
|
"BEARER": "Bearer CLI",
|
|
70
|
-
"DEPENDENCY_CHECK": "Dependency Check Scan"
|
|
73
|
+
"DEPENDENCY_CHECK": "Dependency Check Scan",
|
|
74
|
+
"SONARQUBE": "SonarQube API Import"
|
|
71
75
|
}
|
|
72
76
|
|
|
73
77
|
if any(
|
|
@@ -426,6 +430,8 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
426
430
|
risk_accepted=finding.risk_accepted,
|
|
427
431
|
false_p=finding.false_p,
|
|
428
432
|
service=finding.service,
|
|
433
|
+
unique_id_from_tool=finding.unique_id_from_tool,
|
|
434
|
+
out_of_scope=finding.out_of_scope
|
|
429
435
|
)
|
|
430
436
|
|
|
431
437
|
def _format_date_to_dd_format(self, date_string):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.aws.secrets_manager import (
|
|
2
|
+
SecretsManager
|
|
3
|
+
)
|
|
4
|
+
from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.azure.azure_devops import (
|
|
5
|
+
AzureDevops
|
|
6
|
+
)
|
|
7
|
+
from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.defect_dojo.defect_dojo import (
|
|
8
|
+
DefectDojoPlatform
|
|
9
|
+
)
|
|
10
|
+
from devsecops_engine_tools.engine_utilities.sonarqube.src.infrastructure.driven_adapters.sonarqube.sonarqube_report import(
|
|
11
|
+
SonarAdapter
|
|
12
|
+
)
|
|
13
|
+
from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.aws.s3_manager import (
|
|
14
|
+
S3Manager,
|
|
15
|
+
)
|
|
16
|
+
from devsecops_engine_tools.engine_utilities.sonarqube.src.infrastructure.entry_points.entry_point_report_sonar import (
|
|
17
|
+
init_report_sonar
|
|
18
|
+
)
|
|
19
|
+
import sys
|
|
20
|
+
import argparse
|
|
21
|
+
from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
|
|
22
|
+
from devsecops_engine_tools.engine_utilities import settings
|
|
23
|
+
|
|
24
|
+
logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
|
|
25
|
+
|
|
26
|
+
def get_inputs_from_cli(args):
|
|
27
|
+
parser = argparse.ArgumentParser()
|
|
28
|
+
parser.add_argument(
|
|
29
|
+
"-rcf",
|
|
30
|
+
"--remote_config_repo",
|
|
31
|
+
type=str,
|
|
32
|
+
required=True,
|
|
33
|
+
help="Name of Config Repo",
|
|
34
|
+
)
|
|
35
|
+
parser.add_argument(
|
|
36
|
+
"--use_secrets_manager",
|
|
37
|
+
choices=["true", "false"],
|
|
38
|
+
type=str,
|
|
39
|
+
required=True,
|
|
40
|
+
help="Use Secrets Manager to get the tokens",
|
|
41
|
+
)
|
|
42
|
+
parser.add_argument(
|
|
43
|
+
"--send_metrics",
|
|
44
|
+
choices=["true", "false"],
|
|
45
|
+
type=str,
|
|
46
|
+
required=False,
|
|
47
|
+
help="Enable or Disable the send metrics to the driven adapter metrics",
|
|
48
|
+
)
|
|
49
|
+
parser.add_argument(
|
|
50
|
+
"--sonar_url",
|
|
51
|
+
required=False,
|
|
52
|
+
help="Url to access sonar API",
|
|
53
|
+
)
|
|
54
|
+
parser.add_argument(
|
|
55
|
+
"--token_cmdb",
|
|
56
|
+
required=False,
|
|
57
|
+
help="Token to connect to the CMDB"
|
|
58
|
+
)
|
|
59
|
+
parser.add_argument(
|
|
60
|
+
"--token_vulnerability_management",
|
|
61
|
+
required=False,
|
|
62
|
+
help="Token to connect to the Vulnerability Management",
|
|
63
|
+
)
|
|
64
|
+
parser.add_argument(
|
|
65
|
+
"--token_sonar",
|
|
66
|
+
required=False,
|
|
67
|
+
help="Token to access sonar server",
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
args = parser.parse_args()
|
|
71
|
+
return {
|
|
72
|
+
"remote_config_repo": args.remote_config_repo,
|
|
73
|
+
"use_secrets_manager": args.use_secrets_manager,
|
|
74
|
+
"send_metrics": args.send_metrics,
|
|
75
|
+
"sonar_url": args.sonar_url,
|
|
76
|
+
"token_cmdb": args.token_cmdb,
|
|
77
|
+
"token_vulnerability_management": args.token_vulnerability_management,
|
|
78
|
+
"token_sonar": args.token_sonar,
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
def runner_report_sonar():
|
|
82
|
+
try:
|
|
83
|
+
vulnerability_management_gateway = DefectDojoPlatform()
|
|
84
|
+
secrets_manager_gateway = SecretsManager()
|
|
85
|
+
devops_platform_gateway = AzureDevops()
|
|
86
|
+
sonar_gateway = SonarAdapter()
|
|
87
|
+
metrics_manager_gateway = S3Manager()
|
|
88
|
+
args = get_inputs_from_cli(sys.argv[1:])
|
|
89
|
+
|
|
90
|
+
init_report_sonar(
|
|
91
|
+
vulnerability_management_gateway=vulnerability_management_gateway,
|
|
92
|
+
secrets_manager_gateway=secrets_manager_gateway,
|
|
93
|
+
devops_platform_gateway=devops_platform_gateway,
|
|
94
|
+
sonar_gateway=sonar_gateway,
|
|
95
|
+
metrics_manager_gateway=metrics_manager_gateway,
|
|
96
|
+
args=args,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
except Exception as e:
|
|
100
|
+
logger.error("Error report_sonar: {0} ".format(str(e)))
|
|
101
|
+
print(
|
|
102
|
+
devops_platform_gateway.message(
|
|
103
|
+
"error", "Error report_sonar: {0} ".format(str(e))
|
|
104
|
+
)
|
|
105
|
+
)
|
|
106
|
+
print(devops_platform_gateway.result_pipeline("failed"))
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
if __name__ == "__main__":
|
|
110
|
+
runner_report_sonar()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from abc import (
|
|
2
|
+
ABCMeta,
|
|
3
|
+
abstractmethod
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
class SonarGateway(metaclass=ABCMeta):
|
|
7
|
+
@abstractmethod
|
|
8
|
+
def get_project_keys(
|
|
9
|
+
self,
|
|
10
|
+
pipeline_name: str
|
|
11
|
+
):
|
|
12
|
+
"get sonar project keys"
|
|
13
|
+
|
|
14
|
+
@abstractmethod
|
|
15
|
+
def parse_project_key(
|
|
16
|
+
self,
|
|
17
|
+
file_path: str
|
|
18
|
+
):
|
|
19
|
+
"find project key in metadata file"
|
|
20
|
+
|
|
21
|
+
@abstractmethod
|
|
22
|
+
def create_task_report_from_string(
|
|
23
|
+
self,
|
|
24
|
+
file_content: str
|
|
25
|
+
):
|
|
26
|
+
"make dict from metadata file"
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def filter_by_sonarqube_tag(
|
|
30
|
+
self,
|
|
31
|
+
findings: list
|
|
32
|
+
):
|
|
33
|
+
"search for sonar findings"
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def change_finding_status(
|
|
37
|
+
self,
|
|
38
|
+
sonar_url: str,
|
|
39
|
+
sonar_token: str,
|
|
40
|
+
endpoint: str,
|
|
41
|
+
data: dict,
|
|
42
|
+
finding_type: str
|
|
43
|
+
):
|
|
44
|
+
"use API to change vulnerabilities state in sonar"
|
|
45
|
+
|
|
46
|
+
@abstractmethod
|
|
47
|
+
def get_findings(
|
|
48
|
+
self,
|
|
49
|
+
sonar_url: str,
|
|
50
|
+
sonar_token: str,
|
|
51
|
+
endpoint: str,
|
|
52
|
+
params: dict,
|
|
53
|
+
finding_type: str
|
|
54
|
+
):
|
|
55
|
+
"use API to get project findings in sonar"
|
|
56
|
+
|
|
57
|
+
@abstractmethod
|
|
58
|
+
def search_finding_by_id(
|
|
59
|
+
self,
|
|
60
|
+
findings: list,
|
|
61
|
+
finding_id: str
|
|
62
|
+
):
|
|
63
|
+
"search a finding by id"
|
|
File without changes
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
from devsecops_engine_tools.engine_utilities.sonarqube.src.infrastructure.helpers.utils import (
|
|
2
|
+
set_repository
|
|
3
|
+
)
|
|
4
|
+
from devsecops_engine_tools.engine_core.src.infrastructure.helpers.util import (
|
|
5
|
+
define_env
|
|
6
|
+
)
|
|
7
|
+
from devsecops_engine_tools.engine_core.src.domain.model.gateway.vulnerability_management_gateway import (
|
|
8
|
+
VulnerabilityManagementGateway
|
|
9
|
+
)
|
|
10
|
+
from devsecops_engine_tools.engine_core.src.domain.model.vulnerability_management import (
|
|
11
|
+
VulnerabilityManagement
|
|
12
|
+
)
|
|
13
|
+
from devsecops_engine_tools.engine_core.src.domain.model.gateway.secrets_manager_gateway import (
|
|
14
|
+
SecretsManagerGateway
|
|
15
|
+
)
|
|
16
|
+
from devsecops_engine_tools.engine_core.src.domain.model.gateway.devops_platform_gateway import (
|
|
17
|
+
DevopsPlatformGateway
|
|
18
|
+
)
|
|
19
|
+
from devsecops_engine_tools.engine_utilities.sonarqube.src.domain.model.gateways.sonar_gateway import (
|
|
20
|
+
SonarGateway
|
|
21
|
+
)
|
|
22
|
+
from devsecops_engine_tools.engine_core.src.domain.model.input_core import (
|
|
23
|
+
InputCore
|
|
24
|
+
)
|
|
25
|
+
from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
|
|
26
|
+
from devsecops_engine_tools.engine_utilities import settings
|
|
27
|
+
|
|
28
|
+
logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
|
|
29
|
+
|
|
30
|
+
class ReportSonar:
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
vulnerability_management_gateway: VulnerabilityManagementGateway,
|
|
34
|
+
secrets_manager_gateway: SecretsManagerGateway,
|
|
35
|
+
devops_platform_gateway: DevopsPlatformGateway,
|
|
36
|
+
sonar_gateway: SonarGateway
|
|
37
|
+
):
|
|
38
|
+
self.vulnerability_management_gateway = vulnerability_management_gateway
|
|
39
|
+
self.secrets_manager_gateway = secrets_manager_gateway
|
|
40
|
+
self.devops_platform_gateway = devops_platform_gateway
|
|
41
|
+
self.sonar_gateway = sonar_gateway
|
|
42
|
+
|
|
43
|
+
def process(self, args):
|
|
44
|
+
pipeline_name = self.devops_platform_gateway.get_variable("pipeline_name")
|
|
45
|
+
branch = self.devops_platform_gateway.get_variable("branch_name")
|
|
46
|
+
input_core = InputCore(
|
|
47
|
+
[],
|
|
48
|
+
{},
|
|
49
|
+
"",
|
|
50
|
+
"",
|
|
51
|
+
"",
|
|
52
|
+
self.devops_platform_gateway.get_variable("stage").capitalize(),
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
compact_remote_config_url = self.devops_platform_gateway.get_base_compact_remote_config_url(args["remote_config_repo"])
|
|
56
|
+
source_code_management_uri = set_repository(
|
|
57
|
+
pipeline_name,
|
|
58
|
+
self.devops_platform_gateway.get_source_code_management_uri()
|
|
59
|
+
)
|
|
60
|
+
config_tool = self.devops_platform_gateway.get_remote_config(
|
|
61
|
+
args["remote_config_repo"],
|
|
62
|
+
"/engine_core/ConfigTool.json"
|
|
63
|
+
)
|
|
64
|
+
environment = define_env(None, branch)
|
|
65
|
+
|
|
66
|
+
if args["use_secrets_manager"] == "true":
|
|
67
|
+
secret = self.secrets_manager_gateway.get_secret(config_tool)
|
|
68
|
+
else:
|
|
69
|
+
secret = args
|
|
70
|
+
|
|
71
|
+
report_config_tool = self.devops_platform_gateway.get_remote_config(
|
|
72
|
+
args["remote_config_repo"],
|
|
73
|
+
"/report_sonar/ConfigTool.json"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
get_components = report_config_tool["PIPELINE_COMPONENTS"].get(pipeline_name)
|
|
77
|
+
if get_components:
|
|
78
|
+
project_keys = [f"{pipeline_name}_{component}" for component in get_components]
|
|
79
|
+
print(f"Multiple project keys detected: {project_keys}")
|
|
80
|
+
logger.info(f"Multiple project keys detected: {project_keys}")
|
|
81
|
+
else:
|
|
82
|
+
project_keys = self.sonar_gateway.get_project_keys(pipeline_name)
|
|
83
|
+
|
|
84
|
+
args["tool"] = "sonarqube"
|
|
85
|
+
vulnerability_manager = VulnerabilityManagement(
|
|
86
|
+
scan_type = "SONARQUBE",
|
|
87
|
+
input_core = input_core,
|
|
88
|
+
dict_args = args,
|
|
89
|
+
secret_tool = self.secrets_manager_gateway,
|
|
90
|
+
config_tool = config_tool,
|
|
91
|
+
source_code_management_uri = source_code_management_uri,
|
|
92
|
+
base_compact_remote_config_url = compact_remote_config_url,
|
|
93
|
+
access_token = self.devops_platform_gateway.get_variable("access_token"),
|
|
94
|
+
version = self.devops_platform_gateway.get_variable("build_execution_id"),
|
|
95
|
+
build_id = self.devops_platform_gateway.get_variable("build_id"),
|
|
96
|
+
branch_tag = branch,
|
|
97
|
+
commit_hash = self.devops_platform_gateway.get_variable("commit_hash"),
|
|
98
|
+
environment = environment
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
for project_key in project_keys:
|
|
102
|
+
try:
|
|
103
|
+
findings = self.vulnerability_management_gateway.get_all(
|
|
104
|
+
service=project_key,
|
|
105
|
+
dict_args=args,
|
|
106
|
+
secret_tool=self.secrets_manager_gateway,
|
|
107
|
+
config_tool=config_tool
|
|
108
|
+
)[0]
|
|
109
|
+
filtered_findings = self.sonar_gateway.filter_by_sonarqube_tag(findings)
|
|
110
|
+
|
|
111
|
+
sonar_vulnerabilities = self.sonar_gateway.get_findings(
|
|
112
|
+
args["sonar_url"],
|
|
113
|
+
secret["token_sonar"],
|
|
114
|
+
"/api/issues/search",
|
|
115
|
+
{
|
|
116
|
+
"componentKeys": project_key,
|
|
117
|
+
"types": "VULNERABILITY",
|
|
118
|
+
"ps": 500,
|
|
119
|
+
"p": 1,
|
|
120
|
+
"s": "CREATION_DATE",
|
|
121
|
+
"asc": "false"
|
|
122
|
+
},
|
|
123
|
+
"issues"
|
|
124
|
+
)
|
|
125
|
+
sonar_hotspots = self.sonar_gateway.get_findings(
|
|
126
|
+
args["sonar_url"],
|
|
127
|
+
secret["token_sonar"],
|
|
128
|
+
"/api/hotspots/search",
|
|
129
|
+
{
|
|
130
|
+
"projectKey": project_key,
|
|
131
|
+
"ps": 100,
|
|
132
|
+
"p": 1,
|
|
133
|
+
},
|
|
134
|
+
"hotspots"
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
sonar_findings = sonar_vulnerabilities + sonar_hotspots
|
|
138
|
+
|
|
139
|
+
for finding in filtered_findings:
|
|
140
|
+
related_sonar_finding = self.sonar_gateway.search_finding_by_id(
|
|
141
|
+
sonar_findings,
|
|
142
|
+
finding.unique_id_from_tool
|
|
143
|
+
)
|
|
144
|
+
status = None
|
|
145
|
+
if related_sonar_finding:
|
|
146
|
+
if related_sonar_finding.get("type") == "VULNERABILITY":
|
|
147
|
+
if finding.active and related_sonar_finding["status"] == "RESOLVED": status = "reopen"
|
|
148
|
+
elif related_sonar_finding["status"] != "RESOLVED":
|
|
149
|
+
if finding.false_p: status = "falsepositive"
|
|
150
|
+
elif finding.risk_accepted: status = "close"
|
|
151
|
+
elif finding.risk_accepted or finding.out_of_scope: status = "wontfix"
|
|
152
|
+
if status:
|
|
153
|
+
self.sonar_gateway.change_finding_status(
|
|
154
|
+
args["sonar_url"],
|
|
155
|
+
secret["token_sonar"],
|
|
156
|
+
"/api/issues/do_transition",
|
|
157
|
+
{
|
|
158
|
+
"issue": related_sonar_finding["key"],
|
|
159
|
+
"transition": status
|
|
160
|
+
},
|
|
161
|
+
"issue"
|
|
162
|
+
)
|
|
163
|
+
else:
|
|
164
|
+
resolution = None
|
|
165
|
+
if finding.active and related_sonar_finding["status"] == "REVIEWED": status = "TO_REVIEW"
|
|
166
|
+
elif related_sonar_finding["status"] == "TO_REVIEW":
|
|
167
|
+
if finding.false_p: resolution = "SAFE"
|
|
168
|
+
elif finding.risk_accepted or finding.out_of_scope: resolution = "ACKNOWLEDGED"
|
|
169
|
+
if resolution: status = "REVIEWED"
|
|
170
|
+
if status:
|
|
171
|
+
data = {
|
|
172
|
+
"hotspot": related_sonar_finding["key"],
|
|
173
|
+
"status": status,
|
|
174
|
+
"resolution": resolution
|
|
175
|
+
}
|
|
176
|
+
if not resolution: data.pop("resolution")
|
|
177
|
+
self.sonar_gateway.change_finding_status(
|
|
178
|
+
args["sonar_url"],
|
|
179
|
+
secret["token_sonar"],
|
|
180
|
+
"/api/hotspots/change_status",
|
|
181
|
+
data,
|
|
182
|
+
"hotspot"
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
except Exception as e:
|
|
186
|
+
logger.warning(f"It was not possible to synchronize Sonar and Vulnerability Manager: {e}")
|
|
187
|
+
|
|
188
|
+
input_core.scope_pipeline = project_key
|
|
189
|
+
self.vulnerability_management_gateway.send_vulnerability_management(
|
|
190
|
+
vulnerability_management=vulnerability_manager
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
input_core.scope_pipeline = pipeline_name
|
|
194
|
+
return input_core
|
|
File without changes
|
devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/__init__.py
ADDED
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
from devsecops_engine_tools.engine_utilities.utils.utils import (
|
|
2
|
+
Utils
|
|
3
|
+
)
|
|
4
|
+
from devsecops_engine_tools.engine_utilities.sonarqube.src.domain.model.gateways.sonar_gateway import (
|
|
5
|
+
SonarGateway
|
|
6
|
+
)
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
import requests
|
|
10
|
+
from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
|
|
11
|
+
from devsecops_engine_tools.engine_utilities import settings
|
|
12
|
+
|
|
13
|
+
logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
|
|
14
|
+
|
|
15
|
+
class SonarAdapter(SonarGateway):
|
|
16
|
+
def get_project_keys(self, pipeline_name):
|
|
17
|
+
project_keys = [pipeline_name]
|
|
18
|
+
sonar_scanner_params = os.getenv("SONARQUBE_SCANNER_PARAMS", "")
|
|
19
|
+
pattern = r'"sonar\.scanner\.metadataFilePath":"(.*?)"'
|
|
20
|
+
match_result = re.search(pattern, sonar_scanner_params)
|
|
21
|
+
|
|
22
|
+
if match_result and match_result.group(1):
|
|
23
|
+
metadata_file_path = match_result.group(1)
|
|
24
|
+
project_key_found = self.parse_project_key(metadata_file_path)
|
|
25
|
+
|
|
26
|
+
if project_key_found:
|
|
27
|
+
print(f"ProjectKey scanner params: {project_key_found}")
|
|
28
|
+
project_keys = [project_key_found]
|
|
29
|
+
|
|
30
|
+
return project_keys
|
|
31
|
+
|
|
32
|
+
def parse_project_key(self, file_path):
|
|
33
|
+
try:
|
|
34
|
+
with open(file_path, 'r', encoding='utf-8') as f:
|
|
35
|
+
file_content = f.read()
|
|
36
|
+
print(f"[SQ] Parse Task report file:\n{file_content}")
|
|
37
|
+
if not file_content or len(file_content) <= 0:
|
|
38
|
+
print("[SQ] Error reading file")
|
|
39
|
+
logger.warning("[SQ] Error reading file")
|
|
40
|
+
return None
|
|
41
|
+
try:
|
|
42
|
+
settings = self.create_task_report_from_string(file_content)
|
|
43
|
+
return settings.get("projectKey")
|
|
44
|
+
except Exception as err:
|
|
45
|
+
print(f"[SQ] Parse Task report error: {err}")
|
|
46
|
+
logger.warning(f"[SQ] Parse Task report error: {err}")
|
|
47
|
+
return None
|
|
48
|
+
except Exception as err:
|
|
49
|
+
logger.warning(f"[SQ] Error reading file: {str(err)}")
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
def create_task_report_from_string(self, file_content):
|
|
53
|
+
lines = file_content.replace('\r\n', '\n').split('\n')
|
|
54
|
+
settings = {}
|
|
55
|
+
for line in lines:
|
|
56
|
+
split_line = line.split('=')
|
|
57
|
+
if len(split_line) > 1:
|
|
58
|
+
settings[split_line[0]] = '='.join(split_line[1:])
|
|
59
|
+
return settings
|
|
60
|
+
|
|
61
|
+
def filter_by_sonarqube_tag(self, findings):
|
|
62
|
+
return [finding for finding in findings if "sonarqube" in finding.tags]
|
|
63
|
+
|
|
64
|
+
def change_finding_status(self, sonar_url, sonar_token, endpoint, data, finding_type):
|
|
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()
|
|
74
|
+
|
|
75
|
+
if finding_type == "issue":
|
|
76
|
+
info = data["transition"]
|
|
77
|
+
else:
|
|
78
|
+
resolution_info = ""
|
|
79
|
+
if data.get("resolution"): resolution_info = f" ({data['resolution']})"
|
|
80
|
+
|
|
81
|
+
info = f"{data['status']}{resolution_info}"
|
|
82
|
+
|
|
83
|
+
print(f"The state of the {finding_type} {data[finding_type]} was changed to {info}.")
|
|
84
|
+
except Exception as e:
|
|
85
|
+
logger.warning(f"Unable to change the status of {finding_type} {data[finding_type]}. Error: {e}")
|
|
86
|
+
pass
|
|
87
|
+
|
|
88
|
+
def get_findings(self, sonar_url, sonar_token, endpoint, params, finding_type):
|
|
89
|
+
findings = []
|
|
90
|
+
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()
|
|
101
|
+
|
|
102
|
+
findings.extend(data[finding_type])
|
|
103
|
+
if len(data[finding_type]) < params["ps"]: break
|
|
104
|
+
params["p"] = params["p"] + 1
|
|
105
|
+
|
|
106
|
+
return findings
|
|
107
|
+
except Exception as e:
|
|
108
|
+
logger.warning(f"It was not possible to obtain the {finding_type}: {str(e)}")
|
|
109
|
+
return []
|
|
110
|
+
|
|
111
|
+
def search_finding_by_id(self, issues, issue_id):
|
|
112
|
+
return next((issue for issue in issues if issue["key"] in issue_id), None)
|
|
File without changes
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from devsecops_engine_tools.engine_utilities.sonarqube.src.domain.usecases.report_sonar import (
|
|
2
|
+
ReportSonar
|
|
3
|
+
)
|
|
4
|
+
from devsecops_engine_tools.engine_utilities.utils.printers import (
|
|
5
|
+
Printers,
|
|
6
|
+
)
|
|
7
|
+
from devsecops_engine_tools.engine_core.src.domain.usecases.metrics_manager import (
|
|
8
|
+
MetricsManager,
|
|
9
|
+
)
|
|
10
|
+
from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
|
|
11
|
+
from devsecops_engine_tools.engine_utilities import settings
|
|
12
|
+
|
|
13
|
+
logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
|
|
14
|
+
|
|
15
|
+
def init_report_sonar(vulnerability_management_gateway, secrets_manager_gateway, devops_platform_gateway, sonar_gateway, metrics_manager_gateway, args):
|
|
16
|
+
config_tool = devops_platform_gateway.get_remote_config(
|
|
17
|
+
args["remote_config_repo"], "/engine_core/ConfigTool.json"
|
|
18
|
+
)
|
|
19
|
+
Printers.print_logo_tool(config_tool["BANNER"])
|
|
20
|
+
|
|
21
|
+
if config_tool["REPORT_SONAR"]["ENABLED"] == "true":
|
|
22
|
+
input_core = ReportSonar(
|
|
23
|
+
vulnerability_management_gateway,
|
|
24
|
+
secrets_manager_gateway,
|
|
25
|
+
devops_platform_gateway,
|
|
26
|
+
sonar_gateway
|
|
27
|
+
).process(args)
|
|
28
|
+
|
|
29
|
+
if args["send_metrics"] == "true":
|
|
30
|
+
MetricsManager(devops_platform_gateway, metrics_manager_gateway).process(
|
|
31
|
+
config_tool, input_core, {"tool": "report_sonar"}, ""
|
|
32
|
+
)
|
|
33
|
+
else:
|
|
34
|
+
print(
|
|
35
|
+
devops_platform_gateway.message(
|
|
36
|
+
"warning", "DevSecOps Engine Tool - {0} in maintenance...".format("report_sonar")),
|
|
37
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
def set_repository(pipeline_name, source_code_management):
|
|
4
|
+
if re.search('_MR_', pipeline_name) is None:
|
|
5
|
+
return source_code_management
|
|
6
|
+
else:
|
|
7
|
+
splittedPipeline = pipeline_name.split('_MR_')
|
|
8
|
+
return source_code_management + '?path=/' + splittedPipeline[1]
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import zipfile
|
|
2
|
-
|
|
2
|
+
import base64
|
|
3
3
|
|
|
4
4
|
class Utils:
|
|
5
5
|
|
|
6
6
|
def unzip_file(self, zip_file_path, extract_path):
|
|
7
7
|
with zipfile.ZipFile(zip_file_path, "r") as zip_ref:
|
|
8
8
|
zip_ref.extractall(extract_path)
|
|
9
|
+
|
|
10
|
+
def encode_token_to_base64(self, token):
|
|
11
|
+
token_bytes = f"{token}:".encode("utf-8")
|
|
12
|
+
base64_token = base64.b64encode(token_bytes).decode("utf-8")
|
|
13
|
+
return base64_token
|
|
@@ -1 +1 @@
|
|
|
1
|
-
version = '1.
|
|
1
|
+
version = '1.15.0'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
devsecops_engine_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
devsecops_engine_tools/version.py,sha256=
|
|
2
|
+
devsecops_engine_tools/version.py,sha256=qPrSCN79LDGQE1nW80PFtFMdiMa_3P6jqc7EO1X72dg,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
|
|
@@ -14,7 +14,7 @@ devsecops_engine_tools/engine_core/src/domain/model/finding.py,sha256=MntDksQuPt
|
|
|
14
14
|
devsecops_engine_tools/engine_core/src/domain/model/input_core.py,sha256=hc1WMzCwsGxnrlvvk84S5iNYJRDQWbaQP9MwR3N7tVM,422
|
|
15
15
|
devsecops_engine_tools/engine_core/src/domain/model/level_compliance.py,sha256=ntn_UWqHc6sT5g_LozBdjdewTQxFsp7Kt8M0xqw-k_o,98
|
|
16
16
|
devsecops_engine_tools/engine_core/src/domain/model/level_vulnerability.py,sha256=0sySEnFNkS2Y8uF5GUVAYehXw-i2OglUClkVobnSTPc,257
|
|
17
|
-
devsecops_engine_tools/engine_core/src/domain/model/report.py,sha256=
|
|
17
|
+
devsecops_engine_tools/engine_core/src/domain/model/report.py,sha256=Lsp7CuAdhW8kJkbP6VyHJmFb5rPhxY_u_mEOLHzbD8Y,1772
|
|
18
18
|
devsecops_engine_tools/engine_core/src/domain/model/threshold.py,sha256=TCBECuvoC3-9g8vg3iKWGIixssNecP0iUaZ9Qzv0n7w,596
|
|
19
19
|
devsecops_engine_tools/engine_core/src/domain/model/vulnerability_management.py,sha256=5RcMHpeqznrTOpkjLuqekA_Bqf2Qr-w6OZ5Eoi3b-bs,465
|
|
20
20
|
devsecops_engine_tools/engine_core/src/domain/model/gateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -22,7 +22,7 @@ devsecops_engine_tools/engine_core/src/domain/model/gateway/devops_platform_gate
|
|
|
22
22
|
devsecops_engine_tools/engine_core/src/domain/model/gateway/metrics_manager_gateway.py,sha256=u_ivbmCyymw0Je7gRFg0uD9iDmZfTbteH5UwcgP0JAs,191
|
|
23
23
|
devsecops_engine_tools/engine_core/src/domain/model/gateway/printer_table_gateway.py,sha256=ROBsh7Lyu62a5RqZ4KgGQcwrBzbHRwxAJ9Rj3LoupQc,602
|
|
24
24
|
devsecops_engine_tools/engine_core/src/domain/model/gateway/secrets_manager_gateway.py,sha256=CTwUIvUWF0NSSzdCqASUFst6KUysW53NV9eatjLGdl8,170
|
|
25
|
-
devsecops_engine_tools/engine_core/src/domain/model/gateway/vulnerability_management_gateway.py,sha256=
|
|
25
|
+
devsecops_engine_tools/engine_core/src/domain/model/gateway/vulnerability_management_gateway.py,sha256=dT2YDlWJ4Zvny_5uCTtxBojw4i77UOgGbs8p2jlRo74,1137
|
|
26
26
|
devsecops_engine_tools/engine_core/src/domain/usecases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
27
|
devsecops_engine_tools/engine_core/src/domain/usecases/break_build.py,sha256=0JK4U5LGxzrLVZOw68j1PMxmLTDPru7Kts_-RtAG0jA,15965
|
|
28
28
|
devsecops_engine_tools/engine_core/src/domain/usecases/handle_risk.py,sha256=1vctNN5aSPGsSgrldPiYg2Fq86q6Z9DzFdazjWAm2Do,8133
|
|
@@ -36,7 +36,7 @@ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/secret
|
|
|
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=blI4ZrquRE4y6DJ7N2YRx1nL0wrAXvdpx0fLSUf5qwA,4831
|
|
38
38
|
devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
39
|
-
devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py,sha256=
|
|
39
|
+
devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py,sha256=XKM107OQZ75sb1oeOqJKintyRAR9q8k1fkoe2sm7nBo,18190
|
|
40
40
|
devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
41
41
|
devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/github_actions.py,sha256=pxlgjhX4-Dssn-XHKK8AdCOj6Ry6VcQtoDf5q8CxTks,3731
|
|
42
42
|
devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/printer_pretty_table/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -276,6 +276,24 @@ devsecops_engine_tools/engine_utilities/github/models/__init__.py,sha256=47DEQpj
|
|
|
276
276
|
devsecops_engine_tools/engine_utilities/input_validations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
277
277
|
devsecops_engine_tools/engine_utilities/input_validations/env_utils.py,sha256=nHp9YIuG1k-IvxssQslrE9ny62juJMovmBTzcM7PPk0,258
|
|
278
278
|
devsecops_engine_tools/engine_utilities/input_validations/validate_input_with_regex_letters_number_and_only.py,sha256=uIevSfVC2Qyzc4bqR13Z7_JNr5JyiqwYYxORYW33F1s,255
|
|
279
|
+
devsecops_engine_tools/engine_utilities/sonarqube/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
280
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
281
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
282
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/applications/runner_report_sonar.py,sha256=OdCw5wXBO9Qd6tzsHdoa_V4xt_n2cfEk4RRsl3zVIZc,3649
|
|
283
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
284
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
285
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/gateways/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
286
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/gateways/sonar_gateway.py,sha256=PCrGq7NOINAFPvmX-5V5191MGhahsnQeWXUB1-xL4Xw,1279
|
|
287
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/domain/usecases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
288
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/domain/usecases/report_sonar.py,sha256=Ro22sTPYKK2DYIxDEAIMUb6evHWIKPQi8ujcG6AzrWM,8828
|
|
289
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
290
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
291
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/sonarqube/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
292
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/sonarqube/sonarqube_report.py,sha256=eKzxONP3pP4d2MIknC5sGVuxcHzgelt5D0Kun88WBMo,4514
|
|
293
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
294
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/entry_points/entry_point_report_sonar.py,sha256=uqHo00PCaDq7H4sce1tVKRglYy0dGQMWe9z52imVWhM,1520
|
|
295
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
296
|
+
devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/helpers/utils.py,sha256=SGOWrkzQrvOt9bRhhSfgiMzj1695e1W0B9ox9C1ihQI,294
|
|
279
297
|
devsecops_engine_tools/engine_utilities/ssh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
280
298
|
devsecops_engine_tools/engine_utilities/ssh/managment_private_key.py,sha256=Vvrro2e_YyvtKY9WzPUVOFTd-fiibohcG6wWHjLHAWg,2369
|
|
281
299
|
devsecops_engine_tools/engine_utilities/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -286,9 +304,9 @@ devsecops_engine_tools/engine_utilities/utils/logger_info.py,sha256=4Mz8Bwlm9Mku
|
|
|
286
304
|
devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGaxYSDe0ZRh6VHRf53H4sXPcb-vNP_i81PUn3I,307
|
|
287
305
|
devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=amYAr9YQfYgR6jK9a2l26z3oovFPQ3FAKmhq6BKhEBA,623
|
|
288
306
|
devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=yNtlT-8Legz1sHbGPH8LNYjL-LgDUE0zXG2rYjiab7U,290
|
|
289
|
-
devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=
|
|
290
|
-
devsecops_engine_tools-1.
|
|
291
|
-
devsecops_engine_tools-1.
|
|
292
|
-
devsecops_engine_tools-1.
|
|
293
|
-
devsecops_engine_tools-1.
|
|
294
|
-
devsecops_engine_tools-1.
|
|
307
|
+
devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=r_mng-OVWeqQyy6yIFsCeJrvH81VUPI3o1zdJO0JS0I,397
|
|
308
|
+
devsecops_engine_tools-1.15.0.dist-info/METADATA,sha256=hK8nqnmEBOpmgVpjp4ftTCilioBG1NBqamqKbkGduBw,10854
|
|
309
|
+
devsecops_engine_tools-1.15.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
|
310
|
+
devsecops_engine_tools-1.15.0.dist-info/entry_points.txt,sha256=MHCTFFs9bdNKo6YcWCcBW2_8X6yTisgLOlmVx-V8Rxc,276
|
|
311
|
+
devsecops_engine_tools-1.15.0.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
|
|
312
|
+
devsecops_engine_tools-1.15.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
[console_scripts]
|
|
2
|
+
devsecops-engine-tools = devsecops_engine_tools.engine_core.src.applications.runner_engine_core:application_core
|
|
3
|
+
devsecops-engine-tools.report-sonar = devsecops_engine_tools.engine_utilities.sonarqube.src.applications.runner_report_sonar:runner_report_sonar
|
|
File without changes
|
{devsecops_engine_tools-1.14.6.dist-info → devsecops_engine_tools-1.15.0.dist-info}/top_level.txt
RENAMED
|
File without changes
|