diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..eaf985fd090e62f5f4a91e53855397780b894300 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.pyc +*.tar.gz +.idea/ +db.sqlite3 +migrations/ +node_modules/ +/logs/* +/.vscode/ +sysom_api/.idea/ +sysom_api/.vscode/ +sysom_api/db.sqlite3 +sysom_api/logs/ +*/migrations/* +*/src/.umi/* +*/src/.umi-production/ +dist/ +sysom_api/uploads/* +sysom_api/conf/ +sysom_api/doc/ diff --git a/sysom_api/apps/accounts/authentication.py b/sysom_api/apps/accounts/authentication.py index fa941bde90b7c58ebe7057a7eb4b838f86c17875..81044df9a255c7d5c3b492625207158199ed6902 100644 --- a/sysom_api/apps/accounts/authentication.py +++ b/sysom_api/apps/accounts/authentication.py @@ -44,7 +44,7 @@ class Authentication(BaseAuthentication): try: payload = jwt_decode_handler(token) except jwt.ExpiredSignature: - msg = _('令牌过期!.') + msg = _('令牌过期!,请重新登录') raise AuthenticationFailed(msg) except jwt.DecodeError: msg = _('令牌验证失败!.') diff --git a/sysom_api/apps/task/models.py b/sysom_api/apps/task/models.py index ccc358ed30de7cc3d80054abcdae1b33f44098ae..fbd5fe18b266a20ee6e34ae06bcf61961872271e 100644 --- a/sysom_api/apps/task/models.py +++ b/sysom_api/apps/task/models.py @@ -24,11 +24,3 @@ class JobModel(BaseModel): class Meta: db_table = 'sys_job' - - -class ServiceModel(BaseModel): - service_name = models.CharField(max_length=64, verbose_name="service名称") - service_script = models.CharField(max_length=64, verbose_name="脚本名称") - - class Meta: - db_table = 'service' \ No newline at end of file diff --git a/sysom_api/apps/task/seriaizer.py b/sysom_api/apps/task/seriaizer.py index fce9a50dac3031af2a7c088d535cf8aa025572b9..cb6894d2438804f9627b919390f6350bd6a26cd7 100644 --- a/sysom_api/apps/task/seriaizer.py +++ b/sysom_api/apps/task/seriaizer.py @@ -7,7 +7,7 @@ @Software: PyCharm """ from rest_framework import serializers -from apps.task.models import JobModel, ServiceModel +from apps.task.models import JobModel class JobListSerializer(serializers.ModelSerializer): @@ -19,10 +19,3 @@ class JobListSerializer(serializers.ModelSerializer): def get_job_result(self, attr: JobModel): return attr.job_result or '暂无' - - -class ServiceSerializer(serializers.ModelSerializer): - - class Meta: - model = ServiceModel - exclude = ('deleted_at', ) \ No newline at end of file diff --git a/sysom_api/apps/task/urls.py b/sysom_api/apps/task/urls.py index 39cdbf65587236132bd4976dd958a25ae6d86aa6..ba7e07125f9aa32387f1873cbfef1d6fd85e90a9 100644 --- a/sysom_api/apps/task/urls.py +++ b/sysom_api/apps/task/urls.py @@ -14,7 +14,6 @@ router = DefaultRouter() router.register('jobs', views.JobAPIView) router.register('tasks', views.TaskAPIView) -router.register('service', views.ServiceAPIView) urlpatterns = [ path('api/v1/', include(router.urls)), diff --git a/sysom_api/apps/task/views.py b/sysom_api/apps/task/views.py index 82c5009c126160624ccb1d7ee3013bf93e79e6a3..4229ddf1af4c800840939dee1e2c5dff029a6a43 100644 --- a/sysom_api/apps/task/views.py +++ b/sysom_api/apps/task/views.py @@ -2,13 +2,14 @@ import os import uuid import ast from django_filters.rest_framework import DjangoFilterBackend +from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.viewsets import GenericViewSet from rest_framework import mixins from django.conf import settings from apps.accounts.authentication import Authentication from apps.task import seriaizer -from apps.task.models import JobModel, ServiceModel +from apps.task.models import JobModel from apps.host.models import HostModel from apps.accounts.models import User from consumer.executors import SshJob @@ -38,32 +39,33 @@ class JobAPIView(GenericViewSet, mixins.ListModelMixin, mixins.RetrieveModelMixi class TaskAPIView(GenericViewSet, mixins.ListModelMixin, mixins.RetrieveModelMixin, - mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.CreateModelMixin ): queryset = JobModel.objects.filter(deleted_at=None) serializer_class = seriaizer.JobListSerializer + filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter) + search_fields = ('id', 'task_id', 'host_by') # 模糊查询 + filter_fields = ('id', 'task_id', 'host_by') # 精确查询 authentication_classes = [] def create(self, request, *args, **kwargs): try: data = request.data - service_name = data.get("service_name", None) + service_name = data.pop("service_name", None) task_id = uuid_8() if service_name: - sercive = ServiceModel.objects.filter(service_name=service_name).first() SCRIPTS_DIR = settings.SCRIPTS_DIR - service_path = os.path.join(SCRIPTS_DIR, sercive.service_script) - data["taskid"] = task_id - command = "/bin/bash %s %s" % (service_path, json.dumps(data)) + service_path = os.path.join(SCRIPTS_DIR, service_name) + if not os.path.exists(service_path): + return other_response(message="can not find script file, please check service name", code=400) + command = "%s '%s'" % (service_path, json.dumps(data)) output = os.popen(command) resp = ast.literal_eval(output.read()) resp_scripts = resp.get("commands") username = "admin" user = User.objects.filter(username=username).first() - job_id = str(uuid.uuid4()) - self.ssh_job(resp_scripts, task_id, user, job_id) + self.ssh_job(resp_scripts, task_id, user) return success(result={"instance_id": task_id}) else: return self.default_ssh_job(data, task_id) @@ -78,11 +80,10 @@ class TaskAPIView(GenericViewSet, def default_ssh_job(self, data, task_id): try: host_ids = data.get("host_ids") - commands = data.get("command") + commands = data.get("commands") if not host_ids: return other_response(message="请选择执行主机", code=400) user = User.objects.filter(username='admin').first() - job_id = str(uuid.uuid4()) cmds = [] for i in range(len(host_ids)): instance = {} @@ -90,17 +91,17 @@ class TaskAPIView(GenericViewSet, instance["instance"] = host.ip instance["cmd"] = commands[i] cmds.append(instance) - self.ssh_job(cmds, task_id, user, job_id) + self.ssh_job(cmds, task_id, user) return success(result={"instance_id": task_id}) except Exception as e: logger.error(e) return other_response(message=str(e), code=400) - def ssh_job(self, resp_scripts, task_id, user, job_id): + def ssh_job(self, resp_scripts, task_id, user): job_model = JobModel.objects.create(command=resp_scripts, task_id=task_id, created_by=user) sch_job = SshJob(resp_scripts, job_model) - scheduler.add_job(sch_job.run, id=job_id, ) + scheduler.add_job(sch_job.run) def destroy(self, request, *args, **kwargs): instance = self.get_queryset().filter(**kwargs).first() @@ -113,53 +114,3 @@ class TaskAPIView(GenericViewSet, instance.deleted_at = human_datetime() instance.deleted_by = self.request.user instance.save() - - def update(self, request, *args, **kwargs): - response = super().update(request, *args, **kwargs) - return success(result=response.data, message="修改成功") - - def partial_update(self, request, *args, **kwargs): - response = super().partial_update(request, *args, **kwargs) - return success(result=response.data, message="修改成功") - - -class ServiceAPIView(GenericViewSet, - mixins.ListModelMixin, - mixins.RetrieveModelMixin, - mixins.UpdateModelMixin, - mixins.DestroyModelMixin, - mixins.CreateModelMixin, - ): - queryset = ServiceModel.objects.all() - serializer_class = seriaizer.ServiceSerializer - authentication_classes = [] - filter_backends = [DjangoFilterBackend] - filterset_fields = ["id", "service_name"] - - def create(self, request, *args, **kwargs): - serializer = self.get_serializer(data=request.data) - serializer.is_valid(raise_exception=True) - self.perform_create(serializer) - return success(result={}) - - def destroy(self, request, *args, **kwargs): - instance = self.get_queryset().filter(**kwargs).first() - if not instance: - return not_found() - self.perform_destroy(instance) - return success(message="删除成功", code=200, result={}) - - def retrieve(self, request, *args, **kwargs): - instance = self.get_queryset().filter(**kwargs).first() - if not instance: - return not_found() - ser = self.get_serializer(instance) - return success(result=ser.data) - - def update(self, request, *args, **kwargs): - response = super().update(request, *args, **kwargs) - return success(result=response.data, message="修改成功") - - def partial_update(self, request, *args, **kwargs): - response = super().partial_update(request, *args, **kwargs) - return success(result=response.data.get("data"), message="修改成功") diff --git a/sysom_api/apps/vmcore/views.py b/sysom_api/apps/vmcore/views.py index fd4e9472d6169f8bf909de00e08ec0645d3d2463..0459cdfe104f8f29c81dd979c518f36c65b17f58 100644 --- a/sysom_api/apps/vmcore/views.py +++ b/sysom_api/apps/vmcore/views.py @@ -122,6 +122,8 @@ class VmcoreViewSet(GenericViewSet, start_time=end_time + datetime.timedelta(days=-30) host_sum = models.Panic.objects.values('hostname').distinct().count() + if host_sum == 0: + return success(result=data['data'], total=data['total'], success=True, vmcore_30days=0, vmcore_7days=0, rate_30days=0, rate_7days=0) vmcores_sum_30 = models.Panic.objects.filter(core_time__range=(start_time,end_time)).count() hosts_sum_30 = models.Panic.objects.filter(core_time__range=(start_time,end_time)).count() diff --git a/sysom_api/apps/vmcore/vmcore.json b/sysom_api/apps/vmcore/vmcore.json index 864de8ff7fa30ce60a28e8c9004784cdc4ab1cfa..7fefd9e7e329c52b35f8450b48ca7fd78995f907 100644 --- a/sysom_api/apps/vmcore/vmcore.json +++ b/sysom_api/apps/vmcore/vmcore.json @@ -1,2 +1 @@ -加载了环境 >> testing [{"model": "vmcore.panic", "pk": 1, "fields": {"created_at": "", "deleted_at": null, "name": "20211207_ecs1", "ip": "192.168.0.1", "hostname": "ecs1", "vertype": 310, "status": 4, "core_time": "2021-12-07T10:34:59Z", "vmcore_file": "/var/crash/127.0.0.1_20211207/vmcore", "dmesg_file": "/var/crash/127.0.0.1_20211207/vmcore_dmesg.txt", "dmesg": "xxxxx", "title": "BUG: unable to handle kernel NULL pointer dereference at (null) ", "ver": "3.10.0-327.ali2008.odps.alios7.x86_64", "rip": "ffffffffa04fa814", "func_name": "ovl_cleanup", "comm": "pip", "calltrace": "ovl_cleanup$ovl_cleanup_whiteouts$ovl_clear_empty", "crashkey": "310$ovl_cleanup$ovl_cleanup_whiteouts$ovl_clear_empty", "modules": "vrbd(OE) aisqos(OE) aisqos_hotfixes(OE) sn_core_even(OE) 8021q garp mrp kiodump(OE) kpatch_D598343(OE) tcp_diag inet_diag ", "upload_time": 1627283526, "issue_id": 10, "panic_type": "Basekernel:fs", "panic_class": "PANIC_NULLPOINTER"}}, {"model": "vmcore.panic", "pk": 2, "fields": {"created_at": "2021-12-07 14:42:13", "deleted_at": null, "name": "20211207_ecs2", "ip": "192.168.0.2", "hostname": "ecs2", "vertype": 409, "status": 2, "core_time": "2021-12-07T10:35:59Z", "vmcore_file": "/var/crash/127.0.0.1_20211207/vmcore", "dmesg_file": "/var/crash/127.0.0.1_20211207/vmcore_dmesg.txt", "dmesg": "xxxxx", "title": "BUG: unable to handle kernel NULL pointer dereference at 00000000000003c0", "ver": "4.9.79-009.ali3000.alios7.x86_64", "rip": "ffffffff813496d0", "func_name": "blk_get_backing_dev_info", "comm": "kworker/1:2", "calltrace": "blk_get_backing_dev_info$inode_switch_wbs_work_fn$__switch_to", "crashkey": "409$blk_get_backing_dev_info$inode_switch_wbs_work_fn$__switch_to", "modules": "i40e(E) binfmt_misc(E) kpatch_D543129(OE) kpatch_D437534(OE) kpatch_D489564(OE) kpatch_D850131(OE) kpatch_D465774(OE)", "upload_time": 1627283526, "issue_id": 0, "panic_type": "Basekernel:fs", "panic_class": "PANIC_NULLPOINTER"}}, {"model": "vmcore.panic", "pk": 3, "fields": {"created_at": "2021-12-07 16:04:08", "deleted_at": null, "name": "20211207_ecs3", "ip": "192.168.0.3", "hostname": "ecs3", "vertype": 419, "status": 4, "core_time": "2021-12-07T15:34:59Z", "vmcore_file": "/var/crash/127.0.0.3_20211207/vmcore", "dmesg_file": "/var/crash/127.0.0.3_20211207/vmcore_dmesg.txt", "dmesg": "xxxxx", "title": "BUG: unable to handle kernel NULL pointer dereference at 0000000000000000", "ver": "4.19.91-21.2.al7.x86_64", "rip": "null", "func_name": "locked_inode_to_wb_and_lock_list", "comm": "kworker/u192:5", "calltrace": "locked_inode_to_wb_and_lock_list$writeback_sb_inodes$__writeback_inodes_wb", "crashkey": "419$locked_inode_to_wb_and_lock_list$writeback_sb_inodes$__writeback_inodes_wb", "modules": "8021q garp stp llc tcp_diag inet_diag sunrpc intel_rapl_msr intel_rapl_common iosf_mbi mousedev hid_generic isst_if_common psmouse pvpanic nfit button usbhid uhci_hcd ehci_pci ehci_hcd cirrus", "upload_time": 1627283526, "issue_id": 6, "panic_type": "Basekernel:fs", "panic_class": "PANIC_NULLPOINTER"}}, {"model": "vmcore.panic", "pk": 4, "fields": {"created_at": "2021-12-07 17:34:45", "deleted_at": null, "name": "20211207_ecs4", "ip": "192.168.0.4", "hostname": "ecs4", "vertype": 419, "status": 4, "core_time": "2021-11-15T15:34:59Z", "vmcore_file": "/var/crash/127.0.0.4_20211207/vmcore", "dmesg_file": "/var/crash/127.0.0.4_20211207/vmcore_dmesg.txt", "dmesg": "xxxxx", "title": "BUG: unable to handle kernel NULL pointer dereference at 0000000000000000", "ver": "4.19.91-21.2.al7.x86_64", "rip": "null", "func_name": "locked_inode_to_wb_and_lock_list", "comm": "kworker/u192:5", "calltrace": "dd$writeback_sb_inodes$__writeback_inodes_wb", "crashkey": "419$dd$writeback_sb_inodes$__writeback_inodes_wb", "modules": "8021q garp stp llc tcp_diag inet_diag sunrpc intel_rapl_msr intel_rapl_common iosf_mbi mousedev hid_generic isst_if_common psmouse pvpanic nfit button usbhid uhci_hcd ehci_pci ehci_hcd cirrus", "upload_time": 1627283526, "issue_id": 14, "panic_type": "Basekernel:fs", "panic_class": "PANIC_NULLPOINTER"}}, {"model": "vmcore.panic", "pk": 5, "fields": {"created_at": "2021-12-08 19:16:40", "deleted_at": null, "name": "20211106_ecs3", "ip": "192.168.0.3", "hostname": "ecs3", "vertype": 310, "status": 4, "core_time": "2021-12-07T15:34:59Z", "vmcore_file": "/var/crash/127.0.0.3_20211106/vmcore", "dmesg_file": "/var/crash/127.0.0.3_20211106/vmcore_dmesg.txt", "dmesg": "xxxxx", "title": "BUG: unable to handle kernel NULL pointer dereference at 0000000000000010", "ver": "3.10.0-327.ali2016.alios7.x86_64", "rip": "ffffffff8119701d", "func_name": "free_percpu", "comm": "kworker/u128:85", "calltrace": "free_percpu$percpu_counter_destroy$wb_init", "crashkey": "310$free_percpu$percpu_counter_destroy$wb_init", "modules": "mptctl mptbase overlay toa hookers 8021q garp mrp sch_ingress sch_htb tcp_diag inet_diag binfmt_misc bridge(F) stp(F) llc(F) kpatch_D95837(OE) kpatch(OE) coelper ttm ixgbe crct10dif_pclmul mdio mpt2sas crct10dif_common ptp drm crc32c_intel raid_class pps_core scsi_transport_sas i2c_core dca [last unloaded: unevictpid]", "upload_time": 1627243526, "issue_id": 11, "panic_type": "Basekernel:fs", "panic_class": "PANIC_NULLPOINTER"}}, {"model": "vmcore.panic", "pk": 6, "fields": {"created_at": "2021-12-08 19:19:50", "deleted_at": null, "name": "20211204_ecs1", "ip": "192.168.0.1", "hostname": "ecs1", "vertype": 419, "status": 4, "core_time": "2021-12-04T15:34:59Z", "vmcore_file": "/var/crash/127.0.0.1_20211204/vmcore", "dmesg_file": "/var/crash/127.0.0.3_20211207/vmcore_dmesg.txt", "dmesg": "xxxxx", "title": "BUG: unable to handle kernel NULL pointer dereference at 0000000000000000", "ver": "4.19.91-21.2.al7.x86_64", "rip": "null", "func_name": "locked_inode_to_wb_and_lock_list", "comm": "kworker/u192:5", "calltrace": "locked_inode_to_wb_and_lock_list$writeback_sb_inodes$switch_to", "crashkey": "419$locked_inode_to_wb_and_lock_list$writeback_sb_inodes$switch_to", "modules": "8021q garp stp llc tcp_diag inet_diag sunrpc intel_rapl_msr intel_rapl_common iosf_mbi mousedev hid_generic isst_if_common psmouse pvpanic nfit button usbhid uhci_hcd ehci_pci ehci_hcd cirrus", "upload_time": 1627283526, "issue_id": 15, "panic_type": "Basekernel:fs", "panic_class": "PANIC_NULLPOINTER"}}, {"model": "vmcore.panic", "pk": 7, "fields": {"created_at": "2021-12-08 19:20:35", "deleted_at": null, "name": "20211130_ecs4", "ip": "192.168.0.4", "hostname": "ecs4", "vertype": 419, "status": 2, "core_time": "2021-11-30T15:34:59Z", "vmcore_file": "/var/crash/127.0.0.1_20211204/vmcore", "dmesg_file": "/var/crash/127.0.0.3_20211207/vmcore_dmesg.txt", "dmesg": "xxxxx", "title": "BUG: unable to handle kernel NULL pointer dereference at 0000000000000000", "ver": "4.19.91-21.2.al7.x86_64", "rip": "null", "func_name": "locked_inode_to_wb_and_lock_list", "comm": "kworker/u192:5", "calltrace": "locked_inode_to_wb_and_lock_list$do_page_fault$switch_to", "crashkey": "419$locked_inode_to_wb_and_lock_list$do_page_fault$switch_to", "modules": "8021q garp stp llc tcp_diag inet_diag sunrpc intel_rapl_msr intel_rapl_common iosf_mbi mousedev hid_generic isst_if_common psmouse pvpanic nfit button usbhid uhci_hcd ehci_pci ehci_hcd cirrus", "upload_time": 1627283526, "issue_id": 1, "panic_type": "Basekernel:fs", "panic_class": "PANIC_NULLPOINTER"}}, {"model": "vmcore.issue", "pk": 1, "fields": {"created_at": "", "deleted_at": null, "calltrace": "ovl_cleanup$ovl_cleanup_whiteouts$ovl_clear_empty", "crashkey": "310$ovl_cleanup$ovl_cleanup_whiteouts$ovl_clear_empty", "solution": "84889d49335627bc770b32787c1ef9ebad1da232"}}, {"model": "vmcore.issue", "pk": 2, "fields": {"created_at": "2021-12-07 14:43:18", "deleted_at": null, "calltrace": "blk_get_backing_dev_info$inode_switch_wbs_work_fn$__switch_to", "crashkey": "409$blk_get_backing_dev_info$inode_switch_wbs_work_fn$__switch_to", "solution": "d877854"}}, {"model": "vmcore.issue", "pk": 6, "fields": {"created_at": "2021-12-07 16:05:29", "deleted_at": null, "calltrace": "locked_inode_to_wb_and_lock_list$writeback_sb_inodes$__writeback_inodes_wb", "crashkey": "419$locked_inode_to_wb_and_lock_list$writeback_sb_inodes$__writeback_inodes_wb", "solution": "adfadfasdfasdfasdfasfdasdfasdfaasdfadfasdfadfadsf"}}, {"model": "vmcore.issue", "pk": 7, "fields": {"created_at": "2021-12-08 10:48:31", "deleted_at": null, "calltrace": "dd$writeback_sb_inodes$__writeback_inodes_wb", "crashkey": "419$dd$writeback_sb_inodes$__writeback_inodes_wb", "solution": "test"}}, {"model": "vmcore.issue", "pk": 8, "fields": {"created_at": "2021-12-08 10:49:09", "deleted_at": null, "calltrace": "dd$writeback_sb_inodes$__writeback_inodes_wb", "crashkey": "419$dd$writeback_sb_inodes$__writeback_inodes_wb", "solution": "test"}}, {"model": "vmcore.issue", "pk": 9, "fields": {"created_at": "2021-12-08 10:50:35", "deleted_at": null, "calltrace": "dd$writeback_sb_inodes$__writeback_inodes_wb", "crashkey": "419$dd$writeback_sb_inodes$__writeback_inodes_wb", "solution": "test"}}, {"model": "vmcore.issue", "pk": 10, "fields": {"created_at": "2021-12-15 16:50:40", "deleted_at": null, "calltrace": "ovl_cleanup$ovl_cleanup_whiteouts$ovl_clear_empty", "crashkey": "310$ovl_cleanup$ovl_cleanup_whiteouts$ovl_clear_empty", "solution": "a12121231231"}}, {"model": "vmcore.issue", "pk": 11, "fields": {"created_at": "2021-12-15 16:55:46", "deleted_at": null, "calltrace": "free_percpu$percpu_counter_destroy$wb_init", "crashkey": "310$free_percpu$percpu_counter_destroy$wb_init", "solution": "asdfasdfasdfasdfasdfasdfasfasfasdfasfasdf"}}, {"model": "vmcore.issue", "pk": 12, "fields": {"created_at": "2021-12-15 16:59:51", "deleted_at": null, "calltrace": "dd$writeback_sb_inodes$__writeback_inodes_wb", "crashkey": "419$dd$writeback_sb_inodes$__writeback_inodes_wb", "solution": "testtest"}}, {"model": "vmcore.issue", "pk": 13, "fields": {"created_at": "2021-12-15 17:00:55", "deleted_at": null, "calltrace": "dd$writeback_sb_inodes$__writeback_inodes_wb", "crashkey": "419$dd$writeback_sb_inodes$__writeback_inodes_wb", "solution": "testtest"}}, {"model": "vmcore.issue", "pk": 14, "fields": {"created_at": "2021-12-15 17:01:11", "deleted_at": null, "calltrace": "dd$writeback_sb_inodes$__writeback_inodes_wb", "crashkey": "419$dd$writeback_sb_inodes$__writeback_inodes_wb", "solution": "adafasasasdfasdf"}}, {"model": "vmcore.issue", "pk": 15, "fields": {"created_at": "2021-12-15 17:13:51", "deleted_at": null, "calltrace": "locked_inode_to_wb_and_lock_list$writeback_sb_inodes$switch_to", "crashkey": "419$locked_inode_to_wb_and_lock_list$writeback_sb_inodes$switch_to", "solution": "asd12121212"}}, {"model": "vmcore.calltrace", "pk": 1, "fields": {"created_at": "", "deleted_at": null, "name": "20211207_ecs2", "line": "blk_get_backing_dev_info", "idx": 1, "vmcore": "20211207_ecs2"}}, {"model": "vmcore.calltrace", "pk": 2, "fields": {"created_at": "", "deleted_at": null, "name": "20211207_ecs2", "line": "inode_switch_wbs_work_fn", "idx": 2, "vmcore": "20211207_ecs2"}}, {"model": "vmcore.calltrace", "pk": 3, "fields": {"created_at": "", "deleted_at": null, "name": "20211207_ecs2", "line": "__switch_to", "idx": 3, "vmcore": "20211207_ecs2"}}, {"model": "vmcore.calltrace", "pk": 4, "fields": {"created_at": "", "deleted_at": null, "name": "20211207_ecs3", "line": "__writeback_inodes_wb", "idx": 3, "vmcore": "20211207_ecs3"}}, {"model": "vmcore.calltrace", "pk": 5, "fields": {"created_at": "", "deleted_at": null, "name": "20211207_ecs3", "line": "writeback_sb_inodes", "idx": 2, "vmcore": "20211207_ecs3"}}, {"model": "vmcore.calltrace", "pk": 6, "fields": {"created_at": "", "deleted_at": null, "name": "20211207_ecs3", "line": "locked_inode_to_wb_and_lock_list", "idx": 1, "vmcore": "20211207_ecs3"}}, {"model": "vmcore.calltrace", "pk": 7, "fields": {"created_at": "", "deleted_at": null, "name": "20211204_ecs1", "line": "locked_inode_to_wb_and_lock_list", "idx": 1, "vmcore": "20211204_ecs1"}}, {"model": "vmcore.calltrace", "pk": 8, "fields": {"created_at": "", "deleted_at": null, "name": "20211204_ecs1", "line": "writeback_sb_inodes", "idx": 2, "vmcore": "20211204_ecs1"}}, {"model": "vmcore.calltrace", "pk": 9, "fields": {"created_at": "", "deleted_at": null, "name": "20211204_ecs1", "line": "switch_to", "idx": 3, "vmcore": "20211204_ecs1"}}, {"model": "vmcore.calltrace", "pk": 10, "fields": {"created_at": "", "deleted_at": null, "name": "20211130_ecs4", "line": "locked_inode_to_wb_and_lock_list", "idx": 1, "vmcore": "20211130_ecs4"}}, {"model": "vmcore.calltrace", "pk": 11, "fields": {"created_at": "", "deleted_at": null, "name": "20211130_ecs4", "line": "do_page_fault", "idx": 2, "vmcore": "20211130_ecs4"}}, {"model": "vmcore.calltrace", "pk": 12, "fields": {"created_at": "", "deleted_at": null, "name": "20211130_ecs4", "line": "switch_to", "idx": 3, "vmcore": "20211130_ecs4"}}] \ No newline at end of file diff --git a/sysom_api/conf/test_constant.py b/sysom_api/conf/test_constant.py index 0f149bf5d05953b7c42735e5592d332fe717cceb..e96114ff5c76b224457dda011502e6326df3cd96 100644 --- a/sysom_api/conf/test_constant.py +++ b/sysom_api/conf/test_constant.py @@ -11,17 +11,13 @@ from . import BaseConstant class TestConstant(BaseConstant): DEBUG = True - SERVICE_SVG_PATH = '/Users/fengfuqiu/Documents/project/sysom/netinfo' - SERVICE_URL = 'http://11.238.158.138:8000/' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. - 'TIMEOUT': 2, - 'NAME': 'sysom_test_db', # Or path to database file if using sqlite3. + 'NAME': 'sysom', # Or path to database file if using sqlite3. 'USER': 'sysom', # Not used with sqlite3. - 'PASSWORD': 'sysomtest', - 'HOST': 'rm-tattest-osdh.mysql.rdstest.tbsite.net', - # Set to empty string for localhost. Not used with sqlite3. + 'PASSWORD': 'sysom_admin', + 'HOST': '127.0.0.1', 'PORT': '3306', }, } diff --git a/sysom_api/consumer/executors.py b/sysom_api/consumer/executors.py index d509e02316c5e335ac278ad5d7108dde0c90c369..bae550a0e82dce4d46adb053201ca9943a90803a 100644 --- a/sysom_api/consumer/executors.py +++ b/sysom_api/consumer/executors.py @@ -14,7 +14,9 @@ class SshJob: try: update_job(instance=self.job, status="Running") host_ips = [] + count = 0 for script in self.resp_scripts: + count = count + 1 ip = script.get("instance", None) cmd = script.get("cmd", None) if not ip or not cmd: @@ -28,7 +30,7 @@ class SshJob: if str(status) != '0': update_job(instance=self.job, status="Fail", job_result=result, host_by=host_ips) break - if self.resp_scripts.index(script) == len(self.resp_scripts) - 1: + if count == len(self.resp_scripts): update_job(instance=self.job, status="Success", job_result=result, host_by=host_ips) if self.kwargs.get('update_host_status', None): host.status = status if status == 0 else 1 diff --git a/sysom_api/service_scripts/test b/sysom_api/service_scripts/test new file mode 100755 index 0000000000000000000000000000000000000000..e0c1b732fbf8f2b4316047799fdde264ea9ab59e --- /dev/null +++ b/sysom_api/service_scripts/test @@ -0,0 +1,15 @@ +#!/bin/bash + +args=$1 +echo "{ + 'commands':[ + { + 'instance': '116.62.146.75', + 'cmd': 'ls /root' + }, + { + 'instance': '116.62.146.75', + 'cmd': 'ls /root && echo ${args}' + } + ] +}" \ No newline at end of file diff --git a/sysom_api/service_scripts/tpython b/sysom_api/service_scripts/tpython new file mode 100755 index 0000000000000000000000000000000000000000..8bf65e64b26ed273b6dc5af8f8e01f2681de9771 --- /dev/null +++ b/sysom_api/service_scripts/tpython @@ -0,0 +1,19 @@ +#!/usr/bin/env python +import json +import sys + +args = sys.argv[1] +result = { + 'commands':[ + { + 'instance': '116.62.146.75', + 'cmd': 'ls /root' + }, + { + 'instance': '116.62.146.75', + 'cmd': 'ls /; echo %s' % args, + } + ] +} +data = json.dumps(result) +print(data) diff --git a/sysom_web/src/pages/Host/service.js b/sysom_web/src/pages/Host/service.js index 041b240dbe745e8aefbd41ef3bbe85392bfe8fbe..880ae7ccdd29c666e6950c785d5882ba7d993e58 100644 --- a/sysom_web/src/pages/Host/service.js +++ b/sysom_web/src/pages/Host/service.js @@ -12,7 +12,7 @@ export async function getCluster(options) { ...(options || {}), }); const array = msg.data - const results = array.map(item => { + const results = array?.map(item => { return { label: item.type_name, value: item.id, diff --git a/sysom_web/src/pages/diagnose/diagnose.less b/sysom_web/src/pages/diagnose/diagnose.less index 4639a0fb8670e1411fdd21df1c73f8644c3389f5..5efd9c64de6571b8ce375a39d983484e681feffa 100644 --- a/sysom_web/src/pages/diagnose/diagnose.less +++ b/sysom_web/src/pages/diagnose/diagnose.less @@ -1,5 +1,28 @@ @import '~antd/lib/style/themes/default.less'; -.titname{float: left;margin-left: 10px;height: 32px;line-height: 32px;} -.titneir{float: left;height: 32px;line-height: 32px;color: red;} -.ostitle{font-size: 24px;padding-bottom: 10px;color: red;} \ No newline at end of file +.titname{ + margin-left: 10px; + height: 32px; + line-height: 32px; + float: left; +} +.titneir{ + height: 32px; + line-height: 32px; + color: red; + float: left; +} +.ostitle{ + font-size: 24px; + padding-bottom: 10px; + color: red; +} +.cardpro{ + padding: 95px 24px; +} +.iconcard{ + color: #1890ff; + font-size: 32px; +} + + diff --git a/sysom_web/src/pages/diagnose/io/IOResults.js b/sysom_web/src/pages/diagnose/io/IOResults.js index 05a25a0f6f67e929362932c3e12402605937395d..bb1963f82177e6d8fe4f801db08c2a22199535b2 100644 --- a/sysom_web/src/pages/diagnose/io/IOResults.js +++ b/sysom_web/src/pages/diagnose/io/IOResults.js @@ -1,4 +1,5 @@ -import { Button, Statistic, Select, Descriptions, message } from 'antd'; +import { Button, Statistic, Select, Descriptions, message, Row, Col } from 'antd'; +import { ArrowRightOutlined } from '@ant-design/icons'; import { useState, useRef } from 'react'; import ProCard from '@ant-design/pro-card'; import RcResizeObserver from 'rc-resize-observer'; @@ -8,16 +9,23 @@ import styles from '../diagnose.less'; const { Divider } = ProCard; const { Option } = Select; -const DiagCard = () => { - const handleChange = (value) => { - console.log(value); - } +const DiagTitle = () => { return ( <>