diff --git a/README.md b/README.md index d252235e..c68f7305 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Haproxy web interface -Web interface(user-frendly web GUI) for managing Haproxy servers. Leave your [feedback](https://github.com/Aidaho12/haproxy-wi/issues) +Web interface(user-friendly web GUI) for managing Haproxy servers. Leave your [feedback](https://github.com/Aidaho12/haproxy-wi/issues) # Donate Support the project diff --git a/app/add.py b/app/add.py index 6e09dccd..d8fb83d0 100644 --- a/app/add.py +++ b/app/add.py @@ -35,7 +35,7 @@ output_from_parsed_template = template.render(title = "Add", print(output_from_parsed_template) hap_configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') -cert_path = funct.get_config_var('haproxy', 'cert_path') +cert_path = sql.get_setting('cert_path') if form.getvalue('mode') is not None: serv = form.getvalue('serv') diff --git a/app/create_db.py b/app/create_db.py index c81733e1..ea05902b 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -15,7 +15,6 @@ if mysql_enable == '1': from mysql.connector import errorcode import mysql.connector as sqltool else: - fullpath = funct.get_config_var('main', 'fullpath') db = funct.get_app_dir()+"/haproxy-wi.db" import sqlite3 as sqltool @@ -498,16 +497,71 @@ def update_db_v_2_91(**kwargs): except sqltool.Error as e: if kwargs.get('silent') != 1: if e.args[0] == 'column param is not unique' or e == "1060 (42S21): Duplicate column name 'cred' ": - print('DB was update to 2.9 It\' last version') + print('Updating... go to version 3.0') else: print("An error occurred:", e) return False else: - print("DB was update to 2.9 It\' last version
") + print("Updating... go to version 3.0
") return True cur.close() con.close() +def update_db_v_3(**kwargs): + con, cur = get_cur() + sql = """ + ALTER TABLE `settings` ADD COLUMN section varchar(64); + """ + try: + cur.execute(sql) + con.commit() + except sqltool.Error as e: + if kwargs.get('silent') != 1: + if e.args[0] == 'duplicate column name: section' or e == " 1060 (42S21): Duplicate column name 'section' ": + print('DB was update to 3.0 It\' last version') + else: + print("An error occurred:", e) + return False + else: + sql = [ "ALTER TABLE `settings` ADD COLUMN desc varchar(128); ", + "INSERT INTO settings (param, value, section, desc) values('time_zone', 'UTC', 'main', 'Time Zone');", + "INSERT INTO settings (param, value, section, desc) values('proxy', '', 'main', 'Proxy server. Use proto://ip:port');", + "INSERT INTO settings (param, value, section, desc) values('session_ttl', '5', 'main', 'Time to live users sessions. In days');", + "INSERT INTO settings (param, value, section, desc) values('token_ttl', '5', 'main', 'Time to live users tokens. In days');", + "INSERT INTO settings (param, value, section, desc) values('local_path_logs', '/var/log/haproxy.log', 'logs', 'Logs save locally, disable by default');", + "INSERT INTO settings (param, value, section, desc) values('syslog_server_enable', '0', 'logs', 'If exist syslog server for HAproxy logs, enable this option');", + "INSERT INTO settings (param, value, section, desc) values('syslog_server', '0', 'logs', 'IP address syslog server');", + "INSERT INTO settings (param, value, section, desc) values('log_time_storage', '14', 'logs', 'Time of storage of logs of user activity, in days');", + "INSERT INTO settings (param, value, section, desc) values('restart_command', 'systemctl restart haproxy', 'haproxy', 'Command for restart HAproxy service');", + "INSERT INTO settings (param, value, section, desc) values('status_command', 'systemctl status haproxy', 'haproxy', 'Command for status check HAproxy service');", + "INSERT INTO settings (param, value, section, desc) values('stats_user', 'admin', 'haproxy', 'Username for Stats web page HAproxy');", + "INSERT INTO settings (param, value, section, desc) values('stats_password', 'password', 'haproxy', 'Password for Stats web page HAproxy');", + "INSERT INTO settings (param, value, section, desc) values('stats_port', '8085', 'haproxy', 'Port Stats web page HAproxy');", + "INSERT INTO settings (param, value, section, desc) values('stats_page', 'stats', 'haproxy', 'URI Stats web page HAproxy');", + "INSERT INTO settings (param, value, section, desc) values('haproxy_dir', '/etc/haproxy/', 'haproxy', 'Path to HAProxy dir');", + "INSERT INTO settings (param, value, section, desc) values('haproxy_config_path', '/etc/haproxy/haproxy.cfg', 'haproxy', 'Path to HAProxy config');", + "INSERT INTO settings (param, value, section, desc) values('server_state_file', '/etc/haproxy/haproxy.state', 'haproxy', 'Path to HAProxy state file');", + "INSERT INTO settings (param, value, section, desc) values('haproxy_sock', '/var/run/haproxy.sock', 'haproxy', 'Path to HAProxy sock file');", + "INSERT INTO settings (param, value, section, desc) values('haproxy_sock_port', '1999', 'haproxy', 'HAProxy sock port');", + "INSERT INTO settings (param, value, section, desc) values('tmp_config_path', '/tmp/', 'haproxy', 'Temp store configs, for haproxy check');", + "INSERT INTO settings (param, value, section, desc) values('cert_path', '/etc/ssl/certs/', 'haproxy', 'Path to SSL dir');", + "INSERT INTO settings (param, value, section, desc) values('firewall_enable', '0', 'haproxy', 'If enable this option Haproxy-wi will be configure firewalld based on config port');" ] + try: + for i in sql: + cur.execute(i) + except sqltool.Error as e: + if kwargs.get('silent') != 1: + if e.args[0] == 'duplicate column name: id' or e == "1060 (42S21): Duplicate column name 'id' ": + print('DB was update to 3.0 It\' last version') + else: + print("An error occurred:", e) + return False + else: + pass + return True + cur.close() + con.close() + def update_all(): update_db_v_2_0_1() update_db_v_2_0_1_1() @@ -524,6 +578,7 @@ def update_all(): update_db_v_2_8_2() update_db_v_2_9() update_db_v_2_91() + update_db_v_3() def update_all_silent(): update_db_v_2_0_1(silent=1) @@ -541,4 +596,5 @@ def update_all_silent(): update_db_v_2_8_2(silent=1) update_db_v_2_9(silent=1) update_db_v_2_91(silent=1) + update_db_v_3(silent=1) \ No newline at end of file diff --git a/app/funct.py b/app/funct.py index fa3f419c..ca0c2750 100644 --- a/app/funct.py +++ b/app/funct.py @@ -36,7 +36,8 @@ def get_config_var(sec, var): print('
Check the config file. Presence section %s and parameter %s
' % (sec, var)) def get_data(type): - now_utc = datetime.now(timezone(get_config_var('main', 'time_zone'))) + import sql + now_utc = datetime.now(timezone(sql.get_setting('time_zone'))) if type == 'config': fmt = "%Y-%m-%d.%H:%M:%S" if type == 'logs': @@ -85,7 +86,7 @@ def telegram_send_mess(mess, **kwargs): token_bot = telegram[1] channel_name = telegram[2] - proxy = get_config_var('main', 'proxy') + proxy = sql.get_setting('proxy') if proxy is not None: apihelper.proxy = {'https': proxy} @@ -213,11 +214,12 @@ def ssh_connect(serv, **kwargs): return error def get_config(serv, cfg, **kwargs): + import sql error = "" if kwargs.get("keepalived"): config_path = "/etc/keepalived/keepalived.conf" else: - config_path = get_config_var('haproxy', 'haproxy_config_path') + config_path = sql.get_setting('haproxy_config_path') ssh = ssh_connect(serv) try: @@ -296,15 +298,23 @@ def diff_config(oldcfg, cfg): pass def install_haproxy(serv, **kwargs): + import sql script = "install_haproxy.sh" - tmp_config_path = get_config_var('haproxy', 'tmp_config_path') - proxy = get_config_var('main', 'proxy') + tmp_config_path = sql.get_setting('tmp_config_path') + haproxy_sock_port = sql.get_setting('haproxy_sock_port') + stats_port = sql.get_setting('stats_port') + server_state_file = sql.get_setting('server_state_file') + stats_user = sql.get_setting('stats_user') + stats_password = sql.get_setting('stats_password') + proxy = sql.get_setting('proxy') os.system("cp scripts/%s ." % script) if proxy is not None: proxy_serv = proxy else: proxy_serv = "" - commands = [ "chmod +x "+tmp_config_path+script+" && " +tmp_config_path+"/"+script +" " + proxy_serv] + commands = [ "chmod +x "+tmp_config_path+script+" && " +tmp_config_path+"/"+script +" PROXY=" + proxy_serv+ + " SOCK_PORT="+haproxy_sock_port+" STAT_PORT="+stats_port+" STAT_FILE="+server_state_file+ + " STATS_USER="+stats_user+" STATS_PASS="+stats_password ] upload(serv, tmp_config_path, script) ssh_command(serv, commands) @@ -315,8 +325,9 @@ def install_haproxy(serv, **kwargs): os.system("rm -f %s" % script) def syn_flood_protect(serv, **kwargs): + import sql script = "syn_flood_protect.sh" - tmp_config_path = get_config_var('haproxy', 'tmp_config_path') + tmp_config_path = sql.get_setting('tmp_config_path') if kwargs.get('enable') == "0": enable = "disable" @@ -348,7 +359,8 @@ def upload(serv, path, file, **kwargs): print('
Upload fail: %s
' % e) def upload_and_restart(serv, cfg, **kwargs): - tmp_file = get_config_var('haproxy', 'tmp_config_path') + "/" + get_data('config') + ".cfg" + import sql + tmp_file = sql.get_setting('tmp_config_path') + "/" + get_data('config') + ".cfg" error = "" try: @@ -371,11 +383,11 @@ def upload_and_restart(serv, cfg, **kwargs): commands = [ "sudo mv -f " + tmp_file + " /etc/keepalived/keepalived.conf", "sudo systemctl restart keepalived" ] else: if kwargs.get("just_save") == "save": - commands = [ "sudo /sbin/haproxy -q -c -f " + tmp_file + "&& sudo mv -f " + tmp_file + " " + get_config_var('haproxy', 'haproxy_config_path') ] + commands = [ "sudo /sbin/haproxy -q -c -f " + tmp_file + "&& sudo mv -f " + tmp_file + " " + sql.get_setting('haproxy_config_path') ] else: - commands = [ "sudo /sbin/haproxy -q -c -f " + tmp_file + "&& sudo mv -f " + tmp_file + " " + get_config_var('haproxy', 'haproxy_config_path') + " && sudo " + get_config_var('haproxy', 'restart_command') ] + commands = [ "sudo /sbin/haproxy -q -c -f " + tmp_file + "&& sudo mv -f " + tmp_file + " " + sql.get_setting('haproxy_config_path') + " && sudo " + sql.get_setting('restart_command') ] try: - if get_config_var('haproxy', 'firewall_enable') == "1": + if sql.get_setting('firewall_enable') == "1": commands.extend(open_port_firewalld(cfg)) except: return 'Please check the config for the presence of the parameter - "firewall_enable". Mast be: "0" or "1". Firewalld configure not working now' @@ -406,7 +418,8 @@ def open_port_firewalld(cfg): return firewalld_commands def check_haproxy_config(serv): - commands = [ "/sbin/haproxy -q -c -f %s" % get_config_var('haproxy', 'haproxy_config_path') ] + import sql + commands = [ "/sbin/haproxy -q -c -f %s" % sql.get_setting('haproxy_config_path') ] ssh = ssh_connect(serv) for command in commands: stdin , stdout, stderr = ssh.exec_command(command) diff --git a/app/haproxy-webintarface.config b/app/haproxy-webintarface.config index 1a313434..9d497819 100644 --- a/app/haproxy-webintarface.config +++ b/app/haproxy-webintarface.config @@ -4,12 +4,6 @@ fullpath = /var/www/haproxy-wi cgi_path = ${fullpath}/app/ log_path = ${fullpath}/log/ cert_local_dir = ${cgi_path}/certs/ -time_zone = UTC -proxy = -#Time to live users sessions. In days -session_ttl = 5 -#Time to live users tokens. In days -token_ttl = 5 [configs] #Dir where configs will be save @@ -23,39 +17,3 @@ mysql_user = haproxy-wi mysql_password = haproxy-wi mysql_db = haproxywi mysql_host = 127.0.0.1 - -[logs] -#Logs save locally, enable by default -local_path_logs = /var/log/haproxy.log -#If exist syslog server for HAproxy logs -syslog_server_enable = 0 -syslog_server = -#Time of storage of logs of user activity, in days -log_time_storage = 14 - -[telegram] -#Send log message to telegram channel -#Default bot send message disable -enable = 0 -token = -channel_name = - -[haproxy] -#Command for restart HAproxy service -restart_command = systemctl restart haproxy -status_command = systemctl status haproxy -#Username and password for Stats web page HAproxy -stats_user = admin -stats_password = password -stats_port = 8085 -stats_page = stats -haproxy_dir = /etc/haproxy -haproxy_config_path = ${haproxy_dir}/haproxy.cfg -server_state_file = ${haproxy_dir}/haproxy.state -haproxy_sock = /var/run/haproxy.sock -haproxy_sock_port = 1999 -#Temp store configs, for haproxy check -tmp_config_path = /tmp/ -cert_path = /etc/ssl/certs/ -#If enable this option Haproxy-wi will be configure firewalld based on config port -firewall_enable = 1 diff --git a/app/login.py b/app/login.py index 75010481..e92fd823 100644 --- a/app/login.py +++ b/app/login.py @@ -9,7 +9,6 @@ import sql import create_db import datetime import uuid -from configparser import ConfigParser, ExtendedInterpolation from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/')) template = env.get_template('login.html') @@ -24,10 +23,6 @@ db_create = "" error_log = "" error = "" -path_config = "haproxy-webintarface.config" -config = ConfigParser(interpolation=ExtendedInterpolation()) -config.read(path_config) - if ref is None: ref = "/index.html" @@ -35,10 +30,10 @@ if form.getvalue('error'): error_log = '
Somthing wrong :( I\'m sad about this, but try again!


' try: - if config.get('main', 'session_ttl'): - session_ttl = config.getint('main', 'session_ttl') + if sql.get_setting('session_ttl'): + session_ttl = sql.get_setting('session_ttl') except: - error = '
Can not find "session_ttl" parametr. Check into config, "main" section
' + error = '
Can not find "session_ttl" parametr. Check into settings, "main" section
' pass try: @@ -61,8 +56,11 @@ if form.getvalue('logout'): if login is not None and password is not None: USERS = sql.select_users() - session_ttl = config.getint('main', 'session_ttl') - expires = datetime.datetime.utcnow() + datetime.timedelta(days=session_ttl) + session_ttl = int() + session_ttl = sql.get_setting('session_ttl') + session_ttl = int(session_ttl) + + expires = datetime.datetime.utcnow() + datetime.timedelta(days=session_ttl) user_uuid = str(uuid.uuid4()) user_token = str(uuid.uuid4()) diff --git a/app/options.py b/app/options.py index d4531e04..254b8215 100644 --- a/app/options.py +++ b/app/options.py @@ -20,8 +20,8 @@ if form.getvalue('token') is None: sys.exit() if form.getvalue('getcerts') is not None and serv is not None: - cert_path = funct.get_config_var('haproxy', 'cert_path') - commands = [ "ls -1t /etc/ssl/certs/ |grep pem" ] + cert_path = sql.get_setting('cert_path') + commands = [ "ls -1t "+cert_path+" |grep pem" ] try: funct.ssh_command(serv, commands, ip="1") except: @@ -29,7 +29,7 @@ if form.getvalue('getcerts') is not None and serv is not None: if form.getvalue('getcert') is not None and serv is not None: id = form.getvalue('getcert') - cert_path = funct.get_config_var('haproxy', 'cert_path') + cert_path = sql.get_setting('cert_path') commands = [ "cat "+cert_path+"/"+id ] try: funct.ssh_command(serv, commands, ip="1") @@ -37,9 +37,8 @@ if form.getvalue('getcert') is not None and serv is not None: print('
Can not connect to the server
') if form.getvalue('ssh_cert'): - fullpath = funct.get_config_var('main', 'fullpath') name = form.getvalue('name') - ssh_keys = fullpath+'/keys/'+name+'.pem' + ssh_keys = os.path.dirname(os.getcwd())+'/keys/'+name+'.pem' try: with open(ssh_keys, "w") as conf: @@ -55,7 +54,7 @@ if form.getvalue('ssh_cert'): if serv and form.getvalue('ssl_cert'): cert_local_dir = funct.get_config_var('main', 'cert_local_dir') - cert_path = funct.get_config_var('haproxy', 'cert_path') + cert_path = sql.get_setting('cert_path') if form.getvalue('ssl_name') is None: print('
Please enter desired name
') @@ -114,10 +113,10 @@ if form.getvalue('action'): import requests from requests_toolbelt.utils import dump - haproxy_user = funct.get_config_var('haproxy', 'stats_user') - haproxy_pass = funct.get_config_var('haproxy', 'stats_password') - stats_port = funct.get_config_var('haproxy', 'stats_port') - stats_page = funct.get_config_var('haproxy', 'stats_page') + haproxy_user = sql.get_setting('stats_user') + haproxy_pass = sql.get_setting('stats_password') + stats_port = sql.get_setting('stats_port') + stats_page = sql.get_setting('stats_page') postdata = { 'action' : form.getvalue('action'), @@ -138,10 +137,10 @@ if serv is not None and act == "stats": import requests from requests_toolbelt.utils import dump - haproxy_user = funct.get_config_var('haproxy', 'stats_user') - haproxy_pass = funct.get_config_var('haproxy', 'stats_password') - stats_port = funct.get_config_var('haproxy', 'stats_port') - stats_page = funct.get_config_var('haproxy', 'stats_page') + haproxy_user = sql.get_setting('stats_user') + haproxy_pass = sql.get_setting('stats_password') + stats_port = sql.get_setting('stats_port') + stats_page = sql.get_setting('stats_page') try: response = requests.get('http://%s:%s/%s' % (serv, stats_port, stats_page), auth=(haproxy_user, haproxy_pass)) except requests.exceptions.ConnectTimeout: @@ -176,14 +175,14 @@ if serv is not None and form.getvalue('rows') is not None: grep_act = '' grep = '' - syslog_server_enable = funct.get_config_var('logs', 'syslog_server_enable') + syslog_server_enable = sql.get_setting('syslog_server_enable') if syslog_server_enable is None or syslog_server_enable == "0": - local_path_logs = funct.get_config_var('logs', 'local_path_logs') + local_path_logs = sql.get_setting('local_path_logs') syslog_server = serv commands = [ "sudo cat %s| awk '$3>\"%s:00\" && $3<\"%s:00\"' |tail -%s %s %s" % (local_path_logs, date, date1, rows, grep_act, grep) ] else: commands = [ "sudo cat /var/log/%s/syslog.log | sed '/ %s:00/,/ %s:00/! d' |tail -%s %s %s" % (serv, date, date1, rows, grep_act, grep) ] - syslog_server = funct.get_config_var('logs', 'syslog_server') + syslog_server = sql.get_setting('syslog_server') funct.ssh_command(syslog_server, commands, show_log="1") @@ -241,8 +240,8 @@ if serv is not None and act == "showMap": ovw.get_map(serv) if form.getvalue('servaction') is not None: - server_state_file = funct.get_config_var('haproxy', 'server_state_file') - haproxy_sock = funct.get_config_var('haproxy', 'haproxy_sock') + server_state_file = sql.get_setting('server_state_file') + haproxy_sock = sql.get_setting('haproxy_sock') enable = form.getvalue('servaction') backend = form.getvalue('servbackend') @@ -304,7 +303,7 @@ if form.getvalue('master'): vrrpip = form.getvalue('vrrpip') hap = form.getvalue('hap') syn_flood = form.getvalue('syn_flood') - tmp_config_path = funct.get_config_var('haproxy', 'tmp_config_path') + tmp_config_path = sql.get_setting('tmp_config_path') script = "install_keepalived.sh" if hap == "1": @@ -335,7 +334,7 @@ if form.getvalue('masteradd'): interface = form.getvalue('interfaceadd') vrrpip = form.getvalue('vrrpipadd') kp = form.getvalue('kp') - tmp_config_path = funct.get_config_var('haproxy', 'tmp_config_path') + tmp_config_path = sql.get_setting('tmp_config_path') script = "add_vrrp.sh" os.system("cp scripts/%s ." % script) @@ -486,7 +485,7 @@ if form.getvalue('bwlists_save'): print('
Cat\'n save '+form.getvalue('color')+' list. %s
' % e) servers = sql.get_dick_permit() - path = funct.get_config_var('haproxy', 'haproxy_dir')+"/"+form.getvalue('color') + path = sql.get_setting('haproxy_dir')+"/"+form.getvalue('color') for server in servers: commands = [ "sudo mkdir "+path ] @@ -507,7 +506,7 @@ if form.getvalue('bwlists_save'): print('
Upload fail: %s
' % e) if form.getvalue('bwlists_restart') == 'restart': - commands = [ "sudo " + funct.get_config_var('haproxy', 'restart_command') ] + commands = [ "sudo " + sql.get_setting('restart_command') ] funct.ssh_command(server[2], commands) if form.getvalue('get_lists'): diff --git a/app/ovw.py b/app/ovw.py index 1fc6bf6f..bf2a8640 100644 --- a/app/ovw.py +++ b/app/ovw.py @@ -10,9 +10,10 @@ def get_overview(): from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/ajax')) template = env.get_template('overview.html') - haproxy_config_path = funct.get_config_var('haproxy', 'haproxy_config_path') + haproxy_config_path = sql.get_setting('haproxy_config_path') cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_id = cookie.get('uuid') + haproxy_sock_port = sql.get_setting('haproxy_sock_port') listhap = sql.get_dick_permit() commands = [ "ls -l %s |awk '{ print $6\" \"$7\" \"$8}'" % haproxy_config_path ] @@ -20,7 +21,7 @@ def get_overview(): for server in listhap: server_status = () - cmd = 'echo "show info" |nc %s 1999 |grep -e "Process_num"' % server[2] + cmd = 'echo "show info" |nc %s %s |grep -e "Process_num"' % (server[2], haproxy_sock_port) server_status = (server[1],server[2], funct.server_status(funct.subprocess_execute(cmd)), funct.ssh_command(server[2], commands)) servers.append(server_status) @@ -34,6 +35,7 @@ def get_overviewServers(): template = env.get_template('overviewServers.html') cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_id = cookie.get('uuid') + haproxy_sock_port = sql.get_setting('haproxy_sock_port') listhap = sql.get_dick_permit() commands = [ "top -u haproxy -b -n 1" ] @@ -41,7 +43,7 @@ def get_overviewServers(): for server in sorted(listhap): server_status = () - cmd = 'echo "show info" |nc %s 1999 |grep -e "Ver\|CurrConns\|SessRate\|Maxco\|MB\|Uptime:"' % server[2] + cmd = 'echo "show info" |nc %s %s |grep -e "Ver\|CurrConns\|SessRate\|Maxco\|MB\|Uptime:"' % (server[2], haproxy_sock_port) out = funct.subprocess_execute(cmd) out1 = "" for k in out: @@ -66,10 +68,8 @@ def get_map(serv): matplotlib.use('Agg') import matplotlib.pyplot as plt - cgi_path = funct.get_config_var('main', 'cgi_path') - fullpath = funct.get_config_var('main', 'fullpath') - stats_port= funct.get_config_var('haproxy', 'stats_port') - haproxy_config_path = funct.get_config_var('haproxy', 'haproxy_config_path') + stats_port= sql.get_setting('stats_port') + haproxy_config_path = sql.get_setting('haproxy_config_path') hap_configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') date = funct.get_data('config') cfg = hap_configs_dir + serv + "-" + date + ".cfg" @@ -141,7 +141,6 @@ def get_map(serv): G.add_edge(node,line_new[0]) os.system("/bin/rm -f " + cfg) - os.chdir(cgi_path) pos=nx.get_node_attributes(G,'pos') pos_label=nx.get_node_attributes(G,'label_pos') @@ -160,7 +159,7 @@ def get_map(serv): except Exception as e: print('
' + str(e) + '
') - cmd = "rm -f "+fullpath+"/map*.png && mv "+cgi_path+"/map.png "+fullpath+"/map"+date+".png" + cmd = "rm -f "+os.path.dirname(os.getcwd())+"/map*.png && mv map.png "+os.path.dirname(os.getcwd())+"/map"+date+".png" output, stderr = funct.subprocess_execute(cmd) print(stderr) diff --git a/app/scripts/install_haproxy.sh b/app/scripts/install_haproxy.sh index 2659a5d9..33bddbd7 100644 --- a/app/scripts/install_haproxy.sh +++ b/app/scripts/install_haproxy.sh @@ -1,9 +1,29 @@ #!/bin/bash -if [[ $1 != "" ]] +for ARGUMENT in "$@" +do + + KEY=$(echo $ARGUMENT | cut -f1 -d=) + VALUE=$(echo $ARGUMENT | cut -f2 -d=) + + case "$KEY" in + PROXY) PROXY=${VALUE} ;; + SOCK_PORT) SOCK_PORT=${VALUE} ;; + STAT_PORT) STAT_PORT=${VALUE} ;; + STAT_FILE) STAT_FILE=${VALUE} ;; + STATS_USER) STATS_USER=${VALUE} ;; + STATS_PASS) STATS_PASS=${VALUE} ;; + STAT_FILE) STAT_FILE=${VALUE} ;; + *) + esac + + +done + +if [[ $PROXY != "" ]] then - export http_proxy="$1" - export https_proxy="$1" + export http_proxy="$PROXY" + export https_proxy="$PROXY" echo "Exporting proxy" fi @@ -15,14 +35,14 @@ fi if hash apt-get 2>/dev/null; then sudo apt-get install haproxy socat -y else - wget http://cbs.centos.org/kojifiles/packages/haproxy/1.8.1/4.el7/x86_64/haproxy18-1.8.1-4.el7.x86_64.rpm + sudo wget http://cbs.centos.org/kojifiles/packages/haproxy/1.8.1/5.el7/x86_64/haproxy18-1.8.1-5.el7.x86_64.rpm sudo yum install haproxy18-1.8.1-5.el7.x86_64.rpm -y fi if [ $? -eq 1 ] then sudo yum install wget socat -y > /dev/null - wget http://cbs.centos.org/kojifiles/packages/haproxy/1.8.1/4.el7/x86_64/haproxy18-1.8.1-4.el7.x86_64.rpm + sudo wget http://cbs.centos.org/kojifiles/packages/haproxy/1.8.1/5.el7/x86_64/haproxy18-1.8.1-5.el7.x86_64.rpm sudo yum install haproxy18-1.8.1-5.el7.x86_64.rpm -y fi if [ $? -eq 1 ] @@ -45,8 +65,9 @@ global group haproxy daemon stats socket /var/lib/haproxy/stats - stats socket *:1999 level admin - stats socket /var/run/haproxy.sock mode 600 level admin + stats socket *:$SOCK_PORT level admin + stats socket /var/run/haproxy.sock mode 600 level admin + server-state-file $STAT_FILE defaults mode http @@ -67,11 +88,11 @@ defaults maxconn 3000 listen stats - bind *:8085 + bind *:$STAT_PORT stats enable stats uri /stats stats realm HAProxy-04\ Statistics - stats auth admin:password + stats auth $STATS_USER:$STATS_PASS stats admin if TRUE EOF sudo bash -c cat << EOF > /etc/rsyslog.d/haproxy.conf diff --git a/app/settings.py b/app/settings.py index 9a196902..2ffb157a 100644 --- a/app/settings.py +++ b/app/settings.py @@ -1,39 +1,31 @@ #!/usr/bin/env python3 -import html, http +import html import cgi -import sys import os -import funct, sql -from configparser import ConfigParser, ExtendedInterpolation +import funct +import sql +import http from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/')) -template = env.get_template('viewsettings.html') - -path_config = "haproxy-webintarface.config" -config = ConfigParser(interpolation=ExtendedInterpolation()) -config.read(path_config) -fullpath = config.get('main', 'fullpath') +template = env.get_template('settings.html') +form = cgi.FieldStorage() print('Content-type: text/html\n') funct.check_login() funct.page_for_admin() + try: cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_id = cookie.get('uuid') user = sql.get_user_name_by_uuid(user_id.value) - servers = sql.get_dick_permit() + settings = sql.get_setting('', all=1) + token = sql.get_token(user_id.value) except: pass - -config_items_section_name = {} -for section_name in config.sections(): - config_items_section_name[section_name] = {} - for name, value in config.items(section_name): - config_items_section_name[section_name][name] = value -output_from_parsed_template = template.render(h2 = 1, title = "Admin area: View settings", - role = sql.get_user_role_by_uuid(user_id.value), - user = user, - fullpath = fullpath, - config_items_section_name = config_items_section_name) -print(output_from_parsed_template) +template = template.render(h2 = 1, title = "Settings", + role = sql.get_user_role_by_uuid(user_id.value), + user = user, + settings = settings, + token = token) +print(template) \ No newline at end of file diff --git a/app/sql.py b/app/sql.py index de65dc44..a2465b6b 100644 --- a/app/sql.py +++ b/app/sql.py @@ -285,7 +285,7 @@ def get_enable_checkbox(id, **kwargs): def write_user_uuid(login, user_uuid): con, cur = create_db.get_cur() - session_ttl = funct.get_config_var('main', 'session_ttl') + session_ttl = get_setting('session_ttl') session_ttl = int(session_ttl) sql = """ select id from user where username = '%s' """ % login try: @@ -308,7 +308,7 @@ def write_user_uuid(login, user_uuid): def write_user_token(login, user_token): con, cur = create_db.get_cur() - token_ttl = funct.get_config_var('main', 'token_ttl') + token_ttl = get_setting('token_ttl') sql = """ select id from user where username = '%s' """ % login try: cur.execute(sql) @@ -374,7 +374,7 @@ def delete_old_uuid(): def update_last_act_user(uuid): con, cur = create_db.get_cur() - session_ttl = funct.get_config_var('main', 'session_ttl') + session_ttl = get_setting('session_ttl') if mysql_enable == '1': sql = """ update uuid set exp = now()+ INTERVAL %s day where uuid = '%s' """ % (session_ttl, uuid) @@ -839,19 +839,36 @@ def select_table_metrics(uuid): cur.close() con.close() -def get_setting(param): +def get_setting(param, **kwargs): con, cur = create_db.get_cur() sql = """select value from `settings` where param='%s' """ % param + if kwargs.get('all'): + sql = """select * from `settings` order by section desc""" try: cur.execute(sql) except sqltool.Error as e: print('An error occurred: ' + e + ' X') else: - for value in cur.fetchone(): - return value + if kwargs.get('all'): + return cur + else: + for value in cur.fetchone(): + return value cur.close() con.close() +def update_setting(param, val): + con, cur = create_db.get_cur() + sql = """update `settings` set `value` = '%s' where param = '%s' """ % (val, param) + try: + cur.execute(sql) + con.commit() + except sqltool.Error as e: + print('An error occurred: ' + e.args[0] + ' X') + con.rollback() + cur.close() + con.close() + def show_update_telegram(token, page): from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/ajax')) @@ -1135,4 +1152,8 @@ if form.getvalue('updatetoken') is not None: print(error_mess) else: print('Content-type: text/html\n') - update_telegram(token, chanel, group, id) \ No newline at end of file + update_telegram(token, chanel, group, id) + +if form.getvalue('updatesettings') is not None: + print('Content-type: text/html\n') + update_setting(form.getvalue('updatesettings'), form.getvalue('val') ) \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index 6e758b33..55b29cd7 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -90,7 +90,7 @@
  • Servers
  • Roles
  • SSH credentials
  • -
  • View settings
  • +
  • Settings
  • Internal logs
  • {% endif %} @@ -98,12 +98,13 @@ +
    {% if h2 %}

    diff --git a/app/templates/ha.html b/app/templates/ha.html index 07753aad..833f0907 100644 --- a/app/templates/ha.html +++ b/app/templates/ha.html @@ -2,7 +2,7 @@ {% block content %} - + @@ -48,7 +48,7 @@

    Create new HA cluster

    Create new HA cluster

    Master Slave
    - + @@ -66,7 +66,7 @@ {% endfor %} - - - -

    Or add VRRP to exist

    Or add VRRP to exist

    Master Slave + + + + diff --git a/app/templates/settings.html b/app/templates/settings.html new file mode 100644 index 00000000..1c9cb4bb --- /dev/null +++ b/app/templates/settings.html @@ -0,0 +1,35 @@ +{% extends "base.html" %} +{% block content %} + +
    + + + + + + + {% set section = namespace(section='') %} + {% for set in settings %} + {% if section.section|string() != set.2|string() %} + + {% endif %} + {% set section.section = set.2 %} + + + + + + {% endfor %} + +
    + Parameter + + Value + + Description +

    {{ set.2 }} section

    {{set.0}} + + + {{set.3}} +
    +{% endblock %} \ No newline at end of file diff --git a/app/templates/viewsettings.html b/app/templates/viewsettings.html deleted file mode 100644 index 1a7af7c6..00000000 --- a/app/templates/viewsettings.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base.html" %} -{% block content %} -

    Only view, edit you can here: {{ fullpath }}/haproxy-webintarface.config

    -
    - {% for name, value in config_items_section_name|dictsort(false) %} -
    Section: {{name}}
    -
    - {% for param, value2 in value|dictsort(false) %} -
    {{param}} = {{value2}} - {% endfor %} -
    - {% endfor %} -
    - -{% endblock %} \ No newline at end of file diff --git a/app/tools/checker_master.py b/app/tools/checker_master.py index 08e852a4..2a750dc0 100644 --- a/app/tools/checker_master.py +++ b/app/tools/checker_master.py @@ -38,7 +38,7 @@ def main(): start_worker(serv) def start_worker(serv): - port = funct.get_config_var('haproxy', 'haproxy_sock_port') + port = sql.get_setting('haproxy_sock_port') cmd = "tools/checker_worker.py %s --port %s &" % (serv, port) os.system(cmd) funct.logging("localhost", " Masrer started new worker for: "+serv, alerting=1) diff --git a/app/tools/metrics_master.py b/app/tools/metrics_master.py index 6b0351b6..e38c27e4 100644 --- a/app/tools/metrics_master.py +++ b/app/tools/metrics_master.py @@ -39,7 +39,7 @@ def main(): start_worker(serv) def start_worker(serv): - port = funct.get_config_var('haproxy', 'haproxy_sock_port') + port = sql.get_setting('haproxy_sock_port') cmd = "tools/metrics_worker.py %s --port %s &" % (serv, port) os.system(cmd) funct.logging("localhost", " Masrer started new metrics worker for: "+serv, metrics=1) diff --git a/app/users.py b/app/users.py index 1d866d3f..2db5ca7e 100644 --- a/app/users.py +++ b/app/users.py @@ -11,6 +11,7 @@ template = env.get_template('admin.html') form = cgi.FieldStorage() print('Content-type: text/html\n') + funct.check_login() funct.page_for_admin() try: diff --git a/app/viewlogs.py b/app/viewlogs.py index 39ae8741..1d5adb2d 100644 --- a/app/viewlogs.py +++ b/app/viewlogs.py @@ -25,7 +25,7 @@ funct.check_login() funct.page_for_admin() log_path = funct.get_config_var('main', 'log_path') -time_storage = funct.get_config_var('logs', 'log_time_storage') +time_storage = sql.get_setting('log_time_storage') time_storage = int(time_storage) try: diff --git a/inc/script.js b/inc/script.js index 1865641b..57593b27 100644 --- a/inc/script.js +++ b/inc/script.js @@ -130,9 +130,11 @@ function hideAutoRefreshDiv() { }); } $( document ).ajaxSend(function( event, request, settings ) { + $('#cover').fadeIn('fast'); NProgress.start(); }); $( document ).ajaxComplete(function( event, request, settings ) { + $('#cover').fadeOut('fast'); NProgress.done(); }); diff --git a/inc/style.css b/inc/style.css index 98859eaf..efaf47a1 100644 --- a/inc/style.css +++ b/inc/style.css @@ -72,13 +72,23 @@ pre { } .container { - min-height: calc(100vh - 115px); + min-height: calc(100vh - 0px); max-width: 91%; min-width: 40%; background-color: #fff; margin-left: 207px; padding-bottom: 10px; } +#cover { + position: absolute; + display: none; + top:0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0,0,0,.1); + z-index: 500; +} .login { float: right; margin-top: 5px; diff --git a/inc/users.js b/inc/users.js index 8c0f411a..299a147a 100644 --- a/inc/users.js +++ b/inc/users.js @@ -360,6 +360,13 @@ $( function() { updateSSH(id[1]) sshKeyEnableShow(id[1]) }); + $( "#settings input" ).change(function() { + var id = $(this).attr('id'); + var val = $(this).val(); + console.log(id) + console.log(val) + updateSettings(id, val); + }); $('#new-ssh_enable').click(function() { if ($('#new-ssh_enable').is(':checked')) { $('#ssh_pass').css('display', 'none'); @@ -381,6 +388,30 @@ $( function() { updateTelegram(id[1]) }); } ); +function updateSettings(param, val) { + $('.alert-danger').remove(); + $.ajax( { + url: "sql.py", + data: { + updatesettings: param, + val: val + }, + type: "GET", + success: function( data ) { + data = data.replace(/\s+/g,' '); + if (data.indexOf('error') != '-1') { + $("#ajax").append(data); + $.getScript(users); + } else { + $('.alert-danger').remove(); + $("#"+param).parent().parent().addClass( "update", 1000 ); + setTimeout(function() { + $( "#"+param ).parent().parent().removeClass( "update" ); + }, 2500 ); + } + } + } ); +} function sshKeyEnableShow(id) { $('#ssh_enable-'+id).click(function() { if ($('#ssh_enable-'+id).is(':checked')) { diff --git a/install.sh b/install.sh index 8a21dbae..fd0bc267 100644 --- a/install.sh +++ b/install.sh @@ -408,14 +408,14 @@ echo "" echo "" echo "################################" -mkdir /var/www/$HOME_HAPROXY_WI/app/certs -mkdir /var/www/$HOME_HAPROXY_WI/keys -chmod +x /var/www/$HOME_HAPROXY_WI/app/*.py -chmod +x /var/www/$HOME_HAPROXY_WI/app/tools/*.py -rm -f /var/www/$HOME_HAPROXY_WI/log/config_edit.log +sudo mkdir /var/www/$HOME_HAPROXY_WI/app/certs +sudo mkdir /var/www/$HOME_HAPROXY_WI/keys +sudo sudo chmod +x /var/www/$HOME_HAPROXY_WI/app/*.py +sudo chmod +x /var/www/$HOME_HAPROXY_WI/app/tools/*.py +sudo rm -f /var/www/$HOME_HAPROXY_WI/log/config_edit.log cd /var/www/$HOME_HAPROXY_WI/app ./update_db.py -chown -R apache:apache /var/www/$HOME_HAPROXY_WI/ -chown -R apache:apache /var/log/httpd/ +sudo chown -R apache:apache /var/www/$HOME_HAPROXY_WI/ +sudo chown -R apache:apache /var/log/httpd/ exit 0