pull/109/head
Mr Chen 6 years ago
parent ff3067f233
commit 367d6c5b78
  1. 40
      class/core/crontab_api.py
  2. 57
      data/libList.conf
  3. 98
      route/static/app/crontab.js
  4. 226
      scripts/backup.py
  5. 70
      scripts/logs_backup.py
  6. 70
      scripts/rememory.sh

@ -129,7 +129,6 @@ class crontab_api:
addData = public.M('crontab').where('id=?', (sid,)).save('name,type,where1,where_hour,where_minute,save,backup_to,sbody,urladdress', (get[
'name'], field_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'] + ']成功')
@ -244,6 +243,26 @@ class crontab_api:
return public.returnJson(True, '任务日志已清空!')
except:
return public.returnJson(False, '任务日志清空失败!')
# 取数据列表
def getDataListApi(self):
stype = request.form.get('type', '').encode('utf-8')
data = {}
data['data'] = public.M(stype).field('name,ps').select()
data['orderOpt'] = []
# try:
# tmp = public.readFile('data/libList.conf')
# libs = json.loads(tmp)
# import imp
# for lib in libs:
# imp.find_module(lib['module'])
# tmp = {}
# tmp['name'] = lib['name']
# tmp['value'] = lib['opt']
# data['orderOpt'].append(tmp)
# except Exception as e:
# print e
return public.getJson(data)
##### ----- start ----- ###
# 转换大写星期
@ -336,26 +355,25 @@ class crontab_api:
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'
'path': head + "python " + public.getServerDir() + "/mdserver-web/scripts/backup.py path " + param['sname'] + " " + str(param['save']),
'site': head + "python " + public.getServerDir() + "/mdserver-web/scripts/backup.py site " + param['sname'] + " " + str(param['save']),
'database': head + "python " + public.getServerDir() + "/mdserver-web/scripts/backup.py database " + param['sname'] + " " + str(param['save']),
'logs': head + "python " + public.getServerDir() + "/mdserver-web/scripts/logs_backup " + param['sname'] + log + " " + str(param['save']),
'rememory': head + "/bin/bash " + public.getServerDir() + '/mdserver-web/scripts/rememory.sh'
}
if param['backup_to'] != 'localhost':
cfile = public.getServerDir() + "/panel/plugin/" + param[
cfile = public.getServerDir() + "/mdserver-web/plugin/" + param[
'backup_to'] + "/" + param['backup_to'] + "_main.py"
if not os.path.exists(cfile):
cfile = public.getServerDir() + "/panel/script/backup_" + \
cfile = public.getServerDir() + "/mdserver-web/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'
'logs': head + "python " + public.getServerDir() + "/mdserver-web/scripts/logs_backup " + param['sname'] + log + " " + str(param['save']),
'rememory': head + "/bin/bash " + public.getServerDir() + '/mdserver-web/scripts/rememory.sh'
}
try:
shell = wheres[stype]
except:

@ -0,0 +1,57 @@
[{
"name":"七牛云存储",
"type":"计划任务",
"ps":"将网站或数据库打包备份到七牛对象存储空间,七牛提供10GB免费存储空间, <a class='link' href='https://portal.qiniu.com/signup?code=3liz7nbopjd5e' target='_blank'>点击申请</a>",
"status":false,
"opt":"qiniu",
"module":"qiniu",
"script":"qiniu",
"help":"http://www.bt.cn/bbs/thread-839-1-1.html",
"key":"access_key|请输入AccessKey|七牛秘钥中的AK",
"secret":"secret_key|请输入SecretKey|七牛秘钥中的SK",
"bucket":"存储空间|请输入对象存储空间名称|七牛对象存储中您创建的空间名称",
"domain":"外链域名|请输入绑定域名或测试域名|绑定的七牛外链域名,若没有则填测试域名",
"check":["/usr/lib/python2.6/site-packages/qiniu/auth.py","/usr/lib/python2.7/site-packages/qiniu/auth.py"]
},{
"name":"阿里云OSS",
"type":"计划任务",
"ps":"将网站或数据库打包备份到阿里云OSS对象存储空间,阿里云OSS提供5GB免费存储空间, <a class='link' href='https://www.aliyun.com/product/oss?spm=5176.8142029.388261.46.psCRgl' target='_blank'>点击申请</a>",
"status":false,
"opt":"alioss",
"module":"oss2",
"script":"alioss",
"help":"http://www.bt.cn/bbs/thread-1061-1-1.html",
"key":"AccessKeyId|请输入AccessKeyId|阿里云的AccessKeyId",
"secret":"AccessKeySecret|请输入AccessKeySecret|阿里云的AccessKeySecret",
"bucket":"Bucket|请输入Bucket名称|阿里云OSS中您创建的Bucket名称",
"domain":"外链域名|请输入Endpoint域名|阿里云OSS外链域名,不包括Bucket名",
"check":["/usr/lib/python2.6/site-packages/oss2/auth.py","/usr/lib/python2.7/site-packages/oss2/auth.py"]
},{
"name":"FTP存储空间",
"type":"计划任务",
"ps":"将网站或数据库打包备份到FTP存储空间.",
"status":false,
"opt":"ftp",
"module":"ftp",
"script":"ftp",
"help":"http://www.bt.cn/bbs",
"key":"Host|请输入主机地址|FTP服务器地址,例:192.168.0.1:21",
"secret":"用户名|请输入登陆用户名|指定FTP用户名",
"bucket":"密码|请输入登陆密码|指定FTP密码",
"domain":"存储位置|请输入存储位置|相对于FTP根目录的路径,如 /backup",
"check":["/www/server/panel/script/backup_ftp.py"]
},{
"name":"申请内测资格",
"type":"其它",
"ps":"申请内测资格,审核完成后将会获得内测版本更新推送,并可在宝塔论坛内测专用版块参与讨论",
"status":false,
"opt":"beta",
"module":"beta",
"script":"beta",
"help":"http://www.bt.cn/bbs/thread-1392-1-1.html",
"key":"",
"secret":"",
"bucket":"",
"domain":"",
"check":["data/beta.pl"]
}]

@ -44,7 +44,6 @@ function getCronData(){
var load = layer.msg(lan.public.the,{icon:16,time:0,shade: [0.3, '#000']});
$.post('/crontab/list', '', function(rdata){
layer.close(load);
console.log(rdata);
var cbody = "";
if(rdata == ""){
cbody="<tr><td colspan='6'>"+lan.crontab.task_empty+"</td></tr>";
@ -231,21 +230,20 @@ function planAdd(){
}
$("#set-Config input[name='save']").val(save);
$("#set-Config input[name='week']").val($(".planweek").find("b").attr("val"));
var sType = $(".planjs").find("b").attr("val");
var sBody = encodeURIComponent($("#implement textarea[name='sBody']").val());
if(sType == 'toFile'){
if($("#viewfile").val() == ''){
layer.msg(lan.crontab.input_file_err,{icon:2});
layer.msg('请选择脚本文件!',{icon:2});
return;
}
}else{
} else {
if(sBody == ''){
$("#implement textarea[name='sBody']").focus();
layer.msg(lan.crontab.input_script_err,{icon:2});
layer.msg('脚本代码不能为空!',{icon:2});
return;
}
}
@ -253,12 +251,12 @@ function planAdd(){
var urladdress = $("#urladdress").val();
if(sType == 'toUrl'){
if(!isURL(urladdress)){
layer.msg(lan.crontab.input_url_err,{icon:2});
layer.msg('URL地址不正确!',{icon:2});
$("implement textarea[name='urladdress']").focus();
return;
}
}
urladdress = encodeURIComponent(urladdress);
// urladdress = encodeURIComponent(urladdress);
$("#set-Config input[name='urladdress']").val(urladdress);
$("#set-Config input[name='sType']").val(sType);
$("#set-Config textarea[name='sBody']").val(decodeURIComponent(sBody));
@ -268,7 +266,6 @@ function planAdd(){
$("#backupTo").val(backupTo);
}
var sName = $("#sName").attr("val");
if(sName == 'backupAll'){
@ -279,16 +276,15 @@ function planAdd(){
dataList.push(tmp);
}
if(dataList.length < 1){
layer.msg(lan.crontab.input_empty_err,{icon:5});
layer.msg('对象列表为空,无法继续!',{icon:5});
return;
}
allAddCrontab(dataList,0,'');
return;
}
$("#set-Config input[name='sName']").val(sName);
layer.msg(lan.public.the_add,{icon:16,time:0,shade: [0.3, '#000']});
layer.msg('正在添加,请稍候...!',{icon:16,time:0,shade: [0.3, '#000']});
var data= $("#set-Config").serialize() + '&sBody='+sBody + '&urladdress=' + urladdress;
$.post('/crontab/add',data,function(rdata){
if(!rdata.status) {
@ -358,7 +354,7 @@ $(".dropdown ul li a").click(function(){
break;
case 'day-n':
closeOpt();
toWhere1(lan.crontab.day);
toWhere1('天');
toHour();
toMinute();
break;
@ -368,12 +364,12 @@ $(".dropdown ul li a").click(function(){
break;
case 'hour-n':
closeOpt();
toWhere1(lan.crontab.hour);
toWhere1('小时');
toMinute();
break;
case 'minute-n':
closeOpt();
toWhere1(lan.crontab.minute);
toWhere1('分钟');
break;
case 'week':
closeOpt();
@ -383,7 +379,7 @@ $(".dropdown ul li a").click(function(){
break;
case 'month':
closeOpt();
toWhere1(lan.crontab.sun);
toWhere1('日');
toHour();
toMinute();
break;
@ -392,27 +388,27 @@ $(".dropdown ul li a").click(function(){
break;
case 'toShell':
toShell();
$(".controls").html(lan.crontab.sbody);
$(".controls").html('脚本内容');
break;
case 'rememory':
rememory();
$(".controls").html(lan.public.msg);
$(".controls").html('提示');
break;
case 'site':
toBackup('sites');
$(".controls").html(lan.crontab.backup_site);
$(".controls").html('备份网站');
break;
case 'database':
toBackup('databases');
$(".controls").html(lan.crontab.backup_database);
$(".controls").html('备份数据库');
break;
case 'logs':
toBackup('logs');
$(".controls").html(lan.crontab.log_site);
$(".controls").html('切割网站');
break;
case 'toUrl':
toUrl();
$(".controls").html(lan.crontab.url_address);
$(".controls").html('URL地址');
break;
}
})
@ -423,20 +419,20 @@ function toBackup(type){
var sMsg = "";
switch(type){
case 'sites':
sMsg = lan.crontab.backup_site;
sMsg = '备份网站';
sType = "sites";
break;
case 'databases':
sMsg = lan.crontab.backup_database;
sMsg = '备份数据库';
sType = "databases";
break;
case 'logs':
sMsg = lan.crontab.backup_log;
sMsg = '切割日志';
sType = "sites";
break;
}
var data='type='+sType
$.post('/crontab?action=GetDataList',data,function(rdata){
$.post('/crontab/get_data_list',data,function(rdata){
$(".planname input[name='name']").attr('readonly','true').css({"background-color":"#f6f6f6","color":"#666"});
var sOpt = "";
if(rdata.data.length == 0){
@ -456,13 +452,12 @@ function toBackup(type){
}
var sBody = '<div class="dropdown pull-left mr20">\
<button class="btn btn-default dropdown-toggle" type="button" id="backdata" data-toggle="dropdown" style="width:auto">\
<b id="sName" val="'+rdata.data[0].name+'">'+rdata.data[0].name+'['+rdata.data[0].ps+']</b> <span class="caret"></span>\
</button>\
<ul class="dropdown-menu" role="menu" aria-labelledby="backdata">\
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="backupAll">'+lan.public.all+'</a></li>\
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="backupAll">所有</a></li>\
'+sOpt+'\
</ul>\
</div>\
@ -487,7 +482,7 @@ function toBackup(type){
if(!sName) return;
$(".planname input[name='name']").val(sMsg+'['+sName+']');
});
});
},'json');
}
@ -496,17 +491,18 @@ function editTaskInfo(id){
layer.msg('正在获取,请稍候...',{icon:16,time:0,shade: [0.3, '#000']});
$.post('/crontab/get_crond_find',{id:id},function(rdata){
layer.closeAll();
// console.log('init:', rdata);
var sTypeName = '',sTypeDom = '',cycleName = '',cycleDom = '',weekName = '',weekDom = '',sNameName ='',sNameDom = '',backupsName = '',backupsDom ='';
obj = {
from:{
id:rdata.id,
name: rdata.name,
type: rdata.type,
type: rdata['type'],
stype: rdata.stype,
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,
@ -519,7 +515,6 @@ function editTaskInfo(id){
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];
@ -538,21 +533,25 @@ function editTaskInfo(id){
}
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){
$.post('/crontab/get_data_list',{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'];
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'];
if(obj.from['backup_to'] == 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();
});
},'json');
}else{
callback();
}
@ -657,6 +656,8 @@ function editTaskInfo(id){
$('.site_list').show();
}
obj.from.minute = $('.minute_create').val();
$('.sName_create').blur(function () {
obj.from.name = $(this).val();
});
@ -736,6 +737,7 @@ function editTaskInfo(id){
obj.from.where1 = '';
obj.from.hour = '';
obj.from.minute = 30;
console.log(obj.from);
break;
case 'week':
$('.week_btn').show();
@ -774,7 +776,7 @@ function editTaskInfo(id){
if(obj.from.type == 'hour-n'){
obj.from.where1 = obj.from.hour;
obj.from.hour = '';
}else if(obj.from.type == 'minute-n'){
} else if(obj.from.type == 'minute-n') {
obj.from.where1 = obj.from.minute;
obj.from.minute = '';
}
@ -807,20 +809,20 @@ function closeOpt(){
function toWeek(){
var mBody = '<div class="dropdown planweek pull-left mr20">\
<button class="btn btn-default dropdown-toggle" type="button" id="excode" data-toggle="dropdown">\
<b val="1">'+lan.crontab.TZZ1+'</b> <span class="caret"></span>\
<b val="1">周一</b> <span class="caret"></span>\
</button>\
<ul class="dropdown-menu" role="menu" aria-labelledby="excode">\
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="1">'+lan.crontab.TZZ1+'</a></li>\
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="2">'+lan.crontab.TZZ2+'</a></li>\
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="3">'+lan.crontab.TZZ3+'</a></li>\
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="4">'+lan.crontab.TZZ4+'</a></li>\
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="5">'+lan.crontab.TZZ5+'</a></li>\
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="6">'+lan.crontab.TZZ6+'</a></li>\
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="0">'+lan.crontab.TZZ7+'</a></li>\
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="1">周一</a></li>\
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="2">周二</a></li>\
<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>\
</div>';
$("#ptime").html(mBody);
getselectname()
getselectname();
}
//指定1
function toWhere1(ix){
@ -834,7 +836,7 @@ function toWhere1(ix){
function toHour(){
var mBody = '<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">'+lan.crontab.hour+'</span>\
<span class="name">小时</span>\
</div>';
$("#ptime").append(mBody);
}
@ -843,7 +845,7 @@ function toHour(){
function toMinute(){
var mBody = '<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">'+lan.crontab.minute+'</span>\
<span class="name">分钟</span>\
</div>';
$("#ptime").append(mBody);

@ -0,0 +1,226 @@
#!/usr/bin/python
# coding: utf-8
#-----------------------------
# 网站备份工具
#-----------------------------
import sys
import os
if sys.platform != 'darwin':
os.chdir('/www/server/mdserver-web')
chdir = os.getcwd()
sys.path.append(chdir + '/class/core')
reload(sys)
sys.setdefaultencoding('utf-8')
import public
import db
import time
class backupTools:
def backupSite(self, name, count):
sql = db.Sql()
path = sql.table('sites').where('name=?', (name,)).getField('path')
startTime = time.time()
if not path:
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
log = u"网站[" + name + "]不存在!"
print(u"★[" + endDate + "] " + log)
print(
"----------------------------------------------------------------------------")
return
backup_path = public.getRootDir() + '/backup/site'
if not os.path.exists(backup_path):
public.execShell("mkdir -p " + backup_path)
filename = backup_path + "/web_" + name + "_" + \
time.strftime('%Y%m%d_%H%M%S', time.localtime()) + '.tar.gz'
public.execShell("cd " + os.path.dirname(path) + " && tar zcvf '" +
filename + "' '" + os.path.basename(path) + "' > /dev/null")
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
print filename
if not os.path.exists(filename):
log = u"网站[" + name + u"]备份失败!"
print(u"★[" + endDate + "] " + log)
print(
u"----------------------------------------------------------------------------")
return
outTime = time.time() - startTime
pid = sql.table('sites').where('name=?', (name,)).getField('id')
sql.table('backup').add('type,name,pid,filename,addtime,size', ('0', os.path.basename(
filename), pid, filename, endDate, os.path.getsize(filename)))
log = u"网站[" + name + u"]备份成功,用时[" + str(round(outTime, 2)) + u"]秒"
public.writeLog(u'计划任务', log)
print(u"★[" + endDate + "] " + log)
print(u"|---保留最新的[" + count + u"]份备份")
print(u"|---文件名:" + filename)
# 清理多余备份
backups = sql.table('backup').where(
'type=? and pid=?', ('0', pid)).field('id,filename').select()
num = len(backups) - int(count)
if num > 0:
for backup in backups:
public.execShell("rm -f " + backup['filename'])
sql.table('backup').where('id=?', (backup['id'],)).delete()
num -= 1
print(u"|---已清理过期备份文件:" + backup['filename'])
if num < 1:
break
def backupDatabase(self, name, count):
sql = db.Sql()
path = sql.table('databases').where('name=?', (name,)).getField('path')
startTime = time.time()
if not path:
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
log = u"数据库[" + name + u"]不存在!"
print(u"★[" + endDate + "] " + log)
print(
u"----------------------------------------------------------------------------")
return
backup_path = public.getRootDir() + '/backup/database'
if not os.path.exists(backup_path):
public.execShell("mkdir -p " + backup_path)
filename = backup_path + "/Db_" + name + "_" + \
time.strftime('%Y%m%d_%H%M%S', time.localtime()) + ".sql.gz"
import re
mysql_root = sql.table('config').where(
"id=?", (1,)).getField('mysql_root')
mycnf = public.readFile('/etc/my.cnf')
rep = "\[mysqldump\]\nuser=root"
sea = "[mysqldump]\n"
subStr = sea + "user=root\npassword=" + mysql_root + "\n"
mycnf = mycnf.replace(sea, subStr)
if len(mycnf) > 100:
public.writeFile('/etc/my.cnf', mycnf)
public.execShell(
"/www/server/mysql/bin/mysqldump --opt --default-character-set=utf8 " + name + " | gzip > " + filename)
if not os.path.exists(filename):
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
log = u"数据库[" + name + u"]备份失败!"
print(u"★[" + endDate + "] " + log)
print(
u"----------------------------------------------------------------------------")
return
mycnf = public.readFile('/etc/my.cnf')
mycnf = mycnf.replace(subStr, sea)
if len(mycnf) > 100:
public.writeFile('/etc/my.cnf', mycnf)
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
outTime = time.time() - startTime
pid = sql.table('databases').where('name=?', (name,)).getField('id')
sql.table('backup').add('type,name,pid,filename,addtime,size', (1, os.path.basename(
filename), pid, filename, endDate, os.path.getsize(filename)))
log = u"数据库[" + name + u"]备份成功,用时[" + str(round(outTime, 2)) + u"]秒"
public.WriteLog(u'计划任务', log)
print("★[" + endDate + "] " + log)
print(u"|---保留最新的[" + count + u"]份备份")
print(u"|---文件名:" + filename)
# 清理多余备份
backups = sql.table('backup').where(
'type=? and pid=?', ('1', pid)).field('id,filename').select()
num = len(backups) - int(count)
if num > 0:
for backup in backups:
public.execShell("rm -f " + backup['filename'])
sql.table('backup').where('id=?', (backup['id'],)).delete()
num -= 1
print(u"|---已清理过期备份文件:" + backup['filename'])
if num < 1:
break
# 备份指定目录
def backupPath(self, path, count):
sql = db.Sql()
startTime = time.time()
if path[-1:] == '/':
path = path[:-1]
name = os.path.basename(path)
backup_path = sql.table('config').where(
"id=?", (1,)).getField('backup_path') + '/path'
if not os.path.exists(backup_path):
os.makedirs(backup_path)
filename = backup_path + "/Path_" + name + "_" + \
time.strftime('%Y%m%d_%H%M%S', time.localtime()) + '.tar.gz'
os.system("cd " + os.path.dirname(path) + " && tar zcvf '" +
filename + "' '" + os.path.basename(path) + "' > /dev/null")
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
if not os.path.exists(filename):
log = u"目录[" + path + "]备份失败"
print(u"★[" + endDate + "] " + log)
print(
u"----------------------------------------------------------------------------")
return
outTime = time.time() - startTime
sql.table('backup').add('type,name,pid,filename,addtime,size',
('2', path, '0', filename, endDate, os.path.getsize(filename)))
log = u"目录[" + path + "]备份成功,用时[" + str(round(outTime, 2)) + "]秒"
public.writeLog(u'计划任务', log)
print(u"★[" + endDate + "] " + log)
print(u"|---保留最新的[" + count + u"]份备份")
print(u"|---文件名:" + filename)
# 清理多余备份
backups = sql.table('backup').where(
'type=? and pid=? and name=?', ('2', 0, path)).field('id,filename').select()
num = len(backups) - int(count)
if num > 0:
for backup in backups:
public.execShell("rm -f " + backup['filename'])
sql.table('backup').where('id=?', (backup['id'],)).delete()
num -= 1
print(u"|---已清理过期备份文件:" + backup['filename'])
if num < 1:
break
def backupSiteAll(self, save):
sites = public.M('sites').field('name').select()
for site in sites:
self.backupSite(site['name'], save)
def backupDatabaseAll(self, save):
databases = public.M('databases').field('name').select()
for database in databases:
self.backupDatabase(database['name'], save)
if __name__ == "__main__":
backup = backupTools()
type = sys.argv[1]
if type == 'site':
if sys.argv[2] == 'ALL':
backup.backupSiteAll(sys.argv[3])
else:
backup.backupSite(sys.argv[2], sys.argv[3])
elif type == 'path':
backup.backupPath(sys.argv[2], sys.argv[3])
elif type == 'database':
if sys.argv[2] == 'ALL':
backup.backupDatabaseAll(sys.argv[3])
else:
backup.backupDatabase(sys.argv[2], sys.argv[3])

@ -0,0 +1,70 @@
#!/usr/bin/python
# coding: utf-8
#-----------------------------
# 网站日志切割脚本
#-----------------------------
import sys
import os
import shutil
import time
import glob
if sys.platform != 'darwin':
os.chdir('/www/server/mdserver-web')
chdir = os.getcwd()
sys.path.append(chdir + '/class/core')
reload(sys)
sys.setdefaultencoding('utf-8')
import public
print('==================================================================')
print('★[' + time.strftime("%Y/%m/%d %H:%M:%S") + '],切割日志')
print('==================================================================')
print('|--当前保留最新的[' + sys.argv[2] + ']份')
logsPath = public.getLogsDir()
px = '.log'
def split_logs(oldFileName, num):
global logsPath
if not os.path.exists(oldFileName):
print('|---' + oldFileName + '文件不存在!')
return
logs = sorted(glob.glob(oldFileName + "_*"))
count = len(logs)
num = count - num
for i in range(count):
if i > num:
break
os.remove(logs[i])
print('|---多余日志[' + logs[i] + ']已删除!')
newFileName = oldFileName + '_' + time.strftime("%Y-%m-%d_%H%M%S") + '.log'
shutil.move(oldFileName, newFileName)
print('|---已切割日志到:' + newFileName)
def split_all(save):
sites = public.M('sites').field('name').select()
for site in sites:
oldFileName = logsPath + site['name'] + px
split_logs(oldFileName, save)
if __name__ == '__main__':
num = int(sys.argv[2])
if sys.argv[1].find('ALL') == 0:
split_all(num)
else:
siteName = sys.argv[1]
if siteName[-4:] == '.log':
siteName = siteName[:-4]
else:
siteName = siteName.replace("-access_log", '')
oldFileName = logsPath + '/' + sys.argv[1]
split_logs(oldFileName, num)
path = public.getServerDir()
os.system("kill -USR1 `cat " + path + "/openresty/nginx/logs/nginx.pid`")

@ -6,71 +6,73 @@ export PATH
#+------------------------------------
endDate=`date +"%Y-%m-%d %H:%M:%S"`
sysName=`uname`
curPath=`pwd`
rootPath=$(dirname "$curPath")
log="释放内存!"
echo "★[$endDate] $log"
echo '----------------------------------------------------------------------------'
if [ -f "/etc/init.d/php-fpm-52" ];then
/etc/init.d/php-fpm-52 reload
fi
if [ -f "/etc/init.d/php-fpm-53" ];then
/etc/init.d/php-fpm-53 reload
if [ $sysName == 'Darwin' ]; then
echo '苹果内存释放!'
else
echo 'do start!'
fi
if [ -f "/etc/init.d/php-fpm-54" ];then
/etc/init.d/php-fpm-54 reload
if [ -f $rootPath"/php/init.d/php52" ];then
$rootPath"/php/init.d/php52" reload
fi
if [ -f "/etc/init.d/php-fpm-55" ];then
/etc/init.d/php-fpm-55 reload
fi
if [ -f "/etc/init.d/php-fpm-56" ];then
/etc/init.d/php-fpm-56 reload
if [ -f $rootPath"/php/init.d/php53" ];then
$rootPath"/php/init.d/php53" reload
fi
if [ -f "/etc/init.d/php-fpm-70" ];then
/etc/init.d/php-fpm-70 reload
if [ -f $rootPath"/php/init.d/php54" ];then
$rootPath"/php/init.d/php54" reload
fi
if [ -f "/etc/init.d/php-fpm-71" ];then
/etc/init.d/php-fpm-71 reload
if [ -f $rootPath"/php/init.d/php55" ];then
$rootPath"/php/init.d/php55" reload
fi
if [ -f "/etc/init.d/php-fpm-72" ];then
/etc/init.d/php-fpm-72 reload
if [ -f $rootPath"/php/init.d/php56" ];then
$rootPath"/php/init.d/php56" reload
fi
if [ -f "/etc/init.d/php-fpm-73" ];then
/etc/init.d/php-fpm-73 reload
if [ -f $rootPath"/php/init.d/php70" ];then
$rootPath"/php/init.d/php70" reload
fi
if [ -f "/etc/init.d/php-fpm-74" ];then
/etc/init.d/php-fpm-74 reload
if [ -f $rootPath"/php/init.d/php71" ];then
$rootPath"/php/init.d/php71" reload
fi
if [ -f "/etc/init.d/mysqld" ];then
/etc/init.d/mysqld reload
if [ -f $rootPath"/php/init.d/php72" ];then
$rootPath"/php/init.d/php72" reload
fi
if [ -f "/etc/init.d/nginx" ];then
/etc/init.d/nginx reload
if [ -f $rootPath"/php/init.d/php73" ];then
$rootPath"/php/init.d/php73" reload
fi
if [ -f "/etc/init.d/httpd" ];then
/etc/init.d/httpd graceful
if [ -f $rootPath"/php/init.d/php74" ];then
$rootPath"/php/init.d/php74" reload
fi
if [ -f "/etc/init.d/pure-ftpd" ];then
pkill -9 pure-ftpd
sleep 0.3
/etc/init.d/pure-ftpd start 2>/dev/null
if [ -f $rootPath"/openresty/nginx/sbin/nginx" ];then
$rootPath"/openresty/nginx/sbin/nginx" -s reload
fi
sync
sleep 2
sync
echo 3 > /proc/sys/vm/drop_caches
if [ $sysName == 'Darwin' ]; then
echo 'done!'
else
echo 3 > /proc/sys/vm/drop_caches
fi
echo '----------------------------------------------------------------------------'
Loading…
Cancel
Save