Merge pull request #775 from midoks/dev

0.18.1
pull/777/head 0.18.1
Mr Chen 2 months ago committed by GitHub
commit da4a61b716
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      plugins/mariadb/info.json
  2. 120
      plugins/mariadb/versions/11.8/install.sh
  3. 35
      scripts/backup.py
  4. 2
      web/admin/crontab/__init__.py
  5. 2
      web/admin/setup/__init__.py
  6. 6
      web/admin/setup/sql/default.sql
  7. 1
      web/core/mw.py
  8. 90
      web/static/app/crontab.js
  9. 6
      web/static/app/public.js
  10. 14
      web/templates/default/crontab.html
  11. 2
      web/thisdb/crontab.py
  12. 17
      web/thisdb/init.py
  13. 23
      web/utils/crontab.py
  14. 2
      web/version.py

@ -9,7 +9,7 @@
"uninstall_pre_inspection":true,
"checks": "server/mariadb",
"path": "server/mariadb",
"versions":["10.6","10.7","10.8","10.9","10.11","11.0","11.1","11.2","11.3","11.4","11.5","11.6","11.7"],
"versions":["10.6","10.7","10.8","10.9","10.11","11.0","11.1","11.2","11.3","11.4","11.5","11.6","11.7","11.8"],
"shell":"install.sh",
"checks":"server/mariadb",
"path":"server/mariadb",

@ -0,0 +1,120 @@
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin
export PATH
#https://dev.mysql.com/downloads/mysql/5.5.html#downloads
#https://dev.mysql.com/downloads/file/?id=480541
curPath=`pwd`
rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath")
sysName=`uname`
mariadbDir=${serverPath}/source/mariadb
MY_VER=11.8.2
Install_app()
{
mkdir -p ${mariadbDir}
echo '正在安装脚本文件...'
if [ "$sysName" != "Darwin" ];then
mkdir -p /var/log/mariadb
touch /var/log/mariadb/mariadb.log
fi
# ----- cpu start ------
if [ -z "${cpuCore}" ]; then
cpuCore="1"
fi
if [ -f /proc/cpuinfo ];then
cpuCore=`cat /proc/cpuinfo | grep "processor" | wc -l`
fi
MEM_INFO=$(free -m|grep Mem|awk '{printf("%.f",($2)/1024)}')
if [ "${cpuCore}" != "1" ] && [ "${MEM_INFO}" != "0" ];then
if [ "${cpuCore}" -gt "${MEM_INFO}" ];then
cpuCore="${MEM_INFO}"
fi
else
cpuCore="1"
fi
if [ "$cpuCore" -gt "2" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'`
else
cpuCore="1"
fi
# ----- cpu end ------
# if [ ! -f ${mariadbDir}/mariadb-${MY_VER}.tar.gz ];then
# wget --no-check-certificate -O ${mariadbDir}/mariadb-${MY_VER}.tar.gz --tries=3 https://mirrors.aliyun.com/mariadb/mariadb-${MY_VER}/source/mariadb-${MY_VER}.tar.gz
# fi
# https://downloads.mariadb.org/interstitial/mariadb-10.9.1/source/mariadb-10.9.1.tar.gz
if [ ! -f ${mariadbDir}/mariadb-${MY_VER}.tar.gz ];then
wget --no-check-certificate -O ${mariadbDir}/mariadb-${MY_VER}.tar.gz --tries=3 https://archive.mariadb.org/mariadb-${MY_VER}/source/mariadb-${MY_VER}.tar.gz
fi
if [ ! -d ${mariadbDir}/mariadb-${MY_VER} ];then
cd ${mariadbDir} && tar -zxvf ${mariadbDir}/mariadb-${MY_VER}.tar.gz
fi
INSTALL_CMD=cmake
# check cmake version
CMAKE_VERSION=`cmake -version | grep version | awk '{print $3}' | awk -F '.' '{print $1}'`
if [ "$CMAKE_VERSION" -eq "2" ];then
mkdir -p /var/log/mariadb
touch /var/log/mariadb/mariadb.log
INSTALL_CMD=cmake3
fi
if [ ! -d $serverPath/mariadb ];then
cd ${mariadbDir}/mariadb-${MY_VER} && ${INSTALL_CMD} \
-DCMAKE_INSTALL_PREFIX=$serverPath/mariadb \
-DMYSQL_DATADIR=$serverPath/mariadb/data/ \
-DMYSQL_USER=mysql \
-DMYSQL_UNIX_ADDR=$serverPath/mariadb/mysql.sock \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DCMAKE_C_COMPILER=/usr/bin/gcc \
-DCMAKE_CXX_COMPILER=/usr/bin/g++
make -j${cpuCore} && make install && make clean
if [ -d $serverPath/mariadb ];then
echo '11.7' > $serverPath/mariadb/version.pl
echo '安装完成'
else
echo '安装失败'
echo 'install fail'>&2
exit 1
fi
fi
if [ -d ${mariadbDir}/mariadb-${MY_VER} ];then
rm -rf ${mariadbDir}/mariadb-${MY_VER}
fi
}
Uninstall_app()
{
rm -rf $serverPath/mariadb
echo '卸载完成'
}
action=$1
if [ "${1}" == 'install' ];then
Install_app
else
Uninstall_app
fi

@ -22,7 +22,9 @@ import core.db as db
class backupTools:
def backupSite(self, name, count):
def backupSite(self, name, count, echo=None):
exclude_dir_cmd = self.makeExcludeDirCmd(echo)
sql = db.Sql()
path = sql.table('sites').where('name=?', (name,)).getField('path')
startTime = time.time()
@ -42,13 +44,13 @@ class backupTools:
time.strftime('%Y%m%d_%H%M%S', time.localtime()) + '.tar.gz'
cmd = "cd " + os.path.dirname(path) + " && tar zcvf '" + \
filename + "' '" + os.path.basename(path) + "' > /dev/null"
filename + "' " + exclude_dir_cmd + " '" + os.path.basename(path) + "' > /dev/null"
# print(cmd)
mw.execShell(cmd)
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
print(filename)
# print(filename)
if not os.path.exists(filename):
log = "网站[" + name + "]备份失败!"
print("★[" + endDate + "] " + log)
@ -218,8 +220,26 @@ class backupTools:
l.append(ff.name)
return l
def backupPath(self, path, count):
def makeExcludeDirCmd(self,echo):
exclude_dirs = []
crontab_list = mw.M('crontab').where('echo=?', (echo,)).field('attr').find()
if crontab_list:
attr = crontab_list['attr']
if attr != "":
ed_arrs = attr.split("\n")
for ed in ed_arrs:
exclude_dirs.append(ed.strip())
cmd = ""
for v in exclude_dirs:
cmd += " --exclude='"+v+"'"
return cmd
def backupPath(self, path, count, echo=None):
exclude_dir_cmd = self.makeExcludeDirCmd(echo)
# print(exclude_dir_cmd)
mw.echoStart('备份')
backup_path = mw.getBackupDir() + '/path'
@ -234,8 +254,9 @@ class backupTools:
p_size = mw.getPathSize(path)
stime = time.time()
cmd = "cd " + os.path.dirname(path) + " && tar zcvf '" + dfile + "' '" + dirname + "' 2>{err_log} 1> /dev/null".format(
cmd = "cd " + os.path.dirname(path) + " && tar zcvf '" + dfile + "' " + exclude_dir_cmd + " '" + dirname + "' 2>{err_log} 1> /dev/null".format(
err_log='/tmp/backup_err.log')
# print(cmd)
mw.execShell(cmd)
tar_size = os.path.getsize(dfile)
@ -269,11 +290,11 @@ if __name__ == "__main__":
if sys.argv[2] == 'ALL':
backup.backupSiteAll(sys.argv[3])
else:
backup.backupSite(sys.argv[2], sys.argv[3])
backup.backupSite(sys.argv[2], sys.argv[3], sys.argv[4])
elif stype == 'database':
if sys.argv[2] == 'ALL':
backup.backupDatabaseAll(sys.argv[3])
else:
backup.backupDatabase(sys.argv[2], sys.argv[3])
elif stype == 'path':
backup.backupPath(sys.argv[2], sys.argv[3])
backup.backupPath(sys.argv[2], sys.argv[3], sys.argv[4])

@ -89,6 +89,7 @@ def modify_crond():
request_data['sname'] = request.form.get('sname', '')
request_data['sbody'] = request.form.get('sbody', '')
request_data['url_address'] = request.form.get('url_address', '')
request_data['attr'] = request.form.get('attr', '')
cron_id = request.form.get('id', '')
data = MwCrontab.instance().modifyCrond(cron_id,request_data)
return data
@ -116,6 +117,7 @@ def add():
request_data['sname'] = request.form.get('sname', '')
request_data['sbody'] = request.form.get('sbody', '')
request_data['url_address'] = request.form.get('url_address', '')
request_data['attr'] = request.form.get('attr', '')
info = thisdb.getCronByName(request_data['name'])
if info is not None:

@ -22,6 +22,7 @@ import thisdb
import config
def init():
# 检查数据库是否存在。如果没有就创建它。
if not os.path.isfile(config.SQLITE_PATH):
# 初始化用户信息
@ -30,6 +31,7 @@ def init():
init_option()
init_db_system()
thisdb.reinstallPanelData()
init_cmd()
init_acme_cron()
# init_cron()

@ -32,12 +32,15 @@ CREATE TABLE IF NOT EXISTS `crontab` (
`backup_to` TEXT DEFAULT 'off',
`sname` TEXT,
`sbody` TEXT,
'stype' TEXT,
`stype` TEXT,
`url_address` TEXT,
`attr` TEXT DEFAULT '',
`add_time` TEXT,
`update_time` TEXT
);
CREATE UNIQUE INDEX crontab_name_idx ON crontab(name);
ALTER TABLE crontab ADD COLUMN attr TEXT DEFAULT '';
CREATE TABLE IF NOT EXISTS `firewall` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
@ -47,7 +50,6 @@ CREATE TABLE IF NOT EXISTS `firewall` (
`add_time` TEXT,
`update_time` TEXT
);
CREATE UNIQUE INDEX firewall_port_idx ON firewall(port);
INSERT INTO `firewall` (`id`, `port`, `protocol`, `ps`, `add_time`, `update_time`) VALUES

@ -2045,7 +2045,6 @@ def echoEnd(tag):
print("=" * 89)
print("{}完成[{}]".format(tag, formatDate()))
print("=" * 89)
print("\n")
def echoInfo(msg):

@ -211,13 +211,13 @@ function planAdd(){
}
$("#cronConfig input[name='name']").val(name);
var type = $(".plancycle").find("b").attr("val");
$("#cronConfig input[name='type']").val(type);
var time_type = $(".plancycle").find("b").attr("val");
$("#cronConfig input[name='type']").val(time_type);
var is1;
var is2 = 1;
switch(type){
switch(time_type){
case 'day-n':
is1=31;
break;
@ -265,10 +265,10 @@ function planAdd(){
$("#cronConfig input[name='save']").val(save);
$("#cronConfig input[name='week']").val($(".planweek").find("b").attr("val"));
var sType = $(".planjs").find("b").attr("val");
var cron_type = $(".planjs").find("b").attr("val");
var sBody = encodeURIComponent($("#implement textarea[name='sbody']").val());
if (sType == 'toShell'){
if (cron_type == 'toShell'){
if(sBody == ''){
$("#implement textarea[name='sbody']").focus();
layer.msg('脚本代码不能为空!',{icon:2});
@ -276,7 +276,7 @@ function planAdd(){
}
}
if(sType == 'toFile'){
if(cron_type == 'toFile'){
if($("#viewfile").val() == ''){
layer.msg('请选择脚本文件!',{icon:2});
return;
@ -284,7 +284,7 @@ function planAdd(){
}
var url_address = $("#url_address").val();
if(sType == 'toUrl'){
if(cron_type == 'toUrl'){
if(!isURL(url_address)){
layer.msg('URL地址不正确!',{icon:2});
$("implement textarea[name='url_address']").focus();
@ -293,16 +293,21 @@ function planAdd(){
}
// url_address = encodeURIComponent(url_address);
$("#cronConfig input[name='url_address']").val(url_address);
$("#cronConfig input[name='stype']").val(sType);
$("#cronConfig input[name='stype']").val(cron_type);
$("#cronConfig textarea[name='sbody']").val(decodeURIComponent(sBody));
if(sType == 'site' || sType == 'database' || sType.indexOf('database_')>-1 || sType == 'path'){
if(cron_type == 'site' || cron_type == 'database' || cron_type.indexOf('database_')>-1 || cron_type == 'path'){
var backupTo = $(".planBackupTo").find("b").attr("val");
$("#backup_to").val(backupTo);
}
if (cron_type=='site' || cron_type=='path'){
var attr = $("#exclude_dir textarea[name='exclude_dir']").val();
$("#attr").val(attr);
}
var sName = $("#sName").attr("val");
$("#cronConfig input[name='sname']").val(sName);
var sname = $("#sname").attr("val");
$("#cronConfig input[name='sname']").val(sname);
// if(sName == 'backupAll'){
// var alist = $("ul[aria-labelledby='backdata'] li a");
@ -319,27 +324,27 @@ function planAdd(){
// return;
// }
if (type == 'minute-n'){
if (time_type == 'minute-n'){
var where1 = $("#ptime input[name='where1']").val();
$("#cronConfig input[name='where1']").val(where1);
}
if (type == 'day-n'){
if (time_type == 'day-n'){
var where1 = $("#ptime input[name='where1']").val();
$("#cronConfig input[name='where1']").val(where1);
}
if (type == 'hour-n'){
if (time_type == 'hour-n'){
var where1 = $("#ptime input[name='where1']").val();
$("#cronConfig input[name='where1']").val(where1);
}
if (type == 'month'){
if (time_type == 'month'){
var where1 = $("#ptime input[name='where1']").val();
$("#cronConfig input[name='where1']").val(where1);
}
if (type == 'week'){
if (time_type == 'week'){
var where1 = $("#ptime input[name='where1']").val();
$("#cronConfig input[name='where1']").val(where1);
}
@ -365,6 +370,7 @@ function planAdd(){
initDropdownMenu();
function initDropdownMenu(){
$(".dropdown ul li a").click(function(){
$('#tag_exclude_dir').hide();
var txt = $(this).text();
var type = $(this).attr("value");
$(this).parents(".dropdown").find("button b").text(txt).attr("val",type);
@ -418,8 +424,14 @@ function initDropdownMenu(){
break;
case 'site':
toBackup('sites');
$('#tag_exclude_dir').show();
$(".controls").html('备份网站');
break;
case 'path':
$('#tag_exclude_dir').show();
toBackup('path');
$(".controls").html('备份目录');
break;
case 'database_mariadb':
case 'database_mongodb':
case 'database_postgresql':
@ -429,10 +441,6 @@ function initDropdownMenu(){
toBackup(type);
$(".controls").html('备份数据库');
break;
case 'path':
toBackup('path');
$(".controls").html('备份目录');
break;
case 'logs':
toLogsHtml('logs');
$(".controls").html('切割网站');
@ -512,7 +520,7 @@ function toLogsHtml(type){
var sBody = '<div class="dropdown pull-left mr20 check">\
<button class="btn btn-default dropdown-toggle sname" 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>\
<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">'+sOpt+'</ul>\
</div>\
@ -526,7 +534,7 @@ function toLogsHtml(type){
getselectname();
$('.changePathDir').click(function(){
changePathCallback($('#sName').val(),function(select_dir){
changePathCallback($('#sname').val(),function(select_dir){
$(".planname input[name='name']").val('备份目录['+select_dir+']');
$('#implement .sname b').attr('val',select_dir).text(select_dir);
});
@ -534,9 +542,9 @@ function toLogsHtml(type){
$(".dropdown ul li a").click(function(){
var sName = $("#sName").attr("val");
if(!sName) return;
$(".planname input[name='name']").val(sMsg+'['+sName+']');
var sname = $("#sname").attr("val");
if(!sname) return;
$(".planname input[name='name']").val(sMsg+'['+sname+']');
});
},'json');
@ -608,7 +616,7 @@ function toBackup(type){
var sBody = '<div class="dropdown pull-left mr20 check">\
<button class="btn btn-default dropdown-toggle sname" 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>\
<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">'+sOpt+'</ul>\
</div>\
@ -639,9 +647,9 @@ function toBackup(type){
$(".dropdown ul li a").click(function(){
var sName = $("#sname").attr("val");
if(!sName) return;
$(".planname input[name='name']").val(sMsg+'['+sName+']');
var sname = $("#sname").attr("val");
if(!sname) return;
$(".planname input[name='name']").val(sMsg+'['+sname+']');
});
},'json');
@ -670,6 +678,7 @@ function editTaskInfo(id){
backup_to: rdata.backup_to,
save: rdata.save,
url_address: rdata.url_address,
attr:rdata.attr,
},
sTypeArray:[['toShell','Shell脚本'],['site','备份网站'],['database','备份数据库'],['logs','日志切割'],['path','备份目录'],['rememory','释放内存'],['toUrl','访问URL']],
cycleArray:[['day','每天'],['day-n','N天'],['hour','每小时'],['hour-n','N小时'],['minute-n','N分钟'],['week','每星期'],['month','每月']],
@ -733,10 +742,13 @@ function editTaskInfo(id){
changeDir = '<span class="glyphicon glyphicon-folder-open cursor mr20 changePathDir" style="float:left;line-height: 30px;"></span>';
}
var exclude_dirs_placeholder = "每行一条规则,目录不能以/结尾示例:\r\n.git \
\r\nstatic/upload \
\r\n*.log";
layer.open({
type:1,
title:'编辑计划任务-['+rdata.name+']',
area: ['850px','440px'],
area: ['900px','440px'],
skin:'layer-create-content',
shadeClose:false,
closeBtn:1,
@ -753,7 +765,7 @@ function editTaskInfo(id){
</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 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>\
@ -806,7 +818,11 @@ function editTaskInfo(id){
</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 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 == "path"||obj.from.stype == "site")?'block;':'none') +'">\
<span class="typename exclude_dir c4 pull-left f14 text-right mr20">排除目录</span>\
<div style="line-height:34px"><textarea class="txtsjs bt-input-text attr_create" name="exclude_dir" placeholder="'+exclude_dirs_placeholder+'">'+ obj.from.attr +'</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>\
@ -845,7 +861,7 @@ function editTaskInfo(id){
obj.from.hour = $('.hour_create').val();
obj.from.where1 = $('.where1_create').val();
$('.sName_create').blur(function () {
$('.sname_create').blur(function () {
obj.from.name = $(this).val();
});
$('.where1_create').blur(function () {
@ -864,9 +880,15 @@ function editTaskInfo(id){
obj.from.save = $(this).val();
});
$('.sBody_create').blur(function () {
$('.sbody_create').blur(function () {
obj.from.sbody = $(this).val();
});
$('.attr_create').blur(function () {
obj.from.attr = $(this).val();
});
$('.url_create').blur(function () {
obj.from.url_address = $(this).val();
});

@ -710,7 +710,7 @@ function onlineEditFile(k, f, callback) {
},'json');
}
var loading = layer.msg('正在读取文件,请稍候...', {icon: 16,time: 0});
function renderBody(callback){
getBody(function(rdata){
if(rdata.status === false){
@ -752,7 +752,7 @@ function onlineEditFile(k, f, callback) {
success:function(layero){
$(layero).hide();
var layer_id = $(layero).attr('id').replace("layui-layer","");
var loading = layer.msg('正在读取文件,请稍候...', {icon: 16,time: 0});
renderBody(function(rdata){
$('#layui-layer-shade'+layer_id).css('opacity',0.3);
$(layero).show();
@ -810,6 +810,8 @@ function onlineEditFile(k, f, callback) {
code_timer = setInterval(function(){
renderBody(function(rdata){
code_mirror.setValue(rdata.data.data);
var scrollInfo = code_mirror.getScrollInfo();
code_mirror.scrollTo(null, scrollInfo.height);
});
},5000);
layer.msg('开启自动刷新成功', {icon: 1,time: 1000});

@ -86,7 +86,18 @@
</div>
<div class="clearfix plan">
<span class="typename controls c4 pull-left f14 text-right mr20">脚本内容</span>
<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 class="clearfix plan" id="tag_exclude_dir" style="display:none;">
<span class="typename exclude_dir c4 pull-left f14 text-right mr20">排除目录</span>
<div id="exclude_dir" style="line-height:34px">
<textarea class="txtsjs bt-input-text" name="exclude_dir" placeholder="每行一条规则,目录不能以/结尾,示例:
.git
static/upload
*.log"></textarea>
</div>
</div>
<div class="clearfix plan">
<div class="bt-submit plan-submit" onclick="planAdd();">添加任务</div>
@ -109,6 +120,7 @@
<input type="text" name="sname" value="" />
<input id="backup_to" type="text" name="backup_to" value="localhost" />
<input id="url_address" type="text" name="url_address" value="" />
<input id="attr" type="text" name="attr" value="" />
<input type="number" name="save" value="" />
<input type="submit" />
</form>

@ -12,7 +12,7 @@ import os
import core.mw as mw
__field = 'id,name,type,where1,where_hour,where_minute,echo,status,save,backup_to,stype,sname,sbody,url_address,add_time,update_time'
__field = 'id,name,type,where1,where_hour,where_minute,echo,status,save,backup_to,stype,sname,sbody,url_address,attr,add_time,update_time'
def addCrontab(data):
now_time = mw.formatDate()

@ -22,6 +22,21 @@ def initPanelData():
if not os.path.exists(sql_file_md5):
mw.writeFile(sql_file_md5, content_md5)
sql = mw.M().dbPos(mw.getPanelDataDir(),'panel')
csql_data = content.split(';')
for i in range(len(csql_data)):
sql.execute(csql_data[i], ())
return True
def reinstallPanelData():
is_reload = False
sql_file = mw.getPanelDir() + '/web/admin/setup/sql/default.sql'
sql_file_md5 = mw.getPanelDir() + '/web/admin/setup/sql/default.md5'
content = mw.readFile(sql_file)
content_md5 = mw.md5(content)
if not os.path.exists(sql_file_md5):
mw.writeFile(sql_file_md5, content_md5)
content_src_md5 = mw.readFile(sql_file)
if content_md5 != content_src_md5:
is_reload = True
@ -35,4 +50,6 @@ def initPanelData():
# print(csql_data[i])
# print(sql.execute(csql_data[i], ()))
sql.execute(csql_data[i], ())
mw.writeFile(sql_file_md5, content_md5)
return True

@ -54,6 +54,7 @@ class crontab(object):
dbdata['sbody'] = data['sbody']
dbdata['stype'] = data['stype']
dbdata['url_address'] = data['url_address']
dbdata['attr'] = data['attr']
if not self.removeForCrond(info['echo']):
return mw.returnData(False, '无法写入文件,是否开启了系统加固功能!')
@ -180,6 +181,7 @@ class crontab(object):
add_dbdata['stype'] = data['stype']
add_dbdata['echo'] = cron_shell
add_dbdata['url_address'] = data['url_address']
add_dbdata['attr'] = data['attr']
tid = thisdb.addCrontab(add_dbdata)
return tid
@ -412,6 +414,12 @@ class crontab(object):
# 取执行脚本
def getShell(self, param):
if not 'echo' in param:
cron_name = mw.md5(mw.md5(str(time.time()) + '_mw'))
else:
cron_name = param['echo']
param['echo'] = cron_name
# try:
stype = param['stype']
if stype == 'toFile':
@ -458,17 +466,16 @@ fi''' % (mw.getPanelDir(),)
stype = 'database'
wheres = {
'path': head + "python3 " + script_dir + "/backup.py path " + param['sname'] + " " + str(param['save']),
'site': head + "python3 " + script_dir + "/backup.py site " + param['sname'] + " " + str(param['save']),
'path': head + "python3 " + script_dir + "/backup.py path " + param['sname'] + " " + str(param['save']) + " " + str(param['echo']),
'site': head + "python3 " + script_dir + "/backup.py site " + param['sname'] + " " + str(param['save']) + " " + str(param['echo']),
'database': head + "python3 " + script_dir + "/backup.py database " + param['sname'] + " " + str(param['save']),
'logs': head + "python3 " + script_dir + "/logs_backup.py " + param['sname'] + log + " " + str(param['save']),
'rememory': head + "/bin/bash " + script_dir + '/rememory.sh'
}
if param['backup_to'] != 'localhost':
cfile = mw.getPluginDir() + "/" + param['backup_to'] + "/index.py"
wheres['path'] = head + "python3 " + cfile + " path " + param['sname'] + " " + str(param['save'])
wheres['site'] = head + "python3 " + cfile + " site " + param['sname'] + " " + str(param['save'])
wheres['path'] = head + "python3 " + cfile + " path " + param['sname'] + " " + str(param['save']) + " " + str(param['echo'])
wheres['site'] = head + "python3 " + cfile + " site " + param['sname'] + " " + str(param['save']) + " " + str(param['echo'])
wheres['database'] = head + "python3 " + cfile + " " + source_stype + " " + param['sname'] + " " + str(param['save'])
try:
shell = wheres[stype]
@ -491,11 +498,9 @@ echo "--------------------------------------------------------------------------
if not os.path.exists(cron_path):
mw.execShell('mkdir -p ' + cron_path)
if not 'echo' in param:
cron_name = mw.md5(mw.md5(str(time.time()) + '_mw'))
else:
cron_name = param['echo']
file = cron_path + '/' + cron_name
# print(shell)
mw.writeFile(file, self.checkScript(shell))
mw.execShell('chmod 750 ' + file)
return cron_name

@ -13,7 +13,7 @@
# 应用程序版本号组件
APP_RELEASE = 0
APP_REVISION = 18
APP_SMALL_VERSION = 0
APP_SMALL_VERSION = 1
# 应用程序版本后缀,例如“beta1”、“dev”。通常为空字符串GA发布
APP_SUFFIX = ''

Loading…
Cancel
Save