From 80c6f91206b0f730bb63bb35a19fb9b0b0ffa1b8 Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Fri, 2 Feb 2024 06:16:28 +0800 Subject: [PATCH] update --- plugins/data_query/nosql_mongodb.py | 252 +++------------------- plugins/data_query/nosql_redis.py | 2 +- plugins/data_query/static/html/index.html | 10 +- plugins/data_query/static/js/app.js | 81 ++++++- 4 files changed, 105 insertions(+), 240 deletions(-) diff --git a/plugins/data_query/nosql_mongodb.py b/plugins/data_query/nosql_mongodb.py index 881a2f6de..52ab1d2b8 100755 --- a/plugins/data_query/nosql_mongodb.py +++ b/plugins/data_query/nosql_mongodb.py @@ -5,6 +5,7 @@ import io import os import time import re +import pymongo sys.path.append(os.getcwd() + "/class/core") import mw @@ -35,53 +36,42 @@ class nosqlMongodb(): self.__config = self.get_options(None) - def redis_conn(self, db_idx=0): + def mgdb_conn(self): if self.__DB_HOST in ['127.0.0.1', 'localhost']: - redis_path = "{}/redis".format(mw.getServerDir()) - if not os.path.exists(redis_path): return False + mgdb_path = "{}/mongodb".format(mw.getServerDir()) + if not os.path.exists(mgdb_path): return False if not self.__DB_LOCAL: - self.__DB_PASS = self.__config['requirepass'] self.__DB_PORT = int(self.__config['port']) # print(self.__DB_HOST,self.__DB_PORT, self.__DB_PASS) try: - redis_pool = redis.ConnectionPool(host=self.__DB_HOST, port=self.__DB_PORT, password=self.__DB_PASS, db=db_idx, socket_timeout=3) - self.__DB_CONN = redis.Redis(connection_pool=redis_pool) - self.__DB_CONN.ping() + self.__DB_CONN = pymongo.MongoClient(host=self.__DB_HOST, port=self.__DB_PORT, maxPoolSize=10) + self.__DB_CONN.admin.command('ping') return self.__DB_CONN - except redis.exceptions.ConnectionError: + except pymongo.errors.ConnectionFailure: return False except Exception: - self.__DB_ERR = public.get_error_info() + self.__DB_ERR = mw.get_error_info() return False # 获取配置项 def get_options(self, get=None): - result = {} - redis_conf = mw.readFile("{}/redis/redis.conf".format(mw.getServerDir())) - if not redis_conf: return False - - keys = ["bind", "port", "timeout", "maxclients", "databases", "requirepass", "maxmemory"] - for k in keys: - v = "" - rep = "\n%s\s+(.+)" % k - group = re.search(rep, redis_conf) - if not group: - if k == "maxmemory": - v = "0" - if k == "maxclients": - v = "10000" - if k == "requirepass": - v = "" - else: - if k == "maxmemory": - v = int(group.group(1).strip("mb")) - else: - v = group.group(1) - result[k] = v + mgdb_content = mw.readFile("{}/mongodb/mongodb.conf".format(mw.getServerDir())) + if not mgdb_content: return False + + keys = ["bind_ip", "port"] + + result['host'] = '127.0.0.1' + + rep = 'port\s*=\s*(.*)' + ip_re = re.search(rep, mgdb_content) + if ip_re: + result['port'] = int(ip_re.groups()[0].strip()) + else: + result['port'] = 27017 return result def set_host(self, host, port, name, username, password, prefix=''): @@ -105,209 +95,25 @@ class nosqlMongodbCtr(): pass def getInstanceBySid(self, sid = 0): - instance = nosqlRedis() + instance = nosqlMongodb() return instance - def getList(self, args): + def getDbList(self, args): sid = args['sid'] - redis_instance = self.getInstanceBySid(sid).redis_conn(0) - if redis_instance is False: + mgdb_instance = self.getInstanceBySid(sid).mgdb_conn() + if mgdb_instance is False: return mw.returnData(False,'无法链接') - - redis_info = redis_instance.info() - is_cluster = redis_info.get("cluster_enabled", 0) - if is_cluster != 0: - return mw.returnData(False, "当前不支持连接redis集群!") - - db_num = 16 - if sid != 0: - db_num = 1000 - - result = [] - for x in range(0, db_num): - data = {} - data['id'] = x - data['name'] = 'DB{}'.format(x) - try: - redis_instance = self.getInstanceBySid(sid).redis_conn(x) - data['keynum'] = redis_instance.dbsize() - result.append(data) - except: - break - + result = {} + result["dbs"] = mgdb_instance.list_database_names() return mw.returnData(True,'ok', result) - def getDbKeyList(self, args): - p = 1 - size = 10 - - if not 'sid' in args: - return mw.returnData(False, "缺少参数!sid") - - if 'p' in args: - p = args['p'] - if p < 1: - p = 1 - if p > 10: - p = 10 - - if 'size' in args: - size = args['size'] - - sid = args['sid'] - idx = args['idx'] - search = '*' - if 'search' in args and args['search'] != '': - search = args['search'] - - redis_instance = self.getInstanceBySid(sid).redis_conn(idx) - - total = redis_instance.dbsize() - - if search != '*': - keylist = redis_instance.keys(search) - total = len(keylist) - else: - keys = redis_instance.scan(cursor=0, match="{}".format(search), count=p*size) - keylist = keys[1] - - slist = keylist[(p - 1) * size:p*size] - - items = [] - for key in slist: - item = {} - try: - item['name'] = key.decode() - except Exception as e: - item['name'] = str(key) - - item['endtime'] = redis_instance.ttl(key) - item['type'] = redis_instance.type(key).decode() - - if item['type'] == 'string': - try: - item['val'] = redis_instance.get(key).decode() - except Exception as e: - item['val'] = str(redis_instance.get(key)) - elif item['type'] == 'hash': - if redis_instance.hlen(key) > 500: - item['val'] = "数据量过大无法显示!共 {} 条".format(redis_instance.hlen(key)) - else: - item['val'] = str(redis_instance.hgetall(key)) - elif item['type'] == 'list': - if redis_instance.llen(key) > 500: - item['val'] = "数据量过大无法显示!共 {} 条".format(redis_instance.llen(key)) - else: - item['val'] = str(redis_instance.lrange(key, 0, -1)) - elif item['type'] == 'set': - if redis_instance.scard(key) > 500: - item['val'] = "数据量过大无法显示!共 {} 条".format(redis_instance.scard(key)) - else: - item['val'] = str(redis_instance.smembers(key)) - elif item['type'] == 'zset': - if redis_instance.zcard(key) > 500: - item['val'] = "数据量过大无法显示!共 {} 条".format(redis_instance.zcard(key)) - else: - item['val'] = str(redis_instance.zrange(key, 0, -1, withscores=True)) - else: - item['val'] = '' - - try: - item['len'] = redis_instance.strlen(key) - except: - item['len'] = len(item['val']) - items.append(item) - - - page_args = {} - page_args['count'] = total - page_args['tojs'] = 'redisGetKeyList' - page_args['p'] = p - page_args['row'] = size - - rdata = {} - rdata['page'] = mw.getPage(page_args) - rdata['data'] = items - return mw.returnData(True,'ok',rdata) - - def setKv(self,args): - if not 'name' in args: - return mw.returnData(False, "缺少参数!name") - if not 'val' in args: - return mw.returnData(False, "缺少参数!val") - if not 'idx' in args: - return mw.returnData(False, "缺少参数!idx") - - sid = args['sid'] - idx = args['idx'] - - name = args["name"] - val = args["val"] - endtime = args["endtime"] - - redis_instance = self.getInstanceBySid(sid).redis_conn(idx) - - redis_info = redis_instance.info() - if redis_info['role'] == 'slave': - return mw.returnData(False,'从库不能写操作!') - - if endtime != '0': - redis_instance.set(name, val, int(endtime)) - else: - redis_instance.set(name, val) - - return mw.returnData(True,'操作成功') - - def delVal(self, args): - sid = args['sid'] - idx = args['idx'] - name = args["name"] - redis_instance = self.getInstanceBySid(sid).redis_conn(idx) - - redis_info = redis_instance.info() - if redis_info['role'] == 'slave': - return mw.returnData(False,'从库不能删除操作!') - - redis_instance.delete(name) - return mw.returnData(True,'操作成功') - - def batchDelVal(self, args): - sid = args['sid'] - idx = args['idx'] - keys = args["keys"] - redis_instance = self.getInstanceBySid(sid).redis_conn(idx) - - redis_info = redis_instance.info() - if redis_info['role'] == 'slave': - return mw.returnData(False,'从库不能删除操作!') - - for k in keys: - redis_instance.delete(k) - return mw.returnData(True,'操作成功') - - def clearFlushDB(self, args): - - sid = args['sid'] - idxs = args['idxs'] - - for idx in idxs: - redis_instance = self.getInstanceBySid(sid).redis_conn(idx) - - redis_info = redis_instance.info() - if redis_info['role'] == 'slave': - return mw.returnData(False,'从库不能清空操作!') - - redis_instance.flushdb() - - return mw.returnData(True,'操作成功') - # ---------------------------------- run ---------------------------------- # 获取 mongodb databases 列表 -def get_list(args): +def get_db_list(args): t = nosqlMongodbCtr() - return t.getList(args) + return t.getDbList(args) # 获取 redis key 列表 def get_dbkey_list(args): diff --git a/plugins/data_query/nosql_redis.py b/plugins/data_query/nosql_redis.py index fee1f475d..439175d41 100755 --- a/plugins/data_query/nosql_redis.py +++ b/plugins/data_query/nosql_redis.py @@ -57,7 +57,7 @@ class nosqlRedis(): except redis.exceptions.ConnectionError: return False except Exception: - self.__DB_ERR = public.get_error_info() + self.__DB_ERR = mw.getTracebackInfo() return False # 获取配置项 diff --git a/plugins/data_query/static/html/index.html b/plugins/data_query/static/html/index.html index 2a8fa86cd..b54176d4f 100644 --- a/plugins/data_query/static/html/index.html +++ b/plugins/data_query/static/html/index.html @@ -2,8 +2,8 @@
-
Redis
-
Mongodb
+
Redis
+
Mongodb
@@ -38,10 +38,10 @@
- +
diff --git a/plugins/data_query/static/js/app.js b/plugins/data_query/static/js/app.js index d04569f1f..c1e2e90fc 100755 --- a/plugins/data_query/static/js/app.js +++ b/plugins/data_query/static/js/app.js @@ -33,6 +33,34 @@ function redisPostCB(method, args, callback){ },'json'); } +function mgdbPostCB(method, args, callback){ + var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); + + var req_data = {}; + req_data['name'] = 'data_query'; + req_data['func'] = method; + req_data['script']='nosql_mongodb'; + args['version'] = ''; + + if (typeof(args) == 'string' && args == ''){ + req_data['args'] = JSON.stringify(toArrayObject(args)); + } else { + req_data['args'] = JSON.stringify(args); + } + + $.post('/plugins/callback', req_data, function(data) { + layer.close(loadT); + if (!data.status){ + layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); + return; + } + + if(typeof(callback) == 'function'){ + callback(data); + } + },'json'); +} + function selectTab(tab = 'redis'){ $('.tab-view-box .tab-con').addClass('hide').removeClass('show').removeClass('w-full'); @@ -50,11 +78,10 @@ function closeInstallLayer(){ function initTabFunc(tab){ switch(tab){ case 'redis':initTabRedis();break; + case 'mongodb':initTabMongodb();break; } } - - function initDataQuery(){ var tab = $('#cutTab .tabs-item.active').data('name'); initTabFunc(tab); @@ -109,6 +136,46 @@ function initTabRedis(){ readerTableChecked(); } +function initTabMongodb(){ + //渲染数据 + mongodbGetList(); +} + +// ------------------------- mongodb start --------------------------------- +function mongodbGetSid(){ + return 0; +} + + +function mongodbGetList(){ + var sid = mongodbGetSid(); + mgdbPostCB('get_db_list',{'sid':sid} ,function(rdata){ + if (rdata.data.status){ + var list = rdata.data.data; + var content = ''; + for (var i = 0; i < list.length; i++) { + if (i == 0){ + content += ''+list[i]['name'] + '('+ list[i]['keynum'] +')'; + } else { + content += ''+list[i]['name'] + '('+ list[i]['keynum'] +')'; + } + } + $('#redis_list_tab .tab-nav').html(content); + + $('#redis_list_tab .tab-nav span').click(function(){ + $('#redis_list_tab .tab-nav span').removeClass('on'); + $(this).addClass('on'); + redisGetKeyList(1); + }); + // redisGetKeyList(1); + } else { + showInstallLayer(); + } + }); +} +// ------------------------- mongodb end --------------------------------- + +// ------------------------- redis start --------------------------------- function redisGetSid(){ return 0; } @@ -453,13 +520,5 @@ function redisBatchClear(){ } }); } - - - - - - - - - +// ------------------------- redis end ---------------------------------