mdserver-web/plugins/mongodb/index.py

1723 lines
47 KiB
Python
Raw Permalink Normal View History

2021-11-22 16:03:55 -05:00
# coding:utf-8
import sys
import io
import os
import time
2023-12-12 01:51:47 -05:00
import re
2023-12-16 03:30:34 -05:00
import json
import datetime
2024-05-01 08:33:36 -04:00
import yaml
2021-11-22 16:03:55 -05:00
2024-11-23 17:02:41 -05:00
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
2021-11-22 16:03:55 -05:00
app_debug = False
if mw.isAppleSystem():
app_debug = True
2021-11-22 16:18:14 -05:00
# /usr/lib/systemd/system/mongod.service
2024-05-05 07:54:18 -04:00
# python3 /www/server/mdserver-web/plugins/mongodb/index.py repl_init
2024-05-05 08:27:58 -04:00
# python3 /www/server/mdserver-web/plugins/mongodb/index.py run_repl_info
2024-05-05 12:16:51 -04:00
# python3 /www/server/mdserver-web/plugins/mongodb/index.py test_data
2024-05-06 05:51:26 -04:00
# python3 /www/server/mdserver-web/plugins/mongodb/index.py run_info
2024-05-05 07:53:34 -04:00
2021-11-22 16:03:55 -05:00
def getPluginName():
return 'mongodb'
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 getConf():
2023-08-16 10:37:31 -04:00
path = getServerDir() + "/mongodb.conf"
return path
2021-11-22 16:03:55 -05:00
2024-05-05 06:03:40 -04:00
def getConfKey():
key = getServerDir() + "/mongodb.key"
return key
2021-11-22 16:03:55 -05:00
def getConfTpl():
path = getPluginDir() + "/config/mongodb.conf"
return path
2024-05-01 08:33:36 -04:00
def getConfigData():
cfg = getConf()
config_data = mw.readFile(cfg)
try:
config = yaml.safe_load(config_data)
except:
config = {
"systemLog": {
"destination": "file",
"logAppend": True,
"path": mw.getServerDir()+"/mongodb/log/mongodb.log"
},
"storage": {
"dbPath": mw.getServerDir()+"/mongodb/data",
"directoryPerDB": True,
"journal": {
"enabled": True
}
},
"processManagement": {
"fork": True,
"pidFilePath": mw.getServerDir()+"/mongodb/log/mongodb.pid"
},
"net": {
"port": 27017,
"bindIp": "0.0.0.0"
},
"security": {
"authorization": "enabled",
"javascriptEnabled": False
}
}
return config
def setConfig(config_data):
2024-05-04 03:37:18 -04:00
# t = status()
2024-05-01 08:33:36 -04:00
cfg = getConf()
try:
mw.writeFile(cfg, yaml.safe_dump(config_data))
except:
return False
return True
2021-11-22 16:03:55 -05:00
def getInitDTpl():
path = getPluginDir() + "/init.d/" + getPluginName() + ".tpl"
return path
2024-05-03 07:26:25 -04:00
def getConfIp():
data = getConfigData()
return data['net']['bindIp']
2024-05-14 04:13:06 -04:00
def getConfLocalIp():
return '127.0.0.1'
2023-12-12 01:51:47 -05:00
def getConfPort():
2024-05-01 08:33:36 -04:00
data = getConfigData()
return data['net']['port']
# file = getConf()
# content = mw.readFile(file)
# rep = 'port\s*=\s*(.*)'
# tmp = re.search(rep, content)
# return tmp.groups()[0].strip()
def getConfAuth():
data = getConfigData()
return data['security']['authorization']
# file = getConf()
# content = mw.readFile(file)
# rep = 'auth\s*=\s*(.*)'
# tmp = re.search(rep, content)
# return tmp.groups()[0].strip()
2023-12-12 01:51:47 -05:00
2021-11-22 16:03:55 -05:00
def getArgs():
args = sys.argv[2:]
tmp = {}
args_len = len(args)
if args_len == 1:
t = args[0].strip('{').strip('}')
2024-05-01 11:48:40 -04:00
t = t.split(':', 1)
2021-11-22 16:03:55 -05:00
tmp[t[0]] = t[1]
elif args_len > 1:
for i in range(len(args)):
2024-05-01 11:48:40 -04:00
t = args[i].split(':', 1)
2021-11-22 16:03:55 -05:00
tmp[t[0]] = t[1]
return tmp
2024-05-01 11:48:40 -04:00
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'))
2021-11-22 16:03:55 -05:00
def status():
data = mw.execShell(
2024-05-02 03:52:10 -04:00
"ps -ef|grep mongod |grep -v mongosh|grep -v grep | grep -v /Applications | grep -v python | grep -v mdserver-web | awk '{print $2}'")
2021-11-22 16:03:55 -05:00
if data[0] == '':
return 'stop'
return 'start'
2024-05-01 08:33:36 -04:00
def pSqliteDb(dbname='users'):
file = getServerDir() + '/mongodb.db'
name = 'mongodb'
sql_file = getPluginDir() + '/config/mongodb.sql'
import_sql = mw.readFile(sql_file)
# print(sql_file,import_sql)
md5_sql = mw.md5(import_sql)
import_sign = False
save_md5_file = getServerDir() + '/import_mongodb.md5'
if os.path.exists(save_md5_file):
save_md5_sql = mw.readFile(save_md5_file)
if save_md5_sql != md5_sql:
import_sign = True
mw.writeFile(save_md5_file, md5_sql)
else:
mw.writeFile(save_md5_file, md5_sql)
if not os.path.exists(file) or import_sql:
conn = mw.M(dbname).dbPos(getServerDir(), name)
csql_list = import_sql.split(';')
for index in range(len(csql_list)):
conn.execute(csql_list[index], ())
conn = mw.M(dbname).dbPos(getServerDir(), name)
return conn
2024-05-02 03:52:10 -04:00
def mongdbClientS():
2024-05-01 08:33:36 -04:00
import pymongo
port = getConfPort()
auth = getConfAuth()
2024-05-14 04:13:06 -04:00
ip = getConfLocalIp()
2024-05-01 08:33:36 -04:00
mg_root = pSqliteDb('config').where('id=?', (1,)).getField('mg_root')
if auth == 'disabled':
2026-05-07 04:12:16 -04:00
client = pymongo.MongoClient(host=ip, port=int(port))
2024-05-01 08:33:36 -04:00
else:
2024-05-02 03:52:10 -04:00
# print(auth,mg_root)
2026-05-07 04:12:16 -04:00
# 使用 admin 数据库进行认证,兼容 MongoDB 3.0
client = pymongo.MongoClient(host=ip, port=int(port), username='root', password=mg_root, authSource='admin')
2024-05-01 08:33:36 -04:00
return client
2026-05-07 04:22:03 -04:00
def getMongoDBVersion():
'''获取MongoDB版本号'''
import pymongo
port = getConfPort()
ip = getConfLocalIp()
try:
# 先不使用认证连接
client = pymongo.MongoClient(host=ip, port=int(port), serverSelectionTimeoutMS=5000)
db = client.admin
serverStatus = db.command('serverStatus')
version = serverStatus.get('version', '4.0')
client.close()
return version
except Exception as e:
# 如果无法获取版本,默认返回 4.0(新版本兼容模式)
return '4.0'
def isMongoDB3x():
'''判断是否为MongoDB 3.x版本'''
version = getMongoDBVersion()
# 匹配 3.x 版本
if version.startswith('3.'):
return True
return False
2024-05-02 03:52:10 -04:00
def mongdbClient():
2024-05-01 08:33:36 -04:00
import pymongo
port = getConfPort()
auth = getConfAuth()
2024-05-14 04:13:06 -04:00
ip = getConfLocalIp()
2024-05-01 08:33:36 -04:00
mg_root = pSqliteDb('config').where('id=?', (1,)).getField('mg_root')
2026-05-07 04:22:03 -04:00
2024-05-01 08:33:36 -04:00
if auth == 'disabled':
2026-05-07 04:12:16 -04:00
client = pymongo.MongoClient(host=ip, port=int(port))
2024-05-01 08:33:36 -04:00
else:
2026-05-07 04:22:03 -04:00
# 根据MongoDB版本选择认证方式
if isMongoDB3x():
# MongoDB 3.x 使用 authSource 指定认证数据库
client = pymongo.MongoClient(host=ip, port=int(port), username='root', password=mg_root, authSource='admin')
else:
# MongoDB 4.x+ 默认在 admin 数据库认证
client = pymongo.MongoClient(host=ip, port=int(port), username='root', password=mg_root)
2024-05-01 08:33:36 -04:00
return client
2021-11-22 16:03:55 -05:00
def initDreplace():
2024-05-03 06:30:50 -04:00
mg_key = getServerDir() + "/mongodb.key"
if not os.path.exists(mg_key):
2024-05-05 11:36:34 -04:00
mw.execShell("openssl rand -base64 756 >> "+mg_key)
mw.execShell("chmod 400 "+mg_key)
2024-05-03 06:30:50 -04:00
2021-11-22 16:03:55 -05:00
file_tpl = getInitDTpl()
2024-11-29 04:11:28 -05:00
service_path = mw.getServerDir()
2021-11-22 16:03:55 -05:00
initD_path = getServerDir() + '/init.d'
if not os.path.exists(initD_path):
os.mkdir(initD_path)
file_bin = initD_path + '/' + getPluginName()
2023-08-16 12:10:38 -04:00
logs_dir = getServerDir() + '/logs'
if not os.path.exists(logs_dir):
os.mkdir(logs_dir)
data_dir = getServerDir() + '/data'
if not os.path.exists(data_dir):
os.mkdir(data_dir)
2023-12-12 01:43:49 -05:00
install_ok = getServerDir() + "/install.lock"
2023-12-12 01:44:39 -05:00
if os.path.exists(install_ok):
2023-12-12 01:43:49 -05:00
return file_bin
2023-12-12 01:44:23 -05:00
mw.writeFile(install_ok, 'ok')
2023-12-12 01:43:49 -05:00
2021-11-22 16:03:55 -05:00
# 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
conf_content = mw.readFile(getConfTpl())
conf_content = conf_content.replace('{$SERVER_PATH}', service_path)
mw.writeFile(getServerDir() + '/mongodb.conf', conf_content)
2023-08-16 10:18:31 -04:00
# systemd
systemDir = mw.systemdCfgDir()
systemService = systemDir + '/mongodb.service'
systemServiceTpl = getPluginDir() + '/init.d/mongodb.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')
2021-11-22 16:03:55 -05:00
return file_bin
2022-07-02 23:31:34 -04:00
def mgOp(method):
file = initDreplace()
2021-11-22 16:03:55 -05:00
if mw.isAppleSystem():
2022-07-02 23:31:34 -04:00
data = mw.execShell(file + ' ' + method)
2024-01-21 11:16:25 -05:00
# print(data)
2021-11-22 16:03:55 -05:00
if data[1] == '':
return 'ok'
2022-07-02 09:19:19 -04:00
return data[1]
2023-08-16 10:24:41 -04:00
data = mw.execShell('systemctl ' + method + ' ' + getPluginName())
if data[1] == '':
return 'ok'
2023-08-16 10:20:12 -04:00
return 'fail'
2021-11-22 16:03:55 -05:00
2022-07-02 23:31:34 -04:00
def start():
2023-10-18 12:04:38 -04:00
mw.execShell(
2023-10-18 12:32:06 -04:00
'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/www/server/lib/openssl11/lib')
2022-07-02 23:31:34 -04:00
return mgOp('start')
2021-11-22 16:03:55 -05:00
2022-06-13 01:33:45 -04:00
2022-07-02 23:31:34 -04:00
def stop():
return mgOp('stop')
2021-11-22 16:03:55 -05:00
def reload():
2022-07-02 23:31:34 -04:00
return mgOp('reload')
2022-05-04 16:51:28 -04:00
def restart():
if os.path.exists("/tmp/mongodb-27017.sock"):
mw.execShell('rm -rf ' + "/tmp/mongodb-27017.sock")
2021-11-22 16:03:55 -05:00
2022-07-02 23:31:34 -04:00
return mgOp('restart')
2021-11-22 16:03:55 -05:00
2024-05-01 08:33:36 -04:00
def getConfig():
2024-05-02 03:52:10 -04:00
t = status()
if t == 'stop':
return mw.returnJson(False,'未启动!')
2024-05-01 08:33:36 -04:00
d = getConfigData()
return mw.returnJson(True,'ok',d)
def saveConfig():
d = getConfigData()
2024-05-01 11:48:40 -04:00
args = getArgs()
data = checkArgs(args, ['bind_ip','port','data_path','log','pid_file_path'])
if not data[0]:
return data[1]
d['net']['bindIp'] = args['bind_ip']
2024-05-01 11:55:28 -04:00
d['net']['port'] = int(args['port'])
2024-05-01 11:48:40 -04:00
d['storage']['dbPath'] = args['data_path']
d['systemLog']['path'] = args['log']
d['processManagement']['pidFilePath'] = args['pid_file_path']
setConfig(d)
2024-05-03 06:30:50 -04:00
restart()
2024-05-01 11:48:40 -04:00
return mw.returnJson(True,'设置成功')
2024-05-01 08:33:36 -04:00
2024-05-02 12:45:28 -04:00
def initMgRoot(password='',force=0):
if force == 1:
d = getConfigData()
auth_t = d['security']['authorization']
d['security']['authorization'] = 'disabled'
setConfig(d)
2024-05-05 08:27:58 -04:00
restart()
2024-05-02 12:45:28 -04:00
client = mongdbClient()
db = client.admin
db_all_rules = [
{'role': 'root', 'db': 'admin'},
{'role': 'clusterAdmin', 'db': 'admin'},
{'role': 'readAnyDatabase', 'db': 'admin'},
{'role': 'readWriteAnyDatabase', 'db': 'admin'},
{'role': 'userAdminAnyDatabase', 'db': 'admin'},
{'role': 'dbAdminAnyDatabase', 'db': 'admin'},
{'role': 'userAdmin', 'db': 'admin'},
{'role': 'dbAdmin', 'db': 'admin'}
]
if password =='':
mg_pass = mw.getRandomString(8)
else:
mg_pass = password
try:
db.command("createUser", "root", pwd=mg_pass, roles=db_all_rules)
except Exception as e:
if force == 0:
db.command("updateUser", "root", pwd=mg_pass, roles=db_all_rules)
else:
db.command('dropUser','root')
db.command("createUser", "root", pwd=mg_pass, roles=db_all_rules)
r = pSqliteDb('config').where('id=?', (1,)).save('mg_root',(mg_pass,))
if force == 1:
d['security']['authorization'] = auth_t
setConfig(d)
2024-05-05 08:27:58 -04:00
restart()
2024-05-02 12:45:28 -04:00
return True
2024-05-02 03:52:10 -04:00
def initUserRoot():
d = getConfigData()
auth_t = d['security']['authorization']
d['security']['authorization'] = 'disabled'
setConfig(d)
2024-05-03 04:16:16 -04:00
restart()
time.sleep(1)
2024-05-02 03:52:10 -04:00
client = mongdbClient()
db = client.admin
db_all_rules = [
{'role': 'root', 'db': 'admin'},
{'role': 'clusterAdmin', 'db': 'admin'},
{'role': 'readAnyDatabase', 'db': 'admin'},
{'role': 'readWriteAnyDatabase', 'db': 'admin'},
{'role': 'userAdminAnyDatabase', 'db': 'admin'},
{'role': 'dbAdminAnyDatabase', 'db': 'admin'},
{'role': 'userAdmin', 'db': 'admin'},
{'role': 'dbAdmin', 'db': 'admin'}
]
# db.command("updateUser", "root", pwd=mg_pass, roles=db_all_rules)
mg_pass = mw.getRandomString(8)
try:
r1 = db.command("createUser", "root", pwd=mg_pass, roles=db_all_rules)
# print(r1)
except Exception as e:
# print(e)
r1 = db.command('dropUser','root')
r2 = db.command("createUser", "root", pwd=mg_pass, roles=db_all_rules)
# print(r1, r2)
r = pSqliteDb('config').where('id=?', (1,)).save('mg_root',(mg_pass,))
d['security']['authorization'] = auth_t
setConfig(d)
2024-05-03 04:16:16 -04:00
restart()
2024-05-02 03:52:10 -04:00
return True
2024-05-01 11:50:45 -04:00
def setConfigAuth():
2024-05-02 03:52:10 -04:00
init_db_root = getServerDir() + '/init_db_root.lock'
if not os.path.exists(init_db_root):
initUserRoot()
mw.writeFile(init_db_root,'ok')
2024-05-01 11:55:28 -04:00
2024-05-02 03:52:10 -04:00
d = getConfigData()
if d['security']['authorization'] == 'enabled':
d['security']['authorization'] = 'disabled'
2024-05-03 07:01:34 -04:00
del d['security']['keyFile']
2024-05-02 03:52:10 -04:00
setConfig(d)
2024-05-03 04:25:47 -04:00
restart()
2024-05-02 03:52:10 -04:00
return mw.returnJson(True,'关闭成功')
else:
d['security']['authorization'] = 'enabled'
2024-05-03 07:01:34 -04:00
d['security']['keyFile'] = getServerDir()+'/mongodb.key'
2024-05-02 03:52:10 -04:00
setConfig(d)
2024-05-03 04:25:47 -04:00
restart()
2024-05-02 03:52:10 -04:00
return mw.returnJson(True,'开启成功')
2024-05-01 11:50:45 -04:00
2021-11-22 16:03:55 -05:00
def runInfo():
2024-04-29 09:47:53 -04:00
'''
cd /www/server/mdserver-web && source bin/activate && python3 /www/server/mdserver-web/plugins/mongodb/index.py run_info
'''
2024-05-01 08:33:36 -04:00
client = mongdbClient()
2021-11-22 16:03:55 -05:00
db = client.admin
2024-05-06 05:17:58 -04:00
try:
serverStatus = db.command('serverStatus')
except Exception as e:
return mw.returnJson(False, str(e))
2021-11-26 09:00:16 -05:00
listDbs = client.list_database_names()
2023-12-16 04:01:49 -05:00
2023-12-16 03:30:34 -05:00
result = {}
result["host"] = serverStatus['host']
result["version"] = serverStatus['version']
result["uptime"] = serverStatus['uptime']
result['db_path'] = getServerDir() + "/data"
result["connections"] = serverStatus['connections']['current']
result["collections"] = len(listDbs)
pf = serverStatus['opcounters']
result['pf'] = pf
return mw.getJson(result)
2024-05-01 08:33:36 -04:00
def runDocInfo():
client = mongdbClient()
2023-12-16 03:30:34 -05:00
db = client.admin
2024-05-02 03:52:10 -04:00
# print(db)
2024-05-06 05:17:08 -04:00
try:
serverStatus = db.command('serverStatus')
except Exception as e:
return mw.returnJson(False, str(e))
2023-12-16 03:30:34 -05:00
serverStatus = db.command('serverStatus')
2021-11-26 09:00:16 -05:00
2023-12-16 03:30:34 -05:00
listDbs = client.list_database_names()
2021-11-26 09:00:16 -05:00
showDbList = []
2023-12-16 03:30:34 -05:00
result = {}
2021-11-26 09:00:16 -05:00
for x in range(len(listDbs)):
mongd = client[listDbs[x]]
stats = mongd.command({"dbstats": 1})
2023-12-16 03:30:34 -05:00
if 'operationTime' in stats:
del stats['operationTime']
2021-11-22 16:18:14 -05:00
2023-12-16 03:30:34 -05:00
if '$clusterTime' in stats:
del stats['$clusterTime']
showDbList.append(stats)
2021-11-22 16:03:55 -05:00
2021-11-26 09:00:16 -05:00
result["dbs"] = showDbList
2021-11-22 16:03:55 -05:00
return mw.getJson(result)
2023-12-16 04:01:49 -05:00
def runReplInfo():
2024-05-01 08:33:36 -04:00
client = mongdbClient()
2023-12-16 04:01:49 -05:00
db = client.admin
2024-05-12 02:17:49 -04:00
result = {}
2024-05-06 05:17:36 -04:00
try:
serverStatus = db.command('serverStatus')
except Exception as e:
return mw.returnJson(False, str(e))
2023-12-16 04:01:49 -05:00
2024-05-04 04:02:44 -04:00
d = getConfigData()
2024-05-07 08:24:05 -04:00
if 'replication' in d and 'replSetName' in d['replication']:
2024-05-04 04:02:44 -04:00
result['repl_name'] = d['replication']['replSetName']
2023-12-16 04:01:49 -05:00
result['status'] = ''
result['doc_name'] = ''
if 'repl' in serverStatus:
repl = serverStatus['repl']
# print(repl)
2024-04-29 03:19:37 -04:00
result['status'] = ''
2023-12-17 00:32:39 -05:00
if 'ismaster' in repl and repl['ismaster']:
2023-12-16 04:01:49 -05:00
result['status'] = ''
2024-04-29 03:19:37 -04:00
2024-04-29 03:22:12 -04:00
if 'secondary' in repl and not repl['secondary']:
2024-04-29 03:19:37 -04:00
result['status'] = ''
2023-12-16 04:01:49 -05:00
2024-04-29 23:15:00 -04:00
result['setName'] = mw.getDefault(repl,'setName', '')
result['primary'] = mw.getDefault(repl,'primary', '')
result['me'] = mw.getDefault(repl,'me', '')
2024-01-21 11:16:25 -05:00
2024-04-29 23:15:00 -04:00
hosts = mw.getDefault(repl,'hosts', '')
2024-01-21 11:16:25 -05:00
result['hosts'] = ','.join(hosts)
2024-05-12 02:17:49 -04:00
result['members'] = []
try:
2024-05-12 02:35:53 -04:00
members_list = []
2024-05-12 02:17:49 -04:00
replStatus = db.command('replSetGetStatus')
if 'members' in replStatus:
members = replStatus['members']
for m in members:
t = {}
t['name'] = m['name']
t['stateStr'] = m['stateStr']
t['uptime'] = m['uptime']
members_list.append(t)
result['members'] = members_list
except Exception as e:
pass
2023-12-16 04:01:49 -05:00
return mw.returnJson(True, 'OK', result)
2024-05-02 12:45:28 -04:00
def getDbList():
2024-05-02 07:58:58 -04:00
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,name,username,password,accept,rw,ps,addtime'
clist = conn.where(condition, ()).field(
field).limit(limit).order('id desc').select()
2024-05-05 02:43:41 -04:00
for x in range(0, len(clist)):
dbname = clist[x]['name']
blist = getDbBackupListFunc(dbname)
clist[x]['is_backup'] = False
if len(blist) > 0:
clist[x]['is_backup'] = True
2024-05-02 07:58:58 -04:00
count = conn.where(condition, ()).count()
_page = {}
_page['count'] = count
_page['p'] = page
_page['row'] = page_size
2024-05-02 12:45:28 -04:00
_page['tojs'] = 'dbList'
2024-05-02 07:58:58 -04:00
data['page'] = mw.getPage(_page)
data['data'] = clist
info = {}
info['root_pwd'] = pSqliteDb('config').where('id=?', (1,)).getField('mg_root')
data['info'] = info
return mw.getJson(data)
# return mw.returnJson(True,'ok',data)
2024-05-01 08:33:36 -04:00
2024-05-02 12:45:28 -04:00
def addDb():
t = status()
if t == 'stop':
return mw.returnJson(False,'未启动!')
client = mongdbClient()
db = client.admin
args = getArgs()
data = checkArgs(args, ['ps','name','db_user','password'])
if not data[0]:
return data[1]
data_name = args['name'].strip()
if not data_name:
return mw.returnJson(False, "数据库名不能为空!")
2024-05-03 00:05:02 -04:00
nameArr = ['admin', 'config', 'local']
if data_name in nameArr:
return mw.returnJson(False, "数据库名是保留名称!")
2024-05-02 12:45:28 -04:00
addTime = time.strftime('%Y-%m-%d %X', time.localtime())
username = ''
password = ''
# auth为true时如果__DB_USER为空则将它赋值为 root用于开启本地认证后数据库用户为空的情况
auth_status = getConfAuth() == "enabled"
if auth_status:
data_name = args['name']
username = args['db_user']
password = args['password']
else:
username = data_name
2024-05-17 14:57:32 -04:00
client[data_name].zchat.insert_one({})
2024-05-02 12:45:28 -04:00
user_roles = [{'role': 'dbOwner', 'db': data_name}, {'role': 'userAdmin', 'db': data_name}]
if auth_status:
2024-05-03 00:05:02 -04:00
# db.command("dropUser", username)
2024-05-02 12:45:28 -04:00
db.command("createUser", username, pwd=password, roles=user_roles)
ps = args['ps']
if ps == '':
ps = data_name
# 添加入SQLITE
pSqliteDb('databases').add('name,username,password,accept,ps,addtime', (data_name, username, password, '127.0.0.1', ps, addTime))
return mw.returnJson(True, '添加成功')
2024-05-03 00:05:02 -04:00
def delDb():
client = mongdbClient()
db = client.admin
sqlite_db = pSqliteDb('databases')
args = getArgs()
data = checkArgs(args, ['id', 'name'])
if not data[0]:
return data[1]
try:
sid = args['id']
name = args['name']
find = sqlite_db.where("id=?", (sid,)).field('id,name,username,password,accept,ps,addtime').find()
accept = find['accept']
username = find['username']
client.drop_database(name)
try:
db.command('dropUser',username)
except Exception as e:
pass
# 删除SQLITE
sqlite_db.where("id=?", (sid,)).delete()
return mw.returnJson(True, '删除成功!')
except Exception as ex:
return mw.returnJson(False, '删除失败!' + str(ex))
2024-08-09 09:41:59 -04:00
def delDbTable():
client = mongdbClient()
db = client.admin
sqlite_db = pSqliteDb('databases')
args = getArgs()
data = checkArgs(args, ['table_name', 'name'])
if not data[0]:
return data[1]
name = args['name']
table_name = args['table_name']
try:
cur_db = client[name]
cur_db[table_name].drop()
return mw.returnJson(True, '删除成功!')
except Exception as ex:
return mw.returnJson(False, '删除失败!' + str(ex))
2024-05-02 12:45:28 -04:00
def setRootPwd(version=''):
args = getArgs()
data = checkArgs(args, ['password'])
if not data[0]:
return data[1]
#强制修改
force = 0
if 'force' in args and args['force'] == '1':
force = 1
password = args['password']
try:
msg = ''
if force == 1:
msg = ',无须强制!'
initMgRoot(password, force)
return mw.returnJson(True, '数据库root密码修改成功!'+msg)
except Exception as ex:
return mw.returnJson(False, '修改错误:' + str(ex))
2024-05-03 00:05:02 -04:00
def setUserPwd(version=''):
client = mongdbClient()
sqlite_db = pSqliteDb('databases')
args = getArgs()
data = checkArgs(args, ['password', 'name'])
if not data[0]:
return data[1]
newpassword = args['password']
username = args['name']
uid = args['id']
try:
name = sqlite_db.where('id=?', (uid,)).getField('name')
2026-05-07 04:20:03 -04:00
# 将用户创建在目标数据库中,而不是 admin 数据库
db = client[name]
2024-05-03 00:05:02 -04:00
user_roles = [{'role': 'dbOwner', 'db': name}, {'role': 'userAdmin', 'db': name}]
try:
db.command("updateUser", username, pwd=newpassword, roles=user_roles)
except Exception as e:
db.command("createUser", username, pwd=newpassword, roles=user_roles)
sqlite_db.where("id=?", (uid,)).setField('password', newpassword)
return mw.returnJson(True, mw.getInfo('修改数据库[{1}]密码成功!', (name,)))
except Exception as ex:
return mw.returnJson(False, mw.getInfo('修改数据库[{1}]密码失败[{2}]!', (name, str(ex),)))
def syncGetDatabases():
client = mongdbClient()
sqlite_db = pSqliteDb('databases')
db = client.admin
data = client.admin.command({"listDatabases": 1})
nameArr = ['admin', 'config', 'local']
n = 0
for value in data['databases']:
vdb_name = value["name"]
b = False
for key in nameArr:
if vdb_name == key:
b = True
break
if b:
continue
if sqlite_db.where("name=?", (vdb_name,)).count() > 0:
continue
host = '127.0.0.1'
ps = vdb_name
addTime = time.strftime('%Y-%m-%d %X', time.localtime())
if sqlite_db.add('name,username,password,accept,ps,addtime', (vdb_name, vdb_name, '', host, ps, addTime)):
n += 1
msg = mw.getInfo('本次共从服务器获取了{1}个数据库!', (str(n),))
return mw.returnJson(True, msg)
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 getDbInfo():
args = getArgs()
data = checkArgs(args, ['name'])
if not data[0]:
return data[1]
ret = {}
client = mongdbClient()
db_name = args['name']
db = client[db_name]
2024-05-04 04:24:57 -04:00
result = {}
t = db.command("dbStats")
# print(result)
result['collections'] = t['collections']
result['avgObjSize'] = t['avgObjSize']
result['dataSize'] = t['dataSize']
result['storageSize'] = t['storageSize']
result['indexSize'] = t['indexSize']
2024-05-03 00:05:02 -04:00
result["collection_list"] = []
for collection_name in db.list_collection_names():
collection = db.command("collStats", collection_name)
data = {
"collection_name": collection_name,
"count": collection.get("count"), # 文档数
"size": collection.get("size"), # 内存中的大小
"avg_obj_size": collection.get("avgObjSize"), # 对象平均大小
"storage_size": collection.get("storageSize"), # 存储大小
"capped": collection.get("capped"),
"nindexes": collection.get("nindexes"), # 索引数
"total_index_size": collection.get("totalIndexSize"), # 索引大小
}
result["collection_list"].append(data)
return mw.returnJson(True,'ok', result)
2024-05-03 04:00:09 -04:00
def toDbBase(find):
client = mongdbClient()
data_name = find['name']
db = client[data_name]
2024-05-17 14:57:32 -04:00
db.zchat.insert_one({})
2024-05-03 04:00:09 -04:00
user_roles = [{'role': 'dbOwner', 'db': data_name}, {'role': 'userAdmin', 'db': data_name}]
2026-05-07 04:20:03 -04:00
# 将用户创建在目标数据库中,而不是 admin 数据库
2024-05-03 04:00:09 -04:00
try:
2026-05-07 04:20:03 -04:00
db.command("createUser", find['username'], pwd=find['password'], roles=user_roles)
2024-05-03 04:00:09 -04:00
except Exception as e:
2026-05-07 04:20:03 -04:00
db.command("updateUser", find['username'], pwd=find['password'], roles=user_roles)
2024-05-03 04:00:09 -04:00
return 1
def syncToDatabases():
args = getArgs()
data = checkArgs(args, ['type', 'ids'])
if not data[0]:
return data[1]
stype = int(args['type'])
sqlite_db = pSqliteDb('databases')
n = 0
if stype == 0:
data = sqlite_db.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 = sqlite_db.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 getAllRole():
mongo_role = {
# 数据库用户角色
"read": "读取数据(read)",
"readWrite": "读取和写入数据(readWrite)",
# 数据库管理角色
# "dbAdmin": "数据库管理员",
"dbOwner": "数据库所有者(dbOwner)",
"userAdmin": "用户管理员(userAdmin)",
# 集群管理角色
# "clusterAdmin": "集群管理员",
# "clusterManager": "集群管理器",
# "clusterMonitor": "集群监视器",
# "hostManager": "主机管理员",
# 备份和恢复角色
# "backup": "备份数据",
# "restore": "还原数据",
# 所有数据库角色
# "readAnyDatabase": "任意数据库读取",
# "readWriteAnyDatabase": "任意数据库读取和写入",
# "userAdminAnyDatabase": "任意数据库用户管理员",
# "dbAdminAnyDatabase": "任意数据库管理员",
# 超级用户角色
# "root": "超级管理员",
# 内部角色
# "__queryableBackup": "可查询备份",
# "__system": "系统角色",
# "enableSharding": "启用分片",
}
client = mongdbClient()
db = client.admin
# 获取所有角色
role_data = db.command('rolesInfo', showBuiltinRoles=True)
result = []
for role in role_data["roles"]:
if mongo_role.get(role["role"]) is not None:
role["name"] = mongo_role.get(role["role"])
result.append(role)
return mw.returnJson(True, 'ok', result)
def getDbAccess():
args = getArgs()
data = checkArgs(args, ['username'])
if not data[0]:
return data[1]
client = mongdbClient()
db = client.admin
username = args['username']
mongo_role = {
# 数据库用户角色
"read": "读取数据(read)",
"readWrite": "读取和写入数据(readWrite)",
# 数据库管理角色
# "dbAdmin": "数据库管理员",
"dbOwner": "数据库所有者(dbOwner)",
"userAdmin": "用户管理员(userAdmin)",
# 集群管理角色
# "clusterAdmin": "集群管理员",
# "clusterManager": "集群管理器",
# "clusterMonitor": "集群监视器",
# "hostManager": "主机管理员",
# 备份和恢复角色
# "backup": "备份数据",
# "restore": "还原数据",
# 所有数据库角色
# "readAnyDatabase": "任意数据库读取",
# "readWriteAnyDatabase": "任意数据库读取和写入",
# "userAdminAnyDatabase": "任意数据库用户管理员",
# "dbAdminAnyDatabase": "任意数据库管理员",
# 超级用户角色
# "root": "超级管理员",
# 内部角色
# "__queryableBackup": "可查询备份",
# "__system": "系统角色",
# "enableSharding": "启用分片",
}
role_data = db.command('rolesInfo', showBuiltinRoles=True)
all_role_list = []
for role in role_data["roles"]:
if mongo_role.get(role["role"]) is not None:
role["name"] = mongo_role.get(role["role"])
all_role_list.append(role)
result = {
"user": username,
"db": username,
"roles": [],
"all_roles":all_role_list,
}
user_data = db.command('usersInfo', username)
if user_data:
if len(user_data["users"]) != 0:
user = user_data["users"][0]
result["user"] = user.get("user", username)
result["db"] = user.get("db", username)
result["roles"] = user.get("roles", [])
return mw.returnJson(True, 'ok', result)
def setDbAccess():
args = getArgs()
data = checkArgs(args, ['username', 'select','name'])
if not data[0]:
return data[1]
username = args['username']
select = args['select']
name = args['name']
mg_pass = pSqliteDb('config').where('id=?', (1,)).getField('mg_root')
user_roles = []
select_role = select.split(',')
for role in select_role:
t = {}
t['role'] = role
t['db'] = name
user_roles.append(t)
client = mongdbClient()
2026-05-07 04:20:03 -04:00
# 在目标数据库中操作用户,而不是 admin 数据库
db = client[name]
2024-05-03 04:00:09 -04:00
try:
db.command("updateUser", username, pwd=mg_pass, roles=user_roles)
except Exception as e:
db.command('dropUser',username)
db.command("createUser", username, pwd=mg_pass, roles=user_roles)
return mw.returnJson(True, '设置成功!')
2024-05-04 02:34:38 -04:00
def getReplConfigData():
import json
f = getServerDir()+'/repl.json'
if os.path.exists(f):
c = mw.readFile(f)
return json.loads(c)
else:
t = {}
t['name'] = ''
t['nodes'] = []
mw.writeFile(f, mw.getJson(t))
return t
def setReplConfigData(c):
import json
f = getServerDir()+'/repl.json'
mw.writeFile(f, mw.getJson(c))
return c
def getReplConfig():
c = getReplConfigData()
return mw.returnJson(True, 'ok!', c)
def replSetName():
args = getArgs()
data = checkArgs(args, ['name'])
if not data[0]:
return data[1]
c = getReplConfigData()
c['name'] = args['name']
setReplConfigData(c)
2024-05-05 12:13:10 -04:00
d = getConfigData()
d['replication']['replSetName'] = args['name']
setConfig(d)
restart()
2024-05-05 12:16:51 -04:00
2024-05-04 02:34:38 -04:00
return mw.returnJson(True, '设置成功!')
def replSetNode():
args = getArgs()
2024-05-06 13:27:09 -04:00
data = checkArgs(args, ['node','priority','arbiterOnly','votes','idx'])
2024-05-04 02:34:38 -04:00
if not data[0]:
return data[1]
c = getReplConfigData()
nodes = c['nodes']
add_node = args['node'].strip()
2024-05-06 13:27:09 -04:00
idx = int(args['idx'])
2024-05-05 07:46:45 -04:00
priority = -1
if 'priority' in args:
priority = args['priority'].strip()
2024-05-05 08:03:18 -04:00
2024-05-05 07:46:45 -04:00
priority = int(priority)
if priority<0 or priority>100:
return mw.returnJson(False, 'priority应该在[0-100]之间!')
arbiterOnly = 0
if 'arbiterOnly' in args:
2024-05-05 08:03:18 -04:00
arbiterOnly = args['arbiterOnly'].strip()
2024-05-05 07:46:45 -04:00
arbiterOnly = int(arbiterOnly)
2024-05-05 13:14:07 -04:00
votes = 1
if 'votes' in args:
votes = args['votes']
votes = int(votes)
2024-05-06 13:27:09 -04:00
# 编辑状态
if idx>-1:
for i in range(len(nodes)):
if i == idx:
nodes[i]['host'] = add_node
nodes[i]['priority'] = priority
nodes[i]['votes'] = votes
nodes[i]['arbiterOnly'] = arbiterOnly
c['nodes'] = nodes
setReplConfigData(c)
return mw.returnJson(True, '编辑成功!')
2024-05-04 02:34:38 -04:00
is_have = False
for x in nodes:
if x['host'] == add_node:
is_have = True
if is_have:
return mw.returnJson(False, add_node+',节点已经存在!')
t = {}
t['host'] = add_node
2024-05-05 07:46:45 -04:00
t['priority'] = priority
2024-05-05 13:14:07 -04:00
t['votes'] = votes
2024-05-05 07:46:45 -04:00
t['arbiterOnly'] = arbiterOnly
2024-05-04 02:34:38 -04:00
nodes.append(t)
c['nodes'] = nodes
setReplConfigData(c)
2024-05-06 13:27:09 -04:00
return mw.returnJson(True, '添加成功!')
2024-05-04 02:34:38 -04:00
def delReplNode():
args = getArgs()
data = checkArgs(args, ['node'])
if not data[0]:
return data[1]
c = getReplConfigData()
nodes = c['nodes']
del_node = args['node'].strip()
filter_nodes = [];
for x in nodes:
if x['host'] != del_node:
filter_nodes.append(x)
c['nodes'] = filter_nodes
setReplConfigData(c)
return mw.returnJson(True, '删除节点'+args['node']+'成功!')
def replInit():
c = getReplConfigData()
2024-05-04 02:44:27 -04:00
name = c['name']
nodes = c['nodes']
if name == '':
return mw.returnJson(False, '副本名不能为空!')
2024-05-06 05:17:08 -04:00
2024-05-06 05:02:37 -04:00
# d = getConfigData()
# d['replication']['replSetName'] = name
# setConfig(d)
# restart()
2024-05-04 03:24:27 -04:00
2024-05-04 02:44:27 -04:00
if len(nodes) == 0:
return mw.returnJson(False, '节点不能为空!')
cfg_node = []
2024-05-05 14:11:37 -04:00
now_time_t = int(time.time())
2024-05-04 02:44:27 -04:00
for x in range(len(nodes)):
n = nodes[x]
t = {}
2024-05-06 04:42:10 -04:00
t['_id'] = x
2024-05-04 02:44:27 -04:00
t['host'] = n['host']
2024-05-05 07:50:42 -04:00
if 'priority' in n:
2024-05-05 08:07:36 -04:00
t['priority'] = int(n['priority'])
2024-05-05 07:50:42 -04:00
2024-05-05 14:11:37 -04:00
if 'votes' in n:
t['votes'] = int(n['votes'])
2024-05-05 07:50:42 -04:00
if 'arbiterOnly' in n and n['arbiterOnly'] == 1:
t['arbiterOnly'] = True
2024-05-04 02:44:27 -04:00
cfg_node.append(t)
2024-05-06 03:20:34 -04:00
# print(cfg_node)
2024-05-04 02:44:27 -04:00
# return mw.returnJson(False, '设置副本成功!')
config = {
'_id': name,
'members': cfg_node
}
client = mongdbClient()
try:
2024-05-06 04:42:10 -04:00
client.admin.command('replSetInitiate',config)
2024-05-04 02:44:27 -04:00
except Exception as e:
2024-05-05 14:11:37 -04:00
info = str(e).split(',')
2024-05-06 04:42:10 -04:00
# print(info)
2024-05-05 14:11:37 -04:00
if info[0] == 'already initialized':
2024-05-06 03:20:56 -04:00
config['version'] = int(now_time_t)
2024-05-06 03:20:34 -04:00
try:
2024-05-06 04:42:10 -04:00
client.admin.command('replSetReconfig',config,force=True,maxTimeMS=10)
2024-05-06 03:20:34 -04:00
except Exception as e:
return mw.returnJson(False, str(e))
2024-05-05 14:11:37 -04:00
return mw.returnJson(True, '重置副本同步成功!')
2024-05-05 08:07:36 -04:00
return mw.returnJson(False, str(e))
2024-05-04 02:44:27 -04:00
2024-05-05 14:11:37 -04:00
return mw.returnJson(True, '设置副本初始化成功!')
2024-05-04 02:34:38 -04:00
2024-05-04 04:14:27 -04:00
def replClose():
2024-05-04 05:28:18 -04:00
2024-05-06 04:42:10 -04:00
d = getConfigData()
if 'replSetName' in d['replication']:
del d['replication']['replSetName']
setConfig(d)
restart()
2024-05-04 06:00:10 -04:00
client = mongdbClient()
2024-05-05 13:33:14 -04:00
db = client.admin
2024-05-04 06:00:10 -04:00
try:
2024-05-06 04:42:10 -04:00
restart()
2024-05-04 06:00:10 -04:00
except Exception as e:
2024-05-05 14:11:37 -04:00
return mw.returnJson(False, str(e))
2024-05-06 04:42:10 -04:00
2024-05-04 04:14:27 -04:00
return mw.returnJson(True, '关闭副本同步成功!')
2024-05-05 01:45:50 -04:00
def getDbBackupListFunc(dbname=''):
2024-11-24 12:13:47 -05:00
bkDir = mw.getBackupDir() + '/database'
2024-05-05 01:45:50 -04:00
blist = os.listdir(bkDir)
r = []
bname = 'mongodb_' + dbname
blen = len(bname)
for x in blist:
fbstr = x[0:blen]
if fbstr == bname:
r.append(x)
return r
def getDbBackupList():
args = getArgs()
data = checkArgs(args, ['name'])
if not data[0]:
return data[1]
r = getDbBackupListFunc(args['name'])
2024-11-24 12:13:47 -05:00
bkDir = mw.getBackupDir() + '/database'
2024-05-05 01:45:50 -04:00
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)
2024-05-05 02:25:47 -04:00
def getDbBackupImportList():
2024-11-24 12:13:47 -05:00
bkImportDir = mw.getBackupDir() + '/mongodb_import'
2024-05-05 02:25:47 -04:00
if not os.path.exists(bkImportDir):
os.mkdir(bkImportDir)
blist = os.listdir(bkImportDir)
rr = []
for x in range(0, len(blist)):
name = blist[x]
p = bkImportDir + '/' + name
data = {}
data['name'] = name
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
rdata = {
"list": rr,
"upload_dir": bkImportDir,
}
return mw.returnJson(True, 'ok', rdata)
2024-05-05 01:45:50 -04:00
def deleteDbBackup():
args = getArgs()
data = checkArgs(args, ['filename', 'path'])
if not data[0]:
return data[1]
path = args['path']
full_file = ""
2024-11-24 12:13:47 -05:00
bkDir = mw.getBackupDir() + '/database'
2024-05-05 01:45:50 -04:00
full_file = bkDir + '/' + args['filename']
if path != "":
full_file = path + "/" + args['filename']
os.remove(full_file)
return mw.returnJson(True, 'ok')
def setDbBackup():
args = getArgs()
data = checkArgs(args, ['name'])
if not data[0]:
return data[1]
scDir = getPluginDir() + '/scripts/backup.py'
2024-05-05 05:49:29 -04:00
cmd = 'python3 ' + scDir + ' database ' + args['name'] + ' 3'
2024-05-05 01:45:50 -04:00
os.system(cmd)
return mw.returnJson(True, 'ok')
2024-05-05 02:40:50 -04:00
def getListBson(dbname=''):
2024-11-24 12:13:47 -05:00
bkDir = mw.getBackupDir() + '/mongodb_import/'+dbname
2024-05-05 02:40:50 -04:00
blist = os.listdir(bkDir)
r = []
bname = 'bson'
blen = len(bname)
for x in blist:
if x.endswith(bname):
r.append(x)
return r
2024-08-06 01:14:43 -04:00
def rootPwd():
return pSqliteDb('config').where(
'id=?', (1,)).getField('mg_root')
2024-05-05 02:25:47 -04:00
def importDbExternal():
args = getArgs()
data = checkArgs(args, ['file', 'name'])
if not data[0]:
return data[1]
file = args['file']
name = args['name']
2024-11-24 12:13:47 -05:00
import_dir = mw.getBackupDir() + '/mongodb_import/'
2024-05-05 02:25:47 -04:00
mg_root = pSqliteDb('config').where('id=?', (1,)).getField('mg_root')
port = getConfPort()
file_path = import_dir + file
if not os.path.exists(file_path):
return mw.returnJson(False, '文件突然消失?')
exts = ['gz', 'zip']
ext = mw.getFileSuffix(file)
if ext not in exts:
return mw.returnJson(False, '导入数据库格式不对!')
# print(file,name)
# print(import_dir,name)
2024-05-05 12:49:48 -04:00
auth = getConfAuth()
mg_root = pSqliteDb('config').where('id=?', (1,)).getField('mg_root')
uoption = ''
if auth != 'disabled':
2024-05-05 13:24:55 -04:00
uoption =' --authenticationDatabase admin -u root -p '+mg_root
2024-05-05 02:25:47 -04:00
file_dir = import_dir+name
if not os.path.exists(file_dir):
mw.execShell("mkdir -p "+file_dir)
file_tgz = import_dir+file
if os.path.exists(file_tgz):
cmd = 'cd ' + file_dir + ' && tar -xzvf ' + file_tgz + " -C "+file_dir
# print(cmd)
r = mw.execShell(cmd)
# print(r)
2024-05-05 02:40:50 -04:00
bson_list = getListBson(name)
# print(bson_list)
for x in bson_list:
2024-05-05 12:49:48 -04:00
cmd = getServerDir() + "/bin/mongorestore "+uoption+" --port "+str(port)+" --dir "+file_dir+'/'+x
2024-05-05 02:40:50 -04:00
# print(cmd)
rdata = mw.execShell(cmd)
# print(data)
if rdata[1].lower().find('error') > -1:
return mw.returnJson(False, rdata[1])
2024-05-05 02:25:47 -04:00
# 删除文件
if os.path.exists(file_dir):
del_cmd = "rm -rf "+file_dir
mw.execShell(del_cmd)
return mw.returnJson(True, 'ok')
2024-05-05 01:45:50 -04:00
def importDbBackup():
args = getArgs()
data = checkArgs(args, ['file', 'name'])
if not data[0]:
return data[1]
file = args['file']
name = args['name']
2024-05-05 01:51:59 -04:00
port = getConfPort()
2024-11-24 12:04:38 -05:00
file_tgz = mw.getBackupDir() + '/database/' + file
file_dir = mw.getBackupDir() + '/database/' + file.replace('.tar.gz','')
2024-05-05 01:45:50 -04:00
if not os.path.exists(file_dir):
mw.execShell("mkdir -p "+file_dir)
# print(os.path.exists(file_tgz))
if os.path.exists(file_tgz):
2024-11-24 12:04:38 -05:00
cmd = 'cd ' + mw.getBackupDir() + '/database && tar -xzvf ' + file + " -C "+file_dir
2024-05-05 01:45:50 -04:00
# print(cmd)
mw.execShell(cmd)
2024-05-05 12:49:48 -04:00
auth = getConfAuth()
mg_root = pSqliteDb('config').where('id=?', (1,)).getField('mg_root')
uoption = ''
if auth != 'disabled':
uoption =' -u root -p '+mg_root
cmd = getServerDir() + "/bin/mongorestore "+uoption+" --port "+str(port)+" --dir "+file_dir
2024-05-05 01:51:59 -04:00
# print(cmd)
mw.execShell(cmd)
2024-05-05 01:45:50 -04:00
2024-05-05 01:51:59 -04:00
# 删除文件
2024-05-05 02:25:47 -04:00
if os.path.exists(file_dir):
del_cmd = "rm -rf "+file_dir
mw.execShell(del_cmd)
2024-05-05 01:45:50 -04:00
return mw.returnJson(True, 'ok')
2024-04-29 09:20:34 -04:00
def testData():
2024-04-29 09:20:14 -04:00
'''
cd /www/server/mdserver-web && source bin/activate && python3 /www/server/mdserver-web/plugins/mongodb/index.py test_data
'''
2024-04-29 09:18:04 -04:00
import pymongo
from pymongo import ReadPreference
2024-05-01 08:33:36 -04:00
client = mongdbClient()
2024-04-29 09:18:04 -04:00
db = client.test
col = db["demo"]
2024-04-29 09:22:31 -04:00
rndStr = mw.getRandomString(10)
2024-04-29 09:20:14 -04:00
insert_dict = { "name": "v1", "value": rndStr}
x = col.insert_one(insert_dict)
2024-04-29 09:18:04 -04:00
print(x)
2024-01-21 11:16:25 -05:00
def test():
2024-04-29 09:47:53 -04:00
'''
2024-05-03 04:16:16 -04:00
python3 /www/server/mdserver-web/plugins/mongodb/index.py set_config_auth {}
2024-04-29 09:47:53 -04:00
cd /www/server/mdserver-web && source bin/activate && python3 /www/server/mdserver-web/plugins/mongodb/index.py test
2024-05-01 08:33:36 -04:00
python3 plugins/mongodb/index.py test
2024-04-29 09:47:53 -04:00
'''
2024-01-21 11:16:25 -05:00
# https://pymongo.readthedocs.io/en/stable/examples/high_availability.html
2024-05-02 07:58:58 -04:00
# import pymongo
# from pymongo import ReadPreference
2024-01-21 11:16:25 -05:00
2024-05-03 06:30:50 -04:00
client = mongdbClient()
db = client.admin
mg_pass = mw.getRandomString(10)
config = {
'_id': 'test',
'members': [
{'_id': 0, 'host': '127.0.0.1:27019'},
{'_id': 1, 'host': '127.0.0.1:27017'},
]
}
2024-01-21 11:16:25 -05:00
2024-05-03 06:30:50 -04:00
rsStatus = client.admin.command('replSetInitiate',config)
print(rsStatus)
2024-01-21 11:16:25 -05:00
2024-01-21 11:23:55 -05:00
# 需要通过命令行操作
2024-04-29 11:32:41 -04:00
# rs.initiate({
# _id: 'test',
# members: [
# {
# _id: 1,
2024-05-03 06:30:50 -04:00
# host: '127.0.0.1:27019',
2024-04-29 11:32:41 -04:00
# priority: 2
# },
# {
# _id: 2,
2024-05-03 06:30:50 -04:00
# host: '127.0.0.1:27017',
2024-04-29 11:32:41 -04:00
# priority: 1
# }
# ]
# });
2024-01-21 11:16:25 -05:00
# > rs.status(); // 查询状态
# // "stateStr" : "PRIMARY", 主节点
# // "stateStr" : "SECONDARY", 副本节点
# > rs.add({"_id":3, "host":"127.0.0.1:27318","priority":0,"votes":0});
2024-04-29 09:47:53 -04:00
# serverStatus = db.command('serverStatus')
# print(serverStatus)
2024-01-21 11:16:25 -05:00
2024-05-01 08:33:36 -04:00
return mw.returnJson(True, 'OK')
2024-01-21 11:16:25 -05:00
2021-11-22 16:03:55 -05:00
def initdStatus():
2021-11-22 16:14:44 -05:00
if mw.isAppleSystem():
2022-07-02 23:31:34 -04:00
return "Apple Computer does not support"
2021-11-22 16:14:44 -05:00
2023-08-16 12:47:29 -04:00
shell_cmd = 'systemctl status mongodb | grep loaded | grep "enabled;"'
2021-11-22 16:14:44 -05:00
data = mw.execShell(shell_cmd)
if data[0] == '':
return 'fail'
return 'ok'
2021-11-22 16:03:55 -05:00
def initdInstall():
2021-11-22 16:14:44 -05:00
if mw.isAppleSystem():
2022-07-02 23:31:34 -04:00
return "Apple Computer does not support"
2021-11-22 16:14:44 -05:00
2023-08-16 12:47:29 -04:00
mw.execShell('systemctl enable mongodb')
2021-11-22 16:03:55 -05:00
return 'ok'
def initdUinstall():
2021-11-22 16:14:44 -05:00
if mw.isAppleSystem():
2022-07-02 23:31:34 -04:00
return "Apple Computer does not support"
2021-11-22 16:03:55 -05:00
2023-08-16 12:47:29 -04:00
mw.execShell('systemctl disable mongodb')
2021-11-22 16:03:55 -05:00
return 'ok'
def runLog():
2023-08-16 23:14:56 -04:00
f = getServerDir() + '/logs/mongodb.log'
if os.path.exists(f):
return f
return getServerDir() + '/logs.pl'
2021-11-22 16:03:55 -05:00
2025-09-17 00:44:37 -04:00
def cronAddCheck():
try:
import tool_task
tool_task.createBgTask()
return mw.returnJson(True, '添加检查任务成功')
except Exception as e:
return mw.returnJson(False, '添加检查任务失败:'+str(e))
def cronDelCheck():
try:
import tool_task
tool_task.removeBgTask()
return mw.returnJson(True, '删除检查任务成功')
except Exception as e:
return mw.returnJson(False, '删除检查任务失败:'+str(e))
2022-07-10 06:10:22 -04:00
2024-11-29 04:36:34 -05:00
def installPreInspectionDebainCheck(sysId,version):
2024-11-29 04:44:05 -05:00
if version == '8.0':
2025-09-10 11:52:55 -04:00
if int(sysId) < 12:
2025-09-10 11:49:47 -04:00
return "[%s]需要至少debain[12]" % (version,)
2024-11-29 04:36:34 -05:00
return ''
2022-07-10 06:10:22 -04:00
def installPreInspection(version):
2023-08-17 00:27:31 -04:00
if mw.isAppleSystem():
return 'ok'
2024-11-29 04:41:31 -05:00
cmd = "cat /etc/*-release | grep PRETTY_NAME |awk -F = '{print $2}' | awk -F '\"' '{print $2}'| awk '{print $1}'"
sys = mw.execShell(cmd)
2022-07-10 06:10:22 -04:00
if sys[1] != '':
return '暂时不支持该系统'
2024-11-24 12:13:47 -05:00
sys_id = mw.execShell("cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F '\"' '{print $2}'")
2022-07-10 06:10:22 -04:00
sysName = sys[0].strip().lower()
sysId = sys_id[0].strip()
2023-08-17 00:27:31 -04:00
supportOs = ['centos', 'ubuntu', 'debian', 'opensuse']
if not sysName in supportOs:
return '暂时仅支持{}'.format(','.join(supportOs))
2024-11-29 04:36:34 -05:00
if sysName == 'debian':
check = installPreInspectionDebainCheck(sysId, version)
if check != '':
return check
2022-07-10 06:10:22 -04:00
return 'ok'
2024-05-07 08:18:23 -04:00
def uninstallPreInspection(version):
stop()
2024-11-24 12:04:38 -05:00
from utils.plugin import plugin as MwPlugin
MwPlugin.instance().removeIndex(getPluginName(), version)
2024-05-07 08:18:23 -04:00
return "请手动删除MongoDB[{}]<br/> rm -rf {}".format(version, getServerDir())
2021-11-22 16:03:55 -05:00
if __name__ == "__main__":
func = sys.argv[1]
2022-07-08 12:47:36 -04:00
2024-11-29 04:36:34 -05:00
version = '4.4'
2022-07-08 12:47:36 -04:00
if (len(sys.argv) > 2):
version = sys.argv[2]
2021-11-22 16:03:55 -05:00
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())
2022-07-08 12:47:36 -04:00
elif func == 'install_pre_inspection':
print(installPreInspection(version))
2024-05-07 08:18:23 -04:00
elif func == 'uninstall_pre_inspection':
print(uninstallPreInspection(version))
2021-11-22 16:03:55 -05:00
elif func == 'initd_status':
print(initdStatus())
elif func == 'initd_install':
print(initdInstall())
elif func == 'initd_uninstall':
print(initdUinstall())
elif func == 'run_info':
print(runInfo())
2023-12-16 03:30:34 -05:00
elif func == 'run_doc_info':
print(runDocInfo())
2023-12-16 04:01:49 -05:00
elif func == 'run_repl_info':
print(runReplInfo())
2021-11-22 16:03:55 -05:00
elif func == 'conf':
print(getConf())
2024-05-05 06:03:40 -04:00
elif func == 'config_key':
print(getConfKey())
2024-05-01 08:33:36 -04:00
elif func == 'get_config':
print(getConfig())
2024-05-01 11:48:40 -04:00
elif func == 'set_config':
print(saveConfig())
2024-05-01 11:50:45 -04:00
elif func == 'set_config_auth':
print(setConfigAuth())
2024-08-06 01:14:43 -04:00
elif func == 'root_pwd':
print(rootPwd())
2024-05-02 12:45:28 -04:00
elif func == 'get_db_list':
print(getDbList())
elif func == 'add_db':
print(addDb())
2024-05-03 00:05:02 -04:00
elif func == 'del_db':
print(delDb())
2024-08-09 09:41:59 -04:00
elif func == 'del_db_table':
print(delDbTable())
2024-05-02 12:45:28 -04:00
elif func == 'set_root_pwd':
print(setRootPwd())
2024-05-03 00:05:02 -04:00
elif func == 'set_user_pwd':
print(setUserPwd())
elif func == 'sync_get_databases':
print(syncGetDatabases())
2024-05-03 04:00:09 -04:00
elif func == 'sync_to_databases':
print(syncToDatabases())
2024-05-03 00:05:02 -04:00
elif func == 'set_db_ps':
print(setDbPs())
elif func == 'get_db_info':
print(getDbInfo())
2024-05-03 04:00:09 -04:00
elif func == 'get_all_role':
print(getAllRole())
elif func == 'get_db_access':
print(getDbAccess())
elif func == 'set_db_access':
print(setDbAccess())
2024-05-04 02:34:38 -04:00
elif func == 'repl_set_name':
print(replSetName())
elif func == 'repl_set_node':
print(replSetNode())
elif func == 'get_repl_config':
print(getReplConfig())
elif func == 'del_repl_node':
print(delReplNode())
elif func == 'repl_init':
print(replInit())
2024-05-04 04:14:27 -04:00
elif func == 'repl_close':
print(replClose())
2024-05-05 01:45:50 -04:00
elif func == 'get_db_backup_list':
print(getDbBackupList())
2024-05-05 02:25:47 -04:00
elif func == 'get_db_backup_import_list':
print(getDbBackupImportList())
2024-05-05 01:45:50 -04:00
elif func == 'delete_db_backup':
print(deleteDbBackup())
elif func == 'set_db_backup':
print(setDbBackup())
2024-05-05 02:25:47 -04:00
elif func == 'import_db_external':
print(importDbExternal())
2024-05-05 01:45:50 -04:00
elif func == 'import_db_backup':
print(importDbBackup())
2021-11-22 16:03:55 -05:00
elif func == 'run_log':
print(runLog())
2024-01-21 11:16:25 -05:00
elif func == 'test':
print(test())
2024-04-29 09:18:04 -04:00
elif func == 'test_data':
print(testData())
2025-09-17 00:44:37 -04:00
elif func == 'cron_add_check':
print(cronAddCheck())
elif func == 'cron_del_check':
print(cronDelCheck())
2021-11-22 16:03:55 -05:00
else:
print('error')