增加develop相关
This commit is contained in:
parent
680a0dceeb
commit
a3cb4bb34c
|
@ -0,0 +1,3 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
|
@ -0,0 +1,5 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class DevelopConfig(AppConfig):
|
||||
name = 'apps.develop'
|
|
@ -0,0 +1,3 @@
|
|||
from django.db import models
|
||||
|
||||
# Create your models here.
|
|
@ -0,0 +1 @@
|
|||
from rest_framework import serializers
|
|
@ -0,0 +1,44 @@
|
|||
from __future__ import absolute_import, unicode_literals
|
||||
from distutils import command
|
||||
from rest_framework.response import Response
|
||||
from celery import shared_task
|
||||
import os
|
||||
import subprocess
|
||||
from server.settings import DATABASES, BACKUP_PATH, SH_PATH, SD_PWD
|
||||
|
||||
@shared_task
|
||||
def backup_database():
|
||||
"""
|
||||
备份数据库
|
||||
"""
|
||||
import datetime
|
||||
name = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
|
||||
command = 'echo "{}" | sudo -S pg_dump "user={} password={} dbname={}" > {}/hberp_{}.sql'.format(
|
||||
SD_PWD,
|
||||
DATABASES['default']['USER'],
|
||||
DATABASES['default']['PASSWORD'],
|
||||
DATABASES['default']['NAME'],
|
||||
BACKUP_PATH + '/database',
|
||||
name)
|
||||
completed = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||||
return completed
|
||||
|
||||
@shared_task
|
||||
def reload_server_git():
|
||||
command = 'bash {}/git_server.sh'.format(SH_PATH)
|
||||
completed = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||||
return completed
|
||||
|
||||
@shared_task
|
||||
def reload_server_only():
|
||||
command = 'echo "{}" | sudo -S service supervisor reload'.format(SD_PWD)
|
||||
completed = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||||
return completed
|
||||
|
||||
@shared_task
|
||||
def backup_media():
|
||||
command = 'bash {}/backup_media.sh'.format(SH_PATH)
|
||||
completed = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||||
return completed
|
||||
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
|
@ -0,0 +1,13 @@
|
|||
from django.db.models import base
|
||||
from rest_framework import urlpatterns
|
||||
from django.urls import path, include
|
||||
from rest_framework.routers import DefaultRouter
|
||||
from apps.develop.views import BackupDatabase, BackupMedia, ReloadServerGit, ReloadServerOnly
|
||||
|
||||
urlpatterns = [
|
||||
path('reload_server_git/', ReloadServerGit.as_view()),
|
||||
path('reload_server_only/', ReloadServerOnly.as_view()),
|
||||
path('backup_database/', BackupDatabase.as_view()),
|
||||
path('backup_media/', BackupMedia.as_view())
|
||||
]
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
from django.db import transaction
|
||||
from django.shortcuts import render
|
||||
from rest_framework.decorators import permission_classes
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.permissions import IsAdminUser, AllowAny
|
||||
from rest_framework.response import Response
|
||||
from apps.develop.tasks import backup_database, backup_media, reload_server_git, reload_server_only
|
||||
from rest_framework.exceptions import APIException
|
||||
# Create your views here.
|
||||
|
||||
|
||||
class ReloadServerGit(APIView):
|
||||
permission_classes = [IsAdminUser]
|
||||
def post(self, request):
|
||||
"""
|
||||
拉取代码并重启服务
|
||||
"""
|
||||
completed = reload_server_git()
|
||||
if completed.returncode == 0:
|
||||
return Response()
|
||||
else:
|
||||
raise APIException(completed.stdout)
|
||||
|
||||
class ReloadServerOnly(APIView):
|
||||
permission_classes = [IsAdminUser]
|
||||
def post(self, request):
|
||||
"""
|
||||
仅重启服务
|
||||
"""
|
||||
completed = reload_server_only()
|
||||
if completed.returncode == 0:
|
||||
return Response()
|
||||
else:
|
||||
raise APIException(completed.stdout)
|
||||
|
||||
|
||||
class BackupDatabase(APIView):
|
||||
permission_classes = [IsAdminUser]
|
||||
def post(self, request):
|
||||
"""
|
||||
备份数据库到指定位置
|
||||
"""
|
||||
completed = backup_database()
|
||||
if completed.returncode == 0:
|
||||
return Response()
|
||||
else:
|
||||
raise APIException(completed.stdout)
|
||||
|
||||
class BackupMedia(APIView):
|
||||
permission_classes = [IsAdminUser]
|
||||
def post(self, request):
|
||||
"""
|
||||
备份资源到指定位置
|
||||
"""
|
||||
completed = backup_media()
|
||||
if completed.returncode == 0:
|
||||
return Response()
|
||||
else:
|
||||
raise APIException(completed.stdout)
|
|
@ -38,6 +38,7 @@ class DrfRequestLog(BaseModel):
|
|||
data = models.TextField(null=True, blank=True)
|
||||
response = models.TextField(null=True, blank=True)
|
||||
errors = models.TextField(null=True, blank=True)
|
||||
agent = models.TextField(null=True, blank=True)
|
||||
status_code = models.PositiveIntegerField(null=True, blank=True, db_index=True)
|
||||
|
||||
class Meta:
|
||||
|
|
|
@ -9,6 +9,7 @@ from server.settings import myLogger
|
|||
from django.db import connection
|
||||
from django.utils.timezone import now
|
||||
from apps.utils.snowflake import idWorker
|
||||
from user_agents import parse
|
||||
|
||||
class CreateUpdateModelAMixin:
|
||||
"""
|
||||
|
@ -99,9 +100,10 @@ class MyLoggingMixin(object):
|
|||
|
||||
def handle_exception(self, exc):
|
||||
response = super().handle_exception(exc)
|
||||
if response.status_code >= 500: # 如果是服务器错误额外记录日志到文件
|
||||
err_str = traceback.format_exc()
|
||||
self.log["errors"] = err_str
|
||||
myLogger.error('{}-{}'.format(self.log['request_id'], err_str))
|
||||
myLogger.error('{}-{}'.format(self.log['id'], err_str))
|
||||
return response
|
||||
|
||||
def finalize_response(self, request, response, *args, **kwargs):
|
||||
|
@ -140,6 +142,7 @@ class MyLoggingMixin(object):
|
|||
"response_ms": self._get_response_ms(),
|
||||
"response": self._clean_data(rendered_content),
|
||||
"status_code": response.status_code,
|
||||
"agent": self._get_agent(),
|
||||
}
|
||||
)
|
||||
try:
|
||||
|
@ -211,6 +214,10 @@ class MyLoggingMixin(object):
|
|||
return None
|
||||
return user
|
||||
|
||||
def _get_agent(self, request):
|
||||
"""Get os string"""
|
||||
return str(parse(request.META['HTTP_USER_AGENT']))
|
||||
|
||||
def _get_response_ms(self):
|
||||
"""
|
||||
Get the duration of the request response cycle is milliseconds.
|
||||
|
|
|
@ -10,7 +10,7 @@ drf-yasg==1.20.0
|
|||
psutil==5.9.0
|
||||
pillow==9.0.1
|
||||
opencv-python==4.5.5.62
|
||||
gunicorn==20.1.0
|
||||
daphne==3.0.2
|
||||
redis==4.1.4
|
||||
user-agents==2.2.0
|
||||
daphne==3.0.2
|
||||
|
|
|
@ -46,6 +46,7 @@ INSTALLED_APPS = [
|
|||
'drf_yasg',
|
||||
'rest_framework',
|
||||
"django_filters",
|
||||
'apps.develop',
|
||||
'apps.utils',
|
||||
'apps.third',
|
||||
'apps.system',
|
||||
|
@ -294,14 +295,14 @@ LOGGING = {
|
|||
},
|
||||
# log 调用时需要当作参数传入
|
||||
'log': {
|
||||
'handlers': ['error', 'info', 'console', 'default'],
|
||||
'handlers': ['error', 'info'],
|
||||
'level': 'INFO',
|
||||
'propagate': True
|
||||
},
|
||||
}
|
||||
}
|
||||
# 实例化myLogger
|
||||
myLogger = logging.getLogger(__name__)
|
||||
myLogger = logging.getLogger('log')
|
||||
|
||||
# 大华ICC平台
|
||||
DAHUA_ENABLED = conf.DAHUA_ENABLED
|
||||
|
@ -317,3 +318,8 @@ XX_BASE_URL = conf.XX_BASE_URL
|
|||
XX_LICENCE = conf.XX_LICENCE
|
||||
XX_USERNAME = conf.XX_USERNAME
|
||||
XX_BUILDID = conf.XX_BUILDID
|
||||
|
||||
# 运维相关
|
||||
SD_PWD = conf.SD_PWD
|
||||
BACKUP_PATH = conf.BACKUP_PATH
|
||||
SH_PATH = conf.SH_PATH
|
Loading…
Reference in New Issue