regscale-cli 6.26.0.0__py3-none-any.whl → 6.27.0.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 regscale-cli might be problematic. Click here for more details.

Files changed (95) hide show
  1. regscale/_version.py +1 -1
  2. regscale/core/app/application.py +1 -1
  3. regscale/core/app/internal/evidence.py +419 -2
  4. regscale/dev/code_gen.py +24 -20
  5. regscale/integrations/commercial/jira.py +367 -126
  6. regscale/integrations/commercial/qualys/__init__.py +7 -8
  7. regscale/integrations/commercial/qualys/scanner.py +8 -3
  8. regscale/integrations/commercial/synqly/assets.py +17 -0
  9. regscale/integrations/commercial/synqly/vulnerabilities.py +45 -28
  10. regscale/integrations/commercial/tenablev2/cis_parsers.py +453 -0
  11. regscale/integrations/commercial/tenablev2/cis_scanner.py +447 -0
  12. regscale/integrations/commercial/tenablev2/commands.py +142 -1
  13. regscale/integrations/commercial/tenablev2/scanner.py +0 -1
  14. regscale/integrations/commercial/tenablev2/stig_parsers.py +113 -57
  15. regscale/integrations/commercial/wizv2/WizDataMixin.py +1 -1
  16. regscale/integrations/commercial/wizv2/click.py +44 -59
  17. regscale/integrations/commercial/wizv2/compliance/__init__.py +15 -0
  18. regscale/integrations/commercial/wizv2/{policy_compliance_helpers.py → compliance/helpers.py} +78 -60
  19. regscale/integrations/commercial/wizv2/compliance_report.py +10 -9
  20. regscale/integrations/commercial/wizv2/core/__init__.py +133 -0
  21. regscale/integrations/commercial/wizv2/{async_client.py → core/client.py} +3 -3
  22. regscale/integrations/commercial/wizv2/{constants.py → core/constants.py} +1 -17
  23. regscale/integrations/commercial/wizv2/core/file_operations.py +237 -0
  24. regscale/integrations/commercial/wizv2/fetchers/__init__.py +11 -0
  25. regscale/integrations/commercial/wizv2/{data_fetcher.py → fetchers/policy_assessment.py} +5 -9
  26. regscale/integrations/commercial/wizv2/issue.py +1 -1
  27. regscale/integrations/commercial/wizv2/models/__init__.py +0 -0
  28. regscale/integrations/commercial/wizv2/parsers/__init__.py +34 -0
  29. regscale/integrations/commercial/wizv2/{parsers.py → parsers/main.py} +1 -1
  30. regscale/integrations/commercial/wizv2/processors/__init__.py +11 -0
  31. regscale/integrations/commercial/wizv2/{finding_processor.py → processors/finding.py} +1 -1
  32. regscale/integrations/commercial/wizv2/reports.py +1 -1
  33. regscale/integrations/commercial/wizv2/sbom.py +1 -1
  34. regscale/integrations/commercial/wizv2/scanner.py +40 -100
  35. regscale/integrations/commercial/wizv2/utils/__init__.py +48 -0
  36. regscale/integrations/commercial/wizv2/{utils.py → utils/main.py} +116 -61
  37. regscale/integrations/commercial/wizv2/variables.py +89 -3
  38. regscale/integrations/compliance_integration.py +0 -46
  39. regscale/integrations/control_matcher.py +22 -3
  40. regscale/integrations/due_date_handler.py +14 -8
  41. regscale/integrations/public/fedramp/docx_parser.py +10 -1
  42. regscale/integrations/public/fedramp/fedramp_cis_crm.py +393 -340
  43. regscale/integrations/public/fedramp/fedramp_five.py +1 -1
  44. regscale/integrations/scanner_integration.py +127 -57
  45. regscale/models/integration_models/cisa_kev_data.json +132 -9
  46. regscale/models/integration_models/qualys.py +3 -4
  47. regscale/models/integration_models/synqly_models/capabilities.json +1 -1
  48. regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +24 -7
  49. regscale/models/integration_models/synqly_models/synqly_model.py +8 -1
  50. regscale/models/regscale_models/control_implementation.py +1 -1
  51. regscale/models/regscale_models/issue.py +0 -1
  52. {regscale_cli-6.26.0.0.dist-info → regscale_cli-6.27.0.0.dist-info}/METADATA +1 -17
  53. {regscale_cli-6.26.0.0.dist-info → regscale_cli-6.27.0.0.dist-info}/RECORD +93 -60
  54. tests/regscale/integrations/commercial/test_jira.py +481 -91
  55. tests/regscale/integrations/commercial/test_wiz.py +96 -200
  56. tests/regscale/integrations/commercial/wizv2/__init__.py +1 -1
  57. tests/regscale/integrations/commercial/wizv2/compliance/__init__.py +1 -0
  58. tests/regscale/integrations/commercial/wizv2/compliance/test_helpers.py +903 -0
  59. tests/regscale/integrations/commercial/wizv2/core/__init__.py +1 -0
  60. tests/regscale/integrations/commercial/wizv2/core/test_auth.py +701 -0
  61. tests/regscale/integrations/commercial/wizv2/core/test_client.py +1037 -0
  62. tests/regscale/integrations/commercial/wizv2/core/test_file_operations.py +989 -0
  63. tests/regscale/integrations/commercial/wizv2/fetchers/__init__.py +1 -0
  64. tests/regscale/integrations/commercial/wizv2/fetchers/test_policy_assessment.py +805 -0
  65. tests/regscale/integrations/commercial/wizv2/parsers/__init__.py +1 -0
  66. tests/regscale/integrations/commercial/wizv2/parsers/test_main.py +1153 -0
  67. tests/regscale/integrations/commercial/wizv2/processors/__init__.py +1 -0
  68. tests/regscale/integrations/commercial/wizv2/processors/test_finding.py +671 -0
  69. tests/regscale/integrations/commercial/wizv2/test_WizDataMixin.py +537 -0
  70. tests/regscale/integrations/commercial/wizv2/test_click_comprehensive.py +851 -0
  71. tests/regscale/integrations/commercial/wizv2/test_compliance_report_comprehensive.py +910 -0
  72. tests/regscale/integrations/commercial/wizv2/test_file_cleanup.py +283 -0
  73. tests/regscale/integrations/commercial/wizv2/test_file_operations.py +260 -0
  74. tests/regscale/integrations/commercial/wizv2/test_issue.py +1 -1
  75. tests/regscale/integrations/commercial/wizv2/test_issue_comprehensive.py +1203 -0
  76. tests/regscale/integrations/commercial/wizv2/test_reports.py +497 -0
  77. tests/regscale/integrations/commercial/wizv2/test_sbom.py +643 -0
  78. tests/regscale/integrations/commercial/wizv2/test_scanner_comprehensive.py +805 -0
  79. tests/regscale/integrations/commercial/wizv2/test_wiz_click_client_id.py +1 -1
  80. tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_report.py +72 -29
  81. tests/regscale/integrations/commercial/wizv2/test_wiz_findings_comprehensive.py +364 -0
  82. tests/regscale/integrations/commercial/wizv2/test_wiz_inventory_comprehensive.py +644 -0
  83. tests/regscale/integrations/commercial/wizv2/test_wizv2.py +946 -78
  84. tests/regscale/integrations/commercial/wizv2/test_wizv2_utils.py +97 -202
  85. tests/regscale/integrations/commercial/wizv2/utils/__init__.py +1 -0
  86. tests/regscale/integrations/commercial/wizv2/utils/test_main.py +1523 -0
  87. tests/regscale/integrations/public/test_fedramp.py +301 -0
  88. tests/regscale/integrations/test_control_matcher.py +83 -0
  89. regscale/integrations/commercial/wizv2/policy_compliance.py +0 -3543
  90. tests/regscale/integrations/commercial/wizv2/test_wiz_policy_compliance.py +0 -750
  91. /regscale/integrations/commercial/wizv2/{wiz_auth.py → core/auth.py} +0 -0
  92. {regscale_cli-6.26.0.0.dist-info → regscale_cli-6.27.0.0.dist-info}/LICENSE +0 -0
  93. {regscale_cli-6.26.0.0.dist-info → regscale_cli-6.27.0.0.dist-info}/WHEEL +0 -0
  94. {regscale_cli-6.26.0.0.dist-info → regscale_cli-6.27.0.0.dist-info}/entry_points.txt +0 -0
  95. {regscale_cli-6.26.0.0.dist-info → regscale_cli-6.27.0.0.dist-info}/top_level.txt +0 -0
@@ -34,9 +34,8 @@ from regscale.integrations.commercial.qualys.scanner import QualysTotalCloudJSON
34
34
  from regscale.integrations.commercial.qualys.variables import QualysVariables
35
35
  from regscale.integrations.scanner_integration import IntegrationAsset, IntegrationFinding
36
36
  from regscale.integrations.variables import ScannerVariables
37
- from regscale.models import Asset, Issue, Search, regscale_models
38
- from regscale.models.app_models.click import NotRequiredIf, regscale_ssp_id, save_output_to, ssp_or_component_id
39
- from regscale.models.integration_models.ecr_models.data import Finding
37
+ from regscale.models import Asset, Issue, Search, regscale_models, IssueStatus, IssueSeverity
38
+ from regscale.models.app_models.click import NotRequiredIf, save_output_to, ssp_or_component_id
40
39
  from regscale.models.integration_models.flat_file_importer import FlatFileImporter
41
40
  from regscale.models.integration_models.qualys import (
42
41
  Qualys,
@@ -2116,7 +2115,7 @@ def lookup_asset(asset_list: list, asset_id: str = None) -> list[Asset]:
2116
2115
  return list(set(asset_list)) or []
2117
2116
 
2118
2117
 
2119
- def map_qualys_severity_to_regscale(severity: int) -> tuple[str, str]:
2118
+ def map_qualys_severity_to_regscale(severity: int) -> tuple[IssueSeverity, str]:
2120
2119
  """
2121
2120
  Map Qualys vulnerability severity to RegScale Issue severity
2122
2121
 
@@ -2125,12 +2124,12 @@ def map_qualys_severity_to_regscale(severity: int) -> tuple[str, str]:
2125
2124
  :rtype: tuple[str, str]
2126
2125
  """
2127
2126
  if severity <= 2:
2128
- return "III - Low - Other Weakness", "low"
2127
+ return IssueSeverity.Low, "low"
2129
2128
  if severity == 3:
2130
- return "II - Moderate - Reportable Condition", "moderate"
2129
+ return IssueSeverity.Moderate, "moderate"
2131
2130
  if severity > 3:
2132
- return "I - High - Significant Deficiency", "high"
2133
- return "IV - Not Assigned", "low"
2131
+ return IssueSeverity.High, "high"
2132
+ return IssueSeverity.NotAssigned, "low"
2134
2133
 
2135
2134
 
2136
2135
  def create_regscale_issue_from_vuln(
@@ -4,6 +4,7 @@ Qualys Total Cloud scanner integration class using JSONLScannerIntegration.
4
4
 
5
5
  import logging
6
6
  import os
7
+ import threading
7
8
  import time
8
9
  import traceback
9
10
  import xml.etree.ElementTree as ET
@@ -1554,17 +1555,21 @@ class QualysTotalCloudJSONLIntegration(JSONLScannerIntegration):
1554
1555
 
1555
1556
  return vulnerability_id
1556
1557
 
1557
- def set_severity_count_for_scan(self, severity: str, scan_history: regscale_models.ScanHistory) -> None:
1558
+ def set_severity_count_for_scan(
1559
+ self, severity: str, scan_history: regscale_models.ScanHistory, lock: Optional[threading.RLock] = None
1560
+ ) -> None:
1558
1561
  """
1559
1562
  Override parent method to ensure Qualys scan history severity counts are properly updated.
1560
1563
  This ensures that the vulnerability counts are accurately reflected in the scan history.
1561
1564
 
1562
1565
  :param str severity: Severity of the vulnerability
1563
1566
  :param regscale_models.ScanHistory scan_history: Scan history object
1567
+ :param Optional[threading.RLock] lock: Thread lock for synchronization
1564
1568
  :rtype: None
1565
1569
  """
1566
- # Use parent method to update severity counts
1567
- super().set_severity_count_for_scan(severity, scan_history)
1570
+ # Use parent method to update severity counts with thread-safe locking
1571
+ # Pass lock if provided, otherwise use our instance lock
1572
+ super().set_severity_count_for_scan(severity, scan_history, lock or self.scan_history_lock)
1568
1573
 
1569
1574
  def create_scan_history(self) -> regscale_models.ScanHistory:
1570
1575
  """
@@ -74,6 +74,23 @@ def sync_axonius(regscale_ssp_id: int, filter: str) -> None:
74
74
  assets_axonius.run_sync(regscale_ssp_id=regscale_ssp_id, filter=filter.split(";") if filter else [])
75
75
 
76
76
 
77
+ @assets.command(name="sync_claroty_xdome")
78
+ @regscale_ssp_id()
79
+ @click.option(
80
+ "--filter",
81
+ help='STRING: Apply filters to the query. Can be a single filter "field[operator]value" or semicolon-separated filters "field1[op]value1;field2[op]value2"',
82
+ required=False,
83
+ type=str,
84
+ default=None,
85
+ )
86
+ def sync_claroty_xdome(regscale_ssp_id: int, filter: str) -> None:
87
+ """Sync Assets from Claroty Xdome to RegScale."""
88
+ from regscale.models.integration_models.synqly_models.connectors import Assets
89
+
90
+ assets_claroty_xdome = Assets("claroty_xdome")
91
+ assets_claroty_xdome.run_sync(regscale_ssp_id=regscale_ssp_id, filter=filter.split(";") if filter else [])
92
+
93
+
77
94
  @assets.command(name="sync_crowdstrike")
78
95
  @regscale_ssp_id()
79
96
  @click.option(
@@ -44,8 +44,9 @@ def build_query(provider, validate, list_fields):
44
44
  @vulnerabilities.command(name="sync_crowdstrike")
45
45
  @regscale_ssp_id()
46
46
  @click.option(
47
- "--vuln_filter",
48
- help="Filter the vulnerabilities for the selected severity. (Options: critical, high, medium, low, info)",
47
+ "--minimum_severity_filter",
48
+ "-s",
49
+ help="Minimum severity of the vulnerabilities to sync. (Options: critical, high, medium, low, info), e.g. providing high will sync all vulnerabilities with a severity of high and critical.",
49
50
  required=False,
50
51
  type=click.Choice(["critical", "high", "medium", "low", "info"]),
51
52
  default=None,
@@ -78,7 +79,12 @@ def build_query(provider, validate, list_fields):
78
79
  required=False,
79
80
  )
80
81
  def sync_crowdstrike(
81
- regscale_ssp_id: int, vuln_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str, url: str
82
+ regscale_ssp_id: int,
83
+ minimum_severity_filter: str,
84
+ scan_date: datetime,
85
+ all_scans: bool,
86
+ asset_filter: str,
87
+ url: str,
82
88
  ) -> None:
83
89
  """Sync Vulnerabilities from Crowdstrike to RegScale."""
84
90
  from regscale.models.integration_models.synqly_models.connectors import Vulnerabilities
@@ -86,7 +92,7 @@ def sync_crowdstrike(
86
92
  vulnerabilities_crowdstrike = Vulnerabilities("crowdstrike")
87
93
  vulnerabilities_crowdstrike.run_sync(
88
94
  regscale_ssp_id=regscale_ssp_id,
89
- vuln_filter=vuln_filter,
95
+ minimum_severity_filter=minimum_severity_filter,
90
96
  scan_date=scan_date,
91
97
  all_scans=all_scans,
92
98
  filter=asset_filter.split(";") if asset_filter else [],
@@ -97,8 +103,9 @@ def sync_crowdstrike(
97
103
  @vulnerabilities.command(name="sync_nucleus")
98
104
  @regscale_ssp_id()
99
105
  @click.option(
100
- "--vuln_filter",
101
- help="Filter the vulnerabilities for the selected severity. (Options: critical, high, medium, low, info)",
106
+ "--minimum_severity_filter",
107
+ "-s",
108
+ help="Minimum severity of the vulnerabilities to sync. (Options: critical, high, medium, low, info), e.g. providing high will sync all vulnerabilities with a severity of high and critical.",
102
109
  required=False,
103
110
  type=click.Choice(["critical", "high", "medium", "low", "info"]),
104
111
  default=None,
@@ -121,7 +128,7 @@ def sync_crowdstrike(
121
128
  default=None,
122
129
  )
123
130
  def sync_nucleus(
124
- regscale_ssp_id: int, vuln_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str
131
+ regscale_ssp_id: int, minimum_severity_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str
125
132
  ) -> None:
126
133
  """Sync Vulnerabilities from Nucleus to RegScale."""
127
134
  from regscale.models.integration_models.synqly_models.connectors import Vulnerabilities
@@ -129,7 +136,7 @@ def sync_nucleus(
129
136
  vulnerabilities_nucleus = Vulnerabilities("nucleus")
130
137
  vulnerabilities_nucleus.run_sync(
131
138
  regscale_ssp_id=regscale_ssp_id,
132
- vuln_filter=vuln_filter,
139
+ minimum_severity_filter=minimum_severity_filter,
133
140
  scan_date=scan_date,
134
141
  all_scans=all_scans,
135
142
  filter=asset_filter.split(";") if asset_filter else [],
@@ -139,8 +146,9 @@ def sync_nucleus(
139
146
  @vulnerabilities.command(name="sync_qualys_cloud")
140
147
  @regscale_ssp_id()
141
148
  @click.option(
142
- "--vuln_filter",
143
- help="Filter the vulnerabilities for the selected severity. (Options: critical, high, medium, low, info)",
149
+ "--minimum_severity_filter",
150
+ "-s",
151
+ help="Minimum severity of the vulnerabilities to sync. (Options: critical, high, medium, low, info), e.g. providing high will sync all vulnerabilities with a severity of high and critical.",
144
152
  required=False,
145
153
  type=click.Choice(["critical", "high", "medium", "low", "info"]),
146
154
  default=None,
@@ -167,7 +175,7 @@ def sync_nucleus(
167
175
  default=None,
168
176
  )
169
177
  def sync_qualys_cloud(
170
- regscale_ssp_id: int, vuln_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str
178
+ regscale_ssp_id: int, minimum_severity_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str
171
179
  ) -> None:
172
180
  """Sync Vulnerabilities from Qualys Cloud to RegScale."""
173
181
  from regscale.models.integration_models.synqly_models.connectors import Vulnerabilities
@@ -175,7 +183,7 @@ def sync_qualys_cloud(
175
183
  vulnerabilities_qualys_cloud = Vulnerabilities("qualys_cloud")
176
184
  vulnerabilities_qualys_cloud.run_sync(
177
185
  regscale_ssp_id=regscale_ssp_id,
178
- vuln_filter=vuln_filter,
186
+ minimum_severity_filter=minimum_severity_filter,
179
187
  scan_date=scan_date,
180
188
  all_scans=all_scans,
181
189
  filter=asset_filter.split(";") if asset_filter else [],
@@ -185,8 +193,9 @@ def sync_qualys_cloud(
185
193
  @vulnerabilities.command(name="sync_rapid7_insight_cloud")
186
194
  @regscale_ssp_id()
187
195
  @click.option(
188
- "--vuln_filter",
189
- help="Filter the vulnerabilities for the selected severity. (Options: critical, high, medium, low, info)",
196
+ "--minimum_severity_filter",
197
+ "-s",
198
+ help="Minimum severity of the vulnerabilities to sync. (Options: critical, high, medium, low, info), e.g. providing high will sync all vulnerabilities with a severity of high and critical.",
190
199
  required=False,
191
200
  type=click.Choice(["critical", "high", "medium", "low", "info"]),
192
201
  default=None,
@@ -213,7 +222,7 @@ def sync_qualys_cloud(
213
222
  default=None,
214
223
  )
215
224
  def sync_rapid7_insight_cloud(
216
- regscale_ssp_id: int, vuln_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str
225
+ regscale_ssp_id: int, minimum_severity_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str
217
226
  ) -> None:
218
227
  """Sync Vulnerabilities from Rapid7 Insight Cloud to RegScale."""
219
228
  from regscale.models.integration_models.synqly_models.connectors import Vulnerabilities
@@ -221,7 +230,7 @@ def sync_rapid7_insight_cloud(
221
230
  vulnerabilities_rapid7_insight_cloud = Vulnerabilities("rapid7_insight_cloud")
222
231
  vulnerabilities_rapid7_insight_cloud.run_sync(
223
232
  regscale_ssp_id=regscale_ssp_id,
224
- vuln_filter=vuln_filter,
233
+ minimum_severity_filter=minimum_severity_filter,
225
234
  scan_date=scan_date,
226
235
  all_scans=all_scans,
227
236
  filter=asset_filter.split(";") if asset_filter else [],
@@ -231,8 +240,9 @@ def sync_rapid7_insight_cloud(
231
240
  @vulnerabilities.command(name="sync_servicenow_vr")
232
241
  @regscale_ssp_id()
233
242
  @click.option(
234
- "--vuln_filter",
235
- help="Filter the vulnerabilities for the selected severity. (Options: critical, high, medium, low, info)",
243
+ "--minimum_severity_filter",
244
+ "-s",
245
+ help="Minimum severity of the vulnerabilities to sync. (Options: critical, high, medium, low, info), e.g. providing high will sync all vulnerabilities with a severity of high and critical.",
236
246
  required=False,
237
247
  type=click.Choice(["critical", "high", "medium", "low", "info"]),
238
248
  default=None,
@@ -259,7 +269,7 @@ def sync_rapid7_insight_cloud(
259
269
  default=None,
260
270
  )
261
271
  def sync_servicenow_vr(
262
- regscale_ssp_id: int, vuln_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str
272
+ regscale_ssp_id: int, minimum_severity_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str
263
273
  ) -> None:
264
274
  """Sync Vulnerabilities from Servicenow Vr to RegScale."""
265
275
  from regscale.models.integration_models.synqly_models.connectors import Vulnerabilities
@@ -267,7 +277,7 @@ def sync_servicenow_vr(
267
277
  vulnerabilities_servicenow_vr = Vulnerabilities("servicenow_vr")
268
278
  vulnerabilities_servicenow_vr.run_sync(
269
279
  regscale_ssp_id=regscale_ssp_id,
270
- vuln_filter=vuln_filter,
280
+ minimum_severity_filter=minimum_severity_filter,
271
281
  scan_date=scan_date,
272
282
  all_scans=all_scans,
273
283
  filter=asset_filter.split(";") if asset_filter else [],
@@ -277,8 +287,9 @@ def sync_servicenow_vr(
277
287
  @vulnerabilities.command(name="sync_tanium_cloud")
278
288
  @regscale_ssp_id()
279
289
  @click.option(
280
- "--vuln_filter",
281
- help="Filter the vulnerabilities for the selected severity. (Options: critical, high, medium, low, info)",
290
+ "--minimum_severity_filter",
291
+ "-s",
292
+ help="Minimum severity of the vulnerabilities to sync. (Options: critical, high, medium, low, info), e.g. providing high will sync all vulnerabilities with a severity of high and critical.",
282
293
  required=False,
283
294
  type=click.Choice(["critical", "high", "medium", "low", "info"]),
284
295
  default=None,
@@ -305,7 +316,7 @@ def sync_servicenow_vr(
305
316
  default=None,
306
317
  )
307
318
  def sync_tanium_cloud(
308
- regscale_ssp_id: int, vuln_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str
319
+ regscale_ssp_id: int, minimum_severity_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str
309
320
  ) -> None:
310
321
  """Sync Vulnerabilities from Tanium Cloud to RegScale."""
311
322
  from regscale.models.integration_models.synqly_models.connectors import Vulnerabilities
@@ -313,7 +324,7 @@ def sync_tanium_cloud(
313
324
  vulnerabilities_tanium_cloud = Vulnerabilities("tanium_cloud")
314
325
  vulnerabilities_tanium_cloud.run_sync(
315
326
  regscale_ssp_id=regscale_ssp_id,
316
- vuln_filter=vuln_filter,
327
+ minimum_severity_filter=minimum_severity_filter,
317
328
  scan_date=scan_date,
318
329
  all_scans=all_scans,
319
330
  filter=asset_filter.split(";") if asset_filter else [],
@@ -323,8 +334,9 @@ def sync_tanium_cloud(
323
334
  @vulnerabilities.command(name="sync_tenable_cloud")
324
335
  @regscale_ssp_id()
325
336
  @click.option(
326
- "--vuln_filter",
327
- help="Filter the vulnerabilities for the selected severity. (Options: critical, high, medium, low, info)",
337
+ "--minimum_severity_filter",
338
+ "-s",
339
+ help="Minimum severity of the vulnerabilities to sync. (Options: critical, high, medium, low, info), e.g. providing high will sync all vulnerabilities with a severity of high and critical.",
328
340
  required=False,
329
341
  type=click.Choice(["critical", "high", "medium", "low", "info"]),
330
342
  default=None,
@@ -357,7 +369,12 @@ def sync_tanium_cloud(
357
369
  required=False,
358
370
  )
359
371
  def sync_tenable_cloud(
360
- regscale_ssp_id: int, vuln_filter: str, scan_date: datetime, all_scans: bool, asset_filter: str, url: str
372
+ regscale_ssp_id: int,
373
+ minimum_severity_filter: str,
374
+ scan_date: datetime,
375
+ all_scans: bool,
376
+ asset_filter: str,
377
+ url: str,
361
378
  ) -> None:
362
379
  """Sync Vulnerabilities from Tenable Cloud to RegScale."""
363
380
  from regscale.models.integration_models.synqly_models.connectors import Vulnerabilities
@@ -365,7 +382,7 @@ def sync_tenable_cloud(
365
382
  vulnerabilities_tenable_cloud = Vulnerabilities("tenable_cloud")
366
383
  vulnerabilities_tenable_cloud.run_sync(
367
384
  regscale_ssp_id=regscale_ssp_id,
368
- vuln_filter=vuln_filter,
385
+ minimum_severity_filter=minimum_severity_filter,
369
386
  scan_date=scan_date,
370
387
  all_scans=all_scans,
371
388
  filter=asset_filter.split(";") if asset_filter else [],