diff --git a/README.md b/README.md index 99d5459d..4b516d23 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,6 @@ Web interface (user-friendly web GUI, alerting, monitoring and secure) for manag # Features: 1. Installing and updating HAProxy, Nginx, Apache and Keepalived with Roxy-WI as a system service 2. Installing and updating HAProxy and Nginx with Roxy-WI as a Docker service -3. Installing and updating Grafana, Prometheus servers with Roxy-WI 4. Installing and updating HAProxy, Nginx, Apache, Keepalived and Node exporters with Roxy-WI 6. Downloading, updating and formatting GeoIP to the acceptable format for HAProxy with Roxy-WI 7. Dynamic change of Maxconn, Black/white lists, add, edit or delete backend's IP address and port with saving changes to the config file diff --git a/app/api/routes/routes.py b/app/api/routes/routes.py index a28be353..67f69766 100644 --- a/app/api/routes/routes.py +++ b/app/api/routes/routes.py @@ -32,6 +32,12 @@ def before_request(): def register_api(view, endpoint, url, pk='listener_id', pk_type='int'): + view_func = view.as_view(endpoint) + bp.add_url_rule(url, view_func=view_func, methods=['POST']) + bp.add_url_rule(f'{url}/<{pk_type}:{pk}>', view_func=view_func, methods=['GET', 'PUT', 'PATCH', 'DELETE']) + + +def register_api_for_not_api(view, endpoint, url, pk='listener_id', pk_type='int'): view_func = view.as_view(endpoint, True) bp.add_url_rule(url, view_func=view_func, methods=['POST']) bp.add_url_rule(f'{url}/<{pk_type}:{pk}>', view_func=view_func, methods=['GET', 'PUT', 'PATCH', 'DELETE']) @@ -68,7 +74,7 @@ register_api(S3BackupView, 'backup_s3', '/server/backup/s3', 'backup_id') register_api(GitBackupView, 'backup_git', '/server/backup/git', 'backup_id') bp.add_url_rule('/server//ip', view_func=ServerIPView.as_view('server_ip_ip'), methods=['GET']) bp.add_url_rule('/server//ip', view_func=ServerIPView.as_view('server_ip'), methods=['GET']) -register_api(CredView, 'cred', '/server/cred', 'cred_id') +register_api_for_not_api(CredView, 'cred', '/server/cred', 'cred_id') bp.add_url_rule('/server/creds', view_func=CredsView.as_view('creds'), methods=['GET']) bp.add_url_rule('/server/portscanner/', view_func=PortScannerView.as_view('port_scanner_ip'), methods=['GET', 'POST']) bp.add_url_rule('/server/portscanner/', view_func=PortScannerView.as_view('port_scanner'), methods=['GET', 'POST']) diff --git a/app/create_db.py b/app/create_db.py index 08bac055..1413c560 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -436,8 +436,6 @@ def default_values(): {'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'}, ] @@ -613,6 +611,16 @@ def update_db_v_8_0_2(): print("An error occurred:", e) +def update_db_v_8_0_2_1(): + try: + RoxyTool.delete().where(RoxyTool.name == 'prometheus').execute() + RoxyTool.delete().where(RoxyTool.name == 'grafana-server').execute() + except Exception as e: + print("An error occurred:", e) + else: + print("Updating... DB has been updated to version 8.0.2-1") + + def update_ver(): try: Version.update(version='8.0.2').execute() @@ -640,4 +648,5 @@ def update_all(): update_db_v_7_4() update_db_v_8() update_db_v_8_0_2() + update_db_v_8_0_2_1() update_ver() diff --git a/app/modules/service/exporter_installation.py b/app/modules/service/exporter_installation.py index 4040a17b..7d44396f 100644 --- a/app/modules/service/exporter_installation.py +++ b/app/modules/service/exporter_installation.py @@ -4,11 +4,10 @@ import app.modules.db.sql as sql from app.modules.service.installation import run_ansible -def generate_exporter_inc(server_ip: str, ext_prom: int, ver: str, exporter: str) -> object: +def generate_exporter_inc(server_ip: str,ver: str, exporter: str) -> object: inv = {"server": {"hosts": {}}} server_ips = [server_ip] inv['server']['hosts'][server_ip] = { - 'EXP_PROM': ext_prom, f'{exporter}_exporter_version': ver, 'service': f'{exporter} exporter' } @@ -28,10 +27,10 @@ def generate_exporter_inc(server_ip: str, ext_prom: int, ver: str, exporter: str return inv, server_ips -def install_exporter(server_ip: str, ver: str, ext_prom: int, exporter: str) -> object: +def install_exporter(server_ip: str, ver: str, exporter: str) -> object: service = f'{exporter.title()} exporter' try: - inv, server_ips = generate_exporter_inc(server_ip, ext_prom, ver, exporter) + inv, server_ips = generate_exporter_inc(server_ip, ver, exporter) return run_ansible(inv, server_ips, f'{exporter}_exporter'), 201 except Exception as e: raise Exception(f'error: Cannot install {service}: {e}') diff --git a/app/modules/service/installation.py b/app/modules/service/installation.py index 90069920..05648091 100644 --- a/app/modules/service/installation.py +++ b/app/modules/service/installation.py @@ -59,15 +59,6 @@ def generate_geoip_inv(server_ip: str, installed_service: str, geoip_update: int return inv, server_ips -def generate_grafana_inv() -> object: - inv = {"server": {"hosts": {}}} - server_ips = [] - inv['server']['hosts']['localhost'] = {} - server_ips.append('localhost') - - return inv, server_ips - - def generate_kp_inv(json_data: json, installed_service) -> object: inv = {"server": {"hosts": {}}} server_ips = [] diff --git a/app/routes/admin/routes.py b/app/routes/admin/routes.py index 0a7ef5a5..cdcb13d5 100644 --- a/app/routes/admin/routes.py +++ b/app/routes/admin/routes.py @@ -1,5 +1,5 @@ import pytz -from flask import render_template, request, g +from flask import render_template, g from flask_jwt_extended import jwt_required from app import scheduler @@ -13,7 +13,6 @@ from app.middleware import get_user_params import app.modules.roxywi.roxy as roxy import app.modules.roxywi.auth as roxywi_auth import app.modules.roxywi.common as roxywi_common -import app.modules.tools.smon as smon_mod import app.modules.tools.common as tools_common import app.modules.server.ssh as ssh_mod from app.views.admin.views import SettingsView diff --git a/app/routes/install/routes.py b/app/routes/install/routes.py index af1f6741..42405dca 100644 --- a/app/routes/install/routes.py +++ b/app/routes/install/routes.py @@ -50,13 +50,12 @@ def install_exporter(exporter): 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']) if exporter not in ('haproxy', 'nginx', 'apache', 'keepalived', 'node'): return jsonify({'status': 'failed', 'error': 'Wrong exporter'}) try: - return exp_installation.install_exporter(server_ip, ver, ext_prom, exporter) + return exp_installation.install_exporter(server_ip, ver, exporter) except Exception as e: return jsonify({'status': 'failed', 'error': f'Cannot install {exporter.title()} exporter: {e}'}) @@ -67,15 +66,6 @@ def get_exporter_version(exporter, server_ip): return service_common.get_exp_version(server_ip, exporter) -@bp.route('/grafana') -def install_grafana(): - try: - inv, server_ips = service_mod.generate_grafana_inv() - return service_mod.run_ansible(inv, server_ips, 'grafana'), 201 - except Exception as e: - return f'{e}' - - @bp.post('/waf//') def install_waf(service, server_ip): server_ip = common.is_ip_or_dns(server_ip) diff --git a/app/scripts/ansible/roles/grafana.yml b/app/scripts/ansible/roles/grafana.yml deleted file mode 100644 index a3eda312..00000000 --- a/app/scripts/ansible/roles/grafana.yml +++ /dev/null @@ -1,97 +0,0 @@ -- hosts: localhost - become: yes - become_method: sudo - roles: - - role: cloudalchemy.prometheus - environment: - http_proxy: "{{PROXY}}" - https_proxy: "{{PROXY}}" - vars: - prometheus_targets: - node: - - targets: - - "{{ansible_hostname}}:9100" - - - role: cloudalchemy.grafana - environment: - http_proxy: "{{PROXY}}" - https_proxy: "{{PROXY}}" - vars: - grafana_security: - admin_user: admin - admin_password: admin - grafana_datasources: - - name: prometheus - type: prometheus - url: "http://{{ansible_default_ipv4.address}}:9090" - basicAuth: false - grafana_dashboards: - - dashboard_id: 2428 - revision_id: 7 - datasource: prometheus - - dashboard_id: 11879 - revision_id: 3 - datasource: prometheus - - dashboard_id: 11074 - revision_id: 9 - datasource: prometheus - tasks: - - name: populate service facts - service_facts: - - - name: Open stat port for firewalld - firewalld: - port: "{{ item }}/tcp" - state: enabled - permanent: yes - immediate: yes - ignore_errors: yes - no_log: True - debugger: never - when: (ansible_facts['os_family'] == "RedHat" or ansible_facts['os_family'] == 'CentOS') and ansible_facts.services["firewalld.service"]['state'] == "running" - with_items: [ "3000", "9090" ] - - - name: Open stat port for iptables - iptables: - chain: INPUT - destination_port: "{{ item }}" - jump: ACCEPT - protocol: tcp - ignore_errors: yes - with_items: [ "3000", "9090" ] - - - name: Ensure group "grafana" exists - ansible.builtin.group: - name: grafana - state: present - - - name: Add the Grafana user - user: - name: grafana - shell: /sbin/nologin - groups: grafana - append: yes - - - name: Create a directory if it does not exist - file: - path: "{{ item }}" - state: directory - mode: '0755' - owner: grafana - with_items: - - /var/lib/grafana - - /var/log/grafana - - /etc/grafana - - - name: Create grafana.ini - file: - path: /etc/grafana/grafana.ini - owner: grafana - group: grafana - mode: '0644' - state: touch - - - name: Restart service Grafana, in all cases - service: - name: grafana-server - state: restarted \ No newline at end of file diff --git a/app/templates/ajax/load_services.html b/app/templates/ajax/load_services.html index e1bf51cd..48f63a61 100644 --- a/app/templates/ajax/load_services.html +++ b/app/templates/ajax/load_services.html @@ -7,8 +7,6 @@ 'roxy-wi-smon': { 'name': 'SMON', 'desc': lang.admin_page.desc.smon_desc }, 'roxy-wi-socket': { 'name': 'Socket', 'desc': lang.admin_page.desc.socket_desc }, 'roxy-wi-prometheus-exporter': { 'name': 'Prometheus exporter', 'desc': 'Prometheus exporter exports Roxy-WI metrics' }, - 'prometheus': { 'name': 'Prometheus', 'desc': 'Prometheus server' }, - 'grafana-server': { 'name': 'Grafana', 'desc': 'Grafana server' }, 'fail2ban': { 'name': 'Fail2ban', 'desc': 'Fail2ban scans log files (e.g. /var/log/apache/error_log) and bans IPs that show the malicious signs' }, 'rabbitmq-server': { 'name': 'RabbitMQ', 'desc': 'RabbitMQ server' }, } @@ -41,9 +39,7 @@ {% if 'is not installed' in service.2['current_version'] or not service.2['current_version'] or service.2['current_version'] == '0' %} - {% if service.0 in ('prometheus', 'grafana-server') %} - {{lang.words.install|title()}} - {% elif service.0 in ('rabbitmq-server', 'fail2ban') %} + {% if service.0 in ('rabbitmq-server', 'fail2ban') %} {{lang.words.install|title()}} {% else %} {{lang.words.install|title()}} diff --git a/app/templates/install.html b/app/templates/install.html index c79181f2..0f4a294b 100644 --- a/app/templates/install.html +++ b/app/templates/install.html @@ -145,46 +145,12 @@ {% else %} - {% if g.user_params['role']|int() == 1 %} - - - - - - - - - - - - - - - - -

Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}

{{lang.words.current2|title()}} {{lang.words.installation}}{{lang.words.available|title()}} {{lang.words.versions}}{{lang.words.note|title()}}
- {% if grafana == "active" %} - Grafana {{lang.words.and}} Prometheus {{lang.admin_page.desc.been_installed}} - {% else %} - {{lang.admin_page.desc.there_are_no}} - {% endif %} - - {{lang.admin_page.desc.latest_repo}} Grafana {{lang.words.and}} Prometheus - - {{lang.admin_page.desc.before_install}} Grafana {{lang.words.and}} Prometheus {{lang.words.servers}} - - {% if grafana != "active" %} - {{lang.words.install|title()}} - {% endif %} -
- {% endif %} - @@ -203,7 +169,6 @@ {% endfor %} - @@ -215,7 +180,6 @@ - @@ -234,7 +198,6 @@ {% endfor %} - @@ -246,7 +209,6 @@ - @@ -265,7 +227,6 @@ {% endfor %} - @@ -277,7 +238,6 @@ - @@ -296,7 +256,6 @@ {% endfor %} - @@ -308,7 +267,6 @@ - @@ -327,7 +285,6 @@ {% endfor %} - diff --git a/app/templates/languages/en.html b/app/templates/languages/en.html index 5ca555b0..abb0e489 100644 --- a/app/templates/languages/en.html +++ b/app/templates/languages/en.html @@ -430,7 +430,6 @@ "desc": { "latest_repo": "Roxy-WI will try to install the latest version of the service from the official repository", "install_as_docker": "Install service as a Docker container", - "ext_prom": "This exporter will be used by an external Prometheus. Also use this checkbox if you update the Exporter.", "no_ansible": "You have not installed", "before_install": "Before installing any exporters, first install", "been_installed": "servers have been installed", diff --git a/app/templates/languages/fr.html b/app/templates/languages/fr.html index 32b32081..ecb7d947 100644 --- a/app/templates/languages/fr.html +++ b/app/templates/languages/fr.html @@ -430,7 +430,6 @@ "desc": { "latest_repo": "Roxy-WI va essayer d\'installer la dernière version du service à partir du dépôt officiel.", "install_as_docker": "Installer le service comme un conteneur Docker", - "ext_prom": "Cet Exporter sera utilisé par un Prometheus externe. Utilisez également cette case à cocher si vous mettez à jour l\'Exporter", "no_ansible": "Vous ne l\'avez pas installé", "before_install": "Avant d\'installer l\'Exporter, installez le d\'abord", "been_installed": "les serveurs ont été installés", diff --git a/app/templates/languages/pt-br.html b/app/templates/languages/pt-br.html index 870f9707..7fae3694 100644 --- a/app/templates/languages/pt-br.html +++ b/app/templates/languages/pt-br.html @@ -430,7 +430,6 @@ "desc": { "latest_repo": "O Roxy-WI tentará instalar a versão mais recente do serviço do repositório oficial", "install_as_docker": "Instalar serviço como um container do Docker", - "ext_prom": "Este exportador será usado para um Prometheus externo. Usa este checkbox para atualizar o Exporter.", "no_ansible": "Você não instalou", "before_install": "Antes de instalar exportadores, primeiro instale", "been_installed": "servidores instalados", diff --git a/app/templates/languages/ru.html b/app/templates/languages/ru.html index 07769bd6..003dc94b 100644 --- a/app/templates/languages/ru.html +++ b/app/templates/languages/ru.html @@ -430,7 +430,6 @@ "desc": { "latest_repo": "Roxy-WI попытается установить последнюю версию сервиса из официального репозитория", "install_as_docker": "Установить сервис как контейнер Docker", - "ext_prom": "Этот экспортер будет использоваться внешним Prometheus. Также используйте этот флажок, если вы обновляете экспортер.", "no_ansible": "You have not installed", "before_install": "Прежде чем устанавливать какие-либо экспортеры, сначала установите", "been_installed": "сервера были установлены",

HAProxy Exporter

{{lang.words.current2|title()}} {{lang.words.installation}} {{lang.words.available|title()}} {{lang.words.versions}} {{lang.words.server|title()}}{{lang.words.external|title()}} Prometheus
{{ checkbox('haproxy_ext_prom', title=lang.admin_page.desc.ext_prom) }} {{lang.words.install|title()}} {{lang.words.current2|title()}} {{lang.words.installation}} {{lang.words.available|title()}} {{lang.words.versions}} {{lang.words.server|title()}}{{lang.words.external|title()}} Prometheus
{{ checkbox('nginx_ext_prom', title=lang.admin_page.desc.ext_prom) }} {{lang.words.install|title()}} {{lang.words.current2|title()}} {{lang.words.installation}} {{lang.words.available|title()}} {{lang.words.versions}} {{lang.words.server|title()}}{{lang.words.external|title()}} Prometheus
{{ checkbox('apache_ext_prom', title=lang.admin_page.desc.ext_prom) }} {{lang.words.install|title()}} {{lang.words.current2|title()}} {{lang.words.installation}} {{lang.words.available|title()}} {{lang.words.versions}} {{lang.words.server|title()}}{{lang.words.external|title()}} Prometheus
{{ checkbox('keepalived_ext_prom', title=lang.admin_page.desc.ext_prom) }} {{lang.words.install|title()}} {{lang.words.current2|title()}} {{lang.words.installation}} {{lang.words.available|title()}} {{lang.words.versions}} {{lang.words.server|title()}}{{lang.words.external|title()}} Prometheus
{{ checkbox('node_ext_prom', title=lang.admin_page.desc.ext_prom) }} {{lang.words.install|title()}}