diff --git a/plugins/mongodb/index.py b/plugins/mongodb/index.py index 97eb1ee86..03a33f6fe 100755 --- a/plugins/mongodb/index.py +++ b/plugins/mongodb/index.py @@ -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': diff --git a/plugins/mongodb/info.json b/plugins/mongodb/info.json index dcfbf1a3f..7f5cb0895 100755 --- a/plugins/mongodb/info.json +++ b/plugins/mongodb/info.json @@ -1,6 +1,6 @@ { "sort": 7, - "ps": "一个高性能的NOSQL数据库", + "ps": "一个高性能的NOSQL数据库【社区版】", "name": "mongodb", "title": "Mongodb", "shell": "install.sh", diff --git a/plugins/mongodb/js/mongodb.js b/plugins/mongodb/js/mongodb.js index 2ad0aba29..886dbe518 100644 --- a/plugins/mongodb/js/mongodb.js +++ b/plugins/mongodb/js/mongodb.js @@ -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 += ''; @@ -235,7 +262,7 @@ function dbList(page, search){ list += ''+(rdata.data[i]['is_backup']?'备份':'未备份') +' | '; list += '工具 | ' + - '权限 | ' + + '权限 | ' + '改密 | ' + '删除' + ''; @@ -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 += '\ @@ -554,14 +580,6 @@ function repTools(db_name, res){ ' } - 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: "
\ +
\ + 访问权限\ +
\ +
\ +
\ +
\ +
", + 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}); + }); + } + }); + + }); +}