160 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Python
		
	
	
	
 | 
						||
from django.shortcuts import render
 | 
						||
import psutil
 | 
						||
from rest_framework.response import Response
 | 
						||
from rest_framework.views import APIView
 | 
						||
from rest_framework.permissions import IsAuthenticated
 | 
						||
from django.conf import settings
 | 
						||
import os
 | 
						||
from rest_framework import serializers
 | 
						||
from drf_yasg import openapi
 | 
						||
from drf_yasg.utils import swagger_auto_schema
 | 
						||
from rest_framework.exceptions import NotFound
 | 
						||
from rest_framework.mixins import ListModelMixin
 | 
						||
from apps.ops.filters import DrfLogFilterSet
 | 
						||
from apps.ops.models import DrfRequestLog
 | 
						||
from rest_framework.viewsets import GenericViewSet
 | 
						||
from apps.ops.errors import LOG_NOT_FONED
 | 
						||
from rest_framework.decorators import action
 | 
						||
 | 
						||
# Create your views here.
 | 
						||
 | 
						||
class CpuView(APIView):
 | 
						||
    permission_classes = [IsAuthenticated]
 | 
						||
    def get(self, request, *args, **kwargs):
 | 
						||
        """
 | 
						||
        获取服务器cpu当前状态
 | 
						||
 | 
						||
        获取服务器cpu当前状态
 | 
						||
        """
 | 
						||
        ret = {'cpu': {}}
 | 
						||
        ret['cpu']['count'] = psutil.cpu_count()
 | 
						||
        ret['cpu']['lcount'] = psutil.cpu_count(logical=False)
 | 
						||
        ret['cpu']['percent'] = psutil.cpu_percent(interval=1)
 | 
						||
        return Response(ret)
 | 
						||
 | 
						||
class MemoryView(APIView):
 | 
						||
    permission_classes = [IsAuthenticated]
 | 
						||
    def get(self, request, *args, **kwargs):
 | 
						||
        """
 | 
						||
        获取服务器内存当前状态
 | 
						||
 | 
						||
        获取服务器内存当前状态
 | 
						||
        """
 | 
						||
        ret = {'memory': {}}
 | 
						||
        memory = psutil.virtual_memory()
 | 
						||
        ret['memory']['total'] = round(memory.total/1024/1024/1024, 2)
 | 
						||
        ret['memory']['used'] = round(memory.used/1024/1024/1024, 2)
 | 
						||
        ret['memory']['percent'] = memory.percent
 | 
						||
        return Response(ret)
 | 
						||
 | 
						||
class DiskView(APIView):
 | 
						||
    permission_classes = [IsAuthenticated]
 | 
						||
    def get(self, request, *args, **kwargs):
 | 
						||
        """
 | 
						||
        获取服务器硬盘当前状态
 | 
						||
 | 
						||
        获取服务器硬盘当前状态
 | 
						||
        """
 | 
						||
        ret = {'disk': {}}
 | 
						||
        disk = psutil.disk_usage('/')
 | 
						||
        ret['disk']['total'] = round(disk.total/1024/1024/1024, 2)
 | 
						||
        ret['disk']['used'] = round(disk.used/1024/1024/1024, 2)
 | 
						||
        ret['disk']['percent'] = disk.percent
 | 
						||
        return Response(ret)
 | 
						||
 | 
						||
def get_file_list(file_path):
 | 
						||
    dir_list = os.listdir(file_path)
 | 
						||
    if not dir_list:
 | 
						||
        return
 | 
						||
    else:
 | 
						||
        # 注意,这里使用lambda表达式,将文件按照最后修改时间顺序升序排列
 | 
						||
        # os.path.getmtime() 函数是获取文件最后修改时间
 | 
						||
        # os.path.getctime() 函数是获取文件最后创建时间
 | 
						||
        dir_list = sorted(dir_list, key=lambda x: os.path.getmtime(
 | 
						||
            os.path.join(file_path, x)), reverse=True)
 | 
						||
        # print(dir_list)
 | 
						||
        return dir_list
 | 
						||
 | 
						||
 | 
						||
class LogView(APIView):
 | 
						||
 | 
						||
    @swagger_auto_schema(manual_parameters=[
 | 
						||
        openapi.Parameter('name', openapi.IN_QUERY,
 | 
						||
                          description='日志文件名', type=openapi.TYPE_STRING)
 | 
						||
    ])
 | 
						||
    def get(self, request, *args, **kwargs):
 | 
						||
        """
 | 
						||
        查看最近的日志列表
 | 
						||
 | 
						||
        查看最近的日志列表
 | 
						||
        """
 | 
						||
        logs = []
 | 
						||
        name = request.GET.get('name', None)
 | 
						||
        # for root, dirs, files in os.walk(settings.LOG_PATH):
 | 
						||
        #     files.reverse()
 | 
						||
        for file in get_file_list(settings.LOG_PATH):
 | 
						||
            if len(logs) > 50:
 | 
						||
                break
 | 
						||
            filepath = os.path.join(settings.LOG_PATH, file)
 | 
						||
            if name:
 | 
						||
                if name in filepath:
 | 
						||
                    fsize = os.path.getsize(filepath)
 | 
						||
                    if fsize:
 | 
						||
                        logs.append({
 | 
						||
                            "name": file,
 | 
						||
                            "filepath": filepath,
 | 
						||
                            "size": round(fsize/1024, 1)
 | 
						||
                        })
 | 
						||
            else:
 | 
						||
                fsize = os.path.getsize(filepath)
 | 
						||
                if fsize:
 | 
						||
                    logs.append({
 | 
						||
                        "name": file,
 | 
						||
                        "filepath": filepath,
 | 
						||
                        "size": round(fsize/1024, 1)
 | 
						||
                    })
 | 
						||
        return Response(logs)
 | 
						||
 | 
						||
 | 
						||
class LogDetailView(APIView):
 | 
						||
 | 
						||
    def get(self, request, name):
 | 
						||
        """
 | 
						||
        查看日志详情
 | 
						||
 | 
						||
        查看日志详情
 | 
						||
        """
 | 
						||
        try:
 | 
						||
            with open(os.path.join(settings.LOG_PATH, name)) as f:
 | 
						||
                data = f.read()
 | 
						||
            return Response(data)
 | 
						||
        except Exception:
 | 
						||
            raise NotFound(**LOG_NOT_FONED)
 | 
						||
 | 
						||
 | 
						||
class DrfRequestLogSerializer(serializers.ModelSerializer):
 | 
						||
    class Meta:
 | 
						||
        model = DrfRequestLog
 | 
						||
        fields = '__all__'
 | 
						||
 | 
						||
 | 
						||
class DrfRequestLogViewSet(ListModelMixin, GenericViewSet):
 | 
						||
    """请求日志
 | 
						||
 | 
						||
    请求日志
 | 
						||
    """
 | 
						||
    perms_map = {'get': '*'}
 | 
						||
    queryset = DrfRequestLog.objects.all()
 | 
						||
    serializer_class = DrfRequestLogSerializer
 | 
						||
    ordering = ['-requested_at']
 | 
						||
    filterset_class = DrfLogFilterSet
 | 
						||
 | 
						||
    @action(methods=['delete'], detail=False, perms_map = {'delete':'log_delete'})
 | 
						||
    def clear(self, request, *args, **kwargs):
 | 
						||
        """
 | 
						||
        清空日志
 | 
						||
        """
 | 
						||
        DrfRequestLog.objects.all().delete()
 | 
						||
        return Response()
 |