diff --git a/flask-consul/units/cloud/alicloud.py b/flask-consul/units/cloud/alicloud.py
index 2a0c62e..5f1e079 100644
--- a/flask-consul/units/cloud/alicloud.py
+++ b/flask-consul/units/cloud/alicloud.py
@@ -13,10 +13,14 @@ from alibabacloud_rds20140815.client import Client as Rds20140815Client
from alibabacloud_rds20140815 import models as rds_20140815_models
from alibabacloud_r_kvstore20150101 import models as r_kvstore_20150101_models
from alibabacloud_r_kvstore20150101.client import Client as R_kvstore20150101Client
+from alibabacloud_polardb20170801.client import Client as polardb20170801Client
+from alibabacloud_polardb20170801 import models as polardb_20170801_models
+from alibabacloud_dds20151201.client import Client as Dds20151201Client
+from alibabacloud_dds20151201 import models as dds_20151201_models
import sys,datetime,hashlib,math,traceback
from units import consul_kv,consul_svc
-from units.cloud import sync_ecs,sync_rds,sync_redis,notify
+from units.cloud import sync_ecs,sync_rds,sync_redis,notify,sync_polardb,sync_mongodb
from units.config_log import *
def exp(account,collect_days,notify_days,notify_amount):
@@ -329,3 +333,183 @@ def rds(account,region):
logger.error(f'{e}\n{traceback.format_exc()}')
data = {'count':'无','update':f'失败','status':50000,'msg':str(e)}
consul_kv.put_kv(f'ConsulManager/record/jobs/alicloud/{account}/rds/{region}', data)
+
+
+def polardb(account, region):
+ ak, sk = consul_kv.get_aksk('alicloud', account)
+ now = datetime.datetime.now().strftime('%m.%d/%H:%M')
+ group_dict = consul_kv.get_value(f'ConsulManager/assets/alicloud/group/{account}')
+
+ config = open_api_models.Config(access_key_id=ak, access_key_secret=sk)
+ config.endpoint = 'polardb.aliyuncs.com'
+ client = polardb20170801Client(config) # 使用PolarDB客户端
+
+ page_number = 1
+ polardb_dict = {}
+ runtime = util_models.RuntimeOptions()
+ try:
+ while True:
+ describe_dbclusters_request = polardb_20170801_models.DescribeDBClustersRequest(
+ page_size=100,
+ dbtype="MySQL",
+ region_id=region,
+ page_number=page_number,
+
+ )
+ print("------------------------------------------")
+
+ cluster_info = client.describe_dbclusters_with_options(describe_dbclusters_request, runtime)
+ cluster_list = cluster_info.body.to_map()['Items']['DBCluster']
+
+ polardb_dict_temp = {i['DBClusterId']: {
+ 'name': i.get('DBClusterDescription', f"未命名{i['DBClusterId']}"),
+ 'domain': '无', # todo
+ 'ip': '无', # todo
+ 'port': 3306, # todo
+ 'region': region,
+ 'group': group_dict.get(i['ResourceGroupId'], '无'),
+ 'status': i['DBClusterStatus'],
+ 'itype': '无', # todo
+ 'ver': i['DBVersion'],
+ 'exp': '-' if i.get('ExpireTime', None) == None else i.get('ExpireTime', '-T').split('T')[0],
+ 'cpu': '无', 'mem': '无', 'disk': '无'
+ } for i in cluster_list}
+ polardb_dict.update(polardb_dict_temp)
+ if len(cluster_list) < 100:
+ break
+ else:
+ page_number += 1
+ try:
+ for iid in polardb_dict.keys():
+ logger.info(f'【ali_PolarDB】===> {iid}')
+ describe_dbcluster_attribute_request = polardb_20170801_models.DescribeDBClusterEndpointsRequest(
+ dbcluster_id=iid)
+ cluster_plus_info = client.describe_dbcluster_endpoints_with_options(
+ describe_dbcluster_attribute_request, runtime)
+ cluster_plus_list = cluster_plus_info.body.to_map()['Items']
+ polardb_plus = {}
+ for i in cluster_plus_list:
+ if i['EndpointType'] == 'Cluster':
+ for address_item in i['AddressItems']:
+ if address_item['NetType'] == 'Private':
+ # 获取 DBClusterId 作为键
+ db_cluster_id = iid
+ # 构建子字典并将其赋值给 polardb_plus
+ polardb_plus[db_cluster_id] = {
+ 'port': int(address_item['Port']),
+ 'domain': address_item['ConnectionString'],
+ 'ip': address_item['IPAddress'],
+ 'itype': i['EndpointType'],
+ }
+ break
+ for k, v in polardb_plus.items():
+ if k in polardb_dict:
+ polardb_dict[k].update(v)
+ except Exception as e:
+ logger.error('DescribeDBClustersAsCsvRequest ERROR' + f'{e}\n{traceback.format_exc()}')
+
+ count = len(polardb_dict)
+ off, on = sync_polardb.w2consul('alicloud', account, region, polardb_dict)
+ data = {'count': count, 'update': now, 'status': 20000, 'on': on, 'off': off,
+ 'msg': f'polardb同步成功!总数:{count},开机:{on},关机:{off}'}
+ consul_kv.put_kv(f'ConsulManager/record/jobs/alicloud/{account}/polardb/{region}', data)
+ logger.info(f'【JOB】===>alicloud_polardb {account} {region} {data}')
+ except TeaException as e:
+ emsg = e.message.split('. ', 1)[0]
+ logger.error(f"【code:】{e.code}\n【message:】{e.message}\n{traceback.format_exc()}")
+ data = consul_kv.get_value(f'ConsulManager/record/jobs/alicloud/{account}/polardb/{region}')
+ if data == {}:
+ data = {'count': '无', 'update': f'失败{e.code}', 'status': 50000, 'msg': emsg}
+ else:
+ data['update'] = f'失败{e.code}'
+ data['msg'] = emsg
+ consul_kv.put_kv(f'ConsulManager/record/jobs/alicloud/{account}/polardb/{region}', data)
+ except Exception as e:
+ logger.error(f'{e}\n{traceback.format_exc()}')
+ data = {'count': '无', 'update': f'失败', 'status': 50000, 'msg': str(e)}
+ consul_kv.put_kv(f'ConsulManager/record/jobs/alicloud/{account}/polardb/{region}', data)
+
+
+def mongodb(account, region):
+ ak, sk = consul_kv.get_aksk('alicloud', account)
+ now = datetime.datetime.now().strftime('%m.%d/%H:%M')
+ group_dict = consul_kv.get_value(f'ConsulManager/assets/alicloud/group/{account}')
+
+ config = open_api_models.Config(access_key_id=ak, access_key_secret=sk)
+ config.endpoint = 'mongodb.aliyuncs.com'
+ client = Dds20151201Client(config) # 使用MongoDB客户端
+
+ page_number = 1
+ mongodb_dict = {}
+ runtime = util_models.RuntimeOptions()
+ try:
+ while True:
+ describe_dbinstances_request = dds_20151201_models.DescribeDBInstancesRequest(
+ page_size=100,
+ page_number=page_number,
+ region_id=region
+ )
+ mongodb_info = client.describe_dbinstances_with_options(describe_dbinstances_request, runtime)
+ mongodb_list = mongodb_info.body.to_map()['DBInstances']["DBInstance"]
+
+ mongodb_dict_temp = {i['DBInstanceId']: {
+ 'name': i.get('DBInstanceDescription', f"未命名{i['DBInstanceId']}"),
+ 'domain': '无', # todo
+ 'ip': '无', # todo
+ 'port': '无', # todo
+ 'region': region,
+ 'group': group_dict.get(i['ResourceGroupId'], '无'),
+ 'status': i['DBInstanceStatus'], # 假设MongoDB的实例有类似的status字段
+ 'itype': i['DBInstanceType'], # 替换为MongoDB的实例类型
+ 'ver': i['EngineVersion'],
+ 'exp': '-' if i.get('ExpireTime', None) is None else i.get('ExpireTime', '-T').split('T')[0],
+ 'cpu': '无', 'mem': '无', 'disk': '无'
+ } for i in mongodb_list}
+ mongodb_dict.update(mongodb_dict_temp)
+ if len(mongodb_list) < 100:
+ break
+ else:
+ page_number += 1
+ try:
+ for iid in mongodb_dict.keys():
+ logger.info(f'【ali_MongoDB】===> {iid}')
+ describe_dbinstance_attribute_request = dds_20151201_models.DescribeDBInstanceAttributeRequest(dbinstance_id=iid)
+ mongodb_plus_info = client.describe_dbinstance_attribute_with_options(describe_dbinstance_attribute_request, runtime)
+ mongodb_plus_list = mongodb_plus_info.body.to_map()['DBInstances']["DBInstance"]
+ mongodb_plus= {}
+ for i in mongodb_plus_list:
+ for replica_set in i['ReplicaSets']['ReplicaSet']:
+ if replica_set['ReplicaSetRole'] == 'Primary':
+ iid = i['DBInstanceId']
+ mongodb_plus[iid] = {
+ 'port': int(replica_set['ConnectionPort']),
+ 'domain': replica_set['ConnectionDomain'],
+ 'ip': replica_set['ConnectionDomain'],
+ 'itype': i['DBInstanceType'],
+ }
+ break
+ for k, v in mongodb_plus.items():
+ if k in mongodb_dict:
+ mongodb_dict[k].update(v)
+ except Exception as e:
+ logger.error('DescribeDBInstancesAsCsvRequest ERROR' + f'{e}\n{traceback.format_exc()}')
+ count = len(mongodb_dict)
+ off, on = sync_mongodb.w2consul('alicloud', account, region, mongodb_dict)
+ data = {'count': count, 'update': now, 'status': 20000, 'on': on, 'off': off,
+ 'msg': f'mongodb同步成功!总数:{count},开机:{on},关机:{off}'}
+ consul_kv.put_kv(f'ConsulManager/record/jobs/alicloud/{account}/mongodb/{region}', data)
+ logger.info(f'【JOB】===>alicloud_mongodb {account} {region} {data}')
+ except TeaException as e:
+ emsg = e.message.split('. ', 1)[0]
+ logger.error(f"【code:】{e.code}\n【message:】{e.message}\n{traceback.format_exc()}")
+ data = consul_kv.get_value(f'ConsulManager/record/jobs/alicloud/{account}/mongodb/{region}')
+ if data == {}:
+ data = {'count': '无', 'update': f'失败{e.code}', 'status': 50000, 'msg': emsg}
+ else:
+ data['update'] = f'失败{e.code}'
+ data['msg'] = emsg
+ consul_kv.put_kv(f'ConsulManager/record/jobs/alicloud/{account}/mongodb/{region}', data)
+ except Exception as e:
+ logger.error(f'{e}\n{traceback.format_exc()}')
+ data = {'count': '无', 'update': '失败', 'status': 50000, 'msg': str(e)}
+ consul_kv.put_kv(f'ConsulManager/record/jobs/alicloud/{account}/mongodb/{region}', data)
\ No newline at end of file
diff --git a/flask-consul/units/cloud/sync_mongodb.py b/flask-consul/units/cloud/sync_mongodb.py
new file mode 100644
index 0000000..d24cd75
--- /dev/null
+++ b/flask-consul/units/cloud/sync_mongodb.py
@@ -0,0 +1,80 @@
+#!/usr/bin/python3
+import requests,json
+from units import consul_kv
+from config import consul_token,consul_url,vendors,regions
+from units.config_log import *
+headers = {'X-Consul-Token': consul_token}
+geturl = f'{consul_url}/agent/services'
+delurl = f'{consul_url}/agent/service/deregister'
+puturl = f'{consul_url}/agent/service/register'
+def w2consul(vendor,account,region,mongodb_dict):
+ service_name = f'{vendor}_{account}_mongodb'
+ params = {'filter': f'Service == "{service_name}" and "{region}" in Tags and Meta.account == "{account}"'}
+ try:
+ consul_mongodb_iid_list = requests.get(geturl, headers=headers, params=params).json().keys()
+ except:
+ consul_mongodb_iid_list = []
+
+ #在consul中删除云厂商不存在的mongodb
+ for del_mongodb in [x for x in consul_mongodb_iid_list if x not in mongodb_dict.keys()]:
+ dereg = requests.put(f'{delurl}/{del_mongodb}', headers=headers)
+ if dereg.status_code == 200:
+ logger.info(f"code: 20000, data: {account}-删除成功!")
+ else:
+ logger.info(f"code: 50000, data: {dereg.status_code}:{dereg.text}")
+ off,on = 0,0
+ for k,v in mongodb_dict.items():
+ iid = k
+ #对consul中关机的mongodb做标记。
+ if v['status'] in ['SHUTDOWN','非运行中']:
+ off = off + 1
+ tags = ['OFF',v['itype'],v['ver'], region]
+ stat = 'off'
+ else:
+ on = on + 1
+ tags = ['ON',v['itype'],v['ver'],region]
+ stat = 'on'
+ custom_mongodb = consul_kv.get_value(f'ConsulManager/assets/sync_mongodb_custom/{iid}')
+ port = custom_mongodb.get('port')
+ ip = custom_mongodb.get('ip')
+ if port == None:
+ port = v['port']
+ if ip == None:
+ ip = v['ip']
+ instance = f'{ip}:{port}'
+ if vendor == 'alicloud' and iid in consul_mongodb_iid_list and v['cpu'] == '无':
+ continue
+
+ data = {
+ 'id': iid,
+ 'name': service_name,
+ 'Address': ip,
+ 'port': port,
+ 'tags': tags,
+ 'Meta': {
+ 'iid': iid,
+ 'name': v['name'],
+ 'region': regions[vendor].get(region,'未找到'),
+ 'group': v['group'],
+ 'instance': instance,
+ 'account': account,
+ 'itype': v['itype'],
+ 'vendor': vendors.get(vendor,'未找到'),
+ 'os': "mysql",
+ 'ver': v['ver'],
+ 'domain':v['domain'],
+ 'exp': v['exp'],
+ 'stat': stat,
+ 'team': v.get('team','无')
+ },
+ "check": {
+ "tcp": f"{ip}:{port}",
+ "interval": "60s"
+ }
+ }
+ reg = requests.put(puturl, headers=headers, data=json.dumps(data))
+ if reg.status_code == 200:
+ pass
+ else:
+ logger.info(f"{account}:code: 5000, data: {reg.status_code}:{reg.text}")
+ return off,on
diff --git a/flask-consul/units/cloud/sync_polardb.py b/flask-consul/units/cloud/sync_polardb.py
new file mode 100644
index 0000000..b270bd6
--- /dev/null
+++ b/flask-consul/units/cloud/sync_polardb.py
@@ -0,0 +1,80 @@
+#!/usr/bin/python3
+import requests,json
+from units import consul_kv
+from config import consul_token,consul_url,vendors,regions
+from units.config_log import *
+headers = {'X-Consul-Token': consul_token}
+geturl = f'{consul_url}/agent/services'
+delurl = f'{consul_url}/agent/service/deregister'
+puturl = f'{consul_url}/agent/service/register'
+def w2consul(vendor,account,region,rds_dict):
+ service_name = f'{vendor}_{account}_polardb'
+ params = {'filter': f'Service == "{service_name}" and "{region}" in Tags and Meta.account == "{account}"'}
+ try:
+ consul_rds_iid_list = requests.get(geturl, headers=headers, params=params).json().keys()
+ except:
+ consul_rds_iid_list = []
+
+ #在consul中删除云厂商不存在的rds
+ for del_rds in [x for x in consul_rds_iid_list if x not in rds_dict.keys()]:
+ dereg = requests.put(f'{delurl}/{del_rds}', headers=headers)
+ if dereg.status_code == 200:
+ logger.info(f"code: 20000, data: {account}-删除成功!")
+ else:
+ logger.info(f"code: 50000, data: {dereg.status_code}:{dereg.text}")
+ off,on = 0,0
+ for k,v in rds_dict.items():
+ iid = k
+ #对consul中关机的rds做标记。
+ if v['status'] in ['SHUTDOWN','非运行中']:
+ off = off + 1
+ tags = ['OFF',v['itype'],v['ver'], region]
+ stat = 'off'
+ else:
+ on = on + 1
+ tags = ['ON',v['itype'],v['ver'],region]
+ stat = 'on'
+ custom_rds = consul_kv.get_value(f'ConsulManager/assets/sync_rds_custom/{iid}')
+ port = custom_rds.get('port')
+ ip = custom_rds.get('ip')
+ if port == None:
+ port = v['port']
+ if ip == None:
+ ip = v['ip']
+ instance = f'{ip}:{port}'
+ if vendor == 'alicloud' and iid in consul_rds_iid_list and v['cpu'] == '无':
+ continue
+
+ data = {
+ 'id': iid,
+ 'name': service_name,
+ 'Address': ip,
+ 'port': port,
+ 'tags': tags,
+ 'Meta': {
+ 'iid': iid,
+ 'name': v['name'],
+ 'region': regions[vendor].get(region,'未找到'),
+ 'group': v['group'],
+ 'instance': instance,
+ 'account': account,
+ 'itype': v['itype'],
+ 'vendor': vendors.get(vendor,'未找到'),
+ 'os': "mysql",
+ 'ver': v['ver'],
+ 'domain':v['domain'],
+ 'exp': v['exp'],
+ 'stat': stat,
+ 'team': v.get('team','无')
+ },
+ "check": {
+ "tcp": f"{ip}:{port}",
+ "interval": "60s"
+ }
+ }
+ reg = requests.put(puturl, headers=headers, data=json.dumps(data))
+ if reg.status_code == 200:
+ pass
+ else:
+ logger.info(f"{account}:code: 5000, data: {reg.status_code}:{reg.text}")
+ return off,on
diff --git a/flask-consul/units/cloud/sync_rds.py b/flask-consul/units/cloud/sync_rds.py
index 2af7d87..b2a9897 100644
--- a/flask-consul/units/cloud/sync_rds.py
+++ b/flask-consul/units/cloud/sync_rds.py
@@ -60,6 +60,7 @@ def w2consul(vendor,account,region,rds_dict):
'account': account,
'itype': v['itype'],
'vendor': vendors.get(vendor,'未找到'),
+ 'os': "mysql",
'disk': v['disk'],
'cpu': v['cpu'],
'mem': v['mem'],
diff --git a/flask-consul/units/cloud/sync_redis.py b/flask-consul/units/cloud/sync_redis.py
index 6ea15f9..a767250 100644
--- a/flask-consul/units/cloud/sync_redis.py
+++ b/flask-consul/units/cloud/sync_redis.py
@@ -57,6 +57,7 @@ def w2consul(vendor,account,region,redis_dict):
'account': account,
'itype': v['itype'],
'vendor': vendors.get(vendor,'未找到'),
+ 'os': "redis",
'mem': v['mem'],
'ver': v['ver'],
'ip':v['ip'],
diff --git a/flask-consul/units/config_log.py b/flask-consul/units/config_log.py
index 45b0189..60779d9 100644
--- a/flask-consul/units/config_log.py
+++ b/flask-consul/units/config_log.py
@@ -1,5 +1,3 @@
from config import log_level
import sys
from loguru import logger
-logger.remove()
-logger.add(sys.stdout,format='{time:HH:mm:ss} | {level} | {message}',level=log_level)
diff --git a/flask-consul/units/jms/sync_jms.py b/flask-consul/units/jms/sync_jms.py
index 46bd9ba..9d6ec86 100755
--- a/flask-consul/units/jms/sync_jms.py
+++ b/flask-consul/units/jms/sync_jms.py
@@ -2,7 +2,7 @@ import datetime,requests,json,traceback
from units import consul_kv,consul_manager,myaes
from units.config_log import *
-resource_type = ["ecs", "redis", "mysql", "mongodb"]
+resource_type = ["ecs", "redis", "rds", "mongodb", "polardb"]
def exist_ssh_port(port,protocols):
@@ -60,7 +60,7 @@ def update_jms(jms_ver,jms_url,headers,new_node_dict,node_id,cloud,account,ecs_i
ecs_list = consul_manager.get_instances(f'{cloud}_{account}_{resource_type}')['instances']
ecs_ip_dict = {i['address']:i['meta'][0]['name'] for i in ecs_list}
- ecs_dict = {i['ID']:{'name':i['meta'][0]['name'],'ip':i['address'],'ent':i['meta'][0]['group'],'ostype':i['meta'][0]['os'],'region':i['meta'][0]['region'],'vendor':i['meta'][0]['vendor']} for i in ecs_list}
+ ecs_dict = {i['ID']:{'name':i['meta'][0]['name'],'ip':i['address'],'ent':i['meta'][0]['group'],'ostype':i['meta'][0]['os'],'region':i['meta'][0]['region'],'vendor':i['meta'][0]['vendor'],'ver':i['meta'][0].get('ver')} for i in ecs_list}
del_ecs_list = [v['id'] for k,v in jms_ecs_dict.items() if k not in [i['ip'] for i in ecs_dict.values()]]
for del_ecs in del_ecs_list:
response = requests.request("DELETE", f'{ecs_url}{del_ecs}/', headers=headers)
@@ -113,21 +113,23 @@ def update_jms(jms_ver,jms_url,headers,new_node_dict,node_id,cloud,account,ecs_i
elif platform == 'Windows':
payload["platform"] = "5"
payload["protocols"] = [{"name": proto, "port": port}]
- elif platform == 'Redis6+':
- payload["platform"] = "25"
- payload["protocols"] = [{"name": proto, "port": port}]
- payload["spec_info"] = {"db_name": "0"}
elif platform == 'Redis':
- payload["platform"] = '24'
+ ecs_url = f"{jms_url}/api/v1/assets/databases/"
payload["protocols"] = [{"name": proto, "port": port}]
- payload["spec_info"] = {"db_name": "0"}
+ payload.update({"db_name": "0", "use_ssl": False, "allow_invalid_cert": False})
+ if float(v['ver']) < 6:
+ payload["platform"] = '24'
+ else:
+ payload["platform"] = "25"
elif platform == 'Mysql':
+ ecs_url = f"{jms_url}/api/v1/assets/databases/"
payload["platform"] = '17'
payload["protocols"] = [{"name": proto, "port": port}]
elif platform == 'Mongodb':
+ ecs_url = f"{jms_url}/api/v1/assets/databases/"
payload["platform"] = '23'
payload["protocols"] = [{"name": proto, "port": port}]
- payload["spec_info"] = {"db_name": "admin"}
+ payload.update({"db_name": "admin"})
else:
logger.error(f"未匹配到{platform}!")
continue
diff --git a/flask-consul/units/selfmongodb_manager.py b/flask-consul/units/selfmongodb_manager.py
new file mode 100644
index 0000000..026e43a
--- /dev/null
+++ b/flask-consul/units/selfmongodb_manager.py
@@ -0,0 +1,77 @@
+import requests,json,re
+from config import consul_token,consul_url
+from units.config_log import *
+headers = {'X-Consul-Token': consul_token}
+
+def get_all_list(vendor,account,region,group):
+ vendor = f'and Meta.vendor=="{vendor}"' if vendor != '' else f'and Meta.vendor != ""'
+ account = f'and Meta.account=="{account}"' if account != '' else f'and Meta.account != ""'
+ region = f'and Meta.region=="{region}"' if region != '' else f'and Meta.region != ""'
+ group = f'and Meta.group=="{group}"' if group != '' else f'and Meta.group != ""'
+ url = f'{consul_url}/agent/services?filter=Service == selfrds_exporter {vendor} {account} {region} {group}'
+ response = requests.get(url, headers=headers)
+ if response.status_code == 200:
+ info = response.json()
+ all_list = [i['Meta'] for i in info.values()]
+ vendor_list = sorted(list(set([i['vendor'] for i in all_list])))
+ account_list = sorted(list(set([i['account'] for i in all_list])))
+ region_list = sorted(list(set([i['region'] for i in all_list])))
+ group_list = sorted(list(set([i['group'] for i in all_list])))
+ return {'code': 20000,'all_list':all_list,'vendor_list':vendor_list,
+ 'account_list':account_list,'region_list':region_list,'group_list':group_list}
+ else:
+ logger.error(f"{response.status_code}:{response.text}")
+ return {'code': 50000, 'data': f'{response.status_code}:{response.text}'}
+
+def get_service():
+ response = requests.get(f'{consul_url}/agent/services?filter=Service == selfrds_exporter', headers=headers)
+ if response.status_code == 200:
+ info = response.json()
+ all_list = [i['Meta'] for i in info.values()]
+ vendor_list = sorted(list(set([i['vendor'] for i in all_list])))
+ account_list = sorted(list(set([i['account'] for i in all_list])))
+ region_list = sorted(list(set([i['region'] for i in all_list])))
+ group_list = sorted(list(set([i['group'] for i in all_list])))
+ return {'code': 20000,'all_list':all_list,'vendor_list':vendor_list,
+ 'account_list':account_list,'region_list':region_list,'group_list':group_list}
+ else:
+ logger.error(f"{response.status_code}:{response.text}")
+ return {'code': 50000, 'data': f'{response.status_code}:{response.text}'}
+
+def add_service(vendor,account,region,group,name,ip,port,os):
+ if port is None or name is None:
+ return {"code": 50000, "data": f"名称或IP不能为空!"}
+ sid = f"{vendor}/{account}/{region}/{group}@{name}".strip()
+ #sid = eval(repr(sid).replace('\\t','').replace('\\n',''))
+ sid = re.sub('[[ \]`~!\\\#$^&*=|"{}\':;?\t\n]','_',sid)+'@rds'
+ instance = f'{ip}:{port}'
+ if '//' in sid or sid.startswith('/'):
+ return {"code": 50000, "data": f"服务ID【{sid}】首尾不能包含'/',并且不能包含两个连续的'/'"}
+ data = {
+ "id": sid,
+ "name": 'selfrds_exporter',
+ 'Address': ip,
+ 'port': int(port),
+ "tags": [vendor,os],
+ "Meta": {'vendor':vendor,'account':account,'region':region,'group':group,
+ 'name':name,'instance':instance,'os':os},
+ "check": {"tcp": instance,"interval": "60s"}
+ }
+ reg = requests.put(f'{consul_url}/agent/service/register', headers=headers, data=json.dumps(data))
+ if reg.status_code == 200:
+ return {"code": 20000, "data": f"【{sid}】增加成功!"}
+ else:
+ logger.error(f"{reg.status_code}【{sid}】{reg.text}")
+ return {"code": 50000, "data": f"{reg.status_code}【{sid}】{reg.text}"}
+
+def del_service(vendor,account,region,group,name):
+ sid = f"{vendor}/{account}/{region}/{group}@{name}".strip()
+ sid = re.sub('[[ \]`~!\\\#$^&*=|"{}\':;?\t\n]','_',sid)+'@rds'
+ reg = requests.put(f'{consul_url}/agent/service/deregister/{sid}', headers=headers)
+ if reg.status_code == 200:
+ logger.debug(f"【{sid}】删除成功!")
+ return {"code": 20000, "data": f"【{sid}】删除成功!"}
+ else:
+ logger.error(f"{reg.status_code}【{sid}】{reg.text}")
+ return {"code": 50000, "data": f"{reg.status_code}【{sid}】{reg.text}"}
+
diff --git a/flask-consul/units/selfpolardb_manager.py b/flask-consul/units/selfpolardb_manager.py
new file mode 100644
index 0000000..026e43a
--- /dev/null
+++ b/flask-consul/units/selfpolardb_manager.py
@@ -0,0 +1,77 @@
+import requests,json,re
+from config import consul_token,consul_url
+from units.config_log import *
+headers = {'X-Consul-Token': consul_token}
+
+def get_all_list(vendor,account,region,group):
+ vendor = f'and Meta.vendor=="{vendor}"' if vendor != '' else f'and Meta.vendor != ""'
+ account = f'and Meta.account=="{account}"' if account != '' else f'and Meta.account != ""'
+ region = f'and Meta.region=="{region}"' if region != '' else f'and Meta.region != ""'
+ group = f'and Meta.group=="{group}"' if group != '' else f'and Meta.group != ""'
+ url = f'{consul_url}/agent/services?filter=Service == selfrds_exporter {vendor} {account} {region} {group}'
+ response = requests.get(url, headers=headers)
+ if response.status_code == 200:
+ info = response.json()
+ all_list = [i['Meta'] for i in info.values()]
+ vendor_list = sorted(list(set([i['vendor'] for i in all_list])))
+ account_list = sorted(list(set([i['account'] for i in all_list])))
+ region_list = sorted(list(set([i['region'] for i in all_list])))
+ group_list = sorted(list(set([i['group'] for i in all_list])))
+ return {'code': 20000,'all_list':all_list,'vendor_list':vendor_list,
+ 'account_list':account_list,'region_list':region_list,'group_list':group_list}
+ else:
+ logger.error(f"{response.status_code}:{response.text}")
+ return {'code': 50000, 'data': f'{response.status_code}:{response.text}'}
+
+def get_service():
+ response = requests.get(f'{consul_url}/agent/services?filter=Service == selfrds_exporter', headers=headers)
+ if response.status_code == 200:
+ info = response.json()
+ all_list = [i['Meta'] for i in info.values()]
+ vendor_list = sorted(list(set([i['vendor'] for i in all_list])))
+ account_list = sorted(list(set([i['account'] for i in all_list])))
+ region_list = sorted(list(set([i['region'] for i in all_list])))
+ group_list = sorted(list(set([i['group'] for i in all_list])))
+ return {'code': 20000,'all_list':all_list,'vendor_list':vendor_list,
+ 'account_list':account_list,'region_list':region_list,'group_list':group_list}
+ else:
+ logger.error(f"{response.status_code}:{response.text}")
+ return {'code': 50000, 'data': f'{response.status_code}:{response.text}'}
+
+def add_service(vendor,account,region,group,name,ip,port,os):
+ if port is None or name is None:
+ return {"code": 50000, "data": f"名称或IP不能为空!"}
+ sid = f"{vendor}/{account}/{region}/{group}@{name}".strip()
+ #sid = eval(repr(sid).replace('\\t','').replace('\\n',''))
+ sid = re.sub('[[ \]`~!\\\#$^&*=|"{}\':;?\t\n]','_',sid)+'@rds'
+ instance = f'{ip}:{port}'
+ if '//' in sid or sid.startswith('/'):
+ return {"code": 50000, "data": f"服务ID【{sid}】首尾不能包含'/',并且不能包含两个连续的'/'"}
+ data = {
+ "id": sid,
+ "name": 'selfrds_exporter',
+ 'Address': ip,
+ 'port': int(port),
+ "tags": [vendor,os],
+ "Meta": {'vendor':vendor,'account':account,'region':region,'group':group,
+ 'name':name,'instance':instance,'os':os},
+ "check": {"tcp": instance,"interval": "60s"}
+ }
+ reg = requests.put(f'{consul_url}/agent/service/register', headers=headers, data=json.dumps(data))
+ if reg.status_code == 200:
+ return {"code": 20000, "data": f"【{sid}】增加成功!"}
+ else:
+ logger.error(f"{reg.status_code}【{sid}】{reg.text}")
+ return {"code": 50000, "data": f"{reg.status_code}【{sid}】{reg.text}"}
+
+def del_service(vendor,account,region,group,name):
+ sid = f"{vendor}/{account}/{region}/{group}@{name}".strip()
+ sid = re.sub('[[ \]`~!\\\#$^&*=|"{}\':;?\t\n]','_',sid)+'@rds'
+ reg = requests.put(f'{consul_url}/agent/service/deregister/{sid}', headers=headers)
+ if reg.status_code == 200:
+ logger.debug(f"【{sid}】删除成功!")
+ return {"code": 20000, "data": f"【{sid}】删除成功!"}
+ else:
+ logger.error(f"{reg.status_code}【{sid}】{reg.text}")
+ return {"code": 50000, "data": f"{reg.status_code}【{sid}】{reg.text}"}
+
diff --git a/flask-consul/views/edit_cloud.py b/flask-consul/views/edit_cloud.py
index f9f794e..6eeffd3 100644
--- a/flask-consul/views/edit_cloud.py
+++ b/flask-consul/views/edit_cloud.py
@@ -34,7 +34,8 @@ class Edit(Resource):
account = args['account']
region = args['region']
restype = ['group']
- interval = {'proj_interval': 60, 'ecs_interval': 10, 'rds_interval': 20, 'redis_interval': 20}
+ interval = {'proj_interval': 60, 'ecs_interval': 10, 'rds_interval': 20, 'redis_interval': 20,
+ 'polardb_interval': 20, 'mongodb_interval': 20}
isextip = False
for i in job_list:
if f'{vendor}/{account}/group' == i['id']:
@@ -49,6 +50,12 @@ class Edit(Resource):
elif f'{vendor}/{account}/redis/{region}' == i['id']:
restype.append('redis')
interval['redis_interval'] = i['minutes']
+ elif f'{vendor}/{account}/polardb/{region}' == i['id']:
+ restype.append('polardb')
+ interval['polardb_interval'] = i['minutes']
+ elif f'{vendor}/{account}/mongodb/{region}' == i['id']:
+ restype.append('mongodb')
+ interval['mongodb_interval'] = i['minutes']
return {'code': 20000, 'restype': restype, 'interval': interval, 'isextip': isextip}
def post(self,stype):
job_list = list(consul_kv.get_kv_dict(f'ConsulManager/jobs').values())
@@ -63,6 +70,8 @@ class Edit(Resource):
proj_interval = int(editjob_dict['proj_interval'])
ecs_interval = int(editjob_dict['ecs_interval'])
rds_interval = int(editjob_dict['rds_interval'])
+ polardb_interval = int(editjob_dict['polardb_interval'])
+ mongodb_interval = int(editjob_dict['mongodb_interval'])
redis_interval = int(editjob_dict['redis_interval'])
logger.info(f'{editjob_dict}')
if editjob_dict['akskswitch']:
@@ -79,6 +88,8 @@ class Edit(Resource):
ecs_jobid = f'{vendor}/{account}/ecs/{region}'
rds_jobid = f'{vendor}/{account}/rds/{region}'
+ polardb_jobid = f'{vendor}/{account}/polardb/{region}'
+ mongodb_jobid = f'{vendor}/{account}/mongodb/{region}'
redis_jobid = f'{vendor}/{account}/redis/{region}'
if 'ecs' in restype:
isecs = [x for x in job_list if x['id'] == f'{vendor}/{account}/ecs/{region}']
@@ -132,6 +143,28 @@ class Edit(Resource):
except:
pass
+ if 'polardb' in restype:
+ ispolardb = [x for x in job_list if x['id'] == f'{vendor}/{account}/polardb/{region}']
+ if len(ispolardb) == 1:
+ if polardb_interval != ispolardb[0]['minutes']:
+ ispolardb[0]['minutes'] = polardb_interval
+ consul_kv.put_kv(f'ConsulManager/jobs/{polardb_jobid}',ispolardb[0])
+ modjob_interval(polardb_jobid,polardb_interval)
+ else:
+ job_func = f"__main__:{vendor}.polardb"
+ job_args = [account,region]
+ job_interval = polardb_interval
+ addjob(polardb_jobid, job_func, job_args, job_interval)
+ job_dict = {'id':polardb_jobid,'func':job_func,'args':job_args,'minutes':job_interval,
+ "trigger": "interval","replace_existing": True}
+ consul_kv.put_kv(f'ConsulManager/jobs/{polardb_jobid}',job_dict)
+ else:
+ try:
+ consul_kv.del_key(f'ConsulManager/jobs/{polardb_jobid}')
+ deljob(polardb_jobid)
+ except:
+ pass
+
if 'redis' in restype:
isredis = [x for x in job_list if x['id'] == f'{vendor}/{account}/redis/{region}']
if len(isredis) == 1:
@@ -154,5 +187,27 @@ class Edit(Resource):
except:
pass
+ if 'mongodb' in restype:
+ ismongodb = [x for x in job_list if x['id'] == f'{vendor}/{account}/mongodb/{region}']
+ if len(ismongodb) == 1:
+ if mongodb_interval != ismongodb[0]['minutes']:
+ ismongodb[0]['minutes'] = mongodb_interval
+ consul_kv.put_kv(f'ConsulManager/jobs/{mongodb_jobid}',ismongodb[0])
+ modjob_interval(mongodb_jobid,mongodb_interval)
+ else:
+ job_func = f"__main__:{vendor}.mongodb"
+ job_args = [account,region]
+ job_interval = mongodb_interval
+ addjob(mongodb_jobid, job_func, job_args, job_interval)
+ job_dict = {'id':mongodb_jobid,'func':job_func,'args':job_args,'minutes':job_interval,
+ "trigger": "interval","replace_existing": True}
+ consul_kv.put_kv(f'ConsulManager/jobs/{mongodb_jobid}',job_dict)
+ else:
+ try:
+ consul_kv.del_key(f'ConsulManager/jobs/{mongodb_jobid}')
+ deljob(mongodb_jobid)
+ except:
+ pass
+
return {'code': 20000, 'data': f'{vendor}/{account}/{region}:编辑成功!'}
api.add_resource(Edit, '/api/edit/')
diff --git a/flask-consul/views/mongodb.py b/flask-consul/views/mongodb.py
new file mode 100644
index 0000000..f486288
--- /dev/null
+++ b/flask-consul/views/mongodb.py
@@ -0,0 +1,93 @@
+from flask import Blueprint
+from flask_restful import reqparse, Resource, Api
+from flask_apscheduler import APScheduler
+import traceback
+#import sys
+#sys.path.append("..")
+from units import token_auth,consul_kv,gen_config,consul_svc
+from units.config_log import *
+blueprint = Blueprint('mongodb',__name__)
+api = Api(blueprint)
+
+parser = reqparse.RequestParser()
+parser.add_argument('job_id',type=str)
+parser.add_argument('services_dict',type=dict)
+parser.add_argument('cst_mongodb_dict',type=dict)
+parser.add_argument('iid',type=str)
+parser.add_argument('jobmongodb_name',type=str)
+parser.add_argument('checked',type=str)
+
+class Mongodb(Resource):
+ decorators = [token_auth.auth.login_required]
+ def get(self, stype):
+ job_id = parser.parse_args()['job_id']
+ if stype == 'jobmongodb':
+ jobmongodb = consul_kv.get_keys_list('ConsulManager/jobs')
+ jobmongodb_list = [i.split('/jobs/')[1] for i in jobmongodb if '/mongodb/' in i]
+ return {'code': 20000,'jobmongodb':jobmongodb_list}
+ elif stype == 'mongodb_services':
+ jobecs = consul_kv.get_keys_list('ConsulManager/jobs')
+ jobecs_list = [i.split('/jobs/')[1] for i in jobecs if '/mongodb/' in i]
+ services_list = []
+ for i in jobecs_list:
+ serivces = i.split("/")
+ services_list.append(f'{serivces[0]}_{serivces[1]}_{serivces[2]}')
+ return {'code': 20000,'services_list': sorted(set(services_list))}
+ elif stype == 'mongodbrules':
+ return gen_config.get_mongodbrules()
+ elif stype == 'cstmongodbconf':
+ args = parser.parse_args()
+ iid = args['iid']
+ cst_mongodb_config = consul_kv.get_value(f'ConsulManager/assets/sync_mongodb_custom/{iid}')
+ cst_mongodb_config.update({'iid': iid,'ipswitch': False,'portswitch': False})
+ if 'ip' in cst_mongodb_config and cst_mongodb_config['ip'] != '':
+ cst_mongodb_config['ipswitch'] = True
+ if 'port' in cst_mongodb_config and cst_mongodb_config['port'] != '':
+ cst_mongodb_config['portswitch'] = True
+ return {'code': 20000, 'cst_mongodb': cst_mongodb_config}
+ elif stype == 'cstmongodblist':
+ args = parser.parse_args()
+ jobmongodb_name = args['jobmongodb_name']
+ checked = args['checked']
+ cst_mongodb_dict = consul_kv.get_kv_dict('ConsulManager/assets/sync_mongodb_custom/')
+ cst_mongodb_keylist = [k.split('/')[-1] for k,v in cst_mongodb_dict.items() if v != {}]
+ mongodb_info = consul_kv.get_res_services(jobmongodb_name)
+ if checked == 'false':
+ return mongodb_info
+ else:
+ cst_mongodb_list = [i for i in mongodb_info['res_list'] if i['iid'] in cst_mongodb_keylist]
+ return {'code': 20000, 'res_list': cst_mongodb_list}
+
+ def post(self, stype):
+ if stype == 'mongodbpconfig':
+ args = parser.parse_args()
+ services_dict = args['services_dict']
+ return gen_config.mongodb_config(services_dict['jobmongodb_list'],services_dict['cm_exporter'],services_dict['services_list'],services_dict['exporter'])
+ elif stype == 'cstmongodb':
+ args = parser.parse_args()
+ cst_mongodb_dict = args['cst_mongodb_dict']
+ consul_mongodb_cst = {}
+ iid = cst_mongodb_dict['iid']
+ try:
+ sid_dict = consul_svc.get_sid(iid)['instance']
+ if cst_mongodb_dict['portswitch'] and cst_mongodb_dict['port'] != '':
+ consul_mongodb_cst['port'] = int(cst_mongodb_dict['port'])
+ sid_dict['Port'] = consul_mongodb_cst['port']
+ if cst_mongodb_dict['ipswitch'] and cst_mongodb_dict['ip'] != '':
+ consul_mongodb_cst['ip'] = cst_mongodb_dict['ip']
+ sid_dict['Address'] = consul_mongodb_cst['ip']
+ consul_kv.put_kv(f'ConsulManager/assets/sync_mongodb_custom/{iid}',consul_mongodb_cst)
+ del sid_dict['Weights']
+ del sid_dict['ContentHash']
+ del sid_dict['Datacenter']
+ sid_dict['name'] = sid_dict.pop('Service')
+ sid_dict['Meta']['instance'] = f"{sid_dict['Address']}:{sid_dict['Port']}"
+ sid_dict["check"] = { "tcp": sid_dict['Meta']['instance'],"interval": "60s" }
+ consul_svc.del_sid(iid)
+ consul_svc.add_sid(sid_dict)
+ return {'code': 20000, 'data': '自定义实例信息修改成功!'}
+ except Exception as e:
+ logger.error(f'{e}\n{traceback.format_exc()}')
+ return {'code': 50000, "data": '提交自定义实例信息格式错误!'}
+
+api.add_resource(Mongodb, '/api/mongodb/')
diff --git a/flask-consul/views/polardb.py b/flask-consul/views/polardb.py
new file mode 100644
index 0000000..e4c01a2
--- /dev/null
+++ b/flask-consul/views/polardb.py
@@ -0,0 +1,93 @@
+from flask import Blueprint
+from flask_restful import reqparse, Resource, Api
+from flask_apscheduler import APScheduler
+import traceback
+#import sys
+#sys.path.append("..")
+from units import token_auth,consul_kv,gen_config,consul_svc
+from units.config_log import *
+blueprint = Blueprint('polardb',__name__)
+api = Api(blueprint)
+
+parser = reqparse.RequestParser()
+parser.add_argument('job_id',type=str)
+parser.add_argument('services_dict',type=dict)
+parser.add_argument('cst_polardb_dict',type=dict)
+parser.add_argument('iid',type=str)
+parser.add_argument('jobpolardb_name',type=str)
+parser.add_argument('checked',type=str)
+
+class Polardb(Resource):
+ decorators = [token_auth.auth.login_required]
+ def get(self, stype):
+ job_id = parser.parse_args()['job_id']
+ if stype == 'jobpolardb':
+ jobpolardb = consul_kv.get_keys_list('ConsulManager/jobs')
+ jobpolardb_list = [i.split('/jobs/')[1] for i in jobpolardb if '/polardb/' in i]
+ return {'code': 20000,'jobpolardb':jobpolardb_list}
+ elif stype == 'polardb_services':
+ jobecs = consul_kv.get_keys_list('ConsulManager/jobs')
+ jobecs_list = [i.split('/jobs/')[1] for i in jobecs if '/polardb/' in i]
+ services_list = []
+ for i in jobecs_list:
+ serivces = i.split("/")
+ services_list.append(f'{serivces[0]}_{serivces[1]}_{serivces[2]}')
+ return {'code': 20000,'services_list': sorted(set(services_list))}
+ elif stype == 'polardbrules':
+ return gen_config.get_polardbrules()
+ elif stype == 'cstpolardbconf':
+ args = parser.parse_args()
+ iid = args['iid']
+ cst_polardb_config = consul_kv.get_value(f'ConsulManager/assets/sync_polardb_custom/{iid}')
+ cst_polardb_config.update({'iid': iid,'ipswitch': False,'portswitch': False})
+ if 'ip' in cst_polardb_config and cst_polardb_config['ip'] != '':
+ cst_polardb_config['ipswitch'] = True
+ if 'port' in cst_polardb_config and cst_polardb_config['port'] != '':
+ cst_polardb_config['portswitch'] = True
+ return {'code': 20000, 'cst_polardb': cst_polardb_config}
+ elif stype == 'cstpolardblist':
+ args = parser.parse_args()
+ jobpolardb_name = args['jobpolardb_name']
+ checked = args['checked']
+ cst_polardb_dict = consul_kv.get_kv_dict('ConsulManager/assets/sync_polardb_custom/')
+ cst_polardb_keylist = [k.split('/')[-1] for k,v in cst_polardb_dict.items() if v != {}]
+ polardb_info = consul_kv.get_res_services(jobpolardb_name)
+ if checked == 'false':
+ return polardb_info
+ else:
+ cst_polardb_list = [i for i in polardb_info['res_list'] if i['iid'] in cst_polardb_keylist]
+ return {'code': 20000, 'res_list': cst_polardb_list}
+
+ def post(self, stype):
+ if stype == 'polardbpconfig':
+ args = parser.parse_args()
+ services_dict = args['services_dict']
+ return gen_config.polardb_config(services_dict['jobpolardb_list'],services_dict['cm_exporter'],services_dict['services_list'],services_dict['exporter'])
+ elif stype == 'cstpolardb':
+ args = parser.parse_args()
+ cst_polardb_dict = args['cst_polardb_dict']
+ consul_polardb_cst = {}
+ iid = cst_polardb_dict['iid']
+ try:
+ sid_dict = consul_svc.get_sid(iid)['instance']
+ if cst_polardb_dict['portswitch'] and cst_polardb_dict['port'] != '':
+ consul_polardb_cst['port'] = int(cst_polardb_dict['port'])
+ sid_dict['Port'] = consul_polardb_cst['port']
+ if cst_polardb_dict['ipswitch'] and cst_polardb_dict['ip'] != '':
+ consul_polardb_cst['ip'] = cst_polardb_dict['ip']
+ sid_dict['Address'] = consul_polardb_cst['ip']
+ consul_kv.put_kv(f'ConsulManager/assets/sync_polardb_custom/{iid}',consul_polardb_cst)
+ del sid_dict['Weights']
+ del sid_dict['ContentHash']
+ del sid_dict['Datacenter']
+ sid_dict['name'] = sid_dict.pop('Service')
+ sid_dict['Meta']['instance'] = f"{sid_dict['Address']}:{sid_dict['Port']}"
+ sid_dict["check"] = { "tcp": sid_dict['Meta']['instance'],"interval": "60s" }
+ consul_svc.del_sid(iid)
+ consul_svc.add_sid(sid_dict)
+ return {'code': 20000, 'data': '自定义实例信息修改成功!'}
+ except Exception as e:
+ logger.error(f'{e}\n{traceback.format_exc()}')
+ return {'code': 50000, "data": '提交自定义实例信息格式错误!'}
+
+api.add_resource(Polardb, '/api/polardb/')
diff --git a/flask-consul/views/selfmongodb.py b/flask-consul/views/selfmongodb.py
new file mode 100644
index 0000000..55f8b5f
--- /dev/null
+++ b/flask-consul/views/selfmongodb.py
@@ -0,0 +1,80 @@
+import os
+from flask import Blueprint
+from flask_restful import reqparse, Resource, Api
+import sys,traceback
+sys.path.append("..")
+from units import token_auth,selfmongodb_manager
+from werkzeug.datastructures import FileStorage
+from units import upload
+from units.config_log import *
+blueprint = Blueprint('selfmongodb',__name__)
+api = Api(blueprint)
+
+parser = reqparse.RequestParser()
+parser.add_argument('vendor',type=str)
+parser.add_argument('account',type=str)
+parser.add_argument('region',type=str)
+parser.add_argument('group',type=str)
+parser.add_argument('name',type=str)
+parser.add_argument('ip',type=str)
+parser.add_argument('port',type=str)
+parser.add_argument('os',type=str)
+parser.add_argument('del_dict',type=dict)
+parser.add_argument('up_dict',type=dict)
+parser.add_argument('file',type=FileStorage, location="files", help="File is wrong.")
+
+class Upload(Resource):
+ @token_auth.auth.login_required
+ def post(self):
+ file = parser.parse_args().get("file")
+ try:
+ filename = file.filename
+ file_extension = os.path.splitext(filename)[1].lower()
+ try:
+ file_data = file.read()
+ if file_extension == '.xlsx':
+ return upload.read_execl(file_data,'selfmongodb')
+ elif file_extension == '.csv':
+ return upload.read_csv(file_data,'selfmongodb')
+ except Exception as e:
+ logger.error(f"【selfmongodb】文件后缀名错误,请导入xlsx或csv格式,{e}\n{traceback.format_exc()}")
+ return {"code": 50000, "data": f"文件后缀名错误,请导入xlsx或csv格式!"}
+ except Exception as e:
+ logger.error(f"【selfmongodb】导入失败,{e}\n{traceback.format_exc()}")
+ return {"code": 50000, "data": f"导入失败!"}
+
+class GetAllList(Resource):
+ @token_auth.auth.login_required
+ def get(self):
+ args = parser.parse_args()
+ return selfmongodb_manager.get_all_list(args['vendor'],args['account'],args['region'],args['group'])
+
+class SelfmongodbApi(Resource):
+ decorators = [token_auth.auth.login_required]
+ def get(self):
+ return selfmongodb_manager.get_service()
+ def post(self):
+ args = parser.parse_args()
+ logger.info(f'=======\n{args}')
+ return selfmongodb_manager.add_service(args['vendor'],args['account'],args['region'],
+ args['group'],args['name'],args['ip'],args['port'],args['os'])
+ def put(self):
+ args = parser.parse_args()
+ del_dict = args['del_dict']
+ up_dict = args['up_dict']
+ resp_del = selfmongodb_manager.del_service(del_dict['vendor'],del_dict['account'],
+ del_dict['region'],del_dict['group'],del_dict['name'])
+ resp_add = selfmongodb_manager.add_service(up_dict['vendor'],up_dict['account'],up_dict['region'],
+ up_dict['group'],up_dict['name'],up_dict['ip'],
+ up_dict['port'],up_dict['os'])
+ if resp_del["code"] == 20000 and resp_add["code"] == 20000:
+ return {"code": 20000, "data": f"更新成功!"}
+ else:
+ return {"code": 50000, "data": f"更新失败!"}
+ def delete(self):
+ args = parser.parse_args()
+ return selfmongodb_manager.del_service(args['vendor'],args['account'],args['region'],args['group'],args['name'])
+
+api.add_resource(GetAllList,'/api/selfmongodb/alllist')
+api.add_resource(SelfmongodbApi, '/api/selfmongodb/service')
+api.add_resource(Upload,'/api/selfmongodb/upload')
diff --git a/flask-consul/views/selfpolardb.py b/flask-consul/views/selfpolardb.py
new file mode 100644
index 0000000..957fe6c
--- /dev/null
+++ b/flask-consul/views/selfpolardb.py
@@ -0,0 +1,80 @@
+import os
+from flask import Blueprint
+from flask_restful import reqparse, Resource, Api
+import sys,traceback
+sys.path.append("..")
+from units import token_auth,selfpolardb_manager
+from werkzeug.datastructures import FileStorage
+from units import upload
+from units.config_log import *
+blueprint = Blueprint('selfpolardb',__name__)
+api = Api(blueprint)
+
+parser = reqparse.RequestParser()
+parser.add_argument('vendor',type=str)
+parser.add_argument('account',type=str)
+parser.add_argument('region',type=str)
+parser.add_argument('group',type=str)
+parser.add_argument('name',type=str)
+parser.add_argument('ip',type=str)
+parser.add_argument('port',type=str)
+parser.add_argument('os',type=str)
+parser.add_argument('del_dict',type=dict)
+parser.add_argument('up_dict',type=dict)
+parser.add_argument('file',type=FileStorage, location="files", help="File is wrong.")
+
+class Upload(Resource):
+ @token_auth.auth.login_required
+ def post(self):
+ file = parser.parse_args().get("file")
+ try:
+ filename = file.filename
+ file_extension = os.path.splitext(filename)[1].lower()
+ try:
+ file_data = file.read()
+ if file_extension == '.xlsx':
+ return upload.read_execl(file_data,'selfpolardb')
+ elif file_extension == '.csv':
+ return upload.read_csv(file_data,'selfpolardb')
+ except Exception as e:
+ logger.error(f"【selfpolardb】文件后缀名错误,请导入xlsx或csv格式,{e}\n{traceback.format_exc()}")
+ return {"code": 50000, "data": f"文件后缀名错误,请导入xlsx或csv格式!"}
+ except Exception as e:
+ logger.error(f"【selfpolardb】导入失败,{e}\n{traceback.format_exc()}")
+ return {"code": 50000, "data": f"导入失败!"}
+
+class GetAllList(Resource):
+ @token_auth.auth.login_required
+ def get(self):
+ args = parser.parse_args()
+ return selfpolardb_manager.get_all_list(args['vendor'],args['account'],args['region'],args['group'])
+
+class SelfpolardbApi(Resource):
+ decorators = [token_auth.auth.login_required]
+ def get(self):
+ return selfpolardb_manager.get_service()
+ def post(self):
+ args = parser.parse_args()
+ logger.info(f'=======\n{args}')
+ return selfpolardb_manager.add_service(args['vendor'],args['account'],args['region'],
+ args['group'],args['name'],args['ip'],args['port'],args['os'])
+ def put(self):
+ args = parser.parse_args()
+ del_dict = args['del_dict']
+ up_dict = args['up_dict']
+ resp_del = selfpolardb_manager.del_service(del_dict['vendor'],del_dict['account'],
+ del_dict['region'],del_dict['group'],del_dict['name'])
+ resp_add = selfpolardb_manager.add_service(up_dict['vendor'],up_dict['account'],up_dict['region'],
+ up_dict['group'],up_dict['name'],up_dict['ip'],
+ up_dict['port'],up_dict['os'])
+ if resp_del["code"] == 20000 and resp_add["code"] == 20000:
+ return {"code": 20000, "data": f"更新成功!"}
+ else:
+ return {"code": 50000, "data": f"更新失败!"}
+ def delete(self):
+ args = parser.parse_args()
+ return selfpolardb_manager.del_service(args['vendor'],args['account'],args['region'],args['group'],args['name'])
+
+api.add_resource(GetAllList,'/api/selfpolardb/alllist')
+api.add_resource(SelfpolardbApi, '/api/selfpolardb/service')
+api.add_resource(Upload,'/api/selfpolardb/upload')
diff --git a/tools/del_consul_svc.sh b/tools/del_consul_svc.sh
new file mode 100644
index 0000000..c986a61
--- /dev/null
+++ b/tools/del_consul_svc.sh
@@ -0,0 +1,12 @@
+# Assuming localhost, substitute with actual Consul server address.
+export CONSUL_HTTP_TOKEN=xxxxxx
+CONSUL_HOST="http://172.26.32.83:8500"
+
+# Get all instances of the service
+SERVICE_INSTANCES=$(curl -s -H "X-Consul-Token: $CONSUL_HTTP_TOKEN" "${CONSUL_HOST}/v1/catalog/service/alicloud_dreame_devops_rds")
+
+# Extract the service IDs and deregister each
+echo "${SERVICE_INSTANCES}" | jq -r '.[].ServiceID' | while read SERVICE_ID; do
+ echo "Deregistering service instance: $SERVICE_ID"
+ curl -s -X PUT -H "X-Consul-Token: $CONSUL_HTTP_TOKEN" "${CONSUL_HOST}/v1/agent/service/deregister/${SERVICE_ID}"
+done
\ No newline at end of file
diff --git a/vue-consul/src/views/node-exporter/jobs.vue b/vue-consul/src/views/node-exporter/jobs.vue
index f80dea7..7ee9fe8 100644
--- a/vue-consul/src/views/node-exporter/jobs.vue
+++ b/vue-consul/src/views/node-exporter/jobs.vue
@@ -144,6 +144,8 @@
ECS
MySQL
REDIS
+ POLARDB
+ MONGODB
@@ -170,6 +172,12 @@
+
+
+
+
+
+