35
35
@receiver (post_execute )
36
36
def detect_timeout (sender , task , ** kwargs ):
37
37
"""Detect scan task timeout."""
38
- if 'Task exceeded maximum timeout' in task ['result' ]:
38
+ result = task .get ('result' )
39
+ if isinstance (result , str ) and 'Task exceeded maximum timeout' in result :
39
40
task_id = task ['id' ]
40
41
EnqueuedTask .objects .filter (task_id = task_id ).update (
41
42
app_name = 'Failed' ,
@@ -45,7 +46,7 @@ def detect_timeout(sender, task, **kwargs):
45
46
logger .error ('Task %s exceeded maximum timeout' , task_id )
46
47
47
48
48
- def async_analysis (checksum , app_name , func , * args ):
49
+ def async_analysis (checksum , api , file_name , func , * args , ** kwargs ):
49
50
"""Async Analysis Task."""
50
51
# Check if the task is already completed
51
52
recent = RecentScansDB .objects .filter (MD5 = checksum )
@@ -62,11 +63,17 @@ def async_analysis(checksum, app_name, func, *args):
62
63
if queued_recently :
63
64
if scan_completed :
64
65
# scan already completed recently
65
- logger .warning ('Analysis already completed in the last 60 minutes' )
66
+ msg = 'Analysis already completed in the last 60 minutes'
67
+ logger .warning (msg )
68
+ if api :
69
+ return {'task_id' : None , 'message' : msg }
66
70
return HttpResponseRedirect ('/tasks?q=completed' )
67
71
elif active_recently :
68
72
# scan not completed but active recently
69
- logger .warning ('Analysis already enqueued in the last 60 minutes' )
73
+ msg = 'Analysis already enqueued in the last 60 minutes'
74
+ logger .warning (msg )
75
+ if api :
76
+ return {'task_id' : None , 'message' : msg }
70
77
return HttpResponseRedirect ('/tasks?q=queued' )
71
78
72
79
# Clear old tasks
@@ -80,6 +87,7 @@ def async_analysis(checksum, app_name, func, *args):
80
87
.values_list ('id' , flat = True )[:task_count - queue_size ])
81
88
# Delete tasks by IDs
82
89
EnqueuedTask .objects .filter (id__in = oldest_task_ids ).delete ()
90
+
83
91
# Enqueue the task
84
92
task_id = async_task (
85
93
func ,
@@ -89,10 +97,12 @@ def async_analysis(checksum, app_name, func, *args):
89
97
EnqueuedTask .objects .create (
90
98
task_id = task_id ,
91
99
checksum = checksum ,
92
- file_name = app_name [:254 ])
100
+ file_name = file_name [:254 ])
93
101
msg = f'Scan Queued with ID: { task_id } '
94
102
logger .info (msg )
95
103
append_scan_status (checksum , msg )
104
+ if api :
105
+ return {'task_id' : task_id , 'message' : msg }
96
106
return HttpResponseRedirect ('/tasks' )
97
107
98
108
@@ -118,7 +128,7 @@ def get_live_status(enq):
118
128
119
129
@login_required
120
130
@require_http_methods (['POST' , 'GET' ])
121
- def list_tasks (request ):
131
+ def list_tasks (request , api = False ):
122
132
if request .method == 'POST' :
123
133
enqueued = EnqueuedTask .objects .all ().order_by ('-created_at' )
124
134
task_data = []
@@ -133,6 +143,8 @@ def list_tasks(request):
133
143
'completed_at' : enq .completed_at ,
134
144
'status' : get_live_status (enq ),
135
145
})
146
+ if api :
147
+ return task_data
136
148
return JsonResponse (task_data , safe = False )
137
149
context = {
138
150
'title' : 'Scan Tasks' ,
0 commit comments