mirror of https://github.com/Aidaho12/haproxy-wi
parent
7faf04b59d
commit
c45532cfe4
|
@ -668,7 +668,7 @@ def update_db_v_6_3_18():
|
||||||
|
|
||||||
def update_ver():
|
def update_ver():
|
||||||
try:
|
try:
|
||||||
Version.update(version='7.0.2.0').execute()
|
Version.update(version='7.0.3.0').execute()
|
||||||
except Exception:
|
except Exception:
|
||||||
print('Cannot update version')
|
print('Cannot update version')
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ from flask import render_template
|
||||||
|
|
||||||
import modules.db.sql as sql
|
import modules.db.sql as sql
|
||||||
import modules.config.config as config_mod
|
import modules.config.config as config_mod
|
||||||
|
import modules.config.section as section_mod
|
||||||
import modules.server.server as server_mod
|
import modules.server.server as server_mod
|
||||||
import modules.roxywi.common as roxywi_common
|
import modules.roxywi.common as roxywi_common
|
||||||
import modules.roxy_wi_tools as roxy_wi_tools
|
import modules.roxy_wi_tools as roxy_wi_tools
|
||||||
|
@ -121,25 +122,23 @@ def change_ip_and_port(serv, backend_backend, backend_server, backend_ip, backen
|
||||||
if backend_port is None:
|
if backend_port is None:
|
||||||
return 'error: The backend port must be integer and not 0'
|
return 'error: The backend port must be integer and not 0'
|
||||||
|
|
||||||
haproxy_sock_port = sql.get_setting('haproxy_sock_port')
|
|
||||||
lines = ''
|
lines = ''
|
||||||
|
sock_port = sql.get_setting('haproxy_sock_port')
|
||||||
masters = sql.is_master(serv)
|
masters = sql.is_master(serv)
|
||||||
|
|
||||||
for master in masters:
|
for master in masters:
|
||||||
if master[0] is not None:
|
if master[0] is not None:
|
||||||
cmd = 'echo "set server %s/%s addr %s port %s check-port %s" |nc %s %s' % (
|
cmd = f'echo "set server {backend_backend}/{backend_server} addr {backend_ip} port {backend_port} ' \
|
||||||
backend_backend, backend_server, backend_ip, backend_port, backend_port, master[0], haproxy_sock_port)
|
f'check-port {backend_port}" |nc {master[0]} {sock_port}'
|
||||||
output, stderr = server_mod.subprocess_execute(cmd)
|
output, stderr = server_mod.subprocess_execute(cmd)
|
||||||
lines += output[0]
|
lines += output[0]
|
||||||
roxywi_common.logging(
|
roxywi_common.logging(
|
||||||
master[0], 'IP address and port have been changed. On: {}/{} to {}:{}'.format(
|
master[0], f'IP address and port have been changed. On: {backend_backend}/{backend_server} to {backend_ip}:{backend_port}',
|
||||||
backend_backend, backend_server, backend_ip, backend_port
|
|
||||||
),
|
|
||||||
login=1, keep_history=1, service='haproxy'
|
login=1, keep_history=1, service='haproxy'
|
||||||
)
|
)
|
||||||
|
|
||||||
cmd = 'echo "set server %s/%s addr %s port %s check-port %s" |nc %s %s' % (
|
cmd = f'echo "set server {backend_backend}/{backend_server} addr {backend_ip} port {backend_port} ' \
|
||||||
backend_backend, backend_server, backend_ip, backend_port, backend_port, serv, haproxy_sock_port)
|
f'check-port {backend_port}" |nc {serv} {sock_port}'
|
||||||
roxywi_common.logging(
|
roxywi_common.logging(
|
||||||
serv,
|
serv,
|
||||||
f'IP address and port have been changed. On: {backend_backend}/{backend_server} to {backend_ip}:{backend_port}',
|
f'IP address and port have been changed. On: {backend_backend}/{backend_server} to {backend_ip}:{backend_port}',
|
||||||
|
@ -148,15 +147,15 @@ def change_ip_and_port(serv, backend_backend, backend_server, backend_ip, backen
|
||||||
output, stderr = server_mod.subprocess_execute(cmd)
|
output, stderr = server_mod.subprocess_execute(cmd)
|
||||||
|
|
||||||
if stderr != '':
|
if stderr != '':
|
||||||
lines += 'error: ' + stderr[0]
|
return 'error: ' + stderr[0]
|
||||||
else:
|
|
||||||
lines += output[0]
|
lines += output[0]
|
||||||
configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
|
configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
|
||||||
cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg"
|
cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg"
|
||||||
|
|
||||||
config_mod.get_config(serv, cfg)
|
config_mod.get_config(serv, cfg)
|
||||||
cmd = 'string=`grep %s %s -n -A25 |grep "server %s" |head -1|awk -F"-" \'{print $1}\'` ' \
|
cmd = 'string=`grep %s %s -n -A25 |grep "server %s" |head -1|awk -F"-" \'{print $1}\'` ' \
|
||||||
'&& sed -Ei "$( echo $string)s/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5]):[0-9]+/%s:%s/g" %s' % \
|
'&& sed -Ei "$(echo $string)s/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5]):[0-9]+/%s:%s/g" %s' % \
|
||||||
(backend_backend, cfg, backend_server, backend_ip, backend_port, cfg)
|
(backend_backend, cfg, backend_server, backend_ip, backend_port, cfg)
|
||||||
server_mod.subprocess_execute(cmd)
|
server_mod.subprocess_execute(cmd)
|
||||||
config_mod.master_slave_upload_and_restart(serv, cfg, 'save', 'haproxy')
|
config_mod.master_slave_upload_and_restart(serv, cfg, 'save', 'haproxy')
|
||||||
|
@ -164,6 +163,147 @@ def change_ip_and_port(serv, backend_backend, backend_server, backend_ip, backen
|
||||||
return lines
|
return lines
|
||||||
|
|
||||||
|
|
||||||
|
def add_server_via_runtime(
|
||||||
|
server_ip: str, backend: str, server: str, backend_ip: str, backend_port: int, check: int, port_check: int
|
||||||
|
) -> tuple:
|
||||||
|
lines = ''
|
||||||
|
stderr = ''
|
||||||
|
check_cmd = ''
|
||||||
|
sock_port = sql.get_setting('haproxy_sock_port')
|
||||||
|
|
||||||
|
if check:
|
||||||
|
check_cmd = 'check'
|
||||||
|
|
||||||
|
commands = [
|
||||||
|
f'echo "add server {backend}/{server} {backend_ip}:{backend_port} {check_cmd}"|nc {server_ip} {sock_port}',
|
||||||
|
]
|
||||||
|
|
||||||
|
if check:
|
||||||
|
commands.append(f'echo "enable health {backend}/{server}"|nc {server_ip} {sock_port}')
|
||||||
|
commands.append(f'echo "set server {backend}/{server} check-addr {server_ip} check-port {port_check}"|nc {server_ip} {sock_port}')
|
||||||
|
|
||||||
|
commands.append(f'echo "set server {backend}/{server} state ready"|nc {server_ip} {sock_port}')
|
||||||
|
|
||||||
|
for cmd in commands:
|
||||||
|
output, stderr = server_mod.subprocess_execute(cmd)
|
||||||
|
lines += output[0]
|
||||||
|
return lines, stderr
|
||||||
|
|
||||||
|
|
||||||
|
def delete_server_via_runtime(server_ip: str, backend: str, server: str) -> tuple:
|
||||||
|
lines = ''
|
||||||
|
stderr = ''
|
||||||
|
sock_port = sql.get_setting('haproxy_sock_port')
|
||||||
|
|
||||||
|
commands = [
|
||||||
|
f'echo "set server {backend}/{server} state maint"|nc {server_ip} {sock_port}',
|
||||||
|
f'echo "del server {backend}/{server} "|nc {server_ip} {sock_port}',
|
||||||
|
]
|
||||||
|
|
||||||
|
for cmd in commands:
|
||||||
|
output, stderr = server_mod.subprocess_execute(cmd)
|
||||||
|
lines += output[0]
|
||||||
|
return lines, stderr
|
||||||
|
|
||||||
|
|
||||||
|
def add_server(
|
||||||
|
server_ip: str, backend: str, server: str, backend_ip: str, backend_port: int, check: int, port_check: int
|
||||||
|
) -> str:
|
||||||
|
lines = ''
|
||||||
|
stderr = ''
|
||||||
|
check_cfg = ''
|
||||||
|
check = int(check)
|
||||||
|
masters = sql.is_master(server_ip)
|
||||||
|
|
||||||
|
for master in masters:
|
||||||
|
if master[0] is not None:
|
||||||
|
line, error = add_server_via_runtime(master[0], backend, server, backend_ip, backend_port, check, port_check)
|
||||||
|
lines += f'{master[0]}: {line}<br />'
|
||||||
|
stderr += error
|
||||||
|
roxywi_common.logging(
|
||||||
|
master[0], f'A new backend server has been add: {backend}/{server}', login=1, keep_history=1, service='haproxy'
|
||||||
|
)
|
||||||
|
|
||||||
|
line, error = add_server_via_runtime(server_ip, backend, server, backend_ip, backend_port, check, port_check)
|
||||||
|
lines += f'{server_ip}: {line}<br />'
|
||||||
|
stderr += error
|
||||||
|
roxywi_common.logging(
|
||||||
|
server_ip, f'A new backend server has been add: {backend}/{server}', login=1, keep_history=1, service='haproxy'
|
||||||
|
)
|
||||||
|
|
||||||
|
if 'Already exists a server' in lines:
|
||||||
|
return f'error: {lines}'
|
||||||
|
|
||||||
|
if stderr != '':
|
||||||
|
return f'error: {stderr}'
|
||||||
|
|
||||||
|
if check:
|
||||||
|
check_cfg = f'check port {port_check}'
|
||||||
|
|
||||||
|
configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
|
||||||
|
cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}.cfg"
|
||||||
|
try:
|
||||||
|
config_mod.get_config(server_ip, cfg)
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception(f'error: Cannot config section: {e}')
|
||||||
|
section_name_cmd = f'grep {backend} {cfg}'
|
||||||
|
section_name = server_mod.subprocess_execute(section_name_cmd)
|
||||||
|
|
||||||
|
try:
|
||||||
|
start_line, end_line, return_config = section_mod.get_section_from_config(cfg, section_name[0][0])
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception(f'error: Cannot get config section: {e}')
|
||||||
|
new_end_line = int(end_line) + 1
|
||||||
|
new_server_cfg = f'\ \server {backend_ip} {backend_ip}:{backend_port} {check_cfg}'
|
||||||
|
cmd = f"sed -i '{new_end_line} i {new_server_cfg}' {cfg}"
|
||||||
|
server_mod.subprocess_execute(cmd)
|
||||||
|
try:
|
||||||
|
config_mod.master_slave_upload_and_restart(server_ip, cfg, 'save', 'haproxy')
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception(f'error: Cannot save a new config: {e}')
|
||||||
|
|
||||||
|
return lines
|
||||||
|
|
||||||
|
|
||||||
|
def delete_server(server_ip: str, backend: str, server: str) -> str:
|
||||||
|
lines = ''
|
||||||
|
stderr = ''
|
||||||
|
masters = sql.is_master(server_ip)
|
||||||
|
|
||||||
|
for master in masters:
|
||||||
|
if master[0] is not None:
|
||||||
|
line, error = delete_server_via_runtime(master[0], backend, server)
|
||||||
|
lines += f'{master[0]}: {line}<br />'
|
||||||
|
stderr += error
|
||||||
|
roxywi_common.logging(
|
||||||
|
master[0], f'Server has been deleted: {backend}/{server}', login=1, keep_history=1, service='haproxy'
|
||||||
|
)
|
||||||
|
|
||||||
|
line, error = delete_server_via_runtime(server_ip, backend, server)
|
||||||
|
lines += f'{server_ip}: {line}<br />'
|
||||||
|
stderr += error
|
||||||
|
roxywi_common.logging(
|
||||||
|
server_ip, f'Server has been deleted: {backend}/{server}', login=1, keep_history=1, service='haproxy'
|
||||||
|
)
|
||||||
|
|
||||||
|
if stderr != '':
|
||||||
|
return 'error: ' + stderr[0]
|
||||||
|
|
||||||
|
if 'No such server' in lines:
|
||||||
|
return f'error: {lines}'
|
||||||
|
|
||||||
|
configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
|
||||||
|
cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}.cfg"
|
||||||
|
|
||||||
|
config_mod.get_config(server_ip, cfg)
|
||||||
|
cmd = f'string=`grep {backend} {cfg} -n -A25 |grep "server {server}" |head -1|awk -F"-" \'{{print $1}}\'` && sed -i "$(echo $string)d" {cfg}'
|
||||||
|
print(cmd)
|
||||||
|
server_mod.subprocess_execute(cmd)
|
||||||
|
config_mod.master_slave_upload_and_restart(server_ip, cfg, 'save', 'haproxy')
|
||||||
|
|
||||||
|
return lines
|
||||||
|
|
||||||
|
|
||||||
def change_maxconn_global(serv: str, maxconn: int) -> str:
|
def change_maxconn_global(serv: str, maxconn: int) -> str:
|
||||||
if maxconn is None:
|
if maxconn is None:
|
||||||
return 'error: Maxconn must be integer and not 0'
|
return 'error: Maxconn must be integer and not 0'
|
||||||
|
|
|
@ -4193,17 +4193,35 @@ def add_status_page(name: str, slug: str, desc: str, group_id: int, checks: list
|
||||||
try:
|
try:
|
||||||
last_id = SmonStatusPage.insert(name=name, slug=slug, group_id=group_id, desc=desc).execute()
|
last_id = SmonStatusPage.insert(name=name, slug=slug, group_id=group_id, desc=desc).execute()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if '1062, "Duplicate entry' in str(e):
|
if 'Duplicate entry' in str(e):
|
||||||
raise Exception('error: The Slug is already taken, please enter another one')
|
raise Exception('error: The Slug is already taken, please enter another one')
|
||||||
else:
|
else:
|
||||||
out_error(e)
|
out_error(e)
|
||||||
else:
|
else:
|
||||||
for check in checks:
|
add_status_page_checks(last_id, checks)
|
||||||
|
return last_id
|
||||||
|
|
||||||
|
|
||||||
|
def edit_status_page(page_id: int, name: str, slug: str, desc: str) -> None:
|
||||||
try:
|
try:
|
||||||
SmonStatusPageCheck.insert(page_id=last_id, check_id=int(check)).execute()
|
SmonStatusPage.update(name=name, slug=slug, desc=desc).where(SmonStatusPage.id == page_id).execute()
|
||||||
|
except Exception as e:
|
||||||
|
out_error(e)
|
||||||
|
|
||||||
|
|
||||||
|
def add_status_page_checks(page_id: int, checks: list) -> None:
|
||||||
|
for check in checks:
|
||||||
|
try:
|
||||||
|
SmonStatusPageCheck.insert(page_id=page_id, check_id=int(check)).execute()
|
||||||
|
except Exception as e:
|
||||||
|
out_error(e)
|
||||||
|
|
||||||
|
|
||||||
|
def delete_status_page_checks(page_id: int) -> None:
|
||||||
|
try:
|
||||||
|
SmonStatusPageCheck.delete().where(SmonStatusPageCheck.page_id == page_id).execute()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
out_error(e)
|
out_error(e)
|
||||||
return last_id
|
|
||||||
|
|
||||||
|
|
||||||
def select_status_pages(group_id: int):
|
def select_status_pages(group_id: int):
|
||||||
|
|
|
@ -152,6 +152,20 @@ def create_status_page(name: str, slug: str, desc: str, checks: list) -> str:
|
||||||
return render_template('ajax/smon/status_pages.html', pages=pages)
|
return render_template('ajax/smon/status_pages.html', pages=pages)
|
||||||
|
|
||||||
|
|
||||||
|
def edit_status_page(page_id: int, name: str, slug: str, desc: str, checks: list) -> str:
|
||||||
|
sql.delete_status_page_checks(page_id)
|
||||||
|
|
||||||
|
try:
|
||||||
|
sql.add_status_page_checks(page_id, checks)
|
||||||
|
sql.edit_status_page(page_id, name, slug, desc)
|
||||||
|
except Exception as e:
|
||||||
|
return f'error: Cannot update update status page: {e}'
|
||||||
|
|
||||||
|
pages = sql.select_status_page_by_id(page_id)
|
||||||
|
|
||||||
|
return render_template('ajax/smon/status_pages.html', pages=pages)
|
||||||
|
|
||||||
|
|
||||||
def show_status_page(slug: str) -> str:
|
def show_status_page(slug: str) -> str:
|
||||||
page = sql.select_status_page(slug)
|
page = sql.select_status_page(slug)
|
||||||
checks_status = {}
|
checks_status = {}
|
||||||
|
@ -175,8 +189,9 @@ def show_status_page(slug: str) -> str:
|
||||||
desc = s.desc
|
desc = s.desc
|
||||||
group = s.group
|
group = s.group
|
||||||
check_type = s.check_type
|
check_type = s.check_type
|
||||||
|
en = s.en
|
||||||
uptime = check_uptime(check_id)
|
uptime = check_uptime(check_id)
|
||||||
|
|
||||||
checks_status[check_id] = {'uptime': uptime, 'name': name, 'desc': desc, 'group': group, 'check_type': check_type}
|
checks_status[check_id] = {'uptime': uptime, 'name': name, 'desc': desc, 'group': group, 'check_type': check_type, 'en': en}
|
||||||
|
|
||||||
return render_template('smon/status_page.html', page=page, checks_status=checks_status)
|
return render_template('smon/status_page.html', page=page, checks_status=checks_status)
|
||||||
|
|
|
@ -61,18 +61,27 @@ def show_backend_server(server_ip, backend, backend_server):
|
||||||
return f'{e}'
|
return f'{e}'
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/change/ip', methods=['POST'])
|
@bp.route('/server', methods=['POST', 'PUT', 'DELETE'])
|
||||||
def change_ip_port():
|
def change_ip_port():
|
||||||
server_ip = common.is_ip_or_dns(request.form.get('serv'))
|
server_ip = common.is_ip_or_dns(request.form.get('serv'))
|
||||||
backend_backend = common.checkAjaxInput(request.form.get('backend_backend'))
|
backend_backend = common.checkAjaxInput(request.form.get('backend_backend'))
|
||||||
backend_server = common.checkAjaxInput(request.form.get('backend_server'))
|
backend_server = common.checkAjaxInput(request.form.get('backend_server'))
|
||||||
backend_ip = common.checkAjaxInput(request.form.get('backend_ip'))
|
backend_ip = common.checkAjaxInput(request.form.get('backend_ip'))
|
||||||
backend_port = common.checkAjaxInput(request.form.get('backend_port'))
|
backend_port = common.checkAjaxInput(request.form.get('backend_port'))
|
||||||
|
if request.method == 'PUT':
|
||||||
try:
|
try:
|
||||||
return runtime.change_ip_and_port(server_ip, backend_backend, backend_server, backend_ip, backend_port)
|
return runtime.change_ip_and_port(server_ip, backend_backend, backend_server, backend_ip, backend_port)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return f'{e}'
|
return f'{e}'
|
||||||
|
elif request.method == 'POST':
|
||||||
|
check = common.checkAjaxInput(request.form.get('check'))
|
||||||
|
port_check = common.checkAjaxInput(request.form.get('port_check'))
|
||||||
|
try:
|
||||||
|
return runtime.add_server(server_ip, backend_backend, backend_server, backend_ip, backend_port, check, port_check)
|
||||||
|
except Exception as e:
|
||||||
|
return f'{e}'
|
||||||
|
elif request.method == 'DELETE':
|
||||||
|
return runtime.delete_server(server_ip, backend_backend, backend_server)
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/maxconn/<server_ip>')
|
@bp.route('/maxconn/<server_ip>')
|
||||||
|
|
|
@ -72,10 +72,11 @@ def smon_dashboard(dashboard_id, check_id):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/status-page')
|
@bp.route('/status-page', methods=['GET', 'POST', 'DELETE', 'PUT'])
|
||||||
@login_required
|
@login_required
|
||||||
@get_user_params()
|
@get_user_params()
|
||||||
def status_page():
|
def status_page():
|
||||||
|
if request.method == 'GET':
|
||||||
user_params = g.user_params
|
user_params = g.user_params
|
||||||
user_group = roxywi_common.get_user_group(id=1)
|
user_group = roxywi_common.get_user_group(id=1)
|
||||||
smon_list = sql.smon_list(user_group)
|
smon_list = sql.smon_list(user_group)
|
||||||
|
@ -84,15 +85,12 @@ def status_page():
|
||||||
user_subscription = roxywi_common.return_user_subscription()
|
user_subscription = roxywi_common.return_user_subscription()
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
'smon/manage_status_page.html', role=user_params['role'], user=user_params['user'], lang=user_params['lang'],
|
'smon/manage_status_page.html', role=user_params['role'], user=user_params['user'],
|
||||||
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], smon_error=stderr, pages=pages,
|
lang=user_params['lang'], pages=pages, smon_status=smon_status,
|
||||||
token=user_params['token'], user_services=user_params['user_services'], smon=smon_list, smon_status=smon_status
|
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], smon_error=stderr,
|
||||||
|
token=user_params['token'], user_services=user_params['user_services'], smon=smon_list,
|
||||||
)
|
)
|
||||||
|
elif request.method == 'POST':
|
||||||
|
|
||||||
@bp.post('/status-page/add')
|
|
||||||
@login_required
|
|
||||||
def add_status_page():
|
|
||||||
name = common.checkAjaxInput(request.form.get('name'))
|
name = common.checkAjaxInput(request.form.get('name'))
|
||||||
slug = common.checkAjaxInput(request.form.get('slug'))
|
slug = common.checkAjaxInput(request.form.get('slug'))
|
||||||
desc = common.checkAjaxInput(request.form.get('desc'))
|
desc = common.checkAjaxInput(request.form.get('desc'))
|
||||||
|
@ -105,11 +103,22 @@ def add_status_page():
|
||||||
return smon_mod.create_status_page(name, slug, desc, checks['checks'])
|
return smon_mod.create_status_page(name, slug, desc, checks['checks'])
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return f'{e}'
|
return f'{e}'
|
||||||
|
elif request.method == 'PUT':
|
||||||
|
page_id = int(request.form.get('page_id'))
|
||||||
|
name = common.checkAjaxInput(request.form.get('name'))
|
||||||
|
slug = common.checkAjaxInput(request.form.get('slug'))
|
||||||
|
desc = common.checkAjaxInput(request.form.get('desc'))
|
||||||
|
checks = json.loads(request.form.get('checks'))
|
||||||
|
|
||||||
|
if not len(checks['checks']):
|
||||||
|
return 'error: Please check Checks for Status page'
|
||||||
|
|
||||||
@bp.route('/status-page/delete/<int:page_id>')
|
try:
|
||||||
@login_required
|
return smon_mod.edit_status_page(page_id, name, slug, desc, checks['checks'])
|
||||||
def delete_status_page(page_id):
|
except Exception as e:
|
||||||
|
return f'{e}'
|
||||||
|
elif request.method == 'DELETE':
|
||||||
|
page_id = int(request.form.get('page_id'))
|
||||||
try:
|
try:
|
||||||
sql.delete_status_page(page_id)
|
sql.delete_status_page(page_id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -118,6 +127,21 @@ def delete_status_page(page_id):
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route('/status/checks/<int:page_id>')
|
||||||
|
@login_required
|
||||||
|
def get_checks(page_id):
|
||||||
|
returned_check = []
|
||||||
|
try:
|
||||||
|
checks = sql.select_status_page_checks(page_id)
|
||||||
|
except Exception as e:
|
||||||
|
return f'error: Cannot get checks: {e}'
|
||||||
|
|
||||||
|
for check in checks:
|
||||||
|
returned_check.append(str(check.check_id))
|
||||||
|
|
||||||
|
return jsonify(returned_check)
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/status/<slug>')
|
@bp.route('/status/<slug>')
|
||||||
def show_smon_status_page(slug):
|
def show_smon_status_page(slug):
|
||||||
slug = common.checkAjaxInput(slug)
|
slug = common.checkAjaxInput(slug)
|
||||||
|
|
|
@ -5,11 +5,12 @@
|
||||||
<div>
|
<div>
|
||||||
<span class="page_name" id="page_name-{{page}}">{{page.name}}</span>
|
<span class="page_name" id="page_name-{{page}}">{{page.name}}</span>
|
||||||
{% if page.desc %}
|
{% if page.desc %}
|
||||||
<span class="page_desc">({{page.desc|replace("'", "")}})</span>
|
<span class="page_desc" id="page_desc-{{page}}">({{page.desc|replace("'", "")}})</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="page_slug">/app/smon/status/{{page.slug}}</div>
|
<div class="page_slug" id="page_slug-{{page}}">/app/smon/status/{{page.slug}}</div>
|
||||||
</a>
|
</a>
|
||||||
|
<div class="edit status_page-edit" onclick="createStatusPageStep1('true', '{{page}}')"></div>
|
||||||
<div class="delete" onclick="confirmDeleteStatusPage('{{page}}')"></div>
|
<div class="delete" onclick="confirmDeleteStatusPage('{{page}}')"></div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<li><a href="#runtimeapi" title="Runtime API - Roxy-WI">Runtime API</a></li>
|
<li><a href="#runtimeapi" title="Runtime API - Roxy-WI">Runtime API</a></li>
|
||||||
{% if role <= 3 %}
|
{% if role <= 3 %}
|
||||||
<li><a href="#maxconn" title="Runtime API: {{lang.words.change|title()}} Maxconn - Roxy-WI">{{lang.words.change|title()}} Maxconn</a></li>
|
<li><a href="#maxconn" title="Runtime API: {{lang.words.change|title()}} Maxconn - Roxy-WI">{{lang.words.change|title()}} Maxconn</a></li>
|
||||||
<li><a href="#ip" title="Runtime API: {{lang.words.change|title()}} IP {{lang.words.and}} {{lang.words.port}} {{lang.words.backend}} {{lang.words.servers}} - Roxy-WI">{{lang.words.change|title()}} IP {{lang.words.and}} {{lang.words.port}}</a></li>
|
<li><a href="#servers" title="Runtime API: {{lang.words.servers|title()}} - Roxy-WI">{{lang.words.servers|title()}}</a></li>
|
||||||
<li><a href="#table" title="Runtime API: Stick Table - Roxy-WI">Stick Table</a></li>
|
<li><a href="#table" title="Runtime API: Stick Table - Roxy-WI">Stick Table</a></li>
|
||||||
<li><a href="#lists" title="Runtime API: {{lang.words.change|title()}} {{lang.words.dynamically}}} whitelist {{lang.words.and}} blacklist - Roxy-WI">{{lang.words.lists|title()}}</a></li>
|
<li><a href="#lists" title="Runtime API: {{lang.words.change|title()}} {{lang.words.dynamically}}} whitelist {{lang.words.and}} blacklist - Roxy-WI">{{lang.words.lists|title()}}</a></li>
|
||||||
<li><a href="#sessions" title="Runtime API: {{lang.words.sessions|title()}}} - Roxy-WI">{{lang.words.sessions|title()}}</a></li>
|
<li><a href="#sessions" title="Runtime API: {{lang.words.sessions|title()}}} - Roxy-WI">{{lang.words.sessions|title()}}</a></li>
|
||||||
|
@ -185,12 +185,55 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="ip">
|
<div id="servers">
|
||||||
<table class="overview">
|
<table class="overview">
|
||||||
|
<catption><h3>{{lang.words.add|title()}} {{lang.words.backend}} {{lang.words.servers}}</h3></catption>
|
||||||
<tr class="overviewHead">
|
<tr class="overviewHead">
|
||||||
<td class="padding10 first-collumn">{{lang.words.server|title()}}</td>
|
<td class="padding10 first-collumn">{{lang.words.server|title()}}</td>
|
||||||
<td>{{lang.words.select|title()}} {{lang.words.backend|title()}}</td>
|
<td class="padding10 first-collumn">{{lang.words.select|title()}} {{lang.words.backend|title()}}</td>
|
||||||
<td>{{lang.words.select|title()}} {{lang.words.server}}</td>
|
<td class="padding10 first-collumn">{{lang.words.new|title()}} {{lang.words.server}} IP</td>
|
||||||
|
<td>{{lang.words.new|title()}} {{lang.words.port}}</td>
|
||||||
|
<td>{{lang.words.check|title()}}</td>
|
||||||
|
<td>{{lang.words.new|title()}} {{lang.words.check}} {{lang.words.port}}</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="padding10 first-collumn" style="width: 25%;">
|
||||||
|
<form action="" method="post" id="runtimeapiServerIp">
|
||||||
|
<select autofocus required name="ip_select_server" id="ip_select_server">
|
||||||
|
<option disabled selected>------</option>
|
||||||
|
{% for select in selects %}
|
||||||
|
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
<td class="padding10 first-collumn">
|
||||||
|
<select required name="ipBackendServer" id="ipBackendServer"></select>
|
||||||
|
</td>
|
||||||
|
<td class="padding10 first-collumn">
|
||||||
|
{{ input('backend_ip_server', title=lang.words.set|title()+' '+lang.words.new + ' ' + lang.words.server + ' IP', required='required', size='16') }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ input('backend_port_server', title=lang.words.set|title()+' '+lang.words.new + ' ' + lang.words.server + ' ' + lang.words.port, type="number", required='required', style='width:60px') }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ checkbox('backend_server_check', value='1', checked='checked') }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ input('backend_port_server_check', title=lang.words.set|title()+' '+lang.words.new + ' ' + lang.words.server + '' + lang.words.check + ' ' + lang.words.port, type="number", required='required', style='width:60px') }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<button type="submit" name="add" value="Add" id="enter_server">{{lang.words.add|title()}}</button>
|
||||||
|
</td>
|
||||||
|
</form>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<table class="overview">
|
||||||
|
<catption><h3>{{lang.words.change|title()}} IP {{lang.words.and}} {{lang.words.port}} {{lang.words.backend}} {{lang.words.servers}}</h3></catption>
|
||||||
|
<tr class="overviewHead">
|
||||||
|
<td class="padding10 first-collumn">{{lang.words.server|title()}}</td>
|
||||||
|
<td class="padding10 first-collumn">{{lang.words.select|title()}} {{lang.words.backend|title()}}</td>
|
||||||
|
<td class="padding10 first-collumn">{{lang.words.select|title()}} {{lang.words.server}}</td>
|
||||||
<td>{{lang.words.new|title()}} IP</td>
|
<td>{{lang.words.new|title()}} IP</td>
|
||||||
<td>{{lang.words.new|title()}} {{lang.words.port}}</td>
|
<td>{{lang.words.new|title()}} {{lang.words.port}}</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
|
@ -205,20 +248,50 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td class="padding10 first-collumn">
|
||||||
<select required name="ipbackend" id="ipbackend"></select>
|
<select required name="ipbackend" id="ipbackend"></select>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td class="padding10 first-collumn">
|
||||||
<select required name="backend_server" id="backend_server"></select>
|
<select required name="backend_server" id="backend_server"></select>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ input('backend_ip', title=lang.words.set|title()+' '+lang.words.new + ' ' + lang.words.server + ' IP', required='required', size='16') }}
|
{{ input('backend_ip', title=lang.words.set|title()+' '+lang.words.new + ' ' + lang.words.server + ' IP', required='required', size='16') }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ input('backend_port', title=lang.words.set|title()+' '+lang.words.new + ' ' + lang.words.server + ' ' + lang.words.port, type="number", required='required', size='6') }}
|
{{ input('backend_port', title=lang.words.set|title()+' '+lang.words.new + ' ' + lang.words.server + ' ' + lang.words.port, type="number", required='required', style='width:60px') }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<button type="submit" name="Enter" value="Enter" id="enter">Enter</button>
|
<button type="submit" name="Enter" value="Change" id="change">{{lang.words.change|title()}}</button>
|
||||||
|
</td>
|
||||||
|
</form>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<table class="overview">
|
||||||
|
<catption><h3>{{lang.words.delete|title()}} {{lang.words.backend}} {{lang.words.servers}}</h3></catption>
|
||||||
|
<tr class="overviewHead">
|
||||||
|
<td class="padding10 first-collumn">{{lang.words.server|title()}}</td>
|
||||||
|
<td class="padding10 first-collumn">{{lang.words.select|title()}} {{lang.words.backend|title()}}</td>
|
||||||
|
<td class="padding10 first-collumn">{{lang.words.select|title()}} {{lang.words.server}}</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="padding10 first-collumn" style="width: 25%;">
|
||||||
|
<form action="" method="post" id="runtimeapiip_delete">
|
||||||
|
<select autofocus required name="ip_select_delete" id="ip_select_delete">
|
||||||
|
<option disabled selected>------</option>
|
||||||
|
{% for select in selects %}
|
||||||
|
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
<td class="padding10 first-collumn">
|
||||||
|
<select required name="ipbackend_delete" id="ipbackend_delete"></select>
|
||||||
|
</td>
|
||||||
|
<td class="padding10 first-collumn">
|
||||||
|
<select required name="backend_server_delete" id="backend_server_delete"></select>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<button type="submit" name="Enter" value="delete" id="delete">{{lang.words.delete|title()}}</button>
|
||||||
</td>
|
</td>
|
||||||
</form>
|
</form>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -115,6 +115,23 @@ $( function() {
|
||||||
let backend = $('#ipbackend').val();
|
let backend = $('#ipbackend').val();
|
||||||
get_backend_servers(server_ip, backend, '#backend_server', 1);
|
get_backend_servers(server_ip, backend, '#backend_server', 1);
|
||||||
});
|
});
|
||||||
|
$("#ip_select_server").on('selectmenuchange', function () {
|
||||||
|
let server_ip = $('#ip_select_server').val();
|
||||||
|
get_backends(server_ip, '#ipBackendServer', 0);
|
||||||
|
});
|
||||||
|
$("#ip_select_delete").on('selectmenuchange', function () {
|
||||||
|
let server_ip = $('#ip_select_delete').val();
|
||||||
|
get_backends(server_ip, '#ipbackend_delete', 0);
|
||||||
|
});
|
||||||
|
$("#ipbackend_delete").on('selectmenuchange', function () {
|
||||||
|
let server_ip = $('#ip_select_delete').val();
|
||||||
|
let backend = $('#ipbackend_delete').val();
|
||||||
|
get_backend_servers(server_ip, backend, '#backend_server_delete', 0);
|
||||||
|
});
|
||||||
|
$('#backend_port_server').on('input', function () {
|
||||||
|
var iNum = parseInt($('#backend_port_server').val());
|
||||||
|
$('#backend_port_server_check').val(iNum);
|
||||||
|
});
|
||||||
$("#backend_server").on('selectmenuchange', function () {
|
$("#backend_server").on('selectmenuchange', function () {
|
||||||
$('#backend_ip').val();
|
$('#backend_ip').val();
|
||||||
$('#backend_port').val();
|
$('#backend_port').val();
|
||||||
|
@ -137,7 +154,7 @@ $( function() {
|
||||||
});
|
});
|
||||||
$('#runtimeapiip').submit(function () {
|
$('#runtimeapiip').submit(function () {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "/app/runtimeapi/change/ip",
|
url: "/app/runtimeapi/server",
|
||||||
data: {
|
data: {
|
||||||
serv: $('#ip_select').val(),
|
serv: $('#ip_select').val(),
|
||||||
backend_backend: $('#ipbackend').val(),
|
backend_backend: $('#ipbackend').val(),
|
||||||
|
@ -146,6 +163,35 @@ $( function() {
|
||||||
backend_port: $('#backend_port').val(),
|
backend_port: $('#backend_port').val(),
|
||||||
token: $('#token').val()
|
token: $('#token').val()
|
||||||
},
|
},
|
||||||
|
type: "PUT",
|
||||||
|
success: function (data) {
|
||||||
|
data = data.replace(/\s+/g, ' ');
|
||||||
|
if (data.indexOf('error: ') != '-1' || data.indexOf('Invalid ') != '-1') {
|
||||||
|
toastr.error(data);
|
||||||
|
} else {
|
||||||
|
toastr.success(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
$('#runtimeapiServerIp').submit(function () {
|
||||||
|
let check = 0;
|
||||||
|
if($('#backend_server_check').prop('checked')) {
|
||||||
|
check = 1;
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
url: "/app/runtimeapi/server",
|
||||||
|
data: {
|
||||||
|
serv: $('#ip_select_server').val(),
|
||||||
|
backend_backend: $('#ipBackendServer').val(),
|
||||||
|
backend_server: $('#backend_ip_server').val(),
|
||||||
|
backend_ip: $('#backend_ip_server').val(),
|
||||||
|
backend_port: $('#backend_port_server').val(),
|
||||||
|
check: check,
|
||||||
|
port_check: $('#backend_port_server_check').val(),
|
||||||
|
token: $('#token').val()
|
||||||
|
},
|
||||||
type: "POST",
|
type: "POST",
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
data = data.replace(/\s+/g, ' ');
|
data = data.replace(/\s+/g, ' ');
|
||||||
|
@ -158,6 +204,36 @@ $( function() {
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
$('#runtimeapiip_delete').submit(function () {
|
||||||
|
$.ajax({
|
||||||
|
url: "/app/runtimeapi/server",
|
||||||
|
data: {
|
||||||
|
serv: $('#ip_select_delete').val(),
|
||||||
|
backend_backend: $('#ipbackend_delete').val(),
|
||||||
|
backend_server: $('#backend_server_delete').val(),
|
||||||
|
token: $('#token').val()
|
||||||
|
},
|
||||||
|
type: "DELETE",
|
||||||
|
success: function (data) {
|
||||||
|
data = data.replace(/\s+/g, ' ');
|
||||||
|
if (data.indexOf('error: ') != '-1' || data.indexOf('Invalid ') != '-1') {
|
||||||
|
toastr.error(data);
|
||||||
|
} else {
|
||||||
|
toastr.success(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
$('#backend_server_check').click(function() {
|
||||||
|
if ($('#backend_server_check').prop('checked')) {
|
||||||
|
$('#backend_ip_server_check').prop('required', true);
|
||||||
|
$('#backend_port_server_check').prop('required', true);
|
||||||
|
} else {
|
||||||
|
$('#backend_ip_server_check').prop('required', false);
|
||||||
|
$('#backend_port_server_check').prop('required', false);
|
||||||
|
}
|
||||||
|
});
|
||||||
$("#table_serv_select").on('selectmenuchange', function () {
|
$("#table_serv_select").on('selectmenuchange', function () {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "/app/runtimeapi/tables/" + $('#table_serv_select').val(),
|
url: "/app/runtimeapi/tables/" + $('#table_serv_select').val(),
|
||||||
|
@ -431,7 +507,7 @@ function get_backends(server_ip, backends_select_tag, ip_and_port=0) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} );
|
});
|
||||||
}
|
}
|
||||||
function get_backend_servers(server_ip, backend, servers_select_tag, ip_and_port=0) {
|
function get_backend_servers(server_ip, backend, servers_select_tag, ip_and_port=0) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
|
|
114
inc/smon.js
114
inc/smon.js
|
@ -403,13 +403,19 @@ function show_smon_history_statuses(dashboard_id, id_for_history_replace) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function createStatusPageStep1() {
|
function createStatusPageStep1(edited=false, page_id=0) {
|
||||||
var add_word = $('#translate').attr('data-next');
|
var add_word = $('#translate').attr('data-next');
|
||||||
var cancel_word = $('#translate').attr('data-cancel');
|
var cancel_word = $('#translate').attr('data-cancel');
|
||||||
var next_word = $('#translate').attr('data-next');
|
var next_word = $('#translate').attr('data-next');
|
||||||
var smon_add_tabel_title = $( "#create-status-page-step-1-overview" ).attr('title');
|
var smon_add_tabel_title = $("#create-status-page-step-1-overview").attr('title');
|
||||||
|
if (edited) {
|
||||||
|
smon_add_tabel_title = $("#create-status-page-step-1-overview").attr('data-edit');
|
||||||
|
$('#new-status-page-name').val($('#page_name-'+page_id).text());
|
||||||
|
$('#new-status-page-slug').val($('#page_slug-'+page_id).text().split('/').pop());
|
||||||
|
$('#new-status-page-desc').val($('#page_desc-'+page_id).text().replace('(','').replace(')',''));
|
||||||
|
}
|
||||||
var regx = /^[a-z0-9_-]+$/;
|
var regx = /^[a-z0-9_-]+$/;
|
||||||
var addSmonStatus = $( "#create-status-page-step-1" ).dialog({
|
var addSmonStatus = $("#create-status-page-step-1").dialog({
|
||||||
autoOpen: false,
|
autoOpen: false,
|
||||||
resizable: false,
|
resizable: false,
|
||||||
height: "auto",
|
height: "auto",
|
||||||
|
@ -432,7 +438,7 @@ function createStatusPageStep1() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!regx.test($('#new-status-page-slug').val())) {
|
if (!regx.test($('#new-status-page-slug').val())) {
|
||||||
toastr.error('error: Incorect Slug');
|
toastr.error('error: Incorrect Slug');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ($('#new-status-page-slug').val().indexOf('--') != '-1') {
|
if ($('#new-status-page-slug').val().indexOf('--') != '-1') {
|
||||||
|
@ -443,25 +449,44 @@ function createStatusPageStep1() {
|
||||||
toastr.error('error: Fill in the Slug field');
|
toastr.error('error: Fill in the Slug field');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
createStatusPageStep2();
|
createStatusPageStep2(edited, page_id);
|
||||||
$(this).dialog("close");
|
$(this).dialog("close");
|
||||||
toastr.clear();
|
toastr.clear();
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
text: cancel_word,
|
text: cancel_word,
|
||||||
click: function () {
|
click: function () {
|
||||||
$(this).dialog("close");
|
clearStatusPageDialog($(this));
|
||||||
clearTips();
|
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
});
|
});
|
||||||
addSmonStatus.dialog('open');
|
addSmonStatus.dialog('open');
|
||||||
}
|
}
|
||||||
function createStatusPageStep2() {
|
function createStatusPageStep2(edited, page_id) {
|
||||||
var add_word = $('#translate').attr('data-add');
|
var add_word = $('#translate').attr('data-add');
|
||||||
var cancel_word = $('#translate').attr('data-cancel');
|
var cancel_word = $('#translate').attr('data-cancel');
|
||||||
var back_word = $('#translate').attr('data-back');
|
var back_word = $('#translate').attr('data-back');
|
||||||
var smon_add_tabel_title = $("#create-status-page-step-2-overview").attr('title');
|
var smon_add_tabel_title = $("#create-status-page-step-2-overview").attr('title');
|
||||||
|
if (edited) {
|
||||||
|
smon_add_tabel_title = $("#create-status-page-step-2-overview").attr('data-edit');
|
||||||
|
add_word = $('#translate').attr('data-edit');
|
||||||
|
if ($("#enabled-check > div").length == 0) {
|
||||||
|
$.ajax({
|
||||||
|
url: "/app/smon/status/checks/" + page_id,
|
||||||
|
async: false,
|
||||||
|
type: "GET",
|
||||||
|
success: function (data) {
|
||||||
|
if (data.indexOf('error:') != '-1') {
|
||||||
|
toastr.error(data);
|
||||||
|
} else {
|
||||||
|
for (let i = 0; i < data.length; i++) {
|
||||||
|
addCheckToStatus(data[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
var addSmonStatus = $("#create-status-page-step-2").dialog({
|
var addSmonStatus = $("#create-status-page-step-2").dialog({
|
||||||
autoOpen: false,
|
autoOpen: false,
|
||||||
resizable: false,
|
resizable: false,
|
||||||
|
@ -480,24 +505,38 @@ function createStatusPageStep2() {
|
||||||
buttons: [{
|
buttons: [{
|
||||||
text: add_word,
|
text: add_word,
|
||||||
click: function () {
|
click: function () {
|
||||||
|
if (edited) {
|
||||||
|
editStatusPage($(this), page_id);
|
||||||
|
} else {
|
||||||
createStatusPage($(this));
|
createStatusPage($(this));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
text: back_word,
|
text: back_word,
|
||||||
click: function () {
|
click: function () {
|
||||||
$(this).dialog("close");
|
$(this).dialog("close");
|
||||||
createStatusPageStep1();
|
createStatusPageStep1(edited, page_id);
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
text: cancel_word,
|
text: cancel_word,
|
||||||
click: function () {
|
click: function () {
|
||||||
$(this).dialog("close");
|
clearStatusPageDialog($(this));
|
||||||
clearTips();
|
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
});
|
});
|
||||||
addSmonStatus.dialog('open');
|
addSmonStatus.dialog('open');
|
||||||
}
|
}
|
||||||
|
function clearStatusPageDialog(dialog_id) {
|
||||||
|
dialog_id.dialog("close");
|
||||||
|
clearTips();
|
||||||
|
$('#new-status-page-name').val('');
|
||||||
|
$('#new-status-page-slug').val('');
|
||||||
|
$('#new-status-page-desc').val('');
|
||||||
|
$("#enabled-check > div").each((index, elem) => {
|
||||||
|
check_id = elem.id.split('-')[1]
|
||||||
|
removeCheckFromStatus(check_id);
|
||||||
|
});
|
||||||
|
}
|
||||||
function createStatusPage(dialog_id) {
|
function createStatusPage(dialog_id) {
|
||||||
let name_id = $('#new-status-page-name');
|
let name_id = $('#new-status-page-name');
|
||||||
let slug_id = $('#new-status-page-slug');
|
let slug_id = $('#new-status-page-slug');
|
||||||
|
@ -509,7 +548,7 @@ function createStatusPage(dialog_id) {
|
||||||
checks.push(check_id);
|
checks.push(check_id);
|
||||||
});
|
});
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/app/smon/status-page/add',
|
url: '/app/smon/status-page',
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
data: {
|
data: {
|
||||||
name: name_id.val(),
|
name: name_id.val(),
|
||||||
|
@ -522,18 +561,43 @@ function createStatusPage(dialog_id) {
|
||||||
if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
|
if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
|
||||||
toastr.error(data);
|
toastr.error(data);
|
||||||
} else {
|
} else {
|
||||||
toastr.clear();
|
clearStatusPageDialog(dialog_id);
|
||||||
$("#smon_history_statuses").html(data);
|
|
||||||
for (let i = 0; i < checks.length; i++) {
|
|
||||||
removeCheckFromStatus(checks[i]);
|
|
||||||
console.log(checks[i])
|
|
||||||
}
|
|
||||||
name_id.val('');
|
|
||||||
slug_id.val('');
|
|
||||||
dialog_id.dialog("close");
|
|
||||||
$("#pages").append(data);
|
$("#pages").append(data);
|
||||||
|
$.getScript("/inc/fontawesome.min.js");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function editStatusPage(dialog_id, page_id) {
|
||||||
|
let name_id = $('#new-status-page-name');
|
||||||
|
let slug_id = $('#new-status-page-slug');
|
||||||
|
let desc_id = $('#new-status-page-desc');
|
||||||
|
let checks = [];
|
||||||
|
let check_id = '';
|
||||||
|
$("#enabled-check > div").each((index, elem) => {
|
||||||
|
check_id = elem.id.split('-')[1]
|
||||||
|
checks.push(check_id);
|
||||||
|
});
|
||||||
|
$.ajax({
|
||||||
|
url: '/app/smon/status-page',
|
||||||
|
type: 'PUT',
|
||||||
|
data: {
|
||||||
|
page_id: page_id,
|
||||||
|
name: name_id.val(),
|
||||||
|
slug: slug_id.val(),
|
||||||
|
desc: desc_id.val(),
|
||||||
|
checks: JSON.stringify({'checks': checks})
|
||||||
|
},
|
||||||
|
success: function (data) {
|
||||||
|
data = data.replace(/\s+/g, ' ');
|
||||||
|
if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
|
||||||
|
toastr.error(data);
|
||||||
|
} else {
|
||||||
|
clearStatusPageDialog(dialog_id);
|
||||||
|
$("#page_" + page_id).replaceWith(data);
|
||||||
|
$("#page_" + page_id).addClass("update", 1000);
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
$("#user-" + id).removeClass("update");
|
$("#page_" + page_id).removeClass("update");
|
||||||
}, 2500);
|
}, 2500);
|
||||||
$.getScript("/inc/fontawesome.min.js");
|
$.getScript("/inc/fontawesome.min.js");
|
||||||
}
|
}
|
||||||
|
@ -595,7 +659,11 @@ function confirmDeleteStatusPage(id) {
|
||||||
}
|
}
|
||||||
function deleteStatusPage(page_id) {
|
function deleteStatusPage(page_id) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/app/smon/status-page/delete/' + page_id,
|
url: '/app/smon/status-page',
|
||||||
|
type: 'DELETE',
|
||||||
|
data: {
|
||||||
|
page_id: page_id,
|
||||||
|
},
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
data = data.replace(/\s+/g, ' ');
|
data = data.replace(/\s+/g, ' ');
|
||||||
if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
|
if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
|
||||||
|
|
Loading…
Reference in New Issue