144 lines
4.3 KiB
Python
Executable File
144 lines
4.3 KiB
Python
Executable File
|
||
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.monitor.models import DrfRequestLog
|
||
|
||
from apps.monitor.errors import LOG_NOT_FONED
|
||
from apps.utils.viewsets import CustomGenericViewSet
|
||
# Create your views here.
|
||
|
||
|
||
def index(request):
|
||
return render(request, 'monitor/index.html')
|
||
|
||
|
||
def room(request, room_name):
|
||
return render(request, 'monitor/room.html', {
|
||
'room_name': room_name
|
||
})
|
||
|
||
|
||
def video(request):
|
||
return render(request, 'monitor/video.html')
|
||
|
||
|
||
class ServerInfoView(APIView):
|
||
permission_classes = [IsAuthenticated]
|
||
|
||
def get(self, request, *args, **kwargs):
|
||
"""
|
||
获取服务器当前状态
|
||
|
||
cpu/内存/硬盘
|
||
"""
|
||
ret = {'cpu': {}, 'memory': {}, 'disk': {}}
|
||
ret['cpu']['count'] = psutil.cpu_count()
|
||
ret['cpu']['lcount'] = psutil.cpu_count(logical=False)
|
||
ret['cpu']['percent'] = psutil.cpu_percent(interval=1)
|
||
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
|
||
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, CustomGenericViewSet):
|
||
"""请求日志
|
||
|
||
请求日志
|
||
"""
|
||
perms_map = {'get': '*'}
|
||
queryset = DrfRequestLog.objects.all()
|
||
list_serializer_class = DrfRequestLogSerializer
|
||
ordering = ['-requested_at']
|