diff --git a/apps/develop/serializers.py b/apps/develop/serializers.py index 29bc8ab8..efe59def 100755 --- a/apps/develop/serializers.py +++ b/apps/develop/serializers.py @@ -35,4 +35,9 @@ class SpeakerSerializer(serializers.Serializer): class AreaManSerializer(serializers.Serializer): - area = serializers.CharField() \ No newline at end of file + area = serializers.CharField() + + +class ServerTimeSerializer(serializers.Serializer): + server_time = serializers.DateTimeField() + timezone = serializers.CharField(read_only=True) \ No newline at end of file diff --git a/apps/develop/urls.py b/apps/develop/urls.py index a6ebb7ad..bd894ba8 100755 --- a/apps/develop/urls.py +++ b/apps/develop/urls.py @@ -1,6 +1,6 @@ from django.urls import path, include 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 API_BASE_URL = 'api/develop/' @@ -15,7 +15,7 @@ urlpatterns = [ path(API_BASE_URL + 'reload_server_only/', ReloadServerOnly.as_view()), path(API_BASE_URL + 'backup_database/', BackupDatabase.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(HTML_BASE_URL + "testscan/", testScanHtml) ] diff --git a/apps/develop/views.py b/apps/develop/views.py index fe7fa83f..83d5a8df 100755 --- a/apps/develop/views.py +++ b/apps/develop/views.py @@ -2,14 +2,14 @@ from rest_framework.views import APIView 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.serializers import Serializer from rest_framework.decorators import action from apps.am.models import Area from apps.am.tasks import cache_areas_info 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 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 @@ -33,25 +33,42 @@ from django.db import transaction from django.core.cache import cache from apps.utils.decorators import auto_log from django.http import HttpResponse -from server.settings import SD_PWD +from server.settings import SD_PWD, TIME_ZONE import subprocess from drf_yasg.utils import swagger_auto_schema +from datetime import datetime # Create your views here. -class ChangeServerDate(APIView): - permission_classes = [IsAdminUser] +class ServerTime(APIView): - @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): """ 修改服务器时间 修改服务器时间 """ - command = 'echo "{}" | sudo -s date "{}"'.format( - SD_PWD, request.data["date"] + command = f'date -s "{request.data["new_server_time"]}"' + 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: raise ParseError(completed.stderr) return Response()