This commit is contained in:
Mr Chen
2024-05-03 16:00:09 +08:00
parent 4ee5e41882
commit 8ee5b0a4aa
3 changed files with 329 additions and 16 deletions
+197 -1
View File
@@ -736,6 +736,195 @@ def getDbInfo():
return mw.returnJson(True,'ok', result)
def toDbBase(find):
client = mongdbClient()
db_admin = client.admin
data_name = find['name']
db = client[data_name]
db.chat.insert_one({})
user_roles = [{'role': 'dbOwner', 'db': data_name}, {'role': 'userAdmin', 'db': data_name}]
try:
db_admin.command("createUser", find['username'], pwd=find['password'], roles=user_roles)
except Exception as e:
db_admin.command("updateUser", find['username'], pwd=find['password'], roles=user_roles)
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_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'}
# ]
user_roles = []
select_role = select.split(',')
for role in select_role:
t = {}
t['role'] = role
t['db'] = name
user_roles.append(t)
client = mongdbClient()
db = client.admin
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, '设置成功!')
def testData():
'''
cd /www/server/mdserver-web && source bin/activate && python3 /www/server/mdserver-web/plugins/mongodb/index.py test_data
@@ -754,7 +943,6 @@ def testData():
print(x)
def test():
initUserRoot()
'''
@@ -930,10 +1118,18 @@ if __name__ == "__main__":
print(setUserPwd())
elif func == 'sync_get_databases':
print(syncGetDatabases())
elif func == 'sync_to_databases':
print(syncToDatabases())
elif func == 'set_db_ps':
print(setDbPs())
elif func == 'get_db_info':
print(getDbInfo())
elif func == 'get_all_role':
print(getAllRole())
elif func == 'get_db_access':
print(getDbAccess())
elif func == 'set_db_access':
print(setDbAccess())
elif func == 'run_log':
print(runLog())
elif func == 'test':
+1 -1
View File
@@ -1,6 +1,6 @@
{
"sort": 7,
"ps": "一个高性能的NOSQL数据库",
"ps": "一个高性能的NOSQL数据库【社区版】",
"name": "mongodb",
"title": "Mongodb",
"shell": "install.sh",
+131 -14
View File
@@ -26,6 +26,33 @@ function mgPost(method, version, args,callback){
},'json');
}
function mgPostN(method, version, args,callback){
var req_data = {};
req_data['name'] = 'mongodb';
req_data['func'] = method;
req_data['version'] = version;
if (typeof(args) == 'string'){
req_data['args'] = JSON.stringify(toArrayObject(args));
} else {
req_data['args'] = JSON.stringify(args);
}
$.post('/plugins/run', req_data, function(data) {
if (!data.status){
//错误展示10S
layer.msg(data.msg,{icon:0,time:2000,shade: [10, '#000']});
return;
}
if(typeof(callback) == 'function'){
callback(data);
}
},'json');
}
function mgAsyncPost(method,args){
var _args = null;
if (typeof(args) == 'string'){
@@ -211,11 +238,11 @@ function dbList(page, search){
_data['page'] = page;
_data['page_size'] = 10;
console.log(_data);
// console.log(_data);
mgPost('get_db_list', '',_data, function(data){
console.log(data);
// console.log(data);
var rdata = $.parseJSON(data.data);
console.log(rdata);
// console.log(rdata);
var list = '';
for(i in rdata.data){
list += '<tr>';
@@ -235,7 +262,7 @@ function dbList(page, search){
list += '<a href="javascript:;" class="btlink" class="btlink" onclick="setBackup(\''+rdata.data[i]['name']+'\',this)" title="数据库备份">'+(rdata.data[i]['is_backup']?'备份':'未备份') +'</a> | ';
list += '<a href="javascript:;" class="btlink" onclick="repTools(\''+rdata.data[i]['name']+'\')" title="MySQL优化修复工具">工具</a> | ' +
'<a href="javascript:;" class="btlink" onclick="setDbAccess(\''+rdata.data[i]['username']+'\')" title="设置数据库权限">权限</a> | ' +
'<a href="javascript:;" class="btlink" onclick="setDbAccess(\''+rdata.data[i]['username']+'\',\''+rdata.data[i]['name']+'\')" title="设置数据库权限">权限</a> | ' +
'<a href="javascript:;" class="btlink" onclick="setDbPass('+rdata.data[i]['id']+',\''+ rdata.data[i]['username'] +'\',\'' + rdata.data[i]['password'] + '\')">改密</a> | ' +
'<a href="javascript:;" class="btlink" onclick="delDb(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\')" title="删除数据库">删除</a>' +
'</td>';
@@ -539,8 +566,7 @@ function repTools(db_name, res){
mgPost('get_db_info', '', {name:db_name}, function(data){
var rdata = $.parseJSON(data.data);
var rdata = rdata.data;
console.log(rdata.collection_list);
// console.log(rdata.collection_list);
var tbody = '';
for (var i = 0; i < rdata.collection_list.length; i++) {
tbody += '<tr>\
@@ -554,14 +580,6 @@ function repTools(db_name, res){
</tr> '
}
if (res) {
$(".gztr").html(tbody);
$("#db_tools").html('');
$("input[type='checkbox']").attr("checked", false);
$(".tools_size").html('大小:' + rdata.data_size);
return;
}
layer.open({
type: 1,
title: "MongoDB工具箱【" + db_name + "】",
@@ -600,3 +618,102 @@ function repTools(db_name, res){
tableFixed('database_fix');
});
}
function syncToDatabase(type){
var data = [];
$('input[type="checkbox"].check:checked').each(function () {
if (!isNaN($(this).val())) data.push($(this).val());
});
var postData = 'type='+type+'&ids='+JSON.stringify(data);
mgPost('sync_to_databases', '',postData, function(data){
var rdata = $.parseJSON(data.data);
// console.log(rdata);
showMsg(rdata.msg,function(){
dbList();
},{ icon: rdata.status ? 1 : 2 });
});
}
function setDbAccess(username,name){
mgPost('get_db_access','','username='+username, function(data){
var rdata = $.parseJSON(data.data);
if (!rdata.status){
layer.msg(rdata.msg,{icon:2,shade: [0.3, '#000']});
return;
}
var db_roles = rdata.data.roles;
var all_roles = rdata.data.all_roles;
// console.log(all_roles);
var role_list;
var index = layer.open({
type: 1,
area: '500px',
title: '设置数据库权限',
closeBtn: 1,
shift: 5,
btn:["提交","取消"],
shadeClose: true,
content: "<form class='bt-form pd20' id='set_db_access'>\
<div class='line'>\
<span class='tname'>访问权限</span>\
<div class='info-r'>\
<div id='role_list'></div>\
</div>\
</div>\
</form>",
success:function(layers, index){
document.getElementById('layui-layer' + index).getElementsByClassName('layui-layer-content')[0].style.overflow = 'unset';
var role_data = [];
for (var i = 0; i < db_roles.length; i++) {
var t = {};
t['name'] = db_roles[i]['role'];
t['value'] = db_roles[i]['role'];
role_data.push(t);
}
role_list = xmSelect.render({
el: '#role_list',
language: 'zn',
toolbar: {show: true,},
paging: false,
data: role_data,
});
var pdata = [];
for (var i = 0; i < all_roles.length; i++) {
var tval = all_roles[i];
var isSelected = false;
for (var db_i = 0; db_i < db_roles.length; db_i++) {
var db_name = db_roles[db_i]['role'];
if (db_name == tval['role']){
isSelected = true;
}
}
var t = {name:tval['name'],value:tval['role']};
if (isSelected){
t = {name:tval['name'],value:tval['role'], selected: true};
}
pdata.push(t);
}
role_list.update({data:pdata});
},
yes:function(index){
var data = $("#set_db_access").serialize();
data = decodeURIComponent(data);
var dataObj = toArrayObject(data);
dataObj['username'] = username;
dataObj['name'] = name;
mgPost('set_db_access', '',dataObj, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(index);
dbList();
},{icon: rdata.status ? 1 : 2});
});
}
});
});
}