mirror of https://github.com/Aidaho12/haproxy-wi
parent
e3ad7e86ae
commit
4e16398f2a
|
@ -86,8 +86,8 @@ def index():
|
|||
'keepalived/<id,hostname,ip>/config': 'get Keepalived config from a server by id or hostname or ip. METHOD: GET',
|
||||
'keepalived/<id,hostname,ip>/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)
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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}')
|
||||
|
||||
|
|
|
@ -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 <a href="https://roxy-wi.org/troubleshooting#ansible_collection" target="_blank" class="link">troubleshooting</a>'
|
||||
for collection in collections:
|
||||
if not os.path.isdir(f'/usr/share/httpd/.ansible/collections/ansible_collections/{collection.replace(".", "/")}'):
|
||||
|
|
|
@ -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('/<service>/get/<int:cluster_id>')
|
||||
|
@ -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('/<service>/<int:cluster_id>/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]
|
||||
|
|
|
@ -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('/<service>')
|
||||
@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('/<service>/version/<server_ip>')
|
||||
|
@ -55,17 +55,18 @@ def get_service_version(service, server_ip):
|
|||
|
||||
@bp.post('/exporter/<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/<exporter>/version/<server_ip>')
|
||||
|
@ -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/<service>/<server_ip>')
|
||||
|
@ -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}'})
|
||||
|
|
|
@ -91,7 +91,7 @@
|
|||
service:
|
||||
name: keepalived
|
||||
daemon_reload: yes
|
||||
state: started
|
||||
state: restarted
|
||||
enabled: yes
|
||||
ignore_errors: yes
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
localhost
|
|
@ -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}}"
|
|
@ -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}}"
|
||||
|
|
@ -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}}"
|
|
@ -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"
|
|
@ -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"
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
terraform {
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = "3.28.0"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
|
|
@ -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 = '<div class="' + tr_class + ' all-checks" id="add_check-' + server_id + '" data-name="' + hostname + '">' +
|
||||
let html_tag = '<div class="' + tr_class + ' all-checks" id="add_check-' + server_id + '" data-name="' + hostname + '">' +
|
||||
'<div class="check-name">' + hostname + '</div>' +
|
||||
'<div class="add_user_group check-button" onclick="addCheckToStatus(' + server_id + ', \'' + server_ip + '\')" title="' + add_word + ' ' + service_word + '">+</div></div>';
|
||||
$('#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');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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('<b style="color: var(--red-color)">GeoIPLite is not installed</b>');
|
||||
$('#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();
|
||||
}
|
||||
|
|
|
@ -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};
|
||||
}
|
||||
|
|
|
@ -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;
|
|
@ -43,7 +43,6 @@ function getHAClusterVIPS(cluster_id) {
|
|||
clearUdpVip();
|
||||
$('#new-udp-vip').append('<option value="------" selected>------</option>')
|
||||
data.forEach(function (obj) {
|
||||
console.log(obj.vip);
|
||||
$('#new-udp-vip').append('<option value="' + obj.id + '">' + obj.vip + '</option>')
|
||||
});
|
||||
$('#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') {
|
|||
'<span class="minus minus-style" title="'+delete_word+' '+server_word+'" onclick="$(this).parent().remove()"></span>' +
|
||||
'</div>').insertBefore('.add-server');
|
||||
$.getScript("/app/static/js/fontawesome.min.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");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<link href="{{ url_for('static', filename='css/table-6.3.9.css') }}" rel="stylesheet" type="text/css">
|
||||
<script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/app/static/js/dataTables.min.js"></script>
|
||||
{% if action == "checker" %}
|
||||
{% set column_for_sort = 3 %}
|
||||
{% else %}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{% from 'include/input_macros.html' import input, checkbox, copy_to_clipboard %}
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#{{list_id}}').on( 'page.dt', function () { $.getScript("/inc/fontawesome.min.js"); } )
|
||||
$('#{{list_id}}').on( 'page.dt', function () { $.getScript("/app/static/js/fontawesome.min.js"); } )
|
||||
.DataTable( {
|
||||
"order": [[ 0, "desc" ]],
|
||||
"pageLength": 25,
|
||||
|
@ -76,7 +76,7 @@
|
|||
$( function() {
|
||||
$('#list_add_ip').click(function () {
|
||||
addListIp.dialog('open');
|
||||
$.getScript("/inc/runtumeapi.js");
|
||||
$.getScript("/app/static/js/runtumeapi.js");
|
||||
});
|
||||
var addListIp = $("#list_add_ip_form").dialog({
|
||||
autoOpen: false,
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<tr class="newbackup" id="s3-backup-table-{{b.id}}">
|
||||
<td class="padding10 first-collumn">
|
||||
<span id="backup-s3-server-{{b.id}}" style="display: none">{{ b.server }}</span>
|
||||
{{s.1}}
|
||||
{{b.server}}
|
||||
</td>
|
||||
<td>
|
||||
<span id="s3-server-{{b.id}}">{{b.s3_server}}</span>
|
||||
|
@ -20,18 +20,11 @@
|
|||
<span id="s3-backup-description-{{b.id}}"></span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<!-- <td>-->
|
||||
<!-- <a class="add" onclick="cloneS3Backup({{b.id}})" id="clone-s3-backup{{b.id}}" title="Clone S3 {{b.server}}" style="cursor: pointer;"></a>-->
|
||||
<!-- </td>-->
|
||||
<td>
|
||||
<a class="add" onclick="cloneS3Backup({{b.id}})" id="clone-s3-backup{{b.id}}" title="Clone S3 {{b.server}}" style="cursor: pointer;"></a>
|
||||
</td>
|
||||
<td>
|
||||
<a class="delete" onclick="confirmDeleteS3Backup({{b.id}})" title="Delete S3 backup {{b.server}}" style="cursor: pointer;"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<script>
|
||||
$( function() {
|
||||
$("#s3-backup-time-{{ b.id}}" ).selectmenu({
|
||||
width: 100
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endfor %}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
{% from 'include/input_macros.html' import copy_to_clipboard %}
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#sessions_table').on( 'page.dt', function () { $.getScript("/inc/fontawesome.min.js"); } )
|
||||
$('#sessions_table').on( 'page.dt', function () { $.getScript("/app/static/js/fontawesome.min.js"); } )
|
||||
.DataTable( {
|
||||
"order": [[ 5, "desc" ]],
|
||||
"pageLength": 25,
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
$("form input[type='checkbox']").attr("checked",false).change();
|
||||
}
|
||||
});
|
||||
$.getScript('/inc/script.js');
|
||||
$.getScript('/app/static/js/script.js');
|
||||
function show_diff(id) {
|
||||
if ($('#show_diff_'+id).css('display') == 'none') {
|
||||
$('#show_diff_'+id).show();
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
{% set headers = headers.split(' ') %}
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#{{tables_head.0.strip()}}').on( 'page.dt', function () { $.getScript("/inc/fontawesome.min.js"); } )
|
||||
$('#{{tables_head.0.strip()}}').on( 'page.dt', function () { $.getScript("/app/static/js/fontawesome.min.js"); } )
|
||||
.DataTable( {
|
||||
"pageLength": 25,
|
||||
"columnDefs": [
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
{% set headers = headers.split(' ') %}
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#{{t.0.0.strip()}}').on( 'page.dt', function () { $.getScript("/inc/fontawesome.min.js"); } )
|
||||
$('#{{t.0.0.strip()}}').on( 'page.dt', function () { $.getScript("/app/static/js/fontawesome.min.js"); } )
|
||||
.DataTable( {
|
||||
"pageLength": 10,
|
||||
"columnDefs": [
|
||||
|
|
|
@ -2,28 +2,28 @@
|
|||
{% block title %}{{lang.menu_links.config.h2}} {{service_desc.service}}{% endblock %}
|
||||
{% block h2 %}{{lang.menu_links.config.h2}} {{service_desc.service}}{% endblock %}
|
||||
{% block content %}
|
||||
<link rel="stylesheet" href="/inc/codemirror/lib/codemirror.css">
|
||||
<link rel="stylesheet" href="/inc/codemirror/addon/dialog/dialog.css">
|
||||
<link rel="stylesheet" href="/inc/codemirror/addon/fold/foldgutter.css">
|
||||
<script src="/inc/codemirror/lib/codemirror.js"></script>
|
||||
<script src="/inc/codemirror/addon/search/search.js"></script>
|
||||
<script src="/inc/codemirror/addon/search/searchcursor.js"></script>
|
||||
<script src="/inc/codemirror/addon/search/jump-to-line.js"></script>
|
||||
<script src="/inc/codemirror/addon/search/matchesonscrollbar.js"></script>
|
||||
<script src="/inc/codemirror/addon/search/match-highlighter.js"></script>
|
||||
<script src="/inc/codemirror/addon/dialog/dialog.js"></script>
|
||||
<script src="/inc/codemirror/addon/edit/matchbrackets.js"></script>
|
||||
<script src="/inc/codemirror/addon/edit/closebrackets.js"></script>
|
||||
<script src="/inc/codemirror/addon/comment/comment.js"></script>
|
||||
<script src="/inc/codemirror/addon/wrap/hardwrap.js"></script>
|
||||
<script src="/inc/codemirror/addon/fold/foldcode.js"></script>
|
||||
<script src="/inc/codemirror/addon/fold/foldgutter.js"></script>
|
||||
<script src="/inc/codemirror/addon/fold/brace-fold.js"></script>
|
||||
<script src="/inc/codemirror/addon/fold/comment-fold.js"></script>
|
||||
<script src="/inc/codemirror/addon/scroll/annotatescrollbar.js"></script>
|
||||
<script src="/inc/codemirror/mode/nginx.js"></script>
|
||||
<script src="/inc/codemirror/mode/haproxy.js"></script>
|
||||
<script src="/inc/codemirror/keymap/sublime.js"></script>
|
||||
<link rel="stylesheet" href="/app/static/js/codemirror/lib/codemirror.css">
|
||||
<link rel="stylesheet" href="/app/static/js/codemirror/addon/dialog/dialog.css">
|
||||
<link rel="stylesheet" href="/app/static/js/codemirror/addon/fold/foldgutter.css">
|
||||
<script src="/app/static/js/codemirror/lib/codemirror.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/search/search.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/search/searchcursor.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/search/jump-to-line.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/search/matchesonscrollbar.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/search/match-highlighter.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/dialog/dialog.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/edit/matchbrackets.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/edit/closebrackets.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/comment/comment.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/wrap/hardwrap.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/fold/foldcode.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/fold/foldgutter.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/fold/brace-fold.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/fold/comment-fold.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/scroll/annotatescrollbar.js"></script>
|
||||
<script src="/app/static/js/codemirror/mode/nginx.js"></script>
|
||||
<script src="/app/static/js/codemirror/mode/haproxy.js"></script>
|
||||
<script src="/app/static/js/codemirror/keymap/sublime.js"></script>
|
||||
<script src="/app/static/js/configshow.js"></script>
|
||||
{% if is_serv_protected and g.user_params['role'] > 2 %}
|
||||
<meta http-equiv="refresh" content="0; url=/app/service">
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
{% include 'include/getstarted.html' %}
|
||||
{% else %}
|
||||
<link href="{{ url_for('static', filename='css/table-6.3.9.css') }}" rel="stylesheet" type="text/css">
|
||||
<script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/app/static/js/dataTables.min.js"></script>
|
||||
<p>
|
||||
<form action="{{ action }}" method="post" class="left-space">
|
||||
<input type="hidden" value="{{service}}" name="service" id="service">
|
||||
|
|
|
@ -110,6 +110,14 @@
|
|||
{{ checkbox('syn_flood') }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="help_cursor">
|
||||
<span title="{{lang.ha_page.use_src_help}}">{{ lang.ha_page.use_src }}</span>
|
||||
</td>
|
||||
<td class="help_cursor">
|
||||
{{ checkbox('use_src', title=lang.ha_page.use_src_help) }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="padding20 help_cursor"><span title="{{lang.ha_page.try_install}} HAProxy">HAProxy</span></td>
|
||||
<td class="help_cursor">{{ checkbox('hap', title=lang.ha_page.try_install+' HAProxy') }}</td>
|
||||
|
@ -168,6 +176,10 @@
|
|||
<td class="padding20 help_cursor"><span title="{{lang.ha_page.create_virt_server}}">{{lang.words.add|title()}} VIRT {{lang.words.server}}</span></td>
|
||||
<td class="help_cursor">{{ checkbox('vrrp-ip-add-virt_server', title=lang.ha_page.create_virt_server, checked='checked') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="padding20 help_cursor"><span title="{{lang.ha_page.use_src_help}}">{{ lang.ha_page.use_src }}</span></td>
|
||||
<td class="help_cursor">{{ checkbox('vrrp-ip-add-use_src', title=lang.ha_page.use_src_help, checked='checked') }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div id="dialog-confirm" style="display: none;">
|
||||
|
|
|
@ -7,13 +7,13 @@
|
|||
{% include 'include/no_sub.html' %}
|
||||
{% else %}
|
||||
<link href="{{ url_for('static', filename='css/table-6.3.9.css') }}" rel="stylesheet" type="text/css">
|
||||
<link href="/inc/dataTables/buttons.dataTables.min.css" rel="stylesheet" type="text/css">
|
||||
<script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/inc/dataTables/dataTables.buttons.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/inc/dataTables/jszip.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/inc/dataTables/pdfmake.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/inc/dataTables/vfs_fonts.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/inc/dataTables/buttons.html5.min.js"></script>
|
||||
<link href="/app/static/js/dataTables/buttons.dataTables.min.css" rel="stylesheet" type="text/css">
|
||||
<script type="text/javascript" charset="utf8" src="/app/static/js/dataTables.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/app/static/js/dataTables/dataTables.buttons.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/app/static/js/dataTables/jszip.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/app/static/js/dataTables/pdfmake.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/app/static/js/dataTables/vfs_fonts.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/app/static/js/dataTables/buttons.html5.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#table_history').on('page.dt')
|
||||
|
|
|
@ -27,22 +27,22 @@
|
|||
<script src="https://use.fontawesome.com/releases/v5.15.4/js/all.js" data-auto-replace-svg="nest"></script>
|
||||
<script>FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false };</script>
|
||||
<script defer src="/app/static/js/ion.sound.min.js"></script>
|
||||
<script defer src="/inc/intro/introjs.min.js"></script>
|
||||
<link href="/inc/intro/introjs.min.css" rel="stylesheet">
|
||||
<link href="/inc/intro/introjs-modern.css" rel="stylesheet">
|
||||
<script defer src="/app/static/js/intro/introjs.min.js"></script>
|
||||
<link href="/app/static/js/intro/introjs.min.css" rel="stylesheet">
|
||||
<link href="/app/static/js/intro/introjs-modern.css" rel="stylesheet">
|
||||
<link href="{{ url_for('static', filename='css/awesome-6.3.9.css') }}" rel="stylesheet">
|
||||
<link href="{{ url_for('static', filename='css/style-6.3.9.css') }}" rel="stylesheet">
|
||||
<link href="{{ url_for('static', filename='css/nprogress.css') }}" rel="stylesheet">
|
||||
<link href="{{ url_for('static', filename='css/jquery-ui.min.css') }}" rel="stylesheet">
|
||||
<link href="{{ url_for('static', filename='css/jquery-ui.structure.min.css') }}" rel="stylesheet">
|
||||
<script src="/inc/jquery-3.6.0.min.js"></script>
|
||||
<script src="/inc/jquery-ui.min.js"></script>
|
||||
<script src="/app/static/js/jquery-3.6.0.min.js"></script>
|
||||
<script src="/app/static/js/jquery-ui.min.js"></script>
|
||||
<script src="/app/static/js/js.cookie.min.js"></script>
|
||||
<script src="/app/static/js/reconnecting-websocket.js"></script>
|
||||
<script src="/app/static/js/hotkeys.js"></script>
|
||||
<link href="{{ url_for('static', filename='css/select2.css') }}" rel="stylesheet" />
|
||||
<script src="/app/static/js/select2.js"></script>
|
||||
<script src="/inc/script.js"></script>
|
||||
<script src="/app/static/js/script.js"></script>
|
||||
<script src="/app/static/js/nprogress.js"></script>
|
||||
<link href="{{ url_for('static', filename='css/toastr-6.3.9.css') }}" rel="stylesheet"/>
|
||||
<script src="/app/static/js/toastr.js"></script>
|
||||
|
|
|
@ -22,5 +22,5 @@
|
|||
</h4>
|
||||
</center>
|
||||
<div id="oops_div">
|
||||
<img src="/inc/images/oops.png" alt="Oops">
|
||||
<img src="/app/static/images/images/oops.png" alt="Oops">
|
||||
</div>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
{% block h2 %}{{ lang.p_s_page.p_s_title_history }}{% endblock %}
|
||||
{% block content %}
|
||||
<link href="{{ url_for('static', filename='css/table-6.3.9.css') }}" rel="stylesheet" type="text/css">
|
||||
<script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/app/static/js/dataTables.min.js"></script>
|
||||
<style>
|
||||
@media (max-width: 1280px) {
|
||||
.div-pannel {
|
||||
|
|
|
@ -509,6 +509,8 @@
|
|||
"check_apache_log": "Check <a href='/app/logs/internal' target='_blank' title='Internal logs'>Apache error log</a> for more information.",
|
||||
"was_installed": "was installed on",
|
||||
"start_enter": "Start typing into the network interface to add VIP",
|
||||
"use_src": "Use VIP address as source",
|
||||
"use_src_help": "Use VIP address as source for outgoing connections to backends",
|
||||
"save_apply": "<b>Save</b> - means saving the HA cluster settings for Roxy-WI, without changing the component settings on the cluster members. <br /> <b>Apply</b> - recreate the HA cluster configuration on the cluster member servers and install additional services.",
|
||||
}
|
||||
%}
|
||||
|
|
|
@ -509,6 +509,8 @@
|
|||
"check_apache_log": "Consultez <a href='/app/logs/internal' target='_blank' title='Journaux internes'>le journal des erreurs Apache</a> pour plus d’informations.",
|
||||
"was_installed": "a été installé sur",
|
||||
"start_enter": "Commencez à taper dans l'interface réseau pour ajouter VIP",
|
||||
"use_src": "Utiliser l'adresse VIP comme source",
|
||||
"use_src_help": "Utiliser l'adresse VIP comme source pour les connexions sortantes vers les backends",
|
||||
"save_apply": "<b>Enregistrer</b> - signifie enregistrer les paramètres du cluster HA pour Roxy-WI, sans modifier les paramètres des composants sur les membres du cluster. <br /> <b>Appliquer </b>: recréez la configuration du cluster HA sur les serveurs membres du cluster et installez des services supplémentaires.",
|
||||
}
|
||||
%}
|
||||
|
|
|
@ -509,6 +509,8 @@
|
|||
"check_apache_log": "Verifique <a href='/app/logs/internal' target='_blank' title='Registros internos'>o log de erros do Apache</a> para obter mais informações.",
|
||||
"was_installed": "foi instalado em",
|
||||
"start_enter": "Comece a digitar na interface de rede para adicionar VIP",
|
||||
"use_src": "Use o endereço VIP como fonte",
|
||||
"use_src_help": "Use o endereço VIP como fonte para conexões de saída para back-ends",
|
||||
"save_apply": "<b>Salvar</b> - significa salvar as configurações do cluster HA para Roxy-WI, sem alterar as configurações do componente nos membros do cluster. <br /> <b>Aplicar</b> – recrie a configuração do cluster HA nos servidores membros do cluster e instale serviços adicionais.",
|
||||
}
|
||||
%}
|
||||
|
|
|
@ -509,6 +509,8 @@
|
|||
"check_apache_log": "Проверьте <a href='/app/logs/internal' target='_blank' title='Внутренние логи'>журнал ошибок Apache</a> для получения дополнительной информации.",
|
||||
"was_installed": "был установлен на",
|
||||
"start_enter": "Начните вводить в сетевой интерфейс для добавления VIP",
|
||||
"use_src": "Использовать VIP-адрес в качестве источника",
|
||||
"use_src_help": "Использовать VIP-адрес в качестве источника исходящих подключений к бэкэндам",
|
||||
"save_apply": "<b>Сохранить</b> - подразумевает сохранение настроек HА кластера для Roxy-WI, без изменения настроек компонентов на участниках кластера. <br /> <b>Применить</b> - пересоздать конфигурацию HА кластера на серверах участниках кластера и установит дополнительные сервисы."
|
||||
}
|
||||
%}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
{% block content %}
|
||||
{% from 'include/input_macros.html' import input, checkbox, select %}
|
||||
<link href="{{ url_for('static', filename='css/table-6.3.9.css') }}" rel="stylesheet" type="text/css">
|
||||
<script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/app/static/js/dataTables.min.js"></script>
|
||||
<script type="text/javascript" charset="utf8" src="/app/static/js/runtimeapi.js"></script>
|
||||
<div id="tabs">
|
||||
<ul>
|
||||
|
|
|
@ -5,27 +5,27 @@
|
|||
{% if is_serv_protected and g.user_params['role'] > 2 %}
|
||||
<meta http-equiv="refresh" content="0; url=/app/service/{{service}}">
|
||||
{% else %}
|
||||
<link rel="stylesheet" href="/inc/codemirror/lib/codemirror.css">
|
||||
<link rel="stylesheet" href="/inc/codemirror/addon/dialog/dialog.css">
|
||||
<link rel="stylesheet" href="/inc/codemirror/addon/fold/foldgutter.css">
|
||||
<script src="/inc/codemirror/lib/codemirror.js"></script>
|
||||
<script src="/inc/codemirror/addon/search/search.js"></script>
|
||||
<script src="/inc/codemirror/addon/search/searchcursor.js"></script>
|
||||
<script src="/inc/codemirror/addon/search/jump-to-line.js"></script>
|
||||
<script src="/inc/codemirror/addon/search/matchesonscrollbar.js"></script>
|
||||
<script src="/inc/codemirror/addon/search/match-highlighter.js"></script>
|
||||
<script src="/inc/codemirror/addon/dialog/dialog.js"></script>
|
||||
<script src="/inc/codemirror/addon/edit/matchbrackets.js"></script>
|
||||
<script src="/inc/codemirror/addon/edit/closebrackets.js"></script>
|
||||
<script src="/inc/codemirror/addon/comment/comment.js"></script>
|
||||
<script src="/inc/codemirror/addon/wrap/hardwrap.js"></script>
|
||||
<script src="/inc/codemirror/addon/fold/foldcode.js"></script>
|
||||
<script src="/inc/codemirror/addon/fold/foldgutter.js"></script>
|
||||
<script src="/inc/codemirror/addon/fold/brace-fold.js"></script>
|
||||
<script src="/inc/codemirror/addon/fold/comment-fold.js"></script>
|
||||
<script src="/inc/codemirror/addon/scroll/annotatescrollbar.js"></script>
|
||||
<script src="/inc/codemirror/mode/haproxy.js"></script>
|
||||
<script src="/inc/codemirror/keymap/sublime.js"></script>
|
||||
<link rel="stylesheet" href="/app/static/js/codemirror/lib/codemirror.css">
|
||||
<link rel="stylesheet" href="/app/static/js/codemirror/addon/dialog/dialog.css">
|
||||
<link rel="stylesheet" href="/app/static/js/codemirror/addon/fold/foldgutter.css">
|
||||
<script src="/app/static/js/codemirror/lib/codemirror.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/search/search.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/search/searchcursor.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/search/jump-to-line.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/search/matchesonscrollbar.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/search/match-highlighter.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/dialog/dialog.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/edit/matchbrackets.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/edit/closebrackets.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/comment/comment.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/wrap/hardwrap.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/fold/foldcode.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/fold/foldgutter.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/fold/brace-fold.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/fold/comment-fold.js"></script>
|
||||
<script src="/app/static/js/codemirror/addon/scroll/annotatescrollbar.js"></script>
|
||||
<script src="/app/static/js/codemirror/mode/haproxy.js"></script>
|
||||
<script src="/app/static/js/codemirror/keymap/sublime.js"></script>
|
||||
<script src="/app/static/js/configshow.js"></script>
|
||||
<div class="left-space" style="margin-top: var(--indent);">
|
||||
<select autofocus required name="section" id="section">
|
||||
|
|
|
@ -91,7 +91,8 @@
|
|||
getApacheChartData(server_ip)
|
||||
{% endif %}
|
||||
{%- elif service == 'haproxy' %}
|
||||
showBytes(server_ip)
|
||||
showBytes(server_ip);
|
||||
setInterval(showBytes, 60000, server_ip);
|
||||
{%- elif service == 'keepalived' %}
|
||||
keepalivedBecameMaster(server_ip)
|
||||
{% endif %}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
{% block content %}
|
||||
{% from 'include/input_macros.html' import input, select %}
|
||||
<script src="/app/static/js/smon.js"></script>
|
||||
<script src="/inc/jquery.timeago.js" type="text/javascript"></script>
|
||||
<script src="/app/static/js/jquery.timeago.js" type="text/javascript"></script>
|
||||
<link href="{{ url_for('static', filename='css/servers.css') }}" rel="stylesheet"/>
|
||||
<link href="{{ url_for('static', filename='css/smon.css') }}" rel="stylesheet"/>
|
||||
<link href="{{ url_for('static', filename='css/ha.css') }}" rel="stylesheet">
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue