add judge_server related api

This commit is contained in:
virusdefender
2016-11-20 19:18:25 +08:00
parent 294fd8b5b2
commit f56d75cf91
9 changed files with 254 additions and 11 deletions

View File

@@ -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()