pull/109/head
Mr Chen 6 years ago
parent 8312e009f6
commit f0f63a622f
  1. 329
      class/core/crontab_api.py
  2. 334
      route/static/app/crontab.js
  3. 70
      route/templates/default/crontab.html

@ -14,12 +14,14 @@ from flask import request
class crontab_api: class crontab_api:
field = 'id,name,type,where1,where_hour,where_minute,echo,addtime,status,save,backup_to,stype,sname,sbody,urladdress'
def __init__(self): def __init__(self):
pass pass
##### ----- start ----- ### ##### ----- start ----- ###
def listApi(self): def listApi(self):
_list = public.M('crontab').where('', ()).field('id,name,type,where1,where_hour,where_minute,echo,addtime,status,save,backup_to,stype,sname,sbody,urladdress').limit( _list = public.M('crontab').where('', ()).field(self.field).limit(
'0,5').order('id desc').select() '0,5').order('id desc').select()
data = [] data = []
@ -71,12 +73,83 @@ class crontab_api:
_ret['page'] = public.getPage(_page) _ret['page'] = public.getPage(_page)
return public.getJson(_ret) return public.getJson(_ret)
# 获取指定任务数据
def getCrondFindApi(self):
sid = request.form.get('id', '')
data = public.M('crontab').where(
'id=?', (sid,)).field(self.field).find()
return public.getJson(data)
def modifyCrondApi(self):
sid = request.form.get('id', '')
iname = request.form.get('name', '')
stype = request.form.get('type', '')
week = request.form.get('week', '')
where1 = request.form.get('where1', '')
hour = request.form.get('hour', '')
minute = request.form.get('minute', '')
save = request.form.get('save', '')
backup_to = request.form.get('backup_to', '')
stype = request.form.get('stype', '')
sname = request.form.get('sname', '')
sbody = request.form.get('sbody', '')
urladdress = request.form.get('urladdress', '')
if len(iname) < 1:
return public.returnJson(False, '任务名称不能为空!')
params = {
'name': iname,
'type': stype,
'week': week,
'where1': where1,
'hour': hour,
'minute': minute,
'save': save,
'backup_to': backup_to,
'stype': stype,
'sname': sname,
'sbody': sbody,
'urladdress': urladdress,
}
cuonConfig, get, name = self.getCrondCycle(params)
cronInfo = public.M('crontab').where(
'id=?', (sid,)).field(self.field).find()
del(cronInfo['id'])
del(cronInfo['addtime'])
cronInfo['name'] = get['name']
cronInfo['type'] = get['type']
cronInfo['where1'] = get['where1']
cronInfo['where_hour'] = get['hour']
cronInfo['where_minute'] = get['minute']
cronInfo['save'] = get['save']
cronInfo['backup_to'] = get['backup_to']
cronInfo['sbody'] = get['sbody']
cronInfo['urladdress'] = get['urladdress']
addData = public.M('crontab').where('id=?', (sid,)).save('name,type,where1,where_hour,where_minute,save,backup_to,sbody,urladdress', (get[
'name'], get['type'], get['where1'], get['hour'], get['minute'], get['save'], get['backup_to'], get['sbody'], get['urladdress']))
self.removeForCrond(cronInfo['echo'])
self.syncToCrond(cronInfo)
public.writeLog('计划任务', '修改计划任务[' + cronInfo['name'] + ']成功')
return public.returnJson(True, '修改成功')
def logsApi(self): def logsApi(self):
return public.returnJson(False, '添加失败') sid = request.form.get('id', '')
echo = public.M('crontab').where("id=?", (sid,)).field('echo').find()
print echo
logFile = public.getServerDir() + '/cron/' + echo['echo'] + '.log'
print logFile
if not os.path.exists(logFile):
return public.returnJson(False, '当前日志为空!')
log = public.getNumLines(logFile, 2000)
return public.returnJson(True, log)
def addApi(self): def addApi(self):
name = request.form.get('name', '') iname = request.form.get('name', '')
type = request.form.get('type', '') stype = request.form.get('type', '')
week = request.form.get('week', '')
where1 = request.form.get('where1', '') where1 = request.form.get('where1', '')
hour = request.form.get('hour', '') hour = request.form.get('hour', '')
minute = request.form.get('minute', '') minute = request.form.get('minute', '')
@ -87,12 +160,45 @@ class crontab_api:
sBody = request.form.get('sBody', '') sBody = request.form.get('sBody', '')
urladdress = request.form.get('urladdress', '') urladdress = request.form.get('urladdress', '')
if len(name) < 1: if len(iname) < 1:
return public.returnJson(False, '任务名称不能为空!') return public.returnJson(False, '任务名称不能为空!')
addData = public.M('crontab').add('name,type,where1,where_hour,where_minute,echo,addtime,status,save,backup_to,stype,sname,sbody,urladdress', params = {
(name, type, where1, hour, minute, name, 'name': iname,
time.strftime('%Y-%m-%d %X', time.localtime()), 1, save, backupTo, sType, sName, sBody, urladdress)) 'type': stype,
'week': week,
'where1': where1,
'hour': hour,
'minute': minute,
'save': save,
'backupTo': backupTo,
'sType': sType,
'sName': sName,
'sBody': sBody,
'urladdress': urladdress,
}
# print params
cuonConfig, _params, name = self.getCrondCycle(params)
cronPath = public.getServerDir() + '/cron'
cronName = self.getShell(params)
# print cuonConfig, _params, name
# print cronPath, cronName
if type(cronName) == dict:
return cronName
cuonConfig += ' ' + cronPath + '/' + cronName + \
' >> ' + cronPath + '/' + cronName + '.log 2>&1'
wRes = self.writeShell(cuonConfig)
if type(wRes) != bool:
return wRes
self.crondReload()
addData = public.M('crontab').add(self.field, (iname, stype, where1, hour, minute, cronName, time.strftime(
'%Y-%m-%d %X', time.localtime()), 1, save, backupTo, sType, sName, sBody, urladdress))
if addData > 0: if addData > 0:
return public.returnJson(True, '添加成功') return public.returnJson(True, '添加成功')
return public.returnJson(False, '添加失败') return public.returnJson(False, '添加失败')
@ -104,6 +210,9 @@ class crontab_api:
return public.returnJson(True, '添加成功') return public.returnJson(True, '添加成功')
except Exception as e: except Exception as e:
return public.returnJson(False, '删除失败') return public.returnJson(False, '删除失败')
def delLogsApi(self):
return public.returnJson(True, '删除成功')
##### ----- start ----- ### ##### ----- start ----- ###
# 转换大写星期 # 转换大写星期
@ -121,3 +230,207 @@ class crontab_api:
return wheres[num] return wheres[num]
except: except:
return '' return ''
def getCrondCycle(self, params):
cuonConfig = ''
name = ''
if params['type'] == "day":
cuonConfig = self.getDay(params)
name = '每天'
elif params['type'] == "day-n":
cuonConfig = self.getDay_N(params)
name = public.getInfo('{1}', (params['where1'],))
elif params['type'] == "hour":
cuonConfig = self.getHour(params)
name = '每小时'
elif params['type'] == "hour-n":
cuonConfig = self.getHour_N(params)
name = '每小时'
elif params['type'] == "minute-n":
cuonConfig = self.minute_N(params)
elif params['type'] == "week":
params['where1'] = params['week']
cuonConfig = self.week(params)
elif params['type'] == "month":
cuonConfig = self.month(params)
return cuonConfig, params, name
# 取任务构造Day
def getDay(self, param):
cuonConfig = "{0} {1} * * * ".format(param['minute'], param['hour'])
return cuonConfig
# 取任务构造Day_n
def getDay_N(self, param):
cuonConfig = "{0} {1} */{2} * * ".format(
param['minute'], param['hour'], param['where1'])
return cuonConfig
# 取任务构造Hour
def getHour(self, param):
cuonConfig = "{0} * * * * ".format(param['minute'])
return cuonConfig
# 取任务构造Hour-N
def getHour_N(self, param):
cuonConfig = "{0} */{1} * * * ".format(
param['minute'], param['where1'])
return cuonConfig
# 取任务构造Minute-N
def minute_N(self, param):
cuonConfig = "*/{0} * * * * ".format(param['where1'])
return cuonConfig
# 取任务构造week
def week(self, param):
cuonConfig = "{0} {1} * * {2}".format(
param['minute'], param['hour'], param['week'])
return cuonConfig
# 取任务构造Month
def month(self, param):
cuonConfig = "{0} {1} {2} * * ".format(
param['minute'], param['hour'], param['where1'])
return cuonConfig
# 取执行脚本
def getShell(self, param):
# try:
stype = param['stype']
if stype == 'toFile':
shell = param.sFile
else:
head = "#!/bin/bash\nPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin\nexport PATH\n"
log = '.log'
wheres = {
'path': head + "python " + public.getServerDir() + "/panel/script/backup.py path " + param['sname'] + " " + str(param['save']),
'site': head + "python " + public.getServerDir() + "/panel/script/backup.py site " + param['sname'] + " " + str(param['save']),
'database': head + "python " + public.getServerDir() + "/panel/script/backup.py database " + param['sname'] + " " + str(param['save']),
'logs': head + "python " + public.getServerDir() + "/panel/script/logsBackup " + param['sname'] + log + " " + str(param['save']),
'rememory': head + "/bin/bash " + public.getServerDir() + '/panel/script/rememory.sh'
}
if param['backup_to'] != 'localhost':
cfile = public.getServerDir() + "/panel/plugin/" + param[
'backup_to'] + "/" + param['backup_to'] + "_main.py"
if not os.path.exists(cfile):
cfile = public.getServerDir() + "/panel/script/backup_" + \
param['backup_to'] + ".py"
wheres = {
'path': head + "python " + cfile + " path " + param['sname'] + " " + str(param['save']),
'site': head + "python " + cfile + " site " + param['sname'] + " " + str(param['save']),
'database': head + "python " + cfile + " database " + param['sname'] + " " + str(param['save']),
'logs': head + "python " + public.getServerDir() + "/panel/script/logsBackup " + param['sname'] + log + " " + str(param['save']),
'rememory': head + "/bin/bash " + public.getServerDir() + '/panel/script/rememory.sh'
}
try:
shell = wheres[stype]
except:
if stype == 'toUrl':
shell = head + "curl -sS --connect-timeout 10 -m 60 '" + \
param['urladdress'] + "'"
else:
shell = head + param['sBody'].replace("\r\n", "\n")
shell += '''
echo "----------------------------------------------------------------------------"
endDate=`date +"%Y-%m-%d %H:%M:%S"`
echo "★[$endDate] Successful"
echo "----------------------------------------------------------------------------"
'''
cronPath = public.getServerDir() + '/cron'
if not os.path.exists(cronPath):
public.execShell('mkdir -p ' + cronPath)
if not 'echo' in param:
cronName = public.md5(public.md5(str(time.time()) + '_mw'))
else:
cronName = param['echo']
file = cronPath + '/' + cronName
public.writeFile(file, self.checkScript(shell))
public.execShell('chmod 750 ' + file)
return cronName
# 检查脚本
def checkScript(self, shell):
keys = ['shutdown', 'init 0', 'mkfs', 'passwd',
'chpasswd', '--stdin', 'mkfs.ext', 'mke2fs']
for key in keys:
shell = shell.replace(key, '[***]')
return shell
# 将Shell脚本写到文件
def writeShell(self, config):
u_file = '/var/spool/cron/crontabs/root'
if not os.path.exists(u_file):
file = '/var/spool/cron/root'
if public.isAppleSystem():
file = '/etc/crontab'
else:
file = u_file
if not os.path.exists(file):
public.writeFile(file, '')
conf = public.readFile(file)
conf += config + "\n"
if public.writeFile(file, conf):
if not os.path.exists(u_file):
public.execShell("chmod 600 '" + file +
"' && chown root.root " + file)
else:
public.execShell("chmod 600 '" + file +
"' && chown root.crontab " + file)
return True
return public.returnJson(False, '文件写入失败,请检查是否开启系统加固功能!')
# 重载配置
def crondReload(self):
if public.isAppleSystem():
if os.path.exists('/etc/crontab'):
pass
# public.execShell('/usr/sbin/cron restart')
else:
if os.path.exists('/etc/init.d/crond'):
public.execShell('/etc/init.d/crond reload')
elif os.path.exists('/etc/init.d/cron'):
public.execShell('service cron restart')
else:
public.execShell("systemctl reload crond")
# 从crond删除
def removeForCrond(self, echo):
u_file = '/var/spool/cron/crontabs/root'
if not os.path.exists(u_file):
file = '/var/spool/cron/root'
if public.isAppleSystem():
file = '/etc/crontab'
else:
file = u_file
conf = public.readFile(file)
rep = ".+" + str(echo) + ".+\n"
conf = re.sub(rep, "", conf)
if not public.writeFile(file, conf):
return False
self.crondReload()
return True
def syncToCrond(self, cronInfo):
if 'status' in cronInfo:
if cronInfo['status'] == 0:
return False
if 'where_hour' in cronInfo:
cronInfo['hour'] = cronInfo['where_hour']
cronInfo['minute'] = cronInfo['where_minute']
cronInfo['week'] = cronInfo['where1']
cuonConfig, cronInfo, name = self.getCrondCycle(cronInfo)
cronPath = public.getServerDir() + '/cron'
cronName = self.getShell(cronInfo)
if type(cronName) == dict:
return cronName
cuonConfig += ' ' + cronPath + '/' + cronName + \
' >> ' + cronPath + '/' + cronName + '.log 2>&1'
wRes = self.writeShell(cuonConfig)
if type(wRes) != bool:
return False
self.crondReload()

@ -1,3 +1,13 @@
function isURL(str_url){
var strRegex = '^(https|http|ftp|rtsp|mms)?://.+';
var re=new RegExp(strRegex);
if (re.test(str_url)){
return (true);
}else{
return (false);
}
}
var num = 0; var num = 0;
//查看任务日志 //查看任务日志
function getLogs(id){ function getLogs(id){
@ -6,7 +16,7 @@ function getLogs(id){
$.post('/crontab/logs', data, function(rdata){ $.post('/crontab/logs', data, function(rdata){
layer.closeAll(); layer.closeAll();
if(!rdata.status) { if(!rdata.status) {
layer.msg(rdata.msg,{icon:2}); layer.msg(rdata.msg,{icon:2, time:2000});
return; return;
}; };
layer.open({ layer.open({
@ -16,9 +26,9 @@ function getLogs(id){
shadeClose:false, shadeClose:false,
closeBtn:2, closeBtn:2,
content:'<div class="setchmod bt-form pd20 pb70">' content:'<div class="setchmod bt-form pd20 pb70">'
+'<pre id="crontab-log" style="overflow: auto; border: 0px none; padding: 15px; margin: 0px; height: 410px; background-color: rgb(255, 255, 255);"></pre>' +'<pre id="crontab-log" style="overflow: auto; border: 0px none; line-height:23px;padding: 15px; margin: 0px; white-space: pre-wrap; height: 405px; background-color: rgb(51,51,51);color:#f1f1f1;border-radius:0px;font-family:"></pre>'
+'<div class="bt-form-submit-btn" style="margin-top: 0px;">' +'<div class="bt-form-submit-btn" style="margin-top: 0px;">'
+'<button type="button" class="btn btn-success btn-sm" onclick="CloseLogs('+id+')">清空</button>' +'<button type="button" class="btn btn-success btn-sm" onclick="closeLogs('+id+')">清空</button>'
+'<button type="button" class="btn btn-danger btn-sm" onclick="layer.closeAll()">关闭</button>' +'<button type="button" class="btn btn-danger btn-sm" onclick="layer.closeAll()">关闭</button>'
+'</div>' +'</div>'
+'</div>' +'</div>'
@ -27,7 +37,7 @@ function getLogs(id){
setTimeout(function(){ setTimeout(function(){
$("#crontab-log").text(rdata.msg); $("#crontab-log").text(rdata.msg);
},200); },200);
}); },'json');
} }
function getCronData(){ function getCronData(){
@ -54,7 +64,7 @@ function getCronData(){
<td>"+rdata.data[i].addtime+"</td>\ <td>"+rdata.data[i].addtime+"</td>\
<td>\ <td>\
<a href=\"javascript:startTask("+rdata.data[i].id+");\" class='btlink'>执行</a> | \ <a href=\"javascript:startTask("+rdata.data[i].id+");\" class='btlink'>执行</a> | \
<a href=\"javascript:onlineEditFile(0,'/www/server/cron/"+rdata.data[i].echo+"');\" class='btlink'>脚本</a> | \ <a href=\"javascript:editTaskInfo('"+rdata.data[i].id+"');\" class='btlink'>编辑</a> | \
<a href=\"javascript:getLogs("+rdata.data[i].id+");\" class='btlink'>日志</a> | \ <a href=\"javascript:getLogs("+rdata.data[i].id+");\" class='btlink'>日志</a> | \
<a href=\"javascript:planDel("+rdata.data[i].id+" ,'"+rdata.data[i].name.replace('\\','\\\\').replace("'","\\'").replace('"','')+"');\" class='btlink'>删除</a>\ <a href=\"javascript:planDel("+rdata.data[i].id+" ,'"+rdata.data[i].name.replace('\\','\\\\').replace("'","\\'").replace('"','')+"');\" class='btlink'>删除</a>\
</td>\ </td>\
@ -67,12 +77,12 @@ function getCronData(){
//执行任务脚本 //执行任务脚本
function startTask(id){ function startTask(id){
layer.msg(lan.public.the,{icon:16,time:0,shade: [0.3, '#000']}); layer.msg('正在处理,请稍候...',{icon:16,time:0,shade: [0.3, '#000']});
var data='id='+id; var data='id='+id;
$.post('/crontab?action=StartTask',data,function(rdata){ $.post('/crontab/start_task',data,function(rdata){
layer.closeAll(); layer.closeAll();
layer.msg(rdata.msg,{icon:rdata.status?1:2}); layer.msg(rdata.msg,{icon:rdata.status?1:2});
}); },'json');
} }
@ -80,7 +90,7 @@ function startTask(id){
function closeLogs(id){ function closeLogs(id){
layer.msg(lan.public.the,{icon:16,time:0,shade: [0.3, '#000']}); layer.msg(lan.public.the,{icon:16,time:0,shade: [0.3, '#000']});
var data='id='+id; var data='id='+id;
$.post('/crontab?action=DelLogs',data,function(rdata){ $.post('/crontab/del_logs',data,function(rdata){
layer.closeAll(); layer.closeAll();
layer.msg(rdata.msg,{icon:rdata.status?1:2}); layer.msg(rdata.msg,{icon:rdata.status?1:2});
}); });
@ -244,7 +254,7 @@ function planAdd(){
var urladdress = $("#urladdress").val(); var urladdress = $("#urladdress").val();
if(sType == 'toUrl'){ if(sType == 'toUrl'){
if(!IsURL(urladdress)){ if(!isURL(urladdress)){
layer.msg(lan.crontab.input_url_err,{icon:2}); layer.msg(lan.crontab.input_url_err,{icon:2});
$("implement textarea[name='urladdress']").focus(); $("implement textarea[name='urladdress']").focus();
return; return;
@ -283,6 +293,10 @@ function planAdd(){
layer.msg(lan.public.the_add,{icon:16,time:0,shade: [0.3, '#000']}); layer.msg(lan.public.the_add,{icon:16,time:0,shade: [0.3, '#000']});
var data= $("#set-Config").serialize() + '&sBody='+sBody + '&urladdress=' + urladdress; var data= $("#set-Config").serialize() + '&sBody='+sBody + '&urladdress=' + urladdress;
$.post('/crontab/add',data,function(rdata){ $.post('/crontab/add',data,function(rdata){
if(!rdata.status) {
layer.msg(rdata.msg,{icon:2, time:2000});
return;
}
layer.closeAll(); layer.closeAll();
layer.msg(rdata.msg,{icon:rdata.status?1:2}); layer.msg(rdata.msg,{icon:rdata.status?1:2});
getCronData(); getCronData();
@ -479,6 +493,306 @@ function toBackup(type){
} }
// 编辑计划任务
function editTaskInfo(id){
layer.msg('正在获取,请稍候...',{icon:16,time:0,shade: [0.3, '#000']});
$.post('/crontab/get_crond_find',{id:id},function(rdata){
layer.closeAll();
var sTypeName = '',sTypeDom = '',cycleName = '',cycleDom = '',weekName = '',weekDom = '',sNameName ='',sNameDom = '',backupsName = '',backupsDom ='';
obj = {
from:{
id:rdata.id,
name: rdata.name,
type: rdata.type,
where1: rdata.where1,
hour: rdata.where_hour,
minute: rdata.where_minute,
week: rdata.where1,
stype: rdata.stype,
sbody: rdata.sbody,
sname: rdata.sname,
backup_to: rdata.backup_to,
save: rdata.save,
urladdress: rdata.urladdress,
},
sTypeArray:[['toShell','Shell脚本'],['site','备份网站'],['database','备份数据库'],['logs','日志切割'],['path','备份目录'],['rememory','释放内存'],['toUrl','访问URL']],
cycleArray:[['day','每天'],['day-n','N天'],['hour','每小时'],['hour-n','N小时'],['minute-n','N分钟'],['week','每星期'],['month','每月']],
weekArray:[[1,'周一'],[2,'周二'],[3,'周三'],[4,'周四'],[5,'周五'],[6,'周六'],[7,'周日']],
sNameArray:[],
backupsArray:[],
create:function(callback){
console.log(obj);
for(var i = 0; i <obj['sTypeArray'].length; i++){
if(obj.from['stype'] == obj['sTypeArray'][i][0]){
sTypeName = obj['sTypeArray'][i][1];
}
sTypeDom += '<li><a role="menuitem" href="javascript:;" value="'+ obj['sTypeArray'][i][0] +'">'+ obj['sTypeArray'][i][1] +'</a></li>';
}
for(var i = 0; i <obj['cycleArray'].length; i++){
if(obj.from['type'] == obj['cycleArray'][i][0]) cycleName = obj['cycleArray'][i][1];
cycleDom += '<li><a role="menuitem" href="javascript:;" value="'+ obj['cycleArray'][i][0] +'">'+ obj['cycleArray'][i][1] +'</a></li>';
}
for(var i = 0; i <obj['weekArray'].length; i++){
if(obj.from['week'] == obj['weekArray'][i][0]) weekName = obj['weekArray'][i][1];
weekDom += '<li><a role="menuitem" href="javascript:;" value="'+ obj['weekArray'][i][0] +'">'+ obj['weekArray'][i][1] +'</a></li>';
}
if(obj.from.stype == 'site' || obj.from.stype == 'database' || obj.from.stype == 'path' || obj.from.stype == 'logs'){
$.post('/crontab?action=GetDataList',{type:obj.from.stype == 'databases'?'database':'sites'},function(rdata){
obj.sNameArray = rdata.data;
obj.sNameArray.unshift({name:'ALL',ps:'所有'});
obj.backupsArray = rdata.orderOpt;
obj.backupsArray.unshift({name:'服务器磁盘',value:'localhost'});
for(var i = 0; i <obj['sNameArray'].length; i++){
if(obj.from['sName'] == obj['sNameArray'][i]['name']) sNameName = obj['sNameArray'][i]['ps'];
sNameDom += '<li><a role="menuitem" href="javascript:;" value="'+ obj['sNameArray'][i]['name'] +'">'+ obj['sNameArray'][i]['ps'] +'</a></li>';
}
for(var i = 0; i <obj['backupsArray'].length; i++){
if(obj.from['backupTo'] == obj['backupsArray'][i]['value']) backupsName = obj['backupsArray'][i]['name'];
backupsDom += '<li><a role="menuitem" href="javascript:;" value="'+ obj['backupsArray'][i]['value'] +'">'+ obj['backupsArray'][i]['name'] +'</a></li>';
}
callback();
});
}else{
callback();
}
}
};
obj.create(function(){
layer.open({
type:1,
title:'编辑计划任务-['+rdata.name+']',
area: ['850px','450px'],
skin:'layer-create-content',
shadeClose:false,
closeBtn:2,
content:'<div class="setting-con ptb20">\
<div class="clearfix plan ptb10">\
<span class="typename c4 pull-left f14 text-right mr20">任务类型</span>\
<div class="dropdown stype_list pull-left mr20">\
<button class="btn btn-default dropdown-toggle" type="button" id="excode" data-toggle="dropdown" style="width:auto" disabled="disabled">\
<b val="'+ obj.from.type +'">'+ sTypeName +'</b>\
<span class="caret"></span>\
</button>\
<ul class="dropdown-menu" role="menu" aria-labelledby="sType">'+ sTypeDom +'</ul>\
</div>\
</div>\
<div class="clearfix plan ptb10">\
<span class="typename c4 pull-left f14 text-right mr20">任务名称</span>\
<div class="planname pull-left"><input type="text" name="name" class="bt-input-text sName_create" value="'+ obj.from.name +'"></div>\
</div>\
<div class="clearfix plan ptb10">\
<span class="typename c4 pull-left f14 text-right mr20">执行周期</span>\
<div class="dropdown pull-left mr20">\
<button class="btn btn-default dropdown-toggle cycle_btn" type="button" data-toggle="dropdown" style="width:94px">\
<b val="'+ obj.from.stype +'">'+ cycleName +'</b>\
<span class="caret"></span>\
</button>\
<ul class="dropdown-menu" role="menu" aria-labelledby="cycle">'+ cycleDom +'</ul>\
</div>\
<div class="pull-left optional_week">\
<div class="dropdown week_btn pull-left mr20" style="display:'+ (obj.from.type == "week" ?'block;':'none') +'">\
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" >\
<b val="'+ obj.from.week +'">'+ weekName +'</b> \
<span class="caret"></span>\
</button>\
<ul class="dropdown-menu" role="menu" aria-labelledby="week">'+ weekDom +'</ul>\
</div>\
<div class="plan_hms pull-left mr20 bt-input-text where1_input" style="display:'+ (obj.from.type == "day-n" || obj.from.type == 'month' ?'block;':'none') +'"><span><input type="number" name="where1" class="where1_create" value="'+obj.from.where1 +'" maxlength="2" max="23" min="0"></span> <span class="name"></span> </div>\
<div class="plan_hms pull-left mr20 bt-input-text hour_input" style="display:'+ (obj.from.type == "day" || obj.from.type == 'day-n' || obj.from.type == 'hour-n' || obj.from.type == 'week' || obj.from.type == 'month'?'block;':'none') +'"><span><input type="number" name="hour" class="hour_create" value="'+ ( obj.from.type == 'hour-n' ? obj.from.where1 : obj.from.hour ) +'" maxlength="2" max="23" min="0"></span> <span class="name"></span> </div>\
<div class="plan_hms pull-left mr20 bt-input-text minute_input"><span><input type="number" name="minute" class="minute_create" value="'+ (obj.from.type == 'minute-n' ? obj.from.where1 : obj.from.minute)+'" maxlength="2" max="59" min="0"></span> <span class="name"></span> </div>\
</div>\
</div>\
<div class="clearfix plan ptb10 site_list" style="display:none">\
<span class="typename controls c4 pull-left f14 text-right mr20">'+ sTypeName +'</span>\
<div style="line-height:34px"><div class="dropdown pull-left mr20 sName_btn" style="display:'+ (obj.from.sType != "path"?'block;':'none') +'">\
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" style="width:auto" disabled="disabled">\
<b id="sName" val="'+ obj.from.sname +'">'+ sNameName +'</b>\
<span class="caret"></span>\
</button>\
<ul class="dropdown-menu" role="menu" aria-labelledby="sName">'+ sNameDom +'</ul>\
</div>\
<div class="info-r" style="float: left;margin-right: 25px;display:'+ (obj.from.sType == "path"?'block;':'none') +'">\
<input id="inputPath" class="bt-input-text mr5 " type="text" name="path" value="'+ obj.from.sName +'" placeholder="备份目录" style="width:208px;height:33px;" disabled="disabled">\
</div>\
<div class="textname pull-left mr20">备份到</div>\
<div class="dropdown pull-left mr20">\
<button class="btn btn-default dropdown-toggle backup_btn" type="button" data-toggle="dropdown" style="width:auto;">\
<b val="'+ obj.from.backup_to +'">'+ backupsName +'</b>\
<span class="caret"></span>\
</button>\
<ul class="dropdown-menu" role="menu" aria-labelledby="backupTo">'+ backupsDom +'</ul>\
</div>\
<div class="textname pull-left mr20">保留最新</div>\
<div class="plan_hms pull-left mr20 bt-input-text">\
<span><input type="number" name="save" class="save_create" value="'+ obj.from.save +'" maxlength="4" max="100" min="1"></span><span class="name"></span>\
</div>\
</div>\
</div>\
<div class="clearfix plan ptb10" style="display:'+ (obj.from.stype == "toShell"?'block;':'none') +'">\
<span class="typename controls c4 pull-left f14 text-right mr20">脚本内容</span>\
<div style="line-height:34px"><textarea class="txtsjs bt-input-text sBody_create" name="sBody">'+ obj.from.sbody +'</textarea></div>\
</div>\
<div class="clearfix plan ptb10" style="display:'+ (obj.from.stype == "rememory"?'block;':'none') +'">\
<span class="typename controls c4 pull-left f14 text-right mr20">提示</span>\
<div style="line-height:34px">释放PHPMYSQLPURE-FTPDAPACHENGINX的内存占用,建议在每天半夜执行!</div>\
</div>\
<div class="clearfix plan ptb10" style="display:'+ (obj.from.stype == "toUrl"?'block;':'none') +'">\
<span class="typename controls c4 pull-left f14 text-right mr20">URL地址</span>\
<div style="line-height:34px"><input type="text" style="width:400px; height:34px" class="bt-input-text url_create" name="urladdress" placeholder="URL地址" value="'+ obj.from.urladdress +'"></div>\
</div>\
<div class="clearfix plan ptb10">\
<div class="bt-submit plan-submits " style="margin-left: 141px;">保存编辑</div>\
</div>\
</div>'
});
setTimeout(function(){
if(obj.from.stype == 'toShell'){
$('.site_list').hide();
}else if(obj.from.stype == 'rememory'){
$('.site_list').hide();
}else if( obj.from.stype == 'toUrl'){
$('.site_list').hide();
}else{
$('.site_list').show();
}
$('.sName_create').blur(function () {
obj.from.name = $(this).val();
});
$('.where1_create').blur(function () {
obj.from.where1 = $(this).val();
});
$('.hour_create').blur(function () {
obj.from.hour = $(this).val();
});
$('.minute_create').blur(function () {
obj.from.minute = $(this).val();
});
$('.save_create').blur(function () {
obj.from.save = $(this).val();
});
$('.sBody_create').blur(function () {
obj.from.sBody = $(this).val();
});
$('.url_create').blur(function () {
obj.from.urladdress = $(this).val();
});
$('[aria-labelledby="cycle"] a').unbind().click(function () {
$('.cycle_btn').find('b').attr('val',$(this).attr('value')).html($(this).html());
var type = $(this).attr('value');
switch(type){
case 'day':
$('.week_btn').hide();
$('.where1_input').hide();
$('.hour_input').show().find('input').val('1');
$('.minute_input').show().find('input').val('30');
obj.from.week = '';
obj.from.type = '';
obj.from.hour = 1;
obj.from.minute = 30;
break;
case 'day-n':
$('.week_btn').hide();
$('.where1_input').show().find('input').val('1');
$('.hour_input').show().find('input').val('1');
$('.minute_input').show().find('input').val('30');
obj.from.week = '';
obj.from.where1 = 1;
obj.from.hour = 1;
obj.from.minute = 30;
break;
case 'hour':
$('.week_btn').hide();
$('.where1_input').hide();
$('.hour_input').hide();
$('.minute_input').show().find('input').val('30');
obj.from.week = '';
obj.from.where1 = '';
obj.from.hour = '';
obj.from.minute = 30;
break;
case 'hour-n':
$('.week_btn').hide();
$('.where1_input').hide();
$('.hour_input').show().find('input').val('1');
$('.minute_input').show().find('input').val('30');
obj.from.week = '';
obj.from.where1 = '';
obj.from.hour = 1;
obj.from.minute = 30;
break;
case 'minute-n':
$('.week_btn').hide();
$('.where1_input').hide();
$('.hour_input').hide();
$('.minute_input').show();
obj.from.week = '';
obj.from.where1 = '';
obj.from.hour = '';
obj.from.minute = 30;
break;
case 'week':
$('.week_btn').show();
$('.where1_input').hide();
$('.hour_input').show();
$('.minute_input').show();
obj.from.week = 1;
obj.from.where1 = '';
obj.from.hour = 1;
obj.from.minute = 30;
break;
case 'month':
$('.week_btn').hide();
$('.where1_input').show();
$('.hour_input').show();
$('.minute_input').show();
obj.from.week = '';
obj.from.where1 = 1;
obj.from.hour = 1;
obj.from.minute = 30;
break;
}
obj.from.type = $(this).attr('value');
});
$('[aria-labelledby="week"] a').unbind().click(function () {
$('.week_btn').find('b').attr('val',$(this).attr('value')).html($(this).html());
obj.from.week = $(this).attr('value');
});
$('[aria-labelledby="backupTo"] a').unbind().click(function () {
$('.backup_btn').find('b').attr('val',$(this).attr('value')).html($(this).html());
obj.from.backupTo = $(this).attr('value');
});
$('.plan-submits').unbind().click(function(){
if(obj.from.type == 'hour-n'){
obj.from.where1 = obj.from.hour;
obj.from.hour = '';
}else if(obj.from.type == 'minute-n'){
obj.from.where1 = obj.from.minute;
obj.from.minute = '';
}
layer.msg('正在保存编辑内容,请稍后...',{icon:16,time:0,shade: [0.3, '#000']});
$.post('/crontab/modify_crond',obj.from,function(rdata){
layer.closeAll();
getCronData();
layer.msg(rdata.msg,{icon:rdata.status?1:2});
},'json');
});
},100);
});
},'json');
}
//下拉菜单名称 //下拉菜单名称
function getselectname(){ function getselectname(){
$(".dropdown ul li a").click(function(){ $(".dropdown ul li a").click(function(){

@ -50,58 +50,36 @@
<span class="caret"></span> <span class="caret"></span>
</button> </button>
<ul class="dropdown-menu" role="menu" aria-labelledby="cycle"> <ul class="dropdown-menu" role="menu" aria-labelledby="cycle">
<li> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="day">每天</a></li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="day">每天</a> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="day-n">N天</a></li>
</li> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="hour">每小时</a></li>
<li> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="hour-n">N小时</a></li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="day-n">N天</a> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="minute-n">N分钟</a></li>
</li> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="week">每星期</a></li>
<li> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="month">每月</a></li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="hour">每小时</a>
</li>
<li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="hour-n">N小时</a>
</li>
<li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="minute-n">N分钟</a>
</li>
<li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="week">每星期</a>
</li>
<li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="month">每月</a>
</li>
</ul> </ul>
</div> </div>
<div id="ptime" class="pull-left"> <div id="ptime" class="pull-left">
<div class="dropdown planweek pull-left mr20"> <div class="dropdown planweek pull-left mr20">
<button class="btn btn-default dropdown-toggle" type="button" id="excode" data-toggle="dropdown"><b val="1">周一</b> <span class="caret"></span></button> <button class="btn btn-default dropdown-toggle" type="button" id="excode" data-toggle="dropdown"><b val="1">周一</b> <span class="caret"></span></button>
<ul class="dropdown-menu" role="menu" aria-labelledby="excode"> <ul class="dropdown-menu" role="menu" aria-labelledby="excode">
<li> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="1">周一</a></li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="1">周一</a> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="2">周二</a></li>
</li> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="3">周三</a></li>
<li> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="4">周四</a></li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="2">周二</a> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="5">周五</a></li>
</li> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="6">周六</a></li>
<li> <li><a role="menuitem" tabindex="-1" href="javascript:;" value="0">周日</a></li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="3">周三</a>
</li>
<li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="4">周四</a>
</li>
<li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="5">周五</a>
</li>
<li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="6">周六</a>
</li>
<li>
<a role="menuitem" tabindex="-1" href="javascript:;" value="0">周日</a>
</li>
</ul> </ul>
</div> </div>
<div class="plan_hms pull-left mr20 bt-input-text"> <span><input type="number" name="hour" value="1" maxlength="2" max="23" min="0"></span> <span class="name">小时</span> </div> <div class="plan_hms pull-left mr20 bt-input-text">
<div class="plan_hms pull-left mr20 bt-input-text"> <span><input type="number" name="minute" value="30" maxlength="2" max="59" min="0"></span> <span class="name">分钟</span> </div> <span><input type="number" name="hour" value="1" maxlength="2" max="23" min="0"></span>
<span class="name">小时</span>
</div>
<div class="plan_hms pull-left mr20 bt-input-text">
<span><input type="number" name="minute" value="30" maxlength="2" max="59" min="0"></span>
<span class="name">分钟</span>
</div>
</div> </div>
</div> </div>
<div class="clearfix plan"> <div class="clearfix plan">
@ -109,7 +87,7 @@
<div id="implement" style="line-height:34px"><textarea class="txtsjs bt-input-text" name="sBody"></textarea></div> <div id="implement" style="line-height:34px"><textarea class="txtsjs bt-input-text" name="sBody"></textarea></div>
</div> </div>
<div class="clearfix plan"> <div class="clearfix plan">
<div class="bt-submit plan-submit" onclick="planAdd()">添加任务</div> <div class="bt-submit plan-submit" onclick="planAdd();">添加任务</div>
</div> </div>
<ul class="help-info-text c7 ptb15 mlr20"> <ul class="help-info-text c7 ptb15 mlr20">
<li>当添加完备份任务,应该手动运行一次,并检查备份包是否完整</li> <li>当添加完备份任务,应该手动运行一次,并检查备份包是否完整</li>
@ -137,7 +115,7 @@
<div class="title c6 plr15"> <div class="title c6 plr15">
<h3 class="f16">任务列表</h3> <h3 class="f16">任务列表</h3>
<span id="allDelete" style="float: right;display: none;"> <span id="allDelete" style="float: right;display: none;">
<button onclick="allDeleteCron();" class="btn btn-default btn-sm">$data['lan']['BTN1']</button> <button onclick="allDeleteCron();" class="btn btn-default btn-sm">删除选中</button>
</span> </span>
</div> </div>
<div class="setting-con divtable pd15"> <div class="setting-con divtable pd15">

Loading…
Cancel
Save