|
|
|
@ -4,7 +4,7 @@ import psutil |
|
|
|
|
import time |
|
|
|
|
import os |
|
|
|
|
import sys |
|
|
|
|
import public |
|
|
|
|
import mw |
|
|
|
|
import re |
|
|
|
|
import json |
|
|
|
|
import pwd |
|
|
|
@ -21,7 +21,7 @@ class files_api: |
|
|
|
|
rPath = None |
|
|
|
|
|
|
|
|
|
def __init__(self): |
|
|
|
|
self.rPath = public.getRootDir() + '/recycle_bin/' |
|
|
|
|
self.rPath = mw.getRootDir() + '/recycle_bin/' |
|
|
|
|
|
|
|
|
|
##### ----- start ----- ### |
|
|
|
|
def getBodyApi(self): |
|
|
|
@ -33,13 +33,13 @@ class files_api: |
|
|
|
|
line = request.form.get('line', '100') |
|
|
|
|
|
|
|
|
|
if not os.path.exists(path): |
|
|
|
|
return public.returnJson(False, '文件不存在', (path,)) |
|
|
|
|
return mw.returnJson(False, '文件不存在', (path,)) |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
data = public.getNumLines(path, int(line)) |
|
|
|
|
return public.returnJson(True, 'OK', data) |
|
|
|
|
data = mw.getNumLines(path, int(line)) |
|
|
|
|
return mw.returnJson(True, 'OK', data) |
|
|
|
|
except Exception as ex: |
|
|
|
|
return public.returnJson(False, u'无法正确读取文件!' + str(ex)) |
|
|
|
|
return mw.returnJson(False, u'无法正确读取文件!' + str(ex)) |
|
|
|
|
|
|
|
|
|
def saveBodyApi(self): |
|
|
|
|
path = request.form.get('path', '').encode('utf-8') |
|
|
|
@ -67,21 +67,21 @@ class files_api: |
|
|
|
|
sfile = request.form.get('sfile', '').encode('utf-8') |
|
|
|
|
dfile = request.form.get('dfile', '').encode('utf-8') |
|
|
|
|
if not self.checkFileName(dfile): |
|
|
|
|
return public.returnJson(False, '文件名中不能包含特殊字符!') |
|
|
|
|
return mw.returnJson(False, '文件名中不能包含特殊字符!') |
|
|
|
|
if not os.path.exists(sfile): |
|
|
|
|
return public.returnJson(False, '指定文件不存在!') |
|
|
|
|
return mw.returnJson(False, '指定文件不存在!') |
|
|
|
|
|
|
|
|
|
if not self.checkDir(sfile): |
|
|
|
|
return public.returnJson(False, 'FILE_DANGER') |
|
|
|
|
return mw.returnJson(False, 'FILE_DANGER') |
|
|
|
|
|
|
|
|
|
import shutil |
|
|
|
|
try: |
|
|
|
|
shutil.move(sfile, dfile) |
|
|
|
|
msg = public.getInfo('移动文件或目录[{1}]到[{2}]成功!', (sfile, dfile,)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
return public.returnJson(True, '移动文件或目录成功!') |
|
|
|
|
msg = mw.getInfo('移动文件或目录[{1}]到[{2}]成功!', (sfile, dfile,)) |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
return mw.returnJson(True, '移动文件或目录成功!') |
|
|
|
|
except: |
|
|
|
|
return public.returnJson(False, '移动文件或目录失败!') |
|
|
|
|
return mw.returnJson(False, '移动文件或目录失败!') |
|
|
|
|
|
|
|
|
|
def deleteApi(self): |
|
|
|
|
path = request.form.get('path', '').encode('utf-8') |
|
|
|
@ -90,12 +90,12 @@ class files_api: |
|
|
|
|
def fileAccessApi(self): |
|
|
|
|
filename = request.form.get('filename', '').encode('utf-8') |
|
|
|
|
data = self.getAccess(filename) |
|
|
|
|
return public.getJson(data) |
|
|
|
|
return mw.getJson(data) |
|
|
|
|
|
|
|
|
|
def setFileAccessApi(self): |
|
|
|
|
|
|
|
|
|
if public.isAppleSystem(): |
|
|
|
|
return public.returnJson(True, '开发机不设置!') |
|
|
|
|
if mw.isAppleSystem(): |
|
|
|
|
return mw.returnJson(True, '开发机不设置!') |
|
|
|
|
|
|
|
|
|
filename = request.form.get('filename', '').encode('utf-8') |
|
|
|
|
user = request.form.get('user', '').encode('utf-8') |
|
|
|
@ -103,30 +103,30 @@ class files_api: |
|
|
|
|
sall = '-R' |
|
|
|
|
try: |
|
|
|
|
if not self.checkDir(filename): |
|
|
|
|
return public.returnJson(False, '请不要花样作死') |
|
|
|
|
return mw.returnJson(False, '请不要花样作死') |
|
|
|
|
|
|
|
|
|
if not os.path.exists(filename): |
|
|
|
|
return public.returnJson(False, '指定文件不存在!') |
|
|
|
|
return mw.returnJson(False, '指定文件不存在!') |
|
|
|
|
|
|
|
|
|
os.system('chmod ' + sall + ' ' + access + " '" + filename + "'") |
|
|
|
|
os.system('chown ' + sall + ' ' + user + |
|
|
|
|
':' + user + " '" + filename + "'") |
|
|
|
|
msg = public.getInfo( |
|
|
|
|
msg = mw.getInfo( |
|
|
|
|
'设置[{1}]权限为[{2}]所有者为[{3}]', (filename, access, user,)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
return public.returnJson(True, '设置成功!') |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
return mw.returnJson(True, '设置成功!') |
|
|
|
|
except: |
|
|
|
|
return public.returnJson(False, '设置失败!') |
|
|
|
|
return mw.returnJson(False, '设置失败!') |
|
|
|
|
|
|
|
|
|
def getDirSizeApi(self): |
|
|
|
|
path = request.form.get('path', '').encode('utf-8') |
|
|
|
|
tmp = self.getDirSize(path) |
|
|
|
|
return public.returnJson(True, tmp[0].split()[0]) |
|
|
|
|
return mw.returnJson(True, tmp[0].split()[0]) |
|
|
|
|
|
|
|
|
|
def getDirApi(self): |
|
|
|
|
path = request.form.get('path', '').encode('utf-8') |
|
|
|
|
if not os.path.exists(path): |
|
|
|
|
path = public.getRootDir() + "/wwwroot" |
|
|
|
|
path = mw.getRootDir() + "/wwwroot" |
|
|
|
|
search = request.args.get('search', '').strip().lower() |
|
|
|
|
page = request.args.get('p', '1').strip().lower() |
|
|
|
|
row = request.args.get('showRow', '10') |
|
|
|
@ -140,35 +140,35 @@ class files_api: |
|
|
|
|
file = request.form.get('path', '').encode('utf-8') |
|
|
|
|
try: |
|
|
|
|
if not self.checkFileName(file): |
|
|
|
|
return public.returnJson(False, '文件名中不能包含特殊字符!') |
|
|
|
|
return mw.returnJson(False, '文件名中不能包含特殊字符!') |
|
|
|
|
if os.path.exists(file): |
|
|
|
|
return public.returnJson(False, '指定文件已存在!') |
|
|
|
|
return mw.returnJson(False, '指定文件已存在!') |
|
|
|
|
_path = os.path.dirname(file) |
|
|
|
|
if not os.path.exists(_path): |
|
|
|
|
os.makedirs(_path) |
|
|
|
|
open(file, 'w+').close() |
|
|
|
|
self.setFileAccept(file) |
|
|
|
|
msg = public.getInfo('创建文件[{1}]成功!', (file,)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
return public.returnJson(True, '文件创建成功!') |
|
|
|
|
msg = mw.getInfo('创建文件[{1}]成功!', (file,)) |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
return mw.returnJson(True, '文件创建成功!') |
|
|
|
|
except Exception as e: |
|
|
|
|
# print str(e) |
|
|
|
|
return public.returnJson(True, '文件创建失败!') |
|
|
|
|
return mw.returnJson(True, '文件创建失败!') |
|
|
|
|
|
|
|
|
|
def createDirApi(self): |
|
|
|
|
path = request.form.get('path', '').encode('utf-8') |
|
|
|
|
try: |
|
|
|
|
if not self.checkFileName(path): |
|
|
|
|
return public.returnJson(False, '目录名中不能包含特殊字符!') |
|
|
|
|
return mw.returnJson(False, '目录名中不能包含特殊字符!') |
|
|
|
|
if os.path.exists(path): |
|
|
|
|
return public.returnJson(False, '指定目录已存在!') |
|
|
|
|
return mw.returnJson(False, '指定目录已存在!') |
|
|
|
|
os.makedirs(path) |
|
|
|
|
self.setFileAccept(path) |
|
|
|
|
msg = public.getInfo('创建目录[{1}]成功!', (path,)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
return public.returnJson(True, '目录创建成功!') |
|
|
|
|
msg = mw.getInfo('创建目录[{1}]成功!', (path,)) |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
return mw.returnJson(True, '目录创建成功!') |
|
|
|
|
except Exception as e: |
|
|
|
|
return public.returnJson(False, '目录创建失败!') |
|
|
|
|
return mw.returnJson(False, '目录创建失败!') |
|
|
|
|
|
|
|
|
|
def downloadFileApi(self): |
|
|
|
|
import db |
|
|
|
@ -177,20 +177,20 @@ class files_api: |
|
|
|
|
path = request.form.get('path', '').encode('utf-8') |
|
|
|
|
filename = request.form.get('filename', '').encode('utf-8') |
|
|
|
|
|
|
|
|
|
isTask = public.getRootDir() + '/tmp/panelTask.pl' |
|
|
|
|
isTask = mw.getRootDir() + '/tmp/panelTask.pl' |
|
|
|
|
execstr = url + '|mw|' + path + '/' + filename |
|
|
|
|
public.M('tasks').add('name,type,status,addtime,execstr', |
|
|
|
|
('下载文件[' + filename + ']', 'download', '0', time.strftime('%Y-%m-%d %H:%M:%S'), execstr)) |
|
|
|
|
public.writeFile(isTask, 'True') |
|
|
|
|
mw.M('tasks').add('name,type,status,addtime,execstr', |
|
|
|
|
('下载文件[' + filename + ']', 'download', '0', time.strftime('%Y-%m-%d %H:%M:%S'), execstr)) |
|
|
|
|
mw.writeFile(isTask, 'True') |
|
|
|
|
# self.setFileAccept(path + '/' + filename) |
|
|
|
|
return public.returnJson(True, '已将下载任务添加到队列!') |
|
|
|
|
return mw.returnJson(True, '已将下载任务添加到队列!') |
|
|
|
|
|
|
|
|
|
def removeTaskApi(self): |
|
|
|
|
mid = request.form.get('id', '').encode('utf-8') |
|
|
|
|
try: |
|
|
|
|
name = public.M('tasks').where('id=?', (mid,)).getField('name') |
|
|
|
|
status = public.M('tasks').where('id=?', (mid,)).getField('status') |
|
|
|
|
public.M('tasks').delete(mid) |
|
|
|
|
name = mw.M('tasks').where('id=?', (mid,)).getField('name') |
|
|
|
|
status = mw.M('tasks').where('id=?', (mid,)).getField('status') |
|
|
|
|
mw.M('tasks').delete(mid) |
|
|
|
|
if status == '-1': |
|
|
|
|
os.system( |
|
|
|
|
"kill `ps -ef |grep 'python panelSafe.pyc'|grep -v grep|grep -v panelExec|awk '{print $2}'`") |
|
|
|
@ -208,12 +208,12 @@ done |
|
|
|
|
|
|
|
|
|
os.system( |
|
|
|
|
'rm -f ' + name.replace('扫描目录[', '').replace(']', '') + '/scan.pl') |
|
|
|
|
isTask = public.getRootDir() + '/tmp/panelTask.pl' |
|
|
|
|
public.writeFile(isTask, 'True') |
|
|
|
|
isTask = mw.getRootDir() + '/tmp/panelTask.pl' |
|
|
|
|
mw.writeFile(isTask, 'True') |
|
|
|
|
os.system('/etc/init.d/mw start') |
|
|
|
|
except: |
|
|
|
|
os.system('/etc/init.d/mw start') |
|
|
|
|
return public.returnJson(True, '任务已删除!') |
|
|
|
|
return mw.returnJson(True, '任务已删除!') |
|
|
|
|
|
|
|
|
|
# 上传文件 |
|
|
|
|
def uploadFileApi(self): |
|
|
|
@ -236,9 +236,9 @@ done |
|
|
|
|
os.chown(filename, p_stat.st_uid, p_stat.st_gid) |
|
|
|
|
os.chmod(filename, p_stat.st_mode) |
|
|
|
|
|
|
|
|
|
msg = public.getInfo('上传文件[{1}] 到 [{2}]成功!', (filename, path)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
return public.returnMsg(True, '上传成功!') |
|
|
|
|
msg = mw.getInfo('上传文件[{1}] 到 [{2}]成功!', (filename, path)) |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
return mw.returnMsg(True, '上传成功!') |
|
|
|
|
|
|
|
|
|
def getRecycleBinApi(self): |
|
|
|
|
rPath = self.rPath |
|
|
|
@ -274,7 +274,7 @@ done |
|
|
|
|
data['files'].append(tmp) |
|
|
|
|
except: |
|
|
|
|
continue |
|
|
|
|
return public.returnJson(True, 'OK', data) |
|
|
|
|
return mw.returnJson(True, 'OK', data) |
|
|
|
|
|
|
|
|
|
# 回收站开关 |
|
|
|
|
def recycleBinApi(self): |
|
|
|
@ -284,12 +284,12 @@ done |
|
|
|
|
c = 'data/recycle_bin_db.pl' |
|
|
|
|
if os.path.exists(c): |
|
|
|
|
os.remove(c) |
|
|
|
|
public.writeLog('文件管理', '已关闭回收站功能!') |
|
|
|
|
return public.returnJson(True, '已关闭回收站功能!') |
|
|
|
|
mw.writeLog('文件管理', '已关闭回收站功能!') |
|
|
|
|
return mw.returnJson(True, '已关闭回收站功能!') |
|
|
|
|
else: |
|
|
|
|
public.writeFile(c, 'True') |
|
|
|
|
public.writeLog('文件管理', '已开启回收站功能!') |
|
|
|
|
return public.returnJson(True, '已开启回收站功能!') |
|
|
|
|
mw.writeFile(c, 'True') |
|
|
|
|
mw.writeLog('文件管理', '已开启回收站功能!') |
|
|
|
|
return mw.returnJson(True, '已开启回收站功能!') |
|
|
|
|
|
|
|
|
|
def reRecycleBinApi(self): |
|
|
|
|
rPath = self.rPath |
|
|
|
@ -298,13 +298,13 @@ done |
|
|
|
|
try: |
|
|
|
|
import shutil |
|
|
|
|
shutil.move(rPath + path, dFile) |
|
|
|
|
msg = public.getInfo('移动文件[{1}]到回收站成功!', (dFile,)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
return public.returnJson(True, '恢复成功!') |
|
|
|
|
msg = mw.getInfo('移动文件[{1}]到回收站成功!', (dFile,)) |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
return mw.returnJson(True, '恢复成功!') |
|
|
|
|
except Exception as e: |
|
|
|
|
msg = public.getInfo('从回收站恢复[{1}]失败!', (dFile,)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
return public.returnJson(False, '恢复失败!') |
|
|
|
|
msg = mw.getInfo('从回收站恢复[{1}]失败!', (dFile,)) |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
return mw.returnJson(False, '恢复失败!') |
|
|
|
|
|
|
|
|
|
def delRecycleBinApi(self): |
|
|
|
|
rPath = self.rPath |
|
|
|
@ -313,7 +313,7 @@ done |
|
|
|
|
dFile = path.split('_t_')[0] |
|
|
|
|
|
|
|
|
|
if not self.checkDir(path): |
|
|
|
|
return public.returnJson(False, '敏感目录,请不要花样作死!') |
|
|
|
|
return mw.returnJson(False, '敏感目录,请不要花样作死!') |
|
|
|
|
|
|
|
|
|
os.system('which chattr && chattr -R -i ' + rPath + path) |
|
|
|
|
if os.path.isdir(rPath + path): |
|
|
|
@ -323,14 +323,14 @@ done |
|
|
|
|
os.remove(rPath + path) |
|
|
|
|
|
|
|
|
|
tfile = path.replace('_mw_', '/').split('_t_')[0] |
|
|
|
|
msg = public.getInfo('已彻底从回收站删除{1}!', (tfile,)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
return public.returnJson(True, msg) |
|
|
|
|
msg = mw.getInfo('已彻底从回收站删除{1}!', (tfile,)) |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
return mw.returnJson(True, msg) |
|
|
|
|
|
|
|
|
|
# 获取进度 |
|
|
|
|
def getSpeedApi(self): |
|
|
|
|
data = public.getSpeed() |
|
|
|
|
return public.returnJson(True, '已清空回收站!', data) |
|
|
|
|
data = mw.getSpeed() |
|
|
|
|
return mw.returnJson(True, '已清空回收站!', data) |
|
|
|
|
|
|
|
|
|
def closeRecycleBinApi(self): |
|
|
|
|
rPath = self.rPath |
|
|
|
@ -341,19 +341,19 @@ done |
|
|
|
|
for name in rlist: |
|
|
|
|
i += 1 |
|
|
|
|
path = rPath + name |
|
|
|
|
public.writeSpeed(name, i, l) |
|
|
|
|
mw.writeSpeed(name, i, l) |
|
|
|
|
if os.path.isdir(path): |
|
|
|
|
shutil.rmtree(path) |
|
|
|
|
else: |
|
|
|
|
os.remove(path) |
|
|
|
|
public.writeSpeed(None, 0, 0) |
|
|
|
|
public.writeLog('文件管理', '已清空回收站!') |
|
|
|
|
return public.returnJson(True, '已清空回收站!') |
|
|
|
|
mw.writeSpeed(None, 0, 0) |
|
|
|
|
mw.writeLog('文件管理', '已清空回收站!') |
|
|
|
|
return mw.returnJson(True, '已清空回收站!') |
|
|
|
|
|
|
|
|
|
def deleteDirApi(self): |
|
|
|
|
path = request.form.get('path', '').encode('utf-8') |
|
|
|
|
if not os.path.exists(path): |
|
|
|
|
return public.returnJson(False, '指定文件不存在!') |
|
|
|
|
return mw.returnJson(False, '指定文件不存在!') |
|
|
|
|
|
|
|
|
|
# 检查是否为.user.ini |
|
|
|
|
if path.find('.user.ini'): |
|
|
|
@ -361,21 +361,21 @@ done |
|
|
|
|
try: |
|
|
|
|
if os.path.exists('data/recycle_bin.pl'): |
|
|
|
|
if self.mvRecycleBin(path): |
|
|
|
|
return public.returnJson(True, '已将文件移动到回收站!') |
|
|
|
|
public.execShell('rm -rf ' + path) |
|
|
|
|
public.writeLog('文件管理', '删除文件成功!', (path,)) |
|
|
|
|
return public.returnJson(True, '删除文件成功!') |
|
|
|
|
return mw.returnJson(True, '已将文件移动到回收站!') |
|
|
|
|
mw.execShell('rm -rf ' + path) |
|
|
|
|
mw.writeLog('文件管理', '删除文件成功!', (path,)) |
|
|
|
|
return mw.returnJson(True, '删除文件成功!') |
|
|
|
|
except: |
|
|
|
|
return public.returnJson(False, '删除文件失败!') |
|
|
|
|
return mw.returnJson(False, '删除文件失败!') |
|
|
|
|
|
|
|
|
|
def closeLogsApi(self): |
|
|
|
|
logPath = public.getLogsDir() |
|
|
|
|
logPath = mw.getLogsDir() |
|
|
|
|
os.system('rm -f ' + logPath + '/*') |
|
|
|
|
os.system('kill -USR1 `cat ' + public.getServerDir() + |
|
|
|
|
os.system('kill -USR1 `cat ' + mw.getServerDir() + |
|
|
|
|
'openresty/nginx/logs/nginx.pid`') |
|
|
|
|
public.writeLog('文件管理', '网站日志已被清空!') |
|
|
|
|
mw.writeLog('文件管理', '网站日志已被清空!') |
|
|
|
|
tmp = self.getDirSize(logPath) |
|
|
|
|
return public.returnJson(True, tmp[0].split()[0]) |
|
|
|
|
return mw.returnJson(True, tmp[0].split()[0]) |
|
|
|
|
|
|
|
|
|
def setBatchDataApi(self): |
|
|
|
|
path = request.form.get('path', '').encode('utf-8') |
|
|
|
@ -391,21 +391,21 @@ done |
|
|
|
|
'user': user, |
|
|
|
|
'data': data |
|
|
|
|
} |
|
|
|
|
return public.returnJson(True, '标记成功,请在目标目录点击粘贴所有按钮!') |
|
|
|
|
return mw.returnJson(True, '标记成功,请在目标目录点击粘贴所有按钮!') |
|
|
|
|
elif stype == '3': |
|
|
|
|
for key in json.loads(data): |
|
|
|
|
try: |
|
|
|
|
key = key.encode('utf-8') |
|
|
|
|
filename = path + '/' + key |
|
|
|
|
if not self.checkDir(filename): |
|
|
|
|
return public.returnJson(False, 'FILE_DANGER') |
|
|
|
|
return mw.returnJson(False, 'FILE_DANGER') |
|
|
|
|
os.system('chmod -R ' + access + " '" + filename + "'") |
|
|
|
|
os.system('chown -R ' + user + ':' + |
|
|
|
|
user + " '" + filename + "'") |
|
|
|
|
except: |
|
|
|
|
continue |
|
|
|
|
public.writeLog('文件管理', '批量设置权限成功!') |
|
|
|
|
return public.returnJson(True, '批量设置权限成功!') |
|
|
|
|
mw.writeLog('文件管理', '批量设置权限成功!') |
|
|
|
|
return mw.returnJson(True, '批量设置权限成功!') |
|
|
|
|
else: |
|
|
|
|
import shutil |
|
|
|
|
isRecyle = os.path.exists('data/recycle_bin.pl') |
|
|
|
@ -420,10 +420,10 @@ done |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
i += 1 |
|
|
|
|
public.writeSpeed(key, i, l) |
|
|
|
|
mw.writeSpeed(key, i, l) |
|
|
|
|
if os.path.isdir(filename): |
|
|
|
|
if not self.checkDir(filename): |
|
|
|
|
return public.returnJson(False, '请不要花样作死!') |
|
|
|
|
return mw.returnJson(False, '请不要花样作死!') |
|
|
|
|
if isRecyle: |
|
|
|
|
self.mvRecycleBin(topath) |
|
|
|
|
else: |
|
|
|
@ -437,9 +437,9 @@ done |
|
|
|
|
os.remove(filename) |
|
|
|
|
except: |
|
|
|
|
continue |
|
|
|
|
public.writeSpeed(None, 0, 0) |
|
|
|
|
public.writeLog('文件管理', '批量删除成功!') |
|
|
|
|
return public.returnJson(True, '批量删除成功!') |
|
|
|
|
mw.writeSpeed(None, 0, 0) |
|
|
|
|
mw.writeLog('文件管理', '批量删除成功!') |
|
|
|
|
return mw.returnJson(True, '批量删除成功!') |
|
|
|
|
|
|
|
|
|
def checkExistsFilesApi(self): |
|
|
|
|
dfile = request.form.get('dfile', '').encode('utf-8') |
|
|
|
@ -464,7 +464,7 @@ done |
|
|
|
|
tmp['size'] = os.path.getsize(filename) |
|
|
|
|
tmp['mtime'] = str(int(stat.st_mtime)) |
|
|
|
|
data.append(tmp) |
|
|
|
|
return public.returnJson(True, 'ok', data) |
|
|
|
|
return mw.returnJson(True, 'ok', data) |
|
|
|
|
|
|
|
|
|
def batchPasteApi(self): |
|
|
|
|
path = request.form.get('path', '').encode('utf-8') |
|
|
|
@ -472,14 +472,14 @@ done |
|
|
|
|
# filename = request.form.get('filename', '').encode('utf-8') |
|
|
|
|
import shutil |
|
|
|
|
if not self.checkDir(path): |
|
|
|
|
return public.returnJson(False, '请不要花样作死!') |
|
|
|
|
return mw.returnJson(False, '请不要花样作死!') |
|
|
|
|
i = 0 |
|
|
|
|
myfiles = json.loads(session['selected']['data']) |
|
|
|
|
l = len(myfiles) |
|
|
|
|
if stype == '1': |
|
|
|
|
for key in myfiles: |
|
|
|
|
i += 1 |
|
|
|
|
public.writeSpeed(key, i, l) |
|
|
|
|
mw.writeSpeed(key, i, l) |
|
|
|
|
try: |
|
|
|
|
|
|
|
|
|
sfile = session['selected'][ |
|
|
|
@ -494,14 +494,14 @@ done |
|
|
|
|
os.chown(dfile, stat.st_uid, stat.st_gid) |
|
|
|
|
except: |
|
|
|
|
continue |
|
|
|
|
msg = public.getInfo('从[{1}]批量复制到[{2}]成功', |
|
|
|
|
(session['selected']['path'], path,)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
msg = mw.getInfo('从[{1}]批量复制到[{2}]成功', |
|
|
|
|
(session['selected']['path'], path,)) |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
else: |
|
|
|
|
for key in myfiles: |
|
|
|
|
try: |
|
|
|
|
i += 1 |
|
|
|
|
public.writeSpeed(key, i, l) |
|
|
|
|
mw.writeSpeed(key, i, l) |
|
|
|
|
|
|
|
|
|
sfile = session['selected'][ |
|
|
|
|
'path'] + '/' + key.encode('utf-8') |
|
|
|
@ -510,21 +510,21 @@ done |
|
|
|
|
shutil.move(sfile, dfile) |
|
|
|
|
except: |
|
|
|
|
continue |
|
|
|
|
msg = public.getInfo('从[{1}]批量移动到[{2}]成功', |
|
|
|
|
(session['selected']['path'], path,)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
public.writeSpeed(None, 0, 0) |
|
|
|
|
msg = mw.getInfo('从[{1}]批量移动到[{2}]成功', |
|
|
|
|
(session['selected']['path'], path,)) |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
mw.writeSpeed(None, 0, 0) |
|
|
|
|
errorCount = len(myfiles) - i |
|
|
|
|
del(session['selected']) |
|
|
|
|
msg = public.getInfo('批量操作成功[{1}],失败[{2}]', (str(i), str(errorCount))) |
|
|
|
|
return public.returnJson(True, msg) |
|
|
|
|
msg = mw.getInfo('批量操作成功[{1}],失败[{2}]', (str(i), str(errorCount))) |
|
|
|
|
return mw.returnJson(True, msg) |
|
|
|
|
|
|
|
|
|
def copyFileApi(self): |
|
|
|
|
sfile = request.form.get('sfile', '').encode('utf-8') |
|
|
|
|
dfile = request.form.get('dfile', '').encode('utf-8') |
|
|
|
|
|
|
|
|
|
if not os.path.exists(sfile): |
|
|
|
|
return public.returnJson(False, '指定文件不存在!') |
|
|
|
|
return mw.returnJson(False, '指定文件不存在!') |
|
|
|
|
|
|
|
|
|
if os.path.isdir(sfile): |
|
|
|
|
return self.copyDir(sfile, dfile) |
|
|
|
@ -532,33 +532,33 @@ done |
|
|
|
|
import shutil |
|
|
|
|
try: |
|
|
|
|
shutil.copyfile(sfile, dfile) |
|
|
|
|
msg = public.getInfo('复制文件[{1}]到[{2}]成功!', (sfile, dfile,)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
msg = mw.getInfo('复制文件[{1}]到[{2}]成功!', (sfile, dfile,)) |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
stat = os.stat(sfile) |
|
|
|
|
os.chown(dfile, stat.st_uid, stat.st_gid) |
|
|
|
|
return public.returnJson(True, '文件复制成功!') |
|
|
|
|
return mw.returnJson(True, '文件复制成功!') |
|
|
|
|
except: |
|
|
|
|
return public.returnJson(False, '文件复制失败!') |
|
|
|
|
return mw.returnJson(False, '文件复制失败!') |
|
|
|
|
|
|
|
|
|
##### ----- end ----- ### |
|
|
|
|
|
|
|
|
|
def copyDir(self, sfile, dfile): |
|
|
|
|
|
|
|
|
|
if not os.path.exists(sfile): |
|
|
|
|
return public.returnJson(False, '指定目录不存在!') |
|
|
|
|
return mw.returnJson(False, '指定目录不存在!') |
|
|
|
|
|
|
|
|
|
if os.path.exists(dfile): |
|
|
|
|
return public.returnJson(False, '指定目录已存在!') |
|
|
|
|
return mw.returnJson(False, '指定目录已存在!') |
|
|
|
|
import shutil |
|
|
|
|
try: |
|
|
|
|
shutil.copytree(sfile, dfile) |
|
|
|
|
stat = os.stat(sfile) |
|
|
|
|
os.chown(dfile, stat.st_uid, stat.st_gid) |
|
|
|
|
msg = public.getInfo('复制目录[{1}]到[{2}]成功!', (sfile, dfile)) |
|
|
|
|
public.writeLog('文件管理', msg) |
|
|
|
|
return public.returnJson(True, '目录复制成功!') |
|
|
|
|
msg = mw.getInfo('复制目录[{1}]到[{2}]成功!', (sfile, dfile)) |
|
|
|
|
mw.writeLog('文件管理', msg) |
|
|
|
|
return mw.returnJson(True, '目录复制成功!') |
|
|
|
|
except: |
|
|
|
|
return public.returnJson(False, '目录复制失败!') |
|
|
|
|
return mw.returnJson(False, '目录复制失败!') |
|
|
|
|
|
|
|
|
|
# 检查敏感目录 |
|
|
|
|
def checkDir(self, path): |
|
|
|
@ -590,15 +590,15 @@ done |
|
|
|
|
'/selinux', |
|
|
|
|
'/www/server', |
|
|
|
|
'/www/server/data', |
|
|
|
|
public.getRootDir()) |
|
|
|
|
mw.getRootDir()) |
|
|
|
|
|
|
|
|
|
return not path in nDirs |
|
|
|
|
|
|
|
|
|
def getDirSize(self, path): |
|
|
|
|
if public.getOs() == 'darwin': |
|
|
|
|
tmp = public.execShell('du -sh ' + path) |
|
|
|
|
if mw.getOs() == 'darwin': |
|
|
|
|
tmp = mw.execShell('du -sh ' + path) |
|
|
|
|
else: |
|
|
|
|
tmp = public.execShell('du -sbh ' + path) |
|
|
|
|
tmp = mw.execShell('du -sbh ' + path) |
|
|
|
|
return tmp |
|
|
|
|
|
|
|
|
|
def checkFileName(self, filename): |
|
|
|
@ -613,8 +613,8 @@ done |
|
|
|
|
|
|
|
|
|
def setFileAccept(self, filename): |
|
|
|
|
auth = 'www:www' |
|
|
|
|
if public.getOs() == 'darwin': |
|
|
|
|
user = public.execShell( |
|
|
|
|
if mw.getOs() == 'darwin': |
|
|
|
|
user = mw.execShell( |
|
|
|
|
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip() |
|
|
|
|
auth = user + ':staff' |
|
|
|
|
os.system('chown -R ' + auth + ' ' + filename) |
|
|
|
@ -630,20 +630,20 @@ done |
|
|
|
|
try: |
|
|
|
|
import shutil |
|
|
|
|
shutil.move(path, rFile) |
|
|
|
|
public.writeLog('文件管理', public.getInfo( |
|
|
|
|
mw.writeLog('文件管理', mw.getInfo( |
|
|
|
|
'移动文件[{1}]到回收站成功!', (path))) |
|
|
|
|
return True |
|
|
|
|
except: |
|
|
|
|
public.writeLog('文件管理', public.getInfo( |
|
|
|
|
mw.writeLog('文件管理', mw.getInfo( |
|
|
|
|
'移动文件[{1}]到回收站失败!', (path))) |
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
def getBody(self, path): |
|
|
|
|
if not os.path.exists(path): |
|
|
|
|
return public.returnJson(False, '文件不存在', (path,)) |
|
|
|
|
return mw.returnJson(False, '文件不存在', (path,)) |
|
|
|
|
|
|
|
|
|
if os.path.getsize(path) > 2097152: |
|
|
|
|
return public.returnJson(False, u'不能在线编辑大于2MB的文件!') |
|
|
|
|
return mw.returnJson(False, u'不能在线编辑大于2MB的文件!') |
|
|
|
|
|
|
|
|
|
fp = open(path, 'rb') |
|
|
|
|
data = {} |
|
|
|
@ -690,13 +690,13 @@ done |
|
|
|
|
data['data'] = srcBody.decode('utf-8') |
|
|
|
|
data['encoding'] = u'utf-8' |
|
|
|
|
|
|
|
|
|
return public.returnJson(True, 'OK', data) |
|
|
|
|
return mw.returnJson(True, 'OK', data) |
|
|
|
|
except Exception as ex: |
|
|
|
|
return public.returnJson(False, u'文件编码不被兼容,无法正确读取文件!' + str(ex)) |
|
|
|
|
return mw.returnJson(False, u'文件编码不被兼容,无法正确读取文件!' + str(ex)) |
|
|
|
|
|
|
|
|
|
def saveBody(self, path, data, encoding='utf-8'): |
|
|
|
|
if not os.path.exists(path): |
|
|
|
|
return public.returnJson(False, '文件不存在') |
|
|
|
|
return mw.returnJson(False, '文件不存在') |
|
|
|
|
try: |
|
|
|
|
if encoding == 'ascii': |
|
|
|
|
encoding = 'utf-8' |
|
|
|
@ -710,18 +710,18 @@ done |
|
|
|
|
fp.write(data) |
|
|
|
|
fp.close() |
|
|
|
|
|
|
|
|
|
public.writeLog('文件管理', '文件保存成功', (path,)) |
|
|
|
|
return public.returnJson(True, '文件保存成功') |
|
|
|
|
mw.writeLog('文件管理', '文件保存成功', (path,)) |
|
|
|
|
return mw.returnJson(True, '文件保存成功') |
|
|
|
|
except Exception as ex: |
|
|
|
|
return public.returnJson(False, 'FILE_SAVE_ERR:' + str(ex)) |
|
|
|
|
return mw.returnJson(False, 'FILE_SAVE_ERR:' + str(ex)) |
|
|
|
|
|
|
|
|
|
def zip(self, sfile, dfile, stype, path): |
|
|
|
|
if sfile.find(',') == -1: |
|
|
|
|
if not os.path.exists(path + '/' + sfile): |
|
|
|
|
return public.returnMsg(False, '指定文件不存在!') |
|
|
|
|
return mw.returnMsg(False, '指定文件不存在!') |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
tmps = public.getRunDir() + '/tmp/panelExec.log' |
|
|
|
|
tmps = mw.getRunDir() + '/tmp/panelExec.log' |
|
|
|
|
if stype == 'zip': |
|
|
|
|
os.system("cd '" + path + "' && zip '" + dfile + |
|
|
|
|
"' -r '" + sfile + "' > " + tmps + " 2>&1") |
|
|
|
@ -734,15 +734,15 @@ done |
|
|
|
|
os.system("cd '" + path + "' && tar -zcvf '" + |
|
|
|
|
dfile + "' " + sfiles + " > " + tmps + " 2>&1") |
|
|
|
|
self.setFileAccept(dfile) |
|
|
|
|
public.writeLog("文件管理", '文件压缩成功!', (sfile, dfile)) |
|
|
|
|
return public.returnJson(True, '文件压缩成功!') |
|
|
|
|
mw.writeLog("文件管理", '文件压缩成功!', (sfile, dfile)) |
|
|
|
|
return mw.returnJson(True, '文件压缩成功!') |
|
|
|
|
except: |
|
|
|
|
return public.returnJson(False, '文件压缩失败!') |
|
|
|
|
return mw.returnJson(False, '文件压缩失败!') |
|
|
|
|
|
|
|
|
|
def delete(self, path): |
|
|
|
|
|
|
|
|
|
if not os.path.exists(path): |
|
|
|
|
return public.returnJson(False, '指定文件不存在!') |
|
|
|
|
return mw.returnJson(False, '指定文件不存在!') |
|
|
|
|
|
|
|
|
|
# 检查是否为.user.ini |
|
|
|
|
if path.find('.user.ini') >= 0: |
|
|
|
@ -751,13 +751,13 @@ done |
|
|
|
|
try: |
|
|
|
|
if os.path.exists('data/recycle_bin.pl'): |
|
|
|
|
if self.mvRecycleBin(path): |
|
|
|
|
return public.returnJson(True, '已将文件移动到回收站!') |
|
|
|
|
return mw.returnJson(True, '已将文件移动到回收站!') |
|
|
|
|
os.remove(path) |
|
|
|
|
public.writeLog('文件管理', public.getInfo( |
|
|
|
|
mw.writeLog('文件管理', mw.getInfo( |
|
|
|
|
'删除文件[{1}]成功!', (path))) |
|
|
|
|
return public.returnJson(True, '删除文件成功!') |
|
|
|
|
return mw.returnJson(True, '删除文件成功!') |
|
|
|
|
except: |
|
|
|
|
return public.returnJson(False, '删除文件失败!') |
|
|
|
|
return mw.returnJson(False, '删除文件失败!') |
|
|
|
|
|
|
|
|
|
def getAccess(self, filename): |
|
|
|
|
data = {} |
|
|
|
@ -792,7 +792,7 @@ done |
|
|
|
|
info['row'] = page_size |
|
|
|
|
info['p'] = page |
|
|
|
|
info['tojs'] = 'getFiles' |
|
|
|
|
pageObj = public.getPageObject(info, '1,2,3,4,5,6,7,8') |
|
|
|
|
pageObj = mw.getPageObject(info, '1,2,3,4,5,6,7,8') |
|
|
|
|
data['PAGE'] = pageObj[0] |
|
|
|
|
|
|
|
|
|
i = 0 |
|
|
|
@ -840,4 +840,4 @@ done |
|
|
|
|
data['DIR'] = sorted(dirnames) |
|
|
|
|
data['FILES'] = sorted(filenames) |
|
|
|
|
data['PATH'] = path.replace('//', '/') |
|
|
|
|
return public.getJson(data) |
|
|
|
|
return mw.getJson(data) |
|
|
|
|