From f02408155e734575a0e456fc85b37d21fac84cce Mon Sep 17 00:00:00 2001 From: Aidaho Date: Sat, 15 Apr 2023 10:33:00 +0300 Subject: [PATCH] v6.3.10.0 Changelog: https://roxy-wi.org/changelog#6_3_10 --- app/create_db.py | 2 +- app/modules/config/runtime.py | 108 +++++++-- app/modules/db/sql.py | 2 + app/options.py | 12 +- app/templates/ajax/new_ssh.html | 2 +- app/templates/include/admin_servers.html | 2 +- app/templates/runtimeapi.html | 127 ++++++++--- inc/runtimeapi.js | 270 +++++++++++++---------- 8 files changed, 352 insertions(+), 173 deletions(-) diff --git a/app/create_db.py b/app/create_db.py index 29dd111b..ef5bf612 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -797,7 +797,7 @@ def update_db_v_6_3_8(): def update_ver(): try: - Version.update(version='6.3.9.0').execute() + Version.update(version='6.3.10.0').execute() except Exception: print('Cannot update version') diff --git a/app/modules/config/runtime.py b/app/modules/config/runtime.py index ac81572f..b85b06ad 100644 --- a/app/modules/config/runtime.py +++ b/app/modules/config/runtime.py @@ -127,8 +127,8 @@ def change_ip_and_port() -> None: haproxy_sock_port = sql.get_setting('haproxy_sock_port') - MASTERS = sql.is_master(serv) - for master in MASTERS: + masters = sql.is_master(serv) + for master in masters: if master[0] is not None: cmd = 'echo "set server %s/%s addr %s port %s check-port %s" |nc %s %s' % ( backend_backend, backend_server, backend_ip, backend_port, backend_port, master[0], haproxy_sock_port) @@ -165,31 +165,59 @@ def change_ip_and_port() -> None: config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save') -def change_maxconn() -> None: - frontend = common.checkAjaxInput(form.getvalue('maxconn_frontend')) - maxconn = common.checkAjaxInput(form.getvalue('maxconn_int')) +def change_maxconn_global() -> None: + if form.getvalue('maxconn_global') is None: + print('error: Maxconn must be integer and not 0') + return + maxconn = common.checkAjaxInput(form.getvalue('maxconn_global')) + haproxy_sock_port = sql.get_setting('haproxy_sock_port') + masters = sql.is_master(serv) + + for master in masters: + if master[0] is not None: + cmd = f'echo "set maxconn global {maxconn}" |nc {master[0]} {haproxy_sock_port}' + output, stderr = server_mod.subprocess_execute(cmd) + roxywi_common.logging(master[0], f'Maxconn has been changed. Globally to {maxconn}', login=1, keep_history=1, service='haproxy') + + cmd = f'echo "set maxconn global {maxconn}" |nc {serv} {haproxy_sock_port}' + print(cmd) + roxywi_common.logging(serv, f'Maxconn has been changed. Globally to {maxconn}', login=1, keep_history=1, service='haproxy') + output, stderr = server_mod.subprocess_execute(cmd) + + if stderr != '': + print(stderr[0]) + elif output[0] == '': + configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') + cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg" + + config_mod.get_config(serv, cfg) + cmd = 'string=`grep global %s -n -A5 |grep maxcon -n |awk -F":" \'{print $2}\'|awk -F"-" \'{print $1}\'` ' \ + '&& sed -Ei "$( echo $string)s/[0-9]+/%s/g" %s' % (cfg, maxconn, cfg) + server_mod.subprocess_execute(cmd) + config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save') + print(f'success: Maxconn globally has been set to {maxconn} ') + else: + print(f'error: {output[0]}') + + +def change_maxconn_frontend() -> None: if form.getvalue('maxconn_int') is None: print('error: Maxconn must be integer and not 0') return + frontend = common.checkAjaxInput(form.getvalue('maxconn_frontend')) + maxconn = common.checkAjaxInput(form.getvalue('maxconn_int')) haproxy_sock_port = sql.get_setting('haproxy_sock_port') - masters = sql.is_master(serv) + for master in masters: if master[0] is not None: - if frontend == 'global': - cmd = 'echo "set maxconn %s %s" |nc %s %s' % (frontend, maxconn, master[0], haproxy_sock_port) - else: - cmd = 'echo "set maxconn frontend %s %s" |nc %s %s' % (frontend, maxconn, master[0], haproxy_sock_port) + cmd = f'echo "set maxconn frontend {frontend} {maxconn}" |nc {master[0]} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) roxywi_common.logging(master[0], f'Maxconn has been changed. On: {frontend} to {maxconn}', login=1, keep_history=1, service='haproxy') - if frontend == 'global': - cmd = 'echo "set maxconn %s %s" |nc %s %s' % (frontend, maxconn, serv, haproxy_sock_port) - else: - cmd = 'echo "set maxconn frontend %s %s" |nc %s %s' % (frontend, maxconn, serv, haproxy_sock_port) - print(cmd) + cmd = f'echo "set maxconn frontend {frontend} {maxconn}" |nc {serv} {haproxy_sock_port}' roxywi_common.logging(serv, f'Maxconn has been changed. On: {frontend} to {maxconn}', login=1, keep_history=1, service='haproxy') output, stderr = server_mod.subprocess_execute(cmd) @@ -209,6 +237,44 @@ def change_maxconn() -> None: print(f'error: {output[0]}') +def change_maxconn_backend() -> None: + if form.getvalue('maxconn_int') is None: + print('error: Maxconn must be integer and not 0') + return + + backend = common.checkAjaxInput(form.getvalue('maxconn_backend')) + backend_server = common.checkAjaxInput(form.getvalue('maxconn_backend_server')) + maxconn = common.checkAjaxInput(form.getvalue('maxconn_int')) + haproxy_sock_port = sql.get_setting('haproxy_sock_port') + + masters = sql.is_master(serv) + for master in masters: + if master[0] is not None: + cmd = f'echo "set maxconn server {backend}/{backend_server} {maxconn}" |nc {master[0]} {haproxy_sock_port}' + output, stderr = server_mod.subprocess_execute(cmd) + roxywi_common.logging(master[0], f'Maxconn has been changed. On: {backend}/{backend_server} to {maxconn}', login=1, keep_history=1, service='haproxy') + + cmd = f'echo "set maxconn server {backend}/{backend_server} {maxconn}" |nc {serv} {haproxy_sock_port}' + print(cmd) + roxywi_common.logging(serv, f'Maxconn has been changed. On: {backend} to {maxconn}', login=1, keep_history=1, service='haproxy') + output, stderr = server_mod.subprocess_execute(cmd) + + if stderr != '': + print(stderr[0]) + elif output[0] == '': + configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') + cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg" + + config_mod.get_config(serv, cfg) + cmd = 'string=`grep %s %s -n -A10 |grep maxcon -n|grep %s |awk -F":" \'{print $2}\'|awk -F"-" \'{print $1}\'` ' \ + '&& sed -Ei "$( echo $string)s/maxconn [0-9]+/maxconn %s/g" %s' % (backend, cfg, backend_server, maxconn, cfg) + server_mod.subprocess_execute(cmd) + config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save') + print(f'success: Maxconn for {backend}/{backend_server} has been set to {maxconn} ') + else: + print(f'error: {output[0]}') + + def table_select(): from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates'), autoescape=True, @@ -245,7 +311,7 @@ def delete_ip_from_stick_table() -> None: cmd = f'echo "clear table {table} key {ip}" |nc {serv} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) if stderr[0] != '': - print('error: ' + stderr[0]) + print(f'error: {stderr[0]}') def clear_stick_table() -> None: @@ -255,7 +321,7 @@ def clear_stick_table() -> None: cmd = f'echo "clear table {table} " |nc {serv} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) if stderr[0] != '': - print('error: ' + stderr[0]) + print(f'error: {stderr[0]}') def list_of_lists() -> None: @@ -345,11 +411,11 @@ def select_session() -> None: from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates'), autoescape=True, extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True) - serv = common.checkAjaxInput(form.getvalue('sessions_select')) + session = common.checkAjaxInput(form.getvalue('sessions_select')) lang = roxywi_common.get_user_lang() haproxy_sock_port = sql.get_setting('haproxy_sock_port') - cmd = f'echo "show sess" |nc {serv} {haproxy_sock_port}' + cmd = f'echo "show sess" |nc {session} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) template = env.get_template('ajax/sessions_table.html') @@ -359,10 +425,10 @@ def select_session() -> None: def show_session() -> None: - serv = common.checkAjaxInput(form.getvalue('sessions_select_show')) + session = common.checkAjaxInput(form.getvalue('sessions_select_show')) sess_id = common.checkAjaxInput(form.getvalue('sessions_select_id')) haproxy_sock_port = sql.get_setting('haproxy_sock_port') - cmd = f'echo "show sess {sess_id}" |nc {serv} {haproxy_sock_port}' + cmd = f'echo "show sess {sess_id}" |nc {session} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) diff --git a/app/modules/db/sql.py b/app/modules/db/sql.py index 67915e88..b00b184c 100755 --- a/app/modules/db/sql.py +++ b/app/modules/db/sql.py @@ -2282,6 +2282,8 @@ def select_update_keep_alive_restart(server_id: int, service: str) -> int: out_error(e) else: return restarted or 0 + finally: + return 0 def update_keep_alive_restart(server_id: int, service: str, restarted: int) -> None: diff --git a/app/options.py b/app/options.py index bc471a49..ee615d93 100644 --- a/app/options.py +++ b/app/options.py @@ -113,10 +113,20 @@ if form.getvalue('maxconn_select') is not None: serv = common.checkAjaxInput(form.getvalue('maxconn_select')) runtime.get_backends_from_config(serv, backends='frontend') +if form.getvalue('maxconn_global') is not None: + import modules.config.runtime as runtime + + runtime.change_maxconn_global() + if form.getvalue('maxconn_frontend') is not None: import modules.config.runtime as runtime - runtime.change_maxconn() + runtime.change_maxconn_frontend() + +if form.getvalue('maxconn_backend') is not None: + import modules.config.runtime as runtime + + runtime.change_maxconn_backend() if form.getvalue('table_serv_select') is not None: import modules.config.runtime as runtime diff --git a/app/templates/ajax/new_ssh.html b/app/templates/ajax/new_ssh.html index d3a0bf51..4fde6128 100644 --- a/app/templates/ajax/new_ssh.html +++ b/app/templates/ajax/new_ssh.html @@ -1,7 +1,7 @@ {% import 'languages/'+lang|default('en')+'.html' as lang %} {% for ssh in sshs %} - + diff --git a/app/templates/include/admin_servers.html b/app/templates/include/admin_servers.html index a06ee421..41de747e 100644 --- a/app/templates/include/admin_servers.html +++ b/app/templates/include/admin_servers.html @@ -128,7 +128,7 @@ {% endif %} {% endfor %} - + diff --git a/app/templates/runtimeapi.html b/app/templates/runtimeapi.html index f082f93d..a523fe1a 100644 --- a/app/templates/runtimeapi.html +++ b/app/templates/runtimeapi.html @@ -80,34 +80,103 @@ {% if role <= 3 %}
- - - - - - - - + + + + + + + + + + + + + + + +
{{lang.words.server|title()}}{{lang.words.select|title()}} {{lang.words.frontend|title()}}Maxconn
-
-

{{lang.words.global|title()}}

{{lang.words.server|title()}}Maxconn
+ + + + {{ input('maxconnintglobal', title=lang.words.enter|title() + ' maxconn', type="number", required='required') }} + + +
+ + + + + + + + + + + + + + - - - + + + + + + +

{{lang.words.frontends|title()}}

{{lang.words.server|title()}}{{lang.words.select|title()}} {{lang.words.frontend|title()}}Maxconn
+
+ +
+ - - - - {{ input('maxconnint', title=lang.words.enter|title() + ' maxconn', type="number", required='required') }} - - - + {{ input('maxconnint', title=lang.words.enter|title() + ' maxconn', type="number", required='required') }} + + +
+ + + + + + + + + + + + + + + + + + - + +

{{lang.words.backends|title()}}

{{lang.words.server|title()}}{{lang.words.select|title()}} {{lang.words.backend|title()}}{{lang.words.select|title()}} {{lang.words.server}}Maxconn
+
+ +
+ {{ input('maxconn_backend_int', title=lang.words.enter|title() + ' maxconn', type="number", required='required') }} + + +
@@ -136,12 +205,10 @@ - + - + {{ input('backend_ip', title=lang.words.set|title()+' '+lang.words.new + ' ' + lang.words.server + ' IP', required='required', size='16') }} diff --git a/inc/runtimeapi.js b/inc/runtimeapi.js index 5a4353a5..4023cc84 100644 --- a/inc/runtimeapi.js +++ b/inc/runtimeapi.js @@ -4,7 +4,7 @@ function showRuntime() { } else { saveCheck = ""; } - $.ajax( { + $.ajax({ url: "options.py", data: { servaction: $('#servaction').val(), @@ -14,17 +14,18 @@ function showRuntime() { token: $('#token').val() }, type: "POST", - success: function( data ) { + success: function (data) { $("#ajaxruntime").html(data); - } + } } ); } $( function() { $('#runtimeapiform').submit(function() { showRuntime(); return false; - }); + }); $( "#maxconn_select" ).on('selectmenuchange',function() { + let server_ip = $('#maxconn_select').val(); $.ajax( { url: "options.py", data: { @@ -33,27 +34,44 @@ $( function() { }, type: "POST", success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error: ') != '-1') { - toastr.error(data); - } else { - var value = data.split('
') - $('#maxconnfront').find('option').remove(); - $('#maxconnfront').append($("").attr("value","disabled").text("Choose Frontend")); - $('#maxconnfront').append($("").attr("value","global").text("global")); - - for(let i = 0; i < data.split('
').length; i++){ - if(value[i] != '') { - $('#maxconnfront').append($("") - .attr("value",value[i]) - .text(value[i])); - } - } - $('#maxconnfront').selectmenu("refresh"); - } + data = data.replace(/\s+/g, ' '); + if (data.indexOf('error: ') != '-1') { + toastr.error(data); + } else { + generate_select(data, '#maxconnfront'); + } } } ); }); + $('#maxconnbackend').on('selectmenuchange', function (){ + let server_ip = $('#maxconn_backend_select').val(); + let backend = $('#maxconnbackend').val(); + get_backend_servers(server_ip, backend, '#maxconn_backend_server', 0); + }); + $( "#maxconn_backend_select" ).on('selectmenuchange',function() { + let server_ip = $('#maxconn_backend_select').val(); + get_backends(server_ip, '#maxconnbackend', 0); + }); + $('#maxconnglobalform').submit(function() { + $.ajax( { + url: "options.py", + data: { + serv: $('#maxconn_global_select').val(), + maxconn_global: $('#maxconnintglobal').val(), + token: $('#token').val() + }, + type: "POST", + success: function( data ) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('error: ') != '-1') { + toastr.error(data); + } else { + toastr.success(data); + } + } + } ); + return false; + }); $('#maxconnform').submit(function() { $.ajax( { url: "options.py", @@ -65,80 +83,46 @@ $( function() { }, type: "POST", success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error: ') != '-1') { - toastr.error(data); - } else { - toastr.success(data); - } + data = data.replace(/\s+/g, ' '); + if (data.indexOf('error: ') != '-1') { + toastr.error(data); + } else { + toastr.success(data); + } + } + } ); + return false; + }); + $('#maxconnbackform').submit(function() { + $.ajax( { + url: "options.py", + data: { + serv: $('#maxconn_backend_select').val(), + maxconn_backend: $('#maxconnbackend').val(), + maxconn_backend_server: $('#maxconn_backend_server').val(), + maxconn_int: $('#maxconn_backend_int').val(), + token: $('#token').val() + }, + type: "POST", + success: function( data ) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('error: ') != '-1') { + toastr.error(data); + } else { + toastr.success(data); + } } } ); return false; }); $( "#ip_select" ).on('selectmenuchange',function() { - $.ajax( { - url: "options.py", - data: { - ip_select: $('#ip_select').val(), - serv: $('#ip_select').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error: ') != '-1') { - toastr.error(data); - } else { - var value = data.split('
') - $('#ipbackend').find('option').remove(); - $('#ipbackend').append($("").attr("value","disabled").text("------")); - $('#backend_server').find('option').remove(); - $('#backend_port').val(''); - $('#backend_ip').val(''); - for(let i = 0; i < data.split('
').length; i++){ - if(value[i] != '') { - $('#ipbackend').append($("") - .attr("value",value[i]) - .text(value[i])); - } - } - $('#ipbackend').selectmenu("refresh"); - $('#backend_server').selectmenu("refresh"); - } - } - } ); + let server_ip = $('#ip_select').val(); + get_backends(server_ip, '#ipbackend', 1); }); $( "#ipbackend" ).on('selectmenuchange',function() { - $.ajax( { - url: "options.py", - data: { - serv: $('#ip_select').val(), - ipbackend: $('#ipbackend').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error: ') != '-1') { - toastr.error(data); - } else { - var value = data.split('
') - $('#backend_server').find('option').remove(); - $('#backend_server').append($("").attr("value","disabled").text("------")); - $('#backend_port').val(''); - $('#backend_ip').val(''); - for(let i = 0; i < data.split('
').length; i++){ - if(value[i] != ' ') { - value[i] = value[i].replace(/\s+/g,''); - $('#backend_server').append($("") - .attr("value",value[i]) - .text(value[i])); - } - } - $('#backend_server').selectmenu("refresh"); - } - } - } ); + let server_ip = $('#ip_select').val(); + let backend = $('#ipbackend').val(); + get_backend_servers(server_ip, backend, '#backend_server', 1); }); $( "#backend_server" ).on('selectmenuchange',function() { $('#backend_ip').val(); @@ -168,7 +152,7 @@ $( function() { } ); }); $('#runtimeapiip').submit(function() { - $.ajax( { + $.ajax({ url: "options.py", data: { serv: $('#ip_select').val(), @@ -179,13 +163,13 @@ $( function() { token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error: ') != '-1' || data.indexOf('Invalid ') != '-1') { - toastr.error(data); - } else { - toastr.success(data); - } + 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; @@ -204,19 +188,7 @@ $( function() { if (data.indexOf('error: ') != '-1') { toastr.error(data); } else { - var value = data.split(',') - $('#table_select').find('option').remove(); - $('#table_select').append($("").attr("value","All").text("All")); - - for(let i = 0; i < data.split(',').length; i++){ - if(value[i] != '') { - value[i] = value[i].replace(/\s+/g,''); - $('#table_select').append($("") - .attr("value",value[i]) - .text(value[i])); - } - } - $('#table_select').selectmenu("refresh"); + generate_select(data, '#table_select', 'All', ','); } } } ); @@ -234,7 +206,7 @@ $( function() { return false; }); $( "#list_serv_select" ).on('selectmenuchange',function() { - $.ajax( { + $.ajax({ url: "options.py", data: { serv: $('#list_serv_select').val(), @@ -242,7 +214,7 @@ $( function() { token: $('#token').val() }, type: "POST", - success: function( data ) { + success: function (data) { data = data.replace(/, /g, ','); if (data.indexOf('error: ') != '-1') { toastr.error(data); @@ -271,8 +243,6 @@ $( function() { } } ); }); - - }); function deleteTableEntry(id, table, ip) { $(id).parent().parent().css("background-color", "#f2dede"); @@ -327,7 +297,7 @@ function getTable() { } else { $("#ajaxtable").html(data); $( "input[type=submit], button" ).button(); - $.getScript("/inc/script.js"); + $.getScript("/inc/script-6.3.9.js"); $.getScript("/inc/fontawesome.min.js"); FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false }; } @@ -350,7 +320,7 @@ function getList() { } else { $("#ajaxlist").html(data); $( "input[type=submit], button" ).button(); - $.getScript("/inc/script.js"); + $.getScript("/inc/script-6.3.9.js"); $.getScript("/inc/fontawesome.min.js"); FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false }; } @@ -408,7 +378,6 @@ function addNewIp() { $( "#list_add_ip_form" ).dialog("destroy" ); toastr.success('IP ' + ip + ' has been added'); toastr.info('Do not forget upload updated list to the properly server. Restart does not need'); - } } }); @@ -428,7 +397,7 @@ function getSessions() { } else { $("#ajaxsessions").html(data); $( "input[type=submit], button" ).button(); - $.getScript("/inc/script.js"); + $.getScript("/inc/script-6.3.9.js"); $.getScript("/inc/fontawesome.min.js"); FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false }; } @@ -489,3 +458,68 @@ function deleteSession(id, sess_id) { } } ); } +function get_backends(server_ip, backends_select_tag, ip_and_port=0) { + $.ajax({ + url: "options.py", + data: { + ip_select: 1, + serv: server_ip, + token: $('#token').val() + }, + type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('error: ') != '-1') { + toastr.error(data); + } else { + generate_select(data, backends_select_tag); + if (ip_and_port == 1) { + $('#backend_server').find('option').remove(); + $('#backend_server').selectmenu("refresh"); + $('#backend_port').val(''); + $('#backend_ip').val(''); + } + } + } + } ); +} +function get_backend_servers(server_ip, backend, servers_select_tag, ip_and_port=0) { + $.ajax({ + url: "options.py", + data: { + serv: server_ip, + ipbackend: backend, + token: $('#token').val() + }, + type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('error: ') != '-1') { + toastr.error(data); + } else { + generate_select(data, servers_select_tag); + if (ip_and_port == 1) { + $('#backend_port').val(''); + $('#backend_ip').val(''); + } + } + } + } ); +} +function generate_select(values, select_tag, custom_value=0, separator='
') { + var value = values.split(separator) + $(select_tag).find('option').remove(); + $(select_tag).append($("").attr("value", "disabled").text("------")); + if (custom_value) { + $(select_tag).append($("").attr("value", custom_value).text(custom_value)); + } + for (let i = 0; i < values.split(separator).length; i++) { + if (value[i] != ' ' && value[i] != '' ) { + value[i] = value[i].replace(/\s+/g, ''); + $(select_tag).append($("") + .attr("value", value[i]) + .text(value[i])); + } + } + $(select_tag).selectmenu("refresh"); +}