2023-09-30 08:48:54 +00:00
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import pytz
|
|
|
|
|
2023-10-16 10:48:38 +00:00
|
|
|
from flask import render_template, request, session, g, abort
|
2023-09-30 11:31:29 +00:00
|
|
|
from flask_login import login_required
|
2023-09-30 08:48:54 +00:00
|
|
|
|
|
|
|
sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
|
|
|
|
|
2023-10-09 07:21:37 +00:00
|
|
|
from app import app, cache
|
2023-09-30 11:31:29 +00:00
|
|
|
from app.routes.main import bp
|
2024-02-04 07:28:17 +00:00
|
|
|
import app.modules.db.sql as sql
|
2023-10-09 07:21:37 +00:00
|
|
|
from modules.db.db_model import conn
|
2023-10-16 10:12:36 +00:00
|
|
|
from middleware import check_services, get_user_params
|
2024-02-04 07:28:17 +00:00
|
|
|
import app.modules.common.common as common
|
|
|
|
import app.modules.roxywi.roxy as roxy
|
|
|
|
import app.modules.roxywi.auth as roxywi_auth
|
|
|
|
import app.modules.roxywi.nettools as nettools_mod
|
|
|
|
import app.modules.roxywi.common as roxywi_common
|
|
|
|
import app.modules.service.common as service_common
|
|
|
|
import app.modules.service.haproxy as service_haproxy
|
2023-09-30 08:48:54 +00:00
|
|
|
|
|
|
|
|
2023-10-16 10:12:36 +00:00
|
|
|
@app.errorhandler(403)
|
|
|
|
@get_user_params()
|
|
|
|
def page_is_forbidden(e):
|
2024-01-17 06:08:27 +00:00
|
|
|
kwargs = {
|
|
|
|
'user_params': g.user_params,
|
|
|
|
'title': e,
|
|
|
|
'e': e
|
|
|
|
}
|
|
|
|
return render_template('error.html', **kwargs), 403
|
2023-10-16 10:12:36 +00:00
|
|
|
|
|
|
|
|
2023-10-09 16:32:59 +00:00
|
|
|
@app.errorhandler(404)
|
2023-10-16 10:12:36 +00:00
|
|
|
@get_user_params()
|
2023-10-09 16:32:59 +00:00
|
|
|
def page_not_found(e):
|
2024-01-17 06:08:27 +00:00
|
|
|
kwargs = {
|
|
|
|
'user_params': g.user_params,
|
|
|
|
'title': e,
|
|
|
|
'e': e
|
|
|
|
}
|
|
|
|
return render_template('error.html', **kwargs), 404
|
2023-10-16 10:12:36 +00:00
|
|
|
|
|
|
|
|
|
|
|
@app.errorhandler(405)
|
|
|
|
@get_user_params()
|
|
|
|
def method_not_allowed(e):
|
2024-01-17 06:08:27 +00:00
|
|
|
kwargs = {
|
|
|
|
'user_params': g.user_params,
|
|
|
|
'title': e,
|
|
|
|
'e': e
|
|
|
|
}
|
|
|
|
return render_template('error.html', **kwargs), 405
|
2023-10-09 16:32:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
@app.errorhandler(500)
|
2023-10-16 10:12:36 +00:00
|
|
|
@get_user_params()
|
|
|
|
def internal_error(e):
|
2024-01-17 06:08:27 +00:00
|
|
|
kwargs = {
|
|
|
|
'user_params': g.user_params,
|
|
|
|
'title': e,
|
|
|
|
'e': e
|
|
|
|
}
|
|
|
|
return render_template('error.html', **kwargs), 500
|
2023-10-09 16:32:59 +00:00
|
|
|
|
|
|
|
|
2023-10-09 07:21:37 +00:00
|
|
|
@app.before_request
|
|
|
|
def make_session_permanent():
|
|
|
|
session.permanent = True
|
|
|
|
|
|
|
|
|
|
|
|
@app.teardown_request
|
|
|
|
def _db_close(exc):
|
|
|
|
if not conn.is_closed():
|
|
|
|
conn.close()
|
|
|
|
|
|
|
|
|
2023-09-30 08:48:54 +00:00
|
|
|
@bp.route('/stats/<service>/', defaults={'serv': None})
|
|
|
|
@bp.route('/stats/<service>/<serv>')
|
|
|
|
@login_required
|
2023-10-16 10:12:36 +00:00
|
|
|
@check_services
|
|
|
|
@get_user_params()
|
2023-09-30 08:48:54 +00:00
|
|
|
def stats(service, serv):
|
2024-01-17 06:08:27 +00:00
|
|
|
kwargs = {
|
|
|
|
'autorefresh': 1,
|
|
|
|
'serv': serv,
|
|
|
|
'service': service,
|
|
|
|
'service_desc': sql.select_service(service),
|
|
|
|
'lang': g.user_params['lang']
|
|
|
|
}
|
|
|
|
return render_template('statsview.html', **kwargs)
|
2023-09-30 08:48:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
@bp.route('/stats/view/<service>/<server_ip>')
|
|
|
|
@login_required
|
2023-10-16 10:12:36 +00:00
|
|
|
@check_services
|
2023-09-30 08:48:54 +00:00
|
|
|
def show_stats(service, server_ip):
|
|
|
|
server_ip = common.is_ip_or_dns(server_ip)
|
|
|
|
|
|
|
|
if service in ('nginx', 'apache'):
|
|
|
|
return service_common.get_stat_page(server_ip, service)
|
|
|
|
else:
|
|
|
|
return service_haproxy.stat_page_action(server_ip)
|
|
|
|
|
|
|
|
|
|
|
|
@bp.route('/nettools')
|
|
|
|
@login_required
|
2023-10-16 10:12:36 +00:00
|
|
|
@get_user_params(1)
|
2023-09-30 08:48:54 +00:00
|
|
|
def nettools():
|
2024-02-04 07:28:17 +00:00
|
|
|
return render_template('nettools.html', lang=g.user_params['lang'])
|
2023-09-30 08:48:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
@bp.post('/nettols/<check>')
|
|
|
|
@login_required
|
|
|
|
def nettols_check(check):
|
|
|
|
server_from = common.checkAjaxInput(request.form.get('server_from'))
|
|
|
|
server_to = common.is_ip_or_dns(request.form.get('server_to'))
|
|
|
|
action = common.checkAjaxInput(request.form.get('nettools_action'))
|
|
|
|
port_to = common.checkAjaxInput(request.form.get('nettools_telnet_port_to'))
|
|
|
|
dns_name = common.checkAjaxInput(request.form.get('nettools_nslookup_name'))
|
|
|
|
dns_name = common.is_ip_or_dns(dns_name)
|
|
|
|
record_type = common.checkAjaxInput(request.form.get('nettools_nslookup_record_type'))
|
|
|
|
|
|
|
|
if check == 'icmp':
|
2023-10-01 11:35:01 +00:00
|
|
|
return nettools_mod.ping_from_server(server_from, server_to, action)
|
2023-09-30 08:48:54 +00:00
|
|
|
elif check == 'tcp':
|
2023-10-01 11:35:01 +00:00
|
|
|
return nettools_mod.telnet_from_server(server_from, server_to, port_to)
|
2023-09-30 08:48:54 +00:00
|
|
|
elif check == 'dns':
|
2023-10-01 11:35:01 +00:00
|
|
|
return nettools_mod.nslookup_from_server(server_from, dns_name, record_type)
|
2023-09-30 08:48:54 +00:00
|
|
|
else:
|
|
|
|
return 'error: Wrong check'
|
|
|
|
|
|
|
|
|
|
|
|
@bp.route('/history/<service>/<server_ip>')
|
|
|
|
@login_required
|
2023-10-16 10:12:36 +00:00
|
|
|
@get_user_params()
|
2023-09-30 08:48:54 +00:00
|
|
|
def service_history(service, server_ip):
|
2024-01-23 06:49:47 +00:00
|
|
|
history = ''
|
2023-09-30 08:48:54 +00:00
|
|
|
server_ip = common.checkAjaxInput(server_ip)
|
|
|
|
|
2023-12-16 07:15:59 +00:00
|
|
|
if service in ('haproxy', 'nginx', 'keepalived', 'apache', 'cluster'):
|
2023-09-30 08:48:54 +00:00
|
|
|
service_desc = sql.select_service(service)
|
2023-10-16 10:12:36 +00:00
|
|
|
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')
|
2023-12-16 07:15:59 +00:00
|
|
|
if service == 'cluster':
|
|
|
|
server_id = server_ip
|
|
|
|
else:
|
|
|
|
server_id = sql.select_server_id_by_ip(server_ip)
|
2023-10-16 10:12:36 +00:00
|
|
|
history = sql.select_action_history_by_server_id_and_service(server_id, service_desc.service)
|
2023-09-30 08:48:54 +00:00
|
|
|
elif service == 'server':
|
|
|
|
if roxywi_common.check_is_server_in_group(server_ip):
|
|
|
|
server_id = sql.select_server_id_by_ip(server_ip)
|
|
|
|
history = sql.select_action_history_by_server_id(server_id)
|
|
|
|
elif service == 'user':
|
|
|
|
history = sql.select_action_history_by_user_id(server_ip)
|
2024-01-23 06:49:47 +00:00
|
|
|
else:
|
|
|
|
abort(404, f'History not found')
|
2023-09-30 08:48:54 +00:00
|
|
|
|
2024-01-17 06:08:27 +00:00
|
|
|
kwargs = {
|
|
|
|
'user_subscription': roxywi_common.return_user_subscription(),
|
|
|
|
'users': sql.select_users(),
|
|
|
|
'serv': server_ip,
|
|
|
|
'service': service,
|
|
|
|
'history': history
|
|
|
|
}
|
|
|
|
|
|
|
|
return render_template('history.html', **kwargs)
|
2023-09-30 08:48:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
@bp.route('/servers')
|
|
|
|
@login_required
|
2023-10-16 10:12:36 +00:00
|
|
|
@get_user_params()
|
2023-09-30 08:48:54 +00:00
|
|
|
def servers():
|
|
|
|
roxywi_auth.page_for_admin(level=2)
|
|
|
|
|
|
|
|
user_group = roxywi_common.get_user_group(id=1)
|
2024-01-17 06:08:27 +00:00
|
|
|
kwargs = {
|
|
|
|
'h2': 1,
|
|
|
|
'users': sql.select_users(group=user_group),
|
|
|
|
'groups': sql.select_groups(),
|
|
|
|
'servers': roxywi_common.get_dick_permit(virt=1, disable=0, only_group=1),
|
|
|
|
'roles': sql.select_roles(),
|
|
|
|
'sshs': sql.select_ssh(group=user_group),
|
|
|
|
'masters': sql.select_servers(get_master_servers=1, uuid=g.user_params['user_uuid']),
|
|
|
|
'group': roxywi_common.get_user_group(id=1),
|
|
|
|
'services': sql.select_services(),
|
|
|
|
'timezones': pytz.all_timezones,
|
|
|
|
'guide_me': 1,
|
|
|
|
'settings': sql.get_setting('', all=1),
|
|
|
|
'backups': sql.select_backups(),
|
|
|
|
's3_backups': sql.select_s3_backups(),
|
|
|
|
'page': 'servers.py',
|
|
|
|
'ldap_enable': sql.get_setting('ldap_enable'),
|
|
|
|
'gits': sql.select_gits(),
|
|
|
|
'is_needed_tool': common.is_tool('ansible'),
|
|
|
|
'user_roles': sql.select_user_roles_by_group(user_group),
|
|
|
|
'user_subscription': roxywi_common.return_user_subscription(),
|
|
|
|
'lang': g.user_params['lang']
|
|
|
|
}
|
|
|
|
|
|
|
|
return render_template('servers.html', **kwargs)
|
2023-09-30 08:48:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
@bp.route('/internal/show_version')
|
|
|
|
@cache.cached()
|
|
|
|
def show_roxywi_version():
|
|
|
|
return render_template('ajax/check_version.html', versions=roxy.versions())
|