You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

727 lines
29 KiB

#-*- coding=utf-8 -*-
from flask import render_template,redirect,abort,make_response,jsonify,request,url_for,Response,session,flash
from flask_sqlalchemy import Pagination
from self_config import *
from ..utils import *
from ..extend import *
from .. import *
from . import admin
import os
import io
import re
import subprocess
import random
import string
import urllib
from shelljob import proc
############功能函数
def set(key,value,user='A'):
InfoLogger().print_r('set {}:{}'.format(key,value))
config_path=os.path.join(config_dir,'self_config.py')
with open(config_path,'r') as f:
old_text=f.read()
with open(config_path,'w') as f:
if key in ['client_secret','client_id','share_path','other_name']:
old_kv=re.findall('"{}":.*{{[\w\W]*}}'.format(user),old_text)[0]
new_kv=re.sub('"{}":.*.*?,'.format(key),'"{}":"{}",'.format(key,value),old_kv,1)
new_text=old_text.replace(old_kv,new_kv,1)
elif key=='allow_site':
value=value.split(',')
new_text=re.sub('{}=.*'.format(key),'{}={}'.format(key,value),old_text)
elif key in ['tj_code','cssCode','headCode','footCode']:
new_text=re.sub('{}="""[\w\W]*?"""'.format(key),'{}="""{}"""'.format(key,value),old_text)
else:
new_text=re.sub('{}=.*'.format(key),'{}="{}"'.format(key,value),old_text)
f.write(new_text)
############视图函数
@admin.before_request
def before_request():
if request.endpoint.startswith('admin') and request.endpoint!='admin.login' and session.get('login') is None: #and request.endpoint!='admin.install'
return redirect(url_for('admin.login'))
########web console
@admin.route('/web_console')
def web_console():
g = proc.Group()
action=request.args.get('action')
allow_action=['UpdateFile','UploadDir','Upload']
if action not in allow_action:
return make_response('error')
if action in ['UploadDir','Upload']:
local=urllib.unquote(request.args.get('local'))
remote=urllib.unquote(request.args.get('remote'))
user=urllib.unquote(request.args.get('user'))
cmd=["python","-u",os.path.join(config_dir,'function.py'),action,local,remote,user]
elif action=='UpdateFile':
type_=request.args.get('type')
cmd=["python","-u",os.path.join(config_dir,'function.py'),'UpdateFile',type_]
else:
cmd=["python","-u",os.path.join(config_dir,'function.py'),action]
p = g.run(cmd)
def read_process():
while g.is_pending():
lines = g.readlines()
for proc, line in lines:
yield "data:" + line + "\n\n"
yield "data:end\n\n"
return Response(read_process(), mimetype= 'text/event-stream')
########admin
@admin.route('/',methods=['GET','POST'])
@admin.route('/setting',methods=['GET','POST'])
def setting():
if request.method=='POST':
if request.files.keys()!=[]:
favicon=request.files['favicon']
favicon.save('./app/static/img/favicon.ico')
title=request.form.get('title','PyOne')
theme=request.form.get('theme','material')
title_pre=request.form.get('title_pre','index of ')
downloadUrl_timeout=request.form.get('downloadUrl_timeout',5*60)
allow_site=request.form.get('allow_site','no-referrer')
#Aria2
ARIA2_HOST=request.form.get('ARIA2_HOST','localhost').replace('https://','').replace('http://','')
ARIA2_PORT=request.form.get('ARIA2_PORT',6800)
ARIA2_SECRET=request.form.get('ARIA2_SECRET','')
ARIA2_SCHEME=request.form.get('ARIA2_SCHEME','http')
#MongoDB
MONGO_HOST=request.form.get('MONGO_HOST','localhost').replace('https://','').replace('http://','')
MONGO_PORT=request.form.get('MONGO_PORT',27017)
MONGO_DB=request.form.get('MONGO_DB','three')
MONGO_USER=request.form.get('MONGO_USER','')
MONGO_PASSWORD=request.form.get('MONGO_PASSWORD','')
#Redis
REDIS_HOST=request.form.get('REDIS_HOST','localhost').replace('https://','').replace('http://','')
REDIS_PORT=request.form.get('REDIS_PORT',6379)
REDIS_DB=request.form.get('REDIS_DB','0')
REDIS_PASSWORD=request.form.get('REDIS_PASSWORD','')
password1=request.form.get('password1')
password2=request.form.get('password2')
show_secret=request.form.get('show_secret','no')
encrypt_file=request.form.get('encrypt_file','no')
new_password=password
if ((password1 is not None and password2 is None) or (password1 is None and password2 is not None)):
flash(u'请输入新密码或者二次确认新密码')
elif password1 is not None and password2 is not None and password1!=password2:
flash(u'两次输入密码不相同')
elif password1 is not None and password2 is not None and password1==password2 and password1!='':
new_password=password1
set('title',title)
set('title_pre',title_pre)
set('theme',theme)
set('downloadUrl_timeout',downloadUrl_timeout)
set('allow_site',allow_site)
#Aria2
set('ARIA2_HOST',ARIA2_HOST)
set('ARIA2_PORT',ARIA2_PORT)
set('ARIA2_SECRET',ARIA2_SECRET)
set('ARIA2_SCHEME',ARIA2_SCHEME)
#MongoDB
set('MONGO_HOST',MONGO_HOST)
set('MONGO_PORT',MONGO_PORT)
set('MONGO_DB',MONGO_DB)
set('MONGO_USER',MONGO_USER)
set('MONGO_PASSWORD',MONGO_PASSWORD)
#Redis
set('REDIS_HOST',REDIS_HOST)
set('REDIS_PORT',REDIS_PORT)
set('REDIS_DB',REDIS_DB)
set('REDIS_PASSWORD',REDIS_PASSWORD)
set('show_secret',show_secret)
set('encrypt_file',encrypt_file)
set('password',new_password)
# reload()
redis_client.set('title',title)
redis_client.set('title_pre',title_pre)
redis_client.set('theme',theme)
redis_client.set('downloadUrl_timeout',downloadUrl_timeout)
redis_client.set('allow_site',','.join(allow_site.split(',')))
#Aria2
redis_client.set('ARIA2_HOST',ARIA2_HOST)
redis_client.set('ARIA2_PORT',ARIA2_PORT)
redis_client.set('ARIA2_SECRET',ARIA2_SECRET)
redis_client.set('ARIA2_SCHEME',ARIA2_SCHEME)
#MongoDB
redis_client.set('MONGO_HOST',MONGO_HOST)
redis_client.set('MONGO_PORT',MONGO_PORT)
redis_client.set('MONGO_DB',MONGO_DB)
redis_client.set('MONGO_USER',MONGO_USER)
redis_client.set('MONGO_PASSWORD',MONGO_PASSWORD)
#Redis
redis_client.set('REDIS_HOST',REDIS_HOST)
redis_client.set('REDIS_PORT',REDIS_PORT)
redis_client.set('REDIS_DB',REDIS_DB)
redis_client.set('REDIS_PASSWORD',REDIS_PASSWORD)
redis_client.set('show_secret',show_secret)
redis_client.set('encrypt_file',encrypt_file)
redis_client.set('password',new_password)
flash('更新成功')
resp=make_response(redirect(url_for('admin.setting')))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
resp=make_response(render_template('admin/setting/setting.html'))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
@admin.route('/setCode',methods=['GET','POST'])
def setCode():
if request.method=='POST':
tj_code=request.form.get('tj_code','')
headCode=request.form.get('headCode','')
footCode=request.form.get('footCode','')
cssCode=request.form.get('cssCode','')
#redis
set('tj_code',tj_code)
set('headCode',headCode)
set('footCode',footCode)
set('cssCode',cssCode)
# reload()
redis_client.set('tj_code',tj_code)
redis_client.set('headCode',headCode)
redis_client.set('footCode',footCode)
redis_client.set('cssCode',cssCode)
flash('更新成功')
resp=make_response(render_template('admin/setCode/setCode.html'))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
resp=make_response(render_template('admin/setCode/setCode.html'))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
@admin.route('/upload',methods=["POST","GET"])
def upload():
if request.method=='POST':
user=request.form.get('user').encode('utf-8')
local=request.form.get('local').encode('utf-8')
remote=request.form.get('remote').encode('utf-8')
if not os.path.exists(local):
flash('本地目录/文件不存在')
return redirect(url_for('admin.upload'))
if os.path.isfile(local):
action='Upload'
else:
action='UploadDir'
resp=make_response(render_template('admin/upload.html',remote=remote,local=local,action=action,user=user))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
resp=make_response(render_template('admin/upload.html'))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
@admin.route('/cache',methods=["POST","GET"])
def cache_control():
if request.method=='POST':
type=request.form.get('type')
cmd="python -u {} UpdateFile {}".format(os.path.join(config_dir,'function.py'),type)
subprocess.Popen(cmd,shell=True)
msg='后台刷新数据中...请不要多次点击!否则服务器出问题别怪PyOne'
return jsonify(dict(msg=msg))
resp=make_response(render_template('admin/cache.html'))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
@admin.route('/manage',methods=["POST","GET"])
def manage():
if request.method=='POST':
pass
path=urllib.unquote(request.args.get('path','A:/'))
user,n_path=path.split(':')
if n_path=='':
path=':'.join([user,'/'])
page=request.args.get('page',1,type=int)
image_mode=request.args.get('image_mode')
sortby=request.args.get('sortby')
order=request.args.get('order')
if sortby:
sortby=request.args.get('sortby')
else:
sortby=request.cookies.get('admin_sortby') if request.cookies.get('admin_sortby') is not None else 'lastModtime'
sortby=sortby
if order:
order=request.args.get('order')
else:
order=request.cookies.get('admin_order') if request.cookies.get('admin_order') is not None else 'desc'
order=order
resp,total = FetchData(path=path,page=page,per_page=50,sortby=sortby,order=order)
pagination=Pagination(query=None,page=page, per_page=50, total=total, items=None)
if path.split(':',1)[-1]=='/':
path=':'.join([path.split(':',1)[0],''])
resp=make_response(render_template('admin/manage/manage.html',pagination=pagination,items=resp,path=path,sortby=sortby,order=order,cur_user=user,endpoint='admin.manage'))
resp.set_cookie('admin_sortby',str(sortby))
resp.set_cookie('admin_order',str(order))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
@admin.route('/edit',methods=["GET","POST"])
def edit():
if request.method=='POST':
fileid=request.form.get('fileid')
user=request.form.get('user')
content=request.form.get('content').encode('utf-8')
info=EditFile(fileid=fileid,content=content,user=user)
return jsonify(info)
fileid=request.args.get('fileid')
user=request.args.get('user')
name=GetName(fileid)
ext=name.split('.')[-1]
language=CodeType(ext)
if language is None:
language='Text'
content=common._remote_content(fileid,user)
resp=make_response(render_template('admin/setFile/edit.html',content=content,fileid=fileid,name=name,language=language,cur_user=user))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
###本地上传文件只onedrive,通过服务器中转
@admin.route('/upload_local',methods=['POST','GET'])
def upload_local():
user,remote_folder=request.args.get('path').split(':')
resp=make_response(render_template('admin/manage/upload_local.html',remote_folder=remote_folder,cur_user=user))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
@admin.route('/checkChunk', methods=['POST'])
def checkChunk():
fileName=request.form.get('name').encode('utf-8')
chunk=request.form.get('chunk',0,type=int)
filename = u'./upload/{}-{}'.format(fileName, chunk)
if os.path.exists(filename):
exists=True
else:
exists=False
return jsonify({'ifExist':exists})
@admin.route('/mergeChunks', methods=['POST'])
def mergeChunks():
fileName=request.form.get('fileName').encode('utf-8')
md5=request.form.get('fileMd5')
chunk = 0 # 分片序号
with open(u'./upload/{}'.format(fileName), 'wb') as target_file: # 创建新文件
while True:
try:
filename = u'./upload/{}-{}'.format(fileName, chunk)
source_file = open(filename, 'rb') # 按序打开每个分片
target_file.write(source_file.read()) # 读取分片内容写入新文件
source_file.close()
except IOError as msg:
break
chunk += 1
os.remove(filename) # 删除该分片,节约空间
return jsonify({'upload':True})
@admin.route('/recv_upload', methods=['POST'])
def recv_upload(): # 接收前端上传的一个分片
md5=request.form.get('fileMd5')
name=request.form.get('name').encode('utf-8')
chunk_id=request.form.get('chunk',0,type=int)
filename = '{}-{}'.format(name,chunk_id)
upload_file = request.files['file']
upload_file.save(u'./upload/{}'.format(filename))
return jsonify({'upload_part':True})
@admin.route('/to_one',methods=['GET'])
def server_to_one():
user=request.args.get('user')
filename=request.args.get('filename').encode('utf-8')
remote_folder=request.args.get('remote_folder').encode('utf-8')
if remote_folder!='/':
remote_folder=remote_folder+'/'
local_dir=os.path.join(config_dir,'upload')
filepath=urllib.unquote(os.path.join(local_dir,filename))
_upload_session=Upload_for_server(filepath,remote_folder,user)
def read_status():
while 1:
try:
msg=_upload_session.next()['status']
yield "data:" + msg + "\n\n"
except Exception as e:
exstr = traceback.format_exc()
ErrorLogger().print_r(exstr)
msg='end'
yield "data:" + msg + "\n\n"
os.remove(filepath)
break
return Response(read_status(), mimetype= 'text/event-stream')
###本地上传文件只onedrive,通过服务器中转
@admin.route('/setFile',methods=["GET","POST"])
@admin.route('/setFile/<filename>',methods=["GET","POST"])
def setFile(filename=None):
if request.method=='POST':
path=request.form.get('path')
if path.split(':')[-1]=='':
path=path.split(':')[0]+':/'
user,n_path=path.split(':')
filename=request.form.get('filename')
content=request.form.get('content').encode('utf-8')
info=CreateFile(filename=filename,path=n_path,content=content,user=user)
return jsonify(info)
path=urllib.unquote(request.args.get('path'))
if path.split(':')[-1]=='':
path=path.split(':')[0]+':/'
user,n_path=path.split(':')
_,fid,i=has_item(path,filename)
if fid!=False:
return redirect(url_for('admin.edit',fileid=fid,user=user))
return render_template('admin/setFile/setpass.html',path=path,filename=filename,cur_user=user)
@admin.route('/delete',methods=["POST"])
def delete():
ids=request.form.get('id')
user=request.form.get('user')
if ids is None:
return jsonify({'msg':u'请选择要删除的文件','status':0})
ids=ids.split('##')
infos={}
infos['status']=1
infos['delete']=0
infos['fail']=0
for id in ids:
InfoLogger().print_r('delete {}'.format(id))
file=mon_db.items.find_one({'id':id})
name=file['name']
path=file['path'].replace(name,'')
if len(path.split('/'))>2 and path.split('/')[-1]=='':
path=path[:-1]
key='has_item$#$#$#$#{}$#$#$#$#{}'.format(path,name)
InfoLogger().print_r('delete key:{}'.format(key))
redis_client.delete(key)
kc='{}:content'.format(id)
redis_client.delete(kc)
status=DeleteRemoteFile(id,user)
if status:
infos['delete']+=1
else:
infos['fail']+=1
return jsonify(infos)
@admin.route('/add_folder',methods=['POST'])
def AddFolder():
folder_name=request.form.get('folder_name')
path=request.args.get('path')
user,grand_path=path.split(':')
if grand_path=='' or grand_path is None:
grand_path='/'
else:
if grand_path.startswith('/'):
grand_path=grand_path[1:]
result=CreateFolder(folder_name,grand_path,user)
return jsonify({'result':result})
@admin.route('/move_file',methods=['POST'])
def MoveFileToNewFolder():
fileid=request.form.get('fileid')
user=request.form.get('user')
new_folder_path=request.form.get('new_folder_path')
if new_folder_path=='' or new_folder_path is None:
new_folder_path='/'
else:
if new_folder_path.startswith('/'):
new_folder_path=new_folder_path[1:]
result=MoveFile(fileid,new_folder_path,user)
return jsonify({'result':result})
@admin.route('/rename',methods=['POST'])
def Rename():
fileid=request.form.get('fileid')
user=request.form.get('user')
new_name=request.form.get('new_name')
if new_name=='' or new_name is None:
return jsonify({'result':result})
else:
if new_name.startswith('/'):
new_name=new_name[1:]
if new_name.endswith('/'):
new_name=new_name[:-1]
result=ReName(fileid,new_name,user)
return jsonify({'result':result})
######离线下载---调用aria2
@admin.route('/off_download',methods=['POST','GET'])
def off_download():
if request.method=='POST':
p,status=get_aria2()
if not status:
return jsonify({'status':False,'msg':p})
urls=request.form.get('urls').split('\n')
grand_path=request.form.get('grand_path')
user=request.form.get('user')
for url in urls:
if url.strip()!='':
cmd=u'nohup python {} download_and_upload "{}" "{}" {} &'.format(os.path.join(config_dir,'function.py'),url,grand_path,user)
subprocess.Popen(cmd,shell=True)
return jsonify({'status':True,'msg':'ok'})
path=request.args.get('path')
user,grand_path=path.split(':')
msg=None
p,status=get_aria2()
if not status:
msg=p
return render_template('admin/offdownload.html',grand_path=grand_path,cur_user=user,msg=msg)
@admin.route('/jsonrpc',methods=['POST'])
def RPCserver():
action=request.form.get('action')
allow_action=['tellActive','tellSuccess','tellFail','tellUnselected','pause','pauseAll','unpause','unpauseAll','remove','removeAll','restart','unselected','selected']
action_dict=dict(tellActive=1,tellSuccess=0,tellFail=-1,tellUnselected=2)
if action not in allow_action:
return jsonify({'code':0,'msg':'not allow action'})
if action in ['tellActive','tellSuccess','tellFail','tellUnselected']:
status=action_dict[action]
ret={'code':1,'msg':'get data success','result':get_tasks(status)}
elif action in ['pause','pauseAll','unpause','unpauseAll','remove','removeAll','restart','unselected','selected']:
ret=None
gids=request.form.get('gid').split('####')
ret1=Aria2Method(action=action,gids=gids)
ret2=DBMethod(action=action,gids=gids)
if ret1 is not None:
ret=ret1
else:
ret=ret2
return jsonify(ret)
@admin.route('/clearHist',methods=['POST'])
def clearHist():
mon_db.down_db.delete_many({})
ret={'msg':'清除成功!'}
return jsonify(ret)
###
@admin.route('/login',methods=["POST","GET"])
def login():
if request.method=='POST':
password1=request.form.get('password')
if password1==GetConfig('password'):
session['login']='true'
if not os.path.exists(os.path.join(config_dir,'.install')):
resp=make_response(redirect(url_for('admin.install',step=0,user='A')))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
resp=make_response(redirect(url_for('admin.setting')))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
else:
resp=make_response(render_template('admin/login.html'))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
resp=make_response(render_template('admin/login.html'))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
@admin.route('/logout',methods=['GET','POST'])
def logout():
session.pop('login',None)
return redirect('/')
@admin.route('/reload',methods=['GET','POST'])
def reload():
cmd='supervisorctl -c {} restart pyone'.format(os.path.join(config_dir,'supervisoredis_client.conf'))
subprocess.Popen(cmd,shell=True)
flash('正在重启网站...如果更改了分享目录,请更新缓存')
return redirect(url_for('admin.setting'))
###########################################安装
@admin.route('/install',methods=['POST','GET'])
def install():
if request.method=='POST':
step=request.form.get('step',type=int)
user=request.form.get('user')
if step==1:
client_id=request.form.get('client_id')
client_secret=request.form.get('client_secret')
set('client_id',client_id,user)
set('client_secret',client_secret,user)
login_url=LoginUrl.format(client_id=client_id,redirect_uri=redirect_uri)
return render_template('admin/install/install_1.html',client_secret=client_secret,client_id=client_id,login_url=login_url,cur_user=user)
else:
client_secret=request.form.get('client_secret')
client_id=request.form.get('client_id')
code=request.form.get('code')
#授权
headers={'Content-Type':'application/x-www-form-urlencoded'}
headers.update(default_headers)
data=AuthData.format(client_id=client_id,redirect_uri=urllib.quote(redirect_uri),client_secret=client_secret,code=code)
url=OAuthUrl
r=requests.post(url,data=data,headers=headers)
Atoken=json.loads(r.text)
if Atoken.get('access_token'):
with open(os.path.join(config_dir,'data/{}_Atoken.json'.format(user)),'w') as f:
json.dump(Atoken,f,ensure_ascii=False)
refresh_token=Atoken.get('refresh_token')
token=ReFreshToken(refresh_token,user)
with open(os.path.join(config_dir,'data/{}_token.json'.format(user)),'w') as f:
json.dump(token,f,ensure_ascii=False)
with open(os.path.join(config_dir,'.install'),'w') as f:
f.write('4.0')
config_path=os.path.join(config_dir,'self_config.py')
with open(config_path,'r') as f:
text=f.read()
redis_client.set('users',re.findall('od_users=([\w\W]*})',text)[0])
return make_response('<h1>授权成功!<br>请先在<B><a href="/admin/cache" target="_blank">后台-更新列表</a></B>,全量更新数据<br>然后<a href="/?t={}">点击进入首页</a></h1><br>'.format(time.time()))
else:
return jsonify(Atoken)
step=request.args.get('step',type=int)
user=request.args.get('user','A')
resp=make_response(render_template('admin/install/install_0.html',step=step,cur_user=user,redirectUrl=redirect_uri))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
###########################################卸载
@admin.route('/uninstall',methods=['POST'])
def uninstall():
type_=request.form.get('type')
if type_=='mongodb':
mon_db.items.remove()
mon_db.down_db.remove()
msg='删除mongodb数据成功'
elif type_=='redis':
redis_client.flushdb()
msg='删除redis数据成功'
elif type_=='directory':
subprocess.Popen('rm -rf {}/data/*.json'.format(config_dir),shell=True)
subprocess.Popen('rm -rf {}/.install'.format(config_dir),shell=True)
msg='删除网站数据成功'
else:
msg='数据已清除!如果需要删除目录请运行:rm -rf {}'.format(config_dir)
ret={'msg':msg}
return jsonify(ret)
###########################################网盘管理
@admin.route('/',methods=['GET','POST'])
@admin.route('/panage',methods=['GET','POST'])
def panage():
if request.method=='POST':
####网盘信息处理
for k,v in request.form.to_dict().items():
if 'share_path' in k or 'other_name' in k:
user=re.findall('\[(.*?)\]',k)[0]
key=re.findall('(.*)\[',k)[0]
InfoLogger().print_r('setting {}\'s {}\'s value {}'.format(user,key,v))
set(key,v,user)
config_path=os.path.join(config_dir,'self_config.py')
with open(config_path,'r') as f:
text=f.read()
redis_client.set('users',re.findall('od_users=([\w\W]*})',text)[0])
flash('更新成功')
resp=make_response(render_template('admin/pan_manage/pan_manage.html'))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
resp=make_response(render_template('admin/pan_manage/pan_manage.html'))
resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
resp.headers['Pragma'] = 'no-cache'
resp.headers['Expires'] = '0'
return resp
@admin.route('/add_pan',methods=["POST","GET"])
def add_pan():
if request.method=='POST':
title=request.form.get('title','PyOne')
pan=request.form.get('pan',''.join(random.sample(string.ascii_letters,2)))
order=request.form.get('order',0,type=int)
info={"client_id":"",
"client_secret":"",
"share_path":"/",
"other_name":title,
"order":order
}
od_users[pan]=info
config_path=os.path.join(config_dir,'self_config.py')
with open(config_path,'r') as f:
old_text=f.read()
with open(config_path,'w') as f:
old_od=re.findall('od_users={[\w\W]*}',old_text)[0]
new_od='od_users='+json.dumps(od_users,indent=4,ensure_ascii=False)
new_text=old_text.replace(old_od,new_od,1)
f.write(new_text)
flash('添加盘符[{}]成功'.format(pan))
key='users'
redis_client.delete(key)
return render_template('admin/pan_manage/add_pan.html')
return render_template('admin/pan_manage/add_pan.html')
@admin.route('/rm_pan',methods=["POST","GET"])
def rm_pan():
if request.method=='POST':
pan=request.form.get('user')
od_users.pop(pan)
config_path=os.path.join(config_dir,'self_config.py')
with open(config_path,'r') as f:
old_text=f.read()
with open(config_path,'w') as f:
old_od=re.findall('od_users={[\w\W]*}',old_text)[0]
new_od='od_users='+json.dumps(od_users,indent=4,ensure_ascii=False)
new_text=old_text.replace(old_od,new_od,1)
f.write(new_text)
key='users'
redis_client.delete(key)
mon_db.items.delete_many({'user':pan})
data=dict(msg='删除盘符[{}]成功'.format(pan),status=1)
return jsonify(data)
return render_template('admin/pan_manage/rm_pan.html')