diff --git a/sysom_api/apps/task/models.py b/sysom_api/apps/task/models.py index fbd5fe18b266a20ee6e34ae06bcf61961872271e..018c203e875f63e382316301fbe0f15fefb539bc 100644 --- a/sysom_api/apps/task/models.py +++ b/sysom_api/apps/task/models.py @@ -15,7 +15,8 @@ class JobModel(BaseModel): task_id = models.CharField(max_length=64, default="", verbose_name="任务实例ID") status = models.CharField(max_length=32, choices=JOB_STATUS_CHOICES, default='Ready', verbose_name="任务状态") command = models.TextField(verbose_name="shell文本") - job_result = models.TextField(default="", verbose_name="shell结果") + result = models.TextField(default="", verbose_name="shell结果") + params = models.TextField(default="", verbose_name="params") host_by = models.TextField(max_length=64, default="", verbose_name="host_jobs") created_by = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name="user_jobs") diff --git a/sysom_api/apps/task/seriaizer.py b/sysom_api/apps/task/seriaizer.py index d91dcae3c5c9c9b17a780a43b4e28aa79420b4a3..248254eb0426763d8d82009e0cdcfc788fbab500 100644 --- a/sysom_api/apps/task/seriaizer.py +++ b/sysom_api/apps/task/seriaizer.py @@ -10,11 +10,18 @@ from apps.task.models import JobModel class JobListSerializer(serializers.ModelSerializer): - job_result = serializers.SerializerMethodField() + result = serializers.SerializerMethodField() class Meta: model = JobModel - exclude = ('deleted_at', ) + exclude = ('deleted_at', 'host_by', 'command') - def get_job_result(self, attr: JobModel): - return attr.job_result or '暂无' + def get_result(self, attr: JobModel): + return attr.result or '暂无' + + +class JobDelResultSerializer(serializers.ModelSerializer): + + class Meta: + model = JobModel + exclude = ('deleted_at', 'host_by', 'command', 'result') \ No newline at end of file diff --git a/sysom_api/apps/task/views.py b/sysom_api/apps/task/views.py index 4229ddf1af4c800840939dee1e2c5dff029a6a43..21cda84e5c229f4a5ae99641e35132237e892d24 100644 --- a/sysom_api/apps/task/views.py +++ b/sysom_api/apps/task/views.py @@ -52,6 +52,7 @@ class TaskAPIView(GenericViewSet, def create(self, request, *args, **kwargs): try: data = request.data + params = data.copy() service_name = data.pop("service_name", None) task_id = uuid_8() if service_name: @@ -65,13 +66,13 @@ class TaskAPIView(GenericViewSet, resp_scripts = resp.get("commands") username = "admin" user = User.objects.filter(username=username).first() - self.ssh_job(resp_scripts, task_id, user) + self.ssh_job(resp_scripts, task_id, user, params) return success(result={"instance_id": task_id}) else: return self.default_ssh_job(data, task_id) except Exception as e: logger.error(e) - return other_response(message=str(e), code=400) + return other_response(message=str(e), code=400, success=False) def retrieve(self, request, *args, **kwargs): response = super().retrieve(request, *args, **kwargs) @@ -95,14 +96,22 @@ class TaskAPIView(GenericViewSet, return success(result={"instance_id": task_id}) except Exception as e: logger.error(e) - return other_response(message=str(e), code=400) + return other_response(message=str(e), code=400, success=False) - def ssh_job(self, resp_scripts, task_id, user): - job_model = JobModel.objects.create(command=resp_scripts, task_id=task_id, - created_by=user) + def ssh_job(self, resp_scripts, task_id, user, data=None): + if not data: + job_model = JobModel.objects.create(command=resp_scripts, task_id=task_id, + created_by=user) + else: + job_model = JobModel.objects.create(command=resp_scripts, task_id=task_id, + created_by=user, params=data) sch_job = SshJob(resp_scripts, job_model) scheduler.add_job(sch_job.run) + def list(self, request, *args, **kwargs): + data = seriaizer.JobDelResultSerializer(instance=self.queryset, many=True) + return success(result=data.data) + def destroy(self, request, *args, **kwargs): instance = self.get_queryset().filter(**kwargs).first() if not instance: diff --git a/sysom_api/consumer/executors.py b/sysom_api/consumer/executors.py index bae550a0e82dce4d46adb053201ca9943a90803a..ef6d82d10d235115e8e7451e7f10eeeb09a4305c 100644 --- a/sysom_api/consumer/executors.py +++ b/sysom_api/consumer/executors.py @@ -1,7 +1,11 @@ +import ast +import json +import os import socket from apps.host.models import HostModel from lib.ssh import SSH from apps.task.models import JobModel +from sysom import settings class SshJob: @@ -20,7 +24,7 @@ class SshJob: ip = script.get("instance", None) cmd = script.get("cmd", None) if not ip or not cmd: - update_job(instance=self.job, status="Fail", job_result="script result find not instance or cmd") + update_job(instance=self.job, status="Fail", result="script result find not instance or cmd") break host_ips.append(ip) host = HostModel.objects.filter(ip=ip).first() @@ -28,17 +32,29 @@ class SshJob: with ssh_cli as ssh: status, result = ssh.exec_command(cmd) if str(status) != '0': - update_job(instance=self.job, status="Fail", job_result=result, host_by=host_ips) + update_job(instance=self.job, status="Fail", result=result, host_by=host_ips) break if count == len(self.resp_scripts): - update_job(instance=self.job, status="Success", job_result=result, host_by=host_ips) + params = self.job.params + if params: + service_name = params.get("service_name", None) + if service_name: + SCRIPTS_DIR = settings.SCRIPTS_DIR + service_post_name = service_name + '_post' + service_post_path = os.path.join(SCRIPTS_DIR, service_post_name) + if os.path.exists(service_post_path): + print(type(result)) + command = "%s '%s'" % (service_post_path, json.dumps(result)) + output = os.popen(command) + result = ast.literal_eval(output.read()) + update_job(instance=self.job, status="Success", result=result, host_by=host_ips) if self.kwargs.get('update_host_status', None): host.status = status if status == 0 else 1 host.save() except socket.timeout: - update_job(instance=self.job, status="Fail", job_result="socket time out") + update_job(instance=self.job, status="Fail", result="socket time out") except Exception as e: - update_job(instance=self.job, status="Fail", job_result=str(e)) + update_job(instance=self.job, status="Fail", result=str(e)) def update_job(instance: JobModel, **kwargs):