diff --git a/class/core/config_api.py b/class/core/config_api.py
index 1eb48f58a..42808a179 100755
--- a/class/core/config_api.py
+++ b/class/core/config_api.py
@@ -15,7 +15,7 @@ from flask import request
class config_api:
- __version = '0.9.11'
+ __version = '0.9.11.1'
def __init__(self):
pass
diff --git a/plugins/clean/index.html b/plugins/clean/index.html
index 23cc972a7..0a6700610 100755
--- a/plugins/clean/index.html
+++ b/plugins/clean/index.html
@@ -3,6 +3,7 @@
@@ -16,7 +17,10 @@ pluginService('clean');
function pRead(){
var readme = '
';
- readme += '- cd /www/server/mdserver-web && python3 /www/server/mdserver-web/plugins/clean/index.py clean
';
+ readme += '- 启动后,假如到计划中[2:30]执行。
';
+ readme += '- 【*】代表要删除。
';
+ readme += '- 添加/删除清除日志,可在`配置修改`中添加/删除。
';
+ readme += '- 如果是目录,会寻找【.log】后缀的文件清空。
';
readme += '
';
$('.soft-man-con').html(readme);
diff --git a/plugins/clean/index.py b/plugins/clean/index.py
index 4d993f6b7..3d2f0e8a6 100755
--- a/plugins/clean/index.py
+++ b/plugins/clean/index.py
@@ -53,34 +53,94 @@ def getArgs():
return tmp
+def getLockFile():
+ return getServerDir() + "/installed_lock.pl"
+
+
+def runLog():
+ return getServerDir() + "/clean.log"
+
+
def status():
- if os.path.exists(getConf()):
+ initConf()
+ if os.path.exists(getLockFile()):
return "start"
return 'stop'
+def initConf():
+ conf = getConf()
+ if not os.path.exists(conf):
+ content = ""
+
+ clog = [
+ "/var/log/cron-*",
+ "/var/log/maillog-*",
+ "/var/log/secure-*",
+ "/var/log/spooler-*",
+ "/var/log/yum.log-*",
+ "/var/log/messages-*",
+ "/var/log/btmp-*",
+ "/var/log/audit/audit.log.*",
+ "/var/log/rhsm/rhsm.log-*",
+ "/var/log/rhsm/rhsmcertd.log-*",
+ "/tmp/yum_save_*",
+ "/tmp/tmp.*",
+ ]
+ for i in clog:
+ content += i + "\n"
+
+ # 常用日志
+ clogcom = [
+ "/var/log/messages",
+ "/var/log/btmp",
+ "/var/log/wtmp",
+ "/var/log/secure",
+ "/var/log/lastlog",
+ "/var/log/cron",
+ ]
+ for i in clogcom:
+ if os.path.exists(i):
+ content += i + "\n"
+
+ # 清理日志
+ rootDir = "/var/log"
+
+ l = os.listdir(rootDir)
+ for x in range(len(l)):
+ abspath = rootDir + "/" + l[x]
+ content += abspath + "\n"
+ mw.writeFile(conf, content)
+
+
def start():
- file = initDreplace()
- data = mw.execShell(file + ' start')
- if data[1] == '':
+ initConf()
+
+ lock_file = getLockFile()
+ if not os.path.exists(lock_file):
+ mw.writeFile(lock_file, "")
+
+ import tool_task
+ tool_task.createBgTask()
return 'ok'
+
return 'fail'
def stop():
- file = initDreplace()
- data = mw.execShell(file + ' stop')
- if data[1] == '':
+ initConf()
+ lock_file = getLockFile()
+ if os.path.exists(lock_file):
+ os.remove(lock_file)
+ import tool_task
+ tool_task.removeBgTask()
return 'ok'
+
return 'fail'
def reload():
- file = initDreplace()
- data = mw.execShell(file + ' reload')
- if data[1] == '':
- return 'ok'
- return 'fail'
+ return 'ok'
def get_filePath_fileName_fileExt(filename):
@@ -93,15 +153,20 @@ def cleanFileLog(path):
filepath, shotname, extension = get_filePath_fileName_fileExt(path)
if extension == ".log":
cmd = "echo \"\" > " + path
+ tmp = mw.execShell(cmd)
+ if tmp[1] != "":
+ cmd += " | error:" + tmp[1].strip()
print(cmd)
- print(mw.execShell(cmd))
def cleanSelfFileLog(path):
filepath, shotname, extension = get_filePath_fileName_fileExt(path)
- cmd = "echo \"\" > " + path
- print(cmd)
- print(mw.execShell(cmd))
+ if extension == ".log":
+ cmd = "echo \"\" > " + path
+ tmp = mw.execShell(cmd)
+ if tmp[1] != "":
+ cmd += " | error:" + tmp[1].strip()
+ print(cmd)
def cleanDirLog(path):
@@ -115,70 +180,28 @@ def cleanDirLog(path):
def cleanLog():
- # 清理日志
- rootDir = "/var/log"
- print("clean start")
-
- clog = [
- "rm -rf /var/log/cron-*",
- "rm -rf /var/log/maillog-*",
- "rm -rf /var/log/secure-*",
- "rm -rf /var/log/spooler-*",
- "rm -rf /var/log/yum.log-*",
- "rm -rf /var/log/messages-*",
- "rm -rf /var/log/btmp-*",
- "rm -rf /var/log/audit/audit.log.*",
- "rm -rf /var/log/rhsm/rhsm.log-*",
- "rm -rf /var/log/rhsm/rhsmcertd.log-*",
- "rm -rf /tmp/yum_save_*",
- "rm -rf /tmp/tmp.*",
- ]
-
- for i in clog:
- print(i)
- mw.execShell(i)
-
- # 常用日志
- clogcom = [
- "/var/log/messages",
- "/var/log/btmp",
- "/var/log/wtmp",
- "/var/log/secure",
- "/var/log/lastlog",
- "/var/log/cron",
- ]
- for i in clogcom:
- if os.path.exists(i):
- mw.execShell("echo \"\" > " + i)
-
- l = os.listdir(rootDir)
- for x in range(len(l)):
- abspath = rootDir + "/" + l[x]
- if os.path.isfile(abspath):
- cleanFileLog(abspath)
-
- if os.path.isdir(abspath):
- cleanDirLog(abspath)
-
- print("conf clean")
-
- confFile = getServerDir()
- # mw.readFile()
- confFile = confFile + "/clean.conf"
- clist = mw.readFile(confFile).strip()
+ conf = getConf()
+ clist = mw.readFile(conf).strip()
clist = clist.split("\n")
for x in clist:
abspath = x.strip()
+
+ if abspath.find('*') > 1:
+ cmd = 'rm -rf ' + abspath
+ print(cmd)
+ data = mw.execShell(cmd)
+ # print(data)
+ continue
+
if os.path.exists(abspath):
if os.path.isfile(abspath):
cleanSelfFileLog(abspath)
+ continue
if os.path.isdir(abspath):
cleanDirLog(abspath)
- print("conf clean end")
-
- print("clean end")
+ continue
if __name__ == "__main__":
func = sys.argv[1]
@@ -194,6 +217,8 @@ if __name__ == "__main__":
print(reload())
elif func == 'conf':
print(getConf())
+ elif func == 'run_log':
+ print(runLog())
elif func == 'clean':
cleanLog()
else:
diff --git a/plugins/clean/install.sh b/plugins/clean/install.sh
index 7d82a8f56..25c89387b 100755
--- a/plugins/clean/install.sh
+++ b/plugins/clean/install.sh
@@ -13,6 +13,10 @@ serverPath=$(dirname "$rootPath")
install_tmp=${rootPath}/tmp/mw_install.pl
VERSION=$2
+if [ -f ${rootPath}/bin/activate ];then
+ source ${rootPath}/bin/activate
+fi
+
Install_app()
{
@@ -21,12 +25,14 @@ Install_app()
echo "" > $serverPath/clean/clean.conf
+ cd ${rootPath} && python3 ${rootPath}/plugins/clean/index.py start
echo "${VERSION}" > $serverPath/clean/version.pl
echo '安装完成' > $install_tmp
}
Uninstall_app()
{
+ cd ${rootPath} && python3 ${rootPath}/plugins/clean/index.py stop
rm -rf $serverPath/clean
echo "Uninstall_clean" > $install_tmp
}
diff --git a/plugins/clean/tool_task.py b/plugins/clean/tool_task.py
new file mode 100644
index 000000000..be7868365
--- /dev/null
+++ b/plugins/clean/tool_task.py
@@ -0,0 +1,154 @@
+# coding:utf-8
+
+import sys
+import io
+import os
+import time
+import json
+
+sys.path.append(os.getcwd() + "/class/core")
+import mw
+
+
+app_debug = False
+if mw.isAppleSystem():
+ app_debug = True
+
+
+def getPluginName():
+ return 'clean'
+
+
+def getPluginDir():
+ return mw.getPluginDir() + '/' + getPluginName()
+
+
+def getServerDir():
+ return mw.getServerDir() + '/' + getPluginName()
+
+
+def getTaskConf():
+ conf = getServerDir() + "/task_config.json"
+ return conf
+
+
+def getConfigData():
+ try:
+ return json.loads(mw.readFile(getTaskConf()))
+ except:
+ pass
+ return []
+
+
+def getConfigTpl():
+ tpl = {
+ "name": "",
+ "task_id": -1,
+ }
+ return tpl
+
+
+def createBgTask():
+ removeBgTask()
+ args = {
+ "period": "day",
+ "hour": "2",
+ "minute": "30",
+ }
+ createBgTaskByName(getPluginName(), args)
+
+
+def createBgTaskByName(name, args):
+ cfg = getConfigTpl()
+ _name = "[勿删]日志清理[" + name + "]"
+ res = mw.M("crontab").field("id, name").where("name=?", (_name,)).find()
+ if res:
+ return True
+
+ if "task_id" in cfg.keys() and cfg["task_id"] > 0:
+ res = mw.M("crontab").field("id, name").where(
+ "id=?", (cfg["task_id"],)).find()
+ if res and res["id"] == cfg["task_id"]:
+ print("计划任务已经存在!")
+ return True
+ import crontab_api
+ api = crontab_api.crontab_api()
+
+ period = args['period']
+ _hour = ''
+ _minute = ''
+ _where1 = ''
+ _type_day = "day"
+ if period == 'day':
+ _type_day = 'day'
+ _hour = args['hour']
+ _minute = args['minute']
+ elif period == 'minute-n':
+ _type_day = 'minute-n'
+ _where1 = args['minute-n']
+ _minute = ''
+
+ cmd = '''
+rname=%s
+plugin_path=%s
+script_path=%s
+logs_file=$plugin_path/${rname}.log
+''' % (name, getServerDir(), getPluginDir())
+ cmd += 'echo "★【`date +"%Y-%m-%d %H:%M:%S"`】 STSRT★" >> $logs_file' + "\n"
+ cmd += 'echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" >> $logs_file' + "\n"
+ cmd += 'echo "python3 $script_path/index.py clean >> $logs_file 2>&1"' + "\n"
+ cmd += 'python3 $script_path/index.py clean >> $logs_file 2>&1' + "\n"
+ cmd += 'echo "【`date +"%Y-%m-%d %H:%M:%S"`】 END★" >> $logs_file' + "\n"
+ cmd += 'echo "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" >> $logs_file' + "\n"
+
+ params = {
+ 'name': _name,
+ 'type': _type_day,
+ 'week': "",
+ 'where1': _where1,
+ 'hour': _hour,
+ 'minute': _minute,
+ 'save': "",
+ 'backup_to': "",
+ 'stype': "toShell",
+ 'sname': '',
+ 'sbody': cmd,
+ 'urladdress': '',
+ }
+
+ task_id = api.add(params)
+ if task_id > 0:
+ cfg["task_id"] = task_id
+ cfg["name"] = name
+
+ _dd = getConfigData()
+ _dd.append(cfg)
+ mw.writeFile(getTaskConf(), json.dumps(_dd))
+
+
+def removeBgTask():
+ cfg_list = getConfigData()
+ for x in range(len(cfg_list)):
+ cfg = cfg_list[x]
+ if "task_id" in cfg.keys() and cfg["task_id"] > 0:
+ res = mw.M("crontab").field("id, name").where(
+ "id=?", (cfg["task_id"],)).find()
+ if res and res["id"] == cfg["task_id"]:
+ import crontab_api
+ api = crontab_api.crontab_api()
+ data = api.delete(cfg["task_id"])
+ if data[0]:
+ cfg["task_id"] = -1
+ cfg_list[x] = cfg
+ mw.writeFile(getTaskConf(), '[]')
+ return True
+ return False
+
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ action = sys.argv[1]
+ if action == "remove":
+ removeBgTask()
+ elif action == "add":
+ createBgTask()
diff --git a/plugins/mysql/bak/index_2022_6_18.py b/plugins/mysql/bak/index_2022_6_18.py
deleted file mode 100755
index 5651a0406..000000000
--- a/plugins/mysql/bak/index_2022_6_18.py
+++ /dev/null
@@ -1,2030 +0,0 @@
-# coding:utf-8
-
-import sys
-import io
-import os
-import time
-import subprocess
-import re
-import json
-
-
-# reload(sys)
-# sys.setdefaultencoding('utf-8')
-
-sys.path.append(os.getcwd() + "/class/core")
-import mw
-
-
-if mw.isAppleSystem():
- cmd = 'ls /usr/local/lib/ | grep python | cut -d \\ -f 1 | awk \'END {print}\''
- info = mw.execShell(cmd)
- p = "/usr/local/lib/" + info[0].strip() + "/site-packages"
- sys.path.append(p)
-
-
-app_debug = False
-if mw.isAppleSystem():
- app_debug = True
-
-
-def getPluginName():
- return 'mysql'
-
-
-def getPluginDir():
- return mw.getPluginDir() + '/' + getPluginName()
-
-sys.path.append(getPluginDir() + "/class")
-import mysqlDb
-
-
-def getServerDir():
- return mw.getServerDir() + '/' + getPluginName()
-
-
-def getInitDFile():
- if app_debug:
- return '/tmp/' + getPluginName()
- return '/etc/init.d/' + getPluginName()
-
-
-def is_number(s):
- try:
- float(s)
- return True
- except ValueError:
- pass
-
- try:
- import unicodedata
- unicodedata.numeric(s)
- return True
- except (TypeError, ValueError):
- pass
-
- return False
-
-
-def getArgs():
- args = sys.argv[2:]
-
- # print(args)
-
- # if is_number(args):
- # args = sys.argv[3:]
-
- tmp = {}
- args_len = len(args)
-
- if args_len == 1:
- t = args[0].strip('{').strip('}')
- t = t.split(':')
- tmp[t[0]] = t[1]
- elif args_len > 1:
- for i in range(len(args)):
- t = args[i].split(':')
- tmp[t[0]] = t[1]
-
- return tmp
-
-
-def checkArgs(data, ck=[]):
- for i in range(len(ck)):
- if not ck[i] in data:
- return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
- return (True, mw.returnJson(True, 'ok'))
-
-
-def getConf():
- path = getServerDir() + '/etc/my.cnf'
- return path
-
-
-def getInitdTpl(version=''):
- path = getPluginDir() + '/init.d/mysql' + version + '.tpl'
- return path
-
-
-def contentReplace(content):
- service_path = mw.getServerDir()
- content = content.replace('{$ROOT_PATH}', mw.getRootDir())
- content = content.replace('{$SERVER_PATH}', service_path)
- content = content.replace('{$SERVER_APP_PATH}', service_path + '/mysql')
- return content
-
-
-def pSqliteDb(dbname='databases'):
- file = getServerDir() + '/mysql.db'
- name = 'mysql'
- if not os.path.exists(file):
- conn = mw.M(dbname).dbPos(getServerDir(), name)
- csql = mw.readFile(getPluginDir() + '/conf/mysql.sql')
- csql_list = csql.split(';')
- for index in range(len(csql_list)):
- conn.execute(csql_list[index], ())
- else:
- # 现有run
- # conn = mw.M(dbname).dbPos(getServerDir(), name)
- # csql = mw.readFile(getPluginDir() + '/conf/mysql.sql')
- # csql_list = csql.split(';')
- # for index in range(len(csql_list)):
- # conn.execute(csql_list[index], ())
- conn = mw.M(dbname).dbPos(getServerDir(), name)
- return conn
-
-
-def pMysqlDb():
- db = mysqlDb.mysqlDb()
- db.__DB_CNF = getConf()
- db.setDbConf(getConf())
- db.setPwd(pSqliteDb('config').where(
- 'id=?', (1,)).getField('mysql_root'))
- return db
-
-
-def initDreplace(version=''):
- initd_tpl = getInitdTpl(version)
-
- initD_path = getServerDir() + '/init.d'
- if not os.path.exists(initD_path):
- os.mkdir(initD_path)
-
- file_bin = initD_path + '/' + getPluginName()
- if not os.path.exists(file_bin):
- content = mw.readFile(initd_tpl)
- content = contentReplace(content)
- mw.writeFile(file_bin, content)
- mw.execShell('chmod +x ' + file_bin)
-
- mysql_conf_dir = getServerDir() + '/etc'
- if not os.path.exists(mysql_conf_dir):
- os.mkdir(mysql_conf_dir)
-
- mysql_conf = mysql_conf_dir + '/my.cnf'
- if not os.path.exists(mysql_conf):
- mysql_conf_tpl = getPluginDir() + '/conf/my' + version + '.cnf'
- content = mw.readFile(mysql_conf_tpl)
- content = contentReplace(content)
- mw.writeFile(mysql_conf, content)
-
- if mw.getOs() != 'darwin':
- mw.execShell('chown -R mysql mysql ' + getServerDir())
- return file_bin
-
-
-def status(version=''):
- data = mw.execShell(
- "ps -ef|grep mysqld |grep -v grep | grep -v python | awk '{print $2}'")
- if data[0] == '':
- return 'stop'
- return 'start'
-
-
-def getDataDir():
- file = getConf()
- content = mw.readFile(file)
- rep = 'datadir\s*=\s*(.*)'
- tmp = re.search(rep, content)
- return tmp.groups()[0].strip()
-
-
-def binLog():
- args = getArgs()
- conf = getConf()
- con = mw.readFile(conf)
-
- if con.find('#log-bin=mysql-bin') != -1:
- if 'status' in args:
- return mw.returnJson(False, '0')
- con = con.replace('#log-bin=mysql-bin', 'log-bin=mysql-bin')
- con = con.replace('#binlog_format=mixed', 'binlog_format=mixed')
- mw.execShell('sync')
- restart()
- else:
- path = getDataDir()
- if 'status' in args:
- dsize = 0
- for n in os.listdir(path):
- if len(n) < 9:
- continue
- if n[0:9] == 'mysql-bin':
- dsize += os.path.getsize(path + '/' + n)
- return mw.returnJson(True, dsize)
- con = con.replace('log-bin=mysql-bin', '#log-bin=mysql-bin')
- con = con.replace('binlog_format=mixed', '#binlog_format=mixed')
- mw.execShell('sync')
- restart()
- mw.execShell('rm -f ' + path + '/mysql-bin.*')
-
- mw.writeFile(conf, con)
- return mw.returnJson(True, '设置成功!')
-
-
-def setSkipGrantTables(v):
- '''
- 设置是否密码验证
- '''
- conf = getConf()
- con = mw.readFile(conf)
- if v:
- if con.find('#skip-grant-tables') != -1:
- con = con.replace('#skip-grant-tables', 'skip-grant-tables')
- else:
- con = con.replace('skip-grant-tables', '#skip-grant-tables')
- mw.writeFile(conf, con)
- return True
-
-
-def getErrorLog():
- args = getArgs()
- path = getDataDir()
- filename = ''
- for n in os.listdir(path):
- if len(n) < 5:
- continue
- if n == 'error.log':
- filename = path + '/' + n
- break
- # print filename
- if not os.path.exists(filename):
- return mw.returnJson(False, '指定文件不存在!')
- if 'close' in args:
- mw.writeFile(filename, '')
- return mw.returnJson(False, '日志已清空')
- info = mw.getNumLines(filename, 18)
- return mw.returnJson(True, 'OK', info)
-
-
-def getShowLogFile():
- file = getConf()
- content = mw.readFile(file)
- rep = 'slow-query-log-file\s*=\s*(.*)'
- tmp = re.search(rep, content)
- return tmp.groups()[0].strip()
-
-
-def pGetDbUser():
- if mw.isAppleSystem():
- user = mw.execShell(
- "who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
- return user
- return 'mysql'
-
-
-def initMysqlData():
- datadir = getDataDir()
- if not os.path.exists(datadir + '/mysql'):
- serverdir = getServerDir()
- user = pGetDbUser()
- cmd = 'cd ' + serverdir + ' && ./scripts/mysql_install_db --user=' + \
- user + ' --basedir=' + serverdir + ' --ldata=' + datadir
- mw.execShell(cmd)
- return 0
- return 1
-
-
-def initMysql57Data():
- datadir = getDataDir()
- if not os.path.exists(datadir + '/mysql'):
- serverdir = getServerDir()
- myconf = serverdir + "/etc/my.cnf"
- user = pGetDbUser()
- cmd = 'cd ' + serverdir + ' && ./bin/mysqld --defaults-file=' + myconf + \
- ' --initialize --explicit_defaults_for_timestamp'
- mw.execShell(cmd)
- return 0
- return 1
-
-
-def initMysql8Data():
- datadir = getDataDir()
- if not os.path.exists(datadir + '/mysql'):
- serverdir = getServerDir()
- user = pGetDbUser()
- cmd = 'cd ' + serverdir + ' && ./bin/mysqld --basedir=' + serverdir + ' --datadir=' + \
- datadir + ' --initialize'
- # print(cmd)
- mw.execShell(cmd)
- return 0
- return 1
-
-
-def initMysqlPwd():
- time.sleep(5)
-
- serverdir = getServerDir()
-
- pwd = mw.getRandomString(16)
- cmd_pass = serverdir + '/bin/mysqladmin -uroot password ' + pwd
- pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
- mw.execShell(cmd_pass)
- return True
-
-
-def mysql8IsInitedPasswd():
-
- serverdir = getServerDir()
- pass_cmd = "cat " + serverdir + \
- "/data/error.log | grep root@localhost | awk -F 'root@localhost:' '{print $2}'"
- passdata = mw.execShell(pass_cmd)
- password = passdata[0].strip()
-
- if len(password) == 0:
- return True
- return False
-
-
-def initMysql8Pwd():
- is_start = False
- for x in range(60):
- data = mw.execShell(
- "ps -ef|grep mysql|grep -v grep|grep -v py|grep -v init.d|awk '{print $2}'")
- if data[0] != "":
- # print("mysql start ok!")
- is_start = True
- break
- time.sleep(0.5)
-
- if not is_start:
- # print("mysql start fail!")
- return False
-
- serverdir = getServerDir()
- pwd = mw.getRandomString(16)
-
- pass_cmd = "cat " + serverdir + \
- "/data/error.log | grep root@localhost | awk -F 'root@localhost:' '{print $2}'"
- passdata = mw.execShell(pass_cmd)
- password = passdata[0].strip()
-
- if len(password) == 0:
- return True
-
- # print('localhost', 3306, 'root', password,
- # "/www/server/mysql/mysql.sock")
-
- # import MySQLdb as mdb
- # dbconn = mdb.connect(host='localhost', port=3306, user='root',
- # passwd=password, unix_socket="/www/server/mysql/mysql.sock")
- # dbconn.autocommit(True)
- # dbcurr = dbconn.cursor()
- # dbcurr.execute('SET NAMES UTF8MB4')
-
- # # with mysql_native_password
- alter_root_pwd = 'flush privileges;'
- alter_root_pwd = alter_root_pwd + \
- "alter user 'root'@'localhost' IDENTIFIED by '" + pwd + "';"
- alter_root_pwd = alter_root_pwd + \
- "alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '" + pwd + "';"
- alter_root_pwd = alter_root_pwd + "flush privileges;"
- # dbcurr.execute(alter_root_pwd)
-
- tmp_file = "/tmp/mysql_init_tmp.log"
- mw.writeFile(tmp_file, alter_root_pwd)
- cmd_pass = serverdir + '/bin/mysql --connect-expired-password -uroot -p"' + \
- password + '" < ' + tmp_file
- # print(cmd_pass)
- data = mw.execShell(cmd_pass)
- if data[1].find("ERROR") != -1:
- # print(data[1])
- pass
- else:
- mw.writeFile(serverdir + "/data/error.log", "")
- os.remove(tmp_file)
-
- pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
-
- return True
-
-
-def myOp(version, method):
- # import commands
- init_file = initDreplace()
- cmd = init_file + ' ' + method
- try:
- initData = initMysqlData()
- subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True,
- bufsize=4096, stderr=subprocess.PIPE)
- if initData == 0:
- initMysqlPwd()
- return 'ok'
- except Exception as e:
- return str(e)
-
-
-def my8cmd(version, method):
- # mysql 8.0 and 5.7 ok
- init_file = initDreplace(version)
- cmd = init_file + ' ' + method
-
- if version == '5.7':
- initMysql57Data()
- elif version == '8.0':
- initMysql8Data()
- try:
-
- if not mysql8IsInitedPasswd():
- setSkipGrantTables(True)
- cmd_init_start = init_file + ' start'
- subprocess.Popen(cmd_init_start, stdout=subprocess.PIPE, shell=True,
- bufsize=4096, stderr=subprocess.PIPE)
-
- time.sleep(6)
- initMysql8Pwd()
-
- cmd_init_stop = init_file + ' stop'
- subprocess.Popen(cmd_init_stop, stdout=subprocess.PIPE, shell=True,
- bufsize=4096, stderr=subprocess.PIPE)
- setSkipGrantTables(False)
-
- time.sleep(3)
- my8cmd(version, method)
- else:
- if method == "stop":
- mw.execShell(cmd)
- mw.execShell(
- "ps -ef|grep mysql|grep -v grep|grep -v py|awk '{print $2}'|xargs kill")
- return "ok"
-
- sub = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True,
- bufsize=4096, stderr=subprocess.PIPE)
- sub.wait(5)
- return 'ok'
- except Exception as e:
- return str(e)
-
- return 'fail'
-
-
-def appCMD(version, action):
- if version == '8.0' or version == '5.7':
- return my8cmd(version, action)
- return myOp(version, action)
-
-
-def start(version=''):
- return appCMD(version, 'start')
-
-
-def stop(version=''):
- return appCMD(version, 'stop')
-
-
-def restart(version=''):
- return appCMD(version, 'restart')
-
-
-def reload(version=''):
- return appCMD(version, 'reload')
-
-
-def initdStatus():
- if not app_debug:
- if mw.isAppleSystem():
- return "Apple Computer does not support"
-
- initd_bin = getInitDFile()
- if os.path.exists(initd_bin):
- return 'ok'
- return 'fail'
-
-
-def initdInstall():
- import shutil
- if not app_debug:
- if mw.isAppleSystem():
- return "Apple Computer does not support"
-
- mysql_bin = initDreplace()
- initd_bin = getInitDFile()
- shutil.copyfile(mysql_bin, initd_bin)
- mw.execShell('chmod +x ' + initd_bin)
- mw.execShell('chkconfig --add ' + getPluginName())
- return 'ok'
-
-
-def initdUinstall():
- if not app_debug:
- if mw.isAppleSystem():
- return "Apple Computer does not support"
- mw.execShell('chkconfig --del ' + getPluginName())
- initd_bin = getInitDFile()
- os.remove(initd_bin)
- return 'ok'
-
-
-def getMyDbPos():
- file = getConf()
- content = mw.readFile(file)
- rep = 'datadir\s*=\s*(.*)'
- tmp = re.search(rep, content)
- return tmp.groups()[0].strip()
-
-
-def setMyDbPos():
- args = getArgs()
- data = checkArgs(args, ['datadir'])
- if not data[0]:
- return data[1]
-
- s_datadir = getMyDbPos()
- t_datadir = args['datadir']
- if t_datadir == s_datadir:
- return mw.returnJson(False, '与当前存储目录相同,无法迁移文件!')
-
- if not os.path.exists(t_datadir):
- mw.execShell('mkdir -p ' + t_datadir)
-
- # mw.execShell('/etc/init.d/mysqld stop')
- stop()
- mw.execShell('cp -rf ' + s_datadir + '/* ' + t_datadir + '/')
- mw.execShell('chown -R mysql mysql ' + t_datadir)
- mw.execShell('chmod -R 755 ' + t_datadir)
- mw.execShell('rm -f ' + t_datadir + '/*.pid')
- mw.execShell('rm -f ' + t_datadir + '/*.err')
-
- path = getServerDir()
- myfile = path + '/etc/my.cnf'
- mycnf = mw.readFile(myfile)
- mw.writeFile(path + '/etc/my_backup.cnf', mycnf)
-
- mycnf = mycnf.replace(s_datadir, t_datadir)
- mw.writeFile(myfile, mycnf)
- start()
-
- result = mw.execShell(
- 'ps aux|grep mysqld| grep -v grep|grep -v python')
- if len(result[0]) > 10:
- mw.writeFile('data/datadir.pl', t_datadir)
- return mw.returnJson(True, '存储目录迁移成功!')
- else:
- mw.execShell('pkill -9 mysqld')
- mw.writeFile(myfile, mw.readFile(path + '/etc/my_backup.cnf'))
- start()
- return mw.returnJson(False, '文件迁移失败!')
-
-
-def getMyPort():
- file = getConf()
- content = mw.readFile(file)
- rep = 'port\s*=\s*(.*)'
- tmp = re.search(rep, content)
- return tmp.groups()[0].strip()
-
-
-def setMyPort():
- args = getArgs()
- data = checkArgs(args, ['port'])
- if not data[0]:
- return data[1]
-
- port = args['port']
- file = getConf()
- content = mw.readFile(file)
- rep = "port\s*=\s*([0-9]+)\s*\n"
- content = re.sub(rep, 'port = ' + port + '\n', content)
- mw.writeFile(file, content)
- restart()
- return mw.returnJson(True, '编辑成功!')
-
-
-def runInfo():
-
- if status(version) == 'stop':
- return mw.returnJson(false, 'MySQL未启动', [])
-
- db = pMysqlDb()
- data = db.query('show global status')
- gets = ['Max_used_connections', 'Com_commit', 'Com_rollback', 'Questions', 'Innodb_buffer_pool_reads', 'Innodb_buffer_pool_read_requests', 'Key_reads', 'Key_read_requests', 'Key_writes',
- 'Key_write_requests', 'Qcache_hits', 'Qcache_inserts', 'Bytes_received', 'Bytes_sent', 'Aborted_clients', 'Aborted_connects',
- 'Created_tmp_disk_tables', 'Created_tmp_tables', 'Innodb_buffer_pool_pages_dirty', 'Opened_files', 'Open_tables', 'Opened_tables', 'Select_full_join',
- 'Select_range_check', 'Sort_merge_passes', 'Table_locks_waited', 'Threads_cached', 'Threads_connected', 'Threads_created', 'Threads_running', 'Connections', 'Uptime']
-
- try:
- # print data
- if data[0] == 1045 or data[0] == 2003:
- pwd = db.getPwd()
- return mw.returnJson(False, 'mysql password error:' + pwd + '!')
- except Exception as e:
- pass
-
- result = {}
-
- # print(data)
-
- for d in data:
- for g in gets:
- if d[0] == g:
- result[g] = d[1]
-
- # print(result, int(result['Uptime']))
- result['Run'] = int(time.time()) - int(result['Uptime'])
- tmp = db.query('show master status')
- try:
- result['File'] = tmp[0][0]
- result['Position'] = tmp[0][1]
- except:
- result['File'] = 'OFF'
- result['Position'] = 'OFF'
- return mw.getJson(result)
-
-
-def myDbStatus():
- result = {}
- db = pMysqlDb()
- data = db.query('show variables')
- isError = isSqlError(data)
- if isError != None:
- return isError
-
- gets = ['table_open_cache', 'thread_cache_size', 'key_buffer_size', 'tmp_table_size', 'max_heap_table_size', 'innodb_buffer_pool_size',
- 'innodb_additional_mem_pool_size', 'innodb_log_buffer_size', 'max_connections', 'sort_buffer_size', 'read_buffer_size', 'read_rnd_buffer_size', 'join_buffer_size', 'thread_stack', 'binlog_cache_size']
- result['mem'] = {}
- for d in data:
- for g in gets:
- if d[0] == g:
- result['mem'][g] = d[1]
- # if result['mem']['query_cache_type'] != 'ON':
- # result['mem']['query_cache_size'] = '0'
- return mw.getJson(result)
-
-
-def setDbStatus():
- gets = ['key_buffer_size', 'tmp_table_size', 'max_heap_table_size', 'innodb_buffer_pool_size', 'innodb_log_buffer_size', 'max_connections',
- 'table_open_cache', 'thread_cache_size', 'sort_buffer_size', 'read_buffer_size', 'read_rnd_buffer_size', 'join_buffer_size', 'thread_stack', 'binlog_cache_size']
- emptys = ['max_connections', 'thread_cache_size', 'table_open_cache']
- args = getArgs()
- conFile = getConf()
- content = mw.readFile(conFile)
- n = 0
- for g in gets:
- s = 'M'
- if n > 5:
- s = 'K'
- if g in emptys:
- s = ''
- rep = '\s*' + g + '\s*=\s*\d+(M|K|k|m|G)?\n'
- c = g + ' = ' + args[g] + s + '\n'
- if content.find(g) != -1:
- content = re.sub(rep, '\n' + c, content, 1)
- else:
- content = content.replace('[mysqld]\n', '[mysqld]\n' + c)
- n += 1
- mw.writeFile(conFile, content)
- return mw.returnJson(True, '设置成功!')
-
-
-def isSqlError(mysqlMsg):
- # 检测数据库执行错误
- mysqlMsg = str(mysqlMsg)
- if "MySQLdb" in mysqlMsg:
- return mw.returnJson(False, 'MySQLdb组件缺失!
进入SSH命令行输入: pip install mysql-python')
- if "2002," in mysqlMsg:
- return mw.returnJson(False, '数据库连接失败,请检查数据库服务是否启动!')
- if "2003," in mysqlMsg:
- return mw.returnJson(False, "Can't connect to MySQL server on '127.0.0.1' (61)")
- if "using password:" in mysqlMsg:
- return mw.returnJson(False, '数据库管理密码错误!')
- if "Connection refused" in mysqlMsg:
- return mw.returnJson(False, '数据库连接失败,请检查数据库服务是否启动!')
- if "1133" in mysqlMsg:
- return mw.returnJson(False, '数据库用户不存在!')
- if "1007" in mysqlMsg:
- return mw.returnJson(False, '数据库已经存在!')
- return None
-
-
-def mapToList(map_obj):
- # map to list
- try:
- if type(map_obj) != list and type(map_obj) != str:
- map_obj = list(map_obj)
- return map_obj
- except:
- return []
-
-
-def __createUser(dbname, username, password, address):
- pdb = pMysqlDb()
-
- if username == 'root':
- dbname = '*'
-
- pdb.execute(
- "CREATE USER `%s`@`localhost` IDENTIFIED BY '%s'" % (username, password))
- pdb.execute(
- "grant all privileges on %s.* to `%s`@`localhost`" % (dbname, username))
- for a in address.split(','):
- pdb.execute(
- "CREATE USER `%s`@`%s` IDENTIFIED BY '%s'" % (username, a, password))
- pdb.execute(
- "grant all privileges on %s.* to `%s`@`%s`" % (dbname, username, a))
- pdb.execute("flush privileges")
-
-
-def getDbBackupListFunc(dbname=''):
- bkDir = mw.getRootDir() + '/backup/database'
- blist = os.listdir(bkDir)
- r = []
-
- bname = 'db_' + dbname
- blen = len(bname)
- for x in blist:
- fbstr = x[0:blen]
- if fbstr == bname:
- r.append(x)
- return r
-
-
-def setDbBackup():
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- scDir = mw.getRunDir() + '/scripts/backup.py'
-
- cmd = 'python ' + scDir + ' database ' + args['name'] + ' 3'
- os.system(cmd)
- return mw.returnJson(True, 'ok')
-
-
-def importDbBackup():
- args = getArgs()
- data = checkArgs(args, ['file', 'name'])
- if not data[0]:
- return data[1]
-
- file = args['file']
- name = args['name']
-
- file_path = mw.getRootDir() + '/backup/database/' + file
- file_path_sql = mw.getRootDir() + '/backup/database/' + file.replace('.gz', '')
-
- if not os.path.exists(file_path_sql):
- cmd = 'cd ' + mw.getRootDir() + '/backup/database && gzip -d ' + file
- mw.execShell(cmd)
-
- pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
-
- mysql_cmd = mw.getRootDir() + '/server/mysql/bin/mysql -uroot -p' + pwd + \
- ' ' + name + ' < ' + file_path_sql
-
- # print(mysql_cmd)
- os.system(mysql_cmd)
- return mw.returnJson(True, 'ok')
-
-
-def deleteDbBackup():
- args = getArgs()
- data = checkArgs(args, ['filename'])
- if not data[0]:
- return data[1]
-
- bkDir = mw.getRootDir() + '/backup/database'
-
- os.remove(bkDir + '/' + args['filename'])
- return mw.returnJson(True, 'ok')
-
-
-def getDbBackupList():
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- r = getDbBackupListFunc(args['name'])
- bkDir = mw.getRootDir() + '/backup/database'
- rr = []
- for x in range(0, len(r)):
- p = bkDir + '/' + r[x]
- data = {}
- data['name'] = r[x]
-
- rsize = os.path.getsize(p)
- data['size'] = mw.toSize(rsize)
-
- t = os.path.getctime(p)
- t = time.localtime(t)
-
- data['time'] = time.strftime('%Y-%m-%d %H:%M:%S', t)
- rr.append(data)
-
- data['file'] = p
-
- return mw.returnJson(True, 'ok', rr)
-
-
-def getDbList():
- args = getArgs()
- page = 1
- page_size = 10
- search = ''
- data = {}
- if 'page' in args:
- page = int(args['page'])
-
- if 'page_size' in args:
- page_size = int(args['page_size'])
-
- if 'search' in args:
- search = args['search']
-
- conn = pSqliteDb('databases')
- limit = str((page - 1) * page_size) + ',' + str(page_size)
- condition = ''
- if not search == '':
- condition = "name like '%" + search + "%'"
- field = 'id,pid,name,username,password,accept,ps,addtime'
- clist = conn.where(condition, ()).field(
- field).limit(limit).order('id desc').select()
-
- for x in range(0, len(clist)):
- dbname = clist[x]['name']
- blist = getDbBackupListFunc(dbname)
- # print(blist)
- clist[x]['is_backup'] = False
- if len(blist) > 0:
- clist[x]['is_backup'] = True
-
- count = conn.where(condition, ()).count()
- _page = {}
- _page['count'] = count
- _page['p'] = page
- _page['row'] = page_size
- _page['tojs'] = 'dbList'
- data['page'] = mw.getPage(_page)
- data['data'] = clist
-
- info = {}
- info['root_pwd'] = pSqliteDb('config').where(
- 'id=?', (1,)).getField('mysql_root')
- data['info'] = info
-
- return mw.getJson(data)
-
-
-def syncGetDatabases():
- pdb = pMysqlDb()
- psdb = pSqliteDb('databases')
- data = pdb.query('show databases')
- isError = isSqlError(data)
- if isError != None:
- return isError
- users = pdb.query(
- "select User,Host from mysql.user where User!='root' AND Host!='localhost' AND Host!=''")
- nameArr = ['information_schema', 'performance_schema', 'mysql', 'sys']
- n = 0
- for value in data:
- b = False
- for key in nameArr:
- if value[0] == key:
- b = True
- break
- if b:
- continue
- if psdb.where("name=?", (value[0],)).count():
- continue
- host = '127.0.0.1'
- for user in users:
- if value[0] == user[0]:
- host = user[1]
- break
-
- ps = mw.getMsg('INPUT_PS')
- if value[0] == 'test':
- ps = mw.getMsg('DATABASE_TEST')
- addTime = time.strftime('%Y-%m-%d %X', time.localtime())
- if psdb.add('name,username,password,accept,ps,addtime', (value[0], value[0], '', host, ps, addTime)):
- n += 1
-
- msg = mw.getInfo('本次共从服务器获取了{1}个数据库!', (str(n),))
- return mw.returnJson(True, msg)
-
-
-def toDbBase(find):
- pdb = pMysqlDb()
- psdb = pSqliteDb('databases')
- if len(find['password']) < 3:
- find['username'] = find['name']
- find['password'] = mw.md5(str(time.time()) + find['name'])[0:10]
- psdb.where("id=?", (find['id'],)).save(
- 'password,username', (find['password'], find['username']))
-
- result = pdb.execute("create database `" + find['name'] + "`")
- if "using password:" in str(result):
- return -1
- if "Connection refused" in str(result):
- return -1
-
- password = find['password']
- __createUser(find['name'], find['username'], password, find['accept'])
- return 1
-
-
-def syncToDatabases():
- args = getArgs()
- data = checkArgs(args, ['type', 'ids'])
- if not data[0]:
- return data[1]
-
- pdb = pMysqlDb()
- result = pdb.execute("show databases")
- isError = isSqlError(result)
- if isError:
- return isError
-
- stype = int(args['type'])
- psdb = pSqliteDb('databases')
- n = 0
-
- if stype == 0:
- data = psdb.field('id,name,username,password,accept').select()
- for value in data:
- result = toDbBase(value)
- if result == 1:
- n += 1
- else:
- data = json.loads(args['ids'])
- for value in data:
- find = psdb.where("id=?", (value,)).field(
- 'id,name,username,password,accept').find()
- # print find
- result = toDbBase(find)
- if result == 1:
- n += 1
- msg = mw.getInfo('本次共同步了{1}个数据库!', (str(n),))
- return mw.returnJson(True, msg)
-
-
-def setRootPwd():
- args = getArgs()
- data = checkArgs(args, ['password'])
- if not data[0]:
- return data[1]
-
- password = args['password']
- try:
- pdb = pMysqlDb()
- result = pdb.query("show databases")
- isError = isSqlError(result)
- if isError != None:
- return isError
-
- m_version = mw.readFile(getServerDir() + '/version.pl')
- if m_version.find('5.7') == 0 or m_version.find('8.0') == 0:
- pdb.execute(
- "UPDATE mysql.user SET authentication_string='' WHERE user='root'")
- pdb.execute(
- "ALTER USER 'root'@'localhost' IDENTIFIED BY '%s'" % password)
- pdb.execute(
- "ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY '%s'" % password)
- else:
- result = pdb.execute(
- "update mysql.user set Password=password('" + password + "') where User='root'")
- pdb.execute("flush privileges")
- pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,))
- return mw.returnJson(True, '数据库root密码修改成功!')
- except Exception as ex:
- return mw.returnJson(False, '修改错误:' + str(ex))
-
-
-def setUserPwd():
- args = getArgs()
- data = checkArgs(args, ['password', 'name'])
- if not data[0]:
- return data[1]
-
- newpassword = args['password']
- username = args['name']
- id = args['id']
- try:
- pdb = pMysqlDb()
- psdb = pSqliteDb('databases')
- name = psdb.where('id=?', (id,)).getField('name')
-
- m_version = mw.readFile(getServerDir() + '/version.pl')
- if m_version.find('5.7') == 0 or m_version.find('8.0') == 0:
- tmp = pdb.query(
- "select Host from mysql.user where User='" + name + "' AND Host!='localhost'")
- accept = mapToList(tmp)
- pdb.execute(
- "update mysql.user set authentication_string='' where User='" + username + "'")
- result = pdb.execute(
- "ALTER USER `%s`@`localhost` IDENTIFIED BY '%s'" % (username, newpassword))
- for my_host in accept:
- pdb.execute("ALTER USER `%s`@`%s` IDENTIFIED BY '%s'" % (
- username, my_host[0], newpassword))
- else:
- result = pdb.execute("update mysql.user set Password=password('" +
- newpassword + "') where User='" + username + "'")
- isError = isSqlError(result)
- if isError != None:
- return isError
- pdb.execute("flush privileges")
- psdb.where("id=?", (id,)).setField('password', newpassword)
- return mw.returnJson(True, mw.getInfo('修改数据库[{1}]密码成功!', (name,)))
- except Exception as ex:
- # print str(ex)
- return mw.returnJson(False, mw.getInfo('修改数据库[{1}]密码失败!', (name,)))
-
-
-def setDbPs():
- args = getArgs()
- data = checkArgs(args, ['id', 'name', 'ps'])
- if not data[0]:
- return data[1]
-
- ps = args['ps']
- sid = args['id']
- name = args['name']
- try:
- psdb = pSqliteDb('databases')
- psdb.where("id=?", (sid,)).setField('ps', ps)
- return mw.returnJson(True, mw.getInfo('修改数据库[{1}]备注成功!', (name,)))
- except Exception as e:
- return mw.returnJson(True, mw.getInfo('修改数据库[{1}]备注失败!', (name,)))
-
-
-def addDb():
- args = getArgs()
- data = checkArgs(args,
- ['password', 'name', 'codeing', 'db_user', 'dataAccess', 'ps'])
- if not data[0]:
- return data[1]
-
- if not 'address' in args:
- address = ''
- else:
- address = args['address'].strip()
-
- dbname = args['name'].strip()
- dbuser = args['db_user'].strip()
- codeing = args['codeing'].strip()
- password = args['password'].strip()
- dataAccess = args['dataAccess'].strip()
- ps = args['ps'].strip()
-
- reg = "^[\w\.-]+$"
- if not re.match(reg, args['name']):
- return mw.returnJson(False, '数据库名称不能带有特殊符号!')
- checks = ['root', 'mysql', 'test', 'sys', 'panel_logs']
- if dbuser in checks or len(dbuser) < 1:
- return mw.returnJson(False, '数据库用户名不合法!')
- if dbname in checks or len(dbname) < 1:
- return mw.returnJson(False, '数据库名称不合法!')
-
- if len(password) < 1:
- password = mw.md5(time.time())[0:8]
-
- wheres = {
- 'utf8': 'utf8_general_ci',
- 'utf8mb4': 'utf8mb4_general_ci',
- 'gbk': 'gbk_chinese_ci',
- 'big5': 'big5_chinese_ci'
- }
- codeStr = wheres[codeing]
-
- pdb = pMysqlDb()
- psdb = pSqliteDb('databases')
-
- if psdb.where("name=? or username=?", (dbname, dbuser)).count():
- return mw.returnJson(False, '数据库已存在!')
-
- result = pdb.execute("create database `" + dbname +
- "` DEFAULT CHARACTER SET " + codeing + " COLLATE " + codeStr)
- # print result
- isError = isSqlError(result)
- if isError != None:
- return isError
-
- pdb.execute("drop user '" + dbuser + "'@'localhost'")
- for a in address.split(','):
- pdb.execute("drop user '" + dbuser + "'@'" + a + "'")
-
- __createUser(dbname, dbuser, password, address)
-
- addTime = time.strftime('%Y-%m-%d %X', time.localtime())
- psdb.add('pid,name,username,password,accept,ps,addtime',
- (0, dbname, dbuser, password, address, ps, addTime))
- return mw.returnJson(True, '添加成功!')
-
-
-def delDb():
- args = getArgs()
- data = checkArgs(args, ['id', 'name'])
- if not data[0]:
- return data[1]
- try:
- id = args['id']
- name = args['name']
- psdb = pSqliteDb('databases')
- pdb = pMysqlDb()
- find = psdb.where("id=?", (id,)).field(
- 'id,pid,name,username,password,accept,ps,addtime').find()
- accept = find['accept']
- username = find['username']
-
- # 删除MYSQL
- result = pdb.execute("drop database `" + name + "`")
- isError = isSqlError(result)
- if isError != None:
- return isError
-
- users = pdb.query(
- "select Host from mysql.user where User='" + username + "' AND Host!='localhost'")
- pdb.execute("drop user '" + username + "'@'localhost'")
- for us in users:
- pdb.execute("drop user '" + username + "'@'" + us[0] + "'")
- pdb.execute("flush privileges")
-
- # 删除SQLITE
- psdb.where("id=?", (id,)).delete()
- return mw.returnJson(True, '删除成功!')
- except Exception as ex:
- return mw.returnJson(False, '删除失败!' + str(ex))
-
-
-def getDbAccess():
- args = getArgs()
- data = checkArgs(args, ['username'])
- if not data[0]:
- return data[1]
- username = args['username']
- pdb = pMysqlDb()
-
- users = pdb.query("select Host from mysql.user where User='" +
- username + "' AND Host!='localhost'")
- isError = isSqlError(users)
- if isError != None:
- return isError
-
- users = mapToList(users)
- if len(users) < 1:
- return mw.returnJson(True, "127.0.0.1")
- accs = []
- for c in users:
- accs.append(c[0])
- userStr = ','.join(accs)
- return mw.returnJson(True, userStr)
-
-
-def toSize(size):
- d = ('b', 'KB', 'MB', 'GB', 'TB')
- s = d[0]
- for b in d:
- if size < 1024:
- return str(size) + ' ' + b
- size = size / 1024
- s = b
- _size = round(size, 2)
- # print(size, _size)
- return str(size) + ' ' + b
-
-
-def setDbAccess():
- args = getArgs()
- data = checkArgs(args, ['username', 'access'])
- if not data[0]:
- return data[1]
- name = args['username']
- access = args['access']
- pdb = pMysqlDb()
- psdb = pSqliteDb('databases')
-
- dbname = psdb.where('username=?', (name,)).getField('name')
-
- if name == 'root':
- password = pSqliteDb('config').where(
- 'id=?', (1,)).getField('mysql_root')
- else:
- password = psdb.where("username=?", (name,)).getField('password')
- users = pdb.query("select Host from mysql.user where User='" +
- name + "' AND Host!='localhost'")
- for us in users:
- pdb.execute("drop user '" + name + "'@'" + us[0] + "'")
-
- __createUser(dbname, name, password, access)
-
- psdb.where('username=?', (name,)).save('accept', (access,))
- return mw.returnJson(True, '设置成功!')
-
-
-def getDbInfo():
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- db_name = args['name']
- pdb = pMysqlDb()
- # print 'show tables from `%s`' % db_name
- table_res = pdb.query('show tables from `%s`' % db_name)
- isError = isSqlError(table_res)
- if isError != None:
- return isError
-
- tables = mapToList(table_res)
-
- ret = {}
- if type(tables) == list:
- try:
- data = mapToList(pdb.query(
- "select sum(DATA_LENGTH)+sum(INDEX_LENGTH) from information_schema.tables where table_schema='%s'" % db_name))[0][0]
- except:
- data = 0
-
- if not data:
- data = 0
- ret['data_size'] = mw.toSize(data)
- # print ret
- ret['database'] = db_name
-
- ret3 = []
-
- for i in tables:
- if i == 1049:
- return mw.returnJson(False, '指定数据库不存在!')
- table = mapToList(
- pdb.query("show table status from `%s` where name = '%s'" % (db_name, i[0])))
- if not table:
- continue
- try:
- ret2 = {}
- ret2['type'] = table[0][1]
- ret2['rows_count'] = table[0][4]
- ret2['collation'] = table[0][14]
- data_size = table[0][6] + table[0][8]
- ret2['data_byte'] = data_size
- ret2['data_size'] = mw.toSize(data_size)
- ret2['table_name'] = i[0]
- ret3.append(ret2)
- except:
- continue
- ret['tables'] = (ret3)
-
- return mw.getJson(ret)
-
-
-def repairTable():
- args = getArgs()
- data = checkArgs(args, ['db_name', 'tables'])
- if not data[0]:
- return data[1]
-
- db_name = args['db_name']
- tables = json.loads(args['tables'])
- pdb = pMysqlDb()
- mysql_table = mapToList(pdb.query('show tables from `%s`' % db_name))
- ret = []
- if type(mysql_table) == list:
- if len(mysql_table) > 0:
- for i in mysql_table:
- for i2 in tables:
- if i2 == i[0]:
- ret.append(i2)
- if len(ret) > 0:
- for i in ret:
- pdb.execute('REPAIR TABLE `%s`.`%s`' % (db_name, i))
- return mw.returnJson(True, "修复完成!")
- return mw.returnJson(False, "修复失败!")
-
-
-def optTable():
- args = getArgs()
- data = checkArgs(args, ['db_name', 'tables'])
- if not data[0]:
- return data[1]
-
- db_name = args['db_name']
- tables = json.loads(args['tables'])
- pdb = pMysqlDb()
- mysql_table = mapToList(pdb.query('show tables from `%s`' % db_name))
- ret = []
- if type(mysql_table) == list:
- if len(mysql_table) > 0:
- for i in mysql_table:
- for i2 in tables:
- if i2 == i[0]:
- ret.append(i2)
- if len(ret) > 0:
- for i in ret:
- pdb.execute('OPTIMIZE TABLE `%s`.`%s`' % (db_name, i))
- return mw.returnJson(True, "优化成功!")
- return mw.returnJson(False, "优化失败或者已经优化过了!")
-
-
-def alterTable():
- args = getArgs()
- data = checkArgs(args, ['db_name', 'tables'])
- if not data[0]:
- return data[1]
-
- db_name = args['db_name']
- tables = json.loads(args['tables'])
- table_type = args['table_type']
- pdb = pMysqlDb()
- mysql_table = mapToList(pdb.query('show tables from `%s`' % db_name))
- ret = []
- if type(mysql_table) == list:
- if len(mysql_table) > 0:
- for i in mysql_table:
- for i2 in tables:
- if i2 == i[0]:
- ret.append(i2)
- if len(ret) > 0:
- for i in ret:
- pdb.execute('alter table `%s`.`%s` ENGINE=`%s`' %
- (db_name, i, table_type))
- return mw.returnJson(True, "更改成功!")
- return mw.returnJson(False, "更改失败!")
-
-
-def getTotalStatistics():
- st = status()
- data = {}
-
- isInstall = os.path.exists(getServerDir() + '/version.pl')
-
- if st == 'start' and isInstall:
- data['status'] = True
- data['count'] = pSqliteDb('databases').count()
- data['ver'] = mw.readFile(getServerDir() + '/version.pl').strip()
- return mw.returnJson(True, 'ok', data)
- else:
- data['status'] = False
- data['count'] = 0
- return mw.returnJson(False, 'fail', data)
-
-
-def findBinlogDoDb():
- conf = getConf()
- con = mw.readFile(conf)
- rep = r"binlog-do-db\s*?=\s*?(.*)"
- dodb = re.findall(rep, con, re.M)
- return dodb
-
-
-def findBinlogSlaveDoDb():
- conf = getConf()
- con = mw.readFile(conf)
- rep = r"replicate-do-db\s*?=\s*?(.*)"
- dodb = re.findall(rep, con, re.M)
- return dodb
-
-
-def getMasterDbList(version=''):
- args = getArgs()
- page = 1
- page_size = 10
- search = ''
- data = {}
- if 'page' in args:
- page = int(args['page'])
-
- if 'page_size' in args:
- page_size = int(args['page_size'])
-
- if 'search' in args:
- search = args['search']
-
- conn = pSqliteDb('databases')
- limit = str((page - 1) * page_size) + ',' + str(page_size)
- condition = ''
- dodb = findBinlogDoDb()
- data['dodb'] = dodb
-
- slave_dodb = findBinlogSlaveDoDb()
-
- if not search == '':
- condition = "name like '%" + search + "%'"
- field = 'id,pid,name,username,password,accept,ps,addtime'
- clist = conn.where(condition, ()).field(
- field).limit(limit).order('id desc').select()
- count = conn.where(condition, ()).count()
-
- for x in range(0, len(clist)):
- if clist[x]['name'] in dodb:
- clist[x]['master'] = 1
- else:
- clist[x]['master'] = 0
-
- if clist[x]['name'] in slave_dodb:
- clist[x]['slave'] = 1
- else:
- clist[x]['slave'] = 0
-
- _page = {}
- _page['count'] = count
- _page['p'] = page
- _page['row'] = page_size
- _page['tojs'] = 'dbList'
- data['page'] = mw.getPage(_page)
- data['data'] = clist
-
- return mw.getJson(data)
-
-
-def setDbMaster(version):
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- conf = getConf()
- con = mw.readFile(conf)
- rep = r"(binlog-do-db\s*?=\s*?(.*))"
- dodb = re.findall(rep, con, re.M)
-
- isHas = False
- for x in range(0, len(dodb)):
-
- if dodb[x][1] == args['name']:
- isHas = True
-
- con = con.replace(dodb[x][0] + "\n", '')
- mw.writeFile(conf, con)
-
- if not isHas:
- prefix = '#binlog-do-db'
- con = con.replace(
- prefix, prefix + "\nbinlog-do-db=" + args['name'])
- mw.writeFile(conf, con)
-
- restart(version)
- time.sleep(4)
- return mw.returnJson(True, '设置成功', [args, dodb])
-
-
-def setDbSlave(version):
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- conf = getConf()
- con = mw.readFile(conf)
- rep = r"(replicate-do-db\s*?=\s*?(.*))"
- dodb = re.findall(rep, con, re.M)
-
- isHas = False
- for x in range(0, len(dodb)):
- if dodb[x][1] == args['name']:
- isHas = True
-
- con = con.replace(dodb[x][0] + "\n", '')
- mw.writeFile(conf, con)
-
- if not isHas:
- prefix = '#replicate-do-db'
- con = con.replace(
- prefix, prefix + "\nreplicate-do-db=" + args['name'])
- mw.writeFile(conf, con)
-
- restart(version)
- time.sleep(4)
- return mw.returnJson(True, '设置成功', [args, dodb])
-
-
-def getMasterStatus(version=''):
-
- if status(version) == 'stop':
- return mw.returnJson(false, 'MySQL未启动,或正在启动中...!', [])
-
- conf = getConf()
- con = mw.readFile(conf)
- master_status = False
- if con.find('#log-bin') == -1 and con.find('log-bin') > 1:
- dodb = findBinlogDoDb()
- if len(dodb) > 0:
- master_status = True
- data = {}
- data['status'] = master_status
-
- db = pMysqlDb()
- dlist = db.query('show slave status')
- # print(dlist, len(dlist))
- if len(dlist) > 0 and (dlist[0][10] == 'Yes' or dlist[0][11] == 'Yes'):
- data['slave_status'] = True
-
- return mw.returnJson(master_status, '设置成功', data)
-
-
-def setMasterStatus(version=''):
-
- conf = getConf()
- con = mw.readFile(conf)
-
- if con.find('#log-bin') != -1:
- return mw.returnJson(False, '必须开启二进制日志')
-
- sign = 'mdserver_ms_open'
-
- dodb = findBinlogDoDb()
- if not sign in dodb:
- prefix = '#binlog-do-db'
- con = con.replace(prefix, prefix + "\nbinlog-do-db=" + sign)
- mw.writeFile(conf, con)
- else:
- con = con.replace("binlog-do-db=" + sign + "\n", '')
- rep = r"(binlog-do-db\s*?=\s*?(.*))"
- dodb = re.findall(rep, con, re.M)
- for x in range(0, len(dodb)):
- con = con.replace(dodb[x][0] + "\n", '')
- mw.writeFile(conf, con)
-
- restart(version)
- return mw.returnJson(True, '设置成功')
-
-
-def getMasterRepSlaveList(version=''):
- args = getArgs()
- page = 1
- page_size = 10
- search = ''
- data = {}
- if 'page' in args:
- page = int(args['page'])
-
- if 'page_size' in args:
- page_size = int(args['page_size'])
-
- if 'search' in args:
- search = args['search']
-
- conn = pSqliteDb('master_replication_user')
- limit = str((page - 1) * page_size) + ',' + str(page_size)
- condition = ''
-
- if not search == '':
- condition = "name like '%" + search + "%'"
- field = 'id,username,password,accept,ps,addtime'
- clist = conn.where(condition, ()).field(
- field).limit(limit).order('id desc').select()
- count = conn.where(condition, ()).count()
-
- _page = {}
- _page['count'] = count
- _page['p'] = page
- _page['row'] = page_size
- _page['tojs'] = 'getMasterRepSlaveList'
- data['page'] = mw.getPage(_page)
- data['data'] = clist
-
- return mw.getJson(data)
-
-
-def addMasterRepSlaveUser(version=''):
- args = getArgs()
- data = checkArgs(args,
- ['username', 'password'])
- if not data[0]:
- return data[1]
-
- if not 'address' in args:
- address = ''
- else:
- address = args['address'].strip()
-
- username = args['username'].strip()
- password = args['password'].strip()
- # ps = args['ps'].strip()
- # address = args['address'].strip()
- # dataAccess = args['dataAccess'].strip()
-
- reg = "^[\w\.-]+$"
- if not re.match(reg, username):
- return mw.returnJson(False, '用户名不能带有特殊符号!')
- checks = ['root', 'mysql', 'test', 'sys', 'panel_logs']
- if username in checks or len(username) < 1:
- return mw.returnJson(False, '用户名不合法!')
- if password in checks or len(password) < 1:
- return mw.returnJson(False, '密码不合法!')
-
- if len(password) < 1:
- password = mw.md5(time.time())[0:8]
-
- pdb = pMysqlDb()
- psdb = pSqliteDb('master_replication_user')
-
- if psdb.where("username=?", (username)).count():
- return mw.returnJson(False, '用户已存在!')
-
- result = pdb.execute("GRANT REPLICATION SLAVE ON *.* TO '" +
- username + "'@'%' identified by '" + password + "';FLUSH PRIVILEGES;")
- # print result
- isError = isSqlError(result)
- if isError != None:
- return isError
-
- addTime = time.strftime('%Y-%m-%d %X', time.localtime())
- psdb.add('username,password,accept,ps,addtime',
- (username, password, '%', '', addTime))
- return mw.returnJson(True, '添加成功!')
-
-
-def getMasterRepSlaveUserCmd(version):
- args = getArgs()
- data = checkArgs(args, ['username', 'db'])
- if not data[0]:
- return data[1]
-
- psdb = pSqliteDb('master_replication_user')
- f = 'username,password'
- if args['username'] == '':
-
- count = psdb.count()
-
- if count == 0:
- return mw.returnJson(False, '请添加同步账户!')
-
- clist = psdb.field(f).limit('1').order('id desc').select()
- else:
- clist = psdb.field(f).where("username=?", (args['username'],)).limit(
- '1').order('id desc').select()
-
- ip = mw.getLocalIp()
- port = getMyPort()
-
- db = pMysqlDb()
- tmp = db.query('show master status')
-
- if len(tmp) == 0:
- return mw.returnJson(False, '未开启!')
-
- sql = "CHANGE MASTER TO MASTER_HOST='" + ip + "', MASTER_PORT=" + port + ", MASTER_USER='" + \
- clist[0]['username'] + "', MASTER_PASSWORD='" + \
- clist[0]['password'] + \
- "', MASTER_LOG_FILE='" + tmp[0][0] + \
- "',MASTER_LOG_POS=" + str(tmp[0][1]) + ""
-
- # if args['db'] != '':
- # replicate-do-table
-
- return mw.returnJson(True, 'OK!', sql)
-
-
-def delMasterRepSlaveUser(version=''):
- args = getArgs()
- data = checkArgs(args, ['username'])
- if not data[0]:
- return data[1]
-
- pdb = pMysqlDb()
- psdb = pSqliteDb('master_replication_user')
- pdb.execute("drop user '" + args['username'] + "'@'%'")
- psdb.where("username=?", (args['username'],)).delete()
-
- return mw.returnJson(True, '删除成功!')
-
-
-def updateMasterRepSlaveUser(version=''):
- args = getArgs()
- data = checkArgs(args, ['username', 'password'])
- if not data[0]:
- return data[1]
-
- pdb = pMysqlDb()
- psdb = pSqliteDb('master_replication_user')
- pdb.execute("drop user '" + args['username'] + "'@'%'")
-
- pdb.execute("GRANT REPLICATION SLAVE ON *.* TO '" +
- args['username'] + "'@'%' identified by '" + args['password'] + "'")
-
- psdb.where("username=?", (args['username'],)).save(
- 'password', args['password'])
-
- return mw.returnJson(True, '更新成功!')
-
-
-def getSlaveList(version=''):
-
- db = pMysqlDb()
- dlist = db.query('show slave status')
-
- # print(dlist)
- ret = []
- for x in range(0, len(dlist)):
- tmp = {}
- tmp['Master_User'] = dlist[x][2]
- tmp['Master_Host'] = dlist[x][1]
- tmp['Master_Port'] = dlist[x][3]
- tmp['Master_Log_File'] = dlist[x][5]
- tmp['Slave_IO_Running'] = dlist[x][10]
- tmp['Slave_SQL_Running'] = dlist[x][11]
- ret.append(tmp)
- data = {}
- data['data'] = ret
-
- return mw.getJson(data)
-
-
-def setSlaveStatus(version=''):
- db = pMysqlDb()
- dlist = db.query('show slave status')
-
- if len(dlist) == 0:
- return mw.returnJson(False, '需要手动添加主服务同步命令!')
-
- if len(dlist) > 0 and (dlist[0][10] == 'Yes' or dlist[0][11] == 'Yes'):
- db.query('stop slave')
- else:
- db.query('start slave')
-
- return mw.returnJson(True, '设置成功!')
-
-
-def deleteSlave(version=''):
- db = pMysqlDb()
- dlist = db.query('stop slave;reset slave all')
- return mw.returnJson(True, '删除成功!')
-
-
-def dumpMysqlData(version):
-
- args = getArgs()
- data = checkArgs(args, ['db'])
- if not data[0]:
- return data[1]
-
- pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
- if args['db'] == 'all' or args['db'] == 'ALL':
- dlist = findBinlogDoDb()
- cmd = getServerDir() + "/bin/mysqldump -uroot -p" + \
- pwd + " --databases " + ' '.join(dlist) + \
- " > /tmp/dump.sql"
- else:
- cmd = getServerDir() + "/bin/mysqldump -uroot -p" + pwd + \
- " --databases " + args['db'] + " > /tmp/dump.sql"
-
- ret = mw.execShell(cmd)
-
- if ret[0] == '':
- return 'ok'
- return 'fail'
-
-
-from threading import Thread
-from time import sleep
-
-
-def mw_async(f):
- def wrapper(*args, **kwargs):
- thr = Thread(target=f, args=args, kwargs=kwargs)
- thr.start()
- return wrapper
-
-
-def doFullSync():
-
- args = getArgs()
- data = checkArgs(args, ['db'])
- if not data[0]:
- return data[1]
-
- status_data = {}
- status_data['progress'] = 5
-
- db = pMysqlDb()
-
- dlist = db.query('show slave status')
- if len(dlist) == 0:
- status_data['code'] = -1
- status_data['msg'] = '没有启动...'
-
- ip = dlist[0][1]
- print(ip)
-
- status_file = '/tmp/db_async_status.txt'
-
- status_data['code'] = 0
- status_data['msg'] = '运行中...'
- mw.writeFile(status_file, json.dumps(status_data))
-
- import paramiko
- paramiko.util.log_to_file('paramiko.log')
- ssh = paramiko.SSHClient()
-
- SSH_PRIVATE_KEY = '/root/.ssh/id_rsa'
-
- if mw.getOs() == 'darwin':
- user = mw.execShell(
- "who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
- SSH_PRIVATE_KEY = '/Users/' + user + '/.ssh/id_rsa'
-
- print(SSH_PRIVATE_KEY)
- if not os.path.exists(SSH_PRIVATE_KEY):
- status_data['code'] = 0
- status_data['msg'] = '需要配置免登录...'
- mw.writeFile(status_file, json.dumps(status_data))
- return
-
- try:
- key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY)
- # ssh.load_system_host_keys()
- ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- ssh.connect(hostname=ip, port=22, username='root', pkey=key)
- except Exception as e:
- status_data['code'] = 0
- status_data['msg'] = '需要配置免登录....'
- mw.writeFile(status_file, json.dumps(status_data))
- return
-
- cmd = "cd /www/server/mdserver-web && python /www/server/mdserver-web/plugins/mysql/index.py dump_mysql_data {\"db\":'" + args[
- 'db'] + "'}"
- stdin, stdout, stderr = ssh.exec_command(cmd)
- result = stdout.read()
- result_err = stderr.read()
-
- if result == 'ok':
- status_data['code'] = 1
- status_data['msg'] = '主服务器备份完成...'
- status_data['progress'] = 30
- mw.writeFile(status_file, json.dumps(status_data))
-
- r = mw.execShell('scp root@' + ip + ':/tmp/dump.sql /tmp')
- if r[0] == '':
- status_data['code'] = 2
- status_data['msg'] = '数据同步本地完成...'
- status_data['progress'] = 40
- mw.writeFile(status_file, json.dumps(status_data))
-
- cmd = 'cd /www/server/mdserver-web && python /www/server/mdserver-web/plugins/mysql/index.py get_master_rep_slave_user_cmd {"username":"","db":""}'
- stdin, stdout, stderr = ssh.exec_command(cmd)
- result = stdout.read()
- result_err = stderr.read()
- cmd_data = json.loads(result)
-
- db.query('stop slave')
- status_data['code'] = 3
- status_data['msg'] = '停止从库完成...'
- status_data['progress'] = 45
- mw.writeFile(status_file, json.dumps(status_data))
-
- dlist = db.query(cmd_data['data'])
- status_data['code'] = 4
- status_data['msg'] = '刷新库信息完成...'
- status_data['progress'] = 50
- mw.writeFile(status_file, json.dumps(status_data))
-
- pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
- cmd = getServerDir() + "/bin/mysql -uroot -p" + pwd + " < /tmp/dump.sql"
- print(mw.execShell(cmd))
- status_data['code'] = 5
- status_data['msg'] = '同步数据完成...'
- status_data['progress'] = 90
- mw.writeFile(status_file, json.dumps(status_data))
-
- db.query('start slave')
- status_data['code'] = 6
- status_data['msg'] = '从库重启完成...'
- status_data['progress'] = 100
- mw.writeFile(status_file, json.dumps(status_data))
-
- return True
-
-
-def fullSync(version=''):
- args = getArgs()
- data = checkArgs(args, ['db', 'begin'])
- if not data[0]:
- return data[1]
-
- status_file = '/tmp/db_async_status.txt'
- if args['begin'] == '1':
- cmd = 'cd ' + mw.getRunDir() + ' && python ' + \
- getPluginDir() + \
- '/index.py do_full_sync {"db":"' + args['db'] + '"} &'
- mw.execShell(cmd)
- return json.dumps({'code': 0, 'msg': '同步数据中!', 'progress': 0})
-
- if os.path.exists(status_file):
- c = mw.readFile(status_file)
- d = json.loads(c)
-
- if d['code'] == 6:
- os.remove(status_file)
- return c
-
- return json.dumps({'code': 0, 'msg': '点击开始,开始同步!', 'progress': 0})
-
-if __name__ == "__main__":
- func = sys.argv[1]
-
- version = "5.6"
- if (len(sys.argv) > 2):
- version = sys.argv[2]
-
- if func == 'status':
- print(status(version))
- elif func == 'start':
- print(start(version))
- elif func == 'stop':
- print(stop(version))
- elif func == 'restart':
- print(restart(version))
- elif func == 'reload':
- print(reload(version))
- elif func == 'initd_status':
- print(initdStatus())
- elif func == 'initd_install':
- print(initdInstall())
- elif func == 'initd_uninstall':
- print(initdUinstall())
- elif func == 'run_info':
- print(runInfo())
- elif func == 'db_status':
- print(myDbStatus())
- elif func == 'set_db_status':
- print(setDbStatus())
- elif func == 'conf':
- print(getConf())
- elif func == 'bin_log':
- print(binLog())
- elif func == 'error_log':
- print(getErrorLog())
- elif func == 'show_log':
- print(getShowLogFile())
- elif func == 'my_db_pos':
- print(getMyDbPos())
- elif func == 'set_db_pos':
- print(setMyDbPos())
- elif func == 'my_port':
- print(getMyPort())
- elif func == 'set_my_port':
- print(setMyPort())
- elif func == 'init_pwd':
- print(initMysqlPwd())
- elif func == 'get_db_list':
- print(getDbList())
- elif func == 'set_db_backup':
- print(setDbBackup())
- elif func == 'import_db_backup':
- print(importDbBackup())
- elif func == 'delete_db_backup':
- print(deleteDbBackup())
- elif func == 'get_db_backup_list':
- print(getDbBackupList())
- elif func == 'add_db':
- print(addDb())
- elif func == 'del_db':
- print(delDb())
- elif func == 'sync_get_databases':
- print(syncGetDatabases())
- elif func == 'sync_to_databases':
- print(syncToDatabases())
- elif func == 'set_root_pwd':
- print(setRootPwd())
- elif func == 'set_user_pwd':
- print(setUserPwd())
- elif func == 'get_db_access':
- print(getDbAccess())
- elif func == 'set_db_access':
- print(setDbAccess())
- elif func == 'set_db_ps':
- print(setDbPs())
- elif func == 'get_db_info':
- print(getDbInfo())
- elif func == 'repair_table':
- print(repairTable())
- elif func == 'opt_table':
- print(optTable())
- elif func == 'alter_table':
- print(alterTable())
- elif func == 'get_total_statistics':
- print(getTotalStatistics())
- elif func == 'get_masterdb_list':
- print(getMasterDbList(version))
- elif func == 'get_master_status':
- print(getMasterStatus(version))
- elif func == 'set_master_status':
- print(setMasterStatus(version))
- elif func == 'set_db_master':
- print(setDbMaster(version))
- elif func == 'set_db_slave':
- print(setDbSlave(version))
- elif func == 'get_master_rep_slave_list':
- print(getMasterRepSlaveList(version))
- elif func == 'add_master_rep_slave_user':
- print(addMasterRepSlaveUser(version))
- elif func == 'del_master_rep_slave_user':
- print(delMasterRepSlaveUser(version))
- elif func == 'update_master_rep_slave_user':
- print(updateMasterRepSlaveUser(version))
- elif func == 'get_master_rep_slave_user_cmd':
- print(getMasterRepSlaveUserCmd(version))
- elif func == 'get_slave_list':
- print(getSlaveList(version))
- elif func == 'set_slave_status':
- print(setSlaveStatus(version))
- elif func == 'delete_slave':
- print(deleteSlave(version))
- elif func == 'full_sync':
- print(fullSync(version))
- elif func == 'do_full_sync':
- print(doFullSync())
- elif func == 'dump_mysql_data':
- print(dumpMysqlData(version))
- else:
- print('error')
diff --git a/plugins/mysql/bak/index_2022_8_02.py b/plugins/mysql/bak/index_2022_8_02.py
deleted file mode 100755
index ccb036bf7..000000000
--- a/plugins/mysql/bak/index_2022_8_02.py
+++ /dev/null
@@ -1,2229 +0,0 @@
-# coding:utf-8
-
-import sys
-import io
-import os
-import time
-import subprocess
-import re
-import json
-
-
-# reload(sys)
-# sys.setdefaultencoding('utf-8')
-
-sys.path.append(os.getcwd() + "/class/core")
-import mw
-
-
-if mw.isAppleSystem():
- cmd = 'ls /usr/local/lib/ | grep python | cut -d \\ -f 1 | awk \'END {print}\''
- info = mw.execShell(cmd)
- p = "/usr/local/lib/" + info[0].strip() + "/site-packages"
- sys.path.append(p)
-
-
-app_debug = False
-if mw.isAppleSystem():
- app_debug = True
-
-
-def getPluginName():
- return 'mysql'
-
-
-def getPluginDir():
- return mw.getPluginDir() + '/' + getPluginName()
-
-
-def getServerDir():
- return mw.getServerDir() + '/' + getPluginName()
-
-
-def getInitDFile():
- if app_debug:
- return '/tmp/' + getPluginName()
- return '/etc/init.d/' + getPluginName()
-
-
-def getArgs():
- args = sys.argv[2:]
-
- tmp = {}
- args_len = len(args)
-
- if args_len == 1:
- t = args[0].strip('{').strip('}')
- t = t.split(':')
- tmp[t[0]] = t[1]
- elif args_len > 1:
- for i in range(len(args)):
- t = args[i].split(':')
- tmp[t[0]] = t[1]
-
- return tmp
-
-
-def checkArgs(data, ck=[]):
- for i in range(len(ck)):
- if not ck[i] in data:
- return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
- return (True, mw.returnJson(True, 'ok'))
-
-
-def getConf():
- path = getServerDir() + '/etc/my.cnf'
- return path
-
-
-def getDbPort():
- file = getConf()
- content = mw.readFile(file)
- rep = 'port\s*=\s*(.*)'
- tmp = re.search(rep, content)
- return tmp.groups()[0].strip()
-
-
-def getSocketFile():
- file = getConf()
- content = mw.readFile(file)
- rep = 'socket\s*=\s*(.*)'
- tmp = re.search(rep, content)
- return tmp.groups()[0].strip()
-
-
-def getInitdTpl(version=''):
- path = getPluginDir() + '/init.d/mysql' + version + '.tpl'
- if not os.path.exists(path):
- path = getPluginDir() + '/init.d/mysql.tpl'
- return path
-
-
-def contentReplace(content):
- service_path = mw.getServerDir()
- if content.find('{$ROOT_PATH}') != -1:
- content = content.replace('{$ROOT_PATH}', mw.getRootDir())
-
- if content.find('{$SERVER_PATH}') != -1:
- content = content.replace('{$SERVER_PATH}', service_path)
-
- if content.find('{$SERVER_APP_PATH}') != -1:
- content = content.replace(
- '{$SERVER_APP_PATH}', service_path + '/mysql')
- return content
-
-
-def pSqliteDb(dbname='databases'):
- file = getServerDir() + '/mysql.db'
- name = 'mysql'
- if not os.path.exists(file):
- conn = mw.M(dbname).dbPos(getServerDir(), name)
- csql = mw.readFile(getPluginDir() + '/conf/mysql.sql')
- csql_list = csql.split(';')
- for index in range(len(csql_list)):
- conn.execute(csql_list[index], ())
- else:
- # 现有run
- # conn = mw.M(dbname).dbPos(getServerDir(), name)
- # csql = mw.readFile(getPluginDir() + '/conf/mysql.sql')
- # csql_list = csql.split(';')
- # for index in range(len(csql_list)):
- # conn.execute(csql_list[index], ())
- conn = mw.M(dbname).dbPos(getServerDir(), name)
- return conn
-
-
-def pMysqlDb():
- # mysql.connector
- # db = mw.getMyORM()
- # MySQLdb |
- db = mw.getMyORMDb()
-
- db.setPort(getDbPort())
- db.setSocket(getSocketFile())
- # db.setCharset("utf8")
- db.setPwd(pSqliteDb('config').where('id=?', (1,)).getField('mysql_root'))
- return db
-
-
-def initDreplace(version=''):
- initd_tpl = getInitdTpl(version)
-
- initD_path = getServerDir() + '/init.d'
- if not os.path.exists(initD_path):
- os.mkdir(initD_path)
-
- file_bin = initD_path + '/' + getPluginName()
- if not os.path.exists(file_bin):
- content = mw.readFile(initd_tpl)
- content = contentReplace(content)
- mw.writeFile(file_bin, content)
- mw.execShell('chmod +x ' + file_bin)
-
- mysql_conf_dir = getServerDir() + '/etc'
- if not os.path.exists(mysql_conf_dir):
- os.mkdir(mysql_conf_dir)
-
- mysql_tmp = getServerDir() + '/tmp'
- if not os.path.exists(mysql_tmp):
- os.mkdir(mysql_tmp)
- mw.execShell("chown -R mysql:mysql " + mysql_tmp)
-
- mysql_conf = mysql_conf_dir + '/my.cnf'
- if not os.path.exists(mysql_conf):
- mysql_conf_tpl = getPluginDir() + '/conf/my' + version + '.cnf'
- content = mw.readFile(mysql_conf_tpl)
- content = contentReplace(content)
- mw.writeFile(mysql_conf, content)
-
- # systemd
- systemDir = mw.systemdCfgDir()
- systemService = systemDir + '/mysql.service'
- systemServiceTpl = getPluginDir() + '/init.d/mysql.service.tpl'
- if os.path.exists(systemDir) and not os.path.exists(systemService):
- service_path = mw.getServerDir()
- se_content = mw.readFile(systemServiceTpl)
- se_content = se_content.replace('{$SERVER_PATH}', service_path)
- mw.writeFile(systemService, se_content)
- mw.execShell('systemctl daemon-reload')
-
- if mw.getOs() != 'darwin':
- mw.execShell('chown -R mysql mysql ' + getServerDir())
- return file_bin
-
-
-def status(version=''):
- pid = getPidFile()
- if not os.path.exists(pid):
- return 'stop'
-
- return 'start'
-
-
-def getDataDir():
- file = getConf()
- content = mw.readFile(file)
- rep = 'datadir\s*=\s*(.*)'
- tmp = re.search(rep, content)
- return tmp.groups()[0].strip()
-
-
-def getPidFile():
- file = getConf()
- content = mw.readFile(file)
- rep = 'pid-file\s*=\s*(.*)'
- tmp = re.search(rep, content)
- return tmp.groups()[0].strip()
-
-
-def binLog():
- args = getArgs()
- conf = getConf()
- con = mw.readFile(conf)
-
- if con.find('#log-bin=mysql-bin') != -1:
- if 'status' in args:
- return mw.returnJson(False, '0')
- con = con.replace('#log-bin=mysql-bin', 'log-bin=mysql-bin')
- con = con.replace('#binlog_format=mixed', 'binlog_format=mixed')
- mw.execShell('sync')
- restart()
- else:
- path = getDataDir()
- if 'status' in args:
- dsize = 0
- for n in os.listdir(path):
- if len(n) < 9:
- continue
- if n[0:9] == 'mysql-bin':
- dsize += os.path.getsize(path + '/' + n)
- return mw.returnJson(True, dsize)
- con = con.replace('log-bin=mysql-bin', '#log-bin=mysql-bin')
- con = con.replace('binlog_format=mixed', '#binlog_format=mixed')
- mw.execShell('sync')
- restart()
- mw.execShell('rm -f ' + path + '/mysql-bin.*')
-
- mw.writeFile(conf, con)
- return mw.returnJson(True, '设置成功!')
-
-
-def cleanBinLog():
- db = pMysqlDb()
- cleanTime = time.strftime('%Y-%m-%d %H:%i:%s', time.localtime())
- db.execute("PURGE MASTER LOGS BEFORE '" + cleanTime + "';")
- return mw.returnJson(True, '清理BINLOG成功!')
-
-
-def setSkipGrantTables(v):
- '''
- 设置是否密码验证
- '''
- conf = getConf()
- con = mw.readFile(conf)
- if v:
- if con.find('#skip-grant-tables') != -1:
- con = con.replace('#skip-grant-tables', 'skip-grant-tables')
- else:
- con = con.replace('skip-grant-tables', '#skip-grant-tables')
- mw.writeFile(conf, con)
- return True
-
-
-def getErrorLog():
- args = getArgs()
- path = getDataDir()
- filename = ''
- for n in os.listdir(path):
- if len(n) < 5:
- continue
- if n == 'error.log':
- filename = path + '/' + n
- break
- # print filename
- if not os.path.exists(filename):
- return mw.returnJson(False, '指定文件不存在!')
- if 'close' in args:
- mw.writeFile(filename, '')
- return mw.returnJson(False, '日志已清空')
- info = mw.getNumLines(filename, 18)
- return mw.returnJson(True, 'OK', info)
-
-
-def getShowLogFile():
- file = getConf()
- content = mw.readFile(file)
- rep = 'slow-query-log-file\s*=\s*(.*)'
- tmp = re.search(rep, content)
- return tmp.groups()[0].strip()
-
-
-def pGetDbUser():
- if mw.isAppleSystem():
- user = mw.execShell(
- "who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
- return user
- return 'mysql'
-
-
-def initMysqlData():
- datadir = getDataDir()
- if not os.path.exists(datadir + '/mysql'):
- serverdir = getServerDir()
- myconf = serverdir + "/etc/my.cnf"
- user = pGetDbUser()
- cmd = 'cd ' + serverdir + ' && ./scripts/mysql_install_db --defaults-file=' + myconf
- mw.execShell(cmd)
- return False
- return True
-
-
-def initMysql57Data():
- '''
- cd /www/server/mysql && /www/server/mysql/bin/mysqld --defaults-file=/www/server/mysql/etc/my.cnf --initialize-insecure --explicit_defaults_for_timestamp
- '''
- datadir = getDataDir()
- if not os.path.exists(datadir + '/mysql'):
- serverdir = getServerDir()
- myconf = serverdir + "/etc/my.cnf"
- user = pGetDbUser()
- cmd = 'cd ' + serverdir + ' && ./bin/mysqld --defaults-file=' + myconf + \
- ' --initialize-insecure --explicit_defaults_for_timestamp'
- data = mw.execShell(cmd)
- # print(data)
- return False
- return True
-
-
-def initMysql8Data():
- datadir = getDataDir()
- if not os.path.exists(datadir + '/mysql'):
- serverdir = getServerDir()
- user = pGetDbUser()
- # cmd = 'cd ' + serverdir + ' && ./bin/mysqld --basedir=' + serverdir + ' --datadir=' + \
- # datadir + ' --initialize'
-
- cmd = 'cd ' + serverdir + ' && ./bin/mysqld --basedir=' + serverdir + ' --datadir=' + \
- datadir + ' --initialize-insecure'
-
- # print(cmd)
- data = mw.execShell(cmd)
- # print(data)
- return False
- return True
-
-
-def initMysqlPwd():
- time.sleep(5)
-
- serverdir = getServerDir()
- pwd = mw.getRandomString(16)
- # cmd_pass = serverdir + '/bin/mysqladmin -uroot password ' + pwd
-
- # cmd_pass = "insert into mysql.user(Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv,Show_db_priv,Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Repl_slave_priv,Repl_client_priv,Create_view_priv,Show_view_priv,Create_routine_priv,Alter_routine_priv,Create_user_priv,Event_priv,Trigger_priv,Create_tablespace_priv,User,Password,host)values('Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','root',password('" + pwd + "'),'127.0.0.1')"
- # cmd_pass = cmd_pass + \
- # "insert into mysql.user(Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv,Show_db_priv,Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Repl_slave_priv,Repl_client_priv,Create_view_priv,Show_view_priv,Create_routine_priv,Alter_routine_priv,Create_user_priv,Event_priv,Trigger_priv,Create_tablespace_priv,User,Password,host)values('Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','root',password('" + pwd + "'),'localhost')"
- # cmd_pass = cmd_pass + \
- # "UPDATE mysql.user SET password=PASSWORD('" + \
- # pwd + "') WHERE user='root'"
- cmd_pass = serverdir + '/bin/mysql -uroot -e'
- cmd_pass = cmd_pass + "\"UPDATE mysql.user SET password=PASSWORD('" + \
- pwd + "') WHERE user='root';"
- cmd_pass = cmd_pass + "flush privileges;\""
- data = mw.execShell(cmd_pass)
- # print(cmd_pass)
- # print(data)
-
- # 删除测试数据库
- drop_test_db = serverdir + '/bin/mysql -uroot -p' + \
- pwd + ' -e "drop database test";'
- mw.execShell(drop_test_db)
-
- pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
- return True
-
-
-def initMysql8Pwd():
- time.sleep(2)
-
- serverdir = getServerDir()
- myconf = serverdir + "/etc/my.cnf"
-
- pwd = mw.getRandomString(16)
-
- alter_root_pwd = 'flush privileges;'
-
- alter_root_pwd = alter_root_pwd + \
- "UPDATE mysql.user SET authentication_string='' WHERE user='root';"
- alter_root_pwd = alter_root_pwd + "flush privileges;"
- alter_root_pwd = alter_root_pwd + \
- "alter user 'root'@'localhost' IDENTIFIED by '" + pwd + "';"
- alter_root_pwd = alter_root_pwd + \
- "alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '" + pwd + "';"
- alter_root_pwd = alter_root_pwd + "flush privileges;"
-
- cmd_pass = serverdir + '/bin/mysqladmin --defaults-file=' + \
- myconf + ' -uroot password root'
- data = mw.execShell(cmd_pass)
- # print(cmd_pass)
- # print(data)
-
- tmp_file = "/tmp/mysql_init_tmp.log"
- mw.writeFile(tmp_file, alter_root_pwd)
- cmd_pass = serverdir + '/bin/mysql --defaults-file=' + \
- myconf + ' -uroot -proot < ' + tmp_file
-
- data = mw.execShell(cmd_pass)
- os.remove(tmp_file)
-
- # 删除测试数据库
- drop_test_db = serverdir + '/bin/mysql --defaults-file=' + \
- myconf + ' -uroot -p' + pwd + ' -e "drop database test";'
- mw.execShell(drop_test_db)
-
- pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
-
- return True
-
-
-def myOp(version, method):
- # import commands
- init_file = initDreplace()
- try:
- isInited = initMysqlData()
- if not isInited:
- mw.execShell('systemctl start mysql')
- initMysqlPwd()
- mw.execShell('systemctl stop mysql')
-
- mw.execShell('systemctl ' + method + ' mysql')
- return 'ok'
- except Exception as e:
- return str(e)
-
-
-def my8cmd(version, method):
- # mysql 8.0 and 5.7
- init_file = initDreplace(version)
- cmd = init_file + ' ' + method
- try:
- if version == '5.7':
- isInited = initMysql57Data()
- elif version == '8.0':
- isInited = initMysql8Data()
-
- if not isInited:
-
- if mw.isAppleSystem():
- cmd_init_start = init_file + ' start'
- subprocess.Popen(cmd_init_start, stdout=subprocess.PIPE, shell=True,
- bufsize=4096, stderr=subprocess.PIPE)
-
- time.sleep(6)
- else:
- mw.execShell('systemctl start mysql')
-
- initMysql8Pwd()
-
- if mw.isAppleSystem():
- cmd_init_stop = init_file + ' stop'
- subprocess.Popen(cmd_init_stop, stdout=subprocess.PIPE, shell=True,
- bufsize=4096, stderr=subprocess.PIPE)
- time.sleep(3)
- else:
- mw.execShell('systemctl stop mysql')
-
- if mw.isAppleSystem():
- sub = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True,
- bufsize=4096, stderr=subprocess.PIPE)
- sub.wait(5)
- else:
- mw.execShell('systemctl ' + method + ' mysql')
- return 'ok'
- except Exception as e:
- return str(e)
-
-
-def appCMD(version, action):
- if version == '8.0' or version == '5.7':
- return my8cmd(version, action)
- return myOp(version, action)
-
-
-def start(version=''):
- return appCMD(version, 'start')
-
-
-def stop(version=''):
- return appCMD(version, 'stop')
-
-
-def restart(version=''):
- return appCMD(version, 'restart')
-
-
-def reload(version=''):
- return appCMD(version, 'reload')
-
-
-def initdStatus():
- if mw.isAppleSystem():
- return "Apple Computer does not support"
-
- shell_cmd = 'systemctl status mysql | grep loaded | grep "enabled;"'
- data = mw.execShell(shell_cmd)
- if data[0] == '':
- return 'fail'
- return 'ok'
-
-
-def initdInstall():
- if mw.isAppleSystem():
- return "Apple Computer does not support"
-
- mw.execShell('systemctl enable mysql')
- return 'ok'
-
-
-def initdUinstall():
- if mw.isAppleSystem():
- return "Apple Computer does not support"
-
- mw.execShell('systemctl disable mysql')
- return 'ok'
-
-
-def getMyDbPos():
- file = getConf()
- content = mw.readFile(file)
- rep = 'datadir\s*=\s*(.*)'
- tmp = re.search(rep, content)
- return tmp.groups()[0].strip()
-
-
-def setMyDbPos():
- args = getArgs()
- data = checkArgs(args, ['datadir'])
- if not data[0]:
- return data[1]
-
- s_datadir = getMyDbPos()
- t_datadir = args['datadir']
- if t_datadir == s_datadir:
- return mw.returnJson(False, '与当前存储目录相同,无法迁移文件!')
-
- if not os.path.exists(t_datadir):
- mw.execShell('mkdir -p ' + t_datadir)
-
- # mw.execShell('/etc/init.d/mysqld stop')
- stop()
- mw.execShell('cp -rf ' + s_datadir + '/* ' + t_datadir + '/')
- mw.execShell('chown -R mysql mysql ' + t_datadir)
- mw.execShell('chmod -R 755 ' + t_datadir)
- mw.execShell('rm -f ' + t_datadir + '/*.pid')
- mw.execShell('rm -f ' + t_datadir + '/*.err')
-
- path = getServerDir()
- myfile = path + '/etc/my.cnf'
- mycnf = mw.readFile(myfile)
- mw.writeFile(path + '/etc/my_backup.cnf', mycnf)
-
- mycnf = mycnf.replace(s_datadir, t_datadir)
- mw.writeFile(myfile, mycnf)
- start()
-
- result = mw.execShell(
- 'ps aux|grep mysqld| grep -v grep|grep -v python')
- if len(result[0]) > 10:
- mw.writeFile('data/datadir.pl', t_datadir)
- return mw.returnJson(True, '存储目录迁移成功!')
- else:
- mw.execShell('pkill -9 mysqld')
- mw.writeFile(myfile, mw.readFile(path + '/etc/my_backup.cnf'))
- start()
- return mw.returnJson(False, '文件迁移失败!')
-
-
-def getMyPort():
- file = getConf()
- content = mw.readFile(file)
- rep = 'port\s*=\s*(.*)'
- tmp = re.search(rep, content)
- return tmp.groups()[0].strip()
-
-
-def setMyPort():
- args = getArgs()
- data = checkArgs(args, ['port'])
- if not data[0]:
- return data[1]
-
- port = args['port']
- file = getConf()
- content = mw.readFile(file)
- rep = "port\s*=\s*([0-9]+)\s*\n"
- content = re.sub(rep, 'port = ' + port + '\n', content)
- mw.writeFile(file, content)
- restart()
- return mw.returnJson(True, '编辑成功!')
-
-
-def runInfo():
-
- if status(version) == 'stop':
- return mw.returnJson(False, 'MySQL未启动', [])
-
- db = pMysqlDb()
- data = db.query('show global status')
- gets = ['Max_used_connections', 'Com_commit', 'Com_rollback', 'Questions', 'Innodb_buffer_pool_reads', 'Innodb_buffer_pool_read_requests', 'Key_reads', 'Key_read_requests', 'Key_writes',
- 'Key_write_requests', 'Qcache_hits', 'Qcache_inserts', 'Bytes_received', 'Bytes_sent', 'Aborted_clients', 'Aborted_connects',
- 'Created_tmp_disk_tables', 'Created_tmp_tables', 'Innodb_buffer_pool_pages_dirty', 'Opened_files', 'Open_tables', 'Opened_tables', 'Select_full_join',
- 'Select_range_check', 'Sort_merge_passes', 'Table_locks_waited', 'Threads_cached', 'Threads_connected', 'Threads_created', 'Threads_running', 'Connections', 'Uptime']
-
- try:
- # print data
- if data[0] == 1045 or data[0] == 2003:
- pwd = db.getPwd()
- return mw.returnJson(False, 'mysql password error:' + pwd + '!')
- except Exception as e:
- pass
-
- result = {}
-
- # print(data)
-
- for d in data:
- for g in gets:
- if d[0] == g:
- result[g] = d[1]
-
- # print(result, int(result['Uptime']))
- result['Run'] = int(time.time()) - int(result['Uptime'])
- tmp = db.query('show master status')
- try:
- result['File'] = tmp[0][0]
- result['Position'] = tmp[0][1]
- except:
- result['File'] = 'OFF'
- result['Position'] = 'OFF'
- return mw.getJson(result)
-
-
-def myDbStatus():
- result = {}
- db = pMysqlDb()
- data = db.query('show variables')
- isError = isSqlError(data)
- if isError != None:
- return isError
-
- gets = ['table_open_cache', 'thread_cache_size', 'key_buffer_size', 'tmp_table_size', 'max_heap_table_size', 'innodb_buffer_pool_size',
- 'innodb_additional_mem_pool_size', 'innodb_log_buffer_size', 'max_connections', 'sort_buffer_size', 'read_buffer_size', 'read_rnd_buffer_size', 'join_buffer_size', 'thread_stack', 'binlog_cache_size']
- result['mem'] = {}
- for d in data:
- for g in gets:
- if d[0] == g:
- result['mem'][g] = d[1]
- # if result['mem']['query_cache_type'] != 'ON':
- # result['mem']['query_cache_size'] = '0'
- return mw.getJson(result)
-
-
-def setDbStatus():
- gets = ['key_buffer_size', 'tmp_table_size', 'max_heap_table_size', 'innodb_buffer_pool_size', 'innodb_log_buffer_size', 'max_connections',
- 'table_open_cache', 'thread_cache_size', 'sort_buffer_size', 'read_buffer_size', 'read_rnd_buffer_size', 'join_buffer_size', 'thread_stack', 'binlog_cache_size']
- emptys = ['max_connections', 'thread_cache_size', 'table_open_cache']
- args = getArgs()
- conFile = getConf()
- content = mw.readFile(conFile)
- n = 0
- for g in gets:
- s = 'M'
- if n > 5:
- s = 'K'
- if g in emptys:
- s = ''
- rep = '\s*' + g + '\s*=\s*\d+(M|K|k|m|G)?\n'
- c = g + ' = ' + args[g] + s + '\n'
- if content.find(g) != -1:
- content = re.sub(rep, '\n' + c, content, 1)
- else:
- content = content.replace('[mysqld]\n', '[mysqld]\n' + c)
- n += 1
- mw.writeFile(conFile, content)
- return mw.returnJson(True, '设置成功!')
-
-
-def isSqlError(mysqlMsg):
- # 检测数据库执行错误
- mysqlMsg = str(mysqlMsg)
- if "MySQLdb" in mysqlMsg:
- return mw.returnJson(False, 'MySQLdb组件缺失!
进入SSH命令行输入: pip install mysql-python | pip install mysqlclient==2.0.3')
- if "2002," in mysqlMsg:
- return mw.returnJson(False, '数据库连接失败,请检查数据库服务是否启动!')
- if "2003," in mysqlMsg:
- return mw.returnJson(False, "Can't connect to MySQL server on '127.0.0.1' (61)")
- if "using password:" in mysqlMsg:
- return mw.returnJson(False, '数据库管理密码错误!')
- if "1045" in mysqlMsg:
- return mw.returnJson(False, '连接错误!')
- if "SQL syntax" in mysqlMsg:
- return mw.returnJson(False, 'SQL语法错误!')
- if "Connection refused" in mysqlMsg:
- return mw.returnJson(False, '数据库连接失败,请检查数据库服务是否启动!')
- if "1133" in mysqlMsg:
- return mw.returnJson(False, '数据库用户不存在!')
- if "1007" in mysqlMsg:
- return mw.returnJson(False, '数据库已经存在!')
- return None
-
-
-def mapToList(map_obj):
- # map to list
- try:
- if type(map_obj) != list and type(map_obj) != str:
- map_obj = list(map_obj)
- return map_obj
- except:
- return []
-
-
-def __createUser(dbname, username, password, address):
- pdb = pMysqlDb()
-
- if username == 'root':
- dbname = '*'
-
- pdb.execute(
- "CREATE USER `%s`@`localhost` IDENTIFIED BY '%s'" % (username, password))
- pdb.execute(
- "grant all privileges on %s.* to `%s`@`localhost`" % (dbname, username))
- for a in address.split(','):
- pdb.execute(
- "CREATE USER `%s`@`%s` IDENTIFIED BY '%s'" % (username, a, password))
- pdb.execute(
- "grant all privileges on %s.* to `%s`@`%s`" % (dbname, username, a))
- pdb.execute("flush privileges")
-
-
-def getDbBackupListFunc(dbname=''):
- bkDir = mw.getRootDir() + '/backup/database'
- blist = os.listdir(bkDir)
- r = []
-
- bname = 'db_' + dbname
- blen = len(bname)
- for x in blist:
- fbstr = x[0:blen]
- if fbstr == bname:
- r.append(x)
- return r
-
-
-def setDbBackup():
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- scDir = mw.getRunDir() + '/scripts/backup.py'
-
- cmd = 'python ' + scDir + ' database ' + args['name'] + ' 3'
- os.system(cmd)
- return mw.returnJson(True, 'ok')
-
-
-def importDbBackup():
- args = getArgs()
- data = checkArgs(args, ['file', 'name'])
- if not data[0]:
- return data[1]
-
- file = args['file']
- name = args['name']
-
- file_path = mw.getRootDir() + '/backup/database/' + file
- file_path_sql = mw.getRootDir() + '/backup/database/' + file.replace('.gz', '')
-
- if not os.path.exists(file_path_sql):
- cmd = 'cd ' + mw.getRootDir() + '/backup/database && gzip -d ' + file
- mw.execShell(cmd)
-
- pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
-
- mysql_cmd = mw.getRootDir() + '/server/mysql/bin/mysql -uroot -p' + pwd + \
- ' ' + name + ' < ' + file_path_sql
-
- # print(mysql_cmd)
- os.system(mysql_cmd)
- return mw.returnJson(True, 'ok')
-
-
-def deleteDbBackup():
- args = getArgs()
- data = checkArgs(args, ['filename'])
- if not data[0]:
- return data[1]
-
- bkDir = mw.getRootDir() + '/backup/database'
-
- os.remove(bkDir + '/' + args['filename'])
- return mw.returnJson(True, 'ok')
-
-
-def getDbBackupList():
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- r = getDbBackupListFunc(args['name'])
- bkDir = mw.getRootDir() + '/backup/database'
- rr = []
- for x in range(0, len(r)):
- p = bkDir + '/' + r[x]
- data = {}
- data['name'] = r[x]
-
- rsize = os.path.getsize(p)
- data['size'] = mw.toSize(rsize)
-
- t = os.path.getctime(p)
- t = time.localtime(t)
-
- data['time'] = time.strftime('%Y-%m-%d %H:%M:%S', t)
- rr.append(data)
-
- data['file'] = p
-
- return mw.returnJson(True, 'ok', rr)
-
-
-def getDbList():
- args = getArgs()
- page = 1
- page_size = 10
- search = ''
- data = {}
- if 'page' in args:
- page = int(args['page'])
-
- if 'page_size' in args:
- page_size = int(args['page_size'])
-
- if 'search' in args:
- search = args['search']
-
- conn = pSqliteDb('databases')
- limit = str((page - 1) * page_size) + ',' + str(page_size)
- condition = ''
- if not search == '':
- condition = "name like '%" + search + "%'"
- field = 'id,pid,name,username,password,accept,ps,addtime'
- clist = conn.where(condition, ()).field(
- field).limit(limit).order('id desc').select()
-
- for x in range(0, len(clist)):
- dbname = clist[x]['name']
- blist = getDbBackupListFunc(dbname)
- # print(blist)
- clist[x]['is_backup'] = False
- if len(blist) > 0:
- clist[x]['is_backup'] = True
-
- count = conn.where(condition, ()).count()
- _page = {}
- _page['count'] = count
- _page['p'] = page
- _page['row'] = page_size
- _page['tojs'] = 'dbList'
- data['page'] = mw.getPage(_page)
- data['data'] = clist
-
- info = {}
- info['root_pwd'] = pSqliteDb('config').where(
- 'id=?', (1,)).getField('mysql_root')
- data['info'] = info
-
- return mw.getJson(data)
-
-
-def syncGetDatabases():
- pdb = pMysqlDb()
- psdb = pSqliteDb('databases')
- data = pdb.query('show databases')
- isError = isSqlError(data)
- if isError != None:
- return isError
- users = pdb.query(
- "select User,Host from mysql.user where User!='root' AND Host!='localhost' AND Host!=''")
- nameArr = ['information_schema', 'performance_schema', 'mysql', 'sys']
- n = 0
- for value in data:
- b = False
- for key in nameArr:
- if value[0] == key:
- b = True
- break
- if b:
- continue
- if psdb.where("name=?", (value[0],)).count():
- continue
- host = '127.0.0.1'
- for user in users:
- if value[0] == user[0]:
- host = user[1]
- break
-
- ps = mw.getMsg('INPUT_PS')
- if value[0] == 'test':
- ps = mw.getMsg('DATABASE_TEST')
- addTime = time.strftime('%Y-%m-%d %X', time.localtime())
- if psdb.add('name,username,password,accept,ps,addtime', (value[0], value[0], '', host, ps, addTime)):
- n += 1
-
- msg = mw.getInfo('本次共从服务器获取了{1}个数据库!', (str(n),))
- return mw.returnJson(True, msg)
-
-
-def toDbBase(find):
- pdb = pMysqlDb()
- psdb = pSqliteDb('databases')
- if len(find['password']) < 3:
- find['username'] = find['name']
- find['password'] = mw.md5(str(time.time()) + find['name'])[0:10]
- psdb.where("id=?", (find['id'],)).save(
- 'password,username', (find['password'], find['username']))
-
- result = pdb.execute("create database `" + find['name'] + "`")
- if "using password:" in str(result):
- return -1
- if "Connection refused" in str(result):
- return -1
-
- password = find['password']
- __createUser(find['name'], find['username'], password, find['accept'])
- return 1
-
-
-def syncToDatabases():
- args = getArgs()
- data = checkArgs(args, ['type', 'ids'])
- if not data[0]:
- return data[1]
-
- pdb = pMysqlDb()
- result = pdb.execute("show databases")
- isError = isSqlError(result)
- if isError:
- return isError
-
- stype = int(args['type'])
- psdb = pSqliteDb('databases')
- n = 0
-
- if stype == 0:
- data = psdb.field('id,name,username,password,accept').select()
- for value in data:
- result = toDbBase(value)
- if result == 1:
- n += 1
- else:
- data = json.loads(args['ids'])
- for value in data:
- find = psdb.where("id=?", (value,)).field(
- 'id,name,username,password,accept').find()
- # print find
- result = toDbBase(find)
- if result == 1:
- n += 1
- msg = mw.getInfo('本次共同步了{1}个数据库!', (str(n),))
- return mw.returnJson(True, msg)
-
-
-def setRootPwd():
- args = getArgs()
- data = checkArgs(args, ['password'])
- if not data[0]:
- return data[1]
-
- password = args['password']
- try:
- pdb = pMysqlDb()
- result = pdb.query("show databases")
- isError = isSqlError(result)
- if isError != None:
- return isError
-
- m_version = mw.readFile(getServerDir() + '/version.pl')
- if m_version.find('5.7') == 0 or m_version.find('8.0') == 0:
- pdb.execute(
- "UPDATE mysql.user SET authentication_string='' WHERE user='root'")
- pdb.execute(
- "ALTER USER 'root'@'localhost' IDENTIFIED BY '%s'" % password)
- pdb.execute(
- "ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY '%s'" % password)
- else:
- result = pdb.execute(
- "update mysql.user set Password=password('" + password + "') where User='root'")
- pdb.execute("flush privileges")
- pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,))
- return mw.returnJson(True, '数据库root密码修改成功!')
- except Exception as ex:
- return mw.returnJson(False, '修改错误:' + str(ex))
-
-
-def setUserPwd():
- args = getArgs()
- data = checkArgs(args, ['password', 'name'])
- if not data[0]:
- return data[1]
-
- newpassword = args['password']
- username = args['name']
- id = args['id']
- try:
- pdb = pMysqlDb()
- psdb = pSqliteDb('databases')
- name = psdb.where('id=?', (id,)).getField('name')
-
- m_version = mw.readFile(getServerDir() + '/version.pl')
- if m_version.find('5.7') == 0 or m_version.find('8.0') == 0:
- tmp = pdb.query(
- "select Host from mysql.user where User='" + name + "' AND Host!='localhost'")
- accept = mapToList(tmp)
- pdb.execute(
- "update mysql.user set authentication_string='' where User='" + username + "'")
- result = pdb.execute(
- "ALTER USER `%s`@`localhost` IDENTIFIED BY '%s'" % (username, newpassword))
- for my_host in accept:
- pdb.execute("ALTER USER `%s`@`%s` IDENTIFIED BY '%s'" % (
- username, my_host[0], newpassword))
- else:
- result = pdb.execute("update mysql.user set Password=password('" +
- newpassword + "') where User='" + username + "'")
- isError = isSqlError(result)
- if isError != None:
- return isError
- pdb.execute("flush privileges")
- psdb.where("id=?", (id,)).setField('password', newpassword)
- return mw.returnJson(True, mw.getInfo('修改数据库[{1}]密码成功!', (name,)))
- except Exception as ex:
- # print str(ex)
- return mw.returnJson(False, mw.getInfo('修改数据库[{1}]密码失败!', (name,)))
-
-
-def setDbPs():
- args = getArgs()
- data = checkArgs(args, ['id', 'name', 'ps'])
- if not data[0]:
- return data[1]
-
- ps = args['ps']
- sid = args['id']
- name = args['name']
- try:
- psdb = pSqliteDb('databases')
- psdb.where("id=?", (sid,)).setField('ps', ps)
- return mw.returnJson(True, mw.getInfo('修改数据库[{1}]备注成功!', (name,)))
- except Exception as e:
- return mw.returnJson(True, mw.getInfo('修改数据库[{1}]备注失败!', (name,)))
-
-
-def addDb():
- args = getArgs()
- data = checkArgs(args,
- ['password', 'name', 'codeing', 'db_user', 'dataAccess', 'ps'])
- if not data[0]:
- return data[1]
-
- if not 'address' in args:
- address = ''
- else:
- address = args['address'].strip()
-
- dbname = args['name'].strip()
- dbuser = args['db_user'].strip()
- codeing = args['codeing'].strip()
- password = args['password'].strip()
- dataAccess = args['dataAccess'].strip()
- ps = args['ps'].strip()
-
- reg = "^[\w\.-]+$"
- if not re.match(reg, args['name']):
- return mw.returnJson(False, '数据库名称不能带有特殊符号!')
- checks = ['root', 'mysql', 'test', 'sys', 'panel_logs']
- if dbuser in checks or len(dbuser) < 1:
- return mw.returnJson(False, '数据库用户名不合法!')
- if dbname in checks or len(dbname) < 1:
- return mw.returnJson(False, '数据库名称不合法!')
-
- if len(password) < 1:
- password = mw.md5(time.time())[0:8]
-
- wheres = {
- 'utf8': 'utf8_general_ci',
- 'utf8mb4': 'utf8mb4_general_ci',
- 'gbk': 'gbk_chinese_ci',
- 'big5': 'big5_chinese_ci'
- }
- codeStr = wheres[codeing]
-
- pdb = pMysqlDb()
- psdb = pSqliteDb('databases')
-
- if psdb.where("name=? or username=?", (dbname, dbuser)).count():
- return mw.returnJson(False, '数据库已存在!')
-
- result = pdb.execute("create database `" + dbname +
- "` DEFAULT CHARACTER SET " + codeing + " COLLATE " + codeStr)
- # print result
- isError = isSqlError(result)
- if isError != None:
- return isError
-
- pdb.execute("drop user '" + dbuser + "'@'localhost'")
- for a in address.split(','):
- pdb.execute("drop user '" + dbuser + "'@'" + a + "'")
-
- __createUser(dbname, dbuser, password, address)
-
- addTime = time.strftime('%Y-%m-%d %X', time.localtime())
- psdb.add('pid,name,username,password,accept,ps,addtime',
- (0, dbname, dbuser, password, address, ps, addTime))
- return mw.returnJson(True, '添加成功!')
-
-
-def delDb():
- args = getArgs()
- data = checkArgs(args, ['id', 'name'])
- if not data[0]:
- return data[1]
- try:
- id = args['id']
- name = args['name']
- psdb = pSqliteDb('databases')
- pdb = pMysqlDb()
- find = psdb.where("id=?", (id,)).field(
- 'id,pid,name,username,password,accept,ps,addtime').find()
- accept = find['accept']
- username = find['username']
-
- # 删除MYSQL
- result = pdb.execute("drop database `" + name + "`")
- isError = isSqlError(result)
- if isError != None:
- return isError
-
- users = pdb.query(
- "select Host from mysql.user where User='" + username + "' AND Host!='localhost'")
- pdb.execute("drop user '" + username + "'@'localhost'")
- for us in users:
- pdb.execute("drop user '" + username + "'@'" + us[0] + "'")
- pdb.execute("flush privileges")
-
- # 删除SQLITE
- psdb.where("id=?", (id,)).delete()
- return mw.returnJson(True, '删除成功!')
- except Exception as ex:
- return mw.returnJson(False, '删除失败!' + str(ex))
-
-
-def getDbAccess():
- args = getArgs()
- data = checkArgs(args, ['username'])
- if not data[0]:
- return data[1]
- username = args['username']
- pdb = pMysqlDb()
-
- users = pdb.query("select Host from mysql.user where User='" +
- username + "' AND Host!='localhost'")
- isError = isSqlError(users)
- if isError != None:
- return isError
-
- users = mapToList(users)
- if len(users) < 1:
- return mw.returnJson(True, "127.0.0.1")
- accs = []
- for c in users:
- accs.append(c[0])
- userStr = ','.join(accs)
- return mw.returnJson(True, userStr)
-
-
-def toSize(size):
- d = ('b', 'KB', 'MB', 'GB', 'TB')
- s = d[0]
- for b in d:
- if size < 1024:
- return str(size) + ' ' + b
- size = size / 1024
- s = b
- _size = round(size, 2)
- # print(size, _size)
- return str(size) + ' ' + b
-
-
-def setDbAccess():
- args = getArgs()
- data = checkArgs(args, ['username', 'access'])
- if not data[0]:
- return data[1]
- name = args['username']
- access = args['access']
- pdb = pMysqlDb()
- psdb = pSqliteDb('databases')
-
- dbname = psdb.where('username=?', (name,)).getField('name')
-
- if name == 'root':
- password = pSqliteDb('config').where(
- 'id=?', (1,)).getField('mysql_root')
- else:
- password = psdb.where("username=?", (name,)).getField('password')
- users = pdb.query("select Host from mysql.user where User='" +
- name + "' AND Host!='localhost'")
- for us in users:
- pdb.execute("drop user '" + name + "'@'" + us[0] + "'")
-
- __createUser(dbname, name, password, access)
-
- psdb.where('username=?', (name,)).save('accept', (access,))
- return mw.returnJson(True, '设置成功!')
-
-
-def getDbInfo():
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- db_name = args['name']
- pdb = pMysqlDb()
- # print 'show tables from `%s`' % db_name
- table_res = pdb.query('show tables from `%s`' % db_name)
- isError = isSqlError(table_res)
- if isError != None:
- return isError
-
- tables = mapToList(table_res)
-
- ret = {}
- if type(tables) == list:
- try:
- data = mapToList(pdb.query(
- "select sum(DATA_LENGTH)+sum(INDEX_LENGTH) from information_schema.tables where table_schema='%s'" % db_name))[0][0]
- except:
- data = 0
-
- if not data:
- data = 0
- ret['data_size'] = mw.toSize(data)
- # print ret
- ret['database'] = db_name
-
- ret3 = []
-
- for i in tables:
- if i == 1049:
- return mw.returnJson(False, '指定数据库不存在!')
- table = mapToList(
- pdb.query("show table status from `%s` where name = '%s'" % (db_name, i[0])))
- if not table:
- continue
- try:
- ret2 = {}
- ret2['type'] = table[0][1]
- ret2['rows_count'] = table[0][4]
- ret2['collation'] = table[0][14]
- data_size = table[0][6] + table[0][8]
- ret2['data_byte'] = data_size
- ret2['data_size'] = mw.toSize(data_size)
- ret2['table_name'] = i[0]
- ret3.append(ret2)
- except:
- continue
- ret['tables'] = (ret3)
-
- return mw.getJson(ret)
-
-
-def repairTable():
- args = getArgs()
- data = checkArgs(args, ['db_name', 'tables'])
- if not data[0]:
- return data[1]
-
- db_name = args['db_name']
- tables = json.loads(args['tables'])
- pdb = pMysqlDb()
- mysql_table = mapToList(pdb.query('show tables from `%s`' % db_name))
- ret = []
- if type(mysql_table) == list:
- if len(mysql_table) > 0:
- for i in mysql_table:
- for i2 in tables:
- if i2 == i[0]:
- ret.append(i2)
- if len(ret) > 0:
- for i in ret:
- pdb.execute('REPAIR TABLE `%s`.`%s`' % (db_name, i))
- return mw.returnJson(True, "修复完成!")
- return mw.returnJson(False, "修复失败!")
-
-
-def optTable():
- args = getArgs()
- data = checkArgs(args, ['db_name', 'tables'])
- if not data[0]:
- return data[1]
-
- db_name = args['db_name']
- tables = json.loads(args['tables'])
- pdb = pMysqlDb()
- mysql_table = mapToList(pdb.query('show tables from `%s`' % db_name))
- ret = []
- if type(mysql_table) == list:
- if len(mysql_table) > 0:
- for i in mysql_table:
- for i2 in tables:
- if i2 == i[0]:
- ret.append(i2)
- if len(ret) > 0:
- for i in ret:
- pdb.execute('OPTIMIZE TABLE `%s`.`%s`' % (db_name, i))
- return mw.returnJson(True, "优化成功!")
- return mw.returnJson(False, "优化失败或者已经优化过了!")
-
-
-def alterTable():
- args = getArgs()
- data = checkArgs(args, ['db_name', 'tables'])
- if not data[0]:
- return data[1]
-
- db_name = args['db_name']
- tables = json.loads(args['tables'])
- table_type = args['table_type']
- pdb = pMysqlDb()
- mysql_table = mapToList(pdb.query('show tables from `%s`' % db_name))
- ret = []
- if type(mysql_table) == list:
- if len(mysql_table) > 0:
- for i in mysql_table:
- for i2 in tables:
- if i2 == i[0]:
- ret.append(i2)
- if len(ret) > 0:
- for i in ret:
- pdb.execute('alter table `%s`.`%s` ENGINE=`%s`' %
- (db_name, i, table_type))
- return mw.returnJson(True, "更改成功!")
- return mw.returnJson(False, "更改失败!")
-
-
-def getTotalStatistics():
- st = status()
- data = {}
-
- isInstall = os.path.exists(getServerDir() + '/version.pl')
-
- if st == 'start' and isInstall:
- data['status'] = True
- data['count'] = pSqliteDb('databases').count()
- data['ver'] = mw.readFile(getServerDir() + '/version.pl').strip()
- return mw.returnJson(True, 'ok', data)
- else:
- data['status'] = False
- data['count'] = 0
- return mw.returnJson(False, 'fail', data)
-
-
-def findBinlogDoDb():
- conf = getConf()
- con = mw.readFile(conf)
- rep = r"binlog-do-db\s*?=\s*?(.*)"
- dodb = re.findall(rep, con, re.M)
- return dodb
-
-
-def findBinlogSlaveDoDb():
- conf = getConf()
- con = mw.readFile(conf)
- rep = r"replicate-do-db\s*?=\s*?(.*)"
- dodb = re.findall(rep, con, re.M)
- return dodb
-
-
-def getMasterDbList(version=''):
- args = getArgs()
- page = 1
- page_size = 10
- search = ''
- data = {}
- if 'page' in args:
- page = int(args['page'])
-
- if 'page_size' in args:
- page_size = int(args['page_size'])
-
- if 'search' in args:
- search = args['search']
-
- conn = pSqliteDb('databases')
- limit = str((page - 1) * page_size) + ',' + str(page_size)
- condition = ''
- dodb = findBinlogDoDb()
- data['dodb'] = dodb
-
- slave_dodb = findBinlogSlaveDoDb()
-
- if not search == '':
- condition = "name like '%" + search + "%'"
- field = 'id,pid,name,username,password,accept,ps,addtime'
- clist = conn.where(condition, ()).field(
- field).limit(limit).order('id desc').select()
- count = conn.where(condition, ()).count()
-
- for x in range(0, len(clist)):
- if clist[x]['name'] in dodb:
- clist[x]['master'] = 1
- else:
- clist[x]['master'] = 0
-
- if clist[x]['name'] in slave_dodb:
- clist[x]['slave'] = 1
- else:
- clist[x]['slave'] = 0
-
- _page = {}
- _page['count'] = count
- _page['p'] = page
- _page['row'] = page_size
- _page['tojs'] = 'dbList'
- data['page'] = mw.getPage(_page)
- data['data'] = clist
-
- return mw.getJson(data)
-
-
-def setDbMaster(version):
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- conf = getConf()
- con = mw.readFile(conf)
- rep = r"(binlog-do-db\s*?=\s*?(.*))"
- dodb = re.findall(rep, con, re.M)
-
- isHas = False
- for x in range(0, len(dodb)):
-
- if dodb[x][1] == args['name']:
- isHas = True
-
- con = con.replace(dodb[x][0] + "\n", '')
- mw.writeFile(conf, con)
-
- if not isHas:
- prefix = '#binlog-do-db'
- con = con.replace(
- prefix, prefix + "\nbinlog-do-db=" + args['name'])
- mw.writeFile(conf, con)
-
- restart(version)
- time.sleep(4)
- return mw.returnJson(True, '设置成功', [args, dodb])
-
-
-def setDbSlave(version):
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- conf = getConf()
- con = mw.readFile(conf)
- rep = r"(replicate-do-db\s*?=\s*?(.*))"
- dodb = re.findall(rep, con, re.M)
-
- isHas = False
- for x in range(0, len(dodb)):
- if dodb[x][1] == args['name']:
- isHas = True
-
- con = con.replace(dodb[x][0] + "\n", '')
- mw.writeFile(conf, con)
-
- if not isHas:
- prefix = '#replicate-do-db'
- con = con.replace(
- prefix, prefix + "\nreplicate-do-db=" + args['name'])
- mw.writeFile(conf, con)
-
- restart(version)
- time.sleep(4)
- return mw.returnJson(True, '设置成功', [args, dodb])
-
-
-def getMasterStatus(version=''):
-
- if status(version) == 'stop':
- return mw.returnJson(False, 'MySQL未启动,或正在启动中...!', [])
-
- conf = getConf()
- con = mw.readFile(conf)
- master_status = False
- if con.find('#log-bin') == -1 and con.find('log-bin') > 1:
- dodb = findBinlogDoDb()
- if len(dodb) > 0:
- master_status = True
- data = {}
- data['status'] = master_status
-
- db = pMysqlDb()
- dlist = db.query('show slave status')
- dlist = list(dlist)
- # print(dlist, len(dlist))
- if len(dlist) > 0 and (dlist[0][10] == 'Yes' or dlist[0][11] == 'Yes'):
- data['slave_status'] = True
-
- return mw.returnJson(master_status, '设置成功', data)
-
-
-def setMasterStatus(version=''):
-
- conf = getConf()
- con = mw.readFile(conf)
-
- if con.find('#log-bin') != -1:
- return mw.returnJson(False, '必须开启二进制日志')
-
- sign = 'mdserver_ms_open'
-
- dodb = findBinlogDoDb()
- if not sign in dodb:
- prefix = '#binlog-do-db'
- con = con.replace(prefix, prefix + "\nbinlog-do-db=" + sign)
- mw.writeFile(conf, con)
- else:
- con = con.replace("binlog-do-db=" + sign + "\n", '')
- rep = r"(binlog-do-db\s*?=\s*?(.*))"
- dodb = re.findall(rep, con, re.M)
- for x in range(0, len(dodb)):
- con = con.replace(dodb[x][0] + "\n", '')
- mw.writeFile(conf, con)
-
- restart(version)
- return mw.returnJson(True, '设置成功')
-
-
-def getMasterRepSlaveList(version=''):
- args = getArgs()
- page = 1
- page_size = 10
- search = ''
- data = {}
- if 'page' in args:
- page = int(args['page'])
-
- if 'page_size' in args:
- page_size = int(args['page_size'])
-
- if 'search' in args:
- search = args['search']
-
- conn = pSqliteDb('master_replication_user')
- limit = str((page - 1) * page_size) + ',' + str(page_size)
- condition = ''
-
- if not search == '':
- condition = "name like '%" + search + "%'"
- field = 'id,username,password,accept,ps,addtime'
- clist = conn.where(condition, ()).field(
- field).limit(limit).order('id desc').select()
- count = conn.where(condition, ()).count()
-
- _page = {}
- _page['count'] = count
- _page['p'] = page
- _page['row'] = page_size
- _page['tojs'] = 'getMasterRepSlaveList'
- data['page'] = mw.getPage(_page)
- data['data'] = clist
-
- return mw.getJson(data)
-
-
-def addMasterRepSlaveUser(version=''):
- version_pl = getServerDir() + "/version.pl"
- if os.path.exists(version_pl):
- version = mw.readFile(version_pl).strip()
-
- args = getArgs()
- data = checkArgs(args, ['username', 'password'])
- if not data[0]:
- return data[1]
-
- if not 'address' in args:
- address = ''
- else:
- address = args['address'].strip()
-
- username = args['username'].strip()
- password = args['password'].strip()
- # ps = args['ps'].strip()
- # address = args['address'].strip()
- # dataAccess = args['dataAccess'].strip()
-
- reg = "^[\w\.-]+$"
- if not re.match(reg, username):
- return mw.returnJson(False, '用户名不能带有特殊符号!')
- checks = ['root', 'mysql', 'test', 'sys', 'panel_logs']
- if username in checks or len(username) < 1:
- return mw.returnJson(False, '用户名不合法!')
- if password in checks or len(password) < 1:
- return mw.returnJson(False, '密码不合法!')
-
- if len(password) < 1:
- password = mw.md5(time.time())[0:8]
-
- pdb = pMysqlDb()
- psdb = pSqliteDb('master_replication_user')
-
- if psdb.where("username=?", (username)).count():
- return mw.returnJson(False, '用户已存在!')
-
- if version == "8.0":
- sql = "CREATE USER '" + username + \
- "'@'%' IDENTIFIED WITH mysql_native_password BY '" + password + "';"
- sql += "grant replication slave on *.* to '" + username + "'@'%';"
- sql += "FLUSH PRIVILEGES;"
- result = pdb.execute(sql)
- isError = isSqlError(result)
- if isError != None:
- return isError
- else:
- sql = "GRANT REPLICATION SLAVE ON *.* TO '" + username + \
- "'@'%' identified by '" + password + "';FLUSH PRIVILEGES;"
- result = pdb.execute(sql)
- isError = isSqlError(result)
- if isError != None:
- return isError
-
- addTime = time.strftime('%Y-%m-%d %X', time.localtime())
- psdb.add('username,password,accept,ps,addtime',
- (username, password, '%', '', addTime))
- return mw.returnJson(True, '添加成功!')
-
-
-def getMasterRepSlaveUserCmd(version):
-
- version_pl = getServerDir() + "/version.pl"
- if os.path.exists(version_pl):
- version = mw.readFile(version_pl).strip()
-
- args = getArgs()
- data = checkArgs(args, ['username', 'db'])
- if not data[0]:
- return data[1]
-
- psdb = pSqliteDb('master_replication_user')
- f = 'username,password'
- if args['username'] == '':
-
- count = psdb.count()
-
- if count == 0:
- return mw.returnJson(False, '请添加同步账户!')
-
- clist = psdb.field(f).limit('1').order('id desc').select()
- else:
- clist = psdb.field(f).where("username=?", (args['username'],)).limit(
- '1').order('id desc').select()
-
- ip = mw.getLocalIp()
- port = getMyPort()
-
- db = pMysqlDb()
- mstatus = db.query('show master status')
- # print(mstatus)
- mstatus = list(mstatus)
- if len(mstatus) == 0:
- return mw.returnJson(False, '未开启!')
-
- sql = "CHANGE MASTER TO MASTER_HOST='" + ip + "', MASTER_PORT=" + port + ", MASTER_USER='" + \
- clist[0]['username'] + "', MASTER_PASSWORD='" + \
- clist[0]['password'] + \
- "', MASTER_LOG_FILE='" + mstatus[0][0] + \
- "',MASTER_LOG_POS=" + str(mstatus[0][1]) + ""
-
- if version == "8.0":
- sql = "CHANGE REPLICATION SOURCE TO SOURCE_HOST='" + ip + "', SOURCE_PORT=" + port + ", SOURCE_USER='" + \
- clist[0]['username'] + "', SOURCE_PASSWORD='" + \
- clist[0]['password'] + \
- "', SOURCE_LOG_FILE='" + mstatus[0][0] + \
- "',SOURCE_LOG_POS=" + str(mstatus[0][1]) + ""
-
- return mw.returnJson(True, 'OK!', sql)
-
-
-def delMasterRepSlaveUser(version=''):
- args = getArgs()
- data = checkArgs(args, ['username'])
- if not data[0]:
- return data[1]
-
- pdb = pMysqlDb()
- psdb = pSqliteDb('master_replication_user')
- pdb.execute("drop user '" + args['username'] + "'@'%'")
- psdb.where("username=?", (args['username'],)).delete()
-
- return mw.returnJson(True, '删除成功!')
-
-
-def updateMasterRepSlaveUser(version=''):
- args = getArgs()
- data = checkArgs(args, ['username', 'password'])
- if not data[0]:
- return data[1]
-
- pdb = pMysqlDb()
- psdb = pSqliteDb('master_replication_user')
- pdb.execute("drop user '" + args['username'] + "'@'%'")
-
- pdb.execute("GRANT REPLICATION SLAVE ON *.* TO '" +
- args['username'] + "'@'%' identified by '" + args['password'] + "'")
-
- psdb.where("username=?", (args['username'],)).save(
- 'password', args['password'])
-
- return mw.returnJson(True, '更新成功!')
-
-
-def getSlaveSSHList(version=''):
- args = getArgs()
- data = checkArgs(args, ['page', 'page_size'])
- if not data[0]:
- return data[1]
-
- page = int(args['page'])
- page_size = int(args['page_size'])
-
- conn = pSqliteDb('slave_id_rsa')
- limit = str((page - 1) * page_size) + ',' + str(page_size)
-
- field = 'id,ip,port,id_rsa,ps,addtime'
- clist = conn.field(field).limit(limit).order('id desc').select()
- count = conn.count()
-
- data = {}
- _page = {}
- _page['count'] = count
- _page['p'] = page
- _page['row'] = page_size
- _page['tojs'] = args['tojs']
- data['page'] = mw.getPage(_page)
- data['data'] = clist
-
- return mw.getJson(data)
-
-
-def getSlaveSSHByIp(version=''):
- args = getArgs()
- data = checkArgs(args, ['ip'])
- if not data[0]:
- return data[1]
-
- ip = args['ip']
-
- conn = pSqliteDb('slave_id_rsa')
- data = conn.field('ip,port,id_rsa').where("ip=?", (ip,)).select()
- return mw.returnJson(True, 'ok', data)
-
-
-def addSlaveSSH(version=''):
- import base64
-
- args = getArgs()
- data = checkArgs(args, ['ip'])
- if not data[0]:
- return data[1]
-
- ip = args['ip']
- if ip == "":
- return mw.returnJson(True, 'ok')
-
- data = checkArgs(args, ['port', 'id_rsa'])
- if not data[0]:
- return data[1]
-
- id_rsa = args['id_rsa']
- port = args['port']
- user = 'root'
- addTime = time.strftime('%Y-%m-%d %X', time.localtime())
-
- conn = pSqliteDb('slave_id_rsa')
- data = conn.field('ip,id_rsa').where("ip=?", (ip,)).select()
- if len(data) > 0:
- res = conn.where("ip=?", (ip,)).save('port,id_rsa', (port, id_rsa,))
- else:
- conn.add('ip,port,user,id_rsa,ps,addtime',
- (ip, port, user, id_rsa, '', addTime))
-
- return mw.returnJson(True, '设置成功!')
-
-
-def delSlaveSSH(version=''):
- args = getArgs()
- data = checkArgs(args, ['ip'])
- if not data[0]:
- return data[1]
-
- ip = args['ip']
-
- conn = pSqliteDb('slave_id_rsa')
- conn.where("ip=?", (ip,)).delete()
- return mw.returnJson(True, 'ok')
-
-
-def updateSlaveSSH(version=''):
- args = getArgs()
- data = checkArgs(args, ['ip', 'id_rsa'])
- if not data[0]:
- return data[1]
-
- ip = args['ip']
- id_rsa = args['id_rsa']
- conn = pSqliteDb('slave_id_rsa')
- conn.where("ip=?", (ip,)).save('id_rsa', (id_rsa,))
- return mw.returnJson(True, 'ok')
-
-
-def getSlaveList(version=''):
-
- db = pMysqlDb()
- dlist = db.query('show slave status')
- dlist = list(dlist)
- # print(dlist)
- ret = []
- for x in range(0, len(dlist)):
- tmp = {}
- tmp['Master_User'] = dlist[x][2]
- tmp['Master_Host'] = dlist[x][1]
- tmp['Master_Port'] = dlist[x][3]
- tmp['Master_Log_File'] = dlist[x][5]
- tmp['Slave_IO_Running'] = dlist[x][10]
- tmp['Slave_SQL_Running'] = dlist[x][11]
- ret.append(tmp)
- data = {}
- data['data'] = ret
-
- return mw.getJson(data)
-
-
-def getSlaveSyncCmd(version=''):
-
- root = mw.getRunDir()
- cmd = 'cd ' + root + ' && python ' + root + \
- '/plugins/mysql/index.py do_full_sync {"db":"all"}'
- return mw.returnJson(True, 'ok', cmd)
-
-
-def setSlaveStatus(version=''):
- db = pMysqlDb()
- dlist = db.query('show slave status')
- dlist = list(dlist)
- if len(dlist) == 0:
- return mw.returnJson(False, '需要手动添加主服务同步命令!')
-
- if len(dlist) > 0 and (dlist[0][10] == 'Yes' or dlist[0][11] == 'Yes'):
- db.query('stop slave')
- else:
- db.query('start slave')
-
- return mw.returnJson(True, '设置成功!')
-
-
-def deleteSlave(version=''):
- db = pMysqlDb()
- dlist = db.query('stop slave;reset slave all')
- return mw.returnJson(True, '删除成功!')
-
-
-def dumpMysqlData(version):
-
- args = getArgs()
- data = checkArgs(args, ['db'])
- if not data[0]:
- return data[1]
-
- pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
- if args['db'] == 'all' or args['db'] == 'ALL':
- dlist = findBinlogDoDb()
- cmd = getServerDir() + "/bin/mysqldump -uroot -p" + \
- pwd + " --databases " + ' '.join(dlist) + \
- " > /tmp/dump.sql"
- else:
- cmd = getServerDir() + "/bin/mysqldump -uroot -p" + pwd + \
- " --databases " + args['db'] + " > /tmp/dump.sql"
-
- ret = mw.execShell(cmd)
-
- if ret[0] == '':
- return 'ok'
- return 'fail'
-
-
-from threading import Thread
-from time import sleep
-
-
-def mw_async(f):
- def wrapper(*args, **kwargs):
- thr = Thread(target=f, args=args, kwargs=kwargs)
- thr.start()
- return wrapper
-
-
-############### --- 重要 同步---- ###########
-
-def writeDbSyncStatus(data):
- path = '/tmp/db_async_status.txt'
- # status_data['code'] = 1
- # status_data['msg'] = '主服务器备份完成...'
- # status_data['progress'] = 30
- mw.writeFile(path, json.dumps(data))
-
-
-def doFullSync():
-
- args = getArgs()
- data = checkArgs(args, ['db'])
- if not data[0]:
- return data[1]
-
- arg_db_select = args['db']
-
- status_data = {}
- status_data['progress'] = 5
-
- db = pMysqlDb()
-
- dlist = db.query('show slave status')
- dlist = list(dlist)
- if len(dlist) == 0:
- status_data['code'] = -1
- status_data['msg'] = '没有启动...'
-
- ip = dlist[0][1]
- print("master ip:", ip)
-
- id_rsa_conn = pSqliteDb('slave_id_rsa')
- data = id_rsa_conn.field('ip,port,id_rsa').where("ip=?", (ip,)).select()
-
- SSH_PRIVATE_KEY = "/tmp/mysql_sync_id_rsa.txt"
- id_rsa_key = data[0]['id_rsa']
- id_rsa_key = id_rsa_key.replace('\\n', '\n')
- master_port = int(data[0]['port'])
-
- mw.writeFile(SSH_PRIVATE_KEY, id_rsa_key)
-
- writeDbSyncStatus({'code': 0, 'msg': '开始同步...', 'progress': 0})
-
- import paramiko
- paramiko.util.log_to_file('paramiko.log')
- ssh = paramiko.SSHClient()
-
- print(SSH_PRIVATE_KEY)
- if not os.path.exists(SSH_PRIVATE_KEY):
- writeDbSyncStatus({'code': 0, 'msg': '需要配置SSH......', 'progress': 0})
- return 'fail'
-
- try:
- key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY)
- # ssh.load_system_host_keys()
- ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- ssh.connect(hostname=ip, port=master_port, username='root', pkey=key)
- except Exception as e:
- writeDbSyncStatus(
- {'code': 0, 'msg': 'SSH配置错误:' + str(e), 'progress': 0})
- return 'fail'
-
- writeDbSyncStatus({'code': 0, 'msg': '登录Master成功...', 'progress': 5})
-
- cmd = "cd /www/server/mdserver-web && python /www/server/mdserver-web/plugins/mysql/index.py dump_mysql_data {\"db\":'" + args[
- 'db'] + "'}"
- stdin, stdout, stderr = ssh.exec_command(cmd)
- result = stdout.read()
- result_err = stderr.read()
-
- result = result.decode('utf-8')
- # print(result)
- if result.strip() == 'ok':
- writeDbSyncStatus({'code': 1, 'msg': '主服务器备份完成...', 'progress': 30})
- else:
- writeDbSyncStatus({'code': 1, 'msg': '主服务器备份失败...', 'progress': 30})
- return 'fail'
-
- r = mw.execShell('scp root@' + ip + ':/tmp/dump.sql /tmp')
- if r[0] == '':
- writeDbSyncStatus({'code': 2, 'msg': '数据同步本地完成...', 'progress': 40})
-
- cmd = 'cd /www/server/mdserver-web && python /www/server/mdserver-web/plugins/mysql/index.py get_master_rep_slave_user_cmd {"username":"","db":""}'
- stdin, stdout, stderr = ssh.exec_command(cmd)
- result = stdout.read()
- result_err = stderr.read()
- cmd_data = json.loads(result)
- # print(cmd_data)
-
- db.query('stop slave')
- writeDbSyncStatus({'code': 3, 'msg': '停止从库完成...', 'progress': 45})
-
- dlist = db.query(cmd_data['data'])
- writeDbSyncStatus({'code': 4, 'msg': '刷新从库同步信息完成...', 'progress': 50})
-
- pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
- root_dir = getServerDir()
- msock = root_dir + "/mysql.sock"
- cmd = root_dir + "/bin/mysql -S " + msock + \
- " -uroot -p" + pwd + " < /tmp/dump.sql"
- import_data = mw.execShell(cmd)
- print(import_data[0])
- print(import_data[1])
- if import_data[0] == '':
- writeDbSyncStatus({'code': 5, 'msg': '导入数据完成...', 'progress': 90})
- else:
- writeDbSyncStatus({'code': 5, 'msg': '导入数据失败...', 'progress': 90})
- return 'fail'
-
- db.query('start slave')
- writeDbSyncStatus({'code': 6, 'msg': '从库重启完成...', 'progress': 100})
-
- os.system("rm -rf " + SSH_PRIVATE_KEY)
- os.system("rm -rf /tmp/dump.sql")
- return True
-
-
-def fullSync(version=''):
- args = getArgs()
- data = checkArgs(args, ['db', 'begin'])
- if not data[0]:
- return data[1]
-
- status_file = '/tmp/db_async_status.txt'
- if args['begin'] == '1':
- cmd = 'cd ' + mw.getRunDir() + ' && python ' + \
- getPluginDir() + \
- '/index.py do_full_sync {"db":"' + args['db'] + '"} &'
- # print(cmd)
- mw.execShell(cmd)
- return json.dumps({'code': 0, 'msg': '同步数据中!', 'progress': 0})
-
- if os.path.exists(status_file):
- c = mw.readFile(status_file)
- tmp = json.loads(c)
- if tmp['code'] == 1:
- dump_size = os.path.getsize("/tmp/dump.sql")
- tmp['msg'] = tmp['msg'] + ":" + "同步文件:" + mw.toSize(dump_size)
- c = json.dumps(tmp)
-
- # if tmp['code'] == 6:
- # os.remove(status_file)
- return c
-
- return json.dumps({'code': 0, 'msg': '点击开始,开始同步!', 'progress': 0})
-
-
-def installPreInspection(version):
- swap_path = mw.getServerDir() + "/swap"
- if not os.path.exists(swap_path):
- return "为了稳定安装MySQL,先安装swap插件!"
- return 'ok'
-
-
-def uninstallPreInspection(version):
- # return "请手动删除MySQL[{}]".format(version)
- return 'ok'
-
-if __name__ == "__main__":
- func = sys.argv[1]
-
- version = "5.6"
- if (len(sys.argv) > 2):
- version = sys.argv[2]
-
- if func == 'status':
- print(status(version))
- elif func == 'start':
- print(start(version))
- elif func == 'stop':
- print(stop(version))
- elif func == 'restart':
- print(restart(version))
- elif func == 'reload':
- print(reload(version))
- elif func == 'initd_status':
- print(initdStatus())
- elif func == 'initd_install':
- print(initdInstall())
- elif func == 'initd_uninstall':
- print(initdUinstall())
- elif func == 'install_pre_inspection':
- print(installPreInspection(version))
- elif func == 'uninstall_pre_inspection':
- print(uninstallPreInspection(version))
- elif func == 'run_info':
- print(runInfo())
- elif func == 'db_status':
- print(myDbStatus())
- elif func == 'set_db_status':
- print(setDbStatus())
- elif func == 'conf':
- print(getConf())
- elif func == 'bin_log':
- print(binLog())
- elif func == 'clean_bin_log':
- print(cleanBinLog())
- elif func == 'error_log':
- print(getErrorLog())
- elif func == 'show_log':
- print(getShowLogFile())
- elif func == 'my_db_pos':
- print(getMyDbPos())
- elif func == 'set_db_pos':
- print(setMyDbPos())
- elif func == 'my_port':
- print(getMyPort())
- elif func == 'set_my_port':
- print(setMyPort())
- elif func == 'init_pwd':
- print(initMysqlPwd())
- elif func == 'get_db_list':
- print(getDbList())
- elif func == 'set_db_backup':
- print(setDbBackup())
- elif func == 'import_db_backup':
- print(importDbBackup())
- elif func == 'delete_db_backup':
- print(deleteDbBackup())
- elif func == 'get_db_backup_list':
- print(getDbBackupList())
- elif func == 'add_db':
- print(addDb())
- elif func == 'del_db':
- print(delDb())
- elif func == 'sync_get_databases':
- print(syncGetDatabases())
- elif func == 'sync_to_databases':
- print(syncToDatabases())
- elif func == 'set_root_pwd':
- print(setRootPwd())
- elif func == 'set_user_pwd':
- print(setUserPwd())
- elif func == 'get_db_access':
- print(getDbAccess())
- elif func == 'set_db_access':
- print(setDbAccess())
- elif func == 'set_db_ps':
- print(setDbPs())
- elif func == 'get_db_info':
- print(getDbInfo())
- elif func == 'repair_table':
- print(repairTable())
- elif func == 'opt_table':
- print(optTable())
- elif func == 'alter_table':
- print(alterTable())
- elif func == 'get_total_statistics':
- print(getTotalStatistics())
- elif func == 'get_masterdb_list':
- print(getMasterDbList(version))
- elif func == 'get_master_status':
- print(getMasterStatus(version))
- elif func == 'set_master_status':
- print(setMasterStatus(version))
- elif func == 'set_db_master':
- print(setDbMaster(version))
- elif func == 'set_db_slave':
- print(setDbSlave(version))
- elif func == 'get_master_rep_slave_list':
- print(getMasterRepSlaveList(version))
- elif func == 'add_master_rep_slave_user':
- print(addMasterRepSlaveUser(version))
- elif func == 'del_master_rep_slave_user':
- print(delMasterRepSlaveUser(version))
- elif func == 'update_master_rep_slave_user':
- print(updateMasterRepSlaveUser(version))
- elif func == 'get_master_rep_slave_user_cmd':
- print(getMasterRepSlaveUserCmd(version))
- elif func == 'get_slave_list':
- print(getSlaveList(version))
- elif func == 'get_slave_sync_cmd':
- print(getSlaveSyncCmd(version))
- elif func == 'get_slave_ssh_list':
- print(getSlaveSSHList(version))
- elif func == 'get_slave_ssh_by_ip':
- print(getSlaveSSHByIp(version))
- elif func == 'add_slave_ssh':
- print(addSlaveSSH(version))
- elif func == 'del_slave_ssh':
- print(delSlaveSSH(version))
- elif func == 'update_slave_ssh':
- print(updateSlaveSSH(version))
- elif func == 'set_slave_status':
- print(setSlaveStatus(version))
- elif func == 'delete_slave':
- print(deleteSlave(version))
- elif func == 'full_sync':
- print(fullSync(version))
- elif func == 'do_full_sync':
- print(doFullSync())
- elif func == 'dump_mysql_data':
- print(dumpMysqlData(version))
- else:
- print('error')
diff --git a/plugins/openresty/bak/index_2022_6_17.py b/plugins/openresty/bak/index_2022_6_17.py
deleted file mode 100755
index 490e06417..000000000
--- a/plugins/openresty/bak/index_2022_6_17.py
+++ /dev/null
@@ -1,309 +0,0 @@
-# coding:utf-8
-
-import sys
-import io
-import os
-import time
-import subprocess
-
-sys.path.append(os.getcwd() + "/class/core")
-import mw
-
-
-app_debug = False
-
-if mw.isAppleSystem():
- app_debug = True
-
-
-def getPluginName():
- return 'openresty'
-
-
-def getPluginDir():
- return mw.getPluginDir() + '/' + getPluginName()
-
-
-def getServerDir():
- return mw.getServerDir() + '/' + getPluginName()
-
-
-def getInitDFile():
- if app_debug:
- return '/tmp/' + getPluginName()
- return '/etc/init.d/' + getPluginName()
-
-
-def getArgs():
- args = sys.argv[2:]
- tmp = {}
- args_len = len(args)
-
- if args_len == 1:
- t = args[0].strip('{').strip('}')
- t = t.split(':')
- tmp[t[0]] = t[1]
- elif args_len > 1:
- for i in range(len(args)):
- t = args[i].split(':')
- tmp[t[0]] = t[1]
-
- return tmp
-
-
-def clearTemp():
- path_bin = getServerDir() + "/nginx"
- mw.execShell('rm -rf ' + path_bin + '/client_body_temp')
- mw.execShell('rm -rf ' + path_bin + '/fastcgi_temp')
- mw.execShell('rm -rf ' + path_bin + '/proxy_temp')
- mw.execShell('rm -rf ' + path_bin + '/scgi_temp')
- mw.execShell('rm -rf ' + path_bin + '/uwsgi_temp')
-
-
-def getConf():
- path = getServerDir() + "/nginx/conf/nginx.conf"
- return path
-
-
-def getConfTpl():
- path = getPluginDir() + '/conf/nginx.conf'
- return path
-
-
-def getOs():
- data = {}
- data['os'] = mw.getOs()
- ng_exe_bin = getServerDir() + "/nginx/sbin/nginx"
- if checkAuthEq(ng_exe_bin, 'root'):
- data['auth'] = True
- else:
- data['auth'] = False
- return mw.getJson(data)
-
-
-def getInitDTpl():
- path = getPluginDir() + "/init.d/nginx.tpl"
- return path
-
-
-def makeConf():
- vhost = getServerDir() + '/nginx/conf/vhost'
- if not os.path.exists(vhost):
- os.mkdir(vhost)
- php_status = getServerDir() + '/nginx/conf/php_status'
- if not os.path.exists(php_status):
- os.mkdir(php_status)
-
-
-def getFileOwner(filename):
- import pwd
- stat = os.lstat(filename)
- uid = stat.st_uid
- pw = pwd.getpwuid(uid)
- return pw.pw_name
-
-
-def checkAuthEq(file, owner='root'):
- fowner = getFileOwner(file)
- if (fowner == owner):
- return True
- return False
-
-
-def confReplace():
- service_path = os.path.dirname(os.getcwd())
- content = mw.readFile(getConfTpl())
- content = content.replace('{$SERVER_PATH}', service_path)
-
- user = 'www'
- user_group = 'www'
-
- if mw.getOs() == 'darwin':
- # macosx do
- user = mw.execShell(
- "who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
- # user = 'root'
- user_group = 'staff'
- content = content.replace('{$EVENT_MODEL}', 'kqueue')
- else:
- content = content.replace('{$EVENT_MODEL}', 'epoll')
-
- content = content.replace('{$OS_USER}', user)
- content = content.replace('{$OS_USER_GROUP}', user_group)
-
- nconf = getServerDir() + '/nginx/conf/nginx.conf'
-
- __content = mw.readFile(nconf)
- if __content.find('#user'):
- mw.writeFile(getServerDir() + '/nginx/conf/nginx.conf', content)
-
- # give nginx root permission
- ng_exe_bin = getServerDir() + "/nginx/sbin/nginx"
- if not checkAuthEq(ng_exe_bin, 'root'):
- args = getArgs()
- sudoPwd = args['pwd']
- cmd_own = 'chown -R ' + 'root:' + user_group + ' ' + ng_exe_bin
- os.system('echo %s|sudo -S %s' % (sudoPwd, cmd_own))
- cmd_mod = 'chmod 755 ' + ng_exe_bin
- os.system('echo %s|sudo -S %s' % (sudoPwd, cmd_mod))
- cmd_s = 'chmod u+s ' + ng_exe_bin
- os.system('echo %s|sudo -S %s' % (sudoPwd, cmd_s))
-
-
-def initDreplace():
-
- file_tpl = getInitDTpl()
- service_path = os.path.dirname(os.getcwd())
-
- initD_path = getServerDir() + '/init.d'
-
- # Openresty is not installed
- if not os.path.exists(getServerDir()):
- print("ok")
- exit(0)
-
- file_bin = initD_path + '/' + getPluginName()
- if not os.path.exists(initD_path):
- os.mkdir(initD_path)
-
- # initd replace
- content = mw.readFile(file_tpl)
- content = content.replace('{$SERVER_PATH}', service_path)
- mw.writeFile(file_bin, content)
- mw.execShell('chmod +x ' + file_bin)
-
- # config replace
- confReplace()
-
- # make nginx vhost or other
- makeConf()
-
- return file_bin
-
-
-def status():
- data = mw.execShell(
- "ps -ef|grep nginx |grep -v grep | grep -v python | awk '{print $2}'")
- if data[0] == '':
- return 'stop'
- return 'start'
-
-
-def start():
- file = initDreplace()
- data = mw.execShell(file + ' start')
- if data[1] == '':
- return 'ok'
- return data[1]
-
-
-def stop():
- file = initDreplace()
- data = mw.execShell(file + ' stop')
- clearTemp()
- if data[1] == '':
- return 'ok'
- return data[1]
-
-
-def restart():
- file = initDreplace()
- data = mw.execShell(file + ' restart')
- if data[1] == '':
- return 'ok'
- return data[1]
-
-
-def reload():
- file = initDreplace()
- data = mw.execShell(file + ' reload')
- if data[1] == '':
- return 'ok'
- return data[1]
-
-
-def initdStatus():
- if not app_debug:
- if mw.isAppleSystem():
- return "Apple Computer does not support"
- initd_bin = getInitDFile()
- if os.path.exists(initd_bin):
- return 'ok'
- return 'fail'
-
-
-def initdInstall():
- import shutil
- if not app_debug:
- if mw.isAppleSystem():
- return "Apple Computer does not support"
-
- source_bin = initDreplace()
- initd_bin = getInitDFile()
- shutil.copyfile(source_bin, initd_bin)
- mw.execShell('chmod +x ' + initd_bin)
- mw.execShell('chkconfig --add ' + getPluginName())
- return 'ok'
-
-
-def initdUinstall():
- if not app_debug:
- if mw.isAppleSystem():
- return "Apple Computer does not support"
-
- mw.execShell('chkconfig --del ' + getPluginName())
- initd_bin = getInitDFile()
- os.remove(initd_bin)
- return 'ok'
-
-
-def runInfo():
- # 取Openresty负载状态
- try:
- result = mw.httpGet('http://127.0.0.1/nginx_status')
- tmp = result.split()
- data = {}
- data['active'] = tmp[2]
- data['accepts'] = tmp[9]
- data['handled'] = tmp[7]
- data['requests'] = tmp[8]
- data['Reading'] = tmp[11]
- data['Writing'] = tmp[13]
- data['Waiting'] = tmp[15]
- return mw.getJson(data)
- except Exception as e:
- return 'oprenresty not started'
-
-
-def errorLogPath():
- return getServerDir() + '/nginx/logs/error.log'
-
-
-if __name__ == "__main__":
- func = sys.argv[1]
- if func == 'status':
- print(status())
- elif func == 'start':
- print(start())
- elif func == 'stop':
- print(stop())
- elif func == 'restart':
- print(restart())
- elif func == 'reload':
- print(reload())
- elif func == 'initd_status':
- print(initdStatus())
- elif func == 'initd_install':
- print(initdInstall())
- elif func == 'initd_uninstall':
- print(initdUinstall())
- elif func == 'conf':
- print(getConf())
- elif func == 'get_os':
- print(getOs())
- elif func == 'run_info':
- print(runInfo())
- elif func == 'error_log':
- print(errorLogPath())
- else:
- print('error')
diff --git a/plugins/php/bak/index_2022_6_18.py b/plugins/php/bak/index_2022_6_18.py
deleted file mode 100755
index d07bb8195..000000000
--- a/plugins/php/bak/index_2022_6_18.py
+++ /dev/null
@@ -1,725 +0,0 @@
-# coding:utf-8
-
-import sys
-import io
-import os
-import time
-import re
-import json
-import shutil
-
-# reload(sys)
-# sys.setdefaultencoding('utf8')
-
-sys.path.append(os.getcwd() + "/class/core")
-# sys.path.append("/usr/local/lib/python3.6/site-packages")
-
-import mw
-
-if mw.isAppleSystem():
- cmd = 'ls /usr/local/lib/ | grep python | cut -d \\ -f 1 | awk \'END {print}\''
- info = mw.execShell(cmd)
- p = "/usr/local/lib/" + info[0].strip() + "/site-packages"
- sys.path.append(p)
-
-app_debug = False
-if mw.isAppleSystem():
- app_debug = True
-
-
-def getPluginName():
- return 'php'
-
-
-def getPluginDir():
- return mw.getPluginDir() + '/' + getPluginName()
-
-
-def getServerDir():
- return mw.getServerDir() + '/' + getPluginName()
-
-
-def getInitDFile(version):
- if app_debug:
- return '/tmp/' + getPluginName()
- return '/etc/init.d/' + getPluginName() + version
-
-
-def getArgs():
- args = sys.argv[3:]
- tmp = {}
- args_len = len(args)
-
- if args_len == 1:
- t = args[0].strip('{').strip('}')
- t = t.split(':')
- tmp[t[0]] = t[1]
- elif args_len > 1:
- for i in range(len(args)):
- t = args[i].split(':')
- tmp[t[0]] = t[1]
-
- return tmp
-
-
-def checkArgs(data, ck=[]):
- for i in range(len(ck)):
- if not ck[i] in data:
- return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
- return (True, mw.returnJson(True, 'ok'))
-
-
-def getConf(version):
- path = getServerDir() + '/' + version + '/etc/php.ini'
- return path
-
-
-def status(version):
- cmd = "ps -ef|grep 'php/" + version + \
- "' |grep -v grep | grep -v python | awk '{print $2}'"
- data = mw.execShell(cmd)
- if data[0] == '':
- return 'stop'
- return 'start'
-
-
-def contentReplace(content, version):
- service_path = mw.getServerDir()
- content = content.replace('{$ROOT_PATH}', mw.getRootDir())
- content = content.replace('{$SERVER_PATH}', service_path)
- content = content.replace('{$PHP_VERSION}', version)
- content = content.replace('{$LOCAL_IP}', mw.getLocalIp())
-
- if mw.isAppleSystem():
- # user = mw.execShell(
- # "who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
- content = content.replace('{$PHP_USER}', 'nobody')
- content = content.replace('{$PHP_GROUP}', 'nobody')
-
- rep = 'listen.owner\s*=\s*(.+)\r?\n'
- val = ';listen.owner = nobody\n'
- content = re.sub(rep, val, content)
-
- rep = 'listen.group\s*=\s*(.+)\r?\n'
- val = ';listen.group = nobody\n'
- content = re.sub(rep, val, content)
-
- rep = 'user\s*=\s*(.+)\r?\n'
- val = ';user = nobody\n'
- content = re.sub(rep, val, content)
-
- rep = r'[^\.]group\s*=\s*(.+)\r?\n'
- val = ';group = nobody\n'
- content = re.sub(rep, val, content)
-
- else:
- content = content.replace('{$PHP_USER}', 'www')
- content = content.replace('{$PHP_GROUP}', 'www')
- return content
-
-
-def makeOpenrestyConf():
- phpversions = ['00', '52', '53', '54', '55', '56',
- '70', '71', '72', '73', '74', '80', '81']
- if mw.isInstalledWeb():
- sdir = mw.getServerDir()
- d_pathinfo = sdir + '/openresty/nginx/conf/pathinfo.conf'
- if not os.path.exists(d_pathinfo):
- s_pathinfo = getPluginDir() + '/conf/pathinfo.conf'
- shutil.copyfile(s_pathinfo, d_pathinfo)
-
- info = getPluginDir() + '/info.json'
- content = mw.readFile(info)
- content = json.loads(content)
- versions = content['versions']
- tpl = getPluginDir() + '/conf/enable-php.conf'
- tpl_content = mw.readFile(tpl)
- for x in phpversions:
- dfile = sdir + '/openresty/nginx/conf/enable-php-' + x + '.conf'
- if not os.path.exists(dfile):
- if x == '00':
- mw.writeFile(dfile, '')
- else:
- w_content = contentReplace(tpl_content, x)
- mw.writeFile(dfile, w_content)
-
- # php-fpm status
- for version in phpversions:
- dfile = sdir + '/openresty/nginx/conf/php_status/phpfpm_status_' + version + '.conf'
- tpl = getPluginDir() + '/conf/phpfpm_status.conf'
- if not os.path.exists(dfile):
- content = mw.readFile(tpl)
- content = contentReplace(content, version)
- mw.writeFile(dfile, content)
- mw.restartWeb()
-
-
-def phpPrependFile(version):
- app_start = getServerDir() + '/app_start.php'
- if not os.path.exists(app_start):
- tpl = getPluginDir() + '/conf/app_start.php'
- content = mw.readFile(tpl)
- content = contentReplace(content, version)
- mw.writeFile(app_start, content)
-
-
-def phpFpmReplace(version):
- desc_php_fpm = getServerDir() + '/' + version + '/etc/php-fpm.conf'
- if not os.path.exists(desc_php_fpm):
- tpl_php_fpm = getPluginDir() + '/conf/php-fpm.conf'
- content = mw.readFile(tpl_php_fpm)
- content = contentReplace(content, version)
- mw.writeFile(desc_php_fpm, content)
- else:
- if version == '52':
- tpl_php_fpm = tpl_php_fpm = getPluginDir() + '/conf/php-fpm-52.conf'
- content = mw.readFile(tpl_php_fpm)
- mw.writeFile(desc_php_fpm, content)
-
-
-def phpFpmWwwReplace(version):
- service_php_fpm_dir = getServerDir() + '/' + version + '/etc/php-fpm.d/'
-
- if not os.path.exists(service_php_fpm_dir):
- os.mkdir(service_php_fpm_dir)
-
- service_php_fpmwww = service_php_fpm_dir + '/www.conf'
- if not os.path.exists(service_php_fpmwww):
- tpl_php_fpmwww = getPluginDir() + '/conf/www.conf'
- content = mw.readFile(tpl_php_fpmwww)
- content = contentReplace(content, version)
- mw.writeFile(service_php_fpmwww, content)
-
-
-def makePhpIni(version):
- d_ini = mw.getServerDir() + '/php/' + version + '/etc/php.ini'
- if not os.path.exists(d_ini):
- s_ini = getPluginDir() + '/conf/php' + version[0:1] + '.ini'
- # shutil.copyfile(s_ini, d_ini)
- content = mw.readFile(s_ini)
- if version == '52':
- content = content + "auto_prepend_file=/www/server/php/app_start.php"
- mw.writeFile(d_ini, content)
-
-
-def initReplace(version):
- makeOpenrestyConf()
- makePhpIni(version)
-
- initD_path = getServerDir() + '/init.d'
- if not os.path.exists(initD_path):
- os.mkdir(initD_path)
-
- file_bin = initD_path + '/php' + version
- if not os.path.exists(file_bin):
- file_tpl = getPluginDir() + '/init.d/php.tpl'
-
- if version == '52':
- file_tpl = getPluginDir() + '/init.d/php52.tpl'
-
- content = mw.readFile(file_tpl)
- content = contentReplace(content, version)
-
- mw.writeFile(file_bin, content)
- mw.execShell('chmod +x ' + file_bin)
-
- phpPrependFile(version)
- phpFpmWwwReplace(version)
- phpFpmReplace(version)
-
- session_path = '/tmp/session'
- if not os.path.exists(session_path):
- os.mkdir(session_path)
- if not mw.isAppleSystem():
- mw.execShell('chown -R www:www ' + session_path)
-
- upload_path = '/tmp/upload'
- if not os.path.exists(upload_path):
- os.mkdir(upload_path)
- if not mw.isAppleSystem():
- mw.execShell('chown -R www:www ' + upload_path)
- return file_bin
-
-
-def phpOp(version, method):
- file = initReplace(version)
- data = mw.execShell(file + ' ' + method)
- if data[1] == '':
- return 'ok'
- return data[1]
-
-
-def start(version):
- return phpOp(version, 'start')
-
-
-def stop(version):
- return phpOp(version, 'stop')
-
-
-def restart(version):
- return phpOp(version, 'restart')
-
-
-def reload(version):
- return phpOp(version, 'reload')
-
-
-def initdStatus(version):
- if not app_debug:
- if mw.isAppleSystem():
- return "Apple Computer does not support"
- initd_bin = getInitDFile(version)
- if os.path.exists(initd_bin):
- return 'ok'
- return 'fail'
-
-
-def initdInstall(version):
- import shutil
- if not app_debug:
- if mw.isAppleSystem():
- return "Apple Computer does not support"
-
- source_bin = initReplace(version)
- initd_bin = getInitDFile(version)
- shutil.copyfile(source_bin, initd_bin)
- mw.execShell('chmod +x ' + initd_bin)
- mw.execShell('chkconfig --add ' + getPluginName() + version)
- return 'ok'
-
-
-def initdUinstall(version):
- if not app_debug:
- if mw.isAppleSystem():
- return "Apple Computer does not support"
-
- mw.execShell('chkconfig --del ' + getPluginName())
- initd_bin = getInitDFile(version)
- os.remove(initd_bin)
- return 'ok'
-
-
-def fpmLog(version):
- return getServerDir() + '/' + version + '/var/log/php-fpm.log'
-
-
-def fpmSlowLog(version):
- return getServerDir() + '/' + version + '/var/log/www-slow.log'
-
-
-def getPhpConf(version):
- gets = [
- {'name': 'short_open_tag', 'type': 1, 'ps': '短标签支持'},
- {'name': 'asp_tags', 'type': 1, 'ps': 'ASP标签支持'},
- {'name': 'max_execution_time', 'type': 2, 'ps': '最大脚本运行时间'},
- {'name': 'max_input_time', 'type': 2, 'ps': '最大输入时间'},
- {'name': 'max_input_var', 'type': 2, 'ps': '最大输入数量'},
- {'name': 'memory_limit', 'type': 2, 'ps': '脚本内存限制'},
- {'name': 'post_max_size', 'type': 2, 'ps': 'POST数据最大尺寸'},
- {'name': 'file_uploads', 'type': 1, 'ps': '是否允许上传文件'},
- {'name': 'upload_max_filesize', 'type': 2, 'ps': '允许上传文件的最大尺寸'},
- {'name': 'max_file_uploads', 'type': 2, 'ps': '允许同时上传文件的最大数量'},
- {'name': 'default_socket_timeout', 'type': 2, 'ps': 'Socket超时时间'},
- {'name': 'error_reporting', 'type': 3, 'ps': '错误级别'},
- {'name': 'display_errors', 'type': 1, 'ps': '是否输出详细错误信息'},
- {'name': 'cgi.fix_pathinfo', 'type': 0, 'ps': '是否开启pathinfo'},
- {'name': 'date.timezone', 'type': 3, 'ps': '时区'}
- ]
- phpini = mw.readFile(getServerDir() + '/' + version + '/etc/php.ini')
- result = []
- for g in gets:
- rep = g['name'] + '\s*=\s*([0-9A-Za-z_& ~]+)(\s*;?|\r?\n)'
- tmp = re.search(rep, phpini)
- if not tmp:
- continue
- g['value'] = tmp.groups()[0]
- result.append(g)
- return mw.getJson(result)
-
-
-def submitPhpConf(version):
- gets = ['display_errors', 'cgi.fix_pathinfo', 'date.timezone', 'short_open_tag',
- 'asp_tags', 'max_execution_time', 'max_input_time', 'memory_limit',
- 'post_max_size', 'file_uploads', 'upload_max_filesize', 'max_file_uploads',
- 'default_socket_timeout', 'error_reporting']
- args = getArgs()
- filename = getServerDir() + '/' + version + '/etc/php.ini'
- phpini = mw.readFile(filename)
- for g in gets:
- if g in args:
- rep = g + '\s*=\s*(.+)\r?\n'
- val = g + ' = ' + args[g] + '\n'
- phpini = re.sub(rep, val, phpini)
- mw.writeFile(filename, phpini)
- mw.execShell(getServerDir() + '/init.d/php' + version + ' reload')
- return mw.returnJson(True, '设置成功')
-
-
-def getLimitConf(version):
- fileini = getServerDir() + "/" + version + "/etc/php.ini"
- phpini = mw.readFile(fileini)
- filefpm = getServerDir() + "/" + version + "/etc/php-fpm.conf"
- phpfpm = mw.readFile(filefpm)
-
- # print fileini, filefpm
- data = {}
- try:
- rep = "upload_max_filesize\s*=\s*([0-9]+)M"
- tmp = re.search(rep, phpini).groups()
- data['max'] = tmp[0]
- except:
- data['max'] = '50'
-
- try:
- rep = "request_terminate_timeout\s*=\s*([0-9]+)\n"
- tmp = re.search(rep, phpfpm).groups()
- data['maxTime'] = tmp[0]
- except:
- data['maxTime'] = 0
-
- try:
- rep = r"\n;*\s*cgi\.fix_pathinfo\s*=\s*([0-9]+)\s*\n"
- tmp = re.search(rep, phpini).groups()
-
- if tmp[0] == '1':
- data['pathinfo'] = True
- else:
- data['pathinfo'] = False
- except:
- data['pathinfo'] = False
-
- return mw.getJson(data)
-
-
-def setMaxTime(version):
- args = getArgs()
- data = checkArgs(args, ['time'])
- if not data[0]:
- return data[1]
-
- time = args['time']
- if int(time) < 30 or int(time) > 86400:
- return mw.returnJson(False, '请填写30-86400间的值!')
-
- filefpm = getServerDir() + "/" + version + "/etc/php-fpm.conf"
- conf = mw.readFile(filefpm)
- rep = "request_terminate_timeout\s*=\s*([0-9]+)\n"
- conf = re.sub(rep, "request_terminate_timeout = " + time + "\n", conf)
- mw.writeFile(filefpm, conf)
-
- fileini = getServerDir() + "/" + version + "/etc/php.ini"
- phpini = mw.readFile(fileini)
- rep = "max_execution_time\s*=\s*([0-9]+)\r?\n"
- phpini = re.sub(rep, "max_execution_time = " + time + "\n", phpini)
- rep = "max_input_time\s*=\s*([0-9]+)\r?\n"
- phpini = re.sub(rep, "max_input_time = " + time + "\n", phpini)
- mw.writeFile(fileini, phpini)
- return mw.returnJson(True, '设置成功!')
-
-
-def setMaxSize(version):
- args = getArgs()
- if not 'max' in args:
- return 'missing time args!'
- max = args['max']
- if int(max) < 2:
- return mw.returnJson(False, '上传大小限制不能小于2MB!')
-
- path = getServerDir() + '/' + version + '/etc/php.ini'
- conf = mw.readFile(path)
- rep = u"\nupload_max_filesize\s*=\s*[0-9]+M"
- conf = re.sub(rep, u'\nupload_max_filesize = ' + max + 'M', conf)
- rep = u"\npost_max_size\s*=\s*[0-9]+M"
- conf = re.sub(rep, u'\npost_max_size = ' + max + 'M', conf)
- mw.writeFile(path, conf)
-
- msg = mw.getInfo('设置PHP-{1}最大上传大小为[{2}MB]!', (version, max,))
- mw.writeLog('插件管理[PHP]', msg)
- return mw.returnJson(True, '设置成功!')
-
-
-def getFpmConfig(version):
-
- filefpm = getServerDir() + '/' + version + '/etc/php-fpm.d/www.conf'
- conf = mw.readFile(filefpm)
- data = {}
- rep = "\s*pm.max_children\s*=\s*([0-9]+)\s*"
- tmp = re.search(rep, conf).groups()
- data['max_children'] = tmp[0]
-
- rep = "\s*pm.start_servers\s*=\s*([0-9]+)\s*"
- tmp = re.search(rep, conf).groups()
- data['start_servers'] = tmp[0]
-
- rep = "\s*pm.min_spare_servers\s*=\s*([0-9]+)\s*"
- tmp = re.search(rep, conf).groups()
- data['min_spare_servers'] = tmp[0]
-
- rep = "\s*pm.max_spare_servers \s*=\s*([0-9]+)\s*"
- tmp = re.search(rep, conf).groups()
- data['max_spare_servers'] = tmp[0]
-
- rep = "\s*pm\s*=\s*(\w+)\s*"
- tmp = re.search(rep, conf).groups()
- data['pm'] = tmp[0]
- return mw.getJson(data)
-
-
-def setFpmConfig(version):
- args = getArgs()
- # if not 'max' in args:
- # return 'missing time args!'
-
- version = args['version']
- max_children = args['max_children']
- start_servers = args['start_servers']
- min_spare_servers = args['min_spare_servers']
- max_spare_servers = args['max_spare_servers']
- pm = args['pm']
-
- file = getServerDir() + '/' + version + '/etc/php-fpm.d/www.conf'
- conf = mw.readFile(file)
-
- rep = "\s*pm.max_children\s*=\s*([0-9]+)\s*"
- conf = re.sub(rep, "\npm.max_children = " + max_children, conf)
-
- rep = "\s*pm.start_servers\s*=\s*([0-9]+)\s*"
- conf = re.sub(rep, "\npm.start_servers = " + start_servers, conf)
-
- rep = "\s*pm.min_spare_servers\s*=\s*([0-9]+)\s*"
- conf = re.sub(rep, "\npm.min_spare_servers = " +
- min_spare_servers, conf)
-
- rep = "\s*pm.max_spare_servers \s*=\s*([0-9]+)\s*"
- conf = re.sub(rep, "\npm.max_spare_servers = " +
- max_spare_servers + "\n", conf)
-
- rep = "\s*pm\s*=\s*(\w+)\s*"
- conf = re.sub(rep, "\npm = " + pm + "\n", conf)
-
- mw.writeFile(file, conf)
- reload(version)
-
- msg = mw.getInfo('设置PHP-{1}并发设置,max_children={2},start_servers={3},min_spare_servers={4},max_spare_servers={5}', (version, max_children,
- start_servers, min_spare_servers, max_spare_servers,))
- mw.writeLog('插件管理[PHP]', msg)
- return mw.returnJson(True, '设置成功!')
-
-
-def checkFpmStatusFile(version):
- if mw.isInstalledWeb():
- sdir = mw.getServerDir()
- dfile = sdir + '/openresty/nginx/conf/php_status/phpfpm_status_' + version + '.conf'
- if not os.path.exists(dfile):
- tpl = getPluginDir() + '/conf/phpfpm_status.conf'
- content = mw.readFile(tpl)
- content = contentReplace(content, version)
- mw.writeFile(dfile, content)
- mw.restartWeb()
-
-
-def getFpmStatus(version):
- checkFpmStatusFile(version)
- result = mw.httpGet(
- 'http://127.0.0.1/phpfpm_status_' + version + '?json')
- tmp = json.loads(result)
- fTime = time.localtime(int(tmp['start time']))
- tmp['start time'] = time.strftime('%Y-%m-%d %H:%M:%S', fTime)
- return mw.getJson(tmp)
-
-
-def getDisableFunc(version):
- filename = mw.getServerDir() + '/php/' + version + '/etc/php.ini'
- if not os.path.exists(filename):
- return mw.returnJson(False, '指定PHP版本不存在!')
-
- phpini = mw.readFile(filename)
- data = {}
- rep = "disable_functions\s*=\s{0,1}(.*)\n"
- tmp = re.search(rep, phpini).groups()
- data['disable_functions'] = tmp[0]
- return mw.getJson(data)
-
-
-def setDisableFunc(version):
- filename = mw.getServerDir() + '/php/' + version + '/etc/php.ini'
- if not os.path.exists(filename):
- return mw.returnJson(False, '指定PHP版本不存在!')
-
- args = getArgs()
- disable_functions = args['disable_functions']
-
- phpini = mw.readFile(filename)
- rep = "disable_functions\s*=\s*.*\n"
- phpini = re.sub(rep, 'disable_functions = ' +
- disable_functions + "\n", phpini)
-
- msg = mw.getInfo('修改PHP-{1}的禁用函数为[{2}]', (version, disable_functions,))
- mw.writeLog('插件管理[PHP]', msg)
- mw.writeFile(filename, phpini)
- reload(version)
- return mw.returnJson(True, '设置成功!')
-
-
-def checkPhpinfoFile(v):
- if mw.isInstalledWeb():
- sdir = mw.getServerDir()
- dfile = sdir + '/openresty/nginx/conf/php_status/phpinfo_' + v + '.conf'
- if not os.path.exists(dfile):
- tpl = getPluginDir() + '/conf/phpinfo.conf'
- content = mw.readFile(tpl)
- content = contentReplace(content, v)
- mw.writeFile(dfile, content)
- mw.restartWeb()
-
-
-def getPhpinfo(v):
- checkPhpinfoFile(v)
- sPath = mw.getRootDir() + '/phpinfo/' + v
- mw.execShell("rm -rf " + mw.getRootDir() + '/phpinfo')
- mw.execShell("mkdir -p " + sPath)
- mw.writeFile(sPath + '/phpinfo.php', '')
- url = 'http://127.0.0.1/' + v + '/phpinfo.php'
- phpinfo = mw.httpGet(url)
- os.system("rm -rf " + mw.getRootDir() + '/phpinfo')
- return phpinfo
-
-
-def get_php_info(args):
- return getPhpinfo(args['version'])
-
-
-def getLibConf(version):
- fname = mw.getServerDir() + '/php/' + version + '/etc/php.ini'
- if not os.path.exists(fname):
- return mw.returnJson(False, '指定PHP版本不存在!')
-
- phpini = mw.readFile(fname)
-
- libpath = getPluginDir() + '/versions/phplib.conf'
- phplib = json.loads(mw.readFile(libpath))
-
- libs = []
- tasks = mw.M('tasks').where(
- "status!=?", ('1',)).field('status,name').select()
- for lib in phplib:
- lib['task'] = '1'
- for task in tasks:
- tmp = mw.getStrBetween('[', ']', task['name'])
- if not tmp:
- continue
- tmp1 = tmp.split('-')
- if tmp1[0].lower() == lib['name'].lower():
- lib['task'] = task['status']
- lib['phpversions'] = []
- lib['phpversions'].append(tmp1[1])
- if phpini.find(lib['check']) == -1:
- lib['status'] = False
- else:
- lib['status'] = True
- libs.append(lib)
- return mw.returnJson(True, 'OK!', libs)
-
-
-def installLib(version):
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- name = args['name']
- execstr = "cd " + getPluginDir() + '/versions/' + version + " && /bin/bash " + \
- name + '.sh' + ' install ' + version
-
- rettime = time.strftime('%Y-%m-%d %H:%M:%S')
- insert_info = (None, '安装[' + name + '-' + version + ']',
- 'execshell', '0', rettime, execstr)
- mw.M('tasks').add('id,name,type,status,addtime,execstr', insert_info)
- return mw.returnJson(True, '已将下载任务添加到队列!')
-
-
-def uninstallLib(version):
- args = getArgs()
- data = checkArgs(args, ['name'])
- if not data[0]:
- return data[1]
-
- name = args['name']
- execstr = "cd " + getPluginDir() + '/versions/' + version + " && /bin/bash " + \
- name + '.sh' + ' uninstall ' + version
-
- data = mw.execShell(execstr)
- if data[0] == '' and data[1] == '':
- return mw.returnJson(True, '已经卸载成功!')
- else:
- return mw.returnJson(False, '卸载信息![通道0]:' + data[0] + "[通道0]:" + data[1])
-
-
-def getConfAppStart():
- pstart = mw.getServerDir() + '/php/app_start.php'
- return pstart
-
-if __name__ == "__main__":
-
- if len(sys.argv) < 3:
- print('missing parameters')
- exit(0)
-
- func = sys.argv[1]
- version = sys.argv[2]
-
- if func == 'status':
- print(status(version))
- elif func == 'start':
- print(start(version))
- elif func == 'stop':
- print(stop(version))
- elif func == 'restart':
- print(restart(version))
- elif func == 'reload':
- print(reload(version))
- elif func == 'initd_status':
- print(initdStatus(version))
- elif func == 'initd_install':
- print(initdInstall(version))
- elif func == 'initd_uninstall':
- print(initdUinstall(version))
- elif func == 'fpm_log':
- print(fpmLog(version))
- elif func == 'fpm_slow_log':
- print(fpmSlowLog(version))
- elif func == 'conf':
- print(getConf(version))
- elif func == 'app_start':
- print(getConfAppStart())
- elif func == 'get_php_conf':
- print(getPhpConf(version))
- elif func == 'submit_php_conf':
- print(submitPhpConf(version))
- elif func == 'get_limit_conf':
- print(getLimitConf(version))
- elif func == 'set_max_time':
- print(setMaxTime(version))
- elif func == 'set_max_size':
- print(setMaxSize(version))
- elif func == 'get_fpm_conf':
- print(getFpmConfig(version))
- elif func == 'set_fpm_conf':
- print(setFpmConfig(version))
- elif func == 'get_fpm_status':
- print(getFpmStatus(version))
- elif func == 'get_disable_func':
- print(getDisableFunc(version))
- elif func == 'set_disable_func':
- print(setDisableFunc(version))
- elif func == 'get_phpinfo':
- print(getPhpinfo(version))
- elif func == 'get_lib_conf':
- print(getLibConf(version))
- elif func == 'install_lib':
- print(installLib(version))
- elif func == 'uninstall_lib':
- print(uninstallLib(version))
- else:
- print("fail")