优化更新页面

This commit is contained in:
ngfchl
2022-10-12 23:53:22 +08:00
parent f61da90264
commit dab0282416
8 changed files with 145 additions and 99 deletions

2
.idea/misc.xml generated
View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (pt_assist)" project-jdk-type="Python SDK" />
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (ptools)" project-jdk-type="Python SDK" />
</project>

2
.idea/ptools.iml generated
View File

@@ -17,7 +17,7 @@
<excludeFolder url="file://$MODULE_DIR$/venv" />
<excludeFolder url="file://$MODULE_DIR$/db" />
</content>
<orderEntry type="jdk" jdkName="Python 3.9 (pt_assist)" jdkType="Python SDK" />
<orderEntry type="jdk" jdkName="Python 3.9 (ptools)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TemplatesService">

View File

@@ -4,10 +4,12 @@ import os
import socket
import subprocess
import time
from datetime import datetime, timedelta
from datetime import datetime, timedelta, date
from uuid import UUID
import docker
import git
import numpy as np
import qbittorrentapi
from django.http import JsonResponse
from django.shortcuts import render
@@ -295,43 +297,13 @@ def import_from_ptpp(request):
}).to_dict(), safe=False)
def get_git_logs(master='', n=10):
# 获取最新的10条更新记录
# master='' 本地 master='origin/master' 远程
p = subprocess.Popen('git log {} -{}'.format(master, n), shell=True, stdout=subprocess.PIPE, )
contents = p.stdout.readlines()
update_notes = []
info = {
'date': '',
'data': []
}
for i in contents:
string = i.decode('utf8')
if string == '\n' or 'commit' in string or 'Author' in string:
continue
if 'Date' in string:
update_notes.append(info)
info = {}
list1 = string.split(':', 1)
# 格式化时间
update_time = datetime.strptime(list1[1].strip(), '%a %b %d %H:%M:%S %Y %z')
info['date'] = update_time.strftime('%Y-%m-%d %H:%M:%S')
info['data'] = []
continue
info['data'].append(string.strip())
# print(update_notes)
update_notes.pop(0)
return update_notes
def get_git_log(master='master', n=10):
def get_git_log(branch, n=20):
repo = git.Repo(path='.')
# 拉取仓库更新记录元数据
repo.remote().update()
# 获取本地仓库commits更新记录
commits = list(repo.iter_commits(master, max_count=n))
# 获取远程仓库commits记录
# remote_commits = list(repo.iter_commits("origin/master", max_count=10))
# commits更新记录
logger.info('当前分支{}'.format(branch))
return list(repo.iter_commits(branch, max_count=n))
def get_update_logs():
@@ -371,22 +343,37 @@ def update_page(request):
cid = ''
restart = 'false'
delta = '程序未在容器中启动?'
if get_update_logs():
update = 'false'
update_tips = '目前您使用的是最新版本!'
else:
branch = os.getenv('DEV') if os.getenv('DEV') else 'master'
local_log = get_git_log(branch)
local_logs = []
for log in local_log:
local_logs.append({
'date': log.committed_datetime.strftime('%Y-%m-%d %H:%M:%S'),
'data': log.message,
'hexsha': log.hexsha[:16],
})
update_note = get_git_log('origin/' + branch)
update_notes = []
for log in update_note:
local_logs.append({
'date': log.committed_datetime.strftime('%Y-%m-%d %H:%M:%S'),
'data': log.message,
'hexsha': log.hexsha[:16],
})
if update_note[0].committed_datetime > local_log[0].committed_datetime:
update = 'true'
update_tips = '已有新版本,请根据需要升级!'
else:
update = 'false'
update_tips = '目前您使用的是最新版本!'
return render(request, 'auto_pt/update.html',
context={
'cid': cid,
'delta': delta,
'restart': restart,
'local_logs': get_git_logs(),
# 'update_notes': get_git_logs(master='origin/master'),
'update_notes': get_git_logs(
master='origin/' + os.getenv('DEV') if os.getenv('DEV') else 'master'
),
'local_logs': local_logs,
'update_notes': update_notes,
'update': update,
'update_tips': update_tips
})
@@ -396,36 +383,47 @@ def do_update(request):
try:
logger.info('开始拉取更新')
main_pt_site_site_mtime = os.stat('./main_pt_site_site.json').st_mtime
# print(os.system('cat ./update.sh'))
subprocess.Popen('chmod +x ./update.sh', shell=True)
p = subprocess.Popen('./update.sh', shell=True, stdout=subprocess.PIPE)
p.wait()
out = p.stdout.readlines()
for i in out:
logger.info(i.decode('utf8'))
# 更新Xpath规则
# 字符串型的数据量转化为int型
# status_list = SiteStatus.objects.all()
# for status in status_list:
# if not status.downloaded:
# status.downloaded = 0
# if not status.uploaded:
# status.uploaded = 0
# if type(status.downloaded) == str and 'B' in status.downloaded:
# status.downloaded = FileSizeConvert.parse_2_byte(status.downloaded)
# if type(status.uploaded) == str and 'B' in status.uploaded:
# status.uploaded = FileSizeConvert.parse_2_byte(status.uploaded)
# status.save()
update_command = {
# 'cp db/db.sqlite3 db/db.sqlite3-$(date "+%Y%m%d%H%M%S")',
'拉取代码更新': 'git pull',
'安装依赖': 'pip install -r requirements.txt',
'创建数据库同步文件': 'python manage.py makemigrations',
'同步数据库': 'python manage.py migrate',
}
result = []
for key, command in update_command.items():
p = subprocess.getstatusoutput(command)
logger.info('{} 命令执行结果:\n{}'.format(key, p))
result.append({
'command': key,
'res': p[0]
})
# subprocess.Popen('chmod +x ./update.sh', shell=True)
# p = subprocess.Popen('./update.sh', shell=True, stdout=subprocess.PIPE)
# p.wait()
# out = p.stdout.readlines()
# for i in out:
# logger.info(i.decode('utf8'))
new_fileinfo = os.stat('./main_pt_site_site.json').st_mtime
logger.info('更新前文件最后修改时间')
logger.info(main_pt_site_site_mtime)
logger.info('更新后文件最后修改时间')
logger.info(new_fileinfo)
if new_fileinfo == main_pt_site_site_mtime:
logger.info('本次更新无规则更新,跳过!')
logger.info('本次无规则更新,跳过!')
result.append({
'command': '本次无更新规则',
'res': 0
})
pass
else:
logger.info('拉取更新完毕开始更新Xpath规则')
p = subprocess.getstatusoutput('cp db/db.sqlite3 db/db.sqlite3-$(date "+%Y%m%d%H%M%S")')
logger.info('备份数据库 命令执行结果:\n{}'.format(p))
result.append({
'command': '备份数据库',
'res': p[0]
})
with open('./main_pt_site_site.json', 'r') as f:
# print(f.readlines())
data = json.load(f)
@@ -433,29 +431,26 @@ def do_update(request):
# print(data[0].get('url'))
# xpath_update = []
logger.info('更新规则中返回结果为True为新建为False为更新其他是错误了')
update_info = ''
for site_rules in data:
if site_rules.get('pk'):
del site_rules['pk']
if site_rules.get('id'):
del site_rules['id']
site_obj = Site.objects.update_or_create(defaults=site_rules, url=site_rules.get('url'))
logger.info(site_obj[0].name + (' 规则新增成功!' if site_obj[1] else '规则更新成功!'))
msg = site_obj[0].name + (' 规则新增成功!' if site_obj[1] else '规则更新成功!')
update_info += (msg + '\n')
logger.info(msg)
result.append({
'command': '更新规则',
'res': 0
})
logger.info('更新完毕')
"""
logger.info('更新完毕,开始重启')
cid = request.GET.get('cid')
flag = (cid == '')
if not flag:
subprocess.Popen('docker restart {}'.format(cid), shell=True, stdout=subprocess.PIPE, )
# out = reboot.stdout.readline().decode('utf8')
# client.api.inspect_container(cid)
# StartedAt = client.api.inspect_container(cid).get('State').get('StartedAt')
return JsonResponse(data=CommonResponse.error(
msg='更新成功,重启指令发送成功,容器重启中 ...' if not flag else '更新成功未映射docker路径请手动重启容器 ...'
).to_dict(), safe=False)
"""
return JsonResponse(data=CommonResponse.error(
msg='更新成功,刷新页面后享用!'
return JsonResponse(data=CommonResponse.success(
msg='更新成功15S后自动刷新页面',
data={
'result': result
}
).to_dict(), safe=False)
except Exception as e:
# raise

View File

@@ -6,4 +6,5 @@ urlpatterns = [
path(r'test_import', views.test_import, name='test_import'),
path(r'handle_json', views.handle_json, name='handle_json'),
path(r'test_post', views.test_post, name='test_post'),
path(r'test_subprocess', views.test_subprocess, name='test_subprocess'),
]

View File

@@ -1,10 +1,13 @@
# Create your views here.
import json
import os
import subprocess
import git
from django.http import JsonResponse
from django.shortcuts import render
from pt_site.views import pt_spider
from pt_site.views import pt_spider, logger
from ptools.base import CommonResponse, StatusCodeEnum
@@ -63,3 +66,26 @@ def test_post(request):
print(j, type(j))
print(r)
return JsonResponse(CommonResponse.success(data=r).to_dict(), safe=False)
def test_subprocess(request):
"""
pip install -r requirements.txt
python manage.py makemigrations
python manage.py migrate
:param request:
:return:
"""
# update_command = [
# # 'cp db/db.sqlite3 db/db.sqlite3-$(date "+%Y%m%d%H%M%S")',
# 'git pull',
# 'pip install -r requirements.txt',
# 'python manage.py makemigrations',
# 'python manage.py migrate',
# ]
# result = []
# for command in update_command:
# p = subprocess.getoutput(command)
# result.append(p)
return JsonResponse(CommonResponse.success(data='ok').to_dict(), safe=False)

View File

@@ -1 +0,0 @@
docker restart $CONTAINER_NAME

View File

@@ -35,7 +35,8 @@
trigger="hover"
content="如果更新后更新功能未生效,请重启容器!!">
<el-button slot="reference" type="danger" @click="do_update"
v-if="update">更新
{# v-if="update"#}
>更新
</el-button>
</el-popover>
<el-popover
@@ -52,6 +53,28 @@
</el-popover>
</div>
<div class="text item">
<el-card class="box-card" shadow="hover" v-if="show">
<div slot="header" class="clearfix">
<span>更新记录</span>
{# <el-tag style="float: right; padding: 3px 0"#}
{# :key="log.res[0] == 0 ? '操作成功!' : '出错啦!'"#}
{# :type="log.res[0] == 0 ? 'success' : 'warning'">#}
{# <span v-text="log.res[0] == 0 ? '操作成功!' : '出错啦!'"></span>#}
{# </el-tag>#}
</div>
<div class="text item">
<el-row>
<el-col :sm="8" :lg="6" :xs="11" v-for="log in update_log">
<el-result :icon="log.res == 0 ? 'success' : 'warning'"
:title="log.command"
:subTitle="log.command">
</el-result>
</el-col>
</el-row>
</div>
</el-card>
<el-row>
<el-col :span="12" v-if="update" :xs="24">
<el-card class="box-card" shadow="hover">
@@ -68,10 +91,12 @@
{# :size="activity.size" #}
:timestamp="update_note.date">
<el-card shadow="hover">
<p v-for="content in update_note.data" v-html="content">
<p v-html="update_note.data">
</p>
<h4>版本编号:
<span v-html="update_note.hexsha"></span>
</h4>
</el-card>
</el-timeline-item>
</el-timeline>
</el-card>
@@ -92,7 +117,10 @@
{# :size="activity.size" #}
:timestamp="update_note.date">
<el-card shadow="hover">
<p v-for="content in update_note.data" v-html="content">
<p v-html="update_note.data">
<h4>版本编号:
<span v-html="update_note.hexsha"></span>
</h4>
</p>
</el-card>
@@ -119,12 +147,13 @@
data: {
update_notes: {{ update_notes | safe }},
local_logs: {{ local_logs | safe }},
{#local_log: [],#}
update_log: {},
restart: true,
update: {{ update }},
local_log_width: 24,
cid: "{{ cid }}",
time: ''
time: '',
show: false,
},
created() {
if (this.update) {
@@ -201,13 +230,15 @@
if (res.data.code === 0) {
console.log(res, 1)
this.update_log = res.data.data.result
this.show = true
{#console.log('规则更新记录', res.data.data.xpath_update)#}
this.$message({
type: 'success',
message: res.data.msg
});
this.time = 15
setTimeout(this.timeDown, 1000)
setTimeout(() => {
window.location.reload()
}, 15000)
} else {
console.log(res, 2)
this.$message({

View File

@@ -1,6 +0,0 @@
# 先备份数据库文件再拉取更新 $(date "+%Y%m%d%H%M%S")当前时间年月日时分秒
cp /ptools/db/db.sqlite3 /ptools/db/db.sqlite3-$(date "+%Y%m%d%H%M%S")
git pull
pip install -r requirements.txt
python manage.py makemigrations
python manage.py migrate