Changelog: https://roxy-wi.org/changelog#6_2_0
pull/343/head
Pavel Loginov 2022-09-25 21:20:46 +03:00
parent d9663ad49c
commit 0371f730b1
20 changed files with 199 additions and 261 deletions

View File

@ -524,7 +524,7 @@ def show_log(server_id):
data[server_id] = {"error": "Cannot find the server"}
return dict(error=data)
out = funct.show_haproxy_log(ip, rows=rows, waf=str(waf), grep=grep, hour=str(hour), minut=str(minute), hour1=str(hour1), minut1=str(minute1), html=0)
out = funct.show_roxy_log(ip, rows=rows, waf=str(waf), grep=grep, hour=str(hour), minut=str(minute), hour1=str(hour1), minut1=str(minute1), html=0)
data = {server_id: out}
return dict(log=data)

View File

@ -32,7 +32,7 @@ except Exception as e:
if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
service_desc = sql.select_service(service)
if funct.check_login(service=service_desc.service_id):
title = f"{service_desc.service} config view page"
title = f"Working with {service_desc.service} configuration files"
action = f"config.py?service={service_desc.slug}"
configs_dir = funct.get_config_var('configs', 'kp_save_configs_dir')
file_format = 'conf'
@ -60,8 +60,6 @@ if serv is not None and form.getvalue('open') is not None and form.getvalue('new
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')
service_desc = sql.select_service(service)
title = f'{service_desc.service} config edit page'
if service == 'keepalived':
error = funct.get_config(serv, cfg, keepalived=1)

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3
import distro
from db_model import *
from funct import check_ver
from modules.db_model import *
def default_values():
@ -58,7 +58,7 @@ def default_values():
'desc': 'Socket port for HAProxy', 'group': '1'},
{'param': 'haproxy_sock_port', 'value': '1999', 'section': 'haproxy', 'desc': 'HAProxy sock port',
'group': '1'},
{'param': 'apache_log_path', 'value': '/var/log/' + apache_dir + '/', 'section': 'logs',
{'param': 'apache_log_path', 'value': f'/var/log/{apache_dir}/', 'section': 'logs',
'desc': 'Path to Apache logs. Apache service for Roxy-WI', 'group': '1'},
{'param': 'nginx_path_logs', 'value': '/var/log/nginx/', 'section': 'nginx',
'desc': 'The path for NGINX logs', 'group': '1'},
@ -656,95 +656,68 @@ def default_values():
print(str(e))
def update_db_v_3_4_5_22():
try:
Version.insert(version='3.4.5.2').execute()
except Exception as e:
print('Cannot insert version %s' % e)
# Needs for updating user_group. Do not delete
def update_db_v_4_3_0(**kwargs):
def update_db_v_4_3_0():
try:
UserGroups.insert_from(
User.select(User.user_id, User.groups), fields=[UserGroups.user_id, UserGroups.user_group_id]
).on_conflict_ignore().execute()
except Exception as e:
if kwargs.get('silent') != 1:
if e.args[0] == 'duplicate column name: haproxy' or str(e) == '(1060, "Duplicate column name \'haproxy\'")':
print('Updating... go to version 4.3.1')
else:
print("An error occurred:", e)
if e.args[0] == 'duplicate column name: haproxy' or str(e) == '(1060, "Duplicate column name \'haproxy\'")':
print('Updating... go to version 4.3.1')
else:
print("An error occurred:", e)
def update_db_v_5_1_3(**kwargs):
cursor = conn.cursor()
sql = """ALTER TABLE `servers` ADD COLUMN protected INTEGER NOT NULL DEFAULT 0;"""
try:
cursor.execute(sql)
except Exception as e:
if kwargs.get('silent') != 1:
if str(e) == 'duplicate column name: protected' or str(e) == '(1060, "Duplicate column name \'protected\'")':
print('Updating... DB has been updated to version 5.1.3')
else:
print("An error occurred:", e)
else:
print("DB has been updated to version 5.1.3")
def update_db_v_5_2_4(**kwargs):
def update_db_v_5_2_4():
cursor = conn.cursor()
sql = """ALTER TABLE `user` ADD COLUMN user_services varchar(20) DEFAULT '1 2 3 4';"""
try:
cursor.execute(sql)
except Exception as e:
if kwargs.get('silent') != 1:
if str(e) == 'duplicate column name: user_services' or str(e) == '(1060, "Duplicate column name \'user_services\'")':
print('Updating... DB has been updated to version 5.2.4')
else:
print("An error occurred:", e)
if str(e) == 'duplicate column name: user_services' or str(e) == '(1060, "Duplicate column name \'user_services\'")':
print('Updating... DB has been updated to version 5.2.4')
else:
print("An error occurred:", e)
else:
print("Updating... DB has been updated to version 5.2.4")
def update_db_v_5_2_4_1(**kwargs):
def update_db_v_5_2_4_1():
cursor = conn.cursor()
sql = """ALTER TABLE `servers` ADD COLUMN nginx_metrics integer DEFAULT 0;"""
try:
cursor.execute(sql)
except Exception as e:
if kwargs.get('silent') != 1:
if str(e) == 'duplicate column name: nginx_metrics' or str(e) == '(1060, "Duplicate column name \'nginx_metrics\'")':
print('Updating... DB has been updated to version 5.2.4-1')
else:
print("An error occurred:", e)
if str(e) == 'duplicate column name: nginx_metrics' or str(e) == '(1060, "Duplicate column name \'nginx_metrics\'")':
print('Updating... DB has been updated to version 5.2.4-1')
else:
print("An error occurred:", e)
else:
print("Updating... DB has been updated to version 5.2.4-1")
def update_db_v_5_2_5_1(**kwargs):
def update_db_v_5_2_5_1():
query = User.update(role='user').where(User.role == 'editor')
try:
query.execute()
except Exception as e:
print("An error occurred:", e)
else:
if kwargs.get('silent') != 1:
print("Updating... DB has been updated to version 5.2.5-1")
print("Updating... DB has been updated to version 5.2.5-1")
def update_db_v_5_2_5_2(**kwargs):
def update_db_v_5_2_5_2():
query = Role.delete().where(Role.name == 'editor')
try:
query.execute()
except Exception as e:
print("An error occurred:", e)
else:
if kwargs.get('silent') != 1:
print("Updating... DB has been updated to version 5.2.5-2")
print("Updating... DB has been updated to version 5.2.5-2")
def update_db_v_5_2_5_3(**kwargs):
def update_db_v_5_2_5_3():
cursor = conn.cursor()
sql = list()
sql.append("alter table user add column last_login_date timestamp default '0000-00-00 00:00:00'")
@ -755,22 +728,20 @@ def update_db_v_5_2_5_3(**kwargs):
except Exception:
pass
else:
if kwargs.get('silent') != 1:
print('Updating... DB has been updated to version 5.2.5-3')
print('Updating... DB has been updated to version 5.2.5-3')
def update_db_v_5_2_6(**kwargs):
def update_db_v_5_2_6():
query = Setting.delete().where(Setting.param == 'haproxy_enterprise')
try:
query.execute()
except Exception as e:
print("An error occurred:", e)
else:
if kwargs.get('silent') != 1:
print("Updating... DB has been updated to version 5.2.6")
print("Updating... DB has been updated to version 5.2.6")
def update_db_v_5_3_0(**kwargs):
def update_db_v_5_3_0():
groups = ''
query = Groups.select()
@ -816,24 +787,22 @@ def update_db_v_5_3_0(**kwargs):
try:
Setting.insert_many(data_source).on_conflict_ignore().execute()
except Exception as e:
if kwargs.get('silent') != 1:
if str(e) == 'columns param, group are not unique':
pass
else:
print("An error occurred:", e)
except Exception as e:
if kwargs.get('silent') != 1:
if (
str(e) == 'columns param, group are not unique'
or str(e) == '(1062, "Duplicate entry \'nginx_container_name\' for key \'param\'")'
or str(e) == 'UNIQUE constraint failed: settings.param, settings.group'
):
if str(e) == 'columns param, group are not unique':
pass
else:
print("An error occurred:", e)
except Exception as e:
if (
str(e) == 'columns param, group are not unique'
or str(e) == '(1062, "Duplicate entry \'nginx_container_name\' for key \'param\'")'
or str(e) == 'UNIQUE constraint failed: settings.param, settings.group'
):
pass
else:
print("An error occurred:", e)
def update_db_v_5_3_1(**kwargs):
def update_db_v_5_3_1():
cursor = conn.cursor()
sql = """
ALTER TABLE `servers` ADD COLUMN keepalived_active INTEGER NOT NULL DEFAULT 0;
@ -841,16 +810,15 @@ def update_db_v_5_3_1(**kwargs):
try:
cursor.execute(sql)
except Exception as e:
if kwargs.get('silent') != 1:
if e.args[0] == 'duplicate column name: keepalived_active' or str(e) == '(1060, "Duplicate column name \'keepalived_active\'")':
print('Updating... DB has been updated to version 5.3.1')
else:
print("An error occurred:", e)
if e.args[0] == 'duplicate column name: keepalived_active' or str(e) == '(1060, "Duplicate column name \'keepalived_active\'")':
print('Updating... DB has been updated to version 5.3.1')
else:
print("An error occurred:", e)
else:
print("Updating... DB has been updated to version 5.3.1")
def update_db_v_5_3_2_2(**kwargs):
def update_db_v_5_3_2_2():
cursor = conn.cursor()
sql = """
ALTER TABLE `servers` ADD COLUMN keepalived_alert INTEGER NOT NULL DEFAULT 0;
@ -858,53 +826,49 @@ def update_db_v_5_3_2_2(**kwargs):
try:
cursor.execute(sql)
except Exception as e:
if kwargs.get('silent') != 1:
if e.args[0] == 'duplicate column name: keepalived_alert' or str(e) == '(1060, "Duplicate column name \'keepalived_alert\'")':
print('Updating... DB has been updated to version 5.3.2')
else:
print("An error occurred:", e)
if e.args[0] == 'duplicate column name: keepalived_alert' or str(e) == '(1060, "Duplicate column name \'keepalived_alert\'")':
print('Updating... DB has been updated to version 5.3.2')
else:
print("An error occurred:", e)
else:
print("Updating... DB has been updated to version 5.3.2")
def update_db_v_5_4_2(**kwargs):
def update_db_v_5_4_2():
cursor = conn.cursor()
sql = """ALTER TABLE `smon` ADD COLUMN slack_channel_id integer DEFAULT '0';"""
try:
cursor.execute(sql)
except Exception as e:
if kwargs.get('silent') != 1:
if str(e) == 'duplicate column name: slack_channel_id' or str(e) == '(1060, "Duplicate column name \'slack_channel_id\'")':
print('Updating... DB has been updated to version 5.4.2')
else:
print("An error occurred:", e)
if str(e) == 'duplicate column name: slack_channel_id' or str(e) == '(1060, "Duplicate column name \'slack_channel_id\'")':
print('Updating... DB has been updated to version 5.4.2')
else:
print("An error occurred:", e)
else:
print("Updating... DB has been updated to version 5.4.2")
def update_db_v_5_4_3(**kwargs):
def update_db_v_5_4_3():
query = Setting.update(param='nginx_path_logs', value='/var/log/nginx/').where(Setting.param == 'nginx_path_error_logs')
try:
query.execute()
except Exception as e:
print("An error occurred:", e)
else:
if kwargs.get('silent') != 1:
print("Updating... DB has been updated to version 5.4.3")
print("Updating... DB has been updated to version 5.4.3")
def update_db_v_5_4_3_1(**kwargs):
def update_db_v_5_4_3_1():
query = Setting.update(value='/etc/nginx/').where(Setting.param == 'nginx_dir')
try:
query.execute()
except Exception as e:
print("An error occurred:", e)
else:
if kwargs.get('silent') != 1:
print("Updating... DB has been updated to version 5.4.3-1")
print("Updating... DB has been updated to version 5.4.3-1")
def update_db_v_6_0(**kwargs):
def update_db_v_6_0():
cursor = conn.cursor()
sql = list()
sql.append("alter table servers add column apache integer default 0")
@ -917,22 +881,20 @@ def update_db_v_6_0(**kwargs):
except Exception:
pass
else:
if kwargs.get('silent') != 1:
print('Updating... DB has been updated to version 6.0.0.0')
print('Updating... DB has been updated to version 6.0.0.0')
def update_db_v_6_0_1(**kwargs):
def update_db_v_6_0_1():
query = Groups.update(name='Default').where(Groups.group_id == '1')
try:
query.execute()
except Exception as e:
print("An error occurred:", e)
else:
if kwargs.get('silent') != 1:
print("Updating... DB has been updated to version 6.0.0.0-1")
print("Updating... DB has been updated to version 6.0.0.0-1")
def update_db_v_6_1_0(**kwargs):
def update_db_v_6_1_0():
for service_id in range(1, 5):
try:
servers_id = Server.select(Server.server_id).where(Server.type_ip == 0).execute()
@ -941,14 +903,13 @@ def update_db_v_6_1_0(**kwargs):
server_id=server_id, service_id=service_id
).on_conflict_ignore().execute()
except Exception as e:
if kwargs.get('silent') != 1:
if e.args[0] == 'duplicate column name: haproxy' or str(e) == '(1060, "Duplicate column name \'haproxy\'")':
print('Updating... go to version 6.1.0')
else:
print("An error occurred:", e)
if e.args[0] == 'duplicate column name: haproxy' or str(e) == '(1060, "Duplicate column name \'haproxy\'")':
print('Updating... go to version 6.1.0')
else:
print("An error occurred:", e)
def update_db_v_6_1_3(**kwargs):
def update_db_v_6_1_3():
if mysql_enable == '1':
cursor = conn.cursor()
sql = list()
@ -961,8 +922,7 @@ def update_db_v_6_1_3(**kwargs):
except Exception:
pass
else:
if kwargs.get('silent') != 1:
print('Updating... DB has been updated to version 6.1.3.0')
print('Updating... DB has been updated to version 6.1.3.0')
else:
pass
@ -988,18 +948,14 @@ def update_db_v_6_1_4():
def update_ver():
query = Version.update(version='6.2.0.0')
try:
query.execute()
Version.update(version='6.2.0.0').execute()
except Exception:
print('Cannot update version')
def update_all():
if check_ver() is None:
update_db_v_3_4_5_22()
update_db_v_4_3_0()
update_db_v_5_1_3()
update_db_v_5_2_4()
update_db_v_5_2_4_1()
update_db_v_5_2_5_1()
@ -1020,30 +976,6 @@ def update_all():
update_ver()
def update_all_silent():
if check_ver() is None:
update_db_v_3_4_5_22()
update_db_v_4_3_0(silent=1)
update_db_v_5_1_3(silent=1)
update_db_v_5_2_4(silent=1)
update_db_v_5_2_4_1(silent=1)
update_db_v_5_2_5_1(silent=1)
update_db_v_5_2_5_2(silent=1)
update_db_v_5_2_5_3(silent=1)
update_db_v_5_2_6(silent=1)
update_db_v_5_3_0(silent=1)
update_db_v_5_3_1(silent=1)
update_db_v_5_3_2_2(silent=1)
update_db_v_5_4_2(silent=1)
update_db_v_5_4_3(silent=1)
update_db_v_5_4_3_1(silent=1)
update_db_v_6_0(silent=1)
update_db_v_6_0_1(silent=1)
update_db_v_6_1_3(silent=1)
update_db_v_6_1_4()
update_ver()
if __name__ == "__main__":
create_tables()
default_values()

View File

@ -108,7 +108,7 @@ def get_data(log_type, **kwargs):
return now_utc.strftime(fmt)
def get_user_group(**kwargs):
def get_user_group(**kwargs) -> str:
import sql
user_group = ''
@ -129,21 +129,23 @@ def get_user_group(**kwargs):
return user_group
def logging(server_ip, action, **kwargs):
def logging(server_ip: str, action: str, **kwargs) -> None:
import sql
import distro
login = ''
cur_date = get_data('logs')
cur_date_in_log = get_data('date_in_log')
log_path = get_config_var('main', 'log_path')
if not os.path.exists(log_path):
os.makedirs(log_path)
try:
user_group = get_user_group()
except Exception:
user_group = ''
if not os.path.exists(log_path):
os.makedirs(log_path)
try:
ip = cgi.escape(os.environ["REMOTE_ADDR"])
except Exception:
@ -171,33 +173,30 @@ def logging(server_ip, action, **kwargs):
if kwargs.get('haproxywi') == 1:
if kwargs.get('login'):
mess = get_data('date_in_log') + " from " + ip + " user: " + login + ", group: " + user_group + ", " + \
action + " for: " + server_ip + "\n"
mess = f"{cur_date_in_log} from {ip} user: {login}, group: {user_group}, {action} for: {server_ip}\n"
if kwargs.get('keep_history'):
try:
keep_action_history(kwargs.get('service'), action, server_ip, login, ip)
except Exception as e:
print(str(e))
else:
mess = get_data('date_in_log') + " " + action + " from " + ip + "\n"
log = open(log_path + "/roxy-wi-" + get_data('logs') + ".log", "a")
mess = f"{cur_date_in_log} {action} from {ip}\n"
log_file = f"{log_path}/roxy-wi-{cur_date}.log"
elif kwargs.get('provisioning') == 1:
mess = get_data('date_in_log') + " from " + ip + " user: " + login + ", group: " + user_group + ", " + \
action + "\n"
log = open(log_path + "/provisioning-" + get_data('logs') + ".log", "a")
mess = f"{cur_date_in_log} from {ip} user: {login}, group: {user_group}, {action}\n"
log_file = f"{log_path}/provisioning-{cur_date}.log"
else:
mess = get_data('date_in_log') + " from " + ip + " user: " + login + ", group: " + user_group + ", " + \
action + " for: " + server_ip + "\n"
log = open(log_path + "/config_edit-" + get_data('logs') + ".log", "a")
mess = f"{cur_date_in_log} from {ip} user: {login}, group: {user_group}, {action} for: {server_ip}\n"
log_file = f"{log_path}/config_edit-{cur_date}.log"
if kwargs.get('keep_history'):
keep_action_history(kwargs.get('service'), action, server_ip, login, ip)
try:
log.write(mess)
log.close()
with open(log_file, 'a') as log:
log.write(mess)
except IOError as e:
print('<center><div class="alert alert-danger">Cannot write log. Please check log_path in config %e</div></center>' % e)
print(f'<center><div class="alert alert-danger">Cannot write log. Please check log_path in config {str(e)}</div></center>')
def keep_action_history(service: str, action: str, server_ip: str, login: str, user_ip: str):
@ -213,7 +212,7 @@ def keep_action_history(service: str, action: str, server_ip: str, login: str, u
sql.insert_action_history(service, action, server_id, user_id, user_ip)
except Exception as e:
logging('localhost', 'Cannot save a history: ' + str(e), haproxywi=1)
logging('localhost', f'Cannot save a history: {str(e)}', haproxywi=1)
def telegram_send_mess(mess, **kwargs):
@ -239,7 +238,6 @@ def telegram_send_mess(mess, **kwargs):
if token_bot == '' or channel_name == '':
mess = " Can't send message. Add Telegram channel before use alerting at this servers group"
print(mess)
logging('localhost', mess, haproxywi=1)
if proxy is not None and proxy != '' and proxy != 'None':
@ -248,7 +246,6 @@ def telegram_send_mess(mess, **kwargs):
bot = telebot.TeleBot(token=token_bot)
bot.send_message(chat_id=channel_name, text=mess)
except Exception as e:
print(str(e))
logging('localhost', str(e), haproxywi=1)
@ -282,7 +279,6 @@ def slack_send_mess(mess, **kwargs):
try:
client.chat_postMessage(channel='#' + channel_name, text=mess)
except SlackApiError as e:
print('error: ' + str(e))
logging('localhost', str(e), haproxywi=1)
@ -1178,44 +1174,36 @@ def show_log(stdout, **kwargs):
if kwargs.get('grep'):
grep = kwargs.get('grep')
grep = re.sub(r'[?|$|.|!|^|*|\]|\[|,| |]', r'', grep)
for line in stdout:
if kwargs.get("html") != 0:
i = i + 1
if kwargs.get('grep'):
line = line.replace(grep, '<span style="color: red; font-weight: bold;">' + grep + '</span>')
line_class = "line3" if i % 2 == 0 else "line"
out += '<div class="' + line_class + '">' + line + '</div>'
else:
out += line
i = i + 1
if kwargs.get('grep'):
line = line.replace(grep, f'<span style="color: red; font-weight: bold;">{grep}</span>')
line_class = "line3" if i % 2 == 0 else "line"
out += f'<div class="{line_class}">{line}</div>'
return out
def show_finding_in_config(stdout: str, **kwargs) -> str:
i = 0
out = ''
grep = ''
line_class = 'line'
out = '<div class="line">--</div>'
if kwargs.get('grep'):
grep = kwargs.get('grep')
grep = re.sub(r'[?|$|!|^|*|\]|\[|,| |]', r'', grep)
out += '<div class="line">--</div>'
for line in stdout:
i = i + 1
if kwargs.get('grep'):
line = line.replace(grep, '<span style="color: red; font-weight: bold;">' + grep + '</span>')
line_class = "line" if '--' in line else "line3"
out += '<div class="' + line_class + '">' + line + '</div>'
line = line.replace(grep, f'<span style="color: red; font-weight: bold;">{grep}</span>')
line_class = "line" if '--' in line else "line3"
out += f'<div class="{line_class}">{line}</div>'
out += '<div class="line">--</div>'
return out
def show_haproxy_log(
def show_roxy_log(
serv, rows='10', waf='0', grep=None, hour='00',
minut='00', hour1='24', minut1='00', service='haproxy', **kwargs
) -> str:
@ -1227,6 +1215,7 @@ def show_haproxy_log(
rows = checkAjaxInput(rows)
waf = checkAjaxInput(waf)
cmd = ''
awk_column = 3
if grep is not None:
grep_act = '|egrep "%s"' % checkAjaxInput(grep)
@ -1282,21 +1271,19 @@ def show_haproxy_log(
elif serv == 'roxy-wi.error.log':
cmd = "sudo cat {}| awk '$4>\"{}:00\" && $4<\"{}:00\"' |tail -{} {} {}".format(apache_log_path + "/" + serv, date, date1, rows, grep_act, exgrep_act)
elif serv == 'fail2ban.log':
cmd = "sudo cat {}| awk -F\"/|:\" '$3>\"{}:00\" && $3<\"{}:00\"' |tail -{} {} {}".format("/var/log/" + serv, date, date1, rows, grep_act, exgrep_act)
cmd = 'sudo cat {}| awk -F"/|:" \'$3>"{}:00" && $3<"{}:00\' |tail -{} {} {}'.format("/var/log/" + serv, date, date1, rows, grep_act, exgrep_act)
output, stderr = subprocess_execute(cmd)
return show_log(output, grep=grep)
elif service == 'internal':
log_path = get_config_var('main', 'log_path')
logs_files = get_files(log_path, "log")
user_group = get_user_group()
user_grep = ''
if user_group != '' and user_group != 'Default':
user_grep = "|grep 'group: " + user_group + "'"
else:
user_grep = ''
log_path = get_config_var('main', 'log_path')
logs_files = get_files(log_path, "log")
for key, value in logs_files:
if int(serv) == key:
@ -1307,16 +1294,16 @@ def show_haproxy_log(
sys.exit()
if serv == 'backup.log':
cmd = "cat %s| awk '$2>\"%s:00\" && $2<\"%s:00\"' %s %s %s |tail -%s" % (log_path + serv, date, date1, user_grep, grep_act, exgrep_act, rows)
else:
cmd = "cat %s| awk '$3>\"%s:00\" && $3<\"%s:00\"' %s %s %s |tail -%s" % (log_path + serv, date, date1, user_grep, grep_act, exgrep_act, rows)
awk_column = 2
cmd = f"cat {log_path}/{serv}| awk '${awk_column}>\"{date}:00\" && ${awk_column}<\"{date1}:00\"' {user_grep} {grep_act} {exgrep_act} |tail -{rows}"
output, stderr = subprocess_execute(cmd)
return show_log(output, grep=grep)
def roxy_wi_log(**kwargs):
def roxy_wi_log(**kwargs) -> str:
log_path = get_config_var('main', 'log_path')
if kwargs.get('log_id'):
@ -1364,27 +1351,22 @@ def server_status(stdout):
return proc_count
def ssh_command(server_ip, commands, **kwargs):
def ssh_command(server_ip: str, commands: list, **kwargs):
with ssh_connect(server_ip) as ssh:
for command in commands:
try:
stdin, stdout, stderr = ssh.run_command(command)
except Exception as e:
logging('localhost', ' ' + str(e), haproxywi=1)
logging('localhost', f' {str(e)}', haproxywi=1)
return str(e)
if kwargs.get('raw'):
return stdout
try:
if kwargs.get('raw'):
return stdout.readlines()
if kwargs.get("ip") == "1":
show_ip(stdout)
elif kwargs.get("show_log") == "1":
return show_log(stdout, grep=kwargs.get("grep"))
elif kwargs.get("server_status") == "1":
server_status(stdout)
elif kwargs.get('print_out'):
print(stdout.read().decode(encoding='UTF-8'))
return stdout.read().decode(encoding='UTF-8')
elif kwargs.get('return_err') == 1:
return stderr.read().decode(encoding='UTF-8')
else:
@ -1392,10 +1374,10 @@ def ssh_command(server_ip, commands, **kwargs):
except Exception as e:
logging('localhost', str(e), haproxywi=1)
for line in stderr.read().decode(encoding='UTF-8'):
for line in stderr.readlines():
if line:
print("<div class='alert alert-warning'>" + line + "</div>")
logging('localhost', ' ' + line, haproxywi=1)
print(f'error: {line}')
logging('localhost', f' {line}', haproxywi=1)
def subprocess_execute(cmd):
@ -1432,7 +1414,7 @@ def show_backends(server_ip, **kwargs):
return ret
def get_files(folder=get_config_var('configs', 'haproxy_save_configs_dir'), file_format='cfg'):
def get_files(folder=get_config_var('configs', 'haproxy_save_configs_dir'), file_format='cfg') -> list:
import glob
if file_format == 'log':
file = []
@ -1442,7 +1424,10 @@ def get_files(folder=get_config_var('configs', 'haproxy_save_configs_dir'), file
i = 0
for files in sorted(glob.glob(os.path.join(folder, '*.' + file_format + '*'))):
if file_format == 'log':
file += [(i, files.split('/')[5])]
try:
file += [(i, files.split('/')[4])]
except Exception as e:
print(e)
else:
file.add(files.split('/')[-1])
i += 1
@ -1496,11 +1481,12 @@ def check_new_version(service):
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import sql
current_ver = check_ver()
proxy = sql.get_setting('proxy')
res = ''
user_name = sql.select_user_name()
retry_strategy = Retry(
total=3,
@ -1614,10 +1600,11 @@ def get_users_params(**kwargs):
def check_user_group(**kwargs):
import sql
if kwargs.get('token') is not None:
return True
import sql
if kwargs.get('user_uuid'):
group_id = kwargs.get('user_group_id')
user_uuid = kwargs.get('user_uuid')
@ -1738,15 +1725,15 @@ def get_services_status():
return services
def is_file_exists(server_ip: str, file: str):
cmd = ['[ -f ' + file + ' ] && echo yes || echo no']
def is_file_exists(server_ip: str, file: str) -> bool:
cmd = [f'[ -f {file} ] && echo yes || echo no']
out = ssh_command(server_ip, cmd)
return True if 'yes' in out else False
def is_service_active(server_ip: str, service_name: str):
cmd = ['systemctl is-active ' + service_name]
def is_service_active(server_ip: str, service_name: str) -> bool:
cmd = [f'systemctl is-active {service_name}']
out = ssh_command(server_ip, cmd)
out = out.strip()
@ -2009,7 +1996,7 @@ def send_message_to_rabbit(message: str, **kwargs) -> None:
connection.close()
def is_restarted(server_ip, action):
def is_restarted(server_ip: str, action: str) -> None:
import sql
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
@ -2017,7 +2004,7 @@ def is_restarted(server_ip, action):
user_role = sql.get_user_role_by_uuid(user_uuid.value)
if sql.is_serv_protected(server_ip) and int(user_role) > 2:
print('error: This server is protected. You cannot ' + action + ' it')
print(f'error: This server is protected. You cannot {action} it')
sys.exit()
@ -2045,7 +2032,10 @@ def get_correct_apache_service_name(server_ip=0, server_id=0) -> str:
if server_id == 0:
server_id = sql.select_server_id_by_ip(server_ip)
os_info = sql.select_os_info(server_id)
try:
os_info = sql.select_os_info(server_id)
except Exception:
return 'error: cannot get server info'
if "CentOS" in os_info or "Redhat" in os_info:
return 'httpd'

View File

@ -1,4 +1,6 @@
#!/usr/bin/env python3
import sys
import distro
import funct
@ -44,6 +46,7 @@ if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
restart_settings = sql.select_restart_services_settings(service_desc.slug)
else:
print('<meta http-equiv="refresh" content="0; url=/app/overview.py">')
sys.exit()
services_name = {'roxy-wi-checker': 'Master backends checker service',
'roxy-wi-keep_alive': 'Auto start service',

View File

@ -32,7 +32,7 @@ if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
)
elif service == 'server':
if serv:
title = serv + ' history'
title = f'{serv} history'
if funct.check_is_server_in_group(serv):
server_id = sql.select_server_id_by_ip(serv)
history = sql.select_action_history_by_server_id(server_id)

View File

@ -1,15 +1,14 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
import http.cookies
import datetime
import uuid
import distro
import sql
import create_db
import funct
from jinja2 import Environment, FileSystemLoader
@ -27,15 +26,14 @@ except Exception:
ref = ''
login = ''
password = ''
db_create = ""
error_log = ""
error = ""
def send_cookie(login):
session_ttl = sql.get_setting('session_ttl')
session_ttl = int(session_ttl)
session_ttl = int(sql.get_setting('session_ttl'))
expires = datetime.datetime.utcnow() + datetime.timedelta(days=session_ttl)
user_group = ''
user_uuid = str(uuid.uuid4())
user_token = str(uuid.uuid4())
sql.write_user_uuid(login, user_uuid)
@ -76,7 +74,7 @@ def send_cookie(login):
try:
user_name = sql.get_user_name_by_uuid(user_uuid)
funct.logging('localhost', ' user: ' + user_name + ', group: ' + user_group + ' login', haproxywi=1)
funct.logging('localhost', f' user: {user_name}, group: {user_group} login', haproxywi=1)
except Exception:
pass
print("Content-type: text/html\n")
@ -116,12 +114,13 @@ def ban():
c["ban"]["Secure"] = "True"
c["ban"]["expires"] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT")
try:
funct.logging('localhost', login + ' failed log in', haproxywi=1, login=1)
funct.logging('localhost', f'{login} failed log in', haproxywi=1, login=1)
except Exception:
funct.logging('localhost', ' Failed log in. Wrong username', haproxywi=1)
print(c.output())
print("Content-type: text/html\n")
print('ban')
sys.exit()
def check_in_ldap(user, password):
@ -168,8 +167,8 @@ def check_in_ldap(user, password):
print("Content-type: text/html\n")
print('<center><div class="alert alert-danger">Other LDAP error: %s</div><br /><br />' % e)
sys.exit()
send_cookie(user)
else:
send_cookie(user)
if ref is None:
@ -191,7 +190,6 @@ try:
except Exception:
role = ""
user = ""
pass
if form.getvalue('logout'):
@ -222,19 +220,15 @@ if login is not None and password is not None:
break
else:
ban()
sys.exit()
else:
ban()
sys.exit()
print("Content-type: text/html\n")
if login is None:
print("Content-type: text/html\n")
create_db.update_all_silent()
output_from_parsed_template = template.render(
h2=0, title="Login page", role=role, user=user, error_log=error_log, error=error, ref=ref,
versions=funct.versions(), db_create=db_create
versions=funct.versions()
)
print(output_from_parsed_template)

View File

@ -1,6 +1,24 @@
from peewee import *
from datetime import datetime
from funct import get_config_var
from configparser import ConfigParser, ExtendedInterpolation
def get_config_var(sec, var):
try:
path_config = "/etc/roxy-wi/roxy-wi.cfg"
config = ConfigParser(interpolation=ExtendedInterpolation())
config.read(path_config)
except Exception as e:
print('error: ' + str(e))
return
try:
return config.get(sec, var)
except Exception:
print('Content-type: text/html\n')
print(f'<center><div class="alert alert-danger">Check the config file. Presence section {sec} and parameter {var}</div>')
return
mysql_enable = get_config_var('mysql', 'enable')

View File

@ -967,7 +967,7 @@ if serv is not None and form.getvalue('show_log') is not None:
hour1 = form.getvalue('hour1')
minut1 = form.getvalue('minut1')
service = form.getvalue('service')
out = funct.show_haproxy_log(serv, rows=rows, waf=waf, grep=grep, hour=hour, minut=minut, hour1=hour1,
out = funct.show_roxy_log(serv, rows=rows, waf=waf, grep=grep, hour=hour, minut=minut, hour1=hour1,
minut1=minut1, service=service)
print(out)
@ -978,7 +978,7 @@ if serv is not None and form.getvalue('rows1') is not None:
minut = form.getvalue('minut')
hour1 = form.getvalue('hour1')
minut1 = form.getvalue('minut1')
out = funct.show_haproxy_log(serv, rows=rows, waf='0', grep=grep, hour=hour, minut=minut, hour1=hour1,
out = funct.show_roxy_log(serv, rows=rows, waf='0', grep=grep, hour=hour, minut=minut, hour1=hour1,
minut1=minut1, service='apache_internal')
print(out)
@ -991,7 +991,7 @@ if form.getvalue('viewlogs') is not None:
hour1 = form.getvalue('hour1')
minut1 = form.getvalue('minut1')
if funct.check_user_group():
out = funct.show_haproxy_log(serv=viewlog, rows=rows, waf='0', grep=grep, hour=hour, minut=minut, hour1=hour1,
out = funct.show_roxy_log(serv=viewlog, rows=rows, waf='0', grep=grep, hour=hour, minut=minut, hour1=hour1,
minut1=minut1, service='internal')
print(out)
@ -4466,8 +4466,8 @@ if act == 'findInConfigs':
service = form.getvalue('service')
log_path = sql.get_setting(service + '_dir')
log_path = funct.return_nice_path(log_path)
commands = ['sudo grep "%s" %s*/*.conf -C 2 -Rn' % (finding_words, log_path)]
return_find = funct.ssh_command(server_ip, commands, raw='1')
commands = [f'sudo grep "{finding_words}" {log_path}*/*.conf -C 2 -Rn']
return_find = funct.ssh_command(server_ip, commands, raw=1)
return_find = funct.show_finding_in_config(return_find, grep=finding_words)
if 'error: ' in return_find:

View File

@ -4,39 +4,34 @@ import sql
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
template = env.get_template('smon.html')
smon_status = ''
stderr = ''
form = funct.form
action = form.getvalue('action')
sort = form.getvalue('sort')
autorefresh = 0
print('Content-type: text/html\n')
funct.check_login()
try:
user, user_id, role, token, servers, user_services = funct.get_users_params()
user_group = funct.get_user_group(id=1)
cmd = "systemctl is-active roxy-wi-smon"
smon_status, stderr = funct.subprocess_execute(cmd)
except Exception as e:
print(str(e))
user, user_id, role, token, servers, user_services = funct.get_users_params()
user_group = funct.get_user_group(id=1)
cmd = "systemctl is-active roxy-wi-smon"
smon_status, stderr = funct.subprocess_execute(cmd)
if action == 'add':
smon = sql.select_smon(user_group, action='add')
funct.page_for_admin(level=3)
title = "SMON Admin"
autorefresh = 0
elif action == 'history':
if form.getvalue('host'):
smon = sql.alerts_history('SMON', user_group, host=form.getvalue('host'))
needed_host = funct.is_ip_or_dns(form.getvalue('host'))
smon = sql.alerts_history('SMON', user_group, host=needed_host)
else:
smon = sql.alerts_history('SMON', user_group)
title = "SMON History"
autorefresh = 0
elif action == 'checker_history':
smon = sql.alerts_history('Checker', user_group)
title = "Checker History"
autorefresh = 0
else:
smon = sql.smon_list(user_group)
title = "SMON Dashboard"
@ -46,7 +41,7 @@ try:
user_status, user_plan = funct.return_user_status()
except Exception as e:
user_status, user_plan = 0, 0
funct.logging('localhost', 'Cannot get a user plan: ' + str(e), haproxywi=1)
funct.logging('localhost', f'Cannot get a user plan: {str(e)}', haproxywi=1)
rendered_template = template.render(
h2=1, title=title, autorefresh=autorefresh, role=role, user=user, group=user_group,

View File

@ -5,9 +5,7 @@ import sys
import os
import funct
from db_model import *
mysql_enable = funct.get_config_var('mysql', 'enable')
from modules.db_model import *
def out_error(error):

View File

@ -47,7 +47,7 @@
{% endif %}
<span style="color: {{color}};"><b>{{t.1 |upper}}</b></span>
</td>
<td>{{t.2}}</td>
<td><a href="/app/smon.py?action=history&host={{t.2}}" title="Open history for {{t.2}} host">{{t.2}}</a></td>
{% if action != "checker_history" %}
<td>{{t.3}}</td>
{% endif %}

View File

@ -279,14 +279,14 @@
<br />
{{s.5.0.2}}
{% else %}
Cannot get information about HAProxy
{% endif %}
Cannot get information about HAProxy
{% endif %}
{% endif %}
<span title="Date of last configuration edit">
Last edit:
<span id="edit_date_{{s.2}}"></span>
</span>
<br />
</span>
<div class="overflow_div">
IP: {{ copy_to_clipboard(value=s.2, style='font-weight: bold') }}
{% if s.7.0.0 != None %}
Master for: <b>{{ copy_to_clipboard(value=s.7.0.1, style='font-weight: bold') }}</b>
@ -300,6 +300,7 @@
{% endif %}
</b>
{% endif %}
</div>
</div>
<div class="server-act-links" id="server-{{s.8.0.0|string()}}-{{service}}">
{% if role <= 2 %}

View File

@ -1,6 +1,6 @@
{% extends "base.html" %}
{% block content %}
<link href="/inc/chart.min.css" rel="stylesheet">
<link href="/inc/css/chart.min.css" rel="stylesheet">
<script src="/inc/metrics.js"></script>
<script src="/inc/chart.min.js"></script>
<script src="/inc/overview.js"></script>

View File

@ -4,3 +4,4 @@ pytz>=2017.3
pyTelegramBotAPI>=3.6.3
slack-sdk>=3.4.0
distro>=1.2.0
retry>=0.9.2

View File

@ -5,3 +5,4 @@ paramiko-ng>=2.5.0
slack-sdk>=3.4.0
peewee>=3.14.10
PyMySQL>=1.0.2
retry>=0.9.2

View File

@ -7,3 +7,4 @@ slack-sdk>=3.4.0
peewee>=3.14.10
PyMySQL>=1.0.2
bottle>=0.12.18
retry>=0.9.2

View File

@ -7,3 +7,4 @@ slack-sdk>=3.4.0
peewee>=3.14.10
PyMySQL>=1.0.2
bottle>=0.12.18
retry>=0.9.2

View File

@ -581,6 +581,11 @@ ul{
padding-left: 10px !important;
padding-right: 10px !important;
}
.overflow_div {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
@media all and (-webkit-min-device-pixel-ratio:0) and (min-resolution: .001dpcm) {
.ui-checkboxradio-label {
padding-bottom: 0.4em !important;
@ -733,7 +738,7 @@ td,th {
margin-right: 50px;
width: 300px;
text-align: center;
margin-left: 40%;
margin-left: 44%;
}
.validateTips {
width: 540px;

View File

@ -1,7 +1,7 @@
[main]
# Path to the files destination
fullpath = /var/www/haproxy-wi
log_path = ${fullpath}/log/
log_path = /var/log/roxy-wi
lib_path = /var/lib/roxy-wi
[configs]