From 8c28c5128c7bfb9bd79fecb68b864f8aae2d2fe3 Mon Sep 17 00:00:00 2001 From: Aidaho Date: Thu, 4 Apr 2024 14:30:07 +0300 Subject: [PATCH] v7.2.2.0 https://roxy-wi.org/changelog#7_2_2 --- app/create_db.py | 2 +- app/modules/common/common.py | 39 ++++++ app/modules/db/config.py | 3 +- app/modules/db/history.py | 8 +- app/modules/db/metric.py | 30 ++--- app/modules/db/portscanner.py | 7 +- app/modules/db/smon.py | 5 +- app/modules/db/sql.py | 5 - app/modules/db/user.py | 8 +- app/modules/roxy_wi_tools.py | 6 +- app/modules/roxywi/metrics.py | 16 ++- app/modules/roxywi/nettools.py | 26 +++- app/modules/service/installation.py | 121 +++++------------- app/modules/tools/smon.py | 3 +- app/routes/add/routes.py | 2 - app/routes/config/routes.py | 2 +- app/routes/install/routes.py | 21 ++- app/routes/main/routes.py | 14 +- app/routes/waf/routes.py | 2 - app/scripts/ansible/roles/waf.yml | 2 +- app/scripts/ansible/roles/waf/tasks/main.yml | 101 +++++++-------- app/scripts/ansible/roles/waf_nginx.yml | 2 +- .../ansible/roles/waf_nginx/tasks/main.yml | 24 ++-- app/scripts/waf.sh | 50 -------- app/scripts/waf_nginx.sh | 43 ------- app/static/css/style-6.3.9.css | 5 + app/static/js/backup.js | 10 ++ {inc => app/static/js}/nettools.js | 29 +++++ app/templates/ajax/alerts_history.html | 6 +- app/templates/ajax/load_services.html | 1 - app/templates/ajax/show_list_version.html | 2 +- app/templates/ajax/smon/check.html | 4 +- app/templates/ajax/smon/history_status.html | 2 +- app/templates/base.html | 2 +- app/templates/history.html | 6 +- app/templates/include/admin_backup.html | 10 +- app/templates/include/main_menu.html | 4 +- app/templates/languages/en.html | 6 + app/templates/languages/fr.html | 6 + app/templates/languages/pt-br.html | 6 + app/templates/languages/ru.html | 6 + app/templates/nettools.html | 43 +++++-- config_other/requirements_deb.txt | 1 + config_other/requirements_el7.txt | 1 + config_other/requirements_el8.txt | 1 + config_other/requirements_el9.txt | 1 + requirements.txt | 1 + 47 files changed, 346 insertions(+), 349 deletions(-) delete mode 100644 app/scripts/waf.sh delete mode 100644 app/scripts/waf_nginx.sh rename {inc => app/static/js}/nettools.js (83%) diff --git a/app/create_db.py b/app/create_db.py index a520b77e..c87900e0 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -735,7 +735,7 @@ def update_db_v_7_2_0_1(): def update_ver(): try: - Version.update(version='7.2.1.0').execute() + Version.update(version='7.2.2.0').execute() except Exception: print('Cannot update version') diff --git a/app/modules/common/common.py b/app/modules/common/common.py index 1a04f27d..b065fbe1 100644 --- a/app/modules/common/common.py +++ b/app/modules/common/common.py @@ -1,13 +1,52 @@ import re +import dateutil from datetime import datetime from shlex import quote from shutil import which from pytz import timezone +import app.modules.db.sql as sql + error_mess = 'error: All fields must be completed' +def _convert_to_time_zone(date: datetime) -> datetime: + """ + Convert a datetime object to the specified time zone. + + :param date: The datetime object to convert. + :return: The converted datetime object. + """ + from_zone = dateutil.tz.gettz('UTC') + time_zone = sql.get_setting('time_zone') + to_zone = dateutil.tz.gettz(time_zone) + utc = date.replace(tzinfo=from_zone) + native = utc.astimezone(to_zone) + return native + + +def get_time_zoned_date(date: datetime, fmt: str = None) -> str: + """ + Formats a given date and returns the formatted date in the specified or default format. + + :param date: The date to be formatted. + :type date: datetime + + :param fmt: The format to use for the formatted date. If not provided, a default format will be used. + :type fmt: str, optional + + :return: The formatted date. + :rtype: str + """ + native = _convert_to_time_zone(date) + date_format = '%Y-%m-%d %H:%M:%S' + if fmt: + return native.strftime(fmt) + else: + return native.strftime(date_format) + + def get_present_time(): """ Returns the current time in UTC. diff --git a/app/modules/db/config.py b/app/modules/db/config.py index d25ed1b0..2fc53a92 100644 --- a/app/modules/db/config.py +++ b/app/modules/db/config.py @@ -1,12 +1,11 @@ from app.modules.db.db_model import ConfigVersion -from app.modules.db.sql import get_setting from app.modules.db.server import select_server_id_by_ip from app.modules.db.common import out_error import app.modules.roxy_wi_tools as roxy_wi_tools def insert_config_version(server_id: int, user_id: int, service: str, local_path: str, remote_path: str, diff: str): - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') try: ConfigVersion.insert( diff --git a/app/modules/db/history.py b/app/modules/db/history.py index 0653c4fa..48a7129c 100644 --- a/app/modules/db/history.py +++ b/app/modules/db/history.py @@ -31,7 +31,7 @@ def alerts_history(service, user_group, **kwargs): def insert_alerts(user_group, level, ip, port, message, service): - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') try: Alerts.insert( @@ -43,7 +43,7 @@ def insert_alerts(user_group, level, ip, port, message, service): def delete_alert_history(keep_interval: int, service: str): - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta_minus=keep_interval) query = Alerts.delete().where( (Alerts.date < cur_date) & (Alerts.service == service) @@ -55,7 +55,7 @@ def delete_alert_history(keep_interval: int, service: str): def insert_action_history(service: str, action: str, server_id: int, user_id: int, user_ip: str, server_ip: str, hostname: str): - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') try: ActionHistory.insert( @@ -82,7 +82,7 @@ def delete_action_history(server_id: int): def delete_action_history_for_period(): time_period = get_setting('action_keep_history_range') - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta_minus=time_period) query = ActionHistory.delete().where(ActionHistory.date < cur_date) try: diff --git a/app/modules/db/metric.py b/app/modules/db/metric.py index c70dfab2..997fdcec 100644 --- a/app/modules/db/metric.py +++ b/app/modules/db/metric.py @@ -1,12 +1,10 @@ from app.modules.db.db_model import connect, mysql_enable, Metrics, MetricsHttpStatus, Server, NginxMetrics, ApacheMetrics, WafMetrics -from app.modules.db.sql import get_setting from app.modules.db.common import out_error import app.modules.roxy_wi_tools as roxy_wi_tools def insert_metrics(serv, curr_con, cur_ssl_con, sess_rate, max_sess_rate): - time_zone = get_setting('time_zone') - get_date = roxy_wi_tools.GetDate(time_zone) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') try: Metrics.insert( @@ -23,8 +21,7 @@ def insert_metrics(serv, curr_con, cur_ssl_con, sess_rate, max_sess_rate): def insert_metrics_http(serv, http_2xx, http_3xx, http_4xx, http_5xx): - time_zone = get_setting('time_zone') - get_date = roxy_wi_tools.GetDate(time_zone) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') try: MetricsHttpStatus.insert( @@ -41,8 +38,7 @@ def insert_metrics_http(serv, http_2xx, http_3xx, http_4xx, http_5xx): def insert_nginx_metrics(serv, connection): - time_zone = get_setting('time_zone') - get_date = roxy_wi_tools.GetDate(time_zone) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') try: NginxMetrics.insert(serv=serv, conn=connection, date=cur_date).execute() @@ -56,8 +52,7 @@ def insert_nginx_metrics(serv, connection): def insert_apache_metrics(serv, connection): - time_zone = get_setting('time_zone') - get_date = roxy_wi_tools.GetDate(time_zone) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') try: ApacheMetrics.insert(serv=serv, conn=connection, date=cur_date).execute() @@ -71,8 +66,7 @@ def insert_apache_metrics(serv, connection): def insert_waf_metrics(serv, connection): - time_zone = get_setting('time_zone') - get_date = roxy_wi_tools.GetDate(time_zone) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') try: WafMetrics.insert(serv=serv, conn=connection, date=cur_date).execute() @@ -86,8 +80,7 @@ def insert_waf_metrics(serv, connection): def delete_waf_metrics(): - time_zone = get_setting('time_zone') - get_date = roxy_wi_tools.GetDate(time_zone) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta_minus=3) query = WafMetrics.delete().where(WafMetrics.date < cur_date) try: @@ -102,8 +95,7 @@ def delete_waf_metrics(): def delete_metrics(): - time_zone = get_setting('time_zone') - get_date = roxy_wi_tools.GetDate(time_zone) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta_minus=3) query = Metrics.delete().where(Metrics.date < cur_date) try: @@ -118,8 +110,7 @@ def delete_metrics(): def delete_http_metrics(): - time_zone = get_setting('time_zone') - get_date = roxy_wi_tools.GetDate(time_zone) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta_minus=3) query = MetricsHttpStatus.delete().where(MetricsHttpStatus.date < cur_date) try: @@ -134,8 +125,7 @@ def delete_http_metrics(): def delete_nginx_metrics(): - time_zone = get_setting('time_zone') - get_date = roxy_wi_tools.GetDate(time_zone) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta_minus=3) query = NginxMetrics.delete().where(NginxMetrics.date < cur_date) try: @@ -150,7 +140,7 @@ def delete_nginx_metrics(): def delete_apache_metrics(): - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta_minus=3) query = ApacheMetrics.delete().where(ApacheMetrics.date < cur_date) try: diff --git a/app/modules/db/portscanner.py b/app/modules/db/portscanner.py index 87d8ffca..ce88bef5 100644 --- a/app/modules/db/portscanner.py +++ b/app/modules/db/portscanner.py @@ -1,5 +1,4 @@ from app.modules.db.db_model import connect, fn, PortScannerPorts, PortScannerSettings, PortScannerHistory -from app.modules.db.sql import get_setting from app.modules.db.common import out_error import app.modules.roxy_wi_tools as roxy_wi_tools @@ -37,7 +36,7 @@ def select_port_scanner_settings_for_service(): def insert_port_scanner_port(serv, user_group_id, port, service_name): - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') try: PortScannerPorts.insert( @@ -83,7 +82,7 @@ def delete_ports(serv): def insert_port_scanner_history(serv, port, port_status, service_name): - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') try: PortScannerHistory.insert( @@ -130,7 +129,7 @@ def select_count_opened_ports(serv): def delete_portscanner_history(keep_interval: int): - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta_minus=keep_interval) query = PortScannerHistory.delete().where( PortScannerHistory.date < cur_date) diff --git a/app/modules/db/smon.py b/app/modules/db/smon.py index 636571a5..b9469895 100644 --- a/app/modules/db/smon.py +++ b/app/modules/db/smon.py @@ -3,7 +3,6 @@ import uuid from peewee import fn from app.modules.db.db_model import SmonAgent, Server, SMON, SmonTcpCheck, SmonHttpCheck, SmonDnsCheck, SmonPingCheck, SmonHistory, SmonStatusPageCheck, SmonStatusPage -from app.modules.db.sql import get_setting from app.modules.db.common import out_error import app.modules.roxy_wi_tools as roxy_wi_tools @@ -187,7 +186,7 @@ def add_sec_to_state_time(time, smon_id): def insert_smon_history(smon_id: int, resp_time: float, status: int, check_id: int, mes='') -> None: - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') try: SmonHistory.insert(smon_id=smon_id, response_time=resp_time, status=status, date=cur_date, check_id=check_id, mes=mes).execute() @@ -645,7 +644,7 @@ def count_agents() -> int: def delete_smon_history(): - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta_minus=1) query = SmonHistory.delete().where(SmonHistory.date < cur_date) try: diff --git a/app/modules/db/sql.py b/app/modules/db/sql.py index 6a4c658d..0290fe04 100755 --- a/app/modules/db/sql.py +++ b/app/modules/db/sql.py @@ -2,7 +2,6 @@ from flask import request from app.modules.db.db_model import GeoipCodes, Setting, Role from app.modules.db.common import out_error -import app.modules.roxy_wi_tools as roxy_wi_tools def get_setting(param, **kwargs): @@ -39,10 +38,6 @@ def get_setting(param, **kwargs): return setting.value -time_zone = get_setting('time_zone') -get_date = roxy_wi_tools.GetDate(time_zone) - - def update_setting(param: str, val: str, user_group: int) -> bool: query = Setting.update(value=val).where((Setting.param == param) & (Setting.group == user_group)) try: diff --git a/app/modules/db/user.py b/app/modules/db/user.py index 644392bb..3cf38dcb 100644 --- a/app/modules/db/user.py +++ b/app/modules/db/user.py @@ -256,7 +256,7 @@ def get_user_role_by_uuid(uuid, group_id): def write_user_uuid(login, user_uuid): session_ttl = get_setting('session_ttl') user_id = get_user_id_by_username(login) - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta=session_ttl) try: @@ -268,7 +268,7 @@ def write_user_uuid(login, user_uuid): def write_user_token(login, user_token): token_ttl = get_setting('token_ttl') user_id = get_user_id_by_username(login) - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta=token_ttl) try: @@ -368,7 +368,7 @@ def get_user_id_by_api_token(token): def write_api_token(user_token, group_id, user_role, user_name): token_ttl = int(get_setting('token_ttl')) - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular', timedelta=token_ttl) cur_date_token_ttl = get_date.return_date('regular', timedelta=token_ttl) @@ -404,7 +404,7 @@ def get_token(uuid): def delete_old_uuid(): - get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) + get_date = roxy_wi_tools.GetDate() cur_date = get_date.return_date('regular') query = UUID.delete().where((UUID.exp < cur_date) | (UUID.exp.is_null(True))) query1 = Token.delete().where((Token.exp < cur_date) | (Token.exp.is_null(True))) diff --git a/app/modules/roxy_wi_tools.py b/app/modules/roxy_wi_tools.py index 9e2e6234..61c8a2bb 100644 --- a/app/modules/roxy_wi_tools.py +++ b/app/modules/roxy_wi_tools.py @@ -22,14 +22,14 @@ class GetConfigVar: class GetDate: - def __init__(self, time_zone): + def __init__(self, time_zone=None): self.time_zone = time_zone self.fmt = "%Y-%m-%d.%H:%M:%S" def return_date(self, log_type, **kwargs): - try: + if self.time_zone: cur_time_zone = timezone(self.time_zone) - except Exception: + else: cur_time_zone = timezone('UTC') if kwargs.get('timedelta'): diff --git a/app/modules/roxywi/metrics.py b/app/modules/roxywi/metrics.py index dcabb392..0b2a9068 100644 --- a/app/modules/roxywi/metrics.py +++ b/app/modules/roxywi/metrics.py @@ -1,6 +1,7 @@ import psutil import app.modules.db.metric as metric_sql +import app.modules.common.common as common import app.modules.server.server as server_mod @@ -66,8 +67,9 @@ def haproxy_metrics(server_ip: str, hostname: str, time_range: str) -> dict: server = '' for i in metric: - label = str(i[5]) - label = label.split(' ')[1] + label = i[5] + metric_time = common.get_time_zoned_date(label, '%H:%M:%S') + label = metric_time labels += label + ',' curr_con += str(i[1]) + ',' curr_ssl_con += str(i[2]) + ',' @@ -95,8 +97,9 @@ def haproxy_http_metrics(server_ip: str, hostname: str, time_range: str) -> dict server = '' for i in metric: - label = str(i[5]) - label = label.split(' ')[1] + label = i[5] + metric_time = common.get_time_zoned_date(label, '%H:%M:%S') + label = metric_time labels += label + ',' http_2xx += str(i[1]) + ',' http_3xx += str(i[2]) + ',' @@ -123,8 +126,9 @@ def service_metrics(server_ip: str, hostname: str, service: str, time_range: str curr_con = '' for i in metric: - label = str(i[2]) - label = label.split(' ')[1] + label = i[2] + metric_time = common.get_time_zoned_date(label, '%H:%M:%S') + label = metric_time labels += label + ',' curr_con += str(i[1]) + ',' diff --git a/app/modules/roxywi/nettools.py b/app/modules/roxywi/nettools.py index 6cb062d5..3b60924b 100644 --- a/app/modules/roxywi/nettools.py +++ b/app/modules/roxywi/nettools.py @@ -1,7 +1,10 @@ +import json + +import whois from flask import Response, stream_with_context import app.modules.server.ssh as mod_ssh -import modules.server.server as server_mod +import app.modules.server.server as server_mod def ping_from_server(server_from: str, server_to: str, action: str) -> Response: @@ -106,3 +109,24 @@ def nslookup_from_server(server_from: str, dns_name: str, record_type: str) -> s count_string += 1 return output1 + + +def whois_check(domain_name: str) -> str: + try: + whois_data = json.loads(str(whois.whois(domain_name))) + except Exception as e: + return f'error: Cannot get whois from {domain_name}: {e}' + + output = (f'Domain name: {whois_data["domain_name"]}
' + f'Registrar: {whois_data["registrar"]}
' + f'Creation date: {whois_data["creation_date"]}
' + f'Expiration date: {whois_data["expiration_date"]}
' + f'Name servers: {whois_data["name_servers"]}
' + f'Status: {whois_data["status"]}
') + + if 'emails' in whois_data: + output += f'Emails: {whois_data["emails"]}
' + if 'org' in whois_data: + output += f'Organization: {whois_data["org"]}
' + + return output diff --git a/app/modules/service/installation.py b/app/modules/service/installation.py index 0f2f8317..fb6686d5 100644 --- a/app/modules/service/installation.py +++ b/app/modules/service/installation.py @@ -7,7 +7,6 @@ import ansible import ansible_runner import app.modules.db.sql as sql -import app.modules.db.waf as waf_sql import app.modules.db.ha_cluster as ha_sql import app.modules.db.server as server_sql import app.modules.db.service as service_sql @@ -41,82 +40,6 @@ def show_success_installation(service): return render_template('include/show_success_installation.html', service=service, lang=lang) -def waf_install(server_ip: str): - script = "waf.sh" - proxy = sql.get_setting('proxy') - haproxy_dir = sql.get_setting('haproxy_dir') - ver = service_common.check_haproxy_version(server_ip) - service = ' WAF' - proxy_serv = '' - ssh_settings = return_ssh_keys_path(server_ip) - full_path = '/var/www/haproxy-wi/app' - - os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") - - if proxy is not None and proxy != '' and proxy != 'None': - proxy_serv = proxy - - commands = [ - f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} HAPROXY_PATH={haproxy_dir} VERSION='{ver}' " - f"SSH_PORT={ssh_settings['port']} HOST={server_ip} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' " - f"KEY={ssh_settings['key']}" - ] - - return_out = server_mod.subprocess_execute_with_rc(commands[0]) - - try: - show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']) - except Exception as e: - raise Exception(e) - - try: - waf_sql.insert_waf_metrics_enable(server_ip, "0") - waf_sql.insert_waf_rules(server_ip) - except Exception as e: - return str(e) - - os.remove(f'{full_path}/{script}') - - return show_success_installation(service) - - -def waf_nginx_install(server_ip: str): - script = "waf_nginx.sh" - proxy = sql.get_setting('proxy') - nginx_dir = sql.get_setting('nginx_dir') - service = ' WAF' - proxy_serv = '' - ssh_settings = return_ssh_keys_path(server_ip) - full_path = '/var/www/haproxy-wi/app' - - os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") - - if proxy is not None and proxy != '' and proxy != 'None': - proxy_serv = proxy - - commands = [ - f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} NGINX_PATH={nginx_dir} SSH_PORT={ssh_settings['port']} " - f"HOST={server_ip} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}" - ] - - return_out = server_mod.subprocess_execute_with_rc(commands[0]) - - try: - show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']) - except Exception as e: - raise Exception(e) - - try: - waf_sql.insert_nginx_waf_rules(server_ip) - waf_sql.insert_waf_nginx_server(server_ip) - except Exception as e: - return str(e) - - os.remove(f'{full_path}/{script}') - - return show_success_installation(service) - - def geoip_installation(serv, geoip_update, service): proxy = sql.get_setting('proxy') maxmind_key = sql.get_setting('maxmind_key') @@ -189,7 +112,7 @@ def grafana_install(): return f'success: Grafana and Prometheus servers were installed. You can find Grafana on http://{host}:3000
' -def generate_kp_inv(json_data: json, install_service) -> object: +def generate_kp_inv(json_data: json, installed_service) -> object: inv = {"server": {"hosts": {}}} server_ips = [] cluster_id = int(json_data['cluster_id']) @@ -229,7 +152,23 @@ def generate_kp_inv(json_data: json, install_service) -> object: return inv, server_ips -def generate_haproxy_inv(json_data: json, install_service: str) -> object: +def generate_waf_inv(server_ip: str, installed_service: str) -> object: + inv = {"server": {"hosts": {}}} + server_ips = [] + if installed_service == "waf": + service_dir = sql.get_setting('haproxy_dir') + else: + service_dir = sql.get_setting('nginx_dir') + + inv['server']['hosts'][server_ip] = { + 'SERVICE_PATH': service_dir + } + server_ips.append(server_ip) + + return inv, server_ips + + +def generate_haproxy_inv(json_data: json, installed_service: str) -> object: inv = {"server": {"hosts": {}}} slaves = [] server_ips = [] @@ -280,24 +219,24 @@ def generate_haproxy_inv(json_data: json, install_service: str) -> object: return inv, server_ips -def generate_service_inv(json_data: json, install_service: str) -> object: +def generate_service_inv(json_data: json, installed_service: str) -> object: inv = {"server": {"hosts": {}}} server_ips = [] - stats_user = sql.get_setting(f'{install_service}_stats_user') - stats_password = sql.get_setting(f'{install_service}_stats_password') - stats_port = str(sql.get_setting(f'{install_service}_stats_port')) - stats_page = sql.get_setting(f'{install_service}_stats_page') - config_path = sql.get_setting(f'{install_service}_config_path') - service_dir = sql.get_setting(f'{install_service}_dir') - container_name = sql.get_setting(f'{install_service}_container_name') - is_docker = json_data['services'][install_service]['docker'] + stats_user = sql.get_setting(f'{installed_service}_stats_user') + stats_password = sql.get_setting(f'{installed_service}_stats_password') + stats_port = str(sql.get_setting(f'{installed_service}_stats_port')) + stats_page = sql.get_setting(f'{installed_service}_stats_page') + config_path = sql.get_setting(f'{installed_service}_config_path') + service_dir = sql.get_setting(f'{installed_service}_dir') + container_name = sql.get_setting(f'{installed_service}_container_name') + is_docker = json_data['services'][installed_service]['docker'] - if install_service == 'nginx' and not os.path.isdir('/var/www/haproxy-wi/app/scripts/ansible/roles/nginxinc.nginx'): + if installed_service == 'nginx' and not os.path.isdir('/var/www/haproxy-wi/app/scripts/ansible/roles/nginxinc.nginx'): os.system('ansible-galaxy install nginxinc.nginx,0.23.2 --roles-path /var/www/haproxy-wi/app/scripts/ansible/roles/') for k, v in json_data['servers'].items(): server_ip = v['ip'] - if install_service == 'apache': + if installed_service == 'apache': correct_service_name = service_common.get_correct_apache_service_name(server_ip=server_ip, server_id=None) if service_dir == '/etc/httpd' and correct_service_name == 'apache2': service_dir = '/etc/apache2' @@ -314,7 +253,7 @@ def generate_service_inv(json_data: json, install_service: str) -> object: "SYN_FLOOD": "0", "CONFIG_PATH": config_path, "STAT_PAGE": stats_page, - "service": install_service, + "service": installed_service, } server_ips.append(server_ip) diff --git a/app/modules/tools/smon.py b/app/modules/tools/smon.py index cf226c69..c52e4203 100644 --- a/app/modules/tools/smon.py +++ b/app/modules/tools/smon.py @@ -197,7 +197,8 @@ def history_metrics(server_id: int) -> dict: curr_con = '' for i in reversed(metric): - labels += f'{i.date.time()},' + metric_time = common.get_time_zoned_date(i.date, '%H:%M:%S') + labels += f'{metric_time},' curr_con += f'{i.response_time},' metrics['chartData']['labels'] = labels diff --git a/app/routes/add/routes.py b/app/routes/add/routes.py index 8c5cb5da..ba42489f 100644 --- a/app/routes/add/routes.py +++ b/app/routes/add/routes.py @@ -15,8 +15,6 @@ import app.modules.roxy_wi_tools as roxy_wi_tools import app.modules.server.server as server_mod get_config = roxy_wi_tools.GetConfigVar() -time_zone = sql.get_setting('time_zone') -get_date = roxy_wi_tools.GetDate(time_zone) @bp.before_request diff --git a/app/routes/config/routes.py b/app/routes/config/routes.py index f5435a26..aa355643 100644 --- a/app/routes/config/routes.py +++ b/app/routes/config/routes.py @@ -8,7 +8,7 @@ import app.modules.db.sql as sql import app.modules.db.config as config_sql import app.modules.db.server as server_sql import app.modules.db.service as service_sql -from middleware import check_services, get_user_params +from app.middleware import check_services, get_user_params import app.modules.common.common as common import app.modules.roxywi.auth as roxywi_auth import app.modules.roxywi.common as roxywi_common diff --git a/app/routes/install/routes.py b/app/routes/install/routes.py index 8e8518d4..56095851 100644 --- a/app/routes/install/routes.py +++ b/app/routes/install/routes.py @@ -2,8 +2,9 @@ from flask import render_template, request, g from flask_login import login_required from app.routes.install import bp -from middleware import get_user_params, check_services +from app.middleware import get_user_params, check_services import app.modules.db.sql as sql +import app.modules.db.waf as waf_sql import app.modules.common.common as common import app.modules.roxywi.auth as roxywi_auth import app.modules.server.server as server_mod @@ -87,17 +88,31 @@ def install_waf(service, server_ip): if service == 'haproxy': try: - return service_mod.waf_install(server_ip) + inv, server_ips = service_mod.generate_waf_inv(server_ip, 'waf') + ansible_status = service_mod.run_ansible(inv, server_ips, 'waf'), 201 + except Exception as e: + return str(e) + try: + waf_sql.insert_waf_metrics_enable(server_ip, "0") + waf_sql.insert_waf_rules(server_ip) except Exception as e: return str(e) elif service == 'nginx': try: - return service_mod.waf_nginx_install(server_ip) + inv, server_ips = service_mod.generate_waf_inv(server_ip, 'waf_nginx') + ansible_status = service_mod.run_ansible(inv, server_ips, 'waf_nginx'), 201 + except Exception as e: + return str(e) + try: + waf_sql.insert_nginx_waf_rules(server_ip) + waf_sql.insert_waf_nginx_server(server_ip) except Exception as e: return str(e) else: return 'error: Wrong service' + return ansible_status + @bp.post('/geoip') def install_geoip(): diff --git a/app/routes/main/routes.py b/app/routes/main/routes.py index 6ce22a12..e01c3564 100644 --- a/app/routes/main/routes.py +++ b/app/routes/main/routes.py @@ -2,7 +2,7 @@ import os import sys import pytz -from flask import render_template, request, session, g, abort +from flask import render_template, request, session, g, abort, jsonify from flask_login import login_required sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) @@ -26,6 +26,11 @@ import app.modules.service.common as service_common import app.modules.service.haproxy as service_haproxy +@app.template_filter('strftime') +def _jinja2_filter_datetime(date, fmt=None): + return common.get_time_zoned_date(date, fmt) + + @app.errorhandler(403) @get_user_params() def page_is_forbidden(e): @@ -110,9 +115,9 @@ def nettools(): return render_template('nettools.html', lang=g.user_params['lang']) -@bp.post('/nettols/') +@bp.post('/nettools/') @login_required -def nettols_check(check): +def nettools_check(check): server_from = common.checkAjaxInput(request.form.get('server_from')) server_to = common.is_ip_or_dns(request.form.get('server_to')) action = common.checkAjaxInput(request.form.get('nettools_action')) @@ -120,6 +125,7 @@ def nettols_check(check): dns_name = common.checkAjaxInput(request.form.get('nettools_nslookup_name')) dns_name = common.is_ip_or_dns(dns_name) record_type = common.checkAjaxInput(request.form.get('nettools_nslookup_record_type')) + domain_name = common.is_ip_or_dns(request.form.get('nettools_whois_name')) if check == 'icmp': return nettools_mod.ping_from_server(server_from, server_to, action) @@ -127,6 +133,8 @@ def nettols_check(check): return nettools_mod.telnet_from_server(server_from, server_to, port_to) elif check == 'dns': return nettools_mod.nslookup_from_server(server_from, dns_name, record_type) + elif check == 'whois': + return jsonify(nettools_mod.whois_check(domain_name)) else: return 'error: Wrong check' diff --git a/app/routes/waf/routes.py b/app/routes/waf/routes.py index f9fc1ed3..b5b27167 100644 --- a/app/routes/waf/routes.py +++ b/app/routes/waf/routes.py @@ -15,8 +15,6 @@ import app.modules.roxywi.common as roxywi_common import app.modules.config.config as config_mod get_config = roxy_wi_tools.GetConfigVar() -time_zone = sql.get_setting('time_zone') -get_date = roxy_wi_tools.GetDate(time_zone) @bp.before_request diff --git a/app/scripts/ansible/roles/waf.yml b/app/scripts/ansible/roles/waf.yml index 204a30db..16b5117b 100644 --- a/app/scripts/ansible/roles/waf.yml +++ b/app/scripts/ansible/roles/waf.yml @@ -1,6 +1,6 @@ --- - name: Install WAF - hosts: "{{ variable_host }}" + hosts: all become: yes become_method: sudo gather_facts: yes diff --git a/app/scripts/ansible/roles/waf/tasks/main.yml b/app/scripts/ansible/roles/waf/tasks/main.yml index 88bee22b..82068024 100644 --- a/app/scripts/ansible/roles/waf/tasks/main.yml +++ b/app/scripts/ansible/roles/waf/tasks/main.yml @@ -1,13 +1,9 @@ --- - name: Installing WAF block: - - name: Set SSH port - set_fact: - ansible_port: "{{SSH_PORT}}" - - name: Check that WAF has been installed stat: - path: "{{ HAPROXY_PATH }}/waf/modsecurity.conf" + path: "{{ SERVICE_PATH }}/waf/modsecurity.conf" register: stat_result - name: Fail if has been installed @@ -179,7 +175,7 @@ - name: Make WAF rules directory file: - path: "{{ HAPROXY_PATH }}/waf/{{ item }}" + path: "{{ SERVICE_PATH }}/waf/{{ item }}" state: directory with_items: - rules @@ -188,59 +184,59 @@ - name: Copy Modsec module to HAProxy dir copy: src: "{{ mod_sec_dir }}/modsecurity" - dest: "{{ HAPROXY_PATH }}/waf/bin" + dest: "{{ SERVICE_PATH }}/waf/bin" mode: '0744' remote_src: true - name: Download modsecurity conf get_url: url: https://github.com/SpiderLabs/ModSecurity/raw/v2/master/modsecurity.conf-recommended - dest: "{{ HAPROXY_PATH }}/waf/modsecurity.conf" + dest: "{{ SERVICE_PATH }}/waf/modsecurity.conf" - name: Insert Modsec rules blockinfile: - path: "{{ HAPROXY_PATH }}/waf/modsecurity.conf" + path: "{{ SERVICE_PATH }}/waf/modsecurity.conf" block: | - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_10_ignore_static.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_10_setup.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_11_avs_traffic.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_11_brute_force.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_11_dos_protection.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_13_xml_enabler.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_16_authentication_tracking.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_16_scanner_integration.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_16_username_tracking.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_20_protocol_violations.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_21_protocol_anomalies.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_23_request_limits.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_25_cc_known.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_25_cc_track_pan.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_30_http_policy.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_35_bad_robots.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_40_generic_attacks.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_40_http_parameter_pollution.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_41_sql_injection_attacks.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_41_xss_attacks.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_42_comment_spam.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_42_tight_security.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_45_trojans.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_46_av_scanning.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_46_scanner_integration.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_46_slr_et_xss_attacks.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_46_slr_et_lfi_attacks.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_46_slr_et_sqli_attacks.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_47_common_exceptions.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_49_inbound_blocking.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_50_outbound.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_55_marketing.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_56_pvi_checks.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_59_outbound_blocking.conf - Include {{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_60_correlation.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_10_ignore_static.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_10_setup.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_11_avs_traffic.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_11_brute_force.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_11_dos_protection.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_13_xml_enabler.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_16_authentication_tracking.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_16_scanner_integration.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_16_username_tracking.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_20_protocol_violations.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_21_protocol_anomalies.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_23_request_limits.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_25_cc_known.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_25_cc_track_pan.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_30_http_policy.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_35_bad_robots.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_40_generic_attacks.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_40_http_parameter_pollution.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_41_sql_injection_attacks.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_41_xss_attacks.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_42_comment_spam.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_42_tight_security.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_45_trojans.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_46_av_scanning.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_46_scanner_integration.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_46_slr_et_xss_attacks.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_46_slr_et_lfi_attacks.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_46_slr_et_sqli_attacks.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_47_common_exceptions.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_49_inbound_blocking.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_50_outbound.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_55_marketing.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_56_pvi_checks.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_59_outbound_blocking.conf + Include {{ SERVICE_PATH }}/waf/rules/modsecurity_crs_60_correlation.conf - name: Download unicode.mapping get_url: url: https://github.com/SpiderLabs/ModSecurity/raw/v2/master/unicode.mapping - dest: "{{ HAPROXY_PATH }}/waf/unicode.mapping" + dest: "{{ SERVICE_PATH }}/waf/unicode.mapping" - name: Download owasp-modsecurity-crs get_url: @@ -263,7 +259,7 @@ - name: Copy owasp files copy: src: "/tmp/owasp-modsecurity-crs-2.2.9/owasp-modsecurity-crs-2.2.9/{{ item }}" - dest: "{{ HAPROXY_PATH }}/waf/rules" + dest: "{{ SERVICE_PATH }}/waf/rules" remote_src: yes with_items: - base_rules/ @@ -274,25 +270,25 @@ - name: Copy Modsec crs conf file copy: src: /tmp/owasp-modsecurity-crs-2.2.9/owasp-modsecurity-crs-2.2.9/modsecurity_crs_10_setup.conf.example - dest: "{{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_10_setup.conf" + dest: "{{ SERVICE_PATH }}/waf/rules/modsecurity_crs_10_setup.conf" remote_src: true - name: Ensure ModSec engine mode on ansible.builtin.lineinfile: - path: "{{ HAPROXY_PATH }}/waf/modsecurity.conf" + path: "{{ SERVICE_PATH }}/waf/modsecurity.conf" regexp: '^SecRuleEngine DetectionOnly' line: SecRuleEngine On - name: Change ModSec audit log ansible.builtin.lineinfile: - path: "{{ HAPROXY_PATH }}/waf/modsecurity.conf" + path: "{{ SERVICE_PATH }}/waf/modsecurity.conf" regexp: '^SecAuditLogParts ABIJDEFHZ' line: SecAuditLogParts ABIJDEH - name: Create modsecurity_crs_10_setup template: src: modsecurity_crs_10_setup.conf.j2 - dest: "{{ HAPROXY_PATH }}/waf/rules/modsecurity_crs_10_setup.conf" + dest: "{{ SERVICE_PATH }}/waf/rules/modsecurity_crs_10_setup.conf" - name: Create WAF service file template: @@ -310,12 +306,12 @@ - name: Create WAF conf file template: src: waf.conf.j2 - dest: "{{ HAPROXY_PATH }}/waf.conf" + dest: "{{ SERVICE_PATH }}/waf.conf" mode: 0644 - name: Insert Modsec backend blockinfile: - path: "{{ HAPROXY_PATH }}/haproxy.cfg" + path: "{{ SERVICE_PATH }}/haproxy.cfg" block: | backend waf mode tcp @@ -342,7 +338,6 @@ with_items: - /tmp/modsecurity.tar.gz - "{{ mod_sec_dir }}" - - "/tmp/haproxy-{{ VERSION }}" - /tmp/owasp.tar.gz - /tmp/owasp-modsecurity-crs-2.2.9 - /tmp/spoa-modsecurity diff --git a/app/scripts/ansible/roles/waf_nginx.yml b/app/scripts/ansible/roles/waf_nginx.yml index b99fa788..5d5cb73e 100644 --- a/app/scripts/ansible/roles/waf_nginx.yml +++ b/app/scripts/ansible/roles/waf_nginx.yml @@ -1,6 +1,6 @@ --- - name: Install WAF - hosts: "{{ variable_host }}" + hosts: all become: yes become_method: sudo gather_facts: yes diff --git a/app/scripts/ansible/roles/waf_nginx/tasks/main.yml b/app/scripts/ansible/roles/waf_nginx/tasks/main.yml index 008b3069..6e48f195 100644 --- a/app/scripts/ansible/roles/waf_nginx/tasks/main.yml +++ b/app/scripts/ansible/roles/waf_nginx/tasks/main.yml @@ -1,13 +1,9 @@ --- - name: Installing WAF block: - - name: Set SSH port - set_fact: - ansible_port: "{{SSH_PORT}}" - - name: Check that WAF has been installed stat: - path: "{{ NGINX_PATH }}/waf/modsecurity.conf" + path: "{{ SERVICE_PATH }}/waf/modsecurity.conf" register: stat_result - name: Fail if has been installed @@ -149,7 +145,7 @@ - name: Enable module for Ubuntu lineinfile: - path: "{{ NGINX_PATH }}/nginx.conf" + path: "{{ SERVICE_PATH }}/nginx.conf" line: load_module modules/ngx_http_modsecurity_module.so; insertbefore: BOF when: ansible_facts['os_family'] == 'Debian' or ansible_facts['os_family'] == 'Ubuntu' @@ -157,29 +153,29 @@ - name: Create WAF directory become: false file: - path: "{{ NGINX_PATH }}/waf/" + path: "{{ SERVICE_PATH }}/waf/" state: directory - name: Create WAF rules directory become: false file: - path: "{{ NGINX_PATH }}/waf/rules" + path: "{{ SERVICE_PATH }}/waf/rules" state: directory - name: Download modsecurity.conf ansible.builtin.get_url: url: https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended - dest: "{{ NGINX_PATH }}/waf/modsecurity.conf" + dest: "{{ SERVICE_PATH }}/waf/modsecurity.conf" - name: Download unicode.mapping ansible.builtin.get_url: url: https://github.com/SpiderLabs/ModSecurity/blob/v3/master/unicode.mapping - dest: "{{ NGINX_PATH }}/waf/unicode.mapping" + dest: "{{ SERVICE_PATH }}/waf/unicode.mapping" - name: Create WAF config template: src: waf.conf.j2 - dest: "{{ NGINX_PATH }}/waf/waf.conf" + dest: "{{ SERVICE_PATH }}/waf/waf.conf" - name: Download OWASP rules ansible.builtin.get_url: @@ -196,16 +192,16 @@ - name: Copy Modsec crs activated_rules files copy: src: "/tmp/coreruleset-{{ coreruleset_ver }}/rules/" - dest: "{{ NGINX_PATH }}/waf/rules/" + dest: "{{ SERVICE_PATH }}/waf/rules/" remote_src: yes - name: Copy module become: true - command: "chdir=/tmp/coreruleset-{{ coreruleset_ver }} cp crs-setup.conf.example {{ NGINX_PATH }}/waf/rulescrs-setup.conf" + command: "chdir=/tmp/coreruleset-{{ coreruleset_ver }} cp crs-setup.conf.example {{ SERVICE_PATH }}/waf/rulescrs-setup.conf" - name: Add waf Mod on ansible.builtin.blockinfile: - path: "{{ NGINX_PATH }}/nginx.conf" + path: "{{ SERVICE_PATH }}/nginx.conf" marker: "#-- {mark} WAF BLOCK --#" insertafter: "http {" block: | diff --git a/app/scripts/waf.sh b/app/scripts/waf.sh deleted file mode 100644 index eb4bda01..00000000 --- a/app/scripts/waf.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash - -for ARGUMENT in "$@" -do - KEY=$(echo "$ARGUMENT" | cut -f1 -d=) - VALUE=$(echo "$ARGUMENT" | cut -f2 -d=) - - case "$KEY" in - PROXY) PROXY=${VALUE} ;; - VERSION) VERSION=${VALUE} ;; - HAPROXY_PATH) HAPROXY_PATH=${VALUE} ;; - HOST) HOST=${VALUE} ;; - USER) USER=${VALUE} ;; - PASS) PASS=${VALUE} ;; - KEY) KEY=${VALUE} ;; - SSH_PORT) SSH_PORT=${VALUE} ;; - *) - esac -done -VERSION=$(echo "$VERSION"| awk -F"-" '{print $1}') -VERSION_MAJ=$(echo "$VERSION" | awk -F"." '{print $1"."$2}') - -if (( $(awk 'BEGIN {print ("'$VERSION_MAJ'" < "'1.8'")}') )); then - echo 'error: Need HAProxy version 1.8 or later' - exit 1 -fi - -export ANSIBLE_HOST_KEY_CHECKING=False -export ANSIBLE_DISPLAY_SKIPPED_HOSTS=False -export ACTION_WARNINGS=False -export LOCALHOST_WARNING=False -export COMMAND_WARNINGS=False - -PWD=/var/www/haproxy-wi/app/scripts/ansible/ -echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST - -if [[ $KEY == "" ]]; then - ansible-playbook $PWD/roles/waf.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST PROXY=$PROXY HAPROXY_PATH=$HAPROXY_PATH VERSION=$VERSION VERSION_MAJ=$VERSION_MAJ SSH_PORT=$SSH_PORT" -i $PWD/$HOST -else - ansible-playbook $PWD/roles/waf.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY HAPROXY_PATH=$HAPROXY_PATH VERSION=$VERSION VERSION_MAJ=$VERSION_MAJ SSH_PORT=$SSH_PORT" -i $PWD/$HOST -fi - -if [ $? -gt 0 ] -then - echo "error: Cannot install WAF" - exit 1 -else - echo "success" -fi -rm -f $PWD/$HOST diff --git a/app/scripts/waf_nginx.sh b/app/scripts/waf_nginx.sh deleted file mode 100644 index 31b7a9ef..00000000 --- a/app/scripts/waf_nginx.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -for ARGUMENT in "$@" -do - KEY=$(echo "$ARGUMENT" | cut -f1 -d=) - VALUE=$(echo "$ARGUMENT" | cut -f2 -d=) - - case "$KEY" in - PROXY) PROXY=${VALUE} ;; - NGINX_PATH) NGINX_PATH=${VALUE} ;; - HOST) HOST=${VALUE} ;; - USER) USER=${VALUE} ;; - PASS) PASS=${VALUE} ;; - KEY) KEY=${VALUE} ;; - SSH_PORT) SSH_PORT=${VALUE} ;; - *) - esac -done - - -export ANSIBLE_HOST_KEY_CHECKING=False -export ANSIBLE_DISPLAY_SKIPPED_HOSTS=False -export ACTION_WARNINGS=False -export LOCALHOST_WARNING=False -export COMMAND_WARNINGS=False - -PWD=/var/www/haproxy-wi/app/scripts/ansible/ -echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST - -if [[ $KEY == "" ]]; then - ansible-playbook $PWD/roles/waf_nginx.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST PROXY=$PROXY NGINX_PATH=$NGINX_PATH SSH_PORT=$SSH_PORT" -i $PWD/$HOST -else - ansible-playbook $PWD/roles/waf_nginx.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY NGINX_PATH=$NGINX_PATH SSH_PORT=$SSH_PORT" -i $PWD/$HOST -fi - -if [ $? -gt 0 ] -then - echo "error: Cannot install WAF" - exit 1 -else - echo "success" -fi -rm -f $PWD/$HOST diff --git a/app/static/css/style-6.3.9.css b/app/static/css/style-6.3.9.css index f44de93a..ce01cd31 100644 --- a/app/static/css/style-6.3.9.css +++ b/app/static/css/style-6.3.9.css @@ -109,6 +109,11 @@ pre { font-size: 12px; z-index: 99; } +.menu-active { + padding-left: 30px; + background-color: var(--right-menu-blue-rolor) !important; + border-left: 4px solid var(--right-menu-blue-rolor); +} .logoText { color: #EBF1F1; font-size: 25px; diff --git a/app/static/js/backup.js b/app/static/js/backup.js index a6740cfb..593b8b71 100644 --- a/app/static/js/backup.js +++ b/app/static/js/backup.js @@ -335,6 +335,16 @@ function cloneBackup(id) { $('#backup-credentials').val($('#backup-credentials-'+id+' option:selected').val()).change() $('#backup-credentials').selectmenu("refresh"); } +function cloneS3Backup(id) { + $( "#add-backup-s3-button" ).trigger( "click" ); + $('#s3_server').val($('#s3-server-'+id).text()) + $('#s3_bucket').val($('#bucket-'+id).text()) + $('#s3-backup-description').val($('#s3-backup-description--'+id).text()) + $('#s3-backup-server').val($('#backup-s3-server-'+id).text()).change(); + $('#s3-backup-server').selectmenu("refresh"); + $('#s3-backup-time').val($('#s3-backup-time-'+id).text()).change(); + $('#s3-backup-time').selectmenu("refresh"); +} function removeBackup(id) { $("#backup-table-" + id).css("background-color", "#f2dede"); $.ajax({ diff --git a/inc/nettools.js b/app/static/js/nettools.js similarity index 83% rename from inc/nettools.js rename to app/static/js/nettools.js index 733a548f..4041b7db 100644 --- a/inc/nettools.js +++ b/app/static/js/nettools.js @@ -143,4 +143,33 @@ $( function() { }); event.preventDefault(); }); + $("#nettools_whois_form").on("click", ":submit", function (e) { + $('#ajax-nettools').html(''); + var frm = $('#nettools_whois_form'); + if ($('#nettools_whois_name').val() == '') { + toastr.warning('Enter a Domain name'); + return false; + } + $.ajax({ + url: frm.attr('action'), + data: frm.serialize() + "&nettools_action=" + $(this).val(), + type: frm.attr('method'), + dataType: 'text', + success: function (data) { + data = data.replaceAll('"', ''); + if (data.indexOf('error: ') != '-1' || data.indexOf('Fatal') != '-1' || data.indexOf('Error(s)') != '-1') { + toastr.clear(); + toastr.error(data); + } else if (data.indexOf('warning: ') != '-1') { + toastr.clear(); + toastr.warning(data) + } else { + toastr.clear(); + console.log(data) + $('#ajax-nettools').html('
' + data + '
'); + } + } + }); + event.preventDefault(); + }); }); diff --git a/app/templates/ajax/alerts_history.html b/app/templates/ajax/alerts_history.html index 50efd896..13b21e7c 100644 --- a/app/templates/ajax/alerts_history.html +++ b/app/templates/ajax/alerts_history.html @@ -41,7 +41,7 @@ {% if smon != '' %} {% for t in smon %} - {% set date_time = t.4|string %} +{# {% set date_time = t.4|string %}#} {% if t.1 == 'info' %} @@ -64,9 +64,9 @@ {{t.3}} {% endif %} {{t.0}} - {{date_time.split(' ')[0]}} + {{t.4|strftime('%Y %m %d')}} - {{date_time.split(' ')[1]}} + {{t.4|strftime('%H:%M:%S')}} {% endfor %} {% else %} diff --git a/app/templates/ajax/load_services.html b/app/templates/ajax/load_services.html index 3e73ac52..9a7613f5 100644 --- a/app/templates/ajax/load_services.html +++ b/app/templates/ajax/load_services.html @@ -22,7 +22,6 @@ {% set is_service_stopped_title = lang.words.stop|title()+" "+lang.words.and+" "+lang.words.disable+" "+services_name[service.0]['name']+" "+lang.words.service %} - {{ service }} {% if service.1 == 'active' or service.1 == 'RUNNING' %} {% set is_service_started_class = 'disabled-button' %} diff --git a/app/templates/ajax/show_list_version.html b/app/templates/ajax/show_list_version.html index c28c5b98..0418884c 100644 --- a/app/templates/ajax/show_list_version.html +++ b/app/templates/ajax/show_list_version.html @@ -101,7 +101,7 @@ {% endif %} - {{c.date}} + {{c.date|strftime}} diff --git a/app/templates/ajax/smon/check.html b/app/templates/ajax/smon/check.html index 9b78938e..d641f365 100644 --- a/app/templates/ajax/smon/check.html +++ b/app/templates/ajax/smon/check.html @@ -5,10 +5,10 @@ {% if s.smon_id.en == 1 %} {% if s.smon_id.status == 1 and s.smon_id.body_status == 1 %} {% set additional_classes = 'good div-server-head-up' %} - {% set uptime_desc = lang.words.uptime + ': ' %} + {% set uptime_desc = lang.words.uptime + ': ' %} {% elif s.smon_id.status == 0 or s.smon_id.body_status == 0 %} {% set additional_classes = 'err div-server-head-down' %} - {% set uptime_desc = lang.words.downtime + ': ' %} + {% set uptime_desc = lang.words.downtime + ': ' %} {% else %} {% set additional_classes = 'err div-server-head-unknown' %} {% set uptime_desc = lang.words.uptime + ': N/A' %} diff --git a/app/templates/ajax/smon/history_status.html b/app/templates/ajax/smon/history_status.html index a88c53a7..3b9088a5 100644 --- a/app/templates/ajax/smon/history_status.html +++ b/app/templates/ajax/smon/history_status.html @@ -5,5 +5,5 @@ {% else %} {% set add_class = 'serverDown' %} {% endif %} -
+
{% endfor %} diff --git a/app/templates/base.html b/app/templates/base.html index 4dd5680b..2cdc1146 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -89,7 +89,7 @@