2024-06-16 05:02:08 +00:00
|
|
|
from flask import render_template, request, g, jsonify
|
2024-08-02 09:50:02 +00:00
|
|
|
from flask_jwt_extended import jwt_required
|
2023-09-17 09:42:39 +00:00
|
|
|
|
|
|
|
from app.routes.install import bp
|
2024-08-02 09:50:02 +00:00
|
|
|
from app.middleware import get_user_params
|
2024-02-16 17:47:02 +00:00
|
|
|
import app.modules.db.sql as sql
|
2024-04-04 11:30:07 +00:00
|
|
|
import app.modules.db.waf as waf_sql
|
2024-02-16 17:47:02 +00:00
|
|
|
import app.modules.common.common as common
|
|
|
|
import app.modules.roxywi.auth as roxywi_auth
|
|
|
|
import app.modules.server.server as server_mod
|
|
|
|
import app.modules.service.common as service_common
|
2024-02-04 07:28:17 +00:00
|
|
|
import app.modules.service.installation as service_mod
|
2024-02-16 17:47:02 +00:00
|
|
|
import app.modules.service.exporter_installation as exp_installation
|
2024-08-02 09:50:02 +00:00
|
|
|
from app.views.install.views import InstallView
|
2023-09-17 09:42:39 +00:00
|
|
|
|
|
|
|
|
2024-08-02 09:50:02 +00:00
|
|
|
bp.add_url_rule(
|
|
|
|
'/<any(haproxy, nginx, apache, keepalived):service>',
|
|
|
|
view_func=InstallView.as_view('install'),
|
|
|
|
methods=['POST'],
|
|
|
|
defaults={'server_id': None}
|
|
|
|
)
|
|
|
|
bp.add_url_rule(
|
|
|
|
'/<any(haproxy, nginx, apache, keepalived):service>/<server_id>',
|
|
|
|
view_func=InstallView.as_view('install_ip'),
|
|
|
|
methods=['POST'],
|
|
|
|
)
|
|
|
|
|
2023-09-17 09:42:39 +00:00
|
|
|
@bp.before_request
|
2024-08-02 09:50:02 +00:00
|
|
|
@jwt_required()
|
2023-09-17 09:42:39 +00:00
|
|
|
def before_request():
|
2024-02-16 17:47:02 +00:00
|
|
|
""" Protect all the admin endpoints. """
|
2023-09-17 09:42:39 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@bp.route('')
|
2023-10-16 10:12:36 +00:00
|
|
|
@get_user_params()
|
2023-09-17 09:42:39 +00:00
|
|
|
def install_monitoring():
|
|
|
|
roxywi_auth.page_for_admin(level=2)
|
2024-01-17 06:08:27 +00:00
|
|
|
kwargs = {
|
|
|
|
'is_needed_tool': common.is_tool('ansible'),
|
|
|
|
'geoip_country_codes': sql.select_geoip_country_codes(),
|
|
|
|
'lang': g.user_params['lang']
|
|
|
|
}
|
|
|
|
return render_template('install.html', **kwargs)
|
2023-09-17 09:42:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
@bp.post('/exporter/<exporter>')
|
|
|
|
def install_exporter(exporter):
|
2024-06-16 05:02:08 +00:00
|
|
|
json_data = request.get_json()
|
|
|
|
server_ip = common.is_ip_or_dns(json_data['server_ip'])
|
|
|
|
ver = common.checkAjaxInput(json_data['exporter_v'])
|
|
|
|
ext_prom = common.checkAjaxInput(json_data['ext_prom'])
|
2023-09-17 09:42:39 +00:00
|
|
|
|
2024-02-04 07:28:17 +00:00
|
|
|
if exporter not in ('haproxy', 'nginx', 'apache', 'keepalived', 'node'):
|
2024-06-16 05:02:08 +00:00
|
|
|
return jsonify({'status': 'failed', 'error': 'Wrong exporter'})
|
2023-09-17 09:42:39 +00:00
|
|
|
|
2024-02-04 07:28:17 +00:00
|
|
|
try:
|
|
|
|
return exp_installation.install_exporter(server_ip, ver, ext_prom, exporter)
|
|
|
|
except Exception as e:
|
2024-06-16 05:02:08 +00:00
|
|
|
return jsonify({'status': 'failed', 'error': f'Cannot install {exporter.title()} exporter: {e}'})
|
2024-02-04 07:28:17 +00:00
|
|
|
|
2023-09-17 09:42:39 +00:00
|
|
|
|
|
|
|
@bp.route('/exporter/<exporter>/version/<server_ip>')
|
|
|
|
def get_exporter_version(exporter, server_ip):
|
|
|
|
server_ip = common.is_ip_or_dns(server_ip)
|
|
|
|
return service_common.get_exp_version(server_ip, exporter)
|
|
|
|
|
|
|
|
|
|
|
|
@bp.route('/grafana')
|
|
|
|
def install_grafana():
|
|
|
|
try:
|
2024-05-15 12:38:05 +00:00
|
|
|
inv, server_ips = service_mod.generate_grafana_inv()
|
|
|
|
return service_mod.run_ansible(inv, server_ips, 'grafana'), 201
|
2023-09-17 09:42:39 +00:00
|
|
|
except Exception as e:
|
|
|
|
return f'{e}'
|
|
|
|
|
|
|
|
|
2023-09-19 06:50:10 +00:00
|
|
|
@bp.post('/waf/<service>/<server_ip>')
|
2023-09-17 09:42:39 +00:00
|
|
|
def install_waf(service, server_ip):
|
|
|
|
server_ip = common.is_ip_or_dns(server_ip)
|
|
|
|
|
2024-05-18 07:16:27 +00:00
|
|
|
try:
|
|
|
|
inv, server_ips = service_mod.generate_waf_inv(server_ip, service)
|
|
|
|
except Exception as e:
|
2024-06-16 05:02:08 +00:00
|
|
|
return jsonify({'status': 'failed', 'error': f'Cannot create inventory: {e}'})
|
2024-05-18 07:16:27 +00:00
|
|
|
try:
|
2024-05-18 10:47:53 +00:00
|
|
|
ansible_status = service_mod.run_ansible(inv, server_ips, f'waf_{service}'), 201
|
2024-05-18 07:16:27 +00:00
|
|
|
except Exception as e:
|
2024-06-16 05:02:08 +00:00
|
|
|
return jsonify({'status': 'failed', 'error': f'Cannot install WAF: {e}'})
|
2024-05-18 07:16:27 +00:00
|
|
|
|
2023-09-17 09:42:39 +00:00
|
|
|
if service == 'haproxy':
|
2024-04-04 11:30:07 +00:00
|
|
|
try:
|
|
|
|
waf_sql.insert_waf_metrics_enable(server_ip, "0")
|
|
|
|
waf_sql.insert_waf_rules(server_ip)
|
2023-09-17 09:42:39 +00:00
|
|
|
except Exception as e:
|
2024-06-16 05:02:08 +00:00
|
|
|
return jsonify({'status': 'failed', 'error': f'Cannot enable WAF: {e}'})
|
2023-09-17 09:42:39 +00:00
|
|
|
elif service == 'nginx':
|
2024-04-04 11:30:07 +00:00
|
|
|
try:
|
|
|
|
waf_sql.insert_nginx_waf_rules(server_ip)
|
|
|
|
waf_sql.insert_waf_nginx_server(server_ip)
|
2023-09-17 09:42:39 +00:00
|
|
|
except Exception as e:
|
2024-06-16 05:02:08 +00:00
|
|
|
return jsonify({'status': 'failed', 'error': f'Cannot enable WAF: {e}'})
|
2023-09-17 09:42:39 +00:00
|
|
|
else:
|
2024-06-16 05:02:08 +00:00
|
|
|
return jsonify({'status': 'failed', 'error': 'Wrong service'})
|
2023-09-17 09:42:39 +00:00
|
|
|
|
2024-04-04 11:30:07 +00:00
|
|
|
return ansible_status
|
|
|
|
|
2023-09-17 09:42:39 +00:00
|
|
|
|
|
|
|
@bp.post('/geoip')
|
|
|
|
def install_geoip():
|
2024-06-16 05:02:08 +00:00
|
|
|
json_data = request.get_json()
|
|
|
|
server_ip = common.is_ip_or_dns(json_data['server_ip'])
|
|
|
|
geoip_update = common.checkAjaxInput(json_data['update'])
|
|
|
|
service = common.checkAjaxInput(json_data['service'])
|
2023-09-17 09:42:39 +00:00
|
|
|
|
|
|
|
try:
|
2024-05-15 12:38:05 +00:00
|
|
|
inv, server_ips = service_mod.generate_geoip_inv(server_ip, service, geoip_update)
|
|
|
|
return service_mod.run_ansible(inv, server_ips, f'{service}_geoip'), 201
|
2023-09-17 09:42:39 +00:00
|
|
|
except Exception as e:
|
2024-06-16 05:02:08 +00:00
|
|
|
return jsonify({'status': 'failed', 'error': f'Cannot install GeoIP: {e}'})
|
2023-09-17 09:42:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
@bp.route('/geoip/<service>/<server_ip>')
|
|
|
|
def check_geoip(service, server_ip):
|
|
|
|
server_ip = common.is_ip_or_dns(server_ip)
|
|
|
|
|
|
|
|
if service not in ('haproxy', 'nginx'):
|
|
|
|
return 'error: Wrong service'
|
|
|
|
|
|
|
|
service_dir = common.return_nice_path(sql.get_setting(f'{service}_dir'))
|
2024-03-03 07:11:48 +00:00
|
|
|
cmd = f"ls {service_dir}geoip/"
|
2023-09-17 09:42:39 +00:00
|
|
|
return server_mod.ssh_command(server_ip, cmd)
|