Skip to content

Commit 4ec7c52

Browse files
authored
RedTanny/config_threads
Config threads
2 parents d0c9a56 + 028c6d0 commit 4ec7c52

File tree

3 files changed

+53
-6
lines changed

3 files changed

+53
-6
lines changed

src/config.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class Configuration:
3636
DEFAULT_LOG_LEVEL = logging.DEBUG
3737
DEFAULT_LANGUAGE = None # None means run all languages
3838
DEFAULT_STRICT_MODE = False # None means run all languages
39+
DEFAULT_NUM_THREADS = 2
3940

4041
# Environment variable names
4142
ENV_SERVICE_URL = "SERVICE_URL"
@@ -45,6 +46,7 @@ class Configuration:
4546
ENV_LOG_LEVEL = "LOG_LEVEL"
4647
ENV_LANGUAGE = "LANGUAGE"
4748
ENV_STRICT_MODE = "STRICT_MODE"
49+
ENV_NUM_THREADS = "NUM_THREADS"
4850

4951
def __init__(
5052
self,
@@ -54,7 +56,8 @@ def __init__(
5456
timeout: Optional[int] = None,
5557
log_level: Optional[int] = None,
5658
language: Optional[str] = None,
57-
strict_mode: Optional[str] = None
59+
strict_mode: Optional[str] = None,
60+
num_threads: Optional[int] = None
5861
):
5962
"""
6063
Initialize Configuration with provided values or defaults.
@@ -67,6 +70,7 @@ def __init__(
6770
log_level: Logging level
6871
language: Language filter (e.g., 'c', 'go', 'python'). None means run all languages.
6972
strict_mode: Stricter matching mode for integration tests
73+
num_threads: Number of threads to use
7074
"""
7175
# Resolve paths to absolute paths
7276
self.input_dir = os.path.abspath(
@@ -122,6 +126,18 @@ def __init__(
122126
self.DEFAULT_STRICT_MODE
123127
)
124128

129+
# Get num_threads with precedence
130+
num_threads_str = self._get_env(self.ENV_NUM_THREADS)
131+
if num_threads is not None:
132+
self.num_threads = num_threads
133+
elif num_threads_str:
134+
try:
135+
self.num_threads = int(num_threads_str)
136+
except ValueError:
137+
self.num_threads = self.DEFAULT_NUM_THREADS
138+
else:
139+
self.num_threads = self.DEFAULT_NUM_THREADS
140+
125141

126142
@classmethod
127143
def create(
@@ -169,6 +185,9 @@ def create(
169185
if hasattr(args, 'strict_mode') and args.strict_mode is not None:
170186
kwargs['strict_mode'] = args.strict_mode
171187

188+
if hasattr(args, 'num_threads') and args.num_threads is not None:
189+
kwargs['num_threads'] = args.num_threads
190+
172191

173192
# Create with only the provided CLI args
174193
# __init__ will handle precedence: provided value > env var > default
@@ -244,7 +263,8 @@ def __repr__(self) -> str:
244263
f"service_url={self.service_url!r}, "
245264
f"timeout={self.timeout}, "
246265
f"log_level={self.log_level}, "
247-
f"language={self.language!r})"
266+
f"language={self.language!r}, "
267+
f"num_threads={self.num_threads})"
248268
)
249269

250270

@@ -275,6 +295,7 @@ def __init__(
275295
timeout: Optional[int] = None,
276296
log_level: Optional[int] = None,
277297
language: Optional[str] = None,
298+
num_threads: Optional[int] = None,
278299
gsheets_mode: Optional[str] = None,
279300
input_sheet_id: Optional[str] = None,
280301
output_sheet_id: Optional[str] = None,
@@ -291,6 +312,7 @@ def __init__(
291312
timeout: Request timeout in seconds
292313
log_level: Logging level
293314
language: Language filter (e.g., 'c', 'go', 'python'). None means run all languages.
315+
num_threads: Number of threads to use
294316
gsheets_mode: Google Sheets mode: 'none', 'input', 'output', or 'both'
295317
input_sheet_id: Google Sheets ID for reading input data
296318
output_sheet_id: Google Sheets ID for writing results
@@ -304,7 +326,8 @@ def __init__(
304326
service_url=service_url,
305327
timeout=timeout,
306328
log_level=log_level,
307-
language=language
329+
language=language,
330+
num_threads=num_threads
308331
)
309332

310333
# Google Sheets mode
@@ -420,6 +443,8 @@ def create(
420443
kwargs['log_level'] = Configuration._parse_log_level_static(args.log_level)
421444
if hasattr(args, 'language') and args.language is not None:
422445
kwargs['language'] = args.language
446+
if hasattr(args, 'num_threads') and args.num_threads is not None:
447+
kwargs['num_threads'] = args.num_threads
423448

424449
# Extract Google Sheets kwargs
425450
if hasattr(args, 'gsheets_mode') and args.gsheets_mode is not None:

src/execution.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,10 @@ def run(self) -> None:
427427
Reads scan configuration, generates payloads, sends requests concurrently,
428428
and saves results for each test and iteration.
429429
"""
430+
431+
def valid_num_threads(num_threads: int) -> bool:
432+
return num_threads > 0 and num_threads <= 5
433+
430434
logger.info("Starting vulnerability automation execution")
431435

432436
try:
@@ -484,7 +488,10 @@ def run(self) -> None:
484488
# Phase 2: Execute all requests concurrently
485489
if execution_payloads:
486490
logger.info(f"Executing {len(execution_payloads)} request(s) concurrently")
487-
concurrent_executor = ConcurrentExecutor(execution=self, num_of_processes=2)
491+
if not valid_num_threads(self.config.num_threads):
492+
logger.error(f"Invalid number of threads: {self.config.num_threads} set to default of 2")
493+
self.config.num_threads = 2
494+
concurrent_executor = ConcurrentExecutor(execution=self, num_of_processes=self.config.num_threads)
488495
responses = concurrent_executor.run_requests(execution_payloads)
489496

490497
# Phase 3: Process results and save them
@@ -534,6 +541,10 @@ def run(self) -> None:
534541
raise
535542

536543
def prepare_tests(self, scan_config_override: Union[str, None]) -> tuple:
544+
545+
def valid_language( language: str) -> bool:
546+
valid_languages = ["c", "go", "python","java","javascript","rust"]
547+
return language.lower() in valid_languages
537548
# Read scan configuration
538549
scan_config = self.read_scan_config(scan_config_override)
539550

@@ -545,9 +556,9 @@ def prepare_tests(self, scan_config_override: Union[str, None]) -> tuple:
545556

546557
iterations = scan_config['iterations']
547558
tests = scan_config['tests']
548-
559+
self.config.language ="None"
549560
# Filter tests by language if specified in config
550-
if self.config.language:
561+
if self.config.language and valid_language(self.config.language):
551562
original_count = len(tests)
552563
tests = [
553564
test for test in tests

src/vulnerability_main_automation.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,14 @@ def create_argument_parser() -> argparse.ArgumentParser:
101101
'If not specified, runs all languages. '
102102
'(default: None or LANGUAGE env var)'
103103
)
104+
105+
parser.add_argument(
106+
'--num-threads',
107+
type=int,
108+
default=None,
109+
help='Number of threads to use for the vulnerability automation '
110+
'(default: 2 or NUM_THREADS env var)'
111+
)
104112

105113
# Google Sheets integration arguments
106114
parser.add_argument(
@@ -198,6 +206,9 @@ def main():
198206
if "language" in config_override:
199207
logger.info("Override Language filter: %s with value %s from Google Sheets", config.language, config_override["language"])
200208
config.language = config_override["language"]
209+
if "num_threads" in config_override:
210+
logger.info("Override Number of threads: %s with value %s from Google Sheets", config.num_threads, config_override["num_threads"])
211+
config.num_threads = int(config_override["num_threads"])
201212
logger.info("Successfully generated scan.json from Google Sheets")
202213
except Exception as e:
203214
logger.error(f"Failed to generate scan.json from Google Sheets: {e}", exc_info=True)

0 commit comments

Comments
 (0)