mirror of https://github.com/Aidaho12/haproxy-wi
parent
a4b35b52d0
commit
329ed1beab
|
@ -52,12 +52,17 @@ For Apache do virtualhost with cgi-bin. Like this:
|
||||||
DocumentRoot /var/www/haproxy-wi
|
DocumentRoot /var/www/haproxy-wi
|
||||||
ScriptAlias /cgi-bin/ "/var/www/haproxy-wi/app/"
|
ScriptAlias /cgi-bin/ "/var/www/haproxy-wi/app/"
|
||||||
|
|
||||||
<Directory /var/www/haproxy-wi>
|
<Directory /var/www/haproxy-wi/app>
|
||||||
Options +ExecCGI
|
Options +ExecCGI
|
||||||
AddHandler cgi-script .py
|
AddHandler cgi-script .py
|
||||||
Order deny,allow
|
Order deny,allow
|
||||||
Allow from all
|
Allow from all
|
||||||
</Directory>
|
</Directory>
|
||||||
|
|
||||||
|
<FilesMatch "\.config$">
|
||||||
|
Order Deny,Allow
|
||||||
|
Deny from all
|
||||||
|
</FilesMatch>
|
||||||
</VirtualHost>
|
</VirtualHost>
|
||||||
```
|
```
|
||||||
# Database support
|
# Database support
|
||||||
|
@ -77,7 +82,7 @@ MariaDB [(none)]> grant all on haproxywi.* to 'haproxy-wi'@'localhost' IDENTIFIE
|
||||||
```
|
```
|
||||||
Edit $HOME_HAPROXY-WI/app/haproxy-webintarface.config with your env
|
Edit $HOME_HAPROXY-WI/app/haproxy-webintarface.config with your env
|
||||||
```
|
```
|
||||||
Copy ssh key on all HAproxy servers
|
## Copy ssh key on all HAproxy servers, upload private key via Haproxy-WI in Admin area(Tab "SSH key" in "Servers" page), or sets root password in app/haproxy-webintarface.config.
|
||||||
|
|
||||||
Login http://haproxy-wi-server/users.py, and add: users, groups and servers. Default: admin/admin
|
Login http://haproxy-wi-server/users.py, and add: users, groups and servers. Default: admin/admin
|
||||||
|
|
||||||
|
|
17
app/funct.py
17
app/funct.py
|
@ -17,6 +17,7 @@ form = cgi.FieldStorage()
|
||||||
serv = form.getvalue('serv')
|
serv = form.getvalue('serv')
|
||||||
fullpath = config.get('main', 'fullpath')
|
fullpath = config.get('main', 'fullpath')
|
||||||
time_zone = config.get('main', 'time_zone')
|
time_zone = config.get('main', 'time_zone')
|
||||||
|
proxy = config.get('main', 'proxy')
|
||||||
ssh_keys = config.get('ssh', 'ssh_keys')
|
ssh_keys = config.get('ssh', 'ssh_keys')
|
||||||
ssh_user_name = config.get('ssh', 'ssh_user_name')
|
ssh_user_name = config.get('ssh', 'ssh_user_name')
|
||||||
haproxy_configs_server = config.get('configs', 'haproxy_configs_server')
|
haproxy_configs_server = config.get('configs', 'haproxy_configs_server')
|
||||||
|
@ -61,7 +62,6 @@ def telegram_send_mess(mess):
|
||||||
import telegram
|
import telegram
|
||||||
token_bot = config.get('telegram', 'token')
|
token_bot = config.get('telegram', 'token')
|
||||||
channel_name = config.get('telegram', 'channel_name')
|
channel_name = config.get('telegram', 'channel_name')
|
||||||
proxy = config.get('telegram', 'proxy')
|
|
||||||
|
|
||||||
if proxy is not None:
|
if proxy is not None:
|
||||||
pp = telegram.utils.request.Request(proxy_url=proxy)
|
pp = telegram.utils.request.Request(proxy_url=proxy)
|
||||||
|
@ -181,6 +181,8 @@ def links():
|
||||||
'<li><a href=/app/add.py#backend title="Add single backend" class="add head-submenu">Add backend</a></li>'
|
'<li><a href=/app/add.py#backend title="Add single backend" class="add head-submenu">Add backend</a></li>'
|
||||||
'<li><a href=/app/add.py#ssl title="Upload SSL cert" class="cert head-submenu">SSL</a></li>'
|
'<li><a href=/app/add.py#ssl title="Upload SSL cert" class="cert head-submenu">SSL</a></li>'
|
||||||
'<li><a href=/app/config.py title="Edit Haproxy Config" class="edit head-submenu">Edit config</a> </li>')
|
'<li><a href=/app/config.py title="Edit Haproxy Config" class="edit head-submenu">Edit config</a> </li>')
|
||||||
|
if is_admin():
|
||||||
|
print('<li><a href=/app/ihap.py title="Installation HAProxy" class="hap head-submenu">Installation</a> </li>')
|
||||||
print('</li>')
|
print('</li>')
|
||||||
if is_admin():
|
if is_admin():
|
||||||
print('<li><a title="Keepalived" class="ha">Keepalived</a>'
|
print('<li><a title="Keepalived" class="ha">Keepalived</a>'
|
||||||
|
@ -205,7 +207,7 @@ def links():
|
||||||
'</li>')
|
'</li>')
|
||||||
print('</ul>'
|
print('</ul>'
|
||||||
'</nav>'
|
'</nav>'
|
||||||
'<div class="copyright-menu">HAproxy-WI v2.3</div>'
|
'<div class="copyright-menu">HAproxy-WI v2.3.1</div>'
|
||||||
'</div>')
|
'</div>')
|
||||||
|
|
||||||
def show_login_links():
|
def show_login_links():
|
||||||
|
@ -296,6 +298,7 @@ def get_auto_refresh(h2):
|
||||||
'</div>'
|
'</div>'
|
||||||
'</div>'
|
'</div>'
|
||||||
'</div>')
|
'</div>')
|
||||||
|
|
||||||
def ssh_connect(serv):
|
def ssh_connect(serv):
|
||||||
ssh = SSHClient()
|
ssh = SSHClient()
|
||||||
ssh.load_system_host_keys()
|
ssh.load_system_host_keys()
|
||||||
|
@ -309,12 +312,16 @@ def ssh_connect(serv):
|
||||||
return ssh
|
return ssh
|
||||||
except paramiko.AuthenticationException:
|
except paramiko.AuthenticationException:
|
||||||
print('<div class="alert alert-danger">Authentication failed, please verify your credentials</div>')
|
print('<div class="alert alert-danger">Authentication failed, please verify your credentials</div>')
|
||||||
|
return False
|
||||||
except paramiko.SSHException as sshException:
|
except paramiko.SSHException as sshException:
|
||||||
print('<div class="alert alert-danger">Unable to establish SSH connection: %s </div>' % sshException)
|
print('<div class="alert alert-danger">Unable to establish SSH connection: %s </div>' % sshException)
|
||||||
|
return False
|
||||||
except paramiko.BadHostKeyException as badHostKeyException:
|
except paramiko.BadHostKeyException as badHostKeyException:
|
||||||
print('<div class="alert alert-danger">Unable to verify server\'s host key: %s </div>' % badHostKeyException)
|
print('<div class="alert alert-danger">Unable to verify server\'s host key: %s </div>' % badHostKeyException)
|
||||||
|
return False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print('<div class="alert alert-danger">{}</div>'.format(e.args))
|
print('<div class="alert alert-danger">{}</div>'.format(e.args))
|
||||||
|
return False
|
||||||
|
|
||||||
def get_config(serv, cfg, **kwargs):
|
def get_config(serv, cfg, **kwargs):
|
||||||
if kwargs.get("keepalived"):
|
if kwargs.get("keepalived"):
|
||||||
|
@ -381,7 +388,11 @@ def show_config(cfg):
|
||||||
def install_haproxy(serv):
|
def install_haproxy(serv):
|
||||||
script = "install_haproxy.sh"
|
script = "install_haproxy.sh"
|
||||||
os.system("cp scripts/%s ." % script)
|
os.system("cp scripts/%s ." % script)
|
||||||
commands = [ "chmod +x "+tmp_config_path+script, tmp_config_path+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]
|
||||||
|
|
||||||
upload(serv, tmp_config_path, script)
|
upload(serv, tmp_config_path, script)
|
||||||
ssh_command(serv, commands)
|
ssh_command(serv, commands)
|
||||||
|
|
|
@ -5,6 +5,7 @@ cgi_path = ${fullpath}/app/
|
||||||
log_path = ${fullpath}/log/
|
log_path = ${fullpath}/log/
|
||||||
cert_local_dir = ${cgi_path}/certs/
|
cert_local_dir = ${cgi_path}/certs/
|
||||||
time_zone = UTC
|
time_zone = UTC
|
||||||
|
proxy =
|
||||||
|
|
||||||
[configs]
|
[configs]
|
||||||
#Server for save configs from HAproxy servers
|
#Server for save configs from HAproxy servers
|
||||||
|
@ -43,7 +44,6 @@ syslog_server =
|
||||||
enable = 0
|
enable = 0
|
||||||
token =
|
token =
|
||||||
channel_name =
|
channel_name =
|
||||||
proxy =
|
|
||||||
|
|
||||||
[haproxy]
|
[haproxy]
|
||||||
#Command for restart HAproxy service
|
#Command for restart HAproxy service
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import html
|
||||||
|
import cgi
|
||||||
|
import funct
|
||||||
|
import sql
|
||||||
|
from configparser import ConfigParser, ExtendedInterpolation
|
||||||
|
|
||||||
|
funct.head("Installation HAProxy")
|
||||||
|
funct.check_login()
|
||||||
|
funct.page_for_admin()
|
||||||
|
|
||||||
|
path_config = "haproxy-webintarface.config"
|
||||||
|
config = ConfigParser(interpolation=ExtendedInterpolation())
|
||||||
|
config.read(path_config)
|
||||||
|
proxy = config.get('main', 'proxy')
|
||||||
|
serv = ""
|
||||||
|
|
||||||
|
print('<script src="/inc/users.js"></script>'
|
||||||
|
'<h2>Installation HAProxy</h2>'
|
||||||
|
'<table class="overview">'
|
||||||
|
'<tr class="overviewHead">'
|
||||||
|
'<td class="padding10 first-collumn">Note</td>'
|
||||||
|
'<td>Server</td>'
|
||||||
|
'<td></td>'
|
||||||
|
'</tr>'
|
||||||
|
'<tr>'
|
||||||
|
'<td class="padding10 first-collumn">'
|
||||||
|
'<b>Haproxy-WI will try install haproxy-1.18.5, if it does not work then haproxy-1.15</b>'
|
||||||
|
'</td>'
|
||||||
|
'<td class="padding10 first-collumn">'
|
||||||
|
'<select id="haproxyaddserv">'
|
||||||
|
'<option disable selected>Choose master</option>')
|
||||||
|
funct.choose_only_select(serv)
|
||||||
|
print('</select>'
|
||||||
|
'</td>'
|
||||||
|
'<td>'
|
||||||
|
'<a class="ui-button ui-widget ui-corner-all" id="install" title="Install HAProxy">Install</a>'
|
||||||
|
'</td>'
|
||||||
|
'</table>'
|
||||||
|
'<div id="ajax"></div>')
|
|
@ -270,4 +270,7 @@ if form.getvalue('masteradd'):
|
||||||
commands = [ "chmod +x "+tmp_config_path+script, tmp_config_path+script+" BACKUP "+interface+" "+vrrpip+" "+kp ]
|
commands = [ "chmod +x "+tmp_config_path+script, tmp_config_path+script+" BACKUP "+interface+" "+vrrpip+" "+kp ]
|
||||||
funct.ssh_command(slave, commands)
|
funct.ssh_command(slave, commands)
|
||||||
|
|
||||||
os.system("rm -f %s" % script)
|
os.system("rm -f %s" % script)
|
||||||
|
|
||||||
|
if form.getvalue('haproxyaddserv'):
|
||||||
|
funct.install_haproxy(form.getvalue('haproxyaddserv'))
|
|
@ -1,10 +1,29 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
yum install haproxy socat -y > /dev/null
|
|
||||||
|
if [[ $1 != "" ]]
|
||||||
|
then
|
||||||
|
export http_proxy="$1"
|
||||||
|
export https_proxy="$1"
|
||||||
|
echo "Exporting proxy"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -f /etc/haproxy/haproxy.cfg ];then
|
if [ -f /etc/haproxy/haproxy.cfg ];then
|
||||||
echo -e 'error: Haproxy alredy installed. You can edit config<a href="/app/config.py" title="Edit HAProxy config">here</a>'
|
echo -e 'error: Haproxy alredy installed. You can edit config<a href="/app/config.py" title="Edit HAProxy config">here</a>'
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
wget http://cbs.centos.org/kojifiles/packages/haproxy/1.8.1/5.el7/x86_64/haproxy18-1.8.1-5.el7.x86_64.rpm
|
||||||
|
yum install haproxy18-1.8.1-5.el7.x86_64.rpm -y
|
||||||
|
|
||||||
|
if [ $? -eq 1 ]
|
||||||
|
then
|
||||||
|
yum install wget socat -y > /dev/null
|
||||||
|
wget http://cbs.centos.org/kojifiles/packages/haproxy/1.8.1/5.el7/x86_64/haproxy18-1.8.1-5.el7.x86_64.rpm
|
||||||
|
yum install haproxy18-1.8.1-5.el7.x86_64.rpm -y
|
||||||
|
fi
|
||||||
|
if [ $? -eq 1 ]
|
||||||
|
then
|
||||||
|
yum install haproxy socat -y > /dev/null
|
||||||
|
fi
|
||||||
echo "" > /etc/haproxy/haproxy.cfg
|
echo "" > /etc/haproxy/haproxy.cfg
|
||||||
cat << EOF > /etc/haproxy/haproxy.cfg
|
cat << EOF > /etc/haproxy/haproxy.cfg
|
||||||
global
|
global
|
||||||
|
@ -37,7 +56,8 @@ defaults
|
||||||
timeout check 10s
|
timeout check 10s
|
||||||
maxconn 3000
|
maxconn 3000
|
||||||
|
|
||||||
listen stats *:8085
|
listen stats
|
||||||
|
bind *:8085
|
||||||
stats enable
|
stats enable
|
||||||
stats uri /stats
|
stats uri /stats
|
||||||
stats realm HAProxy-04\ Statistics
|
stats realm HAProxy-04\ Statistics
|
||||||
|
@ -59,6 +79,7 @@ systemctl restart haproxy
|
||||||
|
|
||||||
if [ $? -eq 1 ]
|
if [ $? -eq 1 ]
|
||||||
then
|
then
|
||||||
echo "Can't start Haproxy service"
|
echo "error: Can't start Haproxy service"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
echo "success"
|
|
@ -8,8 +8,9 @@ fi
|
||||||
|
|
||||||
yum install keepalived -y > /dev/null
|
yum install keepalived -y > /dev/null
|
||||||
if [ $? -eq 1 ]
|
if [ $? -eq 1 ]
|
||||||
then
|
then
|
||||||
exit 1
|
echo "error: Can't install keepalived"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "" > $CONF
|
echo "" > $CONF
|
||||||
|
|
||||||
|
@ -48,7 +49,7 @@ vrrp_instance VI_1 {
|
||||||
EOF
|
EOF
|
||||||
if [ $? -eq 1 ]
|
if [ $? -eq 1 ]
|
||||||
then
|
then
|
||||||
echo "Can't read keepalived config"
|
echo "error: Can't read keepalived config"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
sed -i "s/MASTER/$1/g" $CONF
|
sed -i "s/MASTER/$1/g" $CONF
|
||||||
|
@ -69,6 +70,6 @@ firewall-cmd --reload
|
||||||
|
|
||||||
if [ $? -eq 1 ]
|
if [ $? -eq 1 ]
|
||||||
then
|
then
|
||||||
echo "Can't start keepalived"
|
echo "error: Can't start keepalived"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
|
@ -503,7 +503,7 @@ if form.getvalue('newserver') is not None:
|
||||||
print('Content-type: text/html\n')
|
print('Content-type: text/html\n')
|
||||||
if add_server(hostname, ip, group, typeip, enable, master):
|
if add_server(hostname, ip, group, typeip, enable, master):
|
||||||
show_update_server(hostname)
|
show_update_server(hostname)
|
||||||
|
|
||||||
if form.getvalue('serverdel') is not None:
|
if form.getvalue('serverdel') is not None:
|
||||||
print('Content-type: text/html\n')
|
print('Content-type: text/html\n')
|
||||||
if delete_server(form.getvalue('serverdel')):
|
if delete_server(form.getvalue('serverdel')):
|
||||||
|
|
|
@ -66,6 +66,11 @@
|
||||||
font-family: "Font Awesome 5 Solid";
|
font-family: "Font Awesome 5 Solid";
|
||||||
content: "\f044";
|
content: "\f044";
|
||||||
}
|
}
|
||||||
|
.hap::before {
|
||||||
|
display: none;
|
||||||
|
font-family: "Font Awesome 5 Solid";
|
||||||
|
content: "\f074";
|
||||||
|
}
|
||||||
.ha::before {
|
.ha::before {
|
||||||
display: none;
|
display: none;
|
||||||
font-family: "Font Awesome 5 Solid";
|
font-family: "Font Awesome 5 Solid";
|
||||||
|
|
19
inc/users.js
19
inc/users.js
|
@ -88,6 +88,25 @@ $( function() {
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
$('#install').click(function() {
|
||||||
|
$("#ajax").html('')
|
||||||
|
$.ajax( {
|
||||||
|
url: "options.py",
|
||||||
|
data: {
|
||||||
|
haproxyaddserv: $('#haproxyaddserv').val(),
|
||||||
|
},
|
||||||
|
type: "GET",
|
||||||
|
success: function( data ) {
|
||||||
|
data = data.replace(/\s+/g,' ');
|
||||||
|
if (data.indexOf('error') != '-1' || data.indexOf('alert') != '-1' || data.indexOf('Failed') != '-1') {
|
||||||
|
$("#ajax").html('<div class="alert alert-danger">'+data+'</data>');
|
||||||
|
} else if (data.indexOf('success') != '-1' ){
|
||||||
|
$('.alert-danger').remove();
|
||||||
|
$("#ajax").html('<div class="alert alert-success">'+data+'</data>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
});
|
||||||
$('.alert-danger').remove();
|
$('.alert-danger').remove();
|
||||||
|
|
||||||
$('#add-user').click(function() {
|
$('#add-user').click(function() {
|
||||||
|
|
|
@ -107,15 +107,20 @@ cat << EOF > /etc/httpd/conf.d/haproxy-wi.conf
|
||||||
CustomLog /var/log/httpd/haproxy-wi.access.log combined
|
CustomLog /var/log/httpd/haproxy-wi.access.log combined
|
||||||
|
|
||||||
DocumentRoot /var/www/$HOME_HAPROXY_WI
|
DocumentRoot /var/www/$HOME_HAPROXY_WI
|
||||||
ScriptAlias "/cgi-bin/ "/var/www/$HOME_HAPROXY_WI/app/"
|
ScriptAlias /cgi-bin/ "/var/www/$HOME_HAPROXY_WI/app/"
|
||||||
|
|
||||||
|
|
||||||
<Directory $HOME_HAPROXY_WI>
|
<Directory /var/www/$HOME_HAPROXY_WI/app>
|
||||||
Options +ExecCGI
|
Options +ExecCGI
|
||||||
AddHandler cgi-script .py
|
AddHandler cgi-script .py
|
||||||
Order deny,allow
|
Order deny,allow
|
||||||
Allow from all
|
Allow from all
|
||||||
</Directory>
|
</Directory>
|
||||||
|
|
||||||
|
<FilesMatch "\.config$">
|
||||||
|
Order Deny,Allow
|
||||||
|
Deny from all
|
||||||
|
</FilesMatch>
|
||||||
</VirtualHost>
|
</VirtualHost>
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue