This commit is contained in:
Mr Chen
2024-05-03 00:45:28 +08:00
parent 9ae7644710
commit 1b6f54e6a5
3 changed files with 260 additions and 14 deletions
+1 -1
View File
@@ -24,7 +24,7 @@
<p onclick="pluginInitD('mongodb');">自启动</p>
<p onclick="mongoSetConfig();">配置修改</p>
<p onclick="pluginConfig('mongodb');">配置文件</p>
<p onclick="docList();">文档列表</p>
<p onclick="dbList();">数据列表</p>
<p onclick="mongoDocStatus();">文档状态</p>
<p onclick="mongoStatus();">负载状态</p>
<p onclick="mongoReplStatus();">复制状态</p>
+126 -9
View File
@@ -310,6 +310,54 @@ def saveConfig():
reload()
return mw.returnJson(True,'设置成功')
# print(mg_pass)
# listDbs = client.admin.command({"listDatabases": 1})
# print(listDbs)
# print(client_pass.list_database_names());
def initMgRoot(password='',force=0):
if force == 1:
d = getConfigData()
auth_t = d['security']['authorization']
d['security']['authorization'] = 'disabled'
setConfig(d)
reload()
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)
reload()
return True
def initUserRoot():
d = getConfigData()
auth_t = d['security']['authorization']
@@ -342,11 +390,6 @@ def initUserRoot():
# print(r1, r2)
r = pSqliteDb('config').where('id=?', (1,)).save('mg_root',(mg_pass,))
# print(r)
# print(mg_pass)
# listDbs = client.admin.command({"listDatabases": 1})
# print(listDbs)
# print(client_pass.list_database_names());
d['security']['authorization'] = auth_t
setConfig(d)
@@ -445,7 +488,7 @@ def runReplInfo():
return mw.returnJson(True, 'OK', result)
def getDocList():
def getDbList():
args = getArgs()
page = 1
page_size = 10
@@ -482,7 +525,7 @@ def getDocList():
_page['count'] = count
_page['p'] = page
_page['row'] = page_size
_page['tojs'] = 'docList'
_page['tojs'] = 'dbList'
data['page'] = mw.getPage(_page)
data['data'] = clist
@@ -492,6 +535,76 @@ def getDocList():
return mw.getJson(data)
# return mw.returnJson(True,'ok',data)
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, "数据库名不能为空!")
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
client['data_name'].insert_one({})
# print(data_name)
user_roles = [{'role': 'dbOwner', 'db': data_name}, {'role': 'userAdmin', 'db': data_name}]
if auth_status:
db.command("dropUser", username)
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, '添加成功')
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))
def testData():
'''
cd /www/server/mdserver-web && source bin/activate && python3 /www/server/mdserver-web/plugins/mongodb/index.py test_data
@@ -674,8 +787,12 @@ if __name__ == "__main__":
print(saveConfig())
elif func == 'set_config_auth':
print(setConfigAuth())
elif func == 'get_doc_list':
print(getDocList())
elif func == 'get_db_list':
print(getDbList())
elif func == 'add_db':
print(addDb())
elif func == 'set_root_pwd':
print(setRootPwd())
elif func == 'run_log':
print(runLog())
elif func == 'test':
+133 -4
View File
@@ -187,7 +187,7 @@ function mongoConfigSave(){
});
}
function docList(page, search){
function dbList(page, search){
var _data = {};
if (typeof(page) =='undefined'){
var page = 1;
@@ -200,7 +200,7 @@ function docList(page, search){
_data['page'] = page;
_data['page_size'] = 10;
console.log(_data);
mgPost('get_doc_list', '',_data, function(data){
mgPost('get_db_list', '',_data, function(data){
console.log(data);
var rdata = $.parseJSON(data.data);
console.log(rdata);
@@ -252,9 +252,8 @@ function docList(page, search){
//<button onclick="" id="dataRecycle" title="删除选中项" class="btn btn-default btn-sm" style="margin-left: 5px;"><span class="glyphicon glyphicon-trash" style="margin-right: 5px;"></span>回收站</button>
var con = '<div class="safe bgw">\
<button onclick="addDatabase()" title="添加数据库" class="btn btn-success btn-sm" type="button" style="margin-right: 5px;">添加数据库</button>\
<button onclick="setRootPwd(0,\''+rdata.info['root_pwd']+'\')" title="设置MySQL管理员密码" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">root密码</button>\
<button onclick="setRootPwd(0,\''+rdata.info['root_pwd']+'\')" title="设置Mongodb管理员密码" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">root密码</button>\
<button onclick="setDbAccess(\'root\')" title="ROOT权限" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">ROOT权限</button>\
<button onclick="fixDbAccess(\'root\')" title="修复" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">修复</button>\
<span style="float:right"> \
<button batch="true" style="float: right;display: none;margin-left:10px;" onclick="delDbBatch();" title="删除选中项" class="btn btn-default btn-sm">删除选中</button>\
</span>\
@@ -289,3 +288,133 @@ function docList(page, search){
});
}
function addDatabase(type){
layer.open({
type: 1,
area: '500px',
title: '添加数据库',
closeBtn: 1,
shift: 5,
shadeClose: true,
btn:["提交","关闭"],
content: "<form class='bt-form pd20' id='add_db'>\
<div class='line'>\
<span class='tname'>数据库名</span>\
<div class='info-r'><input name='name' class='bt-input-text mr5' placeholder='新的数据库名称' type='text' style='width:65%' value=''>\
</div>\
</div>\
<div class='line'><span class='tname'>用户名</span><div class='info-r'><input name='db_user' class='bt-input-text mr5' placeholder='数据库用户' type='text' style='width:65%' value=''></div></div>\
<div class='line'>\
<span class='tname'>密码</span>\
<div class='info-r'><input class='bt-input-text mr5' type='text' name='password' id='MyPassword' style='width:330px' value='"+(randomStrPwd(16))+"' /><span title='随机密码' class='glyphicon glyphicon-repeat cursor' onclick='repeatPwd(16)'></span></div>\
</div>\
<div class='line'>\
<span class='tname'>访问权限</span>\
<div class='info-r '>\
<select class='bt-input-text mr5' name='dataAccess' style='width:100px'>\
<option value='127.0.0.1'>本地服务器</option>\
<option value=\"%\">所有人</option>\
<option value='ip'>指定IP</option>\
</select>\
</div>\
</div>\
<input type='hidden' name='ps' value='' />\
</form>",
success:function(){
$("input[name='name']").keyup(function(){
var v = $(this).val();
$("input[name='db_user']").val(v);
$("input[name='ps']").val(v);
});
$('select[name="dataAccess"]').change(function(){
var v = $(this).val();
if (v == 'ip'){
$(this).after("<input id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>");
} else {
$('#dataAccess_subid').remove();
}
});
},
yes:function(index) {
var data = $("#add_db").serialize();
data = decodeURIComponent(data);
var dataObj = toArrayObject(data);
if(!dataObj['address']){
dataObj['address'] = dataObj['dataAccess'];
}
mgPost('add_db', '',dataObj, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
if (rdata.status){
layer.close(index);
dbList();
}
},{icon: rdata.status ? 1 : 2}, 2000);
});
}
});
}
function setRootPwd(type, pwd){
if (type==1){
var password = $("#MyPassword").val();
mgPost('set_root_pwd', '',{password:password}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
dbList();
},{icon: rdata.status ? 1 : 2});
});
return;
}
var index = layer.open({
type: 1,
area: '500px',
title: '修改数据库密码',
closeBtn: 1,
shift: 5,
btn:["提交", "关闭", "复制ROOT密码", "强制修改"],
shadeClose: true,
content: "<form class='bt-form pd20' id='mod_pwd'>\
<div class='line'>\
<span class='tname'>root密码</span>\
<div class='info-r'><input class='bt-input-text mr5' type='text' name='password' id='MyPassword' style='width:330px' value='"+pwd+"' />\
<span title='随机密码' class='glyphicon glyphicon-repeat cursor' onclick='repeatPwd(16)'></span>\
</div>\
</div>\
</form>",
yes:function(layerIndex){
var password = $("#MyPassword").val();
mgPost('set_root_pwd', '',{password:password}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(layerIndex);
dbList();
},{icon: rdata.status ? 1 : 2});
});
},
btn3:function(){
var password = $("#MyPassword").val();
copyText(password);
return false;
},
btn4:function(layerIndex){
layer.confirm('强制修改,是为了在重建时使用,确定强制?', {
btn: ['确定', '取消']
}, function(index, layero){
layer.close(index);
var password = $("#MyPassword").val();
mgPost('set_root_pwd', '',{password:password,force:'1'}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(layerIndex);
dbList();
},{icon: rdata.status ? 1 : 2});
});
});
return false;
}
});
}