pull/522/head
Mr Chen 1 year ago
parent 315b8e0e48
commit 80c6f91206
  1. 252
      plugins/data_query/nosql_mongodb.py
  2. 2
      plugins/data_query/nosql_redis.py
  3. 10
      plugins/data_query/static/html/index.html
  4. 81
      plugins/data_query/static/js/app.js

@ -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):

@ -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
# 获取配置项

@ -2,8 +2,8 @@
<div class="container-fluid" style="padding-bottom: 50px;">
<div id="cutTab" class="pos-box bgw mtb15" style="height:45px">
<div class="tab-list">
<div class="tabs-item active" data-name="redis">Redis</div>
<div class="tabs-item" data-name="mongodb">Mongodb</div>
<div class="tabs-item" data-name="redis">Redis</div>
<div class="tabs-item active" data-name="mongodb">Mongodb</div>
<!-- <div class="tabs-item" data-name="memcached">Memcached</div> -->
</div>
</div>
@ -38,10 +38,10 @@
</select>
</div>
<!-- <div class="search">
<input id="mongodb_ksearch" type="text" class="search_input" placeholder="请输入键名称">
<div class="search">
<input id="mongodb_ksearch" type="text" class="search_input" placeholder="选择表名">
<span id="mongodb_ksearch_span" class="glyphicon glyphicon-search" aria-hidden="true"></span>
</div> -->
</div>
</div>
</div>
<div class="divtable mtb10">

@ -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 += '<span data-id="'+i+'" class="on">'+list[i]['name'] + '('+ list[i]['keynum'] +')</span>';
} else {
content += '<span data-id="'+i+'">'+list[i]['name'] + '('+ list[i]['keynum'] +')</span>';
}
}
$('#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 ---------------------------------

Loading…
Cancel
Save