-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathnginxify.py
executable file
·158 lines (129 loc) · 4.74 KB
/
nginxify.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#!/usr/bin/env python
import json
import os
import argparse
nginx_conf_template = """
#Websocket conf
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# ex sub_domain.domain.it
# proxy_name
upstream %s {
# docker_name:port
%s
}
server {
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# server_names
%s
proxy_buffering off;
error_log /proc/self/fd/2;
access_log /proc/self/fd/1;
location / {
resolver 8.8.8.8 valid=30s;
# sub_domain, domain
proxy_pass http://%s;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# HTTP 1.1 support
proxy_http_version 1.1;
proxy_set_header Connection "";
# Websocket conf
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
%s
}
}
"""
secured_template = """
# Optional, only if the app need authentication.
auth_basic "Restricted %s";
auth_basic_user_file /etc/nginx/htpasswd/secure;
"""
def generate_server_names(array):
template = " server_name %s;\n"
result = ""
for n in array:
result += template % n
return result
def generate_upstream_servers(array):
template = " server %s;\n"
result = ""
for n in array:
result += template % n
return result
def generate_proxy_conf(proxy_name, servers, dockers, secured):
servers_names = generate_server_names(servers)
upstream_servers = generate_upstream_servers(dockers)
secured_str = ""
if secured:
secured_str = secured_template % (servers[0])
parameters = (proxy_name, upstream_servers, servers_names, proxy_name,
secured_str)
nginx_proxy = nginx_conf_template % parameters
return nginx_proxy
def generate_configurations(json_data, dest_folder, overwrite):
for proxy in json_data['proxies']:
conf = generate_proxy_conf(proxy['name'], proxy['servers'],
proxy['dockers'],proxy['secured'])
file_path = dest_folder + proxy['name'] + ".conf"
if overwrite:
print("generating confs for", proxy['name'])
with open(file_path, 'w') as out:
out.write(conf)
elif not os.path.exists(file_path):
print("generating confs for", proxy['name'])
with open(file_path, 'w') as out:
out.write(conf)
def generate_default(dest_folder):
default_template = """server {
listen 80 default_server;
server_name _; # This is just an invalid value which will never trigger on a real hostname.
error_page 404 /custom_404.html;
location = /custom_404.html {
root /usr/share/nginx/html;
internal;
}
error_page 500 502 503 504 /custom_50x.html;
location = /custom_50x.html {
root /usr/share/nginx/html;
internal;
}
}
"""
#create default_server
default_path = dest_folder + "default.conf"
if not os.path.exists(default_path):
print("generating confs for default")
with open(default_path, 'w') as f:
f.write(default_template)
def str2bool(v):
return v.lower() in ("True", "true", "t")
def main():
parser = argparse.ArgumentParser(description="nginx conf generator")
parser.add_argument('--default', dest='only_default', default='False',
help='if true generate only the default configurations')
parser.add_argument('--dest', dest='dest_folder', default='./nginx/conf.d/',
help="The folder to save the *.conf files. Default value './nginx/conf.d/'")
parser.add_argument('--conf', dest='confs_file', default='nginx_conf.json',
help="The json file with the configurations. Default value 'nginx_conf.json'")
parser.add_argument('--overwrite', dest='overwrite', default='True',
help="True to overwrite all the configurations files")
args = parser.parse_args()
if not os.path.exists(args.dest_folder):
os.makedirs(args.dest_folder)
if str2bool(args.only_default):
generate_default(args.dest_folder)
else:
generate_default(args.dest_folder)
#read configurations and create conf files
f = open(args.confs_file)
json_data = json.load(f)
f.close()
generate_configurations(json_data, args.dest_folder, str2bool(args.overwrite))
if __name__ == '__main__':
main()