feat: 完善变更服务器时间的接口

This commit is contained in:
caoqianming 2025-05-19 10:08:58 +08:00
parent 0f0b055101
commit 1a1f64f9fe
3 changed files with 34 additions and 12 deletions

View File

@ -36,3 +36,8 @@ class SpeakerSerializer(serializers.Serializer):
class AreaManSerializer(serializers.Serializer): class AreaManSerializer(serializers.Serializer):
area = serializers.CharField() area = serializers.CharField()
class ServerTimeSerializer(serializers.Serializer):
server_time = serializers.DateTimeField()
timezone = serializers.CharField(read_only=True)

View File

@ -1,6 +1,6 @@
from django.urls import path, include from django.urls import path, include
from apps.develop.views import (BackupDatabase, BackupMedia, ReloadClientGit, from apps.develop.views import (BackupDatabase, BackupMedia, ReloadClientGit,
ReloadServerGit, ReloadServerOnly, TestViewSet, CorrectViewSet, testScanHtml, ChangeServerDate) ReloadServerGit, ReloadServerOnly, TestViewSet, CorrectViewSet, testScanHtml, ServerTime)
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
API_BASE_URL = 'api/develop/' API_BASE_URL = 'api/develop/'
@ -15,7 +15,7 @@ urlpatterns = [
path(API_BASE_URL + 'reload_server_only/', ReloadServerOnly.as_view()), path(API_BASE_URL + 'reload_server_only/', ReloadServerOnly.as_view()),
path(API_BASE_URL + 'backup_database/', BackupDatabase.as_view()), path(API_BASE_URL + 'backup_database/', BackupDatabase.as_view()),
path(API_BASE_URL + 'backup_media/', BackupMedia.as_view()), path(API_BASE_URL + 'backup_media/', BackupMedia.as_view()),
path(API_BASE_URL + 'change_server_date/', ChangeServerDate.as_view()), path(API_BASE_URL + 'server_time/', ServerTime.as_view()),
path(API_BASE_URL, include(router.urls)), path(API_BASE_URL, include(router.urls)),
path(HTML_BASE_URL + "testscan/", testScanHtml) path(HTML_BASE_URL + "testscan/", testScanHtml)
] ]

View File

@ -2,14 +2,14 @@
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from rest_framework.permissions import IsAdminUser from rest_framework.permissions import IsAdminUser, AllowAny
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.serializers import Serializer from rest_framework.serializers import Serializer
from rest_framework.decorators import action from rest_framework.decorators import action
from apps.am.models import Area from apps.am.models import Area
from apps.am.tasks import cache_areas_info from apps.am.tasks import cache_areas_info
from apps.develop.serializers import AreaManSerializer, CleanDataSerializer, GenerateVoiceSerializer, SendSmsSerializer, SpeakerSerializer, \ from apps.develop.serializers import AreaManSerializer, CleanDataSerializer, GenerateVoiceSerializer, SendSmsSerializer, SpeakerSerializer, \
TestTaskSerializer, TestAlgoSerializer TestTaskSerializer, TestAlgoSerializer, ServerTimeSerializer
from apps.develop.tasks import backup_database, backup_media, reload_web_git, reload_server_git, reload_server_only from apps.develop.tasks import backup_database, backup_media, reload_web_git, reload_server_git, reload_server_only
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException
from apps.ecm.service import check_not_in_place, create_remind, handle_xx_event, loc_change, notify_event, rail_in, snap_and_analyse from apps.ecm.service import check_not_in_place, create_remind, handle_xx_event, loc_change, notify_event, rail_in, snap_and_analyse
@ -33,25 +33,42 @@ from django.db import transaction
from django.core.cache import cache from django.core.cache import cache
from apps.utils.decorators import auto_log from apps.utils.decorators import auto_log
from django.http import HttpResponse from django.http import HttpResponse
from server.settings import SD_PWD from server.settings import SD_PWD, TIME_ZONE
import subprocess import subprocess
from drf_yasg.utils import swagger_auto_schema from drf_yasg.utils import swagger_auto_schema
from datetime import datetime
# Create your views here. # Create your views here.
class ChangeServerDate(APIView): class ServerTime(APIView):
permission_classes = [IsAdminUser]
@swagger_auto_schema(request_body=Serializer) def get_permissions(self):
if self.request.method == 'GET':
return [AllowAny()]
return [IsAdminUser()]
@swagger_auto_schema(responses={200: ServerTimeSerializer})
def get(self, request):
"""
获取服务器时间
获取服务器时间
"""
return Response({"server_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "timezone": TIME_ZONE})
@swagger_auto_schema(request_body=ServerTimeSerializer)
def post(self, request): def post(self, request):
""" """
修改服务器时间 修改服务器时间
修改服务器时间 修改服务器时间
""" """
command = 'echo "{}" | sudo -s date "{}"'.format( command = f'date -s "{request.data["new_server_time"]}"'
SD_PWD, request.data["date"] completed = subprocess.run(
["sudo", "sh", "-c", command], # 避免 shell=True 的安全风险
input=SD_PWD, # 密码从安全配置读取
capture_output=True,
text=True
) )
completed = subprocess.run(command, shell=True, capture_output=True, text=True)
if completed.returncode != 0: if completed.returncode != 0:
raise ParseError(completed.stderr) raise ParseError(completed.stderr)
return Response() return Response()