add judge_server related api
This commit is contained in:
@@ -1,11 +1,16 @@
|
||||
from utils.api import APIView, validate_serializer
|
||||
import hashlib
|
||||
|
||||
from django.utils import timezone
|
||||
|
||||
from account.decorators import super_admin_required
|
||||
from utils.api import APIView, CSRFExemptAPIView, validate_serializer
|
||||
from utils.shortcuts import rand_str
|
||||
|
||||
from .models import SMTPConfig, WebsiteConfig
|
||||
from .models import SMTPConfig, WebsiteConfig, JudgeServer, JudgeServerToken
|
||||
from .serializers import (WebsiteConfigSerializer, CreateEditWebsiteConfigSerializer,
|
||||
CreateSMTPConfigSerializer, EditSMTPConfigSerializer,
|
||||
SMTPConfigSerializer, TestSMTPConfigSerializer)
|
||||
SMTPConfigSerializer, TestSMTPConfigSerializer,
|
||||
JudgeServerSerializer, JudgeServerHeartbeatSerializer)
|
||||
|
||||
|
||||
class SMTPAPI(APIView):
|
||||
@@ -63,3 +68,65 @@ class WebsiteConfigAPI(APIView):
|
||||
WebsiteConfig.objects.all().delete()
|
||||
config = WebsiteConfig.objects.create(**data)
|
||||
return self.success(WebsiteConfigSerializer(config).data)
|
||||
|
||||
|
||||
class JudgeServerAPI(APIView):
|
||||
@super_admin_required
|
||||
def get(self, request):
|
||||
judge_server_token = JudgeServerToken.objects.first()
|
||||
if not judge_server_token:
|
||||
token = rand_str(12)
|
||||
JudgeServerToken.objects.create(token=token)
|
||||
else:
|
||||
token = judge_server_token.token
|
||||
servers = JudgeServer.objects.all().order_by("-last_heartbeat")
|
||||
return self.success({"token": token,
|
||||
"servers": JudgeServerSerializer(servers, many=True).data})
|
||||
|
||||
@super_admin_required
|
||||
def delete(self, request):
|
||||
pass
|
||||
|
||||
|
||||
class JudgeServerHeartbeatAPI(CSRFExemptAPIView):
|
||||
@validate_serializer(JudgeServerHeartbeatSerializer)
|
||||
def post(self, request):
|
||||
judge_server_token = JudgeServerToken.objects.first()
|
||||
if not judge_server_token:
|
||||
return self.error("Web server token not set")
|
||||
token = judge_server_token.token
|
||||
data = request.data
|
||||
judge_server_token = request.META.get("HTTP_X_JUDGE_SERVER_TOKEN")
|
||||
if hashlib.sha256(token.encode("utf-8")).hexdigest() != judge_server_token:
|
||||
return self.error("Invalid token")
|
||||
service_url = data.get("service_url")
|
||||
if service_url:
|
||||
ip = None
|
||||
else:
|
||||
ip = request.META["REMOTE_ADDR"]
|
||||
|
||||
try:
|
||||
server = JudgeServer.objects.get(hostname=data["hostname"])
|
||||
server.judger_version = data["judger_version"]
|
||||
server.cpu_core = data["cpu_core"]
|
||||
server.memory_usage = data["memory"]
|
||||
server.cpu_usage = data["cpu"]
|
||||
server.service_url= service_url
|
||||
server.ip = ip
|
||||
server.last_heartbeat = timezone.now()
|
||||
server.save()
|
||||
except JudgeServer.DoesNotExist:
|
||||
JudgeServer.objects.create(hostname=data["hostname"],
|
||||
judger_version=data["judger_version"],
|
||||
cpu_core=data["cpu_core"],
|
||||
memory_usage=data["memory"],
|
||||
cpu_usage=data["cpu"],
|
||||
ip=ip,
|
||||
service_url=service_url,
|
||||
last_heartbeat=timezone.now(),
|
||||
)
|
||||
return self.success()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user