@ -11,22 +11,37 @@ class TaskManager:
def __init__ ( self ) :
self . logger = LogHandler ( ) . get_logger ( " TaskManager " )
self . TargetM = TargetManager ( )
self . tasks = { } # 执行中的任务,test_id为key
self . num_threads = myCongif . get_data ( " Task_max_threads " )
self . max_run_task = myCongif . get_data ( " max_run_task " )
self . cur_task_run_num = 0
#获取系统信息 -- 用户可修改的都放在DB中,不修改的放config
self . num_threads = myCongif . get_data ( " Task_max_threads " )
data = app_DBM . get_system_info ( )
self . local_ip = data [ 0 ]
self . version = data [ 1 ]
self . tasks_lock = threading . Lock ( )
self . web_cur_task = 0 #web端当前显示的
self . brun = True
self . tm_th = None #任务控制线程
#----临时任务相关-------
self . web_cur_task = 0 #web端当前显示的 -- web端可以操作的都为临时任务
self . tasks = { } # 执行中的任务,test_id为key
self . max_run_task = myCongif . get_data ( " max_run_task " )
self . cur_task_run_num = 0
#-----巡检任务相关-------
self . polling_llmtype = myCongif . get_data ( " polling_llm_type " )
self . polling_tasks = { } #独立一个队列
self . max_polling_task = myCongif . get_data ( " max_polling_task " )
self . cur_polling_task = 0
self . work_type = 1 #巡检工作模式就是自动了
#判断目标是不是在当前执行任务中,---没加锁,最多跟删除有冲突,问题应该不大
def is_target_in_tasks ( self , task_target ) :
for task in self . tasks . values ( ) :
if task_target == task . target :
return True
def is_target_in_tasks ( self , task_target , itype = 1 ) :
''' itype:1--临时任务,2--巡检任务 '''
if itype == 1 :
for task in self . tasks . values ( ) :
if task_target == task . target :
return True
else :
for p_task in self . polling_tasks . values ( ) :
if task_target == p_task . target :
return True
return False
#程序启动后,加载未完成的测试任务
@ -34,7 +49,7 @@ class TaskManager:
''' 程序启动时,加载未执行完成的,未点击结束的任务 -- task_status<>2
#若不是异常停止,正常情况下,任务都应该是没有待办MQ的
'''
datas = app_DBM . get_run_tasks ( )
datas = app_DBM . get_run_tasks ( ) #
for data in datas :
task_id = data [ 0 ]
task_target = data [ 1 ]
@ -44,8 +59,12 @@ class TaskManager:
llm_type = data [ 5 ]
safe_rank = data [ 6 ]
fake_target = data [ 7 ]
target_id = data [ 8 ]
# 创建任务对象
task = TaskObject ( task_target , cookie_info , work_type , llm_type , self . num_threads , self . local_ip , fake_target , self , safe_rank )
task = TaskObject ( task_target , cookie_info , work_type , llm_type , self . num_threads , self . local_ip , fake_target , target_id , self , safe_rank )
#这里要做区分.临时任务和巡检任务
#?
#读取attact_tree---load的任务应该都要有attact_tree
attack_tree = g_PKM . ReadData ( str ( task_id ) )
if attack_tree :
@ -96,15 +115,43 @@ class TaskManager:
task . init_task ( task_id )
#保留task对象
self . tasks [ task_id ] = task
#尝试启动task
self . start_task_TM ( task_id )
else :
fail_list . append ( target )
result = " , " . join ( fail_list )
return result
def create_polling_task ( self , target ) :
#创建巡检任务
#创建巡检任务 -- 使用check_target
task_target = target [ 2 ]
if self . is_target_in_tasks ( task_target , 2 ) : #巡检任务一个周期还没有执行完。
#更新检查时间,本次巡检轮次不执行工作
bok = app_DBM . update_polling_last_time ( target [ 0 ] )
else : #创建任务
if target [ 9 ] == " IPv4 " or target [ 9 ] == " IPv6 " :
fake_target = self . TargetM . get_fake_target ( 1 )
else :
fake_terget = self . TargetM . get_fake_target ( 2 )
#创建任务实例
polling_task = TaskObject ( target , " " , self . work_type , self . polling_llmtype , self . num_threads , self . local_ip , fake_target , self )
# 获取task_id -- test_target,cookie_info,work_type,llm_type 入数据库
task_id = app_DBM . start_task ( target , " " , self . work_type , self . polling_llmtype , fake_target , target [ 0 ] ) #增加一个target_id
if task_id > 0 :
polling_task . init_task ( task_id ) #初始化任务信息,并提交到待处理节点队列
#保留task对象--巡检任务
self . polling_tasks [ task_id ] = polling_task
def th_control_takes ( self ) :
while self . brun :
#遍历临时任务--启停任务
pass
#遍历巡检任务-启停
pass
#休眠
time . sleep ( 60 * 5 )
#开启task任务--正常只应该有web触发调用
#开启task任务
def start_task_TM ( self , task_id ) :
task = self . tasks [ task_id ]
if task :
@ -121,7 +168,7 @@ class TaskManager:
return False , f " 已到达最大的启动数-- { self . max_run_task } "
return False , " 该任务不存在,程序逻辑存在问题! "
#停止task任务
#停止task任务--暂停
def stop_task_TM ( self , task_id ) :
task = self . tasks [ task_id ]
if task :