haproxy-wi/app/add.py

255 lines
8.2 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import funct
import sql
2018-09-12 02:25:32 +00:00
import http.cookies
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
template = env.get_template('add.html')
2019-12-04 13:38:07 +00:00
form = funct.form
2019-10-18 17:23:35 +00:00
serv = form.getvalue('serv')
2018-08-28 10:45:09 +00:00
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 = 2)
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:
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)
white_lists = funct.get_files(dir=white_dir, format="lst")
black_lists = funct.get_files(dir=black_dir, format="lst")
2019-09-15 11:51:09 +00:00
2018-08-28 10:45:09 +00:00
template = template.render(title = "Add",
role = role,
2018-08-28 10:45:09 +00:00
user = user,
selects = servers,
add = form.getvalue('add'),
conf_add = form.getvalue('conf'),
group = user_group,
2019-09-15 11:51:09 +00:00
versions = funct.versions(),
options = sql.select_options(),
saved_servers = sql.select_saved_servers(),
white_lists = white_lists,
black_lists = black_lists,
2018-08-28 10:45:09 +00:00
token = token)
print(template)
if form.getvalue('mode') is not None:
2018-08-28 10:45:09 +00:00
cert_path = sql.get_setting('cert_path')
haproxy_dir = sql.get_setting('haproxy_dir')
port = form.getvalue('port')
2018-09-12 02:25:32 +00:00
bind = ""
ip = ""
2018-05-12 15:49:24 +00:00
force_close = form.getvalue('force_close')
2018-09-12 02:25:32 +00:00
balance = ""
mode = " mode " + form.getvalue('mode') + "\n"
2018-09-12 03:36:15 +00:00
maxconn = ""
2018-09-12 02:25:32 +00:00
options_split = ""
ssl = ""
2018-09-12 02:25:32 +00:00
ssl_check = ""
2019-06-30 09:21:52 +00:00
if form.getvalue('balance') is not None:
balance = " balance " + form.getvalue('balance') + "\n"
if form.getvalue('ip') is not None:
ip = form.getvalue('ip')
if form.getvalue('listner') is not None:
2018-09-12 03:36:15 +00:00
name = "listen " + form.getvalue('listner')
backend = ""
2018-08-08 12:06:23 +00:00
end_name = form.getvalue('listner')
elif form.getvalue('frontend') is not None:
2018-09-12 03:36:15 +00:00
name = "frontend " + form.getvalue('frontend')
2019-11-06 15:15:41 +00:00
backend = " default_backend " + form.getvalue('backends') + "\n"
2018-08-08 12:06:23 +00:00
end_name = form.getvalue('frontend')
2018-06-29 06:07:24 +00:00
elif form.getvalue('new_backend') is not None:
2018-09-12 03:36:15 +00:00
name = "backend " + form.getvalue('new_backend')
backend = ""
2018-08-08 12:06:23 +00:00
end_name = form.getvalue('new_backend')
2018-09-12 03:36:15 +00:00
if form.getvalue('maxconn'):
maxconn = " maxconn " + form.getvalue('maxconn') + "\n"
2018-02-17 17:20:30 +00:00
if form.getvalue('ssl') == "https" and form.getvalue('mode') != "tcp":
ssl = "ssl crt " + cert_path + form.getvalue('cert')
2018-02-17 17:20:30 +00:00
if form.getvalue('ssl-check') == "ssl-check":
ssl_check = " ssl verify none"
else:
ssl_check = " ssl verify"
2018-08-28 03:34:10 +00:00
if not ip and port is not None:
2018-02-17 17:20:30 +00:00
bind = " bind *:"+ port + " " + ssl + "\n"
elif port is not None:
2018-02-17 17:20:30 +00:00
bind = " bind " + ip + ":" + port + " " + ssl + "\n"
if form.getvalue('default-check') == "1":
if form.getvalue('check-servers') == "1":
check = " check inter " + form.getvalue('inter') + " rise " + form.getvalue('rise') + " fall " + form.getvalue('fall') + ssl_check
else:
check = ""
else:
if form.getvalue('check-servers') != "1":
check = ""
else:
check = " check" + ssl_check
if form.getvalue('option') is not None:
options = form.getvalue('option')
i = options.split("\n")
for j in i:
options_split += " " + j + "\n"
2018-05-12 15:49:24 +00:00
if force_close == "1":
options_split += " option http-server-close\n"
elif force_close == "2":
options_split += " option forceclose\n"
elif force_close == "3":
options_split += " option http-pretend-keepalive\n"
2018-08-09 12:11:10 +00:00
if form.getvalue('blacklist') is not None:
2018-08-17 04:41:50 +00:00
options_split += " tcp-request connection reject if { src -f "+haproxy_dir+"/black/"+form.getvalue('blacklist')+" }\n"
2018-08-09 12:11:10 +00:00
2018-05-12 15:49:24 +00:00
if form.getvalue('cookie'):
cookie = " cookie "+form.getvalue('cookie_name')
if form.getvalue('cookie_domain'):
cookie += " domain "+form.getvalue('cookie_domain')
2018-05-12 16:41:07 +00:00
if form.getvalue('rewrite'):
rewrite = form.getvalue('rewrite')
2019-06-30 09:21:52 +00:00
else:
rewrite = ""
2018-05-12 18:11:58 +00:00
if form.getvalue('prefix'):
prefix = form.getvalue('prefix')
2019-06-30 09:21:52 +00:00
else:
prefix = ""
2018-05-12 16:41:07 +00:00
if form.getvalue('nocache'):
nocache = form.getvalue('nocache')
2019-06-30 09:21:52 +00:00
else:
nocache = ""
2018-05-12 16:41:07 +00:00
if form.getvalue('postonly'):
postonly = form.getvalue('postonly')
2019-06-30 09:21:52 +00:00
else:
postonly = ""
2018-05-12 16:41:07 +00:00
if form.getvalue('dynamic'):
dynamic = form.getvalue('dynamic')
2019-06-30 09:21:52 +00:00
else:
dynamic = ""
2018-05-12 18:11:58 +00:00
cookie += " "+rewrite+" "+prefix+" "+nocache+" "+postonly+" "+dynamic+"\n"
2018-05-12 15:49:24 +00:00
options_split += cookie
2018-05-12 16:41:07 +00:00
if form.getvalue('dynamic'):
options_split += " dynamic-cookie-key " + form.getvalue('dynamic-cookie-key')+"\n"
2018-08-27 11:28:29 +00:00
servers_split = ""
if form.getvalue('servers') is not None:
2018-08-27 11:28:29 +00:00
servers = form.getlist('servers')
server_port = form.getlist('server_port')
i = 0
for server in servers:
if form.getvalue('template') is None:
servers_split += " server "+server+" " + server +":"+server_port[i]+ check + "\n"
else:
servers_split += " server-template "+form.getvalue('prefix')+" "+form.getvalue('template-number')+" "+ server +":"+server_port[i]+ check + "\n"
2018-08-27 11:28:29 +00:00
i += 1
2018-08-08 12:06:23 +00:00
2018-08-09 12:11:10 +00:00
compression = form.getvalue("compression")
cache = form.getvalue("cache")
compression_s = ""
cache_s = ""
2018-08-08 12:06:23 +00:00
cache_set = ""
filter = ""
2018-08-09 12:11:10 +00:00
if compression == "1" or cache == "2":
2018-08-08 12:06:23 +00:00
filter = " filter compression\n"
2018-08-09 12:11:10 +00:00
if compression == "1":
compression_s = " compression algo gzip\n compression type text/html text/plain text/css\n"
if cache == "2":
cache_s = " http-request cache-use "+end_name+"\n http-response cache-store "+end_name+"\n"
2018-08-08 12:06:23 +00:00
cache_set = "cache "+end_name+"\n total-max-size 4\n max-age 240\n"
2018-08-17 04:41:50 +00:00
waf = ""
if form.getvalue('waf') is not None:
2018-08-17 17:08:07 +00:00
waf = " filter spoe engine modsecurity config "+haproxy_dir+"/waf.conf\n"
2018-08-17 04:41:50 +00:00
waf += " http-request deny if { var(txn.modsec.code) -m int gt 0 }\n"
2018-09-12 03:36:15 +00:00
config_add = "\n" + name + "\n" + bind + mode + maxconn + balance + options_split + filter + compression_s + cache_s + waf + backend + servers_split + "\n" + cache_set
2019-10-18 17:23:35 +00:00
if form.getvalue('new_userlist') is not None:
name = "userlist "+form.getvalue('new_userlist')+ "\n"
2019-10-18 17:23:35 +00:00
new_userlist_groups = ""
if form.getvalue('userlist-group') is not None:
groups = form.getlist('userlist-group')
for group in groups:
new_userlist_groups += " group "+group+ "\n"
new_users_list = ""
if form.getvalue('userlist-user') is not None:
users = form.getlist('userlist-user')
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]
except:
group = ''
new_users_list += " user "+user+" insecure-password " + passwords[i] +group+ "\n"
i += 1
config_add = "\n" + name + new_userlist_groups + new_users_list
2019-10-18 17:23:35 +00:00
try:
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("Can't read import config file")
funct.logging(serv, "add.py add new %s" % name)
print('<div class="line3" style="position: absolute;top: 35px;left: 200px;">')
2019-10-18 17:23:35 +00:00
MASTERS = sql.is_master(serv)
for master in MASTERS:
if master[0] != None:
funct.upload_and_restart(master[0], cfg)
2019-10-18 17:23:35 +00:00
stderr = funct.upload_and_restart(serv, cfg, just_save="save")
if stderr:
print('<div class="alert alert-danger">%s</div><div id="close"><span title="Close" style="cursor: pointer; float: right;">X</span></div>' % stderr)
2019-10-18 17:23:35 +00:00
else:
print('<meta http-equiv="refresh" content="0; url=add.py?add=%s&conf=%s&serv=%s">' % (name, config_add, serv))
print('</div>')
except:
pass