apache-frontend: fix double publication bug
[slapos.git] / software / apache-frontend / templates / apache-custom-slave-list.cfg.in
1 {% if software_type == slap_software_type -%}
2
3 {% set cached_server_dict = {} -%}
4 {% set part_list = [] -%}
5 {% set cache_access = "http://%s:%s" % (local_ipv4, cache_port) -%}
6 {% set TRUE_VALUES = ['y', 'yes', '1', 'true'] -%}
7 {% set generic_instance_parameter_dict = {'cache_access': cache_access,} -%}
8 {% set slave_log_dict = {} -%}
9 {% if extra_slave_instance_list -%}
10 {%   set slave_instance_information_list = [] -%}
11 {%   set slave_instance_list = slave_instance_list + json_module.loads(extra_slave_instance_list) -%}
12 {% endif -%}
13 [jinja2-template-base]
14 recipe = slapos.recipe.template:jinja2
15 rendered = {{ apache_configuration_directory }}/${:filename}
16 extra-context =
17 context =
18     key eggs_directory buildout:eggs-directory
19     key develop_eggs_directory buildout:develop-eggs-directory
20     ${:extra-context}
21
22 {% do logrotate_dict.pop('recipe') %}
23 [logrotate]
24 {% for key, value in logrotate_dict.iteritems() -%}
25 {{ key }} = {{ value }}
26 {% endfor %}
27
28 # Loop trhought slave list to set up slaves
29 {% for slave_instance in slave_instance_list -%}
30 {%   set slave_reference = slave_instance.get('slave_reference') -%}
31 {%   set slave_section_title = 'dynamic-template-slave-instance-%s' % slave_reference -%}
32 {%   set slave_parameter_dict = generic_instance_parameter_dict.copy() -%}
33 {%   set slave_publish_dict = {} -%}
34 {%   do part_list.append(slave_section_title) -%}
35
36 ############################
37 #### Set Slave Log Directory and access
38
39 {%   set slave_directory_section = slave_reference + "-directory" -%}
40 {%   set slave_log_folder = logrotate_dict.get('backup') + '/' + slave_reference + "-logs" -%}
41 [{{slave_directory_section}}]
42 recipe = slapos.cookbook:mkdirectory
43 log-folder = {{slave_log_folder}}
44
45 # Set Up log files
46 {%   do slave_parameter_dict.__setitem__('access_log', '/'.join([apache_log_directory, '%s_access_log' % slave_reference])) -%}
47 {%   do slave_parameter_dict.__setitem__('error_log', '/'.join([apache_log_directory, '%s_error_log' % slave_reference])) -%}
48 {%       do slave_instance.__setitem__('access_log', slave_parameter_dict.get('access_log')) -%}
49 {%       do slave_instance.__setitem__('error_log', slave_parameter_dict.get('error_log')) -%}
50
51 # Set slave logrotate entry
52 {%   set slave_logrotate_section = slave_reference + "-logs" -%}
53 {%   do part_list.append(slave_logrotate_section) -%}
54 [{{slave_logrotate_section}}]
55 <= logrotate
56 recipe = slapos.cookbook:logrotate.d
57 name = ${:_buildout_section_name_}
58 log = {{slave_parameter_dict.get('access_log')}} {{slave_parameter_dict.get('error_log')}}
59 backup = {{ '${' + slave_directory_section + ':log-folder}' }}
60 frequency = daily
61 rotatep-num = 30
62 post = {{ apache_configuration.get('frontend-graceful-command') }}
63 sharedscripts = true
64 notifempty = true
65 create = true
66
67 # integrate current logs inside
68 {%   set slave_ln_section = slave_reference + "-ln" -%}
69 {%   do part_list.append(slave_ln_section) -%}
70 [{{slave_ln_section}}]
71 recipe = plone.recipe.command
72 stop-on-error = false
73 command = ln -s {{slave_parameter_dict.get('error_log')}} {{ '${' + slave_directory_section + ':log-folder}' }}/apache-error.log && ln -s {{slave_parameter_dict.get('access_log')}} {{ '${' + slave_directory_section + ':log-folder}' }}/apache-access.log
74
75 # Set password for slave
76 {%   set slave_password_section = slave_reference + "-password" -%}
77 [{{slave_password_section}}]
78 recipe = slapos.cookbook:generate.password
79 storage-path = {{apache_configuration_directory}}/.{{slave_reference}}.passwd
80 bytes = 8
81
82 # Set up htaccess file for slave
83 {%   set slave_htaccess_section = slave_reference + '-htaccess' %}
84 {%   do part_list.append(slave_htaccess_section) -%}
85 [{{slave_htaccess_section}}]
86 recipe = plone.recipe.command
87 stop-on-error = true
88 htaccess-path = {{apache_configuration_directory}}/.{{slave_reference}}.htaccess
89 command = {{frontend_configuration.get('apache-directory')}}/bin/htpasswd -cb ${:htaccess-path} {{ slave_reference }} {{ '${' + slave_password_section + ':passwd}' }}
90
91 # Add slave log directory to the slave log access dict
92 {%   do slave_log_dict.__setitem__(slave_reference, slave_log_folder) %}
93
94 {%   set slave_log_access_url = 'https://' + slave_reference + ':${'+ slave_password_section +':passwd}@[' + frontend_configuration.get('apache-ipv6') + ']:' + frontend_configuration.get('apache-https-port') + '/' + slave_reference.lower() + '/' %}
95 {%   do slave_publish_dict.__setitem__('log-access', slave_log_access_url) %}
96
97 ############################
98 #### Set Slave Certificates if needed
99
100 # Set ssl certificates for each slave
101 {%   for cert_name in ('ssl_key', 'ssl_crt', 'ssl_ca_crt', 'ssl_csr')-%}
102 {%     if cert_name in slave_instance -%}
103 {%       set cert_title = '%s-%s' % (slave_reference, cert_name.replace('ssl_', '')) -%}
104 {%       set cert_file = '/'.join([custom_ssl_directory, cert_title.replace('-','.')]) -%}
105 {%       do part_list.append(cert_title) -%}
106 {%       do slave_parameter_dict.__setitem__(cert_name, cert_file) -%}
107 {%       do slave_instance.__setitem__('path_to_' + cert_name, cert_file) -%}
108 # Store certificates on fs
109 [{{ cert_title }}]
110 < = jinja2-template-base
111 template = {{ empty_template }}
112 rendered = {{ cert_file }}
113 extra-context =
114     key content {{ cert_title + '-config:value' }}
115 # Store certificate in config
116 [{{ cert_title + '-config' }}]
117 value = {{ dumps(slave_instance.get(cert_name)) }}
118 {%     endif -%}
119 {%   endfor -%}
120
121 ############################
122 #### Set Slave Configuration
123
124 {%   if slave_instance.has_key('apache_custom_http') %}
125 #### Set Configuration for custom slaves
126
127 # Set up apache configuration file for slave
128 [{{ slave_section_title }}]
129 < = jinja2-template-base
130 template = {{ template_custom_slave_configuration }}
131 filename = {{ '%s.conf' % slave_reference }}
132 extra-context =
133     key apache_custom_https {{ 'slave-instance-%s-configuration:apache_custom_https' % slave_reference }}
134     key apache_custom_http {{ 'slave-instance-%s-configuration:apache_custom_http' % slave_reference }}
135     raw https_port {{ https_port }}
136     raw http_port {{ http_port }}
137 {{ '\n' }}
138
139
140 # Set apache configuration value for slave
141 [{{ ('slave-instance-%s-configuration' % slave_reference) }}]
142 {%   set apache_custom_http = ((slave_instance.get('apache_custom_http', '')) % slave_parameter_dict) -%}
143 {%   set apache_custom_https = ((slave_instance.get('apache_custom_https', '')) % slave_parameter_dict) -%}
144 apache_custom_http = {{ dumps(apache_custom_http) }}
145 apache_custom_https = {{ dumps(apache_custom_https) }}
146 {{ '\n' }}
147
148 # The slave use cache
149 {%     if 'enable_cache' in slave_instance and 'url' in slave_instance and 'domain' in slave_instance -%}
150 {%       do cached_server_dict.__setitem__(slave_instance.get('domain'), slave_instance.get('url')) -%}
151 {%     endif -%}
152
153 # Publish information
154 {%     do slave_publish_dict.update(**{'slave-reference':slave_instance.get('slave_reference'), 'public-ipv4':public_ipv4, 'log-access': slave_log_access_url}) %}
155
156 {%   else %}
157 #### Set Configuration for default slaves
158
159 # Set slave domain if none was defined
160 {%     if slave_instance.get('custom_domain', None) == None -%}
161 {%       do slave_instance.__setitem__('custom_domain', "%s.%s" % (slave_instance.get('slave_reference').replace("-", "").lower(), slapparameter_dict.get('domain'))) -%}
162 {%     endif -%}
163
164 # The slave use cache
165 # Next line is forbidden and people who copy it will be hanged short
166 {%     set enable_cache = ('' ~ slave_instance.get('enable_cache', '')).lower() in TRUE_VALUES -%}
167 {%     if enable_cache -%}
168 {%       do cached_server_dict.__setitem__(slave_instance.get('custom_domain'), slave_instance.get('url')) -%}
169 {%       do slave_instance.__setitem__('url', cache_access) -%}
170 {%     endif -%}
171 {%     do part_list.append(slave_section_title) -%}
172
173
174 [{{ ('slave-instance-%s-configuration' % slave_reference) }}]
175 {%     for key, value in slave_instance.iteritems() -%}
176 {{ key }} = {{ dumps(value) }}
177 {%     endfor %}
178
179 # Set up slave configuration file
180 [{{ slave_section_title }}]
181 < = jinja2-template-base
182 template = {{ template_default_slave_configuration }}
183 filename = {{ '%s.conf' % slave_reference }}
184
185 extensions = jinja2.ext.do
186 extra-context =
187     section slave_parameter {{ 'slave-instance-%s-configuration' % slave_reference }}
188     raw https_port {{ https_port }}
189     raw http_port {{ http_port }}
190 {{ '\n' }}
191
192 {%     do slave_publish_dict.update(**{'slave-reference':slave_instance.get('slave_reference'), 'public-ipv4':public_ipv4, 'domain':slave_instance.get('custom_domain'), 'url':"http://%s" % slave_instance.get('custom_domain'), 'site_url':"http://%s" % slave_instance.get('custom_domain')}) %}
193
194 {%   endif -%}
195
196 ############################
197 #### Publish Slave Information
198
199 # Publish slave information
200 {%   if not extra_slave_instance_list -%}
201 {%     set publish_section_title = 'publish-%s-connection-information' % slave_instance.get('slave_reference') -%}
202 {%     do part_list.append(publish_section_title) -%}
203 [{{ publish_section_title }}]
204 recipe = slapos.cookbook:publish
205 {%     for key, value in slave_publish_dict.iteritems() %}
206 {{ key }} = {{ value }}
207 {%     endfor %}
208 {%   else -%}
209 {%     do slave_instance_information_list.append(slave_publish_dict) -%}
210 {%   endif -%}
211 {% endfor -%}
212
213 [slave-log-directories]
214 {% for key, value in slave_log_dict.iteritems() -%}
215 {{ key }} = {{ value }}
216 {% endfor %}
217
218 # Define log access
219 {% set log_access_section = "apache-log-access" %}
220 {% do part_list.append(log_access_section) -%}
221 [{{log_access_section}}]
222 < = jinja2-template-base
223 template = {{frontend_configuration.get('template-log-access')}}
224 rendered = {{frontend_configuration.get('log-access-configuration')}}
225 extra-context =
226     section slave_log_directory slave-log-directories
227     raw apache_log_directory {{apache_log_directory}}
228     raw apache_configuration_directory {{apache_configuration_directory}}
229
230 # Publish information for the instance
231 {% set publish_section_title = 'publish-apache-information' -%}
232 {% do part_list.append(publish_section_title) -%}
233 [{{ publish_section_title }}]
234 recipe = slapos.cookbook:publish
235 public-ipv4 = {{ public_ipv4 }}
236 private-ipv4 = {{ local_ipv4 }}
237 {% if extra_slave_instance_list -%}
238 slave-instance-information-list = {{ json_module.dumps(slave_instance_information_list) }}
239 {% endif -%}
240 monitor_url = {{ monitor_url }}
241
242 {% do part_list.append('cached-rewrite-rules') -%}
243 [cached-rewrite-rules]
244 < = jinja2-template-base
245 template = {{ template_rewrite_cached }}
246 rendered = {{ rewrite_cached_configuration }}
247 extra-context =
248     import json_module json
249     key server_dict rewrite-rules:rules
250
251 [rewrite-rules]
252 rules = {{ dumps(cached_server_dict) }}
253
254 [buildout]
255 parts +=
256 {% for part in part_list -%}
257 {{ '    %s' % part }}
258 {% endfor -%}
259
260 eggs-directory = {{ eggs_directory }}
261 develop-eggs-directory = {{ develop_eggs_directory }}
262 offline = true
263 cache-access = {{ cache_access }}
264
265 {% endif -%}