Changelog: https://roxy-wi.org/changelog#7.0.1
pull/364/head
Aidaho 2023-10-16 13:12:36 +03:00
parent 9a4d29076e
commit 9ce85fdff0
45 changed files with 967 additions and 1017 deletions

View File

@ -1,69 +1,57 @@
from datetime import timedelta
from flask import Flask
from flask_caching import Cache
from flask_login import LoginManager
from flask_apscheduler import APScheduler
app = Flask(__name__)
app.secret_key = 'some secret salt'
app.config.from_object('app.config.Configuration')
app.jinja_env.add_extension('jinja2.ext.do')
app.jinja_env.add_extension('jinja2.ext.loopcontrols')
cache = Cache(config={'CACHE_TYPE': 'SimpleCache', "CACHE_DEFAULT_TIMEOUT": 3000})
cache = Cache()
cache.init_app(app)
scheduler = APScheduler()
scheduler.init_app(app)
scheduler.start()
login_manager = LoginManager(app)
login_manager.login_view = 'login_page'
app.config['SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS'] = True
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=3)
from app.routes.main import bp as main_bp
app.register_blueprint(main_bp)
from app.routes.overview import bp as overview_bp
app.register_blueprint(overview_bp)
from app.routes.add import bp as add_bp
app.register_blueprint(add_bp, url_prefix='/add')
from app.routes.service import bp as service_bp
app.register_blueprint(service_bp, url_prefix='/service')
from app.routes.config import bp as config_bp
app.register_blueprint(config_bp, url_prefix='/config')
from app.routes.logs import bp as logs_bp
app.register_blueprint(logs_bp, url_prefix='/logs')
from app.routes.metric import bp as metric_bp
app.register_blueprint(metric_bp, url_prefix='/metrics')
from app.routes.waf import bp as waf_bp
app.register_blueprint(waf_bp, url_prefix='/waf')
from app.routes.runtime import bp as runtime_bp
app.register_blueprint(runtime_bp, url_prefix='/runtimeapi')
from app.routes.smon import bp as smon_bp
app.register_blueprint(smon_bp, url_prefix='/smon')
from app.routes.checker import bp as checker_bp
app.register_blueprint(checker_bp, url_prefix='/checker')
from app.routes.portscanner import bp as portscanner_bp
app.register_blueprint(portscanner_bp, url_prefix='/portscanner')
from app.routes.install import bp as install_bp
app.register_blueprint(install_bp, url_prefix='/install')
from app.routes.user import bp as user_bp
app.register_blueprint(user_bp, url_prefix='/user')
from app.routes.server import bp as server_bp
app.register_blueprint(server_bp, url_prefix='/server')
from app.routes.admin import bp as admin_bp
app.register_blueprint(main_bp)
app.register_blueprint(overview_bp)
app.register_blueprint(add_bp, url_prefix='/add')
app.register_blueprint(service_bp, url_prefix='/service')
app.register_blueprint(config_bp, url_prefix='/config')
app.register_blueprint(logs_bp, url_prefix='/logs')
app.register_blueprint(metric_bp, url_prefix='/metrics')
app.register_blueprint(waf_bp, url_prefix='/waf')
app.register_blueprint(runtime_bp, url_prefix='/runtimeapi')
app.register_blueprint(smon_bp, url_prefix='/smon')
app.register_blueprint(checker_bp, url_prefix='/checker')
app.register_blueprint(portscanner_bp, url_prefix='/portscanner')
app.register_blueprint(install_bp, url_prefix='/install')
app.register_blueprint(user_bp, url_prefix='/user')
app.register_blueprint(server_bp, url_prefix='/server')
app.register_blueprint(admin_bp, url_prefix='/admin')
from app import login
from app import jobs

7
app/config.py Normal file
View File

@ -0,0 +1,7 @@
class Configuration(object):
SECRET_KEY = 'very secret salt to protect your Roxy-WI sessions'
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = 'strict'
CACHE_TYPE = 'SimpleCache'
CACHE_DEFAULT_TIMEOUT = 3000
SCHEDULER_API_ENABLED = True

View File

@ -417,6 +417,25 @@ def default_values():
except Exception as e:
print(str(e))
data_source = [
{'name': 'roxy-wi-metrics', 'current_version': '1.0', 'new_version': '0', 'is_roxy': 1, 'desc': ''},
{'name': 'roxy-wi-checker', 'current_version': '1.0', 'new_version': '0', 'is_roxy': 1, 'desc': ''},
{'name': 'roxy-wi-keep_alive', 'current_version': '1.0', 'new_version': '0', 'is_roxy': 1, 'desc': ''},
{'name': 'roxy-wi-portscanner', 'current_version': '1.0', 'new_version': '0', 'is_roxy': 1, 'desc': ''},
{'name': 'roxy-wi-socket', 'current_version': '1.0', 'new_version': '0', 'is_roxy': 1, 'desc': ''},
{'name': 'roxy-wi-prometheus-exporter', 'current_version': '1.0', 'new_version': '0', 'is_roxy': 1, 'desc': ''},
{'name': 'roxy-wi-smon', 'current_version': '1.0', 'new_version': '0', 'is_roxy': 1, 'desc': ''},
{'name': 'prometheus', 'current_version': '1.0', 'new_version': '1.0', 'is_roxy': 0, 'desc': 'Prometheus service'},
{'name': 'grafana-server', 'current_version': '1.0', 'new_version': '1.0', 'is_roxy': 0, 'desc': 'Grafana service'},
{'name': 'fail2ban', 'current_version': '1.0', 'new_version': '1.0', 'is_roxy': 0, 'desc': 'Fail2ban service'},
{'name': 'rabbitmq-server', 'current_version': '1.0', 'new_version': '1.0', 'is_roxy': 0, 'desc': 'Rabbitmq service'},
]
try:
RoxyTool.insert_many(data_source).on_conflict_ignore().execute()
except Exception as e:
print(str(e))
# Needs for insert version in first time
def update_db_v_3_4_5_22():
@ -649,7 +668,7 @@ def update_db_v_6_3_18():
def update_ver():
try:
Version.update(version='7.0.0.0').execute()
Version.update(version='7.0.1.0').execute()
except Exception:
print('Cannot update version')

74
app/jobs.py Normal file
View File

@ -0,0 +1,74 @@
import os
import datetime
from flask_apscheduler import APScheduler
from app import scheduler
import app.modules.db.sql as sql
import app.modules.roxywi.roxy as roxy
import app.modules.tools.common as tools_common
import app.modules.roxy_wi_tools as roxy_wi_tools
get_config = roxy_wi_tools.GetConfigVar()
@scheduler.task('interval', id='update_plan', minutes=55, misfire_grace_time=None)
def update_user_status():
app = scheduler.app
with app.app_context():
print('update plan')
roxy.update_plan()
@scheduler.task('interval', id='check_new_version', days=1, misfire_grace_time=None)
def check_new_version():
app = scheduler.app
with app.app_context():
tools = sql.get_roxy_tools()
for tool in tools:
print(f'update ver for {tool}')
ver = roxy.check_new_version(tool)
sql.update_tool_new_version(tool, ver)
@scheduler.task('interval', id='update_cur_tool_versions', days=1, misfire_grace_time=None)
def update_cur_tool_versions():
app = scheduler.app
with app.app_context():
print('update update_cur_tool_versions')
tools_common.update_cur_tool_versions()
@scheduler.task('interval', id='delete_old_uuid', minutes=60, misfire_grace_time=None)
def delete_old_uuid():
app = scheduler.app
with app.app_context():
print('update delete_old_uuid()')
sql.delete_old_uuid()
@scheduler.task('interval', id='delete_action_history_for_period', minutes=70, misfire_grace_time=None)
def delete_action_history_for_period():
app = scheduler.app
with app.app_context():
print('update delete_action_history_for_period()')
sql.delete_action_history_for_period()
@scheduler.task('interval', id='delete_old_logs', hours=1, misfire_grace_time=None)
def delete_old_logs():
app = scheduler.app
with app.app_context():
print('update delete_old_logs()')
time_storage = sql.get_setting('log_time_storage')
log_path = get_config.get_config_var('main', 'log_path')
try:
time_storage_hours = time_storage * 24
for dirpath, dirnames, filenames in os.walk(log_path):
for file in filenames:
curpath = os.path.join(dirpath, file)
file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath))
if datetime.datetime.now() - file_modified > datetime.timedelta(hours=time_storage_hours):
os.remove(curpath)
except Exception as e:
print(f'error: cannot delete old log files: {e}')

View File

@ -10,8 +10,9 @@ import app.modules.roxy_wi_tools as roxy_wi_tools
@app.before_request
@cache.memoize(3)
def check_login():
if request.endpoint not in ('login_page', 'static', 'main.show_roxywi_version'):
if request.endpoint not in ('login_page', 'static', 'main.show_roxywi_version', 'service.check_service'):
try:
user_params = roxywi_common.get_users_params()
except Exception:
@ -49,7 +50,10 @@ def redirect_to_login(response):
@app.route('/login', methods=['GET', 'POST'])
def login_page():
try:
roxy.update_plan()
except Exception:
pass
next_url = request.args.get('next') or request.form.get('next')
login = request.form.get('login')
password = request.form.get('pass')

32
app/middleware.py Normal file
View File

@ -0,0 +1,32 @@
from functools import wraps
from flask import redirect, url_for, abort, g
import modules.roxywi.auth as roxywi_auth
import modules.roxywi.common as roxywi_common
def check_services(fn):
@wraps(fn)
def decorated_view(*args, **kwargs):
service = kwargs['service']
if service not in ('haproxy', 'nginx', 'apache', 'keepalived'):
abort(405, 'Wrong service')
if not roxywi_auth.is_access_permit_to_service(service):
abort(403, f'You do not have needed permissions to access to {service.title()} service')
return fn(*args, **kwargs)
return decorated_view
def get_user_params(virt=0, disable=0):
def inner_decorator(fn):
@wraps(fn)
def decorated_views(*args, **kwargs):
try:
user_params = roxywi_common.get_users_params(virt=virt, disable=disable, service=kwargs.get('service'))
g.user_params = user_params
except Exception as e:
return redirect(url_for('login_page'))
return fn(*args, **kwargs)
return decorated_views
return inner_decorator

View File

@ -616,6 +616,19 @@ class SmonDnsCheck(BaseModel):
primary_key = False
class RoxyTool(BaseModel):
id = AutoField()
name = CharField()
current_version = CharField()
new_version = CharField()
is_roxy = IntegerField()
desc = CharField()
class Meta:
table_name = 'roxy_tools'
constraints = [SQL('UNIQUE (name)')]
def create_tables():
with conn:
conn.create_tables([User, Server, Role, Telegram, Slack, UUID, Token, ApiToken, Groups, UserGroups, ConfigVersion,
@ -623,4 +636,4 @@ def create_tables():
PortScannerSettings, PortScannerPorts, PortScannerHistory, ServiceSetting, MetricsHttpStatus,
SMON, WafRules, Alerts, GeoipCodes, NginxMetrics, SystemInfo, Services, UserName, GitSetting,
CheckerSetting, ApacheMetrics, WafNginx, ServiceStatus, KeepaliveRestart, PD, SmonHistory,
SmonTcpCheck, SmonHttpCheck, SmonPingCheck, SmonDnsCheck, S3Backup])
SmonTcpCheck, SmonHttpCheck, SmonPingCheck, SmonDnsCheck, S3Backup, RoxyTool])

View File

@ -8,22 +8,14 @@ import modules.db.sql as sql
import modules.roxywi.common as roxywi_common
def check_login(user_uuid, token, **kwargs) -> str:
def check_login(user_uuid, token) -> str:
if user_uuid is None:
return 'login_page'
if user_uuid is not None:
if sql.get_user_name_by_uuid(user_uuid) is None:
return 'login_page'
if kwargs.get('service'):
required_service = str(kwargs.get('service'))
user_id = sql.get_user_id_by_uuid(user_uuid)
user_services = sql.select_user_services(user_id)
if required_service in user_services:
return 'ok'
else:
return 'overview.index'
try:
ip = request.remote_addr
except Exception:
@ -31,9 +23,21 @@ def check_login(user_uuid, token, **kwargs) -> str:
sql.update_last_act_user(user_uuid, token, ip)
return 'ok'
return 'login_page'
def is_access_permit_to_service(service: str) -> bool:
service_id = sql.select_service_id_by_slug(service)
user_uuid = request.cookies.get('uuid')
user_id = sql.get_user_id_by_uuid(user_uuid)
user_services = sql.select_user_services(user_id)
if str(service_id) in user_services:
return True
else:
return False
def is_admin(level=1, **kwargs):
if kwargs.get('role_id'):
role = kwargs.get('role_id')
@ -121,7 +125,7 @@ def do_login(user_uuid: str, user_group: str, user: str, next_url: str):
login_user(user)
resp = make_response(redirect_to)
resp.set_cookie('uuid', user_uuid, secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT"), httponly=True, samesite='Strict')
resp.set_cookie('uuid', user_uuid, secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT"), samesite='Strict')
resp.set_cookie('group', str(user_group), expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT"), samesite='Strict')
try:

View File

@ -29,7 +29,6 @@ def get_user_group(**kwargs) -> str:
user_group = g.name
except Exception as e:
raise Exception(f'error: {e}')
return user_group
@ -210,8 +209,8 @@ def get_users_params(**kwargs):
try:
group_id = int(request.cookies.get('group'))
except Exception:
raise Exception('error: Cannot get user group')
except Exception as e:
raise Exception(f'error: Cannot get user group: {e}')
try:
role = sql.get_user_role_by_uuid(user_uuid, group_id)
@ -220,19 +219,25 @@ def get_users_params(**kwargs):
try:
user_id = sql.get_user_id_by_uuid(user_uuid)
user_services = sql.select_user_services(user_id)
token = sql.get_token(user_uuid)
except Exception:
raise Exception('error: Cannot get user token')
except Exception as e:
raise Exception(f'error: Cannot get user id {e}')
if kwargs.get('virt') and kwargs.get('haproxy'):
try:
user_services = sql.select_user_services(user_id)
except Exception as e:
raise Exception(f'error: Cannot get user services {e}')
try:
token = sql.get_token(user_uuid)
except Exception as e:
raise Exception(f'error: Cannot get user token {e}')
if kwargs.get('virt') and kwargs.get('service') == 'haproxy':
servers = get_dick_permit(virt=1, haproxy=1)
elif kwargs.get('virt'):
servers = get_dick_permit(virt=1)
elif kwargs.get('disable'):
servers = get_dick_permit(disable=0)
elif kwargs.get('haproxy'):
servers = get_dick_permit(haproxy=1)
elif kwargs.get('service'):
servers = get_dick_permit(service=kwargs.get('service'))
else:

View File

@ -9,17 +9,10 @@ import modules.roxywi.common as roxywi_common
get_config_var = roxy_wi_tools.GetConfigVar()
def roxy_wi_log(**kwargs) -> list:
def roxy_wi_log() -> list:
log_path = get_config_var.get_config_var('main', 'log_path')
if kwargs.get('log_id'):
selects = roxywi_common.get_files(log_path, "log")
for key, value in selects:
log_file = f"{kwargs.get('file')}.log"
if log_file == value:
return key
else:
user_group_id = roxywi_common.get_user_group(id=1)
if user_group_id != 1:
user_group = roxywi_common.get_user_group()
group_grep = f'|grep "group: {user_group}"'

View File

@ -5,6 +5,7 @@ from flask import render_template, request
import modules.db.sql as sql
import modules.common.common as common
import modules.roxywi.logs as roxy_logs
import modules.tools.common as tools_common
import modules.roxywi.common as roxywi_common
import modules.server.server as server_mod
import modules.service.common as service_common
@ -214,29 +215,18 @@ def show_services_overview():
except psutil.NoSuchProcess:
pass
cmd = "systemctl is-active roxy-wi-metrics"
metrics_master, stderr = server_mod.subprocess_execute(cmd)
cmd = "systemctl is-active roxy-wi-checker"
checker_master, stderr = server_mod.subprocess_execute(cmd)
cmd = "systemctl is-active roxy-wi-keep_alive"
keep_alive, stderr = server_mod.subprocess_execute(cmd)
cmd = "systemctl is-active roxy-wi-smon"
smon, stderr = server_mod.subprocess_execute(cmd)
cmd = "systemctl is-active roxy-wi-portscanner"
port_scanner, stderr = server_mod.subprocess_execute(cmd)
cmd = "systemctl is-active roxy-wi-socket"
socket, stderr = server_mod.subprocess_execute(cmd)
roxy_tools = sql.get_roxy_tools()
roxy_tools_status = {}
for tool in roxy_tools:
if tool == 'roxy-wi-prometheus-exporter':
continue
status = tools_common.is_tool_active(tool)
roxy_tools_status.setdefault(tool, status)
return render_template(
'ajax/show_services_ovw.html', role=user_params['role'], metrics_master=''.join(metrics_master),
metrics_worker=metrics_worker, checker_master=''.join(checker_master), checker_worker=checker_worker,
keep_alive=''.join(keep_alive), smon=''.join(smon), port_scanner=''.join(port_scanner), grafana=grafana,
socket=''.join(socket), is_checker_worker=is_checker_worker, is_metrics_worker=is_metrics_worker, host=host,
roxy_wi_log_id=roxy_logs.roxy_wi_log(log_id=1, file="roxy-wi-"),
metrics_log_id=roxy_logs.roxy_wi_log(log_id=1, file="metrics"),
checker_log_id=roxy_logs.roxy_wi_log(log_id=1, file="checker"),
keep_alive_log_id=roxy_logs.roxy_wi_log(log_id=1, file="keep_alive"),
socket_log_id=roxy_logs.roxy_wi_log(log_id=1, file="socket"), error=stderr, lang=lang
'ajax/show_services_ovw.html', role=user_params['role'], roxy_tools_status=roxy_tools_status, grafana=grafana,
is_checker_worker=is_checker_worker, is_metrics_worker=is_metrics_worker, host=host,
checker_worker=checker_worker, metrics_worker=metrics_worker, lang=lang
)

View File

@ -57,8 +57,28 @@ def check_new_version(service):
current_ver = check_ver()
proxy = sql.get_setting('proxy')
res = ''
user_name = sql.select_user_name()
proxy_dict = {}
try:
if proxy is not None and proxy != '' and proxy != 'None':
proxy_dict = {"https": proxy, "http": proxy}
response = requests.get(f'https://roxy-wi.org/version/get/{service}', timeout=1, proxies=proxy_dict)
if service == 'roxy-wi':
requests.get(f'https://roxy-wi.org/version/send/{current_ver}', timeout=1, proxies=proxy_dict)
res = response.content.decode(encoding='UTF-8')
except requests.exceptions.RequestException as e:
roxywi_common.logging('Roxy-WI server', f' {e}', roxywi=1)
return res
def update_user_status() -> None:
proxy = sql.get_setting('proxy')
proxy_dict = {}
if proxy is not None and proxy != '' and proxy != 'None':
proxy_dict = {"https": proxy, "http": proxy}
user_name = sql.select_user_name()
retry_strategy = Retry(
total=3,
status_forcelist=[429, 500, 502, 503, 504],
@ -67,26 +87,13 @@ def check_new_version(service):
adapter = HTTPAdapter(max_retries=retry_strategy)
roxy_wi_get_plan = requests.Session()
roxy_wi_get_plan.mount("https://", adapter)
try:
if proxy is not None and proxy != '' and proxy != 'None':
proxy_dict = {"https": proxy, "http": proxy}
response = requests.get(f'https://roxy-wi.org/version/get/{service}', timeout=1, proxies=proxy_dict)
if service == 'roxy-wi':
requests.get(f'https://roxy-wi.org/version/send/{current_ver}', timeout=1, proxies=proxy_dict)
roxy_wi_get_plan = requests.get(f'https://roxy-wi.org/user-name/{user_name}', timeout=1, proxies=proxy_dict)
try:
status = roxy_wi_get_plan.content.decode(encoding='UTF-8')
status = status.split(' ')
sql.update_user_status(status[0], status[1].strip(), status[2].strip())
except Exception:
pass
res = response.content.decode(encoding='UTF-8')
except requests.exceptions.RequestException as e:
roxywi_common.logging('Roxy-WI server', f' {e}', roxywi=1)
return res
except Exception as e:
roxywi_common.logging('Roxy-WI server', f'error: Cannot get user status {e}', roxywi=1)
def action_service(action: str, service: str) -> str:
@ -124,3 +131,5 @@ def update_plan():
sql.insert_user_name(user_name)
except Exception as e:
roxywi_common.logging('Cannot update subscription: ', str(e), roxywi=1)
update_user_status()

View File

@ -55,24 +55,24 @@ def load_checker() -> None:
)
def update_haproxy_settings(setting_id, email, service_alert, backend_alert, maxconn_alert, telegram_id, slack_id, pd_id) -> None:
def update_haproxy_settings(setting_id, email, service_alert, backend_alert, maxconn_alert, telegram_id, slack_id, pd_id) -> str:
if sql.update_haproxy_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, backend_alert,
maxconn_alert, setting_id):
print('ok')
return 'ok'
else:
print('error: Cannot update Checker settings')
return 'error: Cannot update Checker settings'
def update_keepalived_settings(setting_id, email, service_alert, backend_alert, telegram_id, slack_id, pd_id) -> None:
def update_keepalived_settings(setting_id, email, service_alert, backend_alert, telegram_id, slack_id, pd_id) -> str:
if sql.update_keepalived_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, backend_alert,
setting_id):
print('ok')
return 'ok'
else:
print('error: Cannot update Checker settings')
return 'error: Cannot update Checker settings'
def update_service_settings(setting_id, email, service_alert, telegram_id, slack_id, pd_id) -> None:
def update_service_settings(setting_id, email, service_alert, telegram_id, slack_id, pd_id) -> str:
if sql.update_service_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, setting_id):
print('ok')
return 'ok'
else:
print('error: Cannot update Checker settings')
return 'error: Cannot update Checker settings'

View File

@ -1,75 +1,24 @@
import distro
import modules.db.sql as sql
import modules.roxywi.roxy as roxywi_mod
import modules.server.server as server_mod
def get_services_status():
update_cur_tool_versions()
services = []
is_in_docker = roxywi_mod.is_docker()
services_name = {
'roxy-wi-checker': '',
'roxy-wi-keep_alive': '',
'roxy-wi-metrics': '',
'roxy-wi-portscanner': '',
'roxy-wi-smon': '',
'roxy-wi-socket': '',
'roxy-wi-prometheus-exporter': 'Prometheus exporter',
'prometheus': 'Prometheus service',
'grafana-server': 'Grafana service',
'fail2ban': 'Fail2ban service',
'rabbitmq-server': 'Message broker service'
}
services_name = sql.get_all_tools()
for s, v in services_name.items():
if is_in_docker:
cmd = f"sudo supervisorctl status {s}|awk '{{print $2}}'"
else:
cmd = f"systemctl is-active {s}"
status, stderr = server_mod.subprocess_execute(cmd)
if s != 'roxy-wi-keep_alive':
service_name = s.split('_')[0]
if s == 'grafana-server':
service_name = 'grafana'
elif s == 'roxy-wi-keep_alive' and distro.id() == 'ubuntu':
service_name = 'roxy-wi-keep-alive'
else:
service_name = s
if service_name == 'prometheus':
cmd = "prometheus --version 2>&1 |grep prometheus|awk '{print $3}'"
else:
if distro.id() == 'ubuntu':
cmd = f"apt list --installed 2>&1 |grep {service_name}|awk '{{print $2}}'|sed 's/-/./'"
else:
cmd = f"rpm -q {service_name}|awk -F\"{service_name}\" '{{print $2}}' |awk -F\".noa\" '{{print $1}}' |sed 's/-//1' |sed 's/-/./'"
service_ver, stderr = server_mod.subprocess_execute(cmd)
try:
if service_ver[0] == 'command' or service_ver[0] == 'prometheus:':
service_ver[0] = ''
except Exception:
pass
try:
services.append([s, status, v, service_ver[0]])
except Exception:
services.append([s, status, v, ''])
status = is_tool_active(s)
services.append([s, status, v])
return services
def update_roxy_wi(service: str) -> str:
restart_service = ''
services = ['roxy-wi-checker',
'roxy-wi',
'roxy-wi-keep_alive',
'roxy-wi-smon',
'roxy-wi-metrics',
'roxy-wi-portscanner',
'roxy-wi-socket',
'roxy-wi-prometheus-exporter']
services = sql.get_roxy_tools()
if service not in services:
raise Exception(f'error: {service} is not part of Roxy-WI')
@ -91,8 +40,49 @@ def update_roxy_wi(service: str) -> str:
cmd = f'sudo -S yum -y install {service} {restart_service}'
output, stderr = server_mod.subprocess_execute(cmd)
update_cur_tool_version(service)
if stderr != '':
return str(stderr)
else:
return str(output)
def is_tool_active(tool_name: str) -> str:
is_in_docker = roxywi_mod.is_docker()
if is_in_docker:
cmd = f"sudo supervisorctl status {tool_name}|awk '{{print $2}}'"
else:
cmd = f"systemctl is-active {tool_name}"
status, stderr = server_mod.subprocess_execute(cmd)
return status[0]
def update_cur_tool_versions() -> None:
tools = sql.get_all_tools()
for s, v in tools.items():
update_cur_tool_version(s)
def update_cur_tool_version(tool_name: str) -> None:
correct_name = tool_name
if tool_name == 'grafana-server':
correct_name = 'grafana'
if tool_name == 'prometheus':
cmd = "prometheus --version 2>&1 |grep prometheus|awk '{print $3}'"
else:
if distro.id() == 'ubuntu':
cmd = f"apt list --installed 2>&1 |grep {correct_name}|awk '{{print $2}}'|sed 's/-/./'"
else:
cmd = f"rpm -q {correct_name}|awk -F\"{correct_name}\" '{{print $2}}' |awk -F\".noa\" '{{print $1}}' |sed 's/-//1' |sed 's/-/./'"
service_ver, stderr = server_mod.subprocess_execute(cmd)
if service_ver == 'command' or service_ver == 'prometheus:':
service_ver = ''
sql.update_tool_cur_version(tool_name, service_ver[0])
def get_cur_tool_version(tool_name: str) -> str:
return sql.get_tool_cur_version(tool_name)

View File

@ -1,10 +1,11 @@
import os
from flask import render_template, request, jsonify, redirect, url_for
from flask import render_template, request, jsonify, redirect, url_for, g
from flask_login import login_required
from app.routes.add import bp
import app.modules.db.sql as sql
from middleware import check_services, get_user_params
import app.modules.config.add as add_mod
import app.modules.common.common as common
import app.modules.roxywi.auth as roxywi_auth
@ -25,18 +26,12 @@ def before_request():
@bp.route('/<service>')
@check_services
@get_user_params()
def add(service):
roxywi_auth.page_for_admin(level=3)
if service not in ('haproxy', 'nginx'):
raise Exception('error: wrong service')
try:
user_params = roxywi_common.get_users_params(service=service)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
add = request.form.get('add')
conf_add = request.form.get('conf')
@ -61,14 +56,14 @@ def add(service):
maps = roxywi_common.get_files(folder=f'{lib_path}/maps/{user_group}', file_format="map")
return render_template(
'add.html', h2=1, role=user_params['role'], user=user, selects=user_params['servers'], add=add,
'add.html', h2=1, role=user_params['role'], user=user_params['user'], selects=user_params['servers'], add=add,
conf_add=conf_add, group=user_group, options=sql.select_options(), saved_servers=sql.select_saved_servers(),
white_lists=white_lists, black_lists=black_lists, user_services=user_params['user_services'],
token=user_params['token'], lang=user_params['lang'], maps=maps
)
elif service == 'nginx':
return render_template(
'add_nginx.html', h2=1, role=user_params['role'], user=user, selects=user_params['servers'], add=add,
'add_nginx.html', h2=1, role=user_params['role'], user=user_params['user'], selects=user_params['servers'], add=add,
conf_add=conf_add, user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang']
)
else:

View File

@ -2,11 +2,13 @@ import os
import pytz
import distro
from flask import render_template, request, redirect, url_for
from flask import render_template, request, redirect, url_for, g
from flask_login import login_required
from app import scheduler
from app.routes.admin import bp
import app.modules.db.sql as sql
from middleware import get_user_params
import app.modules.common.common as common
import app.modules.roxywi.roxy as roxy
import app.modules.roxywi.auth as roxywi_auth
@ -23,15 +25,11 @@ def before_request():
@bp.route('')
@get_user_params()
def admin():
roxywi_auth.page_for_admin()
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
users = sql.select_users()
settings = sql.get_setting('', all=1)
ldap_enable = sql.get_setting('ldap_enable')
@ -49,7 +47,7 @@ def admin():
grafana = grafana[0]
return render_template(
'admin.html', h2=1, role=user_params['role'], user=user, users=users, groups=sql.select_groups(),
'admin.html', role=user_params['role'], user=user_params['user'], users=users, groups=sql.select_groups(),
servers=sql.select_servers(full=1), masters=masters, sshs=sql.select_ssh(), roles=sql.select_roles(),
settings=settings, backups=backups, s3_backups=s3_backups, services=services, timezones=pytz.all_timezones,
page="users.py", user_services=user_params['user_services'], ldap_enable=ldap_enable, gits=gits, guide_me=1,
@ -93,23 +91,21 @@ def action_tools(service, action):
def update_roxywi():
roxywi_auth.page_for_admin()
versions = roxy.versions()
checker_ver = roxy.check_new_version('checker')
smon_ver = roxy.check_new_version('smon')
metrics_ver = roxy.check_new_version('metrics')
keep_ver = roxy.check_new_version('keep_alive')
portscanner_ver = roxy.check_new_version('portscanner')
socket_ver = roxy.check_new_version('socket')
prometheus_exp_ver = roxy.check_new_version('prometheus-exporter')
services = tools_common.get_services_status()
lang = roxywi_common.get_user_lang_for_flask()
return render_template(
'ajax/load_updateroxywi.html', services=services, versions=versions, checker_ver=checker_ver, smon_ver=smon_ver,
metrics_ver=metrics_ver, portscanner_ver=portscanner_ver, socket_ver=socket_ver, prometheus_exp_ver=prometheus_exp_ver,
keep_ver=keep_ver, lang=lang
'ajax/load_updateroxywi.html', services=services, versions=versions, lang=lang
)
@bp.route('/update/check')
def check_update():
roxywi_auth.page_for_admin()
scheduler.run_job('check_new_version')
return 'ok'
@bp.route('/openvpn')
def load_openvpn():
roxywi_auth.page_for_admin()

View File

@ -1,7 +1,8 @@
from flask import render_template, request, redirect, url_for
from flask import render_template, request, redirect, url_for, g
from flask_login import login_required
from app.routes.checker import bp
from middleware import get_user_params
import app.modules.db.sql as sql
import app.modules.common.common as common
import app.modules.roxywi.common as roxywi_common
@ -18,17 +19,13 @@ def before_request():
@bp.route('/settings')
@get_user_params()
def checker_settings():
roxywi_common.check_user_group_for_flask()
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
return render_template(
'checker.html', h2=1, role=user_params['role'], user=user, lang=user_params['lang'],
'checker.html', role=user_params['role'], user=user_params['user'], lang=user_params['lang'],
token=user_params['token'], user_services=user_params['user_services']
)
@ -39,19 +36,20 @@ def update_settings():
setting_id = int(request.form.get('setting_id'))
email = int(request.form.get('email'))
service_alert = int(request.form.get('server'))
backend_alert = int(request.form.get('backend'))
telegram_id = int(request.form.get('telegram_id'))
slack_id = int(request.form.get('slack_id'))
pd_id = int(request.form.get('pd_id'))
if service == 'haproxy':
maxconn_alert = int(request.form.get('maxconn'))
backend_alert = int(request.form.get('backend'))
return checker_mod.update_haproxy_settings(
setting_id, email, service_alert, backend_alert, maxconn_alert, telegram_id, slack_id, pd_id
)
elif service in ('nginx', 'apache'):
return checker_mod.update_service_settings(setting_id, email, service_alert, telegram_id, slack_id, pd_id)
else:
backend_alert = int(request.form.get('backend'))
return checker_mod.update_keepalived_settings(setting_id, email, service_alert, backend_alert, telegram_id, slack_id, pd_id)
@ -61,6 +59,7 @@ def load_checker():
@bp.route('/history')
@get_user_params()
def checker_history():
roxywi_common.check_user_group_for_flask()
@ -68,15 +67,10 @@ def checker_history():
smon_status, stderr = smon_mod.return_smon_status()
smon = sql.alerts_history('Checker', user_group)
user_subscription = roxywi_common.return_user_subscription()
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
return render_template(
'smon/checker_history.html', h2=1, autorefresh=0, role=user_params['role'], user=user, smon=smon,
'smon/checker_history.html', autorefresh=0, role=user_params['role'], user=user_params['user'], smon=smon,
lang=user_params['lang'], user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
token=user_params['token'], smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services']
)

View File

@ -1,11 +1,11 @@
import os
from functools import wraps
from flask import render_template, request, redirect, url_for, abort
from flask import render_template, request, redirect, url_for, g
from flask_login import login_required
from app.routes.config import bp
import app.modules.db.sql as sql
from middleware import check_services, get_user_params
import app.modules.common.common as common
import app.modules.roxy_wi_tools as roxy_wi_tools
import app.modules.roxywi.auth as roxywi_auth
@ -20,16 +20,6 @@ time_zone = sql.get_setting('time_zone')
get_date = roxy_wi_tools.GetDate(time_zone)
def check_services(fn):
@wraps(fn)
def decorated_view(*args, **kwargs):
service = kwargs['service']
if service not in ('haproxy', 'nginx', 'apache', 'keepalived'):
abort(400, 'bad service')
return fn(*args, **kwargs)
return decorated_view
@bp.before_request
@login_required
def before_request():
@ -84,6 +74,7 @@ def find_in_config(service):
@bp.route('/<service>/<serv>/<edit>/<config_file_name>', defaults={'new': None}, methods=['GET', 'POST'])
@bp.route('/<service>/<serv>/<edit>/<config_file_name>/<new>', methods=['GET', 'POST'])
@check_services
@get_user_params(0)
def config(service, serv, edit, config_file_name, new):
config_read = ""
cfg = ""
@ -93,21 +84,8 @@ def config(service, serv, edit, config_file_name, new):
is_restart = ''
is_serv_protected = ''
new_config = new
try:
user_params = roxywi_common.get_users_params(service=service)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
user_params = g.user_params
service_desc = sql.select_service(service)
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
else:
return redirect(url_for('index'))
if serv and config_file_name:
cfg = config_mod.return_cfg(service, serv, config_file_name)
@ -121,7 +99,7 @@ def config(service, serv, edit, config_file_name, new):
try:
error = config_mod.get_config(serv, cfg, service=service, config_file_name=config_file_name)
except Exception as e:
return str(e), 200
return f'error: Cannot download config: {e}'
try:
roxywi_common.logging(serv, f" {service.title()} config has been opened")
@ -141,7 +119,7 @@ def config(service, serv, edit, config_file_name, new):
config_read = ' '
return render_template(
'config.html', role=user_params['role'], user=user, select_id="serv", serv=serv, aftersave=aftersave,
'config.html', role=user_params['role'], user=user_params['user'], select_id="serv", serv=serv, aftersave=aftersave,
config=config_read, cfg=cfg, selects=user_params['servers'], stderr=stderr, error=error, service=service,
is_restart=is_restart, user_services=user_params['user_services'], config_file_name=config_file_name,
is_serv_protected=is_serv_protected, token=user_params['token'], lang=user_params['lang'], service_desc=service_desc
@ -151,19 +129,7 @@ def config(service, serv, edit, config_file_name, new):
@bp.route('/<service>/<server_ip>/save', methods=['POST'])
@check_services
def save_config(service, server_ip):
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
roxywi_common.check_is_server_in_group(server_ip)
service_desc = sql.select_service(service)
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
config_file = request.form.get('config')
oldcfg = request.form.get('oldconfig')
save = request.form.get('save')
@ -172,7 +138,7 @@ def save_config(service, server_ip):
try:
cfg = config_mod.return_cfg(service, server_ip, config_file_name)
except Exception as e:
return f'error: {e}', 200
return f'error: Cannot get config {e}'
try:
with open(cfg, "a") as conf:
@ -201,20 +167,13 @@ def save_config(service, server_ip):
@bp.route('/versions/<service>', defaults={'server_ip': None}, methods=['GET', 'POST'])
@bp.route('/versions/<service>/<server_ip>', methods=['GET', 'POST'])
@check_services
@get_user_params(disable=1)
def versions(service, server_ip):
roxywi_auth.page_for_admin(level=3)
aftersave = ''
file = set()
stderr = ''
try:
user_params = roxywi_common.get_users_params(disable=1)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
if service not in ('haproxy', 'nginx', 'keepalived', 'apache'):
return redirect(url_for('index'))
user_params = g.user_params
if service in ('haproxy', 'keepalived'):
conf_format = 'cfg'
@ -246,7 +205,7 @@ def versions(service, server_ip):
stderr = "Error: %s - %s." % (e.filename, e.strerror)
return render_template(
'delver.html', role=user_params['role'], user=user, select_id="serv", serv=server_ip, aftersave=aftersave,
'delver.html', role=user_params['role'], user=user_params['user'], select_id="serv", serv=server_ip, aftersave=aftersave,
selects=user_params['servers'], file=file, service=service, user_services=user_params['user_services'],
token=user_params['token'], lang=user_params['lang'], stderr=stderr
)
@ -265,23 +224,11 @@ def list_of_version(service):
@bp.route('/versions/<service>/<server_ip>/<configver>', defaults={'save': None}, methods=['GET', 'POST'])
@bp.route('/versions/<service>/<server_ip>/<configver>/save', defaults={'save': 1}, methods=['GET', 'POST'])
@check_services
@get_user_params(disable=1)
def show_version(service, server_ip, configver, save):
roxywi_auth.page_for_admin(level=3)
try:
user_params = roxywi_common.get_users_params(disable=1)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
if service not in ('haproxy', 'nginx', 'keepalived', 'apache'):
return redirect(url_for('index'))
user_params = g.user_params
service_desc = sql.select_service(service)
if not roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id):
return redirect(url_for('index'))
configs_dir = get_config.get_config_var('configs', f'{service_desc.service}_save_configs_dir')
configver = configs_dir + configver
servers = roxywi_common.get_dick_permit(service=service_desc.slug)
@ -309,25 +256,16 @@ def show_version(service, server_ip, configver, save):
stderr = config_mod.master_slave_upload_and_restart(server_ip, configver, save_action, service)
return render_template(
'configver.html', role=user_params['role'], user=user, select_id="serv", serv=server_ip, aftersave=aftersave,
'configver.html', role=user_params['role'], user=user_params['user'], select_id="serv", serv=server_ip, aftersave=aftersave,
selects=servers, stderr=stderr, save=save, configver=configver, service=service,
user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang']
)
@bp.route('/section/haproxy/<server_ip>')
@get_user_params()
def haproxy_section(server_ip):
try:
user_params = roxywi_common.get_users_params(service=1)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
user_params = g.user_params
is_restart = 0
hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
cfg = f"{hap_configs_dir}{server_ip}-{get_date.return_date('config')}.cfg"
@ -335,30 +273,16 @@ def haproxy_section(server_ip):
sections = section_mod.get_sections(cfg)
return render_template(
'sections.html', role=user_params['role'], user=user, serv=server_ip, selects=user_params['servers'],
'sections.html', role=user_params['role'], user=user_params['user'], serv=server_ip, selects=user_params['servers'],
sections=sections, error=error, token=user_params['token'], lang=user_params['lang'], is_restart=is_restart, config='',
user_services=user_params['user_services']
)
@bp.route('/section/haproxy/<server_ip>/<section>')
@get_user_params()
def haproxy_section_show(server_ip, section):
try:
user_params = roxywi_common.get_users_params(service=1)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
try:
roxywi_common.logging(server_ip, f"A section {section} has been opened")
except Exception:
pass
user_params = g.user_params
hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
cfg = f"{hap_configs_dir}{server_ip}-{get_date.return_date('config')}.cfg"
error = config_mod.get_config(server_ip, cfg)
@ -369,8 +293,13 @@ def haproxy_section_show(server_ip, section):
os.system(f"/bin/mv {cfg} {cfg}.old")
try:
roxywi_common.logging(server_ip, f"A section {section} has been opened")
except Exception:
pass
return render_template(
'sections.html', role=user_params['role'], user=user, serv=server_ip, selects=user_params['servers'],
'sections.html', role=user_params['role'], user=user_params['user'], serv=server_ip, selects=user_params['servers'],
error=error, sections=sections, cfg=cfg, token=user_params['token'], lang=user_params['lang'],
is_restart=is_restart, config=config_read, start_line=start_line, end_line=end_line, section=section,
user_services=user_params['user_services']
@ -379,17 +308,6 @@ def haproxy_section_show(server_ip, section):
@bp.route('/section/haproxy/<server_ip>/save', methods=['POST'])
def haproxy_section_save(server_ip):
try:
user_params = roxywi_common.get_users_params(service=1)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
cfg = f"{hap_configs_dir}{server_ip}-{get_date.return_date('config')}.cfg"
config_file = request.form.get('config')
@ -421,6 +339,7 @@ def haproxy_section_save(server_ip):
@bp.route('/compare/<service>/<serv>')
@bp.route('/map/<service>/<serv>')
@get_user_params()
def show_compare_config(service, serv):
config_read = ""
cfg = ""
@ -430,24 +349,11 @@ def show_compare_config(service, serv):
is_restart = ''
is_serv_protected = ''
config_file_name = ''
try:
user_params = roxywi_common.get_users_params(service=service)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
user_params = g.user_params
service_desc = sql.select_service(service)
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
else:
return redirect(url_for('index'))
return render_template(
'config.html', role=user_params['role'], user=user, select_id="serv", serv=serv, aftersave=aftersave,
'config.html', role=user_params['role'], user=user_params['user'], select_id="serv", serv=serv, aftersave=aftersave,
config=config_read, cfg=cfg, selects=user_params['servers'], stderr=stderr, error=error, service=service,
is_restart=is_restart, user_services=user_params['user_services'], config_file_name=config_file_name,
is_serv_protected=is_serv_protected, token=user_params['token'], lang=user_params['lang'],
@ -461,7 +367,7 @@ def show_configs_for_compare(service, server_ip):
return config_mod.show_compare_config(server_ip, service)
@bp.route('/compare/<service>/<server_ip>/show', methods=['POST'])
@bp.post('/compare/<service>/<server_ip>/show')
@check_services
def show_compare(service, server_ip):
left = common.checkAjaxInput(request.form.get('left'))

View File

@ -1,7 +1,8 @@
from flask import render_template, request, redirect, url_for
from flask import render_template, request, redirect, url_for, g, abort
from flask_login import login_required
from app.routes.install import bp
from middleware import get_user_params
import app.modules.db.sql as sql
import app.modules.common.common as common
import app.modules.roxywi.auth as roxywi_auth
@ -20,44 +21,34 @@ def before_request():
@bp.route('')
@get_user_params()
def install_monitoring():
roxywi_auth.page_for_admin(level=2)
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
is_needed_tool = common.is_tool('ansible')
geoip_country_codes = sql.select_geoip_country_codes()
return render_template(
'install.html', h2=1, role=user_params['role'], user=user, servers=user_params['servers'],
'install.html', role=user_params['role'], user=user_params['user'], servers=user_params['servers'],
user_services=user_params['user_services'], lang=user_params['lang'], geoip_country_codes=geoip_country_codes,
is_needed_tool=is_needed_tool, token=user_params['token']
)
@bp.route('/ha')
@get_user_params()
def ha():
if not roxywi_auth.is_access_permit_to_service('keepalived'):
abort(403, f'You do not have needed permissions to access to Keepalived service')
roxywi_auth.page_for_admin(level=2)
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
is_needed_tool = common.is_tool('ansible')
user_subscription = roxywi_common.return_user_subscription()
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=3)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
return render_template(
'ha.html', h2=1, role=user_params['role'], user=user, selects=user_params['servers'],
'ha.html', h2=1, role=user_params['role'], user=user_params['user'], selects=user_params['servers'],
user_services=user_params['user_services'], user_status=user_subscription['user_status'], lang=user_params['lang'],
user_plan=user_subscription['user_plan'], is_needed_tool=is_needed_tool, token=user_params['token']
)

View File

@ -1,10 +1,8 @@
import os
import datetime
from flask import render_template, request, redirect, url_for
from flask import render_template, request, redirect, url_for, g
from flask_login import login_required
from app.routes.logs import bp
from middleware import check_services, get_user_params
import app.modules.db.sql as sql
import app.modules.common.common as common
import app.modules.roxywi.auth as roxywi_auth
@ -24,6 +22,7 @@ def before_request():
@bp.route('/internal')
@get_user_params()
def logs_internal():
log_type = request.args.get('type')
@ -32,26 +31,8 @@ def logs_internal():
else:
roxywi_auth.page_for_admin()
try:
user_params = roxywi_common.get_users_params(virt=1, haproxy=1)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
time_storage = sql.get_setting('log_time_storage')
user_params = g.user_params
log_path = get_config.get_config_var('main', 'log_path')
try:
time_storage_hours = time_storage * 24
for dirpath, dirnames, filenames in os.walk(log_path):
for file in filenames:
curpath = os.path.join(dirpath, file)
file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath))
if datetime.datetime.now() - file_modified > datetime.timedelta(hours=time_storage_hours):
os.remove(curpath)
except Exception as e:
print(f'error: cannot delete old log files: {e}')
selects = roxywi_common.get_files(log_path, file_format="log")
if log_type is None:
@ -60,7 +41,7 @@ def logs_internal():
selects.append(['roxy-wi.access.log', 'access.log'])
return render_template(
'logs_internal.html', autorefresh=1, role=user_params['role'], user=user,
'logs_internal.html', autorefresh=1, role=user_params['role'], user=user_params['user'],
user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang'],
selects=selects, serv='viewlogs'
)
@ -68,7 +49,10 @@ def logs_internal():
@bp.route('/<service>', defaults={'waf': None})
@bp.route('/<service>/<waf>')
@check_services
@get_user_params()
def logs(service, waf):
user_params = g.user_params
serv = request.args.get('serv')
rows = request.args.get('rows')
grep = request.args.get('grep')
@ -84,40 +68,25 @@ def logs(service, waf):
if grep is None:
grep = ''
try:
user_params = roxywi_common.get_users_params(virt=1, haproxy=1)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
if service in ('haproxy', 'nginx', 'keepalived', 'apache') and not waf:
service_desc = sql.select_service(service)
service_name = service_desc.service
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
servers = roxywi_common.get_dick_permit(service=service_desc.slug)
elif waf:
service_name = 'WAF'
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
servers = roxywi_common.get_dick_permit(haproxy=1)
else:
return redirect(url_for('index'))
return render_template(
'logs.html', autorefresh=1, role=user_params['role'], user=user, select_id='serv', rows=rows,
'logs.html', autorefresh=1, role=user_params['role'], user=user_params['user'], select_id='serv', rows=rows,
remote_file=log_file, selects=servers, waf=waf, service=service, user_services=user_params['user_services'],
token=user_params['token'], lang=user_params['lang'], service_name=service_name, grep=grep, serv=serv
)
@bp.route('/<service>/<serv>', methods=['GET', 'POST'])
@check_services
def show_remote_log_files(service, serv):
service = common.checkAjaxInput(service)
serv = common.checkAjaxInput(serv)
@ -136,6 +105,7 @@ def show_remote_log_files(service, serv):
@bp.route('/<service>/<serv>/<rows>', defaults={'waf': '0'}, methods=['GET', 'POST'])
@bp.route('/<service>/waf/<serv>/<rows>', defaults={'waf': '1'}, methods=['GET', 'POST'])
@check_services
def show_logs(service, serv, rows, waf):
if request.method == 'GET':
grep = request.args.get('grep')

View File

@ -2,7 +2,7 @@ import os
import sys
import pytz
from flask import render_template, request, redirect, url_for, session
from flask import render_template, request, redirect, url_for, session, g, abort
from flask_login import login_required
sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
@ -11,6 +11,7 @@ from app import app, cache
from app.routes.main import bp
import modules.db.sql as sql
from modules.db.db_model import conn
from middleware import check_services, get_user_params
import modules.common.common as common
import modules.roxywi.roxy as roxy
import modules.roxywi.auth as roxywi_auth
@ -20,14 +21,44 @@ import modules.service.common as service_common
import modules.service.haproxy as service_haproxy
@app.errorhandler(403)
@get_user_params()
def page_is_forbidden(e):
user_params = g.user_params
return render_template(
'error.html', user=user_params['user'], role=user_params['role'], user_services=user_params['user_services'],
title=e, e=e
), 403
@app.errorhandler(404)
@get_user_params()
def page_not_found(e):
return render_template('404.html'), 404
user_params = g.user_params
return render_template(
'error.html', user=user_params['user'], role=user_params['role'], user_services=user_params['user_services'],
title=e, e=e
), 404
@app.errorhandler(405)
@get_user_params()
def method_not_allowed(e):
user_params = g.user_params
return render_template(
'error.html', user=user_params['user'], role=user_params['role'], user_services=user_params['user_services'],
title=e, e=e
), 405
@app.errorhandler(500)
def page_not_found(e):
return render_template('500.html', e=e), 500
@get_user_params()
def internal_error(e):
user_params = g.user_params
return render_template(
'error.html', user=user_params['user'], role=user_params['role'], user_services=user_params['user_services'],
title=e, e=e
), 500
@app.before_request
@ -44,12 +75,11 @@ def _db_close(exc):
@bp.route('/stats/<service>/', defaults={'serv': None})
@bp.route('/stats/<service>/<serv>')
@login_required
@check_services
@get_user_params()
def stats(service, serv):
try:
user_params = roxywi_common.get_users_params(virt=1, haproxy=1)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
service_desc = sql.select_service(service)
try:
if serv is None:
@ -60,19 +90,9 @@ def stats(service, serv):
except Exception:
pass
if service in ('haproxy', 'nginx', 'apache'):
service_desc = sql.select_service(service)
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
servers = roxywi_common.get_dick_permit(service=service_desc.slug)
else:
return redirect(url_for('overview.index'))
return render_template(
'statsview.html', autorefresh=1, role=user_params['role'], user=user, selects=servers, serv=serv,
'statsview.html', autorefresh=1, role=user_params['role'], user=user_params['user'], selects=servers, serv=serv,
service=service, user_services=user_params['user_services'], token=user_params['token'],
select_id="serv", lang=user_params['lang'], service_desc=service_desc
)
@ -80,6 +100,7 @@ def stats(service, serv):
@bp.route('/stats/view/<service>/<server_ip>')
@login_required
@check_services
def show_stats(service, server_ip):
server_ip = common.is_ip_or_dns(server_ip)
@ -91,15 +112,12 @@ def show_stats(service, server_ip):
@bp.route('/nettools')
@login_required
@get_user_params(1)
def nettools():
try:
user_params = roxywi_common.get_users_params(virt=1)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
import time
user_params = g.user_params
return render_template(
'nettools.html', autorefresh=0, role=user_params['role'], user=user, servers=user_params['servers'],
'nettools.html', autorefresh=0, role=user_params['role'], user=user_params['user'], servers=user_params['servers'],
user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang']
)
@ -127,20 +145,17 @@ def nettols_check(check):
@bp.route('/history/<service>/<server_ip>')
@login_required
@get_user_params()
def service_history(service, server_ip):
users = sql.select_users()
server_ip = common.checkAjaxInput(server_ip)
user_subscription = roxywi_common.return_user_subscription()
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
service_desc = sql.select_service(service)
if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id):
if not roxywi_auth.is_access_permit_to_service(service_desc.slug):
abort(403, f'You do not have needed permissions to access to {service_desc.slug.title()} service')
server_id = sql.select_server_id_by_ip(server_ip)
history = sql.select_action_history_by_server_id_and_service(server_id, service_desc.service)
elif service == 'server':
@ -151,7 +166,7 @@ def service_history(service, server_ip):
history = sql.select_action_history_by_user_id(server_ip)
return render_template(
'history.html', role=user_params['role'], user=user, users=users, serv=server_ip, service=service,
'history.html', role=user_params['role'], user=user_params['user'], users=users, serv=server_ip, service=service,
history=history, user_services=user_params['user_services'], token=user_params['token'],
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], lang=user_params['lang']
)
@ -159,15 +174,11 @@ def service_history(service, server_ip):
@bp.route('/servers')
@login_required
@get_user_params()
def servers():
roxywi_auth.page_for_admin(level=2)
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
ldap_enable = sql.get_setting('ldap_enable')
user_group = roxywi_common.get_user_group(id=1)
settings = sql.get_setting('', all=1)
@ -188,7 +199,7 @@ def servers():
return render_template(
'servers.html',
h2=1, title=title, role=user_params['role'], user=user, users=sql.select_users(group=user_group),
h2=1, title=title, role=user_params['role'], user=user_params['user'], users=sql.select_users(group=user_group),
groups=sql.select_groups(), servers=servers, roles=sql.select_roles(), sshs=sql.select_ssh(group=user_group),
masters=masters, group=user_group, services=services, timezones=pytz.all_timezones, guide_me=1,
token=user_params['token'], settings=settings, backups=backups, s3_backups=s3_backups, page="servers.py",

View File

@ -1,9 +1,10 @@
import distro
from flask import render_template, request, jsonify, redirect, url_for
from flask import render_template, request, jsonify, redirect, url_for, g
from flask_login import login_required
from app.routes.metric import bp
import app.modules.db.sql as sql
from middleware import check_services, get_user_params
import app.modules.common.common as common
import app.modules.server.server as server_mod
import app.modules.roxywi.metrics as metric
@ -19,21 +20,14 @@ def before_request():
@bp.route('/<service>')
@check_services
@get_user_params()
def metrics(service):
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
service_desc = sql.select_service(service)
roxywi_common.check_user_group_for_flask()
servers = ''
services = '0'
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
try:
if distro.id() == 'ubuntu':
@ -63,7 +57,7 @@ def metrics(service):
user_subscription = roxywi_common.return_user_subscription()
return render_template(
'metrics.html', autorefresh=1, role=user_params['role'], user=user, servers=servers,
'metrics.html', autorefresh=1, role=user_params['role'], user=user_params['user'], servers=servers,
services=services, user_services=user_params['user_services'], service=service,
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
token=user_params['token'], lang=user_params['lang'], service_desc=service_desc
@ -85,6 +79,7 @@ def metrics_ram():
@bp.route('/<service>/table-metrics')
@check_services
def table_metrics(service):
roxywi_common.check_user_group_for_flask()
lang = roxywi_common.get_user_lang_for_flask()
@ -98,7 +93,8 @@ def table_metrics(service):
return render_template('ajax/table_metrics.html', table_stat=metrics, service=service, lang=lang)
@bp.route('/<service>/<server_ip>', methods=['POST'])
@bp.post('/<service>/<server_ip>')
@check_services
def show_metric(service, server_ip):
server_ip = common.is_ip_or_dns(server_ip)
hostname = sql.get_hostname_by_server_ip(server_ip)
@ -112,7 +108,8 @@ def show_metric(service, server_ip):
return 'error: Wrong service'
@bp.route('/<service>/<server_ip>/http', methods=['POST'])
@bp.post('/<service>/<server_ip>/http')
@check_services
def show_http_metric(service, server_ip):
server_ip = common.is_ip_or_dns(server_ip)
hostname = sql.get_hostname_by_server_ip(server_ip)

View File

@ -1,8 +1,9 @@
from flask import render_template, redirect, url_for
from flask import render_template, redirect, url_for, g
from flask_login import login_required
from app import cache
from app.routes.overview import bp
from middleware import get_user_params
import app.modules.db.sql as sql
import app.modules.roxywi.logs as roxy_logs
import app.modules.roxywi.common as roxywi_common
@ -18,17 +19,13 @@ def before_request():
@bp.route('/')
@bp.route('/overview')
@get_user_params()
def index():
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
groups = sql.select_groups()
return render_template(
'ovw.html', autorefresh=1, role=user_params['role'], user=user, groups=groups, roles=sql.select_roles(),
servers=user_params['servers'], user_services=user_params['user_services'], roxy_wi_log=roxy_logs.roxy_wi_log(),
'ovw.html', autorefresh=1, role=user_params['role'], user=user_params['user'], roles=sql.select_roles(),
servers=user_params['servers'], user_services=user_params['user_services'], groups=groups,
token=user_params['token'], guide_me=1, lang=user_params['lang']
)
@ -52,3 +49,10 @@ def overview_users():
@cache.cached()
def overview_sub():
return roxy_overview.show_sub_ovw()
@bp.route('/overview/logs')
@get_user_params()
def overview_logs():
user_params = g.user_params
return render_template('ajax/ovw_log.html', role=user_params['role'], lang=user_params['lang'], roxy_wi_log=roxy_logs.roxy_wi_log())

View File

@ -1,7 +1,8 @@
from flask import render_template, request, redirect, url_for
from flask import render_template, request, redirect, url_for, g
from flask_login import login_required
from app.routes.portscanner import bp
from middleware import get_user_params
import app.modules.db.sql as sql
import app.modules.common.common as common
import app.modules.server.server as server_mod
@ -16,13 +17,9 @@ def before_request():
@bp.route('')
@get_user_params(virt=1)
def portscanner():
try:
user_params = roxywi_common.get_users_params(virt=1)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
user_group = roxywi_common.get_user_group(id=1)
port_scanner_settings = sql.select_port_scanner_settings(user_group)
@ -41,7 +38,7 @@ def portscanner():
user_subscription = roxywi_common.return_user_subscription()
return render_template(
'portscanner.html', autorefresh=0, role=user_params['role'], user=user, servers=user_params['servers'],
'portscanner.html', autorefresh=0, role=user_params['role'], user=user_params['user'], servers=user_params['servers'],
port_scanner_settings=port_scanner_settings, count_ports=count_ports, port_scanner=''.join(port_scanner),
port_scanner_stderr=port_scanner_stderr, user_services=user_params['user_services'], user_status=user_subscription['user_status'],
user_plan=user_subscription['user_plan'], token=user_params['token'], lang=user_params['lang']
@ -49,18 +46,14 @@ def portscanner():
@bp.route('/history/<server_ip>')
@get_user_params()
def portscanner_history(server_ip):
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
history = sql.select_port_scanner_history(server_ip)
user_subscription = roxywi_common.return_user_subscription()
return render_template(
'include/port_scan_history.html', h2=1, autorefresh=0, role=user_params['role'], user=user, history=history,
'include/port_scan_history.html', h2=1, autorefresh=0, role=user_params['role'], user=user_params['user'], history=history,
servers=user_params['servers'], user_services=user_params['user_services'], token=user_params['token'],
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], lang=user_params['lang']
)

View File

@ -1,7 +1,8 @@
from flask import render_template, request, redirect, url_for
from flask import render_template, request, redirect, url_for, g
from flask_login import login_required
from app.routes.runtime import bp
from middleware import get_user_params
import app.modules.common.common as common
import app.modules.roxywi.common as roxywi_common
import app.modules.config.runtime as runtime
@ -16,16 +17,13 @@ def before_request():
@bp.route('')
@get_user_params()
def runtimeapi():
try:
user_params = roxywi_common.get_users_params(haproxy=1)
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
servbackend = ""
return render_template(
'runtimeapi.html', h2=1, title="RunTime API", role=user_params['role'], user=user, select_id="serv",
'runtimeapi.html', title="RunTime API", role=user_params['role'], user=user_params['user'], select_id="serv",
selects=user_params['servers'], token=user_params['token'], user_services=user_params['user_services'],
servbackend=servbackend, lang=user_params['lang']
)

View File

@ -1,12 +1,11 @@
from functools import wraps
import distro
from flask import render_template, request, redirect, url_for, abort
from flask import render_template, request, redirect, url_for, g
from flask_login import login_required
from app import cache
from app.routes.service import bp
import app.modules.db.sql as sql
from middleware import check_services, get_user_params
import app.modules.common.common as common
import app.modules.server.server as server_mod
import app.modules.service.action as service_action
@ -16,16 +15,6 @@ import app.modules.roxywi.common as roxywi_common
import app.modules.roxywi.overview as roxy_overview
def check_services(fn):
@wraps(fn)
def decorated_view(*args, **kwargs):
service = kwargs['service']
if service not in ('haproxy', 'nginx', 'apache', 'keepalived'):
abort(400, 'bad service')
return fn(*args, **kwargs)
return decorated_view
@bp.before_request
@login_required
def before_request():
@ -36,13 +25,9 @@ def before_request():
@bp.route('/<service>', defaults={'serv': None})
@bp.route('/<service>/<serv>')
@check_services
@get_user_params()
def services(service, serv):
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
services = []
service_desc = sql.select_service(service)
servers = roxywi_common.get_dick_permit(virt=1, service=service_desc.slug)
@ -52,10 +37,6 @@ def services(service, serv):
waf_server = ''
cmd = "ps ax |grep -e 'keep_alive.py' |grep -v grep |wc -l"
keep_alive, stderr = server_mod.subprocess_execute(cmd)
is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
if is_redirect != 'ok':
return redirect(url_for(f'{is_redirect}'))
if serv:
if roxywi_common.check_is_server_in_group(serv):
@ -196,7 +177,7 @@ def services(service, serv):
user_subscription = roxywi_common.return_user_subscription()
return render_template(
'service.html', autorefresh=autorefresh, role=user_params['role'], user=user, servers=servers_with_status1,
'service.html', autorefresh=autorefresh, role=user_params['role'], user=user_params['user'], servers=servers_with_status1,
keep_alive=''.join(keep_alive), serv=serv, service=service, services=services, user_services=user_params['user_services'],
docker_settings=docker_settings, user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
waf_server=waf_server, restart_settings=restart_settings, service_desc=service_desc, token=user_params['token'],
@ -205,7 +186,6 @@ def services(service, serv):
@bp.post('/action/<service>/check-service')
@check_services
def check_service(service):
user_uuid = request.cookies.get('uuid')
server_ip = common.checkAjaxInput(request.form.get('server_ip'))
@ -213,7 +193,7 @@ def check_service(service):
try:
return service_action.check_service(server_ip, user_uuid, service)
except Exception:
pass
return 'logout'
@bp.route('/action/<service>/<server_ip>/<action>', methods=['GET'])
@ -229,8 +209,9 @@ def last_edit(service, server_ip):
@bp.route('/cpu-ram-metrics/<server_ip>/<server_id>/<name>/<service>')
@get_user_params()
def cpu_ram_metrics(server_ip, server_id, name, service):
user_params = roxywi_common.get_users_params()
user_params = g.user_params
if service == 'haproxy':
sock_port = sql.get_setting('haproxy_sock_port')

View File

@ -1,9 +1,10 @@
from pytz import timezone
from flask import render_template, request, redirect, url_for, jsonify
from flask import render_template, request, redirect, url_for, jsonify, g
from flask_login import login_required
from datetime import datetime
from app.routes.smon import bp
from middleware import get_user_params
import app.modules.db.sql as sql
import app.modules.common.common as common
import app.modules.roxywi.auth as roxywi_auth
@ -19,35 +20,27 @@ def before_request():
@bp.route('/dashboard')
@get_user_params()
def smon():
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
roxywi_common.check_user_group_for_flask()
user_params = g.user_params
user_group = roxywi_common.get_user_group(id=1)
smon = sql.smon_list(user_group)
smon_status, stderr = smon_mod.return_smon_status()
user_subscription = roxywi_common.return_user_subscription()
return render_template(
'smon/dashboard.html', h2=1, autorefresh=1, role=user_params['role'], user=user, group=user_group,
'smon/dashboard.html', autorefresh=1, role=user_params['role'], user=user_params['user'], group=user_group,
lang=user_params['lang'], smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services'],
user_status=user_subscription['user_status'], smon=smon, user_plan=user_subscription['user_plan'], token=user_params['token']
)
@bp.route('/dashboard/<dashboard_id>/<check_id>')
@get_user_params()
def smon_dashboard(dashboard_id, check_id):
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
check_id = int(check_id)
roxywi_common.check_user_group_for_flask()
user_subscription = roxywi_common.return_user_subscription()
@ -79,7 +72,7 @@ def smon_dashboard(dashboard_id, check_id):
cert_day_diff = (ssl_expire_date - present).days
return render_template(
'include/smon/smon_history.html', autorefresh=1, role=user_params['role'], user=user, smon=smon,
'include/smon/smon_history.html', autorefresh=1, role=user_params['role'], user=user_params['user'], smon=smon,
lang=user_params['lang'], user_status=user_subscription['user_status'], check_interval=check_interval,
user_plan=user_subscription['user_plan'], token=user_params['token'], uptime=uptime, avg_res_time=avg_res_time,
user_services=user_params['user_services'], smon_name=smon_name, cert_day_diff=cert_day_diff, check_id=check_id,
@ -88,6 +81,7 @@ def smon_dashboard(dashboard_id, check_id):
@bp.route('/history')
@get_user_params()
def smon_history():
roxywi_common.check_user_group_for_flask()
@ -95,21 +89,17 @@ def smon_history():
smon_status, stderr = smon_mod.return_smon_status()
smon = sql.alerts_history('SMON', user_group)
user_subscription = roxywi_common.return_user_subscription()
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
return render_template(
'smon/history.html', autorefresh=0, role=user_params['role'], user=user, smon=smon, lang=user_params['lang'],
'smon/history.html', autorefresh=0, role=user_params['role'], user=user_params['user'], smon=smon, lang=user_params['lang'],
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], token=user_params['token'],
smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services']
)
@bp.route('/history/host/<server_ip>')
@get_user_params()
def smon_host_history(server_ip):
roxywi_common.check_user_group_for_flask()
@ -118,15 +108,10 @@ def smon_host_history(server_ip):
smon_status, stderr = smon_mod.return_smon_status()
smon = sql.alerts_history('SMON', user_group, host=needed_host)
user_subscription = roxywi_common.return_user_subscription()
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
return render_template(
'smon/history.html', autorefresh=0, role=user_params['role'], user=user, smon=smon,
'smon/history.html', autorefresh=0, role=user_params['role'], user=user_params['user'], smon=smon,
lang=user_params['lang'], user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
token=user_params['token'], smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services']
)
@ -148,6 +133,7 @@ def smon_history_cur_status(dashboard_id, check_id):
@bp.route('/admin')
@get_user_params()
def smon_admin():
user_group = roxywi_common.get_user_group(id=1)
smon_status, stderr = smon_mod.return_smon_status()
@ -161,15 +147,10 @@ def smon_admin():
smon_dns = sql.select_smon_dns(user_group)
roxywi_auth.page_for_admin(level=3)
user_subscription = roxywi_common.return_user_subscription()
try:
user_params = roxywi_common.get_users_params()
user = user_params['user']
except Exception:
return redirect(url_for('login_page'))
user_params = g.user_params
return render_template(
'smon/add.html', autorefresh=0, role=user_params['role'], user=user, smon=smon, lang=user_params['lang'],
'smon/add.html', autorefresh=0, role=user_params['role'], user=user_params['user'], smon=smon, lang=user_params['lang'],
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], token=user_params['token'],
smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services'], telegrams=telegrams,
slacks=slacks, pds=pds, smon_ping=smon_ping, smon_tcp=smon_tcp, smon_http=smon_http, smon_dns=smon_dns

View File

@ -1,10 +1,11 @@
import os
from flask import render_template, request
from flask import render_template, request, g, abort
from flask_login import login_required
from app.routes.waf import bp
import app.modules.db.sql as sql
from middleware import check_services, get_user_params
import app.modules.common.common as common
import app.modules.roxy_wi_tools as roxy_wi_tools
import app.modules.roxywi.waf as roxy_waf
@ -25,9 +26,14 @@ def before_request():
@bp.route('/<service>')
@check_services
@get_user_params()
def waf(service):
roxywi_auth.page_for_admin(level=2)
if not roxywi_auth.is_access_permit_to_service(service):
abort(403, f'You do not have needed permissions to access to {service.title()} service')
manage_rules = ''
waf_rule_id = ''
config_file_name = ''
@ -36,13 +42,11 @@ def waf(service):
rules = ''
serv = ''
cfg = ''
user_params = roxywi_common.get_users_params()
user_params = g.user_params
if service == 'nginx':
roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2)
servers = roxywi_common.get_dick_permit(nginx=1)
else:
roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
servers = user_params['servers']
title = "Web application firewall"
@ -59,9 +63,12 @@ def waf(service):
@bp.route('/<service>/<server_ip>/rules')
@get_user_params()
def waf_rules(service, server_ip):
roxywi_auth.page_for_admin(level=2)
roxywi_common.check_is_server_in_group(server_ip)
if not roxywi_auth.is_access_permit_to_service(service):
abort(403, f'You do not have needed permissions to access to {service.title()} service')
manage_rules = '1'
waf_rule_id = ''
@ -71,15 +78,10 @@ def waf_rules(service, server_ip):
config_read = ''
servers = ''
cfg = ''
user_params = roxywi_common.get_users_params()
user_params = g.user_params
title = "Manage rules - Web application firewall"
rules = sql.select_waf_rules(server_ip, service)
if service == 'nginx':
roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2)
else:
roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
return render_template(
'waf.html', title=title, autorefresh=0, role=user_params['role'], user=user_params['user'], serv=server_ip,
servers=servers_waf, servers_all=servers, manage_rules=manage_rules, rules=rules,
@ -90,22 +92,23 @@ def waf_rules(service, server_ip):
@bp.route('/<service>/<server_ip>/rule/<rule_id>')
@get_user_params()
def waf_rule_edit(service, server_ip, rule_id):
roxywi_auth.page_for_admin(level=2)
if not roxywi_auth.is_access_permit_to_service(service):
abort(403, f'You do not have needed permissions to access to {service.title()} service')
roxywi_common.check_is_server_in_group(server_ip)
manage_rules = ''
servers_waf = ''
config_read = ''
servers = ''
user_params = roxywi_common.get_users_params()
user_params = g.user_params
rules = sql.select_waf_rules(server_ip, service)
if service == 'nginx':
roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2)
config_path = sql.get_setting('nginx_dir')
else:
roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
config_path = sql.get_setting('haproxy_dir')
title = 'Edit a WAF rule'

View File

@ -1,24 +0,0 @@
{% extends "base.html" %}
{% block content %}
<h2>
500 - Internal error
</h2>
<style>
#oops_div {
position: absolute;
right: 0;
margin-top: 50px;
bottom: 50px;
}
</style>
<center>
<h4>Sorry, but something went wrong..... Check httpd error log and
<a href="https://github.com/Aidaho12/haproxy-wi/issues" title="GitHub issues">create issue on GitHub</a>
or write <a href="https://t.me/haproxy_wi" title="Roxy-WI chat">to the chat</a>
</h4>
<div>Error: {{e}}</div>
<div id="oops_div">
<img src="{{ url_for('static', filename='images/oops.png')}}" alt="Oops">
</div>
</center>
{% endblock %}

View File

@ -112,6 +112,7 @@
<td class="padding10" style="width: 10%">{{lang.words.latest|title()}} {{lang.words.version}}</td>
<td style="width: 10%"></td>
<td style="width: 100%">{{lang.words.desc|title()}}</td>
<td><span onclick="checkUpdateRoxy()" class="refresh service-restart" title="{{lang.words.check|title()}} {{lang.words.new4}} {{lang.words.versions}}"></span></td>
<td><span onclick="loadupdatehapwi()" class="refresh" title="{{lang.words.refresh|title()}}"></span></td>
</tr>
</thead>

View File

@ -44,42 +44,16 @@
</tr>
{% for s in services %}
{% if s.0 in ('roxy-wi-smon', 'roxy-wi-checker', 'roxy-wi-keep_alive', 'roxy-wi-metrics', 'roxy-wi-portscanner', 'roxy-wi-socket', 'roxy-wi-prometheus-exporter') %}
<tr class="{{ loop.cycle('even', 'odd') }}">
{% set is_need_update = 0 %}
{% if s.0 == 'roxy-wi-smon' %}
{% if s.3|float < smon_ver|float %}
{% if s.2['current_version']|float < s.2['new_version']|float %}
{% set is_need_update = 1 %}
{% endif %}
{% elif s.0 == 'roxy-wi-checker' %}
{% if s.3|float < checker_ver|float %}
{% set is_need_update = 1 %}
{% endif %}
{% elif s.0 == 'roxy-wi-keep_alive' %}
{% if s.3|float < keep_ver|float %}
{% set is_need_update = 1 %}
{% endif %}
{% elif s.0 == 'roxy-wi-metrics' %}
{% if s.3|float < metrics_ver|float %}
{% set is_need_update = 1 %}
{% endif %}
{% elif s.0 == 'roxy-wi-portscanner' %}
{% if s.3|float < portscanner_ver|float %}
{% set is_need_update = 1 %}
{% endif %}
{% elif s.0 == 'roxy-wi-socket' %}
{% if s.3|float < socket_ver|float %}
{% set is_need_update = 1 %}
{% endif %}
{% elif s.0 == 'roxy-wi-prometheus-exporter' %}
{% if s.3|float < prometheus_exp_ver|float %}
{% set is_need_update = 1 %}
{% endif %}
{% endif %}
<tr class="{{ loop.cycle('even', 'odd') }}">
<td class="padding10 first-collumn">
<a href="https://roxy-wi.org/tools/{{services_name[s.0]['link']}}" title="{{lang.words.read|title()}} {{lang.words.more}} {{lang.words.about}} {{services_name[s.0]['name']}}" target="_blank" class="link" rel="noopener noreferrer">{{services_name[s.0]['name']}}</a>
</td>
<td>
{% if s.3 != '* is not installed' and s.3 != '' %}
{% if s.2['current_version'] != '* is not installed' and s.2['current_version'] != '' %}
<b id="current-version-{{s.0}}"
{% if is_need_update %}
title="{{lang.admin_page.desc.a_new_version}} {{services_name[s.0]['name']}}"
@ -89,37 +63,23 @@
style="color: var(--green-color)"
{% endif %}
>
{{s.3}}
{{s.2['current_version']}}
</b>
{% endif %}
</td>
<td class="padding10">
<b>
{% if s.0 == 'roxy-wi-smon' %}
{{smon_ver}}
{% elif s.0 == 'roxy-wi-checker' %}
{{checker_ver}}
{% elif s.0 == 'roxy-wi-keep_alive' %}
{{keep_ver}}
{% elif s.0 == 'roxy-wi-metrics' %}
{{metrics_ver}}
{% elif s.0 == 'roxy-wi-portscanner' %}
{{portscanner_ver}}
{% elif s.0 == 'roxy-wi-socket' %}
{{socket_ver}}
{% elif s.0 == 'roxy-wi-prometheus-exporter' %}
{{prometheus_exp_ver}}
{% endif %}
{{s.2['new_version']}}
</b>
</td>
<td>
{% if 'is not installed' not in s.3 and s.3 != '' %}
{% if 'is not installed' not in s.2['current_version'] and s.2['current_version'] != '' %}
{% if is_need_update %}
<a class="ui-button ui-widget ui-corner-all" onclick="updateService('{{s.0}}')" title="{{lang.words.w_update|title()}} {{services_name[s.0]['name']}}">{{lang.words.w_update|title()}}</a>
{% endif %}
{% endif %}
</td>
<td colspan="2">
<td colspan="3">
{{services_name[s.0]['desc']|safe}}
</td>
</tr>

View File

@ -0,0 +1,51 @@
{% import 'languages/'+lang|default('en')+'.html' as lang %}
{% from 'languages/languages.html' import languages %}
<thead>
<tr class="overviewHead">
<td class="padding10 first-collumn-wi" style="width: 85%">
{% if role == 2 %}
<a href="/app/logs/internal?type=2" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
{% else %}
<a href="/app/logs/internal" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
{% endif %}
{{lang.words.recent|title()}} Roxy-WI {{lang.words.logs}}
</a>
</td>
<td>
{% if roxy_wi_log|length > 3 %}
<span class="add-button-wi">
<span id="show-all-haproxy-wi-log">
{{lang.words.show_all}}
</span>
<span id="hide-all-haproxy-wi-log" style="display: none;">
{{lang.words.hide|title()}} {{lang.words.logs}}
</span>
</span>
{% endif %}
</td>
<td style="padding-right: 10px;">
<a onclick="ShowOverviewLogs()" title="{{lang.words.refresh|title()}}" style="float: right;">
<span class="refresh"></span>
</a>
</td>
</tr>
</thead>
<tbody id="overview-logs-body">
{% set counter = 0 -%}
{% for log in roxy_wi_log %}
{% set counter = counter + loop.index0 %}
{% if counter <= 2 %}
<tr class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn-wi" style="font-size: 12.5px;" colspan="3">
{{ log }}
</td>
</tr>
{% else %}
<tr style="display: none;" class="show-haproxy-wi-log {{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn-wi" style="font-size: 12.5px" colspan="3">
{{ log }}
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>

View File

@ -1,20 +1,20 @@
{% import 'languages/'+lang|default('en')+'.html' as lang %}
<tr class="odd">
<td class="padding10 first-collumn-wi">
{% if metrics_master == 'active' %}
{% if roxy_tools_status['roxy-wi-metrics'] == 'active' %}
<span class="serverUp server-status-small" title="Metrics master {{lang.words.started}}"></span>
{% if role <= 1 %}
<a href="/app/viewlogs.py?viewlogs={{metrics_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
<a href="{{ url_for('logs.logs_internal') }}" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
Metrics master
</a>
{% else %}
Metrics master
{% endif %}
{% else %}
{% if metrics_master == 'inactive' or metrics_master == 'failed' %}
{% if roxy_tools_status['roxy-wi-metrics'] == 'inactive' or roxy_tools_status['roxy-wi-metrics'] == 'failed' %}
<span class="serverDown server-status-small" title="Metrics {{lang.words.stopped}}"></span>
{% if role <= 1 %}
<a href="/app/users.py#services" title="{{lang.words.start|title()}} Metrics" class="logs_link">
<a href="{{ url_for('admin.admin') }}#tools" title="{{lang.words.start|title()}} Metrics" class="logs_link">
Metrics master
</a>
{% else %}
@ -22,27 +22,27 @@
{% endif %}
{% else %}
<span class="serverNone server-status-small" title="{{lang.phrases.metrics_not_installed}}"></span>
<a href="https://roxy-wi.org/services.py?service=metrics#installation" title="Metrics installation" target="_blank" class="logs_link">
<a href="https://roxy-wi.org/tools/metrics#installation" title="Metrics installation" target="_blank" class="logs_link">
Metrics master
</a>
{% endif %}
{% endif %}
</td>
<td class="third-collumn-wi">
{% if checker_master == 'active' %}
{% if roxy_tools_status['roxy-wi-checker'] == 'active' %}
<span class="serverUp server-status-small" title="Checker master {{lang.words.started}}"></span>
{% if role <= 1 %}
<a href="/app/viewlogs.py?viewlogs={{checker_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
<a href="{{ url_for('logs.logs_internal') }}" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
Checker master
</a>
{% else %}
Checker master
{% endif %}
{% else %}
{% if checker_master == 'inactive' or checker_master == 'failed' %}
{% if roxy_tools_status['roxy-wi-checker'] == 'inactive' or roxy_tools_status['roxy-wi-checker'] == 'failed' %}
<span class="serverDown server-status-small" title="Checker {{lang.words.stopped}}"></span>
{% if role <= 1 %}
<a href="/app/users.py#services" title="{{lang.words.start|title()}} Checker" class="logs_link">
<a href="{{ url_for('admin.admin') }}#services" title="{{lang.words.start|title()}} Checker" class="logs_link">
Checker master
</a>
{% else %}
@ -50,27 +50,27 @@
{% endif %}
{% else %}
<span class="serverNone server-status-small" title="{{lang.phrases.checker_not_installed}}"></span>
<a href="https://roxy-wi.org/services.py?service=checker#installation" title="Checker installation" target="_blank" class="logs_link">
<a href="https://roxy-wi.org/tools/checker#installation" title="Checker installation" target="_blank" class="logs_link">
Checker master
</a>
{% endif %}
{% endif %}
</td>
<td class="third-collumn-wi">
{% if keep_alive == 'active' %}
{% if roxy_tools_status['roxy-wi-keep_alive'] == 'active' %}
<span class="serverUp server-status-small" title="Auto start {{lang.words.started}}"></span>
{% if role <= 1 %}
<a href="/app/viewlogs.py?viewlogs={{keep_alive_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
<a href="{{ url_for('logs.logs_internal') }}" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
Auto start
</a>
{% else %}
Auto star
{% endif %}
{% else %}
{% if keep_alive == 'inactive' or keep_alive == 'failed' %}
{% if roxy_tools_status['roxy-wi-keep_alive'] == 'inactive' or roxy_tools_status['roxy-wi-keep_alive'] == 'failed' %}
<span class="serverDown server-status-small" title="Auto start {{lang.words.stopped}}"></span>
{% if role <= 1 %}
<a href="/app/users.py#services" title="{{lang.words.start|title()}} Auto star {{lang.words.service}}" class="logs_link">
<a href="{{ url_for('admin.admin') }}#services" title="{{lang.words.start|title()}} Auto star {{lang.words.service}}" class="logs_link">
Auto start
</a>
{% else %}
@ -78,14 +78,14 @@
{% endif %}
{% else %}
<span class="serverNone server-status-small" title="{{lang.phrases.auto_start_not_installed}}"></span>
<a href="https://roxy-wi.org/services.py?service=auto_start#installation" title="Auto start installation" target="_blank" class="logs_link">
<a href="https://roxy-wi.org/tools/auto_start#installation" title="Auto start installation" target="_blank" class="logs_link">
Auto start
</a>
{% endif %}
{% endif %}
</td>
</tr>
<tr class="even">
</tr>
<tr class="even">
<td class="padding10 first-collumn-wi">
{% if metrics_worker|int() >= 1 %}
<span class="serverUp server-status-small" title="{{lang.words.running2|title()}} {{metrics_worker}} {{lang.words.worker2}} {{lang.words.processes}}"></span>
@ -97,7 +97,7 @@
{% endif %}
{% endif %}
{% if role <= 1 %}
<a href="/app/viewlogs.py?viewlogs={{metrics_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
<a href="{{ url_for('logs.logs_internal') }}" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
Metrics workers
</a>
{% else %}
@ -115,7 +115,7 @@
{% endif %}
{% endif %}
{% if role <= 1 %}
<a href="/app/viewlogs.py?viewlogs={{checker_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
<a href="{{ url_for('logs.logs_internal') }}" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
Checker workers
</a>
{% else %}
@ -123,27 +123,27 @@
{% endif %}
</td>
<td>
{% if smon == 'active' %}
{% if roxy_tools_status['roxy-wi-smon'] == 'active' %}
<span class="serverUp server-status-small" title="SMON {{lang.words.started}}"></span>
<a href="/app/smon.py?action=view" title="SMON Dashboard" class="logs_link">
<a href="{{ url_for('smon.smon') }}" title="SMON Dashboard" class="logs_link">
SMON
</a>
{% else %}
{% if smon == 'inactive' or smon == 'failed' %}
{% if roxy_tools_status['roxy-wi-smon'] == 'inactive' or roxy_tools_status['roxy-wi-smon'] == 'failed' %}
<span class="serverDown server-status-small" title="SMON {{lang.words.stopped}}"></span>
<a href="/app/users.py#services" title="{{lang.words.start|title()}} SMON" class="logs_link">
<a href="{{ url_for('admin.admin') }}#services" title="{{lang.words.start|title()}} SMON" class="logs_link">
SMON
</a>
{% else %}
<span title="SMON is not installed"><span class="serverNone server-status-small"></span></span>
<a href="https://roxy-wi.org/services.py?service=smon" title="Simple monitoring ports installation" target="_blank" class="logs_link">
<a href="https://roxy-wi.org/tools/smon" title="Simple monitoring ports installation" target="_blank" class="logs_link">
SMON
</a>
{% endif %}
{% endif %}
</td>
</tr>
<tr class="odd">
</tr>
<tr class="odd">
{% if role == 1 %}
<td class="padding10 first-collumn-wi">
{% if grafana|int() >= 1 %}
@ -156,47 +156,47 @@
{% endif %}
</td>
<td {% if role != 1 %}class="padding10 first-collumn-wi"{%endif%}>
{% if socket == 'active' %}
{% if roxy_tools_status['roxy-wi-socket'] == 'active' %}
<span class="serverUp server-status-small" title="Socket {{lang.words.started}}"></span>
{% if role <= 1 %}
<a href="/app/viewlogs.py?viewlogs={{socket_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
<a href="{{ url_for('logs.logs_internal') }}" title="{{lang.words.view|title()}} {{lang.words.logs2}}" class="logs_link">
Socket service
</a>
{% else %}
Socket service
{% endif %}
{% else %}
{% if socket == 'inactive' or socket == 'failed' %}
{% if roxy_tools_status['roxy-wi-socket'] == 'inactive' or roxy_tools_status['roxy-wi-socket'] == 'failed' %}
<span class="serverDown server-status-small" title="Socket {{lang.words.stopped}}"></span>
<a href="/app/users.py#services" title="{{lang.words.start|title()}} Socket" class="logs_link">
<a href="{{ url_for('admin.admin') }}#services" title="{{lang.words.start|title()}} Socket" class="logs_link">
Socket service
</a>
{% else %}
<span title="Socket service is not installed"><span class="serverNone server-status-small"></span></span>
<a href="https://roxy-wi.org/services.py?service=socket" title="Socket service" target="_blank" class="logs_link">
<a href="https://roxy-wi.org/tools/socket" title="Socket service" target="_blank" class="logs_link">
Socket service
</a>
{% endif %}
{% endif %}
</td>
<td>
{% if port_scanner == 'active' %}
{% if roxy_tools_status['roxy-wi-portscanner'] == 'active' %}
<span class="serverUp server-status-small" title="Port scanner {{lang.words.started}}"></span>
<a href="/app/portscanner.py" title="Port scanner Dashboard" class="logs_link">
<a href="{{ url_for('portscanner.portscanner') }}" title="Port scanner Dashboard" class="logs_link">
Port scanner
</a>
{% else %}
{% if port_scanner == 'inactive' or port_scanner == 'failed' %}
{% if roxy_tools_status['roxy-wi-portscanner'] == 'inactive' or roxy_tools_status['roxy-wi-portscanner'] == 'failed' %}
<span class="serverDown server-status-small" title="Port scanner {{lang.words.stopped}}"></span>
<a href="/app/users.py#services" title="{{lang.words.start|title()}} Port scanner" class="logs_link">
<a href="{{ url_for('admin.admin') }}#services" title="{{lang.words.start|title()}} Port scanner" class="logs_link">
Port scanner
</a>
{% else %}
<span title="Port scanner is not installed"><span class="serverNone server-status-small"></span></span>
<a href="https://roxy-wi.org/services.py?service=port_scanner" title="Port scanner" target="_blank" class="logs_link">
<a href="https://roxy-wi.org/tools/port_scanner" title="Port scanner" target="_blank" class="logs_link">
Port scanner
</a>
{% endif %}
{% endif %}
</td>
</tr>
</tr>

View File

@ -15,11 +15,11 @@
{% endif %}
<tr class="odd">
<td class="padding10 first-collumn-wi">{{lang.words.plan|title()}}</td>
<td>{{plan}}</td>
<td colspan="2">{{plan}}</td>
</tr>
<tr class="even">
<td class="padding10 first-collumn-wi">{{lang.words.status|title()}}</td>
<td>
<td colspan="2">
{% if plan == 'Free' %}
N/A
{% else %}
@ -35,7 +35,7 @@
</tr>
<tr class="odd">
<td class="padding10 first-collumn-wi">{{lang.words.pay_method|title()}}</td>
<td>
<td colspan="2">
{% if plan == 'Free' %}
N/A
{% else %}

View File

@ -1,20 +1,21 @@
{% extends "base.html" %}
{% block title %} {{title}} {% endblock %}
{% block h2 %} {{title}} {% endblock %}
{% block content %}
<h2>
404 - Page not found
</h2>
<div class="container">
<style>
#oops_div {
position: absolute;
right: 0;
margin-top: 50px;
bottom: 50px;
bottom: -15px;
}
</style>
<center>
<h4>Sorry, but page not found. Try another page</h4>
<h4>{{e}}</h4>
</center>
<div id="oops_div">
<img src="{{ url_for('static', filename='images/oops.png')}}" alt="Oops">
</div>
</div>
{% endblock %}

View File

@ -1,4 +1,4 @@
<div class="top-menu">
<div class="top-menu">
<div class="LogoText">
<span id="logo_text">
<a href="https://roxy-wi.org" title="Roxy-WI site" target="_blank">
@ -95,7 +95,9 @@
<li class="p_menu">
<a href="{{ url_for('install.install_monitoring') }}" title="{{lang.menu_links.servers.title}}" class="hap-menu">{{lang.words.installation|title()}}</a>
<ul class="v_menu">
{% if '3' in user_services %}
<li><a href="{{ url_for('install.ha') }}" title="{{lang.menu_links.ha.title}}" class="keepalived head-submenu">HA {{lang.words.cluster}}</a></li>
{% endif %}
<li><a href="{{ url_for('install.install_monitoring') }}#service" title="{{lang.words.servers|title()}}: {{lang.words.proxy|title()}} {{lang.words.services}} {{lang.words.installation}}" class="hap-menu service installproxy head-submenu">{{lang.words.proxy|title()}} {{lang.words.services}}</a> </li>
<li><a href="{{ url_for('install.install_monitoring') }}#monitoring" title="{{lang.words.servers|title()}}: {{lang.words.monitoring|title()}} {{lang.words.services}} {{lang.words.installation}}" class="hap-menu monitoring installmon head-submenu">{{lang.words.monitoring|title()}}</a> </li>
<li><a href="{{ url_for('install.install_monitoring') }}#geolite2" title="{{lang.words.installation|title()}} GeoLite2" class="hap-menu geolite2 installgeo head-submenu">GeoLite2</a> </li>
@ -131,4 +133,4 @@
</ul>
</nav>
</div>
</div>
</div>

View File

@ -69,7 +69,7 @@
<tr class="overviewHead" style="height: 30px;">
<td class="padding10 first-collumn-wi" colspan="2">
{% if role <= 1 %}
<a href="/app/internal/{{roxy_wi_log_id}}" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
<a href="/app/logs/internal" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
Roxy-WI {{lang.words.server_status}}
</a>
{% else %}
@ -98,7 +98,7 @@
<tr class="overviewHead">
<td class="padding10 first-collumn-wi" colspan=2>
{% if role <= 1 %}
<a href="admin#services" title="{{lang.words.view|title()}} {{lang.words.services}} {{lang.words.status}}" class="logs_link">
<a href="admin#tools" title="{{lang.words.view|title()}} {{lang.words.services}} {{lang.words.status}}" class="logs_link">
Roxy-WI {{lang.words.services_status}}
</a>
{% else %}
@ -205,50 +205,8 @@
</table>
{% endif %}
{% if role <= 2 %}
<table class="overview-wi" id="overview-logs">
<tr class="overviewHead">
<td class="padding10 first-collumn-wi">
{% if role == 2 %}
<a href="/app/internal/{{roxy_wi_log_id}}?type=2" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
{% else %}
<a href="/app/internal/{{roxy_wi_log_id}}" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
{% endif %}
{{lang.words.recent|title()}} Roxy-WI {{lang.words.logs}}
</a>
</td>
<td>
{% if roxy_wi_log|length > 3 %}
<span class="add-button-wi">
<span id="show-all-haproxy-wi-log">
{{lang.words.show_all}}
</span>
<span id="hide-all-haproxy-wi-log" style="display: none;">
{{lang.words.hide|title()}} {{lang.words.logs}}
</span>
</span>
{% endif %}
</td>
</tr>
<tr>
{% set counter = 0 -%}
{% for log in roxy_wi_log %}
{% set counter = counter + loop.index0 %}
{% if counter <= 2 %}
<tr class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn-wi" style="font-size: 12.5px;" colspan="2">
{{ log }}
</td>
</tr>
{% else %}
<tr style="display: none;" class="show-haproxy-wi-log {{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn-wi" style="font-size: 12.5px" colspan="2">
{{ log }}
</td>
</tr>
{% endif %}
{% endfor %}
</tr>
</table>
<script>ShowOverviewLogs();</script>
<table class="overview-wi" id="overview-logs"></table>
{% endif %}
{% if role <= 1 %}
<table class="overview-wi" id="overview-subs">
@ -256,6 +214,11 @@
<td class="padding10 first-collumn-wi" colspan="2">
<a href="https://roxy-wi.org/cabinet" title="{{lang.words.personal|title()}} {{lang.words.cabinet}}" class="logs_link" target="_blank">{{lang.words.subs|title()}}</a>
</td>
<td style="padding-right: 10px;">
<a onclick="showSubOverview()" title="{{lang.words.refresh|title()}}" style="float: right;">
<span class="refresh"></span>
</a>
</td>
</tr>
<tbody id="sub-table"></tbody>
</table>

View File

@ -22,7 +22,7 @@
WSGIDaemonProcess roxy-wi-api display-name=%{GROUP} user=apache group=apache processes=1 threads=5
WSGIScriptAlias /api /var/www/haproxy-wi/api/app.wsgi
WSGIDaemonProcess roxy-wi-app display-name=%{GROUP} user=apache group=apache processes=5 threads=10
WSGIDaemonProcess roxy-wi-app display-name=%{GROUP} user=apache group=apache processes=1 threads=10
WSGIScriptAlias /app /var/www/haproxy-wi/app/app.wsgi
<Directory /var/www/haproxy-wi/app/>

View File

@ -22,7 +22,7 @@
WSGIDaemonProcess roxy-wi-api display-name=%{GROUP} user=www-data group=www-data processes=1 threads=5
WSGIScriptAlias /api /var/www/haproxy-wi/api/app.wsgi
WSGIDaemonProcess roxy-wi-app display-name=%{GROUP} user=www-data group=www-data processes=5 threads=10
WSGIDaemonProcess roxy-wi-app display-name=%{GROUP} user=www-data group=www-data processes=1 threads=10
WSGIScriptAlias /app /var/www/haproxy-wi/app/app.wsgi
<Directory /var/www/haproxy-wi/app/>

View File

@ -7,3 +7,9 @@ retry>=0.9.2
psutil>=5.9.1
pika>=1.3.1
pdpyras>=4.5.2
Flask-APScheduler>=1.12.4
python3-nmap<=1.5.1
aio-pika>=7.1.0
pika>=1.2.0
websockets>=9.0
retry>=0.9.2

View File

@ -11,3 +11,9 @@ pika>=1.3.1
Flask>=2.0.3
Flask-Login>=0.4.1
Flask-Caching>=1.10.1
Flask-APScheduler>=1.12.4
python3-nmap<=1.5.1
aio-pika>=7.1.0
pika>=1.2.0
websockets>=9.0
retry>=0.9.2

View File

@ -12,3 +12,9 @@ pika>=1.3.1
Flask>=2.0.3
Flask-Login>=0.4.1
Flask-Caching>=1.10.1
Flask-APScheduler>=1.12.4
python3-nmap<=1.5.1
aio-pika>=7.1.0
pika>=1.2.0
websockets>=9.0
retry>=0.9.2

View File

@ -12,3 +12,9 @@ pika>=1.3.1
Flask>=2.0.3
Flask-Login>=0.4.1
Flask-Caching>=1.10.1
Flask-APScheduler>=1.12.4
python3-nmap<=1.5.1
aio-pika>=7.1.0
pika>=1.2.0
websockets>=9.0
retry>=0.9.2

View File

@ -118,8 +118,6 @@ function showOverviewServer(name, ip, id, service) {
} );
}
function ajaxActionServers(action, id, service) {
// var cur_url = window.location.href.split('/app/').pop();
// cur_url = cur_url.split('/');
$.ajax( {
url: "/app/service/action/" + service + "/" + id + "/" + action,
success: function( data ) {
@ -531,6 +529,9 @@ function serverSettingsSave(id, name, service, dialog_id) {
});
}
function check_service_status(id, ip, service) {
if (sessionStorage.getItem('check-service') == 0) {
return false;
}
NProgress.configure({showSpinner: false});
if (service == 'keepalived') return false;
$.ajax({
@ -540,6 +541,9 @@ function check_service_status(id, ip, service) {
},
type: "POST",
success: function (data) {
if (data.indexOf('logout') != '-1') {
sessionStorage.setItem('check-service', 0)
}
data = data.replace(/\s+/g, ' ');
if (cur_url[0] == 'service') {
if (data.indexOf('up') != '-1') {
@ -567,3 +571,22 @@ function check_service_status(id, ip, service) {
});
NProgress.configure({showSpinner: true});
}
function ShowOverviewLogs() {
$.ajax( {
url: "/app/overview/logs",
type: "GET",
beforeSend: function() {
$("#overview-logs").html('<img class="loading_small_bin_bout" style="padding-left: 40%;padding-top: 40px;padding-bottom: 40px;" src="/app/static/images/loading.gif" />');
},
success: function( data ) {
data = data.replace(/\s+/g,' ');
if (data.indexOf('error:') != '-1') {
toastr.error(data);
} else {
$("#overview-logs").html(data);
$.getScript("/inc/fontawesome.min.js")
$.getScript("/inc/overview.js")
}
}
} );
}

View File

@ -18,3 +18,4 @@ pika>=1.3.1
Flask>=2.0.3
Flask-Login>=0.4.1
Flask-Caching>=1.10.1
Flask-APScheduler>=1.12.4