增加手动升级功能
This commit is contained in:
parent
2ea87cdf29
commit
da1ecbabcd
4
.idea/dr_py.iml
generated
4
.idea/dr_py.iml
generated
@ -1,7 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<module type="PYTHON_MODULE" version="4">
|
<module type="PYTHON_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
<content url="file://$MODULE_DIR$" />
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
||||||
|
</content>
|
||||||
<orderEntry type="jdk" jdkName="Python 3.8 (dr_py) (2)" jdkType="Python SDK" />
|
<orderEntry type="jdk" jdkName="Python 3.8 (dr_py) (2)" jdkType="Python SDK" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
@ -40,7 +40,9 @@ USE_PY = 0 # 开启py源
|
|||||||
JS0_DISABLE = 0 # 禁用js0
|
JS0_DISABLE = 0 # 禁用js0
|
||||||
JS0_PASSWORD = '' # js0密码
|
JS0_PASSWORD = '' # js0密码
|
||||||
JS_MODE = 0 # js模式 0 drpy服务器解析 1 pluto本地解析
|
JS_MODE = 0 # js模式 0 drpy服务器解析 1 pluto本地解析
|
||||||
MAX_CONTENT_LENGTH = 1 * 1024 * 100 # 100 kB
|
# MAX_CONTENT_LENGTH = 1 * 1024 * 100 # 100 kB
|
||||||
|
MAX_CONTENT_LENGTH = 50 * 1024 * 1024 # 50mb
|
||||||
|
JS_MAX_LENGTH = 0.1 * 1024 * 1024 # 0.1mb
|
||||||
LIVE_MODE = 0 # 0 本地 1外网
|
LIVE_MODE = 0 # 0 本地 1外网
|
||||||
# LIVE_URL = 'https://gitcode.net/bd/v/-/raw/main/live/zb.txt' # 初始化外网直播地址(后续在管理界面改)
|
# LIVE_URL = 'https://gitcode.net/bd/v/-/raw/main/live/zb.txt' # 初始化外网直播地址(后续在管理界面改)
|
||||||
# LIVE_URL = 'https://agit.ai/hu/hcr/raw/commit/f8e9c10309a533e5b06df133f859c45cb91f4731/0ER.txt' # 月光直播接口
|
# LIVE_URL = 'https://agit.ai/hu/hcr/raw/commit/f8e9c10309a533e5b06df133f859c45cb91f4731/0ER.txt' # 月光直播接口
|
||||||
|
|||||||
@ -6,13 +6,13 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
import ujson
|
import ujson
|
||||||
from flask import Blueprint, request, render_template, render_template_string, jsonify, make_response, redirect
|
from flask import Blueprint, abort, request, render_template, render_template_string, jsonify, make_response, redirect
|
||||||
from controllers.service import storage_service, rules_service, parse_service
|
from controllers.service import storage_service, rules_service, parse_service
|
||||||
from base.R import R
|
from base.R import R
|
||||||
from base.database import db
|
from base.database import db
|
||||||
from utils.log import logger
|
from utils.log import logger
|
||||||
import shutil
|
import shutil
|
||||||
from utils.update import getLocalVer, getOnlineVer, download_new_version, download_lives, copy_to_update
|
from utils.update import zipfile, getLocalVer, getOnlineVer, download_new_version, download_lives, copy_to_update
|
||||||
from utils import parser
|
from utils import parser
|
||||||
from utils.env import get_env, update_env
|
from utils.env import get_env, update_env
|
||||||
from utils.web import getParmas, verfy_token
|
from utils.web import getParmas, verfy_token
|
||||||
@ -365,6 +365,7 @@ def admin_change_use_py():
|
|||||||
msg = f'已修改的配置记录id为:{id},结果为{state}'
|
msg = f'已修改的配置记录id为:{id},结果为{state}'
|
||||||
return R.success(msg)
|
return R.success(msg)
|
||||||
|
|
||||||
|
|
||||||
@admin.route('/clear_drop')
|
@admin.route('/clear_drop')
|
||||||
def admin_clear_drop():
|
def admin_clear_drop():
|
||||||
if not verfy_token():
|
if not verfy_token():
|
||||||
@ -385,6 +386,7 @@ def admin_clear_drop():
|
|||||||
msg = f'清理完毕,本次共计清理{len(rm_list)}个\n {rm_str}'
|
msg = f'清理完毕,本次共计清理{len(rm_list)}个\n {rm_str}'
|
||||||
return R.success(msg)
|
return R.success(msg)
|
||||||
|
|
||||||
|
|
||||||
# @admin.route('/get_use_py')
|
# @admin.route('/get_use_py')
|
||||||
# def admin_get_use_py():
|
# def admin_get_use_py():
|
||||||
# if not verfy_token():
|
# if not verfy_token():
|
||||||
@ -394,6 +396,23 @@ def admin_clear_drop():
|
|||||||
# state = 1 if use_py else 0
|
# state = 1 if use_py else 0
|
||||||
# return R.success(state)
|
# return R.success(state)
|
||||||
|
|
||||||
|
def get_size(fobj):
|
||||||
|
if fobj.content_length:
|
||||||
|
return fobj.content_length
|
||||||
|
|
||||||
|
try:
|
||||||
|
pos = fobj.tell()
|
||||||
|
fobj.seek(0, 2) # seek to end
|
||||||
|
size = fobj.tell()
|
||||||
|
fobj.seek(pos) # back to original position
|
||||||
|
return size
|
||||||
|
except (AttributeError, IOError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# in-memory file object that doesn't support seeking or tell
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
@admin.route('/upload', methods=['POST'])
|
@admin.route('/upload', methods=['POST'])
|
||||||
def upload_file():
|
def upload_file():
|
||||||
args = request.args
|
args = request.args
|
||||||
@ -403,6 +422,12 @@ def upload_file():
|
|||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
try:
|
try:
|
||||||
file = request.files['file']
|
file = request.files['file']
|
||||||
|
lsg = storage_service()
|
||||||
|
js_max_len = lsg.getItem('JS_MAX_LENGTH', 0.1 * 1024 * 1024)
|
||||||
|
if get_size(file) > float(js_max_len):
|
||||||
|
logger.info(f'文件体积过大,禁止上传。当前体积:{get_size(file)},源体积限制:{js_max_len}')
|
||||||
|
abort(413) # request entity too large
|
||||||
|
|
||||||
filename = secure_filename(file.filename)
|
filename = secure_filename(file.filename)
|
||||||
logger.info(f'推荐安全文件命名:{filename}')
|
logger.info(f'推荐安全文件命名:{filename}')
|
||||||
savePath = f'js/{file.filename}'
|
savePath = f'js/{file.filename}'
|
||||||
@ -447,6 +472,33 @@ def upload_file():
|
|||||||
return R.failed('文件上传失败')
|
return R.failed('文件上传失败')
|
||||||
|
|
||||||
|
|
||||||
|
@admin.route('/upload_update', methods=['POST'])
|
||||||
|
def upload_update():
|
||||||
|
args = request.args
|
||||||
|
force = args.get('force')
|
||||||
|
print('force:', force)
|
||||||
|
if not verfy_token():
|
||||||
|
return render_template('login.html')
|
||||||
|
if request.method == 'POST':
|
||||||
|
try:
|
||||||
|
file = request.files['file']
|
||||||
|
filename = secure_filename(file.filename)
|
||||||
|
logger.info(f'推荐安全文件命名:{filename}')
|
||||||
|
savePath = f'tmp/dr_py.zip'
|
||||||
|
file.seek(0) # 读取后变成空文件,重新赋能
|
||||||
|
file.save(savePath)
|
||||||
|
logger.info(f'开始解压文件:{savePath}')
|
||||||
|
f = zipfile.ZipFile(savePath, 'r') # 压缩文件位置
|
||||||
|
for file in f.namelist():
|
||||||
|
f.extract(file, 'tmp') # 解压位置
|
||||||
|
f.close()
|
||||||
|
# print('解压完毕,开始升级')
|
||||||
|
logger.info('解压完毕,开始升级')
|
||||||
|
# ret = copy_to_update()
|
||||||
|
return R.success('升级文件上传成功,请确认drpy目录内是否存在/tmp/dr_py-main/文件夹,如果ok你可以点击强制升级按钮升级刚才上传的文件')
|
||||||
|
except Exception as e:
|
||||||
|
return R.failed(f'升级文件上传失败!{e}')
|
||||||
|
|
||||||
@admin.route('/login', methods=['GET', 'POST'])
|
@admin.route('/login', methods=['GET', 'POST'])
|
||||||
def login_api():
|
def login_api():
|
||||||
username = getParmas('username')
|
username = getParmas('username')
|
||||||
|
|||||||
@ -26,7 +26,7 @@ class storage_service(object):
|
|||||||
'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
|
'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
|
||||||
'WALL_PAPER', 'UNAME', 'PWD', 'LIVE_MODE', 'CATE_EXCLUDE', 'TAB_EXCLUDE', 'SEARCH_TIMEOUT',
|
'WALL_PAPER', 'UNAME', 'PWD', 'LIVE_MODE', 'CATE_EXCLUDE', 'TAB_EXCLUDE', 'SEARCH_TIMEOUT',
|
||||||
'SEARCH_LIMIT', 'MULTI_MODE', 'XR_MODE', 'JS_PROXY', 'UPDATE_PROXY', 'ENV', 'ALI_TOKEN', 'OCR_API',
|
'SEARCH_LIMIT', 'MULTI_MODE', 'XR_MODE', 'JS_PROXY', 'UPDATE_PROXY', 'ENV', 'ALI_TOKEN', 'OCR_API',
|
||||||
'SPECIAL','SPIDER_JAR', 'EXT_FUNC']
|
'SPECIAL', 'SPIDER_JAR', 'EXT_FUNC', 'JS_MAX_LENGTH']
|
||||||
for conf in conf_list:
|
for conf in conf_list:
|
||||||
if not self.hasItem(conf):
|
if not self.hasItem(conf):
|
||||||
print(f'开始初始化{conf}')
|
print(f'开始初始化{conf}')
|
||||||
@ -38,11 +38,12 @@ class storage_service(object):
|
|||||||
conf_list = ['LIVE_URL', 'LIVE_MODE', 'PLAY_URL', 'PID_URL', 'USE_PY', 'JS_MODE', 'JS0_DISABLE', 'JS0_PASSWORD',
|
conf_list = ['LIVE_URL', 'LIVE_MODE', 'PLAY_URL', 'PID_URL', 'USE_PY', 'JS_MODE', 'JS0_DISABLE', 'JS0_PASSWORD',
|
||||||
'PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
|
'PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
|
||||||
'WALL_PAPER', 'UNAME', 'PWD', 'CATE_EXCLUDE', 'TAB_EXCLUDE', 'SEARCH_TIMEOUT', 'SEARCH_LIMIT',
|
'WALL_PAPER', 'UNAME', 'PWD', 'CATE_EXCLUDE', 'TAB_EXCLUDE', 'SEARCH_TIMEOUT', 'SEARCH_LIMIT',
|
||||||
'MULTI_MODE', 'XR_MODE', 'JS_PROXY', 'UPDATE_PROXY', 'ENV', 'SPECIAL', 'SPIDER_JAR', 'EXT_FUNC', 'ALI_TOKEN', 'OCR_API']
|
'MULTI_MODE', 'XR_MODE', 'JS_PROXY', 'UPDATE_PROXY', 'ENV', 'SPECIAL', 'SPIDER_JAR',
|
||||||
|
'EXT_FUNC', 'JS_MAX_LENGTH', 'ALI_TOKEN', 'OCR_API']
|
||||||
conf_name_list = ['直播地址', '直播模式', '远程地址', '进程管理链接', '启用py源', 'js模式', '禁用js0',
|
conf_name_list = ['直播地址', '直播模式', '远程地址', '进程管理链接', '启用py源', 'js模式', '禁用js0',
|
||||||
'js0密码', '禁用免嗅', '免嗅模式', '启用壁纸', '壁纸链接', '管理账号',
|
'js0密码', '禁用免嗅', '免嗅模式', '启用壁纸', '壁纸链接', '管理账号',
|
||||||
'管理密码', '分类排除', '线路排除', '聚搜超时', '搜索条数', '多源模式', '仙人模式', '源代理',
|
'管理密码', '分类排除', '线路排除', '聚搜超时', '搜索条数', '多源模式', '仙人模式', '源代理',
|
||||||
'升级代理', '环境变量', '优选源', '挂载JAR', '辅助规则', '阿里tk', 'OCR接口']
|
'升级代理', '环境变量', '优选源', '挂载JAR', '辅助规则', '源体积', '阿里tk', 'OCR接口']
|
||||||
conf_lists = []
|
conf_lists = []
|
||||||
for i in range(len(conf_list)):
|
for i in range(len(conf_list)):
|
||||||
conf = conf_list[i]
|
conf = conf_list[i]
|
||||||
|
|||||||
@ -1,3 +1,7 @@
|
|||||||
|
###### 2023/11/18
|
||||||
|
- [X] 修复腾云驾雾
|
||||||
|
- [X] 增加手动升级功能,手动上传升级文件.zip后进行强制升级即可
|
||||||
|
|
||||||
###### 2023/10/04
|
###### 2023/10/04
|
||||||
- [X] 关于rsa加解密的研究,js模块导入方式研究失败。请用蜜蜂壳子注入的函数实现
|
- [X] 关于rsa加解密的研究,js模块导入方式研究失败。请用蜜蜂壳子注入的函数实现
|
||||||
```js
|
```js
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
3.9.48beta23
|
3.9.48beta24
|
||||||
@ -215,6 +215,52 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#choose_update').click(function () {
|
||||||
|
$('#fileInput').click();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#fileInput').change(function () {
|
||||||
|
//获取选择的文件信息
|
||||||
|
let file = this.files[0];
|
||||||
|
//执行上传操作
|
||||||
|
if(file){
|
||||||
|
console.log(file);
|
||||||
|
if(file.name.includes('dr_py')||file.name.includes('drpy')){
|
||||||
|
if(confirm('已选择文件:'+file.name+',体积:'+(file.size/1024).toFixed(2)+'kb 进行手动升级,是否继续?')){
|
||||||
|
var name = file.name;
|
||||||
|
if (!name.endsWith('.zip')) {
|
||||||
|
alert('仅支持上传zip文件');
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
let form_data = new FormData();
|
||||||
|
// 把所有表单信息
|
||||||
|
form_data.append("id", "001");
|
||||||
|
form_data.append("name", name);
|
||||||
|
form_data.append("file", file);
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: "/admin/upload_update?force=1",
|
||||||
|
dataType: "json",
|
||||||
|
processData: false, // 注意:让jQuery不要处理数据
|
||||||
|
contentType: false, // 注意:让jQuery不要设置contentType
|
||||||
|
data: form_data
|
||||||
|
}).success(function (ret) {
|
||||||
|
console.log(ret);
|
||||||
|
alert(ret.msg);
|
||||||
|
if(ret.msg && ret.msg.includes('文件上传成功')){
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
}).fail(function (ret) {
|
||||||
|
console.log(ret);
|
||||||
|
alert(ret.msg);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
alert('你选择的文件:'+file.name+'看起来不像是drpy的升级文件压缩包。一般文件名长这样:dr_py-main.zip,请重新选择')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
$('#use_py').click(function () {
|
$('#use_py').click(function () {
|
||||||
$.get("/admin/change_use_py", function (data, status) {
|
$.get("/admin/change_use_py", function (data, status) {
|
||||||
console.log(data);
|
console.log(data);
|
||||||
@ -265,7 +311,7 @@
|
|||||||
|
|
||||||
});
|
});
|
||||||
function getFileSize(fileObj) {
|
function getFileSize(fileObj) {
|
||||||
$('#file_size').text('文件大小为:' + fileObj.files[0].size / 1024 + 'kb');
|
$('#file_size').text('文件大小为:' + (fileObj.files[0].size / 1024).toFixed(2) + 'kb');
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<div class="title">欢迎使用DR-PY管理界面<div><span class="ver_title">当前版本: {{ ver }}</span><span
|
<div class="title">欢迎使用DR-PY管理界面<div><span class="ver_title">当前版本: {{ ver }}</span><span
|
||||||
@ -301,6 +347,8 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a href="javascript:void(0);" class="funcbtn" id="checkUpdate">检测升级</a></li>
|
<li><a href="javascript:void(0);" class="funcbtn" id="checkUpdate">检测升级</a></li>
|
||||||
<li><a href="javascript:void(0);" class="funcbtn" id="force_update">强制升级</a></li>
|
<li><a href="javascript:void(0);" class="funcbtn" id="force_update">强制升级</a></li>
|
||||||
|
<li><a href="javascript:void(0);" class="funcbtn" id="choose_update">手动升级</a></li>
|
||||||
|
<input type="file" id="fileInput" accept=".zip,.rar" style="display:none;">
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@ -325,7 +373,7 @@
|
|||||||
|
|
||||||
<form action="/admin/upload" method="POST" enctype="multipart/form-data">
|
<form action="/admin/upload" method="POST" enctype="multipart/form-data">
|
||||||
<!-- <input type = "file" name = "file" class="btn" accept=".js" onchange="getFileSize(this)"/>-->
|
<!-- <input type = "file" name = "file" class="btn" accept=".js" onchange="getFileSize(this)"/>-->
|
||||||
<input type="file" name="file" class="btn" onchange="getFileSize(this)" />
|
<input type="file" name="file" class="btn" onchange="getFileSize(this)" accept=".js,.jsd,.txt"/>
|
||||||
<!-- <input type = "submit" value="上传" class="btn"/>-->
|
<!-- <input type = "submit" value="上传" class="btn"/>-->
|
||||||
<input type="button" id="upload" value="上传" class="btn" />
|
<input type="button" id="upload" value="上传" class="btn" />
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user