Update index.py

pull/125/head
midoks 3 years ago
parent b1b5dcda11
commit dd99bff1ba
  1. 528
      plugins/mariadb/index.py

@ -1209,389 +1209,6 @@ def getTotalStatistics():
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()
@ -1616,151 +1233,6 @@ def dumpMysqlData(version):
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})
def uninstallPreInspection(version):
# return "请手动删除MySQL[{}]".format(version)
return 'ok'

Loading…
Cancel
Save