1
0
Fork 0
docker-easy-haproxy/entrypoint.py
2018-10-04 23:35:10 -05:00

112 lines
2.8 KiB
Python

import yaml
import sys
if len(sys.argv) != 2:
print("You need to pass the easyconfig.cfg path")
exit(1)
def defaults(custom):
result = """
defaults
log global
timeout connect 3s
timeout client 10s
timeout server 10m
"""
if custom:
result += """
errorfile 400 /etc/haproxy/errors-custom/400.http
errorfile 403 /etc/haproxy/errors-custom/403.http
errorfile 408 /etc/haproxy/errors-custom/408.http
errorfile 500 /etc/haproxy/errors-custom/500.http
errorfile 502 /etc/haproxy/errors-custom/502.http
errorfile 503 /etc/haproxy/errors-custom/503.http
errorfile 504 /etc/haproxy/errors-custom/504.http
"""
result += """
global
log /dev/log local0
maxconn 2000
"""
return result
def stats(map):
return """
frontend stats
bind *:{2}
mode http
stats enable
stats hide-version
stats realm Haproxy\ Statistics
stats uri /
stats auth {0}:{1}
# acl is_proxystats hdr_dom(host) -i some.host.com
# default_backend srv_stats
# use_backend srv_stats if is_proxystats
default_backend srv_stats
backend srv_stats
mode http
server Local 127.0.0.1:{2}
""".format(map["username"], map["password"], map["port"] if "port" in map else 1936)
def easymapping(o):
port = o["port"]
hosts = o["hosts"] if "hosts" in o else dict()
redir = o["redirect"] if "redirect" in o else dict()
result = """
frontend http_in_{0}
bind *:{0}
mode http
""".format(port)
for k in redir:
host = k.replace(".", "_") + "_{}".format(port)
result += " acl is_redir_{0} hdr_dom(host) -i {1}\n".format(host, k)
result += " use_backend redir_{0} if is_redir_{0}\n\n".format(host)
for k in hosts:
host = k.replace(".", "_") + "_{}".format(port)
result += " acl is_rule_{0} hdr_dom(host) -i {1}\n".format(host, k)
result += " use_backend srv_{0} if is_rule_{0}\n\n".format(host)
for k in redir:
host = k.replace(".", "_") + "_{}".format(port)
result += """
backend redir_{0}
mode http
redirect location {1} code 302
""".format(host, redir[k])
for k in hosts:
host = k.replace(".", "_") + "_{}".format(port)
result += """
backend srv_{0}
balance roundrobin
mode http
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]""".format(host) + """
http-request add-header X-Forwarded-Proto https if { ssl_fc }""" + """
server srv {0} check weight 1
""".format(hosts[k])
return result
with open(sys.argv[1], 'r') as content_file:
parsed = yaml.load(content_file.read())
print(defaults(parsed["customerrors"] if "customerrors" in parsed else False))
if "stats" in parsed:
print(stats(parsed["stats"]))
if "easymapping" in parsed:
for k in parsed["easymapping"]:
print(easymapping(k))