From 20518efd954bf737f5ecea645eb8f1b563e682b5 Mon Sep 17 00:00:00 2001 From: Pavel Loginov Date: Tue, 15 Dec 2020 12:34:02 +0600 Subject: [PATCH] v4.5.6.0 Changelog: https://haproxy-wi.org/changelog.py#4_5_6 --- app/add.py | 192 +++++++++++------- app/create_db.py | 9 +- app/options.py | 8 +- .../ansible/roles/haproxy/tasks/main.yml | 11 + app/sql.py | 2 +- app/templates/add.html | 97 +++++++-- app/templates/include/admin_servers.html | 19 +- app/templates/include/input_macros.html | 9 +- app/templates/servers.html | 4 +- inc/add.js | 115 +++++++++++ inc/overview.js | 28 ++- inc/script.js | 8 +- inc/style.css | 7 + inc/users.js | 37 +++- 14 files changed, 422 insertions(+), 124 deletions(-) diff --git a/app/add.py b/app/add.py index c56b91a7..818f74e9 100644 --- a/app/add.py +++ b/app/add.py @@ -10,55 +10,51 @@ template = env.get_template('add.html') form = funct.form serv = form.getvalue('serv') -if form.getvalue('add'): - c = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - c["restart"] = form.getvalue('serv') - print(c) - print('Content-type: text/html\n') funct.check_login() funct.page_for_admin(level=3) -try: - user, user_id, role, token, servers = funct.get_users_params() - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - group = cookie.get('group') - user_group = group.value -except Exception: - pass - -dir = os.path.dirname(os.getcwd())+"/"+sql.get_setting('lists_path') -white_dir = os.path.dirname(os.getcwd())+"/"+sql.get_setting('lists_path')+"/"+user_group+"/white" -black_dir = os.path.dirname(os.getcwd())+"/"+sql.get_setting('lists_path')+"/"+user_group+"/black" -if not os.path.exists(dir): - os.makedirs(dir) -if not os.path.exists(dir+"/"+user_group): - os.makedirs(dir+"/"+user_group) -if not os.path.exists(white_dir): - os.makedirs(white_dir) -if not os.path.exists(black_dir): - os.makedirs(black_dir) +if form.getvalue('mode') is None and form.getvalue('new_userlist') is None: + try: + user, user_id, role, token, servers = funct.get_users_params() + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + group = cookie.get('group') + user_group = group.value + except Exception as e: + print(str(e)) -white_lists = funct.get_files(dir=white_dir, format="lst") -black_lists = funct.get_files(dir=black_dir, format="lst") + dir = os.path.dirname(os.getcwd())+"/"+sql.get_setting('lists_path') + white_dir = os.path.dirname(os.getcwd())+"/"+sql.get_setting('lists_path')+"/"+user_group+"/white" + black_dir = os.path.dirname(os.getcwd())+"/"+sql.get_setting('lists_path')+"/"+user_group+"/black" + if not os.path.exists(dir): + os.makedirs(dir) + if not os.path.exists(dir+"/"+user_group): + os.makedirs(dir+"/"+user_group) + if not os.path.exists(white_dir): + os.makedirs(dir) + if not os.path.exists(black_dir): + os.makedirs(black_dir) -template = template.render(title="Add: ", - role=role, - user=user, - selects=servers, - add=form.getvalue('add'), - conf_add=form.getvalue('conf'), - group=user_group, - versions=funct.versions(), - options=sql.select_options(), - saved_servers=sql.select_saved_servers(), - white_lists=white_lists, - black_lists=black_lists, - token=token) -print(template) + white_lists = funct.get_files(dir=white_dir, format="lst") + black_lists = funct.get_files(dir=black_dir, format="lst") -if form.getvalue('mode') is not None: + template = template.render(title="Add: ", + role=role, + user=user, + selects=servers, + add=form.getvalue('add'), + conf_add=form.getvalue('conf'), + group=user_group, + versions=funct.versions(), + options=sql.select_options(), + saved_servers=sql.select_saved_servers(), + white_lists=white_lists, + black_lists=black_lists, + token=token) + print(template) + +elif form.getvalue('mode') is not None: cert_path = sql.get_setting('cert_path') haproxy_dir = sql.get_setting('haproxy_dir') port = form.getvalue('port') @@ -72,6 +68,8 @@ if form.getvalue('mode') is not None: ssl = "" ssl_check = "" backend = "" + acl = "" + servers_split = "" if form.getvalue('balance') is not None: balance = " balance " + form.getvalue('balance') + "\n" @@ -168,8 +166,47 @@ if form.getvalue('mode') is not None: options_split += cookie if form.getvalue('dynamic'): options_split += " dynamic-cookie-key " + form.getvalue('dynamic-cookie-key')+"\n" - - servers_split = "" + + if form.getvalue('acl_if'): + acl_if = form.getlist('acl_if') + acl_value = form.getlist('acl_value') + acl_then = form.getlist('acl_then') + acl_then_values = form.getlist('acl_then_value') + i = 0 + + for a in acl_if: + + acl_then_value = '' if acl_then_values[i] == 'IsEmptY' else acl_then_values[i] + + try: + if a == '1': + acl_if_word = 'hdr_beg(host) -i ' + elif a == '2': + acl_if_word = 'hdr_end(host) -i ' + elif a == '3': + acl_if_word = 'path_beg -i ' + elif a == '4': + acl_if_word = 'path_end -i ' + else: + acl_if_word = '' + + if acl_then[i] == '5': + acl += ' use_backend ' + elif acl_then[i] == '2': + acl += ' http-request redirect location ' + elif acl_then[i] == '3': + acl += ' http-request allow' + acl_then_value = '' + elif acl_then[i] == '4': + acl += ' http-request deny' + acl_then_value = '' + + acl += acl_then_value + ' if { ' + acl_if_word + acl_value[i] + ' } \n' + except Exception: + acl = '' + + i += 1 + if form.getvalue('servers') is not None: servers = form.getlist('servers') server_port = form.getlist('server_port') @@ -210,9 +247,9 @@ if form.getvalue('mode') is not None: compression_s = "" cache_s = "" cache_set = "" - filter = "" + filter_com = "" if compression == "1" or cache == "2": - filter = " filter compression\n" + filter_com = " filter compression\n" if cache == "2": cache_s = " http-request cache-use "+end_name+"\n http-response cache-store "+end_name+"\n" cache_set = "cache "+end_name+"\n total-max-size 4\n max-age 240\n" @@ -224,7 +261,7 @@ if form.getvalue('mode') is not None: waf = " filter spoe engine modsecurity config "+haproxy_dir+"/waf.conf\n" waf += " http-request deny if { var(txn.modsec.code) -m int gt 0 }\n" - config_add = "\n" + name + "\n" + bind + mode + maxconn + balance + options_split + cache_s + filter + compression_s + waf + backend + servers_split + "\n" + cache_set + "\n" + config_add = "\n" + name + "\n" + bind + mode + maxconn + balance + options_split + cache_s + filter_com + compression_s + waf + acl + backend + servers_split + "\n" + cache_set + "\n" if form.getvalue('new_userlist') is not None: name = "userlist "+form.getvalue('new_userlist') + "\n" @@ -241,7 +278,7 @@ if form.getvalue('new_userlist') is not None: passwords = form.getlist('userlist-password') userlist_user_group = form.getlist('userlist-user-group') i = 0 - print(userlist_user_group) + for user in users: try: group = ' groups '+userlist_user_group[i] @@ -251,34 +288,35 @@ if form.getvalue('new_userlist') is not None: i += 1 config_add = "\n" + name + new_userlist_groups + new_users_list - -try: - funct.check_is_server_in_group(serv) - if config_add: - hap_configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') - cfg = hap_configs_dir + serv + "-" + funct.get_data('config') + ".cfg" - - funct.get_config(serv, cfg) - try: - with open(cfg, "a") as conf: - conf.write(config_add) - except IOError: - print("error: Can't read import config file") - - funct.logging(serv, "add.py add new %s" % name) - print('
') - - MASTERS = sql.is_master(serv) - for master in MASTERS: - if master[0] is not None: - funct.upload_and_restart(master[0], cfg) - - stderr = funct.upload_and_restart(serv, cfg, just_save="save") - if stderr: - print('
%s
X
' % stderr) - else: - print('' % (name, config_add, serv)) - print('
') -except Exception: - pass +if form.getvalue('generateconfig') is None: + try: + funct.check_is_server_in_group(serv) + if config_add: + hap_configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') + cfg = hap_configs_dir + serv + "-" + funct.get_data('config') + ".cfg" + + funct.get_config(serv, cfg) + try: + with open(cfg, "a") as conf: + conf.write(config_add) + except IOError: + print("error: Can't read import config file") + + funct.logging(serv, "add.py add new %s" % name) + + MASTERS = sql.is_master(serv) + for master in MASTERS: + if master[0] is not None: + funct.upload_and_restart(master[0], cfg) + + stderr = funct.upload_and_restart(serv, cfg, just_save="save") + if stderr: + print(stderr) + else: + print(name) + + except Exception: + pass +else: + print(config_add) diff --git a/app/create_db.py b/app/create_db.py index d12ee9c1..df476157 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -701,15 +701,16 @@ def update_db_v_4_5_4(**kwargs): pass else: if kwargs.get('silent') != 1: - print('DB was update to 4.5.4') + print('Updating... go to version 4.5.6') cur.close() con.close() - - + + + def update_ver(**kwargs): con, cur = get_cur() - sql = """update version set version = '4.5.5.0'; """ + sql = """update version set version = '4.5.6.0'; """ try: cur.execute(sql) con.commit() diff --git a/app/options.py b/app/options.py index 91da1b42..555b6933 100644 --- a/app/options.py +++ b/app/options.py @@ -1845,7 +1845,6 @@ if form.getvalue('updatessh'): if username is None: print(error_mess) else: - fullpath = funct.get_config_var('main', 'fullpath') for sshs in sql.select_ssh(id=ssh_id): @@ -2118,7 +2117,6 @@ if form.getvalue('nginxConnections'): if r.status_code == 200: bin_bout = [0, 0] for num, line in enumerate(r.text.split('\n')): - #bin_bout.append(line.encode(encoding='ISO-8859-1')) if num == 0: bin_bout.append(line.split(' ')[2]) if num == 2: @@ -2303,13 +2301,13 @@ if form.getvalue('viewFirewallRules') is not None: cmd1 = ["sudo iptables -L IN_public_allow -n --line-numbers|sed 's/ */ /g'|grep -v -E 'Chain|target'"] cmd2 = ["sudo iptables -L OUTPUT -n --line-numbers|sed 's/ */ /g'|grep -v -E 'Chain|target'"] - input = funct.ssh_command(serv, cmd, raw=1) + input_chain = funct.ssh_command(serv, cmd, raw=1) IN_public_allow = funct.ssh_command(serv, cmd1, raw=1) - output = funct.ssh_command(serv, cmd2, raw=1) + output_chain = funct.ssh_command(serv, cmd2, raw=1) from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('ajax/firewall_rules.html') - template = template.render(input=input, IN_public_allow=IN_public_allow, output=output) + template = template.render(input=input_chain, IN_public_allow=IN_public_allow, output=output_chain) print(template) diff --git a/app/scripts/ansible/roles/haproxy/tasks/main.yml b/app/scripts/ansible/roles/haproxy/tasks/main.yml index eef8ba65..f10b05e1 100644 --- a/app/scripts/ansible/roles/haproxy/tasks/main.yml +++ b/app/scripts/ansible/roles/haproxy/tasks/main.yml @@ -30,6 +30,7 @@ name: - http://repo.haproxy-wi.org/haproxy-{{HAPVER}}.el{{ansible_facts['distribution_major_version']}}.x86_64.rpm - socat + - rsyslog state: present disable_gpg_check: yes when: (ansible_facts['os_family'] == "RedHat" or ansible_facts['os_family'] == 'CentOS') and HAPVER|length > 0 @@ -45,6 +46,7 @@ name: - http://repo1.haproxy-wi.org/haproxy-{{HAPVER}}.el{{ansible_facts['distribution_major_version']}}.x86_64.rpm - socat + - rsyslog state: present register: install_result1 when: (ansible_facts['os_family'] == "RedHat" or ansible_facts['os_family'] == 'CentOS') and ("'timed out' in install_result.stderr") @@ -65,6 +67,7 @@ name: - haproxy - socat + - rsyslog state: latest when: (ansible_facts['os_family'] == "RedHat" or ansible_facts['os_family'] == 'CentOS') and ("'FAILED' in install_result1.stderr") environment: @@ -77,6 +80,7 @@ name: - haproxy - socat + - rsyslog state: present when: ansible_facts['os_family'] == 'Debian' or ansible_facts['os_family'] == 'Ubuntu' environment: @@ -142,6 +146,13 @@ dest: /etc/rsyslog.conf ignore_errors: yes notify: restart rsyslog + + +- name: Installing HAProxy conf for logrotate + template: + src: logrotate.conf.j2 + dest: /etc/logrotate.d/haproxy.conf + ignore_errors: yes - name: Get HAProxy version. diff --git a/app/sql.py b/app/sql.py index eeb7c0d1..4054d0c9 100644 --- a/app/sql.py +++ b/app/sql.py @@ -1488,7 +1488,7 @@ def select_metrics(serv, **kwargs): date_from = "and date > now() - INTERVAL 720 minute and rowid % 9 = 0" else: date_from = "and date > now() - INTERVAL 30 minute" - sql = """ select * from metrics where serv = '{serv}' {date_from} order by `date` desc limit 60 """.format(serv=serv, date_from=date_from) + sql = """ select * from metrics where serv = '{serv}' {date_from} order by `date` desc """.format(serv=serv, date_from=date_from) else: if kwargs.get('time_range') == '60': date_from = "and date > datetime('now', '-60 minutes', 'localtime') and rowid % 2 = 0" diff --git a/app/templates/add.html b/app/templates/add.html index 5c324242..530837ed 100644 --- a/app/templates/add.html +++ b/app/templates/add.html @@ -12,6 +12,9 @@ 'option pgsql-check':'Check a PgSQL Service', 'option redis-check': 'Check a Redis Service', 'option smtpchk':'Check a SMTP service'} %} +{% set if_values = dict() %} +{% set if_values = {'1':'Host name starts with','2':'Host name ends with','3':'Path starts with','4':'Path ends with'} %} +