diff --git a/api/api.py b/api/api.py index 23722ce0..b1373f55 100644 --- a/api/api.py +++ b/api/api.py @@ -205,7 +205,6 @@ def haproxy_log(haproxy_id): def get_section(haproxy_id): if not check_login(required_service=1): return dict(error=_error_auth) - print(str(request.headers.get('section-name'))) return api_funct.get_section(haproxy_id) diff --git a/app/create_db.py b/app/create_db.py index c87900e0..2ac5351d 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -733,9 +733,29 @@ def update_db_v_7_2_0_1(): print("Updating... DB has been updated to version 7.2.0-1") + +def update_db_v_7_2_3(): + try: + if mysql_enable: + migrate( + migrator.add_column('checker_setting', 'mm_id', IntegerField(default=0)), + migrator.add_column('smon', 'mm_channel_id', IntegerField(default=0)), + ) + else: + migrate( + migrator.add_column('checker_setting', 'mm_id', IntegerField(constraints=[SQL('DEFAULT 0')])), + migrator.add_column('smon', 'mm_channel_id', IntegerField(constraints=[SQL('DEFAULT 0')])), + ) + except Exception as e: + if e.args[0] == 'duplicate column name: mm_id' or str(e) == '(1060, "Duplicate column name \'mm_id\'")': + print('Updating... DB has been updated to version 7.2.3') + else: + print("An error occurred:", e) + + def update_ver(): try: - Version.update(version='7.2.2.0').execute() + Version.update(version='7.2.3.0').execute() except Exception: print('Cannot update version') @@ -771,6 +791,7 @@ def update_all(): update_db_v_7_1_2_1() update_db_v_7_2_0() update_db_v_7_2_0_1() + update_db_v_7_2_3() update_ver() diff --git a/app/modules/db/channel.py b/app/modules/db/channel.py index 450a280e..f9db813e 100644 --- a/app/modules/db/channel.py +++ b/app/modules/db/channel.py @@ -1,4 +1,4 @@ -from app.modules.db.db_model import Telegram, Slack, PD, Server +from app.modules.db.db_model import Telegram, Slack, PD, Server, MM from app.modules.db.common import out_error @@ -51,6 +51,13 @@ def get_user_pd_by_group(group): out_error(e) +def get_user_mm_by_group(group): + try: + return MM.select().where(MM.groups == group).execute() + except Exception as e: + out_error(e) + + def get_pd_by_ip(ip): query = PD.select().join(Server, on=(Server.groups == PD.groups)).where(Server.ip == ip) try: @@ -201,3 +208,65 @@ def update_pd(token, chanel, group, pd_id): return False else: return True + + +def insert_new_mm(token, chanel, group): + try: + MM.insert(token=token, chanel_name=chanel, groups=group).execute() + except Exception as e: + out_error(e) + return False + else: + return True + + +def update_mm(token, chanel, group, mm_id): + try: + MM.update(token=token, chanel_name=chanel, groups=group).where(MM.id == mm_id).execute() + except Exception as e: + out_error(e) + return False + else: + return True + + +def delete_mm(pd_id): + try: + MM.delete().where(MM.id == pd_id).execute() + except Exception as e: + out_error(e) + return False + else: + return True + + +def select_mm(**kwargs): + if kwargs.get('token'): + query = MM.select().where(MM.token == kwargs.get('token')) + elif kwargs.get('id'): + query = MM.select().where(MM.id == kwargs.get('id')) + else: + query = MM.select() + try: + query_res = query.execute() + except Exception as e: + out_error(e) + else: + return query_res + + +def get_mm_by_ip(ip): + query = MM.select().join(Server, on=(Server.groups == MM.groups)).where(Server.ip == ip) + try: + query_res = query.execute() + except Exception as e: + out_error(e) + else: + return query_res + + +def get_mm_by_id(pd_id): + try: + return MM.select().where(MM.id == pd_id).execute() + except Exception as e: + out_error(e) diff --git a/app/modules/db/checker.py b/app/modules/db/checker.py index bb03a9e3..0c1893ad 100644 --- a/app/modules/db/checker.py +++ b/app/modules/db/checker.py @@ -41,11 +41,11 @@ def insert_new_checker_setting_for_server(server_ip: str) -> None: def update_haproxy_checker_settings( - email: int, telegram_id: int, slack_id: int, pd_id: int, service_alert: int, backend_alert: int, + email: int, telegram_id: int, slack_id: int, pd_id: int, mm_id: int, service_alert: int, backend_alert: int, maxconn_alert: int, setting_id: int ) -> bool: settings_update = CheckerSetting.update( - email=email, telegram_id=telegram_id, slack_id=slack_id, pd_id=pd_id, service_alert=service_alert, + email=email, telegram_id=telegram_id, slack_id=slack_id, pd_id=pd_id, mm_id=mm_id, service_alert=service_alert, backend_alert=backend_alert, maxconn_alert=maxconn_alert ).where(CheckerSetting.id == setting_id) try: @@ -57,11 +57,11 @@ def update_haproxy_checker_settings( def update_keepalived_checker_settings( - email: int, telegram_id: int, slack_id: int, pd_id: int, service_alert: int, backend_alert: int, + email: int, telegram_id: int, slack_id: int, pd_id: int, mm_id: int, service_alert: int, backend_alert: int, setting_id: int ) -> bool: settings_update = CheckerSetting.update( - email=email, telegram_id=telegram_id, slack_id=slack_id, pd_id=pd_id, + email=email, telegram_id=telegram_id, slack_id=slack_id, pd_id=pd_id, mm_id=mm_id, service_alert=service_alert, backend_alert=backend_alert ).where(CheckerSetting.id == setting_id) try: @@ -73,10 +73,10 @@ def update_keepalived_checker_settings( def update_service_checker_settings( - email: int, telegram_id: int, slack_id: int, pd_id: int, service_alert: int, setting_id: int + email: int, telegram_id: int, slack_id: int, pd_id: int, mm_id: int, service_alert: int, setting_id: int ) -> bool: settings_update = CheckerSetting.update( - email=email, telegram_id=telegram_id, slack_id=slack_id, pd_id=pd_id, service_alert=service_alert + email=email, telegram_id=telegram_id, slack_id=slack_id, pd_id=pd_id, mm_id=mm_id, service_alert=service_alert ).where(CheckerSetting.id == setting_id) try: settings_update.execute() diff --git a/app/modules/db/db_model.py b/app/modules/db/db_model.py index e61af931..2e5c43a0 100644 --- a/app/modules/db/db_model.py +++ b/app/modules/db/db_model.py @@ -123,6 +123,16 @@ class Slack(BaseModel): table_name = 'slack' +class MM(BaseModel): + id = AutoField() + token = CharField() + chanel_name = CharField() + groups = IntegerField() + + class Meta: + table_name = 'mattermost' + + class PD(BaseModel): id = AutoField() token = CharField() @@ -406,6 +416,7 @@ class SMON(BaseModel): ssl_expire_date = CharField(null=True) pd_channel_id = IntegerField(null=True) check_type = CharField(constraints=[SQL('DEFAULT "tcp"')]) + mm_channel_id = IntegerField(null=True) class Meta: table_name = 'smon' @@ -540,6 +551,7 @@ class CheckerSetting(BaseModel): backend_alert = IntegerField(constraints=[SQL('DEFAULT 1')]) maxconn_alert = IntegerField(constraints=[SQL('DEFAULT 1')]) pd_id = IntegerField(constraints=[SQL('DEFAULT 0')]) + mm_id = IntegerField(constraints=[SQL('DEFAULT 0')]) class Meta: table_name = 'checker_setting' @@ -763,5 +775,5 @@ def create_tables(): NginxMetrics, SystemInfo, Services, UserName, GitSetting, CheckerSetting, ApacheMetrics, WafNginx, ServiceStatus, KeepaliveRestart, PD, SmonHistory, SmonAgent, SmonTcpCheck, SmonHttpCheck, SmonPingCheck, SmonDnsCheck, S3Backup, RoxyTool, SmonStatusPage, SmonStatusPageCheck, HaCluster, HaClusterSlave, HaClusterVip, HaClusterVirt, HaClusterService, - HaClusterRouter] + HaClusterRouter, MM] ) diff --git a/app/modules/db/smon.py b/app/modules/db/smon.py index b9469895..46a2367b 100644 --- a/app/modules/db/smon.py +++ b/app/modules/db/smon.py @@ -212,11 +212,11 @@ def select_one_smon(smon_id: int, check_id: int) -> tuple: return query_res -def insert_smon(name, enable, group, desc, telegram, slack, pd, user_group, check_type): +def insert_smon(name, enable, group, desc, telegram, slack, pd, mm, user_group, check_type): try: last_id = SMON.insert( name=name, en=enable, desc=desc, group=group, telegram_channel_id=telegram, slack_channel_id=slack, - pd_channel_id=pd, user_group=user_group, status='3', check_type=check_type + pd_channel_id=pd, mm_channel_id=mm, user_group=user_group, status='3', check_type=check_type ).execute() except Exception as e: out_error(e) @@ -512,9 +512,9 @@ def select_smon_history(smon_id: int) -> object: return query_res -def update_smon(smon_id, name, telegram, slack, pd, group, desc, en): +def update_smon(smon_id, name, telegram, slack, pd, mm, group, desc, en): query = (SMON.update( - name=name, telegram_channel_id=telegram, slack_channel_id=slack, pd_channel_id=pd, group=group, desc=desc, en=en + name=name, telegram_channel_id=telegram, slack_channel_id=slack, pd_channel_id=pd, mm_channel_id=mm, group=group, desc=desc, en=en ).where(SMON.id == smon_id)) try: query.execute() diff --git a/app/modules/tools/alerting.py b/app/modules/tools/alerting.py index a7ee6ef2..c48891ab 100644 --- a/app/modules/tools/alerting.py +++ b/app/modules/tools/alerting.py @@ -1,6 +1,7 @@ import json import pika +import requests from flask import render_template, request, abort import app.modules.db.sql as sql @@ -69,6 +70,10 @@ def alert_routing( pd_send_mess(mes, level, server_ip, service_id, alert_type, channel_id=setting.pd_id) except Exception as e: roxywi_common.logging('Roxy-WI server', f'error: unable to send message to PagerDuty: {e}', roxywi=1) + try: + mm_send_mess(mes, level, server_ip, service_id, alert_type, channel_id=setting.mm_id) + except Exception as e: + roxywi_common.logging('Roxy-WI server', f'error: unable to send message to Mattermost: {e}', roxywi=1) if setting.email: send_email_to_server_group(subject, mes, level, group_id) @@ -86,6 +91,10 @@ def alert_routing( pd_send_mess(mes, level, server_ip, service_id, alert_type, channel_id=setting.pd_id) except Exception as e: roxywi_common.logging('Roxy-WI server', f'error: unable to send message to PagerDuty: {e}', roxywi=1) + try: + mm_send_mess(mes, level, server_ip, service_id, alert_type, channel_id=setting.mm_id) + except Exception as e: + roxywi_common.logging('Roxy-WI server', f'error: unable to send message to Mattermost: {e}', roxywi=1) if setting.email: send_email_to_server_group(subject, mes, level, group_id) @@ -103,6 +112,10 @@ def alert_routing( pd_send_mess(mes, level, server_ip, service_id, alert_type, channel_id=setting.pd_id) except Exception as e: roxywi_common.logging('Roxy-WI server', f'error: unable to send message to PagerDuty: {e}', roxywi=1) + try: + mm_send_mess(mes, level, server_ip, service_id, alert_type, channel_id=setting.mm_id) + except Exception as e: + roxywi_common.logging('Roxy-WI server', f'error: unable to send message to Mattermost: {e}', roxywi=1) if setting.email: send_email_to_server_group(subject, mes, level, group_id) @@ -263,6 +276,74 @@ def pd_send_mess(mess, level, server_ip=None, service_id=None, alert_type=None, raise Exception(f'error: {e}') +def mm_send_mess(mess, level, server_ip=None, service_id=None, alert_type=None, **kwargs): + print('send mess to mm', kwargs.get('channel_id')) + token = '' + + if kwargs.get('channel_id') == 0: + return + + if kwargs.get('channel_id'): + try: + mms = channel_sql.get_mm_by_id(kwargs.get('channel_id')) + except Exception as e: + print(e) + else: + try: + mms = channel_sql.get_mm_by_ip(kwargs.get('ip')) + except Exception as e: + print(e) + + for pd in mms: + token = pd.token + channel = pd.chanel_name + + # try: + # proxy = sql.get_setting('proxy') + # session = pdpyras.EventsAPISession(token) + # dedup_key = f'{server_ip} {service_id} {alert_type}' + # except Exception as e: + # roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) + # raise Exception(f'error: {e}') + # + # if proxy is not None and proxy != '' and proxy != 'None': + # proxies = dict(https=proxy, http=proxy) + # session.proxies.update(proxies) + + headers = {'Content-Type': 'application/json'} + if level == "info": + color = "51A347" + else: + color = "c20707" + attach = { + "fallback": f"{alert_type}", + "color": f"#{color}", + "text": f"{mess}", + "author_name": "Roxy-WI", + "title": f"{level} alert", + "fields": [ + { + "short": "true", + "title": "Level", + "value": f"{level}", + }, + { + "short": "true", + "title": "Server", + "value": f"{server_ip}", + }, + ] + } + attach = str(json.dumps(attach)) + values = f'{{"channel": "{channel}", "username": "Roxy-WI", "attachments": [{attach}]}}' + try: + requests.post(token, headers=headers, data=str(values)) + return 'ok' + except Exception as e: + roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) + raise Exception(f'error: {e}') + + def check_rabbit_alert() -> str: try: user_group_id = request.cookies.get('group') @@ -331,12 +412,24 @@ def add_pd_channel(token: str, channel: str, group: str, page: str) -> str: else: if channel_sql.insert_new_pd(token, channel, group): lang = roxywi_common.get_user_lang_for_flask() - channels = channel_sql.select_slack(token=token) + channels = channel_sql.select_pd(token=token) groups = group_sql.select_groups() roxywi_common.logging('Roxy-WI server', f'A new PagerDuty channel {channel} has been created ', roxywi=1, login=1) return render_template('ajax/new_receiver.html', groups=groups, lang=lang, channels=channels, page=page, receiver='pd') +def add_mm_channel(token: str, channel: str, group: str, page: str) -> str: + if token is None or channel is None or group is None: + return error_mess + else: + if channel_sql.insert_new_mm(token, channel, group): + lang = roxywi_common.get_user_lang_for_flask() + channels = channel_sql.select_mm(token=token) + groups = group_sql.select_groups() + roxywi_common.logging('Roxy-WI server', f'A new Mattermost channel {channel} has been created ', roxywi=1, login=1) + return render_template('ajax/new_receiver.html', groups=groups, lang=lang, channels=channels, page=page, receiver='mm') + + def delete_telegram_channel(channel_id) -> str: telegram = channel_sql.select_telegram(id=channel_id) channel_name = '' @@ -367,6 +460,16 @@ def delete_pd_channel(channel_id) -> str: return 'ok' +def delete_mm_channel(channel_id) -> str: + pd = channel_sql.select_mm(id=channel_id) + channel_name = '' + for t in pd: + channel_name = t.chanel_name + if channel_sql.delete_mm(channel_id): + roxywi_common.logging('Roxy-WI server', f'The Mattermost channel {channel_name} has been deleted ', roxywi=1, login=1) + return 'ok' + + def update_telegram(token: str, channel: str, group: str, user_id: int) -> str: channel_sql.update_telegram(token, channel, group, user_id) roxywi_common.logging('group ' + group, f'The Telegram token has been updated for channel: {channel}', roxywi=1, login=1) @@ -385,11 +488,18 @@ def update_pd(token: str, channel: str, group: str, user_id: int) -> str: return 'ok' +def update_mm(token: str, channel: str, group: str, user_id: int) -> str: + channel_sql.update_mm(token, channel, group, user_id) + roxywi_common.logging(f'group {group}', f'The Mattermost token has been updated for channel: {channel}', roxywi=1, login=1) + return 'ok' + + def delete_receiver_channel(channel_id: int, receiver_name: str) -> None: delete_functions = { "telegram": delete_telegram_channel, "slack": delete_slack_channel, "pd": delete_pd_channel, + "mm": delete_mm_channel, } return delete_functions[receiver_name](channel_id) @@ -399,6 +509,7 @@ def add_receiver_channel(receiver_name: str, token: str, channel: str, group: id "telegram": add_telegram_channel, "slack": add_slack_channel, "pd": add_pd_channel, + "mm": add_mm_channel, } try: @@ -412,6 +523,7 @@ def update_receiver_channel(receiver_name: str, token: str, channel: str, group: "telegram": update_telegram, "slack": update_slack, "pd": update_pd, + "mm": update_mm, } return update_functions[receiver_name](token, channel, group, user_id) @@ -421,6 +533,7 @@ def check_receiver(channel_id: int, receiver_name: str) -> str: "telegram": telegram_send_mess, "slack": slack_send_mess, "pd": pd_send_mess, + "mm": mm_send_mess, } mess = 'Test message from Roxy-WI' @@ -457,6 +570,7 @@ def load_channels(): user_group = roxywi_common.get_user_group(id=1) kwargs.setdefault('telegrams', channel_sql.get_user_telegram_by_group(user_group)) kwargs.setdefault('pds', channel_sql.get_user_pd_by_group(user_group)) + kwargs.setdefault('mms', channel_sql.get_user_mm_by_group(user_group)) kwargs.setdefault('groups', group_sql.select_groups()) kwargs.setdefault('slacks', channel_sql.get_user_slack_by_group(user_group)) kwargs.setdefault('user_subscription', user_subscription) diff --git a/app/modules/tools/checker.py b/app/modules/tools/checker.py index 86830df8..e9c6dd84 100644 --- a/app/modules/tools/checker.py +++ b/app/modules/tools/checker.py @@ -30,6 +30,7 @@ def load_checker() -> str: kwargs.setdefault('services', tools_common.get_services_status()) kwargs.setdefault('telegrams', channel_sql.get_user_telegram_by_group(user_group)) kwargs.setdefault('pds', channel_sql.get_user_pd_by_group(user_group)) + kwargs.setdefault('mms', channel_sql.get_user_mm_by_group(user_group)) kwargs.setdefault('groups', group_sql.select_groups()) kwargs.setdefault('slacks', channel_sql.get_user_slack_by_group(user_group)) kwargs.setdefault('haproxy_servers', roxywi_common.get_dick_permit(haproxy=1, only_group=1)) @@ -47,24 +48,24 @@ def load_checker() -> str: return render_template('ajax/load_checker.html', **kwargs) -def update_haproxy_settings(setting_id, email, service_alert, backend_alert, maxconn_alert, telegram_id, slack_id, pd_id) -> str: - if checker_sql.update_haproxy_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, backend_alert, +def update_haproxy_settings(setting_id, email, service_alert, backend_alert, maxconn_alert, telegram_id, slack_id, pd_id, mm_id) -> str: + if checker_sql.update_haproxy_checker_settings(email, telegram_id, slack_id, pd_id, mm_id, service_alert, backend_alert, maxconn_alert, setting_id): return 'ok' else: return 'error: Cannot update Checker settings' -def update_keepalived_settings(setting_id, email, service_alert, backend_alert, telegram_id, slack_id, pd_id) -> str: - if checker_sql.update_keepalived_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, backend_alert, +def update_keepalived_settings(setting_id, email, service_alert, backend_alert, telegram_id, slack_id, pd_id, mm_id) -> str: + if checker_sql.update_keepalived_checker_settings(email, telegram_id, slack_id, pd_id, mm_id, service_alert, backend_alert, setting_id): return 'ok' else: return 'error: Cannot update Checker settings' -def update_service_settings(setting_id, email, service_alert, telegram_id, slack_id, pd_id) -> str: - if checker_sql.update_service_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, setting_id): +def update_service_settings(setting_id, email, service_alert, telegram_id, slack_id, pd_id, mm_id) -> str: + if checker_sql.update_service_checker_settings(email, telegram_id, slack_id, pd_id, mm_id, service_alert, setting_id): return 'ok' else: return 'error: Cannot update Checker settings' diff --git a/app/modules/tools/smon.py b/app/modules/tools/smon.py index c52e4203..ddd4e025 100644 --- a/app/modules/tools/smon.py +++ b/app/modules/tools/smon.py @@ -2,6 +2,7 @@ from flask import render_template, abort import app.modules.db.smon as smon_sql import app.modules.common.common as common +import app.modules.server.server as server_mod import app.modules.tools.smon_agent as smon_agent import app.modules.roxywi.common as roxywi_common @@ -19,6 +20,7 @@ def create_smon(json_data, user_group, show_new=1) -> bool: telegram = common.checkAjaxInput(json_data['tg']) slack = common.checkAjaxInput(json_data['slack']) pd = common.checkAjaxInput(json_data['pd']) + mm = common.checkAjaxInput(json_data['mm']) resolver = common.checkAjaxInput(json_data['resolver']) record_type = common.checkAjaxInput(json_data['record_type']) packet_size = common.checkAjaxInput(json_data['packet_size']) @@ -46,7 +48,7 @@ def create_smon(json_data, user_group, show_new=1) -> bool: if int(packet_size) < 16: raise Exception('SMON error: a packet size cannot be less than 16') - last_id = smon_sql.insert_smon(name, enable, group, desc, telegram, slack, pd, user_group, check_type) + last_id = smon_sql.insert_smon(name, enable, group, desc, telegram, slack, pd, mm, user_group, check_type) if check_type == 'ping': smon_sql.insert_smon_ping(last_id, hostname, packet_size, interval, agent_id) @@ -85,6 +87,7 @@ def update_smon(smon_id, json_data) -> str: telegram = common.checkAjaxInput(json_data['tg']) slack = common.checkAjaxInput(json_data['slack']) pd = common.checkAjaxInput(json_data['pd']) + mm = common.checkAjaxInput(json_data['mm']) resolver = common.checkAjaxInput(json_data['resolver']) record_type = common.checkAjaxInput(json_data['record_type']) packet_size = common.checkAjaxInput(json_data['packet_size']) @@ -117,7 +120,7 @@ def update_smon(smon_id, json_data) -> str: return f'{e}' try: - if smon_sql.update_smon(smon_id, name, telegram, slack, pd, group, desc, enabled): + if smon_sql.update_smon(smon_id, name, telegram, slack, pd, mm, group, desc, enabled): if check_type == 'http': is_edited = smon_sql.update_smonHttp(smon_id, url, body, http_method, interval, agent_id) elif check_type == 'tcp': @@ -300,3 +303,10 @@ def avg_status_page_status(page_id: int) -> str: return '0' return '1' + + +def change_smon_port(new_port: int) -> None: + cmd = f"sudo sed -i 's/\(^ExecStart.*$\)/ExecStart=gunicorn --workers 1 --bind 0.0.0.0:{new_port} -m 007 smon:app/' /etc/systemd/system/roxy-wi-smon.service" + server_mod.subprocess_execute(cmd) + cmd = 'sudo systemctl daemon-reload && sudo systemctl restart roxy-wi-smon' + server_mod.subprocess_execute(cmd) diff --git a/app/modules/tools/smon_agent.py b/app/modules/tools/smon_agent.py index 65b19660..e1c31f4e 100644 --- a/app/modules/tools/smon_agent.py +++ b/app/modules/tools/smon_agent.py @@ -76,12 +76,22 @@ def update_agent(json_data): name = common.checkAjaxInput(json_data.get("name")) desc = common.checkAjaxInput(json_data.get("desc")) enabled = int(json_data.get("enabled")) + reconfigure = int(json_data.get("reconfigure")) try: smon_sql.update_agent(agent_id, name, desc, enabled) except Exception as e: roxywi_common.handle_exceptions(e, 'Roxy-WI server', f'Cannot update SMON agent: {agent_id}', roxywi=1, login=1) + if reconfigure: + agent_uuid = smon_sql.get_agent_uuid(agent_id) + server_ip = smon_sql.select_server_ip_by_agent_id(agent_id) + try: + inv, server_ips = generate_agent_inc(server_ip, 'install', agent_uuid) + run_ansible(inv, server_ips, 'smon_agent') + except Exception as e: + roxywi_common.handle_exceptions(e, server_ip, 'Cannot reconfigure SMON agent', roxywi=1, login=1) + def get_agent_headers(agent_id: int) -> dict: try: diff --git a/app/routes/admin/routes.py b/app/routes/admin/routes.py index 5b4d2f56..c1ade31b 100644 --- a/app/routes/admin/routes.py +++ b/app/routes/admin/routes.py @@ -19,6 +19,7 @@ import app.modules.roxywi.roxy as roxy import app.modules.roxywi.auth as roxywi_auth import app.modules.roxywi.common as roxywi_common import app.modules.server.server as server_mod +import app.modules.tools.smon as smon_mod import app.modules.tools.common as tools_common @@ -210,4 +211,10 @@ def update_settings(param): if sql.update_setting(param, val, user_group): roxywi_common.logging('Roxy-WI server', f'The {param} setting has been changed to: {val}', roxywi=1, login=1) + if param == 'master_port': + try: + smon_mod.change_smon_port(val) + except Exception as e: + return f'{e}' + return 'Ok' diff --git a/app/routes/checker/routes.py b/app/routes/checker/routes.py index 98e884eb..f06f5fa2 100644 --- a/app/routes/checker/routes.py +++ b/app/routes/checker/routes.py @@ -32,18 +32,19 @@ def update_settings(): telegram_id = int(request.form.get('telegram_id')) slack_id = int(request.form.get('slack_id')) pd_id = int(request.form.get('pd_id')) + mm_id = int(request.form.get('mm_id')) if service == 'haproxy': maxconn_alert = int(request.form.get('maxconn')) backend_alert = int(request.form.get('backend')) return checker_mod.update_haproxy_settings( - setting_id, email, service_alert, backend_alert, maxconn_alert, telegram_id, slack_id, pd_id + setting_id, email, service_alert, backend_alert, maxconn_alert, telegram_id, slack_id, pd_id, mm_id ) elif service in ('nginx', 'apache'): - return checker_mod.update_service_settings(setting_id, email, service_alert, telegram_id, slack_id, pd_id) + return checker_mod.update_service_settings(setting_id, email, service_alert, telegram_id, slack_id, pd_id, mm_id) else: backend_alert = int(request.form.get('backend')) - return checker_mod.update_keepalived_settings(setting_id, email, service_alert, backend_alert, telegram_id, slack_id, pd_id) + return checker_mod.update_keepalived_settings(setting_id, email, service_alert, backend_alert, telegram_id, slack_id, pd_id, mm_id) @bp.route('/settings/load') diff --git a/app/routes/smon/routes.py b/app/routes/smon/routes.py index 83f7c4b9..949b7f71 100644 --- a/app/routes/smon/routes.py +++ b/app/routes/smon/routes.py @@ -37,8 +37,9 @@ def smon_main_dashboard(): 'smon_status': tools_common.is_tool_active('roxy-wi-smon'), 'user_subscription': roxywi_common.return_user_subscription(), 'telegrams': channel_sql.get_user_telegram_by_group(group_id), - 'slacks': channel_sql.get_user_pd_by_group(group_id), - 'pds': channel_sql.get_user_slack_by_group(group_id), + 'slacks': channel_sql.get_user_slack_by_group(group_id), + 'pds': channel_sql.get_user_pd_by_group(group_id), + 'mms': channel_sql.get_user_mm_by_group(group_id), 'sort': request.args.get('sort', None) } @@ -166,6 +167,7 @@ def check(smon_id, check_type_id): 'tg': s.smon_id.telegram_channel_id, 'slack': s.smon_id.slack_channel_id, 'pd': s.smon_id.pd_channel_id, + 'mm': s.smon_id.mm_channel_id, 'check_type': s.smon_id.check_type, 'group': s.smon_id.group, } diff --git a/app/static/js/channel.js b/app/static/js/channel.js index 36b8b5e3..c5f76b00 100644 --- a/app/static/js/channel.js +++ b/app/static/js/channel.js @@ -14,6 +14,9 @@ $( function() { $('#add-pd-button').click(function() { addPDDialog.dialog('open'); }); + $('#add-mm-button').click(function() { + addMMDialog.dialog('open'); + }); var telegram_tabel_title = $( "#telegram-add-table-overview" ).attr('title'); var addTelegramDialog = $( "#telegram-add-table" ).dialog({ autoOpen: false, @@ -101,6 +104,35 @@ $( function() { } }] }); + var mm_tabel_title = $( "#mm-add-table-overview" ).attr('title'); + var addMMDialog = $( "#mm-add-table" ).dialog({ + autoOpen: false, + resizable: false, + height: "auto", + width: 600, + modal: true, + title: mm_tabel_title, + show: { + effect: "fade", + duration: 200 + }, + hide: { + effect: "fade", + duration: 200 + }, + buttons: [{ + text: add_word, + click: function () { + addRecevier(this, 'mm'); + } + }, { + text: cancel_word, + click: function () { + $(this).dialog("close"); + clearTips(); + } + }] + }); $( "#checker_telegram_table input" ).change(function() { var id = $(this).attr('id').split('-'); updateReceiver(id[2], 'telegram') diff --git a/app/templates/ajax/channels.html b/app/templates/ajax/channels.html index 3a9ec234..13962fbb 100644 --- a/app/templates/ajax/channels.html +++ b/app/templates/ajax/channels.html @@ -157,7 +157,59 @@ {% endfor %} -
+ {{lang.words.add|title()}} +
+ {{lang.words.add|title()}} +

+ + + + + + {% if user_params['role']|int() == 1 %} + + {% endif %} + + + + + {% for mm in mms %} + + + + {% if user_params['role']|int() == 1 %} + + {% endif %} + + + + + {% endfor %} +

Mattermost {{lang.words.channels|title()}}

+ {{lang.words.key|title()}} + {{lang.words.name|title()}}{{lang.words.group|title()}}
+ {% set id = 'mm-token-' + mm.id|string() %} + {{ input(id, value=mm.token, size='30') }} + + {% set id = 'mm-chanel-' + mm.id|string() %} + {{ input(id, value=mm.chanel_name, size='30') }} + + + + + + + + +
+
+ {{lang.words.add|title()}}

diff --git a/app/templates/ajax/load_checker.html b/app/templates/ajax/load_checker.html index 270115f9..26ce10a4 100644 --- a/app/templates/ajax/load_checker.html +++ b/app/templates/ajax/load_checker.html @@ -26,9 +26,10 @@ - - - + + + + @@ -76,6 +77,18 @@ {% endfor %} + - - - + + + + @@ -166,6 +180,18 @@ {% endfor %} + - - - + + + + @@ -240,6 +267,18 @@ {% endfor %} + - - - + + + + @@ -315,6 +355,18 @@ {% endfor %} +

{{lang.words.test2|title()}} {{lang.words.message}}

HAProxy {{lang.words.servers}}

{{lang.words.server|title()}}TelegramSlackPagerDutyTelegramSlackPagerDutyMattermost {{lang.words.email|title()}} {{lang.words.service|title()}} {{lang.words.backend|title()}} + + {% set id = 'haproxy_server_email-' + h.id|string() %} {% if h.email == 1 %} @@ -118,9 +131,10 @@

NGINX {{lang.words.servers}}

{{lang.words.server|title()}}TelegramSlackPagerDutyTelegramSlackPagerDutyMattermost {{lang.words.email|title()}} {{lang.words.service|title()}} + + {% set id = 'nginx_server_email-' + h.id|string() %} {% if h.email == 1 %} @@ -192,9 +218,10 @@

Apache {{lang.words.servers}}

{{lang.words.server|title()}}TelegramSlackPagerDutyTelegramSlackPagerDutyMattermost {{lang.words.email|title()}} {{lang.words.service|title()}} + + {% set id = 'apache_server_email-' + h.id|string() %} {% if h.email == 1 %} @@ -266,9 +305,10 @@

Keepalived {{lang.words.servers}}

{{lang.words.server|title()}}TelegramSlackPagerDutyTelegramSlackPagerDutyMattermost {{lang.words.email|title()}} {{lang.words.service|title()}} {{lang.words.status|title()}} + + {% set id = 'keepalived_server_email-' + h.id|string() %} {% if h.email == 1 %} diff --git a/app/templates/base.html b/app/templates/base.html index 2cdc1146..953289cc 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -19,7 +19,7 @@ data-raw="{{lang.words.raw|title()}}" data-resp_time="{{lang.smon_page.desc.resp_time}}" data-next="{{lang.words.next|title()}}" data-back="{{lang.words.back|title()}}" data-installing="{{lang.words.installing|title()}}" data-creating="{{lang.words.creating|title()}}" data-roxywi_timeout="{{lang.ha_page.roxywi_timeout}}" data-check_apache_log="{{lang.ha_page.check_apache_log}}" data-was_installed="{{lang.ha_page.was_installed}}" data-start_enter="{{lang.ha_page.start_enter}}" - data-apply="{{lang.words.apply|title()}}" /> + data-apply="{{lang.words.apply|title()}}" data-reconfigure="{{lang.words.reconfigure|title()}}" /> {% include 'include/main_head.html' %} diff --git a/app/templates/include/admin_settings.html b/app/templates/include/admin_settings.html index 86ba8e14..ac76f31c 100644 --- a/app/templates/include/admin_settings.html +++ b/app/templates/include/admin_settings.html @@ -47,8 +47,8 @@ {% else %} {{ input(set.param, size='25', type='password', style='width: 210px;', placeholder='******') }} {% endif %} - {% elif set.param in ('nginx_stats_port', 'session_ttl', 'token_ttl', 'haproxy_stats_port', 'haproxy_sock_port', - 'ldap_port', 'log_time_storage', 'checker_check_interval', 'port_scan_interval', 'smon_keep_history_range', + {% elif set.param in ('nginx_stats_port', 'session_ttl', 'token_ttl', 'haproxy_stats_port', 'haproxy_sock_port', 'master_port', + 'ldap_port', 'log_time_storage', 'checker_check_interval', 'port_scan_interval', 'smon_keep_history_range', 'agent_port', 'checker_keep_history_range', 'portscanner_keep_history_range', 'checker_maxconn_threshold', 'apache_stats_port', 'mail_smtp_port', 'rabbitmq_port', 'smon_ssl_expire_warning_alert', 'smon_ssl_expire_critical_alert', 'action_keep_history_range') %} {{ input(set.param, value=set.value, style='width: 210px;', type='number') }} diff --git a/app/templates/include/admins_dialogs.html b/app/templates/include/admins_dialogs.html index d0e8d5bc..dcf37005 100644 --- a/app/templates/include/admins_dialogs.html +++ b/app/templates/include/admins_dialogs.html @@ -261,6 +261,42 @@ {% endif %}
+