def cmd_task(self): ''' 1.生成任务id 2.触发任务 3.返回任务id ''' task_obj = models.Task.objects.create( user=self.request.user, task_type=self.task_data['task_type'], content=self.task_data['cmd']) sub_task_objs = [] for host_id in self.task_data['select_host_ids']: sub_task_objs.append( models.TaskLogDetail(task=task_obj, bind_host_id=host_id, result='init...', status=2)) models.TaskLogDetail.objects.bulk_create(sub_task_objs) task_script_obj = subprocess.Popen( 'python %s %s' % (settings.MULTITASK_SCRIPT, task_obj.id), shell=True, stdout=subprocess.PIPE) self.task = task_obj
def cmd(self): """批量命令 1. 生成任务在数据库中的记录,拿到任务id 2.触发任务, 不阻塞 3.返回任务id给前端 """ task_obj = models.Task.objects.create( task_type='cmd', content=self.task_data.get('cmd'), user=self.request.user) selected_host_ids = set(self.task_data['selected_hosts']) task_log_objs = [] for id in selected_host_ids: task_log_objs.append( models.TaskLogDetail(task=task_obj, host_to_remote_user_id=id, result='init...')) models.TaskLogDetail.objects.bulk_create(task_log_objs) task_script = "python %s/backend/task_runner.py %s" % ( conf.settings.BASE_DIR, task_obj.id) # 调用脚本,并执行 cmd_process = subprocess.Popen(task_script, shell=True) print("running batch commands....") self.task_obj = task_obj
def create_task_log(self, task_type, hosts, expire_time, content, random_str=None, note=None): task_log_obj = models.Task(task_type=task_type, user=self.request.user, cmd=content, files_dir=random_str, expire_time=int(expire_time), note=note) task_log_obj.save() task_log_obj.hosts.add(*hosts) #initilize detail logs for h in hosts: task_log_detail_obj = models.TaskLogDetail( child_of_task_id=task_log_obj.id, bind_host_id=h.id, event_log='', result='unknown') task_log_detail_obj.save() return task_log_obj
def file_transfer(self): task_obj = models.Task.objects.create( task_type='file-transfer', content=json.dumps(self.task_data), user=self.request.user, ) selected_host_ids = set(self.task_data['selected_hosts']) task_log_objs = [] for id in selected_host_ids: task_log_objs.append( models.TaskLogDetail( task=task_obj, host_to_remote_user_id=id, result='init', )) print('task_log_objs-->', task_log_objs) models.TaskLogDetail.objects.bulk_create(task_log_objs) task_script = 'python %s/backend/task_runner.py %s' % ( conf.settings.BASE_DIR, task_obj.id) cmd_process = subprocess.Popen(task_script, shell=True) print('running batch commands...') # self.task_id = task_obj.id self.task_obj = task_obj
def file_transfer_task(self): """ 1.生产任务记录 2.触发任务 3. 返回任务id :return: """ task_obj = models.Task.objects.create( user=self.request.user, task_type=self.task_data['task_type'], content=json.dumps(self.task_data)) sub_task_objs = [] for host_id in self.task_data['selected_host_ids']: sub_task_objs.append( models.TaskLogDetail(task=task_obj, bind_host_id=host_id, result='init...', status=2)) models.TaskLogDetail.objects.bulk_create(sub_task_objs) task_script_obj = subprocess.Popen( "python %s %s" % (conf.settings.MULTITASK_SCRIPT, task_obj.id), shell=True, stdout=subprocess.PIPE) self.task = task_obj
def file_transfer(self): """文件分发""" task_obj = models.Task.objects.create(task_type='file_transfer', content=json.dumps( self.task_data), user=self.request.user) selected_host_ids = set(self.task_data["selected_hosts"]) task_log_objs = [] for id in selected_host_ids: task_log_objs.append( models.TaskLogDetail(task=task_obj, host_to_remote_user_id=id, result="init...")) #把上面的对象列表放进来,批量写入娄据库 models.TaskLogDetail.objects.bulk_create(task_log_objs) task_script = "python %s/backend/task_runner.py %s" % ( conf.settings.BASE_DIR, task_obj.id) print("执行subprocess file_transfer") subprocess.Popen(task_script, shell=True) self.task_obj = task_obj
def cmd(self): """批量命令 1.生成任务,保存到数据库中,拿到任务ID 2.触发任务,不阻塞 3.返回任务ID 给前端 """ print("cmd 方法") print("running cmd commands") #大任务 task_obj = models.Task.objects.create( task_type='cmd', content=self.task_data.get("cmd"), user=self.request.user) selected_host_ids = set(self.task_data["selected_hosts"]) task_log_objs = [] for id in selected_host_ids: task_log_objs.append( models.TaskLogDetail(task=task_obj, host_to_remote_user_id=id, result="init...")) #把上面的对象列表放进来,批量写入娄据库 models.TaskLogDetail.objects.bulk_create(task_log_objs) task_script = "python %s/backend/task_runner.py %s" % ( conf.settings.BASE_DIR, task_obj.id) print("执行subprocess") subprocess.Popen(task_script, shell=True) self.task_obj = task_obj
def cmd(self): '''批量命令 1.生成任务在数据库中的记录,拿到任务id 2.触发任务,不阻塞 3.返回任务id给前端 ''' task_obj = models.Task.objects.create( task_type='cmd', content=self.task_data.get('cmd'), user=self.request.user) selected_host_ids = set( self.task_data['selected_hosts']) #取出所有主机的id。有可能选择的是同一个主机,使用set去重 task_log_objs = [] for id in selected_host_ids: task_log_objs.append( models.TaskLogDetail(task=task_obj, host_to_remote_user_id=id, result='init...')) # 每创建一条记录,然后save()的时候都会访问一次数据库,数据库commit一次,导致性能问题。使用bulk_create批量创建,要么全部成功,或全部失败。(事务) models.TaskLogDetail.objects.bulk_create(task_log_objs) task_script = "python3 %s/backend/task_runner.py %s" % ( conf.settings.BASE_DIR, task_obj.id) # Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,即cmd_process.wait(),父进程才会等待 (也就是阻塞block)。 #subprocess.Popen开启一个独立的进程,交给操作系统,启动这个独立脚本task_script,他脱离了django。 cmd_process = subprocess.Popen(task_script, shell=True) print('running batch commands.....') self.task_obj = task_obj
def file_transfer(self): task_obj = models.Task.objects.create(task_type=1, content=json.dumps( self.task_date), user=self.request.user) print(task_obj) select_host_id = set(self.task_date.get('select_host_id')) task_log_obj = [] for id in select_host_id: task_log_obj.append( models.TaskLogDetail(task=task_obj, result='init...', host_to_remoteuser_id=id)) models.TaskLogDetail.objects.bulk_create(task_log_obj) task_script = "python %s/backend/task_runner.py %s" % ( conf.settings.BASE_DIR, task_obj.id) subprocess.Popen(task_script, shell=True) print('running batch commanads') self.task_obj = task_obj
def file_transfer(self): '''文件分发''' task_obj = models.Task.objects.create(task_type='file-transfer', content=json.dumps( self.task_data), user=self.request.user) selected_host_ids = set( self.task_data['selected_hosts']) #取出所有主机的id。有可能选择的是同一个主机,使用set去重 task_log_objs = [] for id in selected_host_ids: task_log_objs.append( models.TaskLogDetail(task=task_obj, host_to_remote_user_id=id, result='init...')) models.TaskLogDetail.objects.bulk_create(task_log_objs) task_script = "python3 %s/backend/task_runner.py %s" % ( conf.settings.BASE_DIR, task_obj.id) cmd_process = subprocess.Popen(task_script, shell=True) print('running batch file transfer.....') self.task_obj = task_obj
def cmd(self): # 生成数据库记录,拿到了任务id task_obj = models.Task.objects.create( task_type='cmd', content=self.task_data.get('cmd'), user=self.request.user, ) #触发任务,任务结果先初始化写到数据库,每个子任务执行完后更新结果(解决执行200台,执行一半时断网了,后面的 #不执行,任务结果没写数据库,前端拿不到结果的问题) #初始化子记录 selected_host_ids = self.task_data.get('selected_hosts') task_log_objs = [] for id in selected_host_ids: task_log_objs.append( models.TaskLogDetail( #直接生成对象,而不是objects.create写数据库 task=task_obj, host_to_remote_user_id=id, result='init', )) models.TaskLogDetail.objects.bulk_create(task_log_objs) #触发任务 task_script = 'python %s/backend/task_runner.py %s' % ( conf.settings.BASE_DIR, task_obj.id) cmd_process = subprocess.Popen(task_script, shell=True) # self.task_id = task_obj.id self.task_obj = task_obj # return task_obj.id print('running batch commands...') print('runner task obj', task_obj) print(type(task_obj))