Skip to content

Commit 617e9a1

Browse files
Add optional delay between job processing
Prevents DOS attacks on secure servers
1 parent daf3893 commit 617e9a1

File tree

6 files changed

+13
-9
lines changed

6 files changed

+13
-9
lines changed

vcstool/commands/command.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def add_common_arguments(
5959
group.add_argument(
6060
'-w', '--workers', type=check_greater_zero, metavar='N',
6161
default=default_workers, help='Number of parallel worker threads')
62+
group.add_argument("-d", "--delay", type=float, default=0.0, help="Delay between job processing to prevent DOS")
6263
group.add_argument(
6364
'--repos', action='store_true', default=False,
6465
help='List repositories which the command operates on')
@@ -93,7 +94,7 @@ def simple_main(parser, command_class, args=None):
9394
output_repositories(clients)
9495
jobs = generate_jobs(clients, command)
9596
results = execute_jobs(
96-
jobs, show_progress=True, number_of_workers=args.workers,
97+
jobs, show_progress=True, number_of_workers=args.workers, delay_time=args.delay,
9798
debug_jobs=args.debug)
9899

99100
output_results(results, hide_empty=args.hide_empty)

vcstool/commands/custom.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def main(args=None, stdout=None, stderr=None):
8383
output_repositories(clients)
8484
jobs = generate_jobs(clients, command)
8585
results = execute_jobs(
86-
jobs, show_progress=True, number_of_workers=args.workers,
86+
jobs, show_progress=True, number_of_workers=args.workers, delay_time=args.delay,
8787
debug_jobs=args.debug)
8888

8989
output_results(results, hide_empty=args.hide_empty)

vcstool/commands/export.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def main(args=None, stdout=None, stderr=None):
9595
if command.output_repos:
9696
output_repositories(clients)
9797
jobs = generate_jobs(clients, command)
98-
results = execute_jobs(jobs, number_of_workers=args.workers)
98+
results = execute_jobs(jobs, number_of_workers=args.workers, delay_time=args.delay)
9999

100100
# check if at least one repo was found in the client directory
101101
basename = None

vcstool/commands/import_.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ def main(args=None, stdout=None, stderr=None):
250250

251251
results = execute_jobs(
252252
jobs, show_progress=True, number_of_workers=workers,
253-
debug_jobs=args.debug)
253+
debug_jobs=args.debug, delay_time=args.delay)
254254
output_results(results)
255255

256256
any_error = any(r['returncode'] for r in results)

vcstool/commands/validate.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def main(args=None, stdout=None, stderr=None):
8080

8181
results = execute_jobs(
8282
jobs, show_progress=True, number_of_workers=args.workers,
83-
debug_jobs=args.debug)
83+
debug_jobs=args.debug, delay_time=args.delay)
8484

8585
output_results(results, hide_empty=args.hide_empty)
8686

vcstool/executor.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from queue import Empty, Queue
44
import sys
55
import threading
6+
from time import sleep
67
import traceback
78

89
logger = logging.getLogger(__name__)
@@ -79,7 +80,7 @@ def get_ready_job(jobs):
7980

8081

8182
def execute_jobs(
82-
jobs, show_progress=False, number_of_workers=10, debug_jobs=False
83+
jobs, show_progress=False, number_of_workers=10, debug_jobs=False, delay_time=0.0,
8384
):
8485
global windows_force_posix
8586
from vcstool.streams import stdout
@@ -88,7 +89,6 @@ def execute_jobs(
8889

8990
if windows_force_posix:
9091
logger.debug('force POSIX paths on Windows')
91-
9292
results = []
9393

9494
job_queue = Queue()
@@ -97,7 +97,7 @@ def execute_jobs(
9797
# create worker threads
9898
workers = []
9999
for _ in range(min(number_of_workers, len(jobs))):
100-
worker = Worker(job_queue, result_queue)
100+
worker = Worker(job_queue, result_queue, delay_time)
101101
workers.append(worker)
102102

103103
# fill job_queue with jobs for each worker
@@ -157,12 +157,13 @@ def execute_jobs(
157157

158158
class Worker(threading.Thread):
159159

160-
def __init__(self, job_queue, result_queue):
160+
def __init__(self, job_queue, result_queue, delay_time=0.0):
161161
super(Worker, self).__init__()
162162
self.daemon = True
163163
self.done = False
164164
self.job_queue = job_queue
165165
self.result_queue = result_queue
166+
self.delay_time = delay_time
166167

167168
def run(self):
168169
# process all incoming jobs
@@ -174,6 +175,8 @@ def run(self):
174175
result = self.process_job(job)
175176
# send result
176177
self.result_queue.put((job, result))
178+
if self.delay_time > 0.0:
179+
sleep(self.delay_time)
177180
except Empty:
178181
pass
179182

0 commit comments

Comments
 (0)