From b049ad74953cdafd750d8ecfaac2d72f86eab0f2 Mon Sep 17 00:00:00 2001 From: "StarsL.cn" Date: Mon, 25 Jul 2022 14:20:25 +0800 Subject: [PATCH] =?UTF-8?q?jumpserver=E5=90=8C=E6=AD=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=AE=8C=E6=88=90=EF=BC=8Cblackbox=E7=9B=91=E6=8E=A7=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ECS主机监控.md | 2 +- flask-consul/Dockerfile | 4 +- flask-consul/manager.py | 2 +- flask-consul/units/blackbox_manager.py | 16 ++- flask-consul/units/jms/sync_jms.py | 4 +- flask-consul/views/jms.py | 51 ++++++++- vue-consul/src/api/jms.js | 15 ++- vue-consul/src/views/blackbox/index.vue | 27 ++--- vue-consul/src/views/jms/index.vue | 131 ++++++++++++++++++------ 9 files changed, 193 insertions(+), 59 deletions(-) diff --git a/docs/ECS主机监控.md b/docs/ECS主机监控.md index 1e0a921..172b9b9 100644 --- a/docs/ECS主机监控.md +++ b/docs/ECS主机监控.md @@ -49,7 +49,7 @@ groups: #新rule文件需要加这行开头,追加旧的rule文件则不需 interval: 1m rules: - record: cpu:usage:rate1m - expr: (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance,vendor,account,group,name)) * 100 + expr: (1 - avg(irate(node_cpu_seconds_total{mode="idle"}[3m])) by (instance,vendor,account,group,name)) * 100 - record: mem:usage:rate1m expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 ``` diff --git a/flask-consul/Dockerfile b/flask-consul/Dockerfile index fb92f93..7227238 100644 --- a/flask-consul/Dockerfile +++ b/flask-consul/Dockerfile @@ -4,7 +4,7 @@ WORKDIR /flask RUN sed -i 's/dl-cdn.alpinelinux.org/repo.huaweicloud.com/g' /etc/apk/repositories \ && apk add --no-cache gcc libc-dev libffi-dev \ && rm -rf /var/cache/apk/* \ -&& pip3 install --upgrade pip -i https://repo.huaweicloud.com/repository/pypi/simple \ -&& pip3 install -r requirements.txt -i https://repo.huaweicloud.com/repository/pypi/simple +&& pip3 install --upgrade pip -i https://repo.huaweicloud.com/repository/pypi/simple --no-cache-dir\ +&& pip3 install -r requirements.txt -i https://repo.huaweicloud.com/repository/pypi/simple --no-cache-dir EXPOSE 2026 CMD ["python3","./manager.py"] diff --git a/flask-consul/manager.py b/flask-consul/manager.py index 96d5d8e..b34f2b1 100755 --- a/flask-consul/manager.py +++ b/flask-consul/manager.py @@ -38,7 +38,7 @@ init_jobs = { **ecs_jobs, **avd_jobs, **exp_jobs, **jms_jobs } if init_jobs is not None: for k,v in init_jobs.items(): - print(f'【初始化任务】{k}:\n {v}', flush=True) + print(f"【初始化任务】{k}:{v['args']},{v['minutes']}m", flush=True) Config.JOBS = init_jobs.values() app.config.from_object(Config()) diff --git a/flask-consul/units/blackbox_manager.py b/flask-consul/units/blackbox_manager.py index cee1bcd..0b93e9c 100644 --- a/flask-consul/units/blackbox_manager.py +++ b/flask-consul/units/blackbox_manager.py @@ -1,10 +1,8 @@ -import requests,json -import sys -sys.path.append("..") +import requests,json,consul_kv from config import consul_token,consul_url headers = {'X-Consul-Token': consul_token} - +init_module_list = ['http_2xx','http_4xx','tcp_connect','icmp','http200igssl','httpNoRedirect4ssl','http_5xx','http_post_2xx','ssh_banner'] def get_all_list(module,company,project,env): module = f'and Meta.module=="{module}"' if module != '' else f'and Meta.module != ""' company = f'and Meta.company=="{company}"' if company != '' else f'and Meta.company != ""' @@ -15,10 +13,14 @@ def get_all_list(module,company,project,env): if response.status_code == 200: info = response.json() all_list = [i['Meta'] for i in info.values()] - module_list = sorted(list(set([i['module'] for i in all_list]))) + module_list = consul_kv.get_value('ConsulManager/record/blackbox/module_list')['module_list'] company_list = sorted(list(set([i['company'] for i in all_list]))) project_list = sorted(list(set([i['project'] for i in all_list]))) env_list = sorted(list(set([i['env'] for i in all_list]))) + + init_m_list = [x for x in init_module_list if x not in module_list] + module_list = module_list + ['---'] + init_m_list + return {'code': 20000,'all_list':all_list,'module_list':module_list, 'company_list':company_list,'project_list':project_list,'env_list':env_list} else: @@ -33,6 +35,10 @@ def get_service(): company_list = sorted(list(set([i['company'] for i in all_list]))) project_list = sorted(list(set([i['project'] for i in all_list]))) env_list = sorted(list(set([i['env'] for i in all_list]))) + consul_kv.put_kv('ConsulManager/record/blackbox/module_list',{'module_list':module_list}) + init_m_list = [x for x in init_module_list if x not in module_list] + module_list = module_list + ['------'] + init_m_list + return {'code': 20000,'all_list':all_list,'module_list':module_list, 'company_list':company_list,'project_list':project_list,'env_list':env_list} else: diff --git a/flask-consul/units/jms/sync_jms.py b/flask-consul/units/jms/sync_jms.py index 02b785b..416f568 100755 --- a/flask-consul/units/jms/sync_jms.py +++ b/flask-consul/units/jms/sync_jms.py @@ -50,7 +50,7 @@ def update_jms_ecs(jms_url,headers,new_node_dict,node_id,cloud,account,ecs_info, admin_user = custom_info[ostype][1] payload = { "ip": ip, - "hostname": "cm_" + iname, + "hostname": iname, "protocols": protocols, "platform": platform, "is_active": True, @@ -60,7 +60,7 @@ def update_jms_ecs(jms_url,headers,new_node_dict,node_id,cloud,account,ecs_info, "comment": comment } if ip in jms_ecs_dict.keys(): - if jms_ecs_dict[ip]['name'] != "cm_" + iname or jms_ecs_dict[ip]['node'].split('/')[-1] != v['ent']: + if jms_ecs_dict[ip]['name'] != iname or jms_ecs_dict[ip]['node'].split('/')[-1] != v['ent']: response = requests.request("PUT", f"{ecs_url}{jms_ecs_dict[ip]['id']}/", headers=headers, data = json.dumps(payload)) print(' 【JMS】update:主机名:',response.json()['hostname'],response.status_code,flush=True) else: diff --git a/flask-consul/views/jms.py b/flask-consul/views/jms.py index 6bed764..7e222a9 100644 --- a/flask-consul/views/jms.py +++ b/flask-consul/views/jms.py @@ -11,7 +11,8 @@ api = Api(blueprint) parser = reqparse.RequestParser() parser.add_argument('query_dict',type=str) parser.add_argument('jms_config',type=dict) -parser.add_argument('isnotify_dict',type=dict) +parser.add_argument('jms_sync',type=dict) +parser.add_argument('switch_dict',type=dict) class Jms(Resource): decorators = [token_auth.auth.login_required] @@ -74,15 +75,17 @@ class Jms(Resource): if stype == 'config': ecs_info = consul_kv.get_value('ConsulManager/jms/ecs_info') jms_info = consul_kv.get_value('ConsulManager/jms/jms_info') + custom_ecs_info = consul_kv.get_value('ConsulManager/jms/custom_ecs_info') if ecs_info != {} and jms_info != {}: linuxport = ecs_info['linux'][0][0].split('/')[-1] linuxuid = ecs_info['linux'][-1] winport = ecs_info['windows'][0][0].split('/')[-1] winuid = ecs_info['windows'][-1] token = myaes.decrypt(jms_info['token']) + custom_ecs_json = json.dumps(custom_ecs_info, indent=8) if custom_ecs_info != {} else '' jms_config = {'url': jms_info['url'], 'token': token, 'linuxport': linuxport, 'linuxuid': linuxuid, - 'winport': winport, 'winuid': winuid} + 'winport': winport, 'winuid': winuid, 'custom_ecs_info':custom_ecs_json} else: jms_config = {} return {'code': 20000, 'jms_config': jms_config} @@ -96,5 +99,49 @@ class Jms(Resource): ecs_info = {"linux": [[f"ssh/{jms_config['linuxport']}"],jms_config['linuxuid']], "windows": [[f"rdp/{jms_config['winport']}"],jms_config['winuid']]} consul_kv.put_kv('ConsulManager/jms/ecs_info', ecs_info) + custom_ecs_info = jms_config['custom_ecs_info'] + if custom_ecs_info != '': + try: + custom_ecs_dict = json.loads(custom_ecs_info) + consul_kv.put_kv('ConsulManager/jms/custom_ecs_info',custom_ecs_dict) + except Exception as e: + print(e,flush=True) + return {'code': 50000, 'data': 'Json解析错误,请检查!'} + else: + consul_kv.put_kv('ConsulManager/jms/custom_ecs_info',{}) return {'code': 20000, 'data': '配置完成'} + if stype == 'switch': + args = parser.parse_args() + switch_dict = args['switch_dict'] + vendor = {v : k for k, v in vendors.items()}[switch_dict['vendor']] + account = switch_dict['account'] + sync = switch_dict['sync'] + if sync: + node = consul_kv.get_value(f'ConsulManager/jms/{vendor}/{account}/node_id') + nodeid = node.get('node_id','') + interval = node.get('interval',3) + return {'code': 20000, 'interval': interval, 'nodeid': nodeid} + else: + deljob(f'{vendor}/{account}/jms') + consul_kv.del_key(f'ConsulManager/jms/jobs/{vendor}/{account}') + return {'code': 20000, 'data': f'【{vendor}/{account}】同步功能关闭!'} + if stype == 'sync': + args = parser.parse_args() + jms_sync = args['jms_sync'] + vendor = {v : k for k, v in vendors.items()}[jms_sync['vendor']] + account = jms_sync['account'] + nodeid = jms_sync['nodeid'] + interval = int(jms_sync['interval']) + consul_kv.put_kv(f'ConsulManager/jms/{vendor}/{account}/node_id',{'node_id':nodeid,'interval':interval}) + + jms_job_id = f'{vendor}/{account}/jms' + jms_job_func = "__main__:sync_jms.run" + jms_job_args = [vendor,account] + + addjob(jms_job_id,jms_job_func,jms_job_args,interval) + runjob(jms_job_id) + jms_job_dict = {'id':jms_job_id,'func':jms_job_func,'args':jms_job_args,'minutes':interval, + 'trigger': 'interval','replace_existing': True} + consul_kv.put_kv(f'ConsulManager/jms/jobs/{vendor}/{account}',jms_job_dict) + return {'code': 20000, 'data': f'【{vendor}/{account}】同步JumpServer功能开启!首次同步完成'} api.add_resource(Jms, '/api/jms/') diff --git a/vue-consul/src/api/jms.js b/vue-consul/src/api/jms.js index 9dfe5fa..a5970d3 100644 --- a/vue-consul/src/api/jms.js +++ b/vue-consul/src/api/jms.js @@ -22,10 +22,19 @@ export function postJmsConfig(jms_config) { }) } -export function postExpIsnotify(isnotify_dict) { +export function postJmsSwitch(switch_dict) { return request({ - url: '/api/exp/isnotify', + url: '/api/jms/switch', method: 'post', - data: { isnotify_dict } + data: { switch_dict } + }) +} + +export function postJmsSync(jms_sync) { + return request({ + url: '/api/jms/sync', + method: 'post', + timeout: 600 * 1000, + data: { jms_sync } }) } diff --git a/vue-consul/src/views/blackbox/index.vue b/vue-consul/src/views/blackbox/index.vue index bdeaf4a..95179a1 100644 --- a/vue-consul/src/views/blackbox/index.vue +++ b/vue-consul/src/views/blackbox/index.vue @@ -1,6 +1,6 @@ - + @@ -121,30 +121,30 @@ - + - + - + - + - 上面5个字段组合后需唯一,重复会覆盖已有监控项! +
以上5个字段组合后需唯一,重复会覆盖已有监控项!
- 实例 - + URL + - +