diff --git a/api/api.py b/api/api.py index b1373f55..a39ab2ee 100644 --- a/api/api.py +++ b/api/api.py @@ -86,8 +86,8 @@ def index(): 'keepalived//config': 'get Keepalived config from a server by id or hostname or ip. METHOD: GET', 'keepalived//config': 'upload Keepalived config to a server by id or hostname or ip. Headers: action: save/reload/restart. Body must consist a whole Keepalived config. METHOD: POST', 'ha': 'HA clusters list. METHOD: GET', - 'ha': 'Create HA cluster. Body must be JSON: name: str, desc: str, cluster_id: 0, router_id: "", vip: str, servers: {server_id: dict:{eth: str, ip: str, name: str, master: int}}, service: dict: {{haproxy: int, docker: int}, {nginx: int, docker: int}}, virt_server: int, syn_flood: int, return_to_master: int. METHOD: POST', - 'ha': 'Edit HA cluster. Body must be JSON: name: str, desc: str, cluster_id: int, router_id: "", vip: str, servers: {server_id: dict:{eth: str, ip: str, name: str, master: int}}, service: dict: {{haproxy: int, docker: int}, {nginx: int, docker: int}}, virt_server: int, syn_flood: int, return_to_master: int. METHOD: PUT', + 'ha': 'Create HA cluster. Body must be JSON: name: str, desc: str, cluster_id: 0, router_id: "", vip: str, servers: {server_id: dict:{eth: str, ip: str, name: str, master: int}}, service: dict: {{haproxy: int, docker: int}, {nginx: int, docker: int}}, virt_server: int, syn_flood: int, return_to_master: int, use_src: int. METHOD: POST', + 'ha': 'Edit HA cluster. Body must be JSON: name: str, desc: str, cluster_id: int, router_id: "", vip: str, servers: {server_id: dict:{eth: str, ip: str, name: str, master: int}}, service: dict: {{haproxy: int, docker: int}, {nginx: int, docker: int}}, virt_server: int, syn_flood: int, return_to_master: int, use_src: int. METHOD: PUT', 'ha': 'Delete HA cluster. Body must be JSON: cluster_id: int. METHOD: DELETE', } return dict(help=data) diff --git a/app/create_db.py b/app/create_db.py index 9b5ee494..ee184cc8 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -467,38 +467,6 @@ def update_db_v_4_3_0(): print("An error occurred:", e) -def update_db_v_6_3_11(): - cursor = conn.cursor() - sql = """ - ALTER TABLE `smon` ADD COLUMN pd_channel_id integer default 0; - """ - try: - cursor.execute(sql) - except Exception as e: - if e.args[0] == 'duplicate column name: pd_channel_id' or str(e) == '(1060, "Duplicate column name \'pd_channel_id\'")': - print('Updating... DB has been updated to version 6.3.11') - else: - print("An error occurred:", e) - else: - print("Updating... DB has been updated to version 6.3.11") - - -def update_db_v_6_3_13(): - cursor = conn.cursor() - sql = """ - ALTER TABLE `smon` ADD COLUMN check_type VARCHAR ( 64 ) DEFAULT 'tcp'; - """ - try: - cursor.execute(sql) - except Exception as e: - if e.args[0] == 'duplicate column name: check_type' or str(e) == '(1060, "Duplicate column name \'check_type\'")': - print('Updating... DB has been updated to version 6.3.13') - else: - print("An error occurred:", e) - else: - print("Updating... DB has been updated to version 6.3.13") - - def update_db_v_6_3_13_1(): try: SmonTcpCheck.insert_from( @@ -656,7 +624,6 @@ 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: @@ -676,9 +643,26 @@ def update_db_v_7_2_3(): print("An error occurred:", e) +def update_db_v_7_3_1(): + try: + if mysql_enable: + migrate( + migrator.add_column('ha_cluster_vips', 'use_src', IntegerField(default=0)), + ) + else: + migrate( + migrator.add_column('ha_cluster_vips', 'use_src', IntegerField(constraints=[SQL('DEFAULT 0')])), + ) + except Exception as e: + if e.args[0] == 'duplicate column name: use_src' or str(e) == '(1060, "Duplicate column name \'use_src\'")': + print('Updating... DB has been updated to version 7.3.1') + else: + print("An error occurred:", e) + + def update_ver(): try: - Version.update(version='7.3.0.0').execute() + Version.update(version='7.3.1.0').execute() except Exception: print('Cannot update version') @@ -696,8 +680,6 @@ def update_all(): if check_ver() is None: update_db_v_3_4_5_22() update_db_v_4_3_0() - update_db_v_6_3_11() - update_db_v_6_3_13() update_db_v_6_3_13_1() update_db_v_6_3_13_2() update_db_v_6_3_13_3() @@ -710,6 +692,7 @@ def update_all(): update_db_v_7_2_0() update_db_v_7_2_0_1() update_db_v_7_2_3() + update_db_v_7_3_1() update_ver() diff --git a/app/modules/db/db_model.py b/app/modules/db/db_model.py index 0d797106..7ee38d3e 100644 --- a/app/modules/db/db_model.py +++ b/app/modules/db/db_model.py @@ -728,6 +728,7 @@ class HaClusterVip(BaseModel): router_id = ForeignKeyField(HaClusterRouter, on_delete='Cascade') return_master = IntegerField(constraints=[SQL('DEFAULT "0"')]) vip = CharField() + use_src = IntegerField(constraints=[SQL('DEFAULT "0"')]) class Meta: table_name = 'ha_cluster_vips' diff --git a/app/modules/db/ha_cluster.py b/app/modules/db/ha_cluster.py index 9c63f2c5..295f18ba 100644 --- a/app/modules/db/ha_cluster.py +++ b/app/modules/db/ha_cluster.py @@ -40,23 +40,16 @@ def select_clusters_virts(): out_error(e) -def select_cluster_vips(cluster_id: int) -> object: +def select_cluster_vips(cluster_id: int) -> HaClusterVip: try: return HaClusterVip.select().where(HaClusterVip.cluster_id == cluster_id).execute() except Exception as e: out_error(e) -def select_clusters_vip(cluster_id: int, router_id: int): +def select_cluster_vip(cluster_id: int, router_id: int) -> HaClusterVip: try: - return HaClusterVip.get((HaClusterVip.cluster_id == cluster_id) & (HaClusterVip.router_id == router_id)).vip - except Exception as e: - out_error(e) - - -def select_clusters_vip_return_master(cluster_id: int, router_id: int): - try: - return HaClusterVip.get((HaClusterVip.cluster_id == cluster_id) & (HaClusterVip.router_id == router_id)).return_master + return HaClusterVip.get((HaClusterVip.cluster_id == cluster_id) & (HaClusterVip.router_id == router_id)) except Exception as e: out_error(e) @@ -160,6 +153,13 @@ def get_router_id(cluster_id: int, default_router=0) -> int: out_error(e) +def get_router(router_id: int) -> HaClusterRouter: + try: + return HaClusterRouter.get(HaClusterRouter.id == router_id) + except Exception as e: + out_error(e) + + def create_ha_router(cluster_id: int) -> int: """ Create HA Router @@ -211,9 +211,9 @@ def update_cluster(cluster_id: int, name: str, desc: str, syn_flood: int) -> Non out_error(e) -def update_ha_cluster_vip(cluster_id: int, router_id: int, vip: str, return_master: int) -> None: +def update_ha_cluster_vip(cluster_id: int, router_id: int, vip: str, return_master: int, use_src: int) -> None: try: - HaClusterVip.update(vip=vip, return_master=return_master).where((HaClusterVip.cluster_id == cluster_id) & (HaClusterVip.router_id == router_id)).execute() + HaClusterVip.update(vip=vip, return_master=return_master, use_src=use_src).where((HaClusterVip.cluster_id == cluster_id) & (HaClusterVip.router_id == router_id)).execute() except Exception as e: out_error(e) diff --git a/app/modules/service/backup.py b/app/modules/service/backup.py index 1e180430..66eb5646 100644 --- a/app/modules/service/backup.py +++ b/app/modules/service/backup.py @@ -71,40 +71,35 @@ def backup(serv, rpath, time, backup_type, rserver, cred, deljob, update, descri def s3_backup(server, s3_server, bucket, secret_key, access_key, time, deljob, description) -> str: - script = 's3_backup.sh' - tag = 'add' - full_path = '/var/www/haproxy-wi/app' - if deljob: time = '' secret_key = '' access_key = '' tag = 'delete' else: + tag = 'add' if backup_sql.check_exists_s3_backup(server): raise Exception(f'error: Backup job for {server} already exists') - os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") - - commands = [ - f"chmod +x {full_path}/{script} && {full_path}/{script} SERVER={server} S3_SERVER={s3_server} BUCKET={bucket} " - f"SECRET_KEY={secret_key} ACCESS_KEY={access_key} TIME={time} TAG={tag}" - ] - - return_out = server_mod.subprocess_execute_with_rc(commands[0]) + inv = {"server": {"hosts": {}}} + inv["server"]["hosts"]["localhost"] = { + "SERVER": server, + "S3_SERVER": s3_server, + "BUCKET": bucket, + "SECRET_KEY": secret_key, + "ACCESS_KEY": access_key, + "TIME": time, + "action": tag + } try: - os.remove(f'{full_path}/{script}') - except Exception: - pass + installation_mod.run_ansible(inv, [], 's3_backup') + except Exception as e: + raise Exception(f'error: {e}') if not deljob: try: - if installation_mod.show_installation_output(return_out['error'], return_out['output'], 'S3 backup', rc=return_out['rc']): - try: - backup_sql.insert_s3_backup_job(server, s3_server, bucket, secret_key, access_key, time, description) - except Exception as e: - raise Exception(f'error: {e}') + backup_sql.insert_s3_backup_job(server, s3_server, bucket, secret_key, access_key, time, description) except Exception as e: raise Exception(e) roxywi_common.logging('backup ', f' a new S3 backup job for server {server} has been created', roxywi=1, login=1) diff --git a/app/modules/service/ha_cluster.py b/app/modules/service/ha_cluster.py index d3795566..8cd17c5c 100644 --- a/app/modules/service/ha_cluster.py +++ b/app/modules/service/ha_cluster.py @@ -72,7 +72,7 @@ def create_cluster(cluster: json, group_id: int) -> str: return str(cluster_id) -def update_cluster(cluster: json, group_id: int) -> str: +def update_cluster(cluster: json, group_id: int) -> None: cluster_id = int(cluster['cluster_id']) syn_flood = int(cluster['syn_flood']) cluster_name = common.checkAjaxInput(cluster['name']) @@ -114,8 +114,6 @@ def update_cluster(cluster: json, group_id: int) -> str: roxywi_common.logging(cluster_id, f'Cluster {cluster_name} has been updated', keep_history=1, roxywi=1, service='HA cluster') - return 'ok' - def delete_cluster(cluster_id: int) -> str: router_id = ha_sql.get_router_id(cluster_id, default_router=1) @@ -136,11 +134,12 @@ def delete_cluster(cluster_id: int) -> str: def update_vip(cluster_id: int, router_id: int, json_data: json, group_id: int) -> None: return_master = int(json_data['return_to_master']) + use_src = int(json_data['use_src']) vip = common.is_ip_or_dns(json_data['vip']) vip_id = ha_sql.select_clusters_vip_id(cluster_id, router_id) try: - ha_sql.update_ha_cluster_vip(cluster_id, router_id, vip, return_master) + ha_sql.update_ha_cluster_vip(cluster_id, router_id, vip, return_master, use_src) except Exception as e: raise Exception(f'error: Cannot update VIP: {e}') diff --git a/app/modules/service/installation.py b/app/modules/service/installation.py index c4095459..be5b4528 100644 --- a/app/modules/service/installation.py +++ b/app/modules/service/installation.py @@ -17,24 +17,6 @@ import app.modules.roxywi.common as roxywi_common from app.modules.server.ssh import return_ssh_keys_path -def show_installation_output(error: str, output: list, service: str, rc=0): - if error and "WARNING" not in error: - roxywi_common.logging('Roxy-WI server', error, roxywi=1) - raise Exception('error: ' + error) - else: - if rc != 0: - for line in output: - if any(s in line for s in ("Traceback", "FAILED", "error", "ERROR", "UNREACHABLE")): - try: - correct_out = line.split('=>') - correct_out = json.loads(correct_out[1]) - except Exception: - raise Exception(f'error: {output} for {service}') - else: - raise Exception(f'error: {correct_out["msg"]} for {service}') - return True - - def generate_udp_inv(listener_id: int, action: str) -> object: inv = {"server": {"hosts": {}}} server_ips = [] @@ -97,6 +79,7 @@ def generate_kp_inv(json_data: json, installed_service) -> object: routers[router_id] = {} routers[router_id].setdefault('return_master', vip.return_master) routers[router_id].setdefault('vip', vip.vip) + routers[router_id].setdefault('use_src', vip.use_src) slaves = ha_sql.select_cluster_slaves_for_inv(router_id) for slave in slaves: slave_ip = server_sql.select_server_ip_by_id(str(slave.server_id)) @@ -144,12 +127,9 @@ def generate_haproxy_inv(json_data: json, installed_service: str) -> object: stats_password = sql.get_setting('haproxy_stats_password') haproxy_dir = sql.get_setting('haproxy_dir') container_name = sql.get_setting('haproxy_container_name') - haproxy_ver = '' + haproxy_ver = '2.9.6-1' is_docker = json_data['services']['haproxy']['docker'] - if haproxy_ver == '': - haproxy_ver = '2.8.1-1' - for k, v in json_data['servers'].items(): if not v['master']: slaves.append(v['ip']) @@ -346,10 +326,10 @@ def service_actions_after_install(server_ips: str, service: str, json_data) -> N def install_service(service: str, json_data: str) -> object: - try: - json_data = json.loads(json_data) - except Exception as e: - roxywi_common.handle_exceptions(e, 'Roxy-WI server', 'Cannot parse JSON', roxywi=1) + # try: + # json_data = json.loads(json_data) + # except Exception as e: + # roxywi_common.handle_exceptions(e, 'Roxy-WI server', 'Cannot parse JSON', roxywi=1) generate_functions = { 'haproxy': generate_haproxy_inv, @@ -368,7 +348,7 @@ def install_service(service: str, json_data: str) -> object: def _install_ansible_collections(): old_ansible_server = '' - collections = ('community.general', 'ansible.posix', 'community.docker', 'community.grafana') + collections = ('community.general', 'ansible.posix', 'community.docker', 'community.grafana', 'ansible.netcommon') trouble_link = 'Read troubleshooting' for collection in collections: if not os.path.isdir(f'/usr/share/httpd/.ansible/collections/ansible_collections/{collection.replace(".", "/")}'): diff --git a/app/routes/ha/routes.py b/app/routes/ha/routes.py index bc586e5f..bd9c203e 100644 --- a/app/routes/ha/routes.py +++ b/app/routes/ha/routes.py @@ -1,7 +1,6 @@ -import json - from flask import render_template, g, request, jsonify from flask_login import login_required +from playhouse.shortcuts import model_to_dict from app.routes.ha import bp from app.middleware import get_user_params, check_services @@ -36,25 +35,27 @@ def cluster_function(service): return render_template('ha_cluster.html', **kwargs) elif request.method == 'PUT': - cluster = json.loads(request.form.get('jsonData')) + cluster = request.get_json() try: - return ha_cluster.update_cluster(cluster, group_id) + ha_cluster.update_cluster(cluster, group_id) + return jsonify({'status': 'updated'}) except Exception as e: - return f'{e}' + return jsonify({'status': 'failed', 'error': f'Cannot update the cluster: {e}'}) elif request.method == 'POST': - cluster = json.loads(request.form.get('jsonData')) + cluster = request.get_json() try: - return ha_cluster.create_cluster(cluster, group_id) + cluster_id = ha_cluster.create_cluster(cluster, group_id) + return jsonify({'status': 'created', 'cluster_id': cluster_id}) except Exception as e: - return f'{e}' + return jsonify({'status': 'failed', 'error': f'Cannot create a cluster: {e}'}) elif request.method == 'DELETE': cluster_id = int(request.form.get('cluster_id')) try: return ha_cluster.delete_cluster(cluster_id) except Exception as e: - return f'{e}' + return jsonify({'status': 'failed', 'error': f'Cannot delete the cluster: {e}'}) @bp.route('//get/') @@ -87,17 +88,16 @@ def get_cluster_settings(service, cluster_id): router_id = ha_sql.get_router_id(cluster_id, default_router=1) slaves = ha_sql.select_cluster_slaves(cluster_id, router_id) cluster_services = ha_sql.select_cluster_services(cluster_id) - vip = ha_sql.select_clusters_vip(cluster_id, router_id) - return_master = ha_sql.select_clusters_vip_return_master(cluster_id, router_id) - vip_id = ha_sql.select_clusters_vip_id(cluster_id, router_id) - is_virt = ha_sql.check_ha_virt(vip_id) + vip = ha_sql.select_cluster_vip(cluster_id, router_id) + is_virt = ha_sql.check_ha_virt(vip.id) for cluster in clusters: settings.setdefault('name', cluster.name) settings.setdefault('desc', cluster.desc) - settings.setdefault('return_to_master', return_master) + settings.setdefault('return_to_master', vip.return_master) settings.setdefault('syn_flood', cluster.syn_flood) - settings.setdefault('vip', vip) + settings.setdefault('vip', vip.vip) settings.setdefault('virt_server', is_virt) + settings.setdefault('use_src', vip.use_src) for slave in slaves: if slave[31]: @@ -219,10 +219,10 @@ def get_masters(service): @check_services def get_vip_settings(service, cluster_id, router_id): settings = {} - return_master = ha_sql.select_clusters_vip_return_master(cluster_id, router_id) - vip_id = ha_sql.select_clusters_vip_id(cluster_id, router_id) - is_virt = ha_sql.check_ha_virt(vip_id) - settings.setdefault('return_to_master', return_master) + vip = ha_sql.select_cluster_vip(cluster_id, router_id) + is_virt = ha_sql.check_ha_virt(vip.id) + settings.setdefault('return_to_master', vip.return_master) + settings.setdefault('use_src', vip.use_src) settings.setdefault('virt_server', is_virt) return jsonify(settings) @@ -233,35 +233,37 @@ def get_vip_settings(service, cluster_id, router_id): def ha_vip(service, cluster_id): user_params = g.user_params group_id = user_params['group_id'] - json_data = json.loads(request.form.get('jsonData')) + json_data = request.get_json() if request.method == 'PUT': router_id = int(json_data['router_id']) try: ha_cluster.update_vip(cluster_id, router_id, json_data, group_id) except Exception as e: - return f'{e}' - return 'ok' + return jsonify({'status': 'failed', 'error': f'Cannot update VIP: {e}'}) + return jsonify({'status': 'updated'}) elif request.method == 'POST': try: ha_cluster.insert_vip(cluster_id, json_data, group_id) except Exception as e: - return f'{e}' + return jsonify({'status': 'failed', 'error': f'Cannot create VIP: {e}'}) - return 'ok' + return jsonify({'status': 'created'}) elif request.method == 'DELETE': router_id = int(json_data['router_id']) + router = ha_sql.get_router(router_id) + if router.default: + return jsonify({'status': 'failed', 'error': 'You cannot delete default VIP'}) try: ha_sql.delete_ha_router(router_id) - return 'ok' + return jsonify({'status': 'deleted'}) except Exception as e: - return f'error: Cannot delete VIP: {e}' + return jsonify({'status': 'failed', 'error': f'Cannot delete VIP: {e}'}) @bp.route('///vips', methods=['GET']) @check_services @get_user_params() def get_vips(service, cluster_id): - from playhouse.shortcuts import model_to_dict if request.method == 'GET': vips = ha_sql.select_cluster_vips(cluster_id) vips = [model_to_dict(vip) for vip in vips] diff --git a/app/routes/install/routes.py b/app/routes/install/routes.py index ecebc517..76a7c8fe 100644 --- a/app/routes/install/routes.py +++ b/app/routes/install/routes.py @@ -1,4 +1,4 @@ -from flask import render_template, request, g +from flask import render_template, request, g, jsonify from flask_login import login_required from app.routes.install import bp @@ -35,11 +35,11 @@ def install_monitoring(): @bp.post('/') @check_services def install_service(service): - json_data = request.form.get('jsonData') + json_data = request.get_json() try: return service_mod.install_service(service, json_data) except Exception as e: - return f'{e}' + return jsonify({'status': 'failed', 'error': f'{e}'}) @bp.route('//version/') @@ -55,17 +55,18 @@ def get_service_version(service, server_ip): @bp.post('/exporter/') def install_exporter(exporter): - server_ip = common.is_ip_or_dns(request.form.get('server_ip')) - ver = common.checkAjaxInput(request.form.get('exporter_v')) - ext_prom = common.checkAjaxInput(request.form.get('ext_prom')) + json_data = request.get_json() + server_ip = common.is_ip_or_dns(json_data['server_ip']) + ver = common.checkAjaxInput(json_data['exporter_v']) + ext_prom = common.checkAjaxInput(json_data['ext_prom']) if exporter not in ('haproxy', 'nginx', 'apache', 'keepalived', 'node'): - return 'error: Wrong exporter' + return jsonify({'status': 'failed', 'error': 'Wrong exporter'}) try: return exp_installation.install_exporter(server_ip, ver, ext_prom, exporter) except Exception as e: - return f'{e}' + return jsonify({'status': 'failed', 'error': f'Cannot install {exporter.title()} exporter: {e}'}) @bp.route('/exporter//version/') @@ -90,41 +91,42 @@ def install_waf(service, server_ip): try: inv, server_ips = service_mod.generate_waf_inv(server_ip, service) except Exception as e: - return f'error: Cannot create inventory: {e}' + return jsonify({'status': 'failed', 'error': f'Cannot create inventory: {e}'}) try: ansible_status = service_mod.run_ansible(inv, server_ips, f'waf_{service}'), 201 except Exception as e: - return f'error: Cannot install WAF: {e}' + return jsonify({'status': 'failed', 'error': f'Cannot install WAF: {e}'}) if service == 'haproxy': try: waf_sql.insert_waf_metrics_enable(server_ip, "0") waf_sql.insert_waf_rules(server_ip) except Exception as e: - return str(e) + return jsonify({'status': 'failed', 'error': f'Cannot enable WAF: {e}'}) elif service == 'nginx': try: waf_sql.insert_nginx_waf_rules(server_ip) waf_sql.insert_waf_nginx_server(server_ip) except Exception as e: - return str(e) + return jsonify({'status': 'failed', 'error': f'Cannot enable WAF: {e}'}) else: - return 'error: Wrong service' + return jsonify({'status': 'failed', 'error': 'Wrong service'}) return ansible_status @bp.post('/geoip') def install_geoip(): - server_ip = common.is_ip_or_dns(request.form.get('server_ip')) - geoip_update = common.checkAjaxInput(request.form.get('update')) - service = request.form.get('service') + json_data = request.get_json() + server_ip = common.is_ip_or_dns(json_data['server_ip']) + geoip_update = common.checkAjaxInput(json_data['update']) + service = common.checkAjaxInput(json_data['service']) try: inv, server_ips = service_mod.generate_geoip_inv(server_ip, service, geoip_update) return service_mod.run_ansible(inv, server_ips, f'{service}_geoip'), 201 except Exception as e: - return f'{e}' + return jsonify({'status': 'failed', 'error': f'Cannot install GeoIP: {e}'}) @bp.route('/geoip//') @@ -141,9 +143,10 @@ def check_geoip(service, server_ip): @bp.post('/udp') def install_udp(): - listener_id = int(request.form.get('listener_id')) + json_data = request.get_json() + listener_id = int(json_data['listener_id']) try: inv, server_ips = service_mod.generate_udp_inv(listener_id, 'install') return service_mod.run_ansible(inv, server_ips, f'udp'), 201 except Exception as e: - return f'{e}' + return jsonify({'status': 'failed', 'error': f'Cannot create listener: {e}'}) diff --git a/app/scripts/ansible/roles/keepalived/tasks/main.yml b/app/scripts/ansible/roles/keepalived/tasks/main.yml index 87628289..55d654aa 100644 --- a/app/scripts/ansible/roles/keepalived/tasks/main.yml +++ b/app/scripts/ansible/roles/keepalived/tasks/main.yml @@ -91,7 +91,7 @@ service: name: keepalived daemon_reload: yes - state: started + state: restarted enabled: yes ignore_errors: yes diff --git a/app/scripts/ansible/roles/keepalived/templates/keepalived.conf.j2 b/app/scripts/ansible/roles/keepalived/templates/keepalived.conf.j2 index aacd2699..7a01f7c9 100644 --- a/app/scripts/ansible/roles/keepalived/templates/keepalived.conf.j2 +++ b/app/scripts/ansible/roles/keepalived/templates/keepalived.conf.j2 @@ -59,6 +59,20 @@ vrrp_instance VI_{{router}} { virtual_ipaddress { {{vip.vip}} } + + {% if vip.use_src|string() == "1" %} + virtual_routes { + {% for k, slave in vip.items() %} + {% if k == ansible_host and slave is mapping %} + {{ (ansible_facts[slave.eth]["ipv4"]["address"] + "/" + ansible_facts[slave.eth]["ipv4"]["netmask"]) | ipaddr("0") }} dev {{ slave.eth }} src {{ vip.vip }} scope link table ha_cluster_{{ router }} + {% endif %} + {% endfor %} + } + + virtual_rules { + from {{vip.vip}}/32 table ha_cluster_{{ router }} priority 100 + } + {% endif %} } {% endfor %} # Managed by Roxy-WI do not edit this file. Use HA cluster configuration instead diff --git a/app/scripts/ansible/roles/s3_backup.yml b/app/scripts/ansible/roles/s3_backup.yml index f6f6186b..a7ebf941 100644 --- a/app/scripts/ansible/roles/s3_backup.yml +++ b/app/scripts/ansible/roles/s3_backup.yml @@ -1,4 +1,4 @@ -- hosts: 127.0.0.1 +- hosts: localhost connection: local become: yes become_method: sudo @@ -34,6 +34,7 @@ - hap_config - nginx_config - apache_config + when: action == "add" - name: Delete S3 Job tags: delete @@ -47,3 +48,4 @@ - hap_config - nginx_config - apache_config + when: action == "delete" diff --git a/app/scripts/s3_backup.sh b/app/scripts/s3_backup.sh deleted file mode 100644 index 8827d2e3..00000000 --- a/app/scripts/s3_backup.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -for ARGUMENT in "$@" -do - KEY=$(echo $ARGUMENT | cut -f1 -d=) - VALUE=$(echo $ARGUMENT | cut -f2 -d=) - - case "$KEY" in - SERVER) SERVER=${VALUE} ;; - S3_SERVER) S3_SERVER=${VALUE} ;; - BUCKET) BUCKET=${VALUE} ;; - SECRET_KEY) SECRET_KEY=${VALUE} ;; - ACCESS_KEY) ACCESS_KEY=${VALUE} ;; - TAG) TAG=${VALUE} ;; - TIME) TIME=${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/ - -ansible-playbook $PWD/roles/s3_backup.yml -e "SERVER=$SERVER S3_SERVER=$S3_SERVER BUCKET=$BUCKET SECRET_KEY=$SECRET_KEY ACCESS_KEY=$ACCESS_KEY TIME=$TIME" -t $TAG -i $PWD/$HOST - -if [ $? -gt 0 ] -then - echo "error: Cannot create a S3 backup job" - exit 1 -fi diff --git a/app/scripts/terraform/aws_instance.tf b/app/scripts/terraform/aws_instance.tf deleted file mode 100644 index 1071694a..00000000 --- a/app/scripts/terraform/aws_instance.tf +++ /dev/null @@ -1,17 +0,0 @@ -module "aws_module" { - source = "github.com/hap-wi/haproxy-wi-terraform-modules?ref=aws" - - region = var.region - instance_type = var.instance_type - public_ip = var.public_ip - floating_ip = var.floating_ip - volume_size = var.volume_size - volume_type = var.volume_type - delete_on_termination = var.delete_on_termination - name = var.name - os = var.os - ssh_key_name = var.ssh_key_name - firewall = var.firewall - AWS_ACCESS_KEY = var.AWS_ACCESS_KEY - AWS_SECRET_KEY = var.AWS_SECRET_KEY -} diff --git a/app/scripts/terraform/do_instance.tf b/app/scripts/terraform/do_instance.tf deleted file mode 100644 index ef2cf2c8..00000000 --- a/app/scripts/terraform/do_instance.tf +++ /dev/null @@ -1,16 +0,0 @@ -module "do_module" { - source = "github.com/hap-wi/haproxy-wi-terraform-modules?ref=digitalocean" - - region = var.region - size = var.size - private_networking = var.private_networking - floating_ip = var.floating_ip - ssh_key_name = var.ssh_key_name - name = var.name - os = var.os - ssh_ids = var.ssh_ids - firewall = var.firewall - backup = var.backup - monitoring = var.monitoring - token = var.token -} diff --git a/app/scripts/terraform/gcore_instance.tf b/app/scripts/terraform/gcore_instance.tf deleted file mode 100644 index be6c62d4..00000000 --- a/app/scripts/terraform/gcore_instance.tf +++ /dev/null @@ -1,18 +0,0 @@ -module "gcore_module" { - source = "github.com/hap-wi/haproxy-wi-terraform-modules?ref=gcore" - - region = var.region - instance_type = var.instance_type - network_type = var.network_type - network_name = var.network_name - volume_size = var.volume_size - delete_on_termination = var.delete_on_termination - volume_type = var.volume_type - name = var.name - os = var.os - ssh_key_name = var.ssh_key_name - firewall = var.firewall - username = var.username - password = var.password - project = var.project -} diff --git a/app/scripts/terraform/inventory b/app/scripts/terraform/inventory deleted file mode 100644 index 2fbb50c4..00000000 --- a/app/scripts/terraform/inventory +++ /dev/null @@ -1 +0,0 @@ -localhost diff --git a/app/scripts/terraform/templates/aws_vars_template.j2 b/app/scripts/terraform/templates/aws_vars_template.j2 deleted file mode 100644 index 4e8d80bd..00000000 --- a/app/scripts/terraform/templates/aws_vars_template.j2 +++ /dev/null @@ -1,17 +0,0 @@ -region = "{{region}}" -instance_type = "{{size}}" -public_ip = {% if public_ip == 'true' %}true{%else%}false{%endif%} - -floating_ip = {% if floating_ip == 'true' %}true{%else%}false{%endif%} - -delete_on_termination = {% if delete_on_termination == 'true' %}true{%else%}false{%endif%} - -volume_size = {{volume_size}} -volume_type = "{{volume_type}}" -name = "{{server_name}}" -os = "{{os}}" -ssh_key_name = "{{ssh_name}}" -firewall = {% if firewall == 'true' %}true{%else%}false{%endif%} - -AWS_ACCESS_KEY = "{{AWS_ACCESS_KEY}}" -AWS_SECRET_KEY = "{{AWS_SECRET_KEY}}" diff --git a/app/scripts/terraform/templates/do_vars_template.j2 b/app/scripts/terraform/templates/do_vars_template.j2 deleted file mode 100644 index d097d062..00000000 --- a/app/scripts/terraform/templates/do_vars_template.j2 +++ /dev/null @@ -1,21 +0,0 @@ -region = "{{region}}" -size = "{{size}}" -private_networking = {% if privet_net == 'true' %}true{%else%}false{%endif%} - -floating_ip = {% if floating_ip == 'true' %}true{%else%}false{%endif%} - -name = "{{server_name}}" -os = "{{os}}" -ssh_key_name = "{{ssh_name}}" -ssh_ids = [{% if ssh_ids != 'None' %}{% for s in ssh_ids.split(',') %}{% if s != '' %}"{{s}}",{% endif %}{% endfor %}{% endif %}] - -firewall = {% if firewall == 'true' %}true{%else%}false{%endif%} - -backup = {% if backup == 'true' %}true{%else%}false{%endif%} - -privet_net = {% if privet_net == 'true' %}true{%else%}false{%endif%} - -monitoring = {% if monitoring == 'true' %}true{%else%}false{%endif%} - -token = "{{token}}" - diff --git a/app/scripts/terraform/templates/gcore_vars_template.j2 b/app/scripts/terraform/templates/gcore_vars_template.j2 deleted file mode 100644 index a4aea93b..00000000 --- a/app/scripts/terraform/templates/gcore_vars_template.j2 +++ /dev/null @@ -1,17 +0,0 @@ -region = {{region}} -instance_type = "{{size}}" -project = "{{project}}" -network_name = "{{network_name}}" -network_type = "{{network_type}}" - -delete_on_termination = {% if delete_on_termination == 'true' %}true{%else%}false{%endif%} - -volume_size = {{volume_size}} -volume_type = "{{volume_type}}" -name = "{{server_name}}" -os = "{{os}}" -ssh_key_name = "{{ssh_name}}" -firewall = {% if firewall == 'true' %}true{%else%}false{%endif%} - -username = "{{username}}" -password = "{{pass}}" diff --git a/app/scripts/terraform/var_generator.yml b/app/scripts/terraform/var_generator.yml deleted file mode 100644 index 543e8050..00000000 --- a/app/scripts/terraform/var_generator.yml +++ /dev/null @@ -1,26 +0,0 @@ -- hosts: localhost - gather_facts: no - connection: local - tasks: - - name: Create vars directory - file: - path: vars - state: directory - - - name: Create aws var file - template: - src: templates/aws_vars_template.j2 - dest: "vars/{{server_name}}_{{group}}_{{cloud}}.tfvars" - when: cloud == "aws" - - - name: Create do var file - template: - src: templates/do_vars_template.j2 - dest: "vars/{{server_name}}_{{group}}_{{cloud}}.tfvars" - when: cloud == "do" - - - name: Create gcore var file - template: - src: templates/gcore_vars_template.j2 - dest: "vars/{{server_name}}_{{group}}_{{cloud}}.tfvars" - when: cloud == "gcore" diff --git a/app/scripts/terraform/variable.tf b/app/scripts/terraform/variable.tf deleted file mode 100644 index 421aba2f..00000000 --- a/app/scripts/terraform/variable.tf +++ /dev/null @@ -1,70 +0,0 @@ -variable "region" {} -variable "project" { - default = "123" -} -variable "username" { - type = string - default = "123" -} -variable "password" { - type = string - default = "123" -} -variable "instance_type" { - default = "123" -} -variable "network_type" { - type = string - default = "any_subnet" -} -variable "network_name" { - type = string - default = "" -} -variable "public_ip" { - default = false -} -variable "floating_ip" { - default = false -} -variable "volume_size" { - default = "123" -} -variable "delete_on_termination" { - default = false -} -variable "volume_type" { - default = "standard" -} -variable "name" {} -variable "os" {} -variable "ssh_key_name" {} -variable "firewall" {} -variable "AWS_ACCESS_KEY" { - default = "123" -} -variable "AWS_SECRET_KEY" { - default = "123" -} - -variable "size" { - default = "123" -} -variable "private_networking" { - default = false -} -variable "ssh_ids" { - default = "" -} -variable "backup" { - default = false -} -variable "privet_net" { - default = false -} -variable "monitoring" { - default = false -} -variable "token" { - default = "123" -} \ No newline at end of file diff --git a/app/scripts/terraform/versions.tf b/app/scripts/terraform/versions.tf deleted file mode 100644 index aa661d12..00000000 --- a/app/scripts/terraform/versions.tf +++ /dev/null @@ -1,8 +0,0 @@ -terraform { - required_providers { - aws = { - source = "hashicorp/aws" - version = "3.28.0" - } - } -} diff --git a/app/static/js/backup.js b/app/static/js/backup.js index 593b8b71..0ecc1c07 100644 --- a/app/static/js/backup.js +++ b/app/static/js/backup.js @@ -195,7 +195,7 @@ function addS3Backup(dialog_id) { type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { + if (data.indexOf('error: ') != '-1') { toastr.error(data); } else if (data.indexOf('info: ') != '-1') { toastr.clear(); @@ -203,9 +203,6 @@ function addS3Backup(dialog_id) { } else if (data.indexOf('warning: ') != '-1') { toastr.clear(); toastr.warning(data); - } else if (data.indexOf('error: ') != '-1') { - toastr.clear(); - toastr.error(data); } else { common_ajax_action_after_success(dialog_id, 'newbackup', 'ajax-backup-s3-table', data); $("select").selectmenu(); diff --git a/inc/codemirror/addon/comment/comment.js b/app/static/js/codemirror/addon/comment/comment.js similarity index 100% rename from inc/codemirror/addon/comment/comment.js rename to app/static/js/codemirror/addon/comment/comment.js diff --git a/inc/codemirror/addon/comment/dialog.css b/app/static/js/codemirror/addon/comment/dialog.css similarity index 100% rename from inc/codemirror/addon/comment/dialog.css rename to app/static/js/codemirror/addon/comment/dialog.css diff --git a/inc/codemirror/addon/comment/dialog.js b/app/static/js/codemirror/addon/comment/dialog.js similarity index 100% rename from inc/codemirror/addon/comment/dialog.js rename to app/static/js/codemirror/addon/comment/dialog.js diff --git a/inc/codemirror/addon/dialog/dialog.css b/app/static/js/codemirror/addon/dialog/dialog.css similarity index 100% rename from inc/codemirror/addon/dialog/dialog.css rename to app/static/js/codemirror/addon/dialog/dialog.css diff --git a/inc/codemirror/addon/dialog/dialog.js b/app/static/js/codemirror/addon/dialog/dialog.js similarity index 100% rename from inc/codemirror/addon/dialog/dialog.js rename to app/static/js/codemirror/addon/dialog/dialog.js diff --git a/inc/codemirror/addon/edit/closebrackets.js b/app/static/js/codemirror/addon/edit/closebrackets.js similarity index 100% rename from inc/codemirror/addon/edit/closebrackets.js rename to app/static/js/codemirror/addon/edit/closebrackets.js diff --git a/inc/codemirror/addon/edit/matchbrackets.js b/app/static/js/codemirror/addon/edit/matchbrackets.js similarity index 100% rename from inc/codemirror/addon/edit/matchbrackets.js rename to app/static/js/codemirror/addon/edit/matchbrackets.js diff --git a/inc/codemirror/addon/fold/brace-fold.js b/app/static/js/codemirror/addon/fold/brace-fold.js similarity index 100% rename from inc/codemirror/addon/fold/brace-fold.js rename to app/static/js/codemirror/addon/fold/brace-fold.js diff --git a/inc/codemirror/addon/fold/comment-fold.js b/app/static/js/codemirror/addon/fold/comment-fold.js similarity index 100% rename from inc/codemirror/addon/fold/comment-fold.js rename to app/static/js/codemirror/addon/fold/comment-fold.js diff --git a/inc/codemirror/addon/fold/foldcode.js b/app/static/js/codemirror/addon/fold/foldcode.js similarity index 100% rename from inc/codemirror/addon/fold/foldcode.js rename to app/static/js/codemirror/addon/fold/foldcode.js diff --git a/inc/codemirror/addon/fold/foldgutter.css b/app/static/js/codemirror/addon/fold/foldgutter.css similarity index 100% rename from inc/codemirror/addon/fold/foldgutter.css rename to app/static/js/codemirror/addon/fold/foldgutter.css diff --git a/inc/codemirror/addon/fold/foldgutter.js b/app/static/js/codemirror/addon/fold/foldgutter.js similarity index 100% rename from inc/codemirror/addon/fold/foldgutter.js rename to app/static/js/codemirror/addon/fold/foldgutter.js diff --git a/inc/codemirror/addon/fold/hardwrap.js b/app/static/js/codemirror/addon/fold/hardwrap.js similarity index 100% rename from inc/codemirror/addon/fold/hardwrap.js rename to app/static/js/codemirror/addon/fold/hardwrap.js diff --git a/inc/codemirror/addon/fold/jump-to-line.js b/app/static/js/codemirror/addon/fold/jump-to-line.js similarity index 100% rename from inc/codemirror/addon/fold/jump-to-line.js rename to app/static/js/codemirror/addon/fold/jump-to-line.js diff --git a/inc/codemirror/addon/fold/search.js b/app/static/js/codemirror/addon/fold/search.js similarity index 100% rename from inc/codemirror/addon/fold/search.js rename to app/static/js/codemirror/addon/fold/search.js diff --git a/inc/codemirror/addon/fold/searchcursor.js b/app/static/js/codemirror/addon/fold/searchcursor.js similarity index 100% rename from inc/codemirror/addon/fold/searchcursor.js rename to app/static/js/codemirror/addon/fold/searchcursor.js diff --git a/inc/codemirror/addon/scroll/annotatescrollbar.js b/app/static/js/codemirror/addon/scroll/annotatescrollbar.js similarity index 100% rename from inc/codemirror/addon/scroll/annotatescrollbar.js rename to app/static/js/codemirror/addon/scroll/annotatescrollbar.js diff --git a/inc/codemirror/addon/search/jump-to-line.js b/app/static/js/codemirror/addon/search/jump-to-line.js similarity index 100% rename from inc/codemirror/addon/search/jump-to-line.js rename to app/static/js/codemirror/addon/search/jump-to-line.js diff --git a/inc/codemirror/addon/search/match-highlighter.js b/app/static/js/codemirror/addon/search/match-highlighter.js similarity index 100% rename from inc/codemirror/addon/search/match-highlighter.js rename to app/static/js/codemirror/addon/search/match-highlighter.js diff --git a/inc/codemirror/addon/search/matchesonscrollbar.js b/app/static/js/codemirror/addon/search/matchesonscrollbar.js similarity index 100% rename from inc/codemirror/addon/search/matchesonscrollbar.js rename to app/static/js/codemirror/addon/search/matchesonscrollbar.js diff --git a/inc/codemirror/addon/search/search.js b/app/static/js/codemirror/addon/search/search.js similarity index 100% rename from inc/codemirror/addon/search/search.js rename to app/static/js/codemirror/addon/search/search.js diff --git a/inc/codemirror/addon/search/searchcursor.js b/app/static/js/codemirror/addon/search/searchcursor.js similarity index 100% rename from inc/codemirror/addon/search/searchcursor.js rename to app/static/js/codemirror/addon/search/searchcursor.js diff --git a/inc/codemirror/addon/wrap/hardwrap.js b/app/static/js/codemirror/addon/wrap/hardwrap.js similarity index 100% rename from inc/codemirror/addon/wrap/hardwrap.js rename to app/static/js/codemirror/addon/wrap/hardwrap.js diff --git a/inc/codemirror/keymap/sublime.js b/app/static/js/codemirror/keymap/sublime.js similarity index 100% rename from inc/codemirror/keymap/sublime.js rename to app/static/js/codemirror/keymap/sublime.js diff --git a/inc/codemirror/lib/codemirror.css b/app/static/js/codemirror/lib/codemirror.css similarity index 100% rename from inc/codemirror/lib/codemirror.css rename to app/static/js/codemirror/lib/codemirror.css diff --git a/inc/codemirror/lib/codemirror.js b/app/static/js/codemirror/lib/codemirror.js similarity index 100% rename from inc/codemirror/lib/codemirror.js rename to app/static/js/codemirror/lib/codemirror.js diff --git a/inc/codemirror/mode/haproxy.js b/app/static/js/codemirror/mode/haproxy.js similarity index 100% rename from inc/codemirror/mode/haproxy.js rename to app/static/js/codemirror/mode/haproxy.js diff --git a/inc/codemirror/mode/modsec.js b/app/static/js/codemirror/mode/modsec.js similarity index 100% rename from inc/codemirror/mode/modsec.js rename to app/static/js/codemirror/mode/modsec.js diff --git a/inc/codemirror/mode/nginx.js b/app/static/js/codemirror/mode/nginx.js similarity index 100% rename from inc/codemirror/mode/nginx.js rename to app/static/js/codemirror/mode/nginx.js diff --git a/inc/dataTables.min.js b/app/static/js/dataTables.min.js similarity index 100% rename from inc/dataTables.min.js rename to app/static/js/dataTables.min.js diff --git a/inc/dataTables/buttons.dataTables.min.css b/app/static/js/dataTables/buttons.dataTables.min.css similarity index 100% rename from inc/dataTables/buttons.dataTables.min.css rename to app/static/js/dataTables/buttons.dataTables.min.css diff --git a/inc/dataTables/buttons.html5.min.js b/app/static/js/dataTables/buttons.html5.min.js similarity index 100% rename from inc/dataTables/buttons.html5.min.js rename to app/static/js/dataTables/buttons.html5.min.js diff --git a/inc/dataTables/dataTables.buttons.min.js b/app/static/js/dataTables/dataTables.buttons.min.js similarity index 100% rename from inc/dataTables/dataTables.buttons.min.js rename to app/static/js/dataTables/dataTables.buttons.min.js diff --git a/inc/dataTables/jszip.min.js b/app/static/js/dataTables/jszip.min.js similarity index 100% rename from inc/dataTables/jszip.min.js rename to app/static/js/dataTables/jszip.min.js diff --git a/inc/dataTables/pdfmake.min.js b/app/static/js/dataTables/pdfmake.min.js similarity index 100% rename from inc/dataTables/pdfmake.min.js rename to app/static/js/dataTables/pdfmake.min.js diff --git a/inc/dataTables/vfs_fonts.js b/app/static/js/dataTables/vfs_fonts.js similarity index 100% rename from inc/dataTables/vfs_fonts.js rename to app/static/js/dataTables/vfs_fonts.js diff --git a/app/static/js/ha.js b/app/static/js/ha.js index 21ee684c..253651d8 100644 --- a/app/static/js/ha.js +++ b/app/static/js/ha.js @@ -1,3 +1,4 @@ +var cancel_word = $('#translate').attr('data-cancel'); $( function() { $("select").selectmenu({ width: 180 @@ -35,14 +36,6 @@ $( function() { get_interface($(this), server_ip); }); }); -function showProvisioningError(data, step_id, wait_mess, error_id) { - $(wait_mess).hide(); - $(error_id).append(data); - $(error_id).show(); - $(step_id).removeClass('proccessing'); - $(step_id).addClass('processing_error'); - $.getScript("/app/static/js/fontawesome.min.js"); -} function cleanProvisioningProccess(div_id, success_div, error_id, warning_id, progres_id) { $(div_id).empty(); $(success_div).empty(); @@ -59,7 +52,6 @@ function cleanProvisioningProccess(div_id, success_div, error_id, warning_id, pr } function confirmDeleteCluster(cluster_id) { var delete_word = $('#translate').attr('data-delete'); - var cancel_word = $('#translate').attr('data-cancel'); $("#dialog-confirm").dialog({ resizable: false, height: "auto", @@ -97,9 +89,8 @@ function deleteCluster(cluster_id) { }); } function createHaClusterStep1(edited=false, cluster_id=0, clean=true) { - var cancel_word = $('#translate').attr('data-cancel'); - var next_word = $('#translate').attr('data-next'); - var tabel_title = $("#create-ha-cluster-step-1-overview").attr('title'); + let next_word = $('#translate').attr('data-next'); + let tabel_title = $("#create-ha-cluster-step-1-overview").attr('title'); if (clean) { clearClusterDialog(edited); $.ajax({ @@ -163,6 +154,11 @@ function createHaClusterStep1(edited=false, cluster_id=0, clean=true) { } else { $('#virt_server').prop('checked', false); } + if (clusterSettings.use_src) { + $('#use_src').prop('checked', true); + } else { + $('#use_src').prop('checked', false); + } $( "input[type=checkbox]" ).checkboxradio("refresh"); } }); @@ -238,7 +234,6 @@ function createHaClusterStep1(edited=false, cluster_id=0, clean=true) { dialog_div.dialog('open'); } function createHaClusterStep2(edited=false, cluster_id=0, jsonData='') { - var cancel_word = $('#translate').attr('data-cancel'); var back_word = $('#translate').attr('data-back'); var save_word = $('#translate').attr('data-save'); var apply_word = $('#translate').attr('data-apply'); @@ -293,6 +288,7 @@ function saveCluster(jsonData, cluster_id=0, edited=0, reconfigure=0) { let virt_server = 0; let return_to_master = 0; let syn_flood = 0; + let use_src = 0; let hap = 0; let hap_docker = 0; let nginx = 0; @@ -311,6 +307,9 @@ function saveCluster(jsonData, cluster_id=0, edited=0, reconfigure=0) { if ($('#syn_flood').is(':checked')) { syn_flood = '1'; } + if ($('#use_src').is(':checked')) { + use_src = '1'; + } if ($('#hap').is(':checked')) { hap = '1'; } @@ -333,6 +332,7 @@ function saveCluster(jsonData, cluster_id=0, edited=0, reconfigure=0) { jsonData['virt_server'] = virt_server; jsonData['return_to_master'] = return_to_master; jsonData['syn_flood'] = syn_flood; + jsonData['use_src'] = use_src; jsonData['services'] = {'haproxy': {'enabled': hap, 'docker': hap_docker}}; jsonData['services']['nginx'] = {'enabled': nginx, 'docker': nginx_docker}; jsonData['services']['apache'] = {'enabled': apache, 'docker': 0}; @@ -341,15 +341,14 @@ function saveCluster(jsonData, cluster_id=0, edited=0, reconfigure=0) { url: "/app/ha/cluster", type: req_method, async: false, - data: { - jsonData: JSON.stringify(jsonData), - }, + data: JSON.stringify(jsonData), + contentType: "application/json; charset=utf-8", success: function (data) { - if (data.indexOf('error:') != '-1') { - toastr.error(data); + if (data.status === 'failed') { + toastr.error(data.error); } else { if (!edited) { - cluster_id = data; + cluster_id = data.cluster_id; getHaCluster(cluster_id, true); } else { getHaCluster(cluster_id); @@ -396,7 +395,6 @@ function Reconfigure(jsonData, cluster_id) { } }); server_creating.dialog('open'); - let li_id = 'creating-' let progress_step = 100 / total_installation; $.when(installServiceCluster(jsonData, 'keepalived', progress_step, cluster_id)).done(function () { if (servers['services']['haproxy']['enabled']) { @@ -452,11 +450,10 @@ function installServiceCluster(jsonData, service, progress_step, cluster_id) { jsonData: JSON.stringify(servers), }, success: function (data) { - try { - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } - } catch (e) { + if (data.status === 'failed') { + toastr.error(data.error); + toastr.error(data); + } else { checkInstallResp(data, servers['cluster_id'], progress_step, servers["name"], li_id, nice_service_name[service]); } } @@ -506,7 +503,6 @@ function increaseProgressValue(progress_step) { $(progress_id).css('width', new_progress+'%'); } function add_vip_ha_cluster(cluster_id, cluster_name, router_id='', vip='', edited=0) { - var cancel_word = $('#translate').attr('data-cancel'); var save_word = $('#translate').attr('data-save'); var delete_word = $('#translate').attr('data-delete'); var tabel_title = $("#add-vip-table").attr('title'); @@ -529,6 +525,11 @@ function add_vip_ha_cluster(cluster_id, cluster_name, router_id='', vip='', edit } else { $('#vrrp-ip-add-virt_server').prop('checked', false); } + if (clusterSettings.use_src) { + $('#vrrp-ip-add-use_src').prop('checked', true); + } else { + $('#vrrp-ip-add-use_src').prop('checked', false); + } $( "input[type=checkbox]" ).checkboxradio("refresh"); } }); @@ -631,17 +632,22 @@ function add_vip_ha_cluster(cluster_id, cluster_name, router_id='', vip='', edit } function saveVip(jsonData, cluster_id, dialog_id, cluster_name, edited, router_id='', vip='', deleted=false) { let req_type = 'POST' - var return_to_master = 0 - var virt_server = 0 + let return_to_master = 0 + let virt_server = 0 + let use_src = 0 if ($('#vrrp-ip-add-return_to_master').is(':checked')) { return_to_master = '1'; } if ($('#vrrp-ip-add-virt_server').is(':checked')) { virt_server = '1'; } + if ($('#vrrp-ip-add-use_src').is(':checked')) { + use_src = '1'; + } jsonData['vip'] = $('#vrrp-ip-add').val(); jsonData['return_to_master'] = return_to_master; jsonData['virt_server'] = virt_server; + jsonData['use_src'] = use_src; jsonData['name'] = cluster_name; if (edited) { req_type = 'PUT'; @@ -653,13 +659,12 @@ function saveVip(jsonData, cluster_id, dialog_id, cluster_name, edited, router_i } $.ajax({ url: "/app/ha/cluster/" + cluster_id + "/vip", - data: { - jsonData: JSON.stringify(jsonData), - }, + data: JSON.stringify(jsonData), + contentType: "application/json; charset=utf-8", type: req_type, success: function (data) { - if (data.indexOf('error:') != '-1') { - toastr.error(data); + if (data.status === 'failed') { + toastr.error(data.error); } else { getHaCluster(cluster_id); dialog_id.dialog('destroy'); @@ -673,9 +678,6 @@ function get_interface(input_id, server_ip) { source: function (request, response) { $.ajax({ url: "/app/server/show/if/" + server_ip, - // data: { - // token: $('#token').val() - // }, success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') { @@ -693,10 +695,6 @@ function get_interface(input_id, server_ip) { function get_keepalived_ver(div_id, server_ip) { $.ajax({ url: "/app/install/keepalived/version/" + server_ip, - // data: { - // token: $('#token').val() - // }, - // type: "POST", success: function (data) { data = data.replace(/^\s+|\s+$/g, ''); if (data.indexOf('error:') != '-1') { @@ -704,7 +702,6 @@ function get_keepalived_ver(div_id, server_ip) { toastr.error(p_err); } else if (data.indexOf('keepalived:') != '-1') { div_id.text('Keepalived has not installed'); - // $('#create').attr('title', 'Create HA cluster'); } else { div_id.text(data); div_id.css('font-weight', 'bold'); @@ -734,22 +731,22 @@ function addCheckToStatus(server_id, server_ip) { $.getScript('/app/static/js/ha.js'); } function removeCheckFromStatus(server_id, server_ip) { - var hostname = $('#remove_check-' + server_id).attr('data-name'); - var add_word = $('#translate').attr('data-add'); - var service_word = $('#translate').attr('data-service'); - var length_tr = $('#all_services tbody tr').length; - var tr_class = 'odd'; + let hostname = $('#remove_check-' + server_id).attr('data-name'); + let add_word = $('#translate').attr('data-add'); + let service_word = $('#translate').attr('data-service'); + let length_tr = $('#all_services tbody tr').length; + let tr_class = 'odd'; if (length_tr % 2 != 0) { tr_class = 'even'; } - var html_tag = '
' + + let html_tag = '
' + '
' + hostname + '
' + '
+
'; $('#remove_check-' + server_id).remove(); $("#all-checks").append(html_tag); } function createJsonCluster(div_id) { - var jsonData = {}; + let jsonData = {}; jsonData = {'servers': {}}; jsonData['servers'][1] = { 'eth': $('#ha-cluster-master-interface').val(), @@ -758,25 +755,25 @@ function createJsonCluster(div_id) { 'master': 1 }; $(div_id).each(function () { - var this_id = $(this).attr('id').split('-')[1]; - var eth = $('#slave_int-' + this_id).val(); - var ip = $('#slave_int_div-' + this_id).attr('data-ip'); - var name = $('#slave_int_div-' + this_id).parent().text().replace('\n','').replace('\t','').trim(); + let this_id = $(this).attr('id').split('-')[1]; + let eth = $('#slave_int-' + this_id).val(); + let ip = $('#slave_int_div-' + this_id).attr('data-ip'); + let name = $('#slave_int_div-' + this_id).parent().text().replace('\n','').replace('\t','').trim(); jsonData['servers'][this_id] = {'eth': eth, 'ip': ip, 'name': name, 'master': 0}; }); return jsonData; } function createJsonVip(div_id) { - var jsonData = {}; + let jsonData = {}; jsonData = {'servers': {}}; $(div_id).each(function () { - var this_id = $(this).attr('id').split('-')[1]; - var eth1 = $('#slave_int-' + this_id).val(); - var ip1 = $('#slave_int_div-' + this_id).attr('data-ip'); - var name1 = $('#slave_int_div-' + this_id).parent().text().replace('\n','').replace('\t','').trim(); - var eth = $('#master_int-' + this_id).val(); - var ip = $('#master_int_div-' + this_id).attr('data-ip'); - var name = $('#master_int_div-' + this_id).parent().text().replace('\n','').replace('\t','').trim(); + let this_id = $(this).attr('id').split('-')[1]; + let eth1 = $('#slave_int-' + this_id).val(); + let ip1 = $('#slave_int_div-' + this_id).attr('data-ip'); + let name1 = $('#slave_int_div-' + this_id).parent().text().replace('\n','').replace('\t','').trim(); + let eth = $('#master_int-' + this_id).val(); + let ip = $('#master_int_div-' + this_id).attr('data-ip'); + let name = $('#master_int_div-' + this_id).parent().text().replace('\n','').replace('\t','').trim(); if (eth) { jsonData['servers'][this_id] = {'eth': eth, 'ip': ip, 'name': name, 'master': 1}; } else { @@ -812,11 +809,12 @@ function clearClusterDialog(edited=0) { $('#cur_master_ver').text(''); $('#virt_server').prop('checked', true); $('#return_to_master').prop('checked', true); + $('#use_src').prop('checked', false); $('#hap').prop('checked', false); $('#hap_docker').prop('checked', false); $('#nginx').prop('checked', false); $('#nginx_docker').prop('checked', false); - $( "input[type=checkbox]" ).checkboxradio("refresh"); + $("input[type=checkbox]").checkboxradio("refresh"); $('#ha-cluster-master option:selected').remove(); $("#ha-cluster-master option").each(function (index) { $(this).prop('disabled', false); @@ -839,7 +837,7 @@ function getHaCluster(cluster_id, new_cluster=false) { $('#cluster-' + cluster_id).replaceWith(data); } $.getScript("/app/static/js/fontawesome.min.js"); - $('#cluster-'+cluster_id).removeClass('animated-background'); + $('#cluster-' + cluster_id).removeClass('animated-background'); } } }); diff --git a/app/static/js/install.js b/app/static/js/install.js index a0caf9fd..5296f4c1 100644 --- a/app/static/js/install.js +++ b/app/static/js/install.js @@ -1,3 +1,10 @@ +let nice_names = { + 'haproxy': 'HAProxy', + 'nginx': 'NGINX', + 'apache': 'Apache', + 'node': 'Node', + 'keepalived': 'Keepalived' +}; $( function() { $('#install').click(function () { installService('haproxy') @@ -13,16 +20,12 @@ $( function() { $("#ajaxmon").html(wait_mess); $.ajax({ url: "/app/install/grafana", - // data: { - // token: $('#token').val() - // }, - // type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); $("#ajaxmon").html(''); if (data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1' || data.indexOf('ERROR') != '-1') { toastr.clear(); - var p_err = show_pretty_ansible_error(data); + let p_err = show_pretty_ansible_error(data); toastr.error(p_err); } else if (data.indexOf('success') != '-1') { toastr.clear(); @@ -87,28 +90,27 @@ $( function() { } }); $("#geoip_install").click(function () { - var updating_geoip = 0; + let updating_geoip = 0; if ($('#updating_geoip').is(':checked')) { updating_geoip = '1'; } $("#ajax-geoip").html(wait_mess); let service = $('#geoip_service option:selected').val(); + let jsonData = { + "server_ip": $('#geoipserv option:selected').val(), + "service": service, + "update": updating_geoip + } $.ajax({ url: "/app/install/geoip", - data: { - server_ip: $('#geoipserv option:selected').val(), - service: service, - update: updating_geoip, - token: $('#token').val() - }, + data: JSON.stringify(jsonData), + contentType: "application/json; charset=utf-8", type: "POST", success: function (data) { $("#ajax-geoip").html(''); - try { - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } - } catch (e) { + if (data.status === 'failed') { + toastr.error(data.error); + } else { parseAnsibleJsonOutput(data, service + ' GeoIP', '#geoip_service'); $("#geoip_service").trigger("selectmenuchange"); } @@ -117,15 +119,11 @@ $( function() { }); }); function checkGeoipInstallation() { - $.ajax( { + $.ajax({ url: "/app/install/geoip/" + $('#geoip_service option:selected').val() + "/" + $('#geoipserv option:selected').val(), - // data: { - // token: $('#token').val() - // }, - // type: "POST", - success: function( data ) { - data = data.replace(/^\s+|\s+$/g,''); - if(data.indexOf('No such file or directory') != '-1' || data.indexOf('cannot access') != '-1') { + success: function (data) { + data = data.replace(/^\s+|\s+$/g, ''); + if (data.indexOf('No such file or directory') != '-1' || data.indexOf('cannot access') != '-1') { $('#cur_geoip').html('GeoIPLite is not installed'); $('#geoip_install').show(); } else { @@ -133,14 +131,13 @@ function checkGeoipInstallation() { $('#geoip_install').hide(); } } - } ); + }); } function installService(service) { $("#ajax").html('') - var syn_flood = 0; - var docker = 0; - var select_id = '#' + service + 'addserv'; - var nice_names = {'haproxy': 'HAProxy', 'nginx': 'NGINX', 'apache': 'Apache'}; + let syn_flood = 0; + let docker = 0; + let select_id = '#' + service + 'addserv'; if ($('#' + service + '_syn_flood').is(':checked')) { syn_flood = '1'; } @@ -148,11 +145,11 @@ function installService(service) { docker = '1'; } if ($(select_id).val() == '------' || $(select_id).val() === null) { - var select_server = $('#translate').attr('data-select_server'); + let select_server = $('#translate').attr('data-select_server'); toastr.warning(select_server); return false } - var jsonData = {}; + let jsonData = {}; jsonData['servers'] = {'0': {}} jsonData['services'] = {}; jsonData['services'][service] = {}; @@ -174,16 +171,13 @@ function installService(service) { 504: function () { showErrorStatus(nice_names[service], $(select_id + ' option:selected').text()); }, - data: { - jsonData: JSON.stringify(jsonData) - }, + data: JSON.stringify(jsonData), + contentType: "application/json; charset=utf-8", type: "POST", success: function (data) { - try { - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } - } catch (e) { + if (data.status === 'failed') { + toastr.error(data.error); + } else { parseAnsibleJsonOutput(data, nice_names[service], select_id); $(select_id).trigger("selectmenuchange"); } @@ -193,56 +187,54 @@ function installService(service) { function installExporter(exporter) { $("#ajaxmon").html(''); $("#ajaxmon").html(wait_mess); - var exporter_id = '#' + exporter + '_exp_addserv'; - var ext_prom = 0; - if ($('#' + exporter + '_ext_prom').is(':checked')) { - ext_prom = '1'; - } - var nice_names = {'haproxy': 'HAProxy exporter', 'nginx': 'NGINX exporter', 'apache': 'Apache exporter', 'node': 'Node exporter', 'keepalived': 'Keepalived exporter'}; + let exporter_id = '#' + exporter + '_exp_addserv'; + let ext_prom = 0; + let nice_exporter_name = nice_names[exporter] + ' exporter'; + if ($('#' + exporter + '_ext_prom').is(':checked')) { + ext_prom = '1'; + } + let jsonData = { + "server_ip": $(exporter_id).val(), + "exporter_v": $('#' + exporter + 'expver').val(), + "ext_prom": ext_prom, + } $("#ajax").html(wait_mess); $.ajax({ url: "/app/install/exporter/" + exporter, 500: function () { - showErrorStatus(nice_names[exporter], $(exporter_id + ' option:selected').text()); + showErrorStatus(nice_exporter_name, $(exporter_id + ' option:selected').text()); }, 504: function () { - showErrorStatus(nice_names[exporter], $(exporter_id + ' option:selected').text()); + showErrorStatus(nice_exporter_name, $(exporter_id + ' option:selected').text()); }, - data: { - server_ip: $(exporter_id).val(), - exporter_v: $('#' + exporter + 'expver').val(), - ext_prom: ext_prom, - token: $('#token').val() - }, + data: JSON.stringify(jsonData), + contentType: "application/json; charset=utf-8", type: "POST", success: function (data) { - try { - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } - } catch (e) { - parseAnsibleJsonOutput(data, nice_names[exporter], exporter_id); + if (data.status === 'failed') { + toastr.error(data.error); + } else { + parseAnsibleJsonOutput(data, nice_exporter_name, exporter_id); $(exporter_id).trigger("selectmenuchange"); } } }); } function showExporterVersion(exporter) { - var nice_names = {'haproxy': 'HAProxy', 'nginx': 'NGINX', 'apache': 'Apache', 'node': 'Node', 'keepalived': 'Keepalived'}; $.ajax({ - url: "/app/install/exporter/"+ exporter +"/version/" + $('#' + exporter + '_exp_addserv option:selected').val(), - success: function (data) { - data = data.replace(/^\s+|\s+$/g, ''); - if (data.indexOf('error:') != '-1') { - toastr.clear(); - toastr.error(data); - } else if (data == 'no' || data.indexOf('command') != '-1' || data.indexOf('_exporter:') != '-1' || data == '') { - $('#cur_'+ exporter +'_exp_ver').text(nice_names[exporter]+' exporter has not been installed'); - } else { - $('#cur_'+ exporter +'_exp_ver').text(data); - } + url: "/app/install/exporter/" + exporter + "/version/" + $('#' + exporter + '_exp_addserv option:selected').val(), + success: function (data) { + data = data.replace(/^\s+|\s+$/g, ''); + if (data.indexOf('error:') != '-1') { + toastr.clear(); + toastr.error(data); + } else if (data == 'no' || data.indexOf('command') != '-1' || data.indexOf('_exporter:') != '-1' || data == '') { + $('#cur_' + exporter + '_exp_ver').text(nice_names[exporter] + ' exporter has not been installed'); + } else { + $('#cur_' + exporter + '_exp_ver').text(data); } - }); + } + }); } function showServiceVersion(service) { $.ajax({ @@ -272,26 +264,25 @@ function showServiceVersion(service) { }); } function showErrorStatus(service_name, server) { - var something_wrong = $('#translate').attr('data-something_wrong'); + let something_wrong = $('#translate').attr('data-something_wrong'); toastr.error(something_wrong + ' ' + service_name + ' ' + server); } function parseAnsibleJsonOutput(output, service_name, select_id) { - output = JSON.parse(JSON.stringify(output)); let was_installed = $('#translate').attr('data-was_installed'); let server_name = ''; - for (var k in output['ok']) { + for (let k in output['ok']) { if (select_id) { server_name = $(select_id + ' option[value="'+k+'"]').text(); } toastr.success(service_name + ' ' + was_installed +' ' + server_name); } - for (var k in output['failures']) { + for (let k in output['failures']) { if (select_id) { server_name = $(select_id + ' option[value="'+k+'"]').text(); } showErrorStatus(service_name, server_name); } - for (var k in output['dark']) { + for (let k in output['dark']) { if (select_id) { server_name = $(select_id + ' option[value="'+k+'"]').text(); } diff --git a/inc/intro/intro.min.js.map b/app/static/js/intro/intro.min.js.map similarity index 100% rename from inc/intro/intro.min.js.map rename to app/static/js/intro/intro.min.js.map diff --git a/inc/intro/intro.module.js b/app/static/js/intro/intro.module.js similarity index 100% rename from inc/intro/intro.module.js rename to app/static/js/intro/intro.module.js diff --git a/inc/intro/introjs-modern.css b/app/static/js/intro/introjs-modern.css similarity index 100% rename from inc/intro/introjs-modern.css rename to app/static/js/intro/introjs-modern.css diff --git a/inc/intro/introjs.min.css b/app/static/js/intro/introjs.min.css similarity index 100% rename from inc/intro/introjs.min.css rename to app/static/js/intro/introjs.min.css diff --git a/inc/intro/introjs.min.css.map b/app/static/js/intro/introjs.min.css.map similarity index 100% rename from inc/intro/introjs.min.css.map rename to app/static/js/intro/introjs.min.css.map diff --git a/inc/intro/introjs.min.js b/app/static/js/intro/introjs.min.js similarity index 100% rename from inc/intro/introjs.min.js rename to app/static/js/intro/introjs.min.js diff --git a/inc/jquery-3.6.0.min.js b/app/static/js/jquery-3.6.0.min.js similarity index 100% rename from inc/jquery-3.6.0.min.js rename to app/static/js/jquery-3.6.0.min.js diff --git a/inc/jquery-linenumbers.js b/app/static/js/jquery-linenumbers.js similarity index 100% rename from inc/jquery-linenumbers.js rename to app/static/js/jquery-linenumbers.js diff --git a/inc/jquery-linenumbers.min.js.map b/app/static/js/jquery-linenumbers.min.js.map similarity index 100% rename from inc/jquery-linenumbers.min.js.map rename to app/static/js/jquery-linenumbers.min.js.map diff --git a/inc/jquery-ui.min.js b/app/static/js/jquery-ui.min.js similarity index 100% rename from inc/jquery-ui.min.js rename to app/static/js/jquery-ui.min.js diff --git a/inc/jquery.mousewheel.min.js b/app/static/js/jquery.mousewheel.min.js similarity index 100% rename from inc/jquery.mousewheel.min.js rename to app/static/js/jquery.mousewheel.min.js diff --git a/inc/jquery.timeago.js b/app/static/js/jquery.timeago.js similarity index 100% rename from inc/jquery.timeago.js rename to app/static/js/jquery.timeago.js diff --git a/app/static/js/runtimeapi.js b/app/static/js/runtimeapi.js index 66749dad..8b3ee4e5 100644 --- a/app/static/js/runtimeapi.js +++ b/app/static/js/runtimeapi.js @@ -334,7 +334,7 @@ function getTable() { } else { $("#ajaxtable").html(data); $("input[type=submit], button").button(); - $.getScript("/inc/script.js"); + $.getScript("/app/static/js/script.js"); $.getScript("/app/static/js/overview.js"); FontAwesomeConfig = {searchPseudoElements: true, observeMutations: false}; } @@ -357,7 +357,7 @@ function getList() { } else { $("#ajaxlist").html(data); $("input[type=submit], button").button(); - $.getScript("/inc/script.js"); + $.getScript("/app/static/js/script.js"); $.getScript("/app/static/js/overview.js"); FontAwesomeConfig = {searchPseudoElements: true, observeMutations: false}; } @@ -433,7 +433,7 @@ function getSessions() { } else { $("#ajaxsessions").html(data); $("input[type=submit], button").button(); - $.getScript("/inc/script.js"); + $.getScript("/app/static/js/script.js"); $.getScript("/app/static/js/overview.js"); FontAwesomeConfig = {searchPseudoElements: true, observeMutations: false}; } diff --git a/inc/script.js b/app/static/js/script.js similarity index 99% rename from inc/script.js rename to app/static/js/script.js index c46935c8..8fc8922a 100644 --- a/inc/script.js +++ b/app/static/js/script.js @@ -1,4 +1,4 @@ -var url = "/inc/script.js"; +var url = "/app/static/js/script.js"; var cur_url = window.location.href.split('/app/').pop(); cur_url = cur_url.split('/'); var intervalId; diff --git a/app/static/js/udp.js b/app/static/js/udp.js index 0e7ebd8f..40b90490 100644 --- a/app/static/js/udp.js +++ b/app/static/js/udp.js @@ -43,7 +43,6 @@ function getHAClusterVIPS(cluster_id) { clearUdpVip(); $('#new-udp-vip').append('') data.forEach(function (obj) { - console.log(obj.vip); $('#new-udp-vip').append('') }); $('#new-udp-vip').selectmenu("refresh"); @@ -320,7 +319,8 @@ function saveUdpListener(jsonData, dialog_id, listener_id=0, edited=0, reconfigu function Reconfigure(listener_id) { return $.ajax({ url: "/app/install/udp", - data: {listener_id: listener_id}, + data: JSON.stringify({listener_id: listener_id}), + contentType: "application/json; charset=utf-8", async: false, type: "POST", success: function (data) { @@ -469,4 +469,4 @@ function createBackendServer(server='', port='', weight='1') { '' + '
').insertBefore('.add-server'); $.getScript("/app/static/js/fontawesome.min.js"); -} \ No newline at end of file +} diff --git a/app/static/js/waf.js b/app/static/js/waf.js index ee543095..1f81f309 100644 --- a/app/static/js/waf.js +++ b/app/static/js/waf.js @@ -2,20 +2,20 @@ var awesome = "/app/static/js/fontawesome.min.js" var waf = "/app/static/js/waf.js" var overview = "/app/static/js/overview.js" function showOverviewWaf(serv, hostnamea) { - var service = cur_url[1]; + let service = cur_url[1]; if (service == 'haproxy') { $.getScript('/app/static/js/chart.min-4.3.0.js'); showWafMetrics(); } - var i; - for (i = 0; i < serv.length; i++) { + let i; + for (i = 0; i < serv.length; i++) { showOverviewWafCallBack(serv[i], hostnamea[i]) } $.getScript(overview); $.getScript(waf); } function showOverviewWafCallBack(serv, hostnamea) { - var service = cur_url[1]; + let service = cur_url[1]; $.ajax({ url: "/app/waf/overview/" + service + "/" + serv, beforeSend: function () { @@ -32,34 +32,33 @@ function showOverviewWafCallBack(serv, hostnamea) { }); } function metrics_waf(name) { - var enable = 0; - if ($('#'+name).is(':checked')) { + let enable = 0; + if ($('#' + name).is(':checked')) { enable = '1'; } name = name.split('metrics')[1] - $.ajax( { + $.ajax({ url: "/app/waf/metric/enable/" + enable + "/" + name, - success: function( data ) { + success: function (data) { showOverviewWaf(ip, hostnamea); - setTimeout(function() { - $( "#"+name ).parent().parent().removeClass( "update" ); - }, 2500 ); - } - } ); + setTimeout(function () { + $("#" + name).parent().parent().removeClass("update"); + }, 2500); + } + }); } function installWaf(ip1) { $("#ajax").html(''); $("#ajax").html(wait_mess); - var service = cur_url[1]; + let service = cur_url[1]; $.ajax({ url: "/app/install/waf/" + service + "/" + ip1, type: "POST", + contentType: "application/json; charset=utf-8", success: function (data) { - try { - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } - } catch (e) { + if (data.status === 'failed') { + toastr.error(data.error); + } else { toastr.clear(); parseAnsibleJsonOutput(data, `${service} WAF`, false); showOverviewWaf(ip, hostnamea); @@ -69,9 +68,9 @@ function installWaf(ip1) { }); } function changeWafMode(id) { - var waf_mode = $('#' + id + ' option:selected').val(); - var server_hostname = id.split('_')[0]; - var service = cur_url[1]; + let waf_mode = $('#' + id + ' option:selected').val(); + let server_hostname = id.split('_')[0]; + let service = cur_url[1]; $.ajax({ url: "/app/waf/" + service + "/mode/" + server_hostname + "/" + waf_mode, success: function (data) { @@ -85,24 +84,20 @@ function changeWafMode(id) { } $( function() { $( "#waf_rules input" ).change(function() { - var id = $(this).attr('id').split('-'); + let id = $(this).attr('id').split('-'); waf_rules_en(id[1]) }); }); function waf_rules_en(id) { - var enable = 0; - if ($('#rule_id-'+id).is(':checked')) { + let enable = 0; + if ($('#rule_id-' + id).is(':checked')) { enable = '1'; } - var serv = cur_url[2]; - $.ajax( { + let serv = cur_url[2]; + $.ajax({ url: "/app/waf/" + serv + "/rule/" + id + "/" + enable, - // data: { - // token: $('#token').val() - // }, - // type: "POST", - success: function( data ) { - if (data.indexOf('sed:') != '-1' || data.indexOf('error: ') != '-1' ) { + success: function (data) { + if (data.indexOf('sed:') != '-1' || data.indexOf('error: ') != '-1') { toastr.error(data); } else { toastr.info('Do not forget restart WAF service'); @@ -112,10 +107,10 @@ function waf_rules_en(id) { }, 2500); } } - } ); + }); } function addNewConfig() { - $( "#add-new-config" ).dialog({ + $("#add-new-config").dialog({ autoOpen: true, resizable: false, height: "auto", @@ -131,18 +126,20 @@ function addNewConfig() { duration: 200 }, buttons: { - "Create": function() { - var valid = true; - allFields = $( [] ).add( $('#new_rule_name') ).add( $('#new_rule_description') ) - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#new_rule_name'), "New rule name", 1 ); - valid = valid && checkLength( $('#new_rule_description'), "New rule description", 1 ); - if(valid) { - let new_rule_name = $('#new_rule_name').val(); - let new_rule_description = $('#new_rule_description').val(); - let new_rule_file = new_rule_name.replaceAll(' ','_'); - var service = cur_url[1]; - var serv = cur_url[2]; + "Create": function () { + let valid = true; + let new_rule_name_id = $('#new_rule_name'); + let new_rule_description_id = $('#new_rule_description'); + allFields = $([]).add(new_rule_name_id).add(new_rule_description_id) + allFields.removeClass("ui-state-error"); + valid = valid && checkLength(new_rule_name_id, "New rule name", 1); + valid = valid && checkLength(new_rule_description_id, "New rule description", 1); + if (valid) { + let new_rule_name = new_rule_name_id.val(); + let new_rule_description = new_rule_description_id.val(); + let new_rule_file = new_rule_name.replaceAll(' ', '_'); + let service = cur_url[1]; + let serv = cur_url[2]; service = escapeHtml(service); new_rule_name = escapeHtml(new_rule_name); new_rule_description = escapeHtml(new_rule_description); @@ -161,17 +158,17 @@ function addNewConfig() { if (data.indexOf('error:') != '-1') { toastr.error(data); } else { - var getId = new RegExp('[0-9]+'); - var id = data.match(getId) + ''; + let getId = new RegExp('[0-9]+'); + let id = data.match(getId) + ''; window.location.replace('waf.py?service=' + service + '&waf_rule_id=' + id + '&serv=' + serv); } } }); - $( this ).dialog( "close" ); + $(this).dialog("close"); } }, - Cancel: function() { - $( this ).dialog( "close" ); + Cancel: function () { + $(this).dialog("close"); } } }); diff --git a/app/templates/ajax/alerts_history.html b/app/templates/ajax/alerts_history.html index 13b21e7c..7d72df2b 100644 --- a/app/templates/ajax/alerts_history.html +++ b/app/templates/ajax/alerts_history.html @@ -1,5 +1,5 @@ - + {% if action == "checker" %} {% set column_for_sort = 3 %} {% else %} diff --git a/app/templates/ajax/list.html b/app/templates/ajax/list.html index 33577b27..73959e1c 100644 --- a/app/templates/ajax/list.html +++ b/app/templates/ajax/list.html @@ -1,7 +1,7 @@ {% from 'include/input_macros.html' import input, checkbox, copy_to_clipboard %} {% endfor %} diff --git a/app/templates/ajax/sessions_table.html b/app/templates/ajax/sessions_table.html index 5d954990..e219c7fd 100644 --- a/app/templates/ajax/sessions_table.html +++ b/app/templates/ajax/sessions_table.html @@ -2,7 +2,7 @@ {% from 'include/input_macros.html' import copy_to_clipboard %} - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + {% if is_serv_protected and g.user_params['role'] > 2 %} diff --git a/app/templates/delver.html b/app/templates/delver.html index 3122ec47..8ff7fff1 100644 --- a/app/templates/delver.html +++ b/app/templates/delver.html @@ -6,7 +6,7 @@ {% include 'include/getstarted.html' %} {% else %} - +

diff --git a/app/templates/ha_cluster.html b/app/templates/ha_cluster.html index 6713f80b..4e92c0b7 100644 --- a/app/templates/ha_cluster.html +++ b/app/templates/ha_cluster.html @@ -110,6 +110,14 @@ {{ checkbox('syn_flood') }} + + + {{ lang.ha_page.use_src }} + + + {{ checkbox('use_src', title=lang.ha_page.use_src_help) }} + + HAProxy {{ checkbox('hap', title=lang.ha_page.try_install+' HAProxy') }} @@ -168,6 +176,10 @@ {{lang.words.add|title()}} VIRT {{lang.words.server}} {{ checkbox('vrrp-ip-add-virt_server', title=lang.ha_page.create_virt_server, checked='checked') }} + + {{ lang.ha_page.use_src }} + {{ checkbox('vrrp-ip-add-use_src', title=lang.ha_page.use_src_help, checked='checked') }} +