Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
    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
Пример #6
0
    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
Пример #7
0
    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
Пример #8
0
    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
Пример #9
0
 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
Пример #10
0
    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
Пример #11
0
    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))