update
This commit is contained in:
parent
315b8e0e48
commit
80c6f91206
|
|
@ -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
|
||||
mgdb_content = mw.readFile("{}/mongodb/mongodb.conf".format(mw.getServerDir()))
|
||||
if not mgdb_content: 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
|
||||
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…
Reference in New Issue