Changelog: https://roxy-wi.org/changelog#6_3_9
pull/364/head
Aidaho 2023-04-06 10:48:00 +03:00
parent ab93673f2a
commit 28eaa9d940
10 changed files with 90 additions and 80 deletions

View File

@ -41,14 +41,21 @@ def checkAjaxInput(ajax_input: str):
return quote(ajax_input.rstrip())
def return_nice_path(return_path: str) -> str:
def check_is_service_folder(service_path: str) -> bool:
if (
'nginx' not in return_path
and 'haproxy' not in return_path
and 'apache2' not in return_path
and 'httpd' not in return_path
and 'keepalived' not in return_path
):
'nginx' not in service_path
and 'haproxy' not in service_path
and 'apache2' not in service_path
and 'httpd' not in service_path
and 'keepalived' not in service_path
) or '..' in service_path:
return False
else:
return True
def return_nice_path(return_path: str) -> str:
if not check_is_service_folder(return_path):
return 'error: The path must contain the name of the service. Check it in Roxy-WI settings'
if return_path[-1] != '/':
@ -57,6 +64,14 @@ def return_nice_path(return_path: str) -> str:
return return_path
def check_is_conf(config_path: str) -> bool:
if check_is_service_folder(config_path):
if 'conf' in config_path or 'cfg' in config_path:
return True
return False
def string_to_dict(dict_string) -> dict:
from ast import literal_eval
return literal_eval(dict_string)

View File

@ -34,8 +34,8 @@ def get_config(server_ip, cfg, **kwargs):
else:
config_path = sql.get_setting('haproxy_config_path')
if '..' in config_path:
return 'error: nice try'
if not common.check_is_conf(config_path):
raise Exception('error: nice try 2')
try:
with mod_ssh.ssh_connect(server_ip) as ssh:
@ -451,14 +451,11 @@ def show_config(server_ip: str) -> None:
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)
try:
get_config(server_ip, cfg, service=service, config_file_name=form.getvalue('config_file_name'))
except Exception as e:
print(e)
return
else:
cfg = configs_dir + form.getvalue('configver')
try:

View File

@ -697,7 +697,7 @@
</td>
</tr>
<tr style="width: 50%;">
<td class="first-collumn" valign="top" style="padding-top: 15px;">
<td class="first-collumn padding10" valign="top" style="padding-top: 15px;">
<select required id="serv4">
<option disabled selected>------</option>
{% for select in selects %}

View File

@ -1,4 +1,4 @@
<link href="/inc/css/table.css" rel="stylesheet" type="text/css">
<link href="/inc/css/table-6.3.9.css" rel="stylesheet" type="text/css">
<script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
{% if action == "history" %}
{% set column_for_sort = 4 %}

View File

@ -5,7 +5,7 @@
{% if selects|length == 0 %}
{% include 'include/getstarted.html' %}
{% else %}
<link href="/inc/css/table.css" rel="stylesheet" type="text/css">
<link href="/inc/css/table-6.3.9.css" rel="stylesheet" type="text/css">
<script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
<p>
<form action="{{ action }}" method="post" class="left-space">

View File

@ -1,4 +1,4 @@
<link href="/inc/css/table.css" rel="stylesheet" type="text/css">
<link href="/inc/css/table-6.3.9.css" rel="stylesheet" type="text/css">
<script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
<script>
$(document).ready(function() {

View File

@ -10,16 +10,16 @@
"link": "Обзор",
"h2": "Обзор сервисов",
"haproxy": {
"title": "Обзор HAProxy серверов"
"title": "Обзор HAProxy-серверов"
},
"nginx": {
"title": "Обзор NGINX серверов"
"title": "Обзор NGINX-серверов"
},
"apache": {
"title": "Обзор Apache серверов"
"title": "Обзор Apache-серверов"
},
"keepalived": {
"title": "Обзор Keepalived серверов"
"title": "Обзор Keepalived-серверов"
},
},
"config": {
@ -67,7 +67,7 @@
},
"ssl": {
"link": "SSL",
"title": "Добавить прокси: Загрузить SSL сертификат"
"title": "Добавить прокси: Загрузить SSL-сертификат"
},
"lists": {
"link": "Листы",
@ -128,18 +128,18 @@
"cannot_get_info": "Не возможно получить информацию о",
"something_wrong": "Что-то пошло не так",
"check_logs": "проверти логи",
"select_server": "Выберете в начале сервер",
"empty_name": "Имя не может быть пустым",
"select_server": "Сначала выберите сервер",
"empty_name": "Поле имя не может быть пустым",
}
%}
{% set settings = {
"rabbitmq": {
"rabbitmq_host": "RabbitMQ-server сервер",
"rabbitmq_port": "RabbitMQ-server порт",
"rabbitmq_vhost": "RabbitMQ-server vhost",
"rabbitmq_queue": "RabbitMQ-server очередь",
"rabbitmq_user": "RabbitMQ-server пользователь",
"rabbitmq_password": "RabbitMQ-server пароль",
"rabbitmq_host": "Адрес сервера RabbitMQ",
"rabbitmq_port": "Порт сервера RabbitMQ",
"rabbitmq_vhost": "Виртуальный хост RabbitMQ",
"rabbitmq_queue": "Имя очереди RabbitMQ",
"rabbitmq_user": "Имя пользователя RabbitMQ",
"rabbitmq_password": "Пароль пользователя RabbitMQ",
},
"nginx": {
"nginx_path_logs": "Путь до лог файлов NGINX",
@ -159,49 +159,49 @@
"checker_keep_history_range": "Время хранения истории Checker",
"checker_maxconn_threshold": "Время хранения истории Port scanner",
"checker_check_interval": "Порог срабатывания уведомления по maxconn, в %",
"smon_ssl_expire_warning_alert": "Предупреждение о истечении SSL сертификата (в днях)",
"smon_ssl_expire_critical_alert": "Критическое предупреждение о истечении SSL сертификата (в днях)",
"smon_ssl_expire_warning_alert": "Предупреждение о истечении SSL-сертификата (в днях)",
"smon_ssl_expire_critical_alert": "Критическое предупреждение о истечении SSL-сертификата (в днях)",
},
"main": {
"time_zone": "Временная зона",
"proxy": "IP адрес и порт прокси сервера. Формат: proto://ip:port",
"proxy": "IP-адрес и порт прокси сервера. Формат: proto://ip:port",
"session_ttl": "Время жизни пользовательских сессий (в днях)",
"token_ttl": "Время жизни пользовательских токенов (в днях)",
"tmp_config_path": "Путь до временной директории. Путь должен существовать. Директория должна принадлежать пользователю от имени которого подключается SSH",
"cert_path": "Путь до SSL директории. Путь должен существовать. Директория должна принадлежать пользователю от имени которого подключается SSH",
"ssl_local_path": "Локальный путь для хранения SSL сертификатов. Данный путь относительный от $HOME_ROXY_WI/app/",
"lists_path": "Локальный путь для хранения black и white листов. Данный путь относительный от $HOME_ROXY-WI",
"tmp_config_path": "Путь до временной директории. Путь должен существовать. Директория должна принадлежать пользователю, от имени которого подключается SSH",
"cert_path": "Путь до SSL-директории. Путь должен существовать. Директория должна принадлежать пользователю, от имени которого подключается SSH",
"ssl_local_path": "Локальный путь для хранения SSL-сертификатов. Укажите относительный путь от $HOME_ROXY_WI/app/",
"lists_path": "Локальный путь для хранения черных и белых списков. Укажите относительный путь от $HOME_ROXY-WI",
"maxmind_key": "Лицензионный ключ для загрузки GeoLite2 DB. Создается на сайте maxmind.com",
},
"mail": {
"mail_ssl": "Включить TLS",
"mail_from": "Адрес отправителя",
"mail_smtp_host": "Адрес SMTP сервера",
"mail_smtp_port": "Порт SMTP сервера",
"mail_smtp_host": "Адрес SMTP-сервера",
"mail_smtp_port": "Порт SMTP-сервера",
"mail_smtp_user": "Имя пользователя",
"mail_smtp_password": "Пароль",
},
"logs": {
"syslog_server_enable": "Включение получение логов из syslog сервера",
"syslog_server": "IP адрес syslog сервера",
"log_time_storage": "Время хранение лог файлов пользовательской активности (в днях)",
"syslog_server_enable": "Включение получение логов из syslog-сервера",
"syslog_server": "IP-адрес syslog-сервера",
"log_time_storage": "Срок хранения логов пользовательской активности (в днях)",
"apache_log_path": "Путь до лог файлов Apache сервера",
},
"ldap": {
"ldap_enable": "LDAP включен",
"ldap_server": "IP адрес LDAP сервера",
"ldap_port": "LDAP порт (порт 389 или 636 используются по умолчанию)",
"ldap_user": "LDAP имя пользователя",
"ldap_password": "LDAP пароль",
"ldap_server": "IP-адрес сервера LDAP",
"ldap_port": "Порт сервера LDAP (порт 389 или 636 используются по умолчанию)",
"ldap_user": "Имя пользователя LDAP",
"ldap_password": "Пароль LDAP",
"ldap_base": "Базовый домен. Пример: dc=domain, dc=com",
"ldap_domain": "LDAP домен для входа",
"ldap_domain": "Домен для входа",
"ldap_class_search": "Класс для поиска пользователя",
"ldap_user_attribute": "Атрибут для поиска пользователей",
"ldap_search_field": "Почта пользователя",
"ldap_type": "Использовать LDAPS",
},
"haproxy": {
"haproxy_path_logs": "Путь до лог файлов HAProxy",
"haproxy_path_logs": "Путь до логов HAProxy",
"stats_user": "Пользователь для входа на страницу статистики HAProxy",
"stats_password": "Пароль для входа на страницу статистики HAProxy",
"stats_port": "Порт для доступа на страницу статистики HAProxy",
@ -283,7 +283,7 @@
"roll_back": "Откатиться к ним, просмотреть или удалить",
"files_been_deleted": "Следующие файлы были удалены",
"version_has_been_uploaded": "Данная версия была загружена и сохранена как",
"new_config_has_been_saved": "A new config has been saved as",
"new_config_has_been_saved": "Новый конфиг сохранен под именем",
"view_and_upload": "Просмотр и загрузка этой версии конфига",
"int_vrrp": "Интерфейс для VRRP на сервере",
"howto_ha": "Как создать кластер высокой доступности",
@ -385,7 +385,7 @@
"disable_ssl_check": "Отключить проверку SSL",
"disable_ssl_verify": "Отключить проверку SSL на серверах",
"set_options": "Задать параметры",
"set_options_m": "Задать параметры в ручную",
"set_options_m": "Задать параметры вручную",
"show_full_settings": "Показать полный список настроек",
"show_full_settings": "Скрыть полный список настроек",
}

View File

@ -3,7 +3,7 @@
{% block h2 %}Runtime API{% endblock %}
{% block content %}
{% from 'include/input_macros.html' import input, checkbox %}
<link href="/inc/css/table.css" rel="stylesheet" type="text/css">
<link href="/inc/css/table-6.3.9.css" rel="stylesheet" type="text/css">
<script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
<script type="text/javascript" charset="utf8" src="/inc/runtimeapi.js"></script>
<div id="tabs">

View File

@ -47,7 +47,7 @@
</table>
</div>
{% elif waf_rule_file %}
<center>
<div class="left-space">
<link rel="stylesheet" href="/inc/codemirror/lib/codemirror.css">
<link rel="stylesheet" href="/inc/codemirror/addon/dialog/dialog.css">
<link rel="stylesheet" href="/inc/codemirror/addon/fold/foldgutter.css">
@ -72,30 +72,28 @@
<script src="/inc/codemirror/keymap/sublime.js"></script>
<script src="/inc/configshow.js"></script>
<h4>{{lang.words.config|title()}} {{waf_rule_file}} {{lang.words.from|title()}} {{ serv }}</h4>
</center>
<form action="waf.py" name="saveconfig" id="saveconfig" method="post">
<input type="hidden" value="{{ serv }}" name="serv">
<input type="hidden" value="{{ cfg }}.old" name="oldconfig">
<input type="hidden" value="{{ token }}" name="token">
<input type="hidden" value="waf_{{ service }}" name="service">
<input type="hidden" value="{{ config_file_name }}" name="config_file_name">
<div style="margin-left: 20%;width: 60%;">
<div style="width: 95%;">
<textarea name="config" id="config_text_area" class="config" rows="35" cols="100">{{ config }}</textarea>
</div>
<p>
<center>
<a href="waf.py?manage_rules=1&serv={{serv}}" class="ui-button ui-widget ui-corner-all" title="Return to rules management">{{lang.words.back|title()}}</a>
{% if role <= 3 %}
<button type="submit" value="save" name="save" class="btn btn-default" title="{{lang.words.save|title()}} {{lang.words.without}} {{lang.words.reloading}}">{{lang.words.save|title()}}</button>
{% if service == 'haproxy' %}
<button type="submit" value="" name="" class="btn btn-default">{{lang.phrases.save_and_restart}}</button>
{% elif service == 'nginx' %}
<button type="submit" value="" name="reload" class="btn btn-default">{{lang.phrases.save_and_reload}}</button>
{% endif %}
{% endif %}
</center>
<a href="waf.py?manage_rules=1&serv={{serv}}" class="ui-button ui-widget ui-corner-all" title="Return to rules management">{{lang.words.back|title()}}</a>
{% if role <= 3 %}
<button type="submit" value="save" name="save" class="btn btn-default" title="{{lang.words.save|title()}} {{lang.words.without}} {{lang.words.reloading}}">{{lang.words.save|title()}}</button>
{% if service == 'haproxy' %}
<button type="submit" value="" name="" class="btn btn-default">{{lang.phrases.save_and_restart}}</button>
{% elif service == 'nginx' %}
<button type="submit" value="" name="reload" class="btn btn-default">{{lang.phrases.save_and_reload}}</button>
{% endif %}
{% endif %}
</p>
</form>
</div>
<style>
.CodeMirror {
line-height: 1.2em;
@ -132,15 +130,15 @@
</style>
<script>
$("#secIntervals").css("display", "none");
var ip = []
var hostnamea = []
{%- for s in servers_all %}
{% if service == 'haproxy '%}
{% set service_in_table = s.15 %}
{% else %}
{% set service_in_table = s.14 %}
{% endif %}
{% if service_in_table|int() == 1 %}
var ip = [];
var hostnamea = [];
{% for s in servers_all %}
{%- if service == 'haproxy' -%}
{%- set service_in_table = s.15 -%}
{%- else -%}
{% set service_in_table = s.14 -%}
{%- endif -%}
{%- if service_in_table|int() == 1 -%}
ip.push("{{ s[2] }}");
var host = "{{s[2]}}";
host = host.replace(/\./g, '\\.');
@ -172,7 +170,7 @@
{% endfor %}
</table>
{% if service == 'haproxy' %}
<link href="/inc/chart.min.css" rel="stylesheet">
<link href="/inc/css/chart.min.css" rel="stylesheet">
<script src="/inc/overview-6.3.9.js"></script>
<script src="/inc/metrics.js"></script>
<script src="/inc/chart.min.js"></script>

View File

@ -574,7 +574,7 @@ function keepalivedBecameMaster(serv) {
data = data.replace(/\s+/g,' ');
if (data.indexOf('error:') != '-1') {
toastr.error(data);
} else if (data.indexOf('no such') != '-1') {
} else if (data.indexOf('No such') != '-1') {
$("#bin_bout").html('Cannot get information');
} else {
$("#bin_bout").html(data);