Changelog: https://roxy-wi.org/changelog#6_3_1
pull/355/head v6.3.1.0
Pavel Loginov 2022-12-09 23:08:32 +03:00
parent 2d26560e9f
commit e0b914074a
8 changed files with 180 additions and 159 deletions

View File

@ -410,7 +410,7 @@ if form.getvalue('generateconfig') is None and serv is not None:
roxywi_common.logging(serv, f"add.py add new {name}")
except Exception:
pass
except Exception as e:
except Exception:
pass
else:
print(config_add)

View File

@ -228,8 +228,7 @@ def add_telegram_channel(token: str, channel: str, group: str, page: str) -> Non
output_from_parsed_template = template.render(groups=sql.select_groups(),
telegrams=sql.select_telegram(token=token), page=page)
print(output_from_parsed_template)
roxywi_common.logging('Roxy-WI server', f'A new Telegram channel {channel} has been created ', roxywi=1,
login=1)
roxywi_common.logging('Roxy-WI server', f'A new Telegram channel {channel} has been created ', roxywi=1, login=1)
def add_slack_channel(token: str, channel: str, group: str, page: str) -> None:
@ -242,8 +241,7 @@ def add_slack_channel(token: str, channel: str, group: str, page: str) -> None:
output_from_parsed_template = template.render(groups=sql.select_groups(),
slacks=sql.select_slack(token=token), page=page)
print(output_from_parsed_template)
roxywi_common.logging('Roxy-WI server', 'A new Slack channel ' + channel + ' has been created ', roxywi=1,
login=1)
roxywi_common.logging('Roxy-WI server', 'A new Slack channel ' + channel + ' has been created ', roxywi=1, login=1)
def delete_telegram_channel(channel_id) -> None:
@ -271,4 +269,4 @@ def update_telegram(token: str, channel: str, group: str, user_id: int) -> None:
def update_slack(token: str, channel: str, group: str, user_id: int) -> None:
sql.update_slack(token, channel, group, user_id)
roxywi_common.logging(f'group {group}', f'The Slack token has been updated for channel: {channel}', roxywi=1, login=1)
roxywi_common.logging(f'group {group}', f'The Slack token has been updated for channel: {channel}', roxywi=1, login=1)

View File

@ -4,7 +4,7 @@ import http.cookies
import modules.db.sql as sql
import modules.server.ssh as mod_ssh
import modules.server.server as mod_server
import modules.server.server as server_mod
import modules.common.common as common
import modules.roxywi.common as roxywi_common
import modules.roxy_wi_tools as roxy_wi_tools
@ -64,6 +64,7 @@ def upload_and_restart(server_ip: str, cfg: str, **kwargs):
file_format = 'conf'
config_path = kwargs.get('config_file_name')
config_date = get_date.return_date('config')
print(server_ip)
server_id = sql.select_server_id_by_ip(server_ip=server_ip)
if kwargs.get("nginx"):
@ -220,7 +221,7 @@ def upload_and_restart(server_ip: str, cfg: str, **kwargs):
return error
try:
error = mod_server.ssh_command(server_ip, commands)
error = server_mod.ssh_command(server_ip, commands)
try:
if action == 'reload' or action == 'restart':
roxywi_common.logging(server_ip, f'Service has been {action}ed', login=login, keep_history=1, service=service)
@ -247,13 +248,15 @@ def master_slave_upload_and_restart(server_ip, cfg, just_save, **kwargs):
else:
login = ''
is_master = [masters[0] for masters in sql.is_master(server_ip)]
for master in is_master:
slv_output = upload_and_restart(
master, cfg, just_save=just_save, nginx=kwargs.get('nginx'), waf=kwargs.get('waf'),
apache=kwargs.get('apache'), config_file_name=kwargs.get('config_file_name'), slave=1
)
slave_output += f'<br>slave_server:\n{slv_output}'
masters = sql.is_master(server_ip)
for master in masters:
if master[0] is not None:
slv_output = upload_and_restart(
master[0], cfg, just_save=just_save, nginx=kwargs.get('nginx'),
apache=kwargs.get('apache'), config_file_name=kwargs.get('config_file_name'), slave=1
)
slave_output += f'<br>slave_server:\n{slv_output}'
output = upload_and_restart(
server_ip, cfg, just_save=just_save, nginx=kwargs.get('nginx'), waf=kwargs.get('waf'),
@ -328,7 +331,7 @@ def diff_config(oldcfg, cfg, **kwargs):
except Exception:
login = ''
output, stderr = mod_server.subprocess_execute(cmd)
output, stderr = server_mod.subprocess_execute(cmd)
if kwargs.get('return_diff'):
for line in output:
@ -383,7 +386,7 @@ def get_ssl_cert(server_ip: str) -> None:
cert_path = sql.get_setting('cert_path')
commands = [f"openssl x509 -in {cert_path}/{cert_id} -text"]
try:
mod_server.ssh_command(server_ip, commands, ip="1")
server_mod.ssh_command(server_ip, commands, ip="1")
except Exception as e:
print(f'error: Cannot connect to the server {e.args[0]}')
@ -392,7 +395,7 @@ def get_ssl_certs(server_ip: str) -> None:
cert_path = sql.get_setting('cert_path')
commands = [f"sudo ls -1t {cert_path} |grep -E 'pem|crt|key'"]
try:
mod_server.ssh_command(server_ip, commands, ip="1")
server_mod.ssh_command(server_ip, commands, ip="1")
except Exception as e:
print(f'error: Cannot connect to the server: {e.args[0]}')
@ -403,7 +406,7 @@ def del_ssl_cert(server_ip: str) -> None:
cert_path = sql.get_setting('cert_path')
commands = [f"sudo rm -f {cert_path}/{cert_id}"]
try:
mod_server.ssh_command(server_ip, commands, ip="1")
server_mod.ssh_command(server_ip, commands, ip="1")
except Exception as e:
print(f'error: Cannot delete the certificate {e.args[0]}')
@ -446,3 +449,140 @@ def upload_ssl_cert(server_ip: str) -> None:
roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1)
roxywi_common.logging(server_ip, f"add.py#ssl uploaded a new SSL cert {name}", roxywi=1, login=1)
def show_compare_config(server_ip: str) -> None:
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
template = env.get_template('ajax/show_compare_configs.html')
left = form.getvalue('left')
right = form.getvalue('right')
service = form.getvalue('service')
if service == 'nginx':
return_files = roxywi_common.get_files(get_config_var.get_config_var('configs', 'nginx_save_configs_dir'), 'conf')
elif service == 'apache':
return_files = roxywi_common.get_files(get_config_var.get_config_var('configs', 'apache_save_configs_dir'), 'conf')
elif service == 'keepalived':
return_files = roxywi_common.get_files(get_config_var.get_config_var('configs', 'kp_save_configs_dir'), 'conf')
else:
return_files = roxywi_common.get_files()
template = template.render(serv=server_ip, right=right, left=left, return_files=return_files)
print(template)
def compare_config() -> None:
from jinja2 import Environment, FileSystemLoader
left = common.checkAjaxInput(form.getvalue('left'))
right = common.checkAjaxInput(form.getvalue('right'))
if form.getvalue('service') == 'nginx':
configs_dir = get_config_var.get_config_var('configs', 'nginx_save_configs_dir')
elif form.getvalue('service') == 'apache':
configs_dir = get_config_var.get_config_var('configs', 'apache_save_configs_dir')
elif form.getvalue('service') == 'keepalived':
configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir')
else:
configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
cmd = f'diff -pub {configs_dir}{left} {configs_dir}{right}'
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True,
extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"])
template = env.get_template('ajax/compare.html')
output, stderr = server_mod.subprocess_execute(cmd)
template = template.render(stdout=output)
print(template)
print(stderr)
def show_config(server_ip: str) -> None:
from jinja2 import Environment, FileSystemLoader
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
user_uuid = cookie.get('uuid')
role_id = sql.get_user_role_by_uuid(user_uuid.value)
service = form.getvalue('service')
try:
config_file_name = form.getvalue('config_file_name').replace('/', '92')
except Exception:
config_file_name = ''
if service == 'keepalived':
configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir')
cfg = '.conf'
elif service == 'nginx':
configs_dir = get_config_var.get_config_var('configs', 'nginx_save_configs_dir')
cfg = '.conf'
elif service == 'apache':
configs_dir = get_config_var.get_config_var('configs', 'apache_save_configs_dir')
cfg = '.conf'
else:
configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
cfg = '.cfg'
if form.getvalue('configver') is None:
cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}{cfg}"
if service == 'nginx':
get_config(server_ip, cfg, nginx=1, config_file_name=form.getvalue('config_file_name'))
elif service == 'apache':
get_config(server_ip, cfg, apache=1, config_file_name=form.getvalue('config_file_name'))
elif service == 'keepalived':
get_config(server_ip, cfg, keepalived=1)
else:
get_config(server_ip, cfg)
else:
cfg = configs_dir + form.getvalue('configver')
try:
conf = open(cfg, "r")
except IOError:
print('<div class="alert alert-danger">Cannot read config file</div>')
is_serv_protected = sql.is_serv_protected(server_ip)
server_id = sql.select_server_id_by_ip(server_ip)
is_restart = sql.select_service_setting(server_id, service, 'restart')
env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True, trim_blocks=True, lstrip_blocks=True,
extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"])
template = env.get_template('config_show.html')
template = template.render(conf=conf,
serv=server_ip,
configver=form.getvalue('configver'),
role=role_id,
service=service,
config_file_name=config_file_name,
is_serv_protected=is_serv_protected,
is_restart=is_restart)
print(template)
conf.close()
if form.getvalue('configver') is None:
os.remove(cfg)
def show_config_files(server_ip: str) -> None:
from jinja2 import Environment, FileSystemLoader
service = form.getvalue('service')
service_config_dir = sql.get_setting(f'{service}_dir')
return_files = server_mod.get_remote_files(server_ip, service_config_dir, 'conf')
if 'error: ' in return_files:
print(return_files)
return
try:
config_file_name = form.getvalue('config_file_name').replace('92', '/')
except Exception:
config_file_name = ''
return_files += ' ' + sql.get_setting(f'{service}_config_path')
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
template = env.get_template('ajax/show_configs_files.html')
template = template.render(serv=server_ip, service=service, return_files=return_files,
config_file_name=config_file_name, path_dir=service_config_dir)
print(template)

View File

@ -145,8 +145,7 @@ def change_ip_and_port() -> None:
backend_backend, backend_server, backend_ip, backend_port, backend_port, serv, haproxy_sock_port)
roxywi_common.logging(
serv,
'IP address and port have been changed. On: {}/{} to {}:{}'.format(backend_backend, backend_server, backend_ip,
backend_port),
f'IP address and port have been changed. On: {backend_backend}/{backend_server} to {backend_ip}:{backend_port}',
login=1, keep_history=1, service='haproxy'
)
output, stderr = server_mod.subprocess_execute(cmd)
@ -156,7 +155,7 @@ def change_ip_and_port() -> None:
else:
print(output[0])
configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
cfg = 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)
cmd = 'string=`grep %s %s -n -A25 |grep "server %s" |head -1|awk -F"-" \'{print $1}\'` ' \
@ -176,42 +175,38 @@ def change_maxconn() -> 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:
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)
output, stderr = server_mod.subprocess_execute(cmd)
roxywi_common.logging(master[0], 'Maxconn has been changed. On: {} to {}'.format(frontend, maxconn), login=1,
keep_history=1,
service='haproxy')
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)
roxywi_common.logging(serv, 'Maxconn has been changed. On: {} to {}'.format(frontend, maxconn), login=1,
keep_history=1,
service='haproxy')
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)
if stderr != '':
print(stderr[0])
elif output[0] == '':
configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
cfg = 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)
cmd = 'string=`grep %s %s -n -A5 |grep maxcon -n |awk -F":" \'{print $2}\'|awk -F"-" \'{print $1}\'` ' \
'&& sed -Ei "$( echo $string)s/[0-9]+/%s/g" %s' % (frontend, cfg, maxconn, cfg)
server_mod.subprocess_execute(cmd)
config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save')
print('success: Maxconn for %s has been set to %s ' % (frontend, maxconn))
print(f'success: Maxconn for {frontend} has been set to {maxconn} ')
else:
print('error: ' + output[0])
print(f'error: {output[0]}')
def table_select():
@ -227,7 +222,6 @@ def table_select():
for t in tables.split(','):
if t != '':
table_id = []
tables_head = []
tables_head1, table1 = get_stick_table(t)
table_id.append(tables_head1)
table_id.append(table1)
@ -289,7 +283,7 @@ def show_lists() -> None:
def delete_ip_from_list() -> None:
haproxy_sock_port = sql.get_setting('haproxy_sock_port')
lists_path = sql.get_setting('lists_path')
lib_path = get_config.get_config_var('main', 'lib_path')
lib_path = get_config_var.get_config_var('main', 'lib_path')
ip_id = common.checkAjaxInput(form.getvalue('list_ip_id_for_delete'))
ip = common.is_ip_or_dns(form.getvalue('list_ip_for_delete'))
list_id = common.checkAjaxInput(form.getvalue('list_id_for_delete'))
@ -321,7 +315,7 @@ def delete_ip_from_list() -> None:
def add_ip_to_list() -> None:
haproxy_sock_port = sql.get_setting('haproxy_sock_port')
lists_path = sql.get_setting('lists_path')
lib_path = get_config.get_config_var('main', 'lib_path')
lib_path = get_config_var.get_config_var('main', 'lib_path')
ip = form.getvalue('list_ip_for_add')
ip = ip.strip()
ip = common.is_ip_or_dns(ip)

View File

@ -123,7 +123,6 @@ def change_user_services() -> None:
print(e)
def get_user_groups() -> None:
user_id = common.checkAjaxInput(form.getvalue('getusergroups'))
groups = []

View File

@ -37,8 +37,13 @@ def return_ssh_keys_path(server_ip: str, **kwargs) -> dict:
def ssh_connect(server_ip):
ssh_settings = return_ssh_keys_path(server_ip)
ssh = ssh_connection.SshConnection(server_ip, ssh_settings['port'], ssh_settings['user'],
ssh_settings['password'], ssh_settings['enabled'], ssh_settings['key'])
ssh = ssh_connection.SshConnection(
server_ip, ssh_settings['port'],
ssh_settings['user'],
ssh_settings['password'],
ssh_settings['enabled'],
ssh_settings['key']
)
return ssh

View File

@ -33,10 +33,7 @@ def stat_page_action(serv: str) -> None:
'Accept-Encoding': 'gzip, deflate'
}
q = requests.post(f'http://{serv}:{stats_port}/{stats_page}',
headers=headers,
data=postdata,
auth=(haproxy_user, haproxy_pass))
requests.post(f'http://{serv}:{stats_port}/{stats_page}', headers=headers, data=postdata, auth=(haproxy_user, haproxy_pass))
def show_map(serv: str) -> None:

View File

@ -341,128 +341,16 @@ if form.getvalue('servaction') is not None:
service_haproxy.runtime_command(serv)
if act == "showCompareConfigs":
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
template = env.get_template('ajax/show_compare_configs.html')
left = form.getvalue('left')
right = form.getvalue('right')
service = form.getvalue('service')
if service == 'nginx':
return_files = roxywi_common.get_files(get_config.get_config_var('configs', 'nginx_save_configs_dir'), 'conf')
elif service == 'apache':
return_files = roxywi_common.get_files(get_config.get_config_var('configs', 'apache_save_configs_dir'), 'conf')
elif service == 'keepalived':
return_files = roxywi_common.get_files(get_config.get_config_var('configs', 'kp_save_configs_dir'), 'conf')
else:
return_files = roxywi_common.get_files()
template = template.render(serv=serv, right=right, left=left, return_files=return_files)
print(template)
config_mod.show_compare_config(serv)
if serv is not None and form.getvalue('right') is not None:
left = common.checkAjaxInput(form.getvalue('left'))
right = common.checkAjaxInput(form.getvalue('right'))
if form.getvalue('service') == 'nginx':
configs_dir = get_config.get_config_var('configs', 'nginx_save_configs_dir')
elif form.getvalue('service') == 'apache':
configs_dir = get_config.get_config_var('configs', 'apache_save_configs_dir')
elif form.getvalue('service') == 'keepalived':
configs_dir = get_config.get_config_var('configs', 'kp_save_configs_dir')
else:
configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
cmd = f'diff -pub {configs_dir}{left} {configs_dir}{right}'
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True,
extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"])
template = env.get_template('ajax/compare.html')
output, stderr = server_mod.subprocess_execute(cmd)
template = template.render(stdout=output)
print(template)
print(stderr)
config_mod.compare_config()
if serv is not None and act == "configShow":
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
user_uuid = cookie.get('uuid')
role_id = sql.get_user_role_by_uuid(user_uuid.value)
service = form.getvalue('service')
try:
config_file_name = form.getvalue('config_file_name').replace('/', '92')
except Exception:
config_file_name = ''
if service == 'keepalived':
configs_dir = get_config.get_config_var('configs', 'kp_save_configs_dir')
cfg = '.conf'
elif service == 'nginx':
configs_dir = get_config.get_config_var('configs', 'nginx_save_configs_dir')
cfg = '.conf'
elif service == 'apache':
configs_dir = get_config.get_config_var('configs', 'apache_save_configs_dir')
cfg = '.conf'
else:
configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
cfg = '.cfg'
if form.getvalue('configver') is None:
cfg = configs_dir + serv + "-" + get_date.return_date('config') + cfg
if service == 'nginx':
config_mod.get_config(serv, cfg, nginx=1, config_file_name=form.getvalue('config_file_name'))
elif service == 'apache':
config_mod.get_config(serv, cfg, apache=1, config_file_name=form.getvalue('config_file_name'))
elif service == 'keepalived':
config_mod.get_config(serv, cfg, keepalived=1)
else:
config_mod.get_config(serv, cfg)
else:
cfg = configs_dir + form.getvalue('configver')
try:
conf = open(cfg, "r")
except IOError:
print('<div class="alert alert-danger">Cannot read config file</div>')
is_serv_protected = sql.is_serv_protected(serv)
server_id = sql.select_server_id_by_ip(serv)
is_restart = sql.select_service_setting(server_id, service, 'restart')
env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True, trim_blocks=True, lstrip_blocks=True,
extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"])
template = env.get_template('config_show.html')
template = template.render(conf=conf,
serv=serv,
configver=form.getvalue('configver'),
role=role_id,
service=service,
config_file_name=config_file_name,
is_serv_protected=is_serv_protected,
is_restart=is_restart)
print(template)
conf.close()
if form.getvalue('configver') is None:
os.remove(cfg)
config_mod.show_config(serv)
if act == 'configShowFiles':
service = form.getvalue('service')
config_dir = get_config.get_config_var('configs', f'{service}_save_configs_dir')
service_config_dir = sql.get_setting(f'{service}_dir')
try:
config_file_name = form.getvalue('config_file_name').replace('92', '/')
except Exception:
config_file_name = ''
return_files = server_mod.get_remote_files(serv, service_config_dir, 'conf')
if 'error: ' in return_files:
print(return_files)
sys.exit()
return_files += ' ' + sql.get_setting(f'{service}_config_path')
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
template = env.get_template('ajax/show_configs_files.html')
template = template.render(serv=serv, service=service, return_files=return_files,
config_file_name=config_file_name, path_dir=service_config_dir)
print(template)
config_mod.show_config_files(serv)
if act == 'showRemoteLogFiles':
service = form.getvalue('service')