apache-custom-slave-list.cfg.in 14.8 KB
Newer Older
1 2
{% if software_type == slap_software_type -%}

3 4
{% set cached_server_dict = {} -%}
{% set part_list = [] -%}
5
{% set cache_access = "http://%s:%s" % (local_ipv4, cache_port) -%}
6
{% set ssl_cache_access = "http://%s:%s/HTTPS" % (local_ipv4, cache_port) -%}
7
{% set TRUE_VALUES = ['y', 'yes', '1', 'true'] -%}
8
{% set NGINX_TYPE_LIST = ['eventsource', 'notebook'] -%}
9
{% set generic_instance_parameter_dict = {'cache_access': cache_access,} -%}
10
{% set slave_log_dict = {} -%}
11
{% if extra_slave_instance_list -%}
12
{%   set slave_instance_information_list = [] -%}
13 14
{%   set slave_instance_list = slave_instance_list + json_module.loads(extra_slave_instance_list) -%}
{% endif -%}
15 16
[jinja2-template-base]
recipe = slapos.recipe.template:jinja2
17
extensions = jinja2.ext.do
18 19 20 21 22 23
extra-context =
context =
    key eggs_directory buildout:eggs-directory
    key develop_eggs_directory buildout:develop-eggs-directory
    ${:extra-context}

24 25 26 27 28 29
{% do logrotate_dict.pop('recipe') %}
[logrotate]
{% for key, value in logrotate_dict.iteritems() -%}
{{ key }} = {{ value }}
{% endfor %}

30 31 32 33 34 35 36 37 38
[cadirectory]
recipe = slapos.cookbook:mkdirectory
requests = {{ custom_ssl_directory }}/requests/
private = {{ custom_ssl_directory }}/private/
certs = {{ custom_ssl_directory }}/certs/
newcerts = {{ custom_ssl_directory }}/newcerts/
crl = {{ custom_ssl_directory }}/crl/

{# Loop throught slave list to set up slaves #}
39
{% for slave_instance in slave_instance_list -%}
40
{#   # Do all set and do upper, so it makes easy to read the file later #} 
41
{%   set slave_reference = slave_instance.get('slave_reference') -%}
42
{%   set slave_type = slave_instance.get('type', '') -%}
43
{%   set slave_section_title = 'dynamic-template-slave-instance-%s' % slave_reference -%}
44
{%   set slave_parameter_dict = generic_instance_parameter_dict.copy() -%}
45
{%   set slave_publish_dict = {} -%}
46
{%   set slave_configuration_section_name = 'slave-instance-%s-configuration' % slave_reference %}
47 48 49 50
{%   set slave_logrotate_section = slave_reference + "-logs" -%}
{%   set slave_password_section = slave_reference + "-password" -%}
{%   set slave_ln_section = slave_reference + "-ln" -%}
{%   set slave_htaccess_section = slave_reference + '-htaccess' %}
51

52 53 54
{#   extend parts #}
{%   do part_list.extend([slave_htaccess_section, slave_ln_section]) -%}
{%   do part_list.extend([slave_logrotate_section, slave_section_title]) -%}
55 56 57

{%   set slave_log_folder = logrotate_dict.get('backup') + '/' + slave_reference + "-logs" -%}

58
{#   Set Up log files #}
59 60
{%   do slave_parameter_dict.__setitem__('access_log', '/'.join([apache_log_directory, '%s_access_log' % slave_reference])) -%}
{%   do slave_parameter_dict.__setitem__('error_log', '/'.join([apache_log_directory, '%s_error_log' % slave_reference])) -%}
61 62
{%   do slave_instance.__setitem__('access_log', slave_parameter_dict.get('access_log')) -%}
{%   do slave_instance.__setitem__('error_log', slave_parameter_dict.get('error_log')) -%}
63

64 65 66 67 68 69 70 71 72 73
{#   Add slave log directory to the slave log access dict #}
{%   do slave_log_dict.__setitem__(slave_reference, slave_log_folder) %}

{%   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() + '/' %}
{%   do slave_publish_dict.__setitem__('log-access', slave_log_access_url) %}
{%   do slave_publish_dict.__setitem__('slave-reference', slave_reference) %}
{%   do slave_publish_dict.__setitem__('public-ipv4', public_ipv4) %}

{# Set slave domain if none was defined #}
{%   if slave_instance.get('custom_domain', None) == None -%}
74 75 76 77 78 79
{%     set domain_prefix = slave_instance.get('slave_reference').replace("-", "").lower() -%}
{%     if slave_type in NGINX_TYPE_LIST -%}
{%       do slave_instance.__setitem__('custom_domain', "%s.%s" % (domain_prefix, slapparameter_dict.get('nginx-domain', slapparameter_dict.get('domain')))) -%}
{%     else -%}
{%       do slave_instance.__setitem__('custom_domain', "%s.%s" % (domain_prefix, slapparameter_dict.get('domain'))) -%}
{%     endif -%}
80 81
{%   endif -%}

82
{%   set enable_cache = (('' ~ slave_instance.get('enable_cache', '')).lower() in TRUE_VALUES and slave_type != 'redirect') -%}
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
{%   if enable_cache and 'url' in slave_instance -%}
{%     if 'domain' in slave_instance -%}
{%       do slave_instance.__setitem__('custom_domain', slave_instance.get('domain')) -%}
{%     endif -%}
{%     do slave_instance.__setitem__('backend_url', slave_instance.get('url')) -%}
{%     do slave_instance.__setitem__('https_backend_url', slave_instance.get('https-url', slave_instance.get('url'))) -%}
{%     do slave_instance.__setitem__('url', cache_access) -%}
{%     do slave_instance.__setitem__('https-url', ssl_cache_access) -%}
{%     do cached_server_dict.__setitem__(slave_reference, slave_configuration_section_name) -%}
{%   endif -%}

{%   if not slave_instance.has_key('apache_custom_http') %}
{%     do slave_publish_dict.__setitem__('domain', slave_instance.get('custom_domain')) -%}
{%     do slave_publish_dict.__setitem__('url', "http://%s" % slave_instance.get('custom_domain')) -%}
{%     do slave_publish_dict.__setitem__('site_url', "http://%s" % slave_instance.get('custom_domain')) -%}
{%     do slave_publish_dict.__setitem__('secure_access', 'https://%s' % slave_instance.get('custom_domain')) -%}
{%   endif -%}

[slave-log-directory]
{{slave_reference}}-log-folder = {{ slave_log_folder }}

{# Set slave logrotate entry #}
105 106 107 108 109
[{{slave_logrotate_section}}]
<= logrotate
recipe = slapos.cookbook:logrotate.d
name = ${:_buildout_section_name_}
log = {{slave_parameter_dict.get('access_log')}} {{slave_parameter_dict.get('error_log')}}
110
backup = {{ slave_log_folder }} 
111 112
frequency = daily
rotatep-num = 30
113
post = {{ apache_configuration.get('frontend-graceful-command') }}
114 115 116 117
sharedscripts = true
notifempty = true
create = true

118
{# integrate current logs inside #}
119 120 121
[{{slave_ln_section}}]
recipe = plone.recipe.command
stop-on-error = false
122
command = ln -s {{slave_parameter_dict.get('error_log')}} {{ slave_log_folder }}/apache-error.log && ln -s {{slave_parameter_dict.get('access_log')}} {{ slave_log_folder }}/apache-access.log
123

124
{# Set password for slave #}
125 126 127 128 129
[{{slave_password_section}}]
recipe = slapos.cookbook:generate.password
storage-path = {{apache_configuration_directory}}/.{{slave_reference}}.passwd
bytes = 8

130
{# Set up htaccess file for slave #}
131 132 133 134 135 136
[{{slave_htaccess_section}}]
recipe = plone.recipe.command
stop-on-error = true
htaccess-path = {{apache_configuration_directory}}/.{{slave_reference}}.htaccess
command = {{frontend_configuration.get('apache-directory')}}/bin/htpasswd -cb ${:htaccess-path} {{ slave_reference }} {{ '${' + slave_password_section + ':passwd}' }}

137 138
{# ################################################## #}
{# Set Slave Certificates if needed                   #}
139

140
{# Set ssl certificates for each slave #}
141
{%   for cert_name in ('ssl_ca_crt', 'ssl_csr', 'ssl_proxy_ca_crt')-%}
142 143 144 145
{%     if cert_name in slave_instance -%}
{%       set cert_title = '%s-%s' % (slave_reference, cert_name.replace('ssl_', '')) -%}
{%       set cert_file = '/'.join([custom_ssl_directory, cert_title.replace('-','.')]) -%}
{%       do part_list.append(cert_title) -%}
146
{%       do slave_parameter_dict.__setitem__(cert_name, cert_file) -%}
147
{%       do slave_instance.__setitem__('path_to_' + cert_name, cert_file) -%}
148
{# Store certificates on fs #}
149 150 151 152 153 154
[{{ cert_title }}]
< = jinja2-template-base
template = {{ empty_template }}
rendered = {{ cert_file }}
extra-context =
    key content {{ cert_title + '-config:value' }}
155
# Store certificate in config
156 157 158 159 160
[{{ cert_title + '-config' }}]
value = {{ dumps(slave_instance.get(cert_name)) }}
{%     endif -%}
{%   endfor -%}

161 162 163 164 165 166
{%   if 'ssl_key' in slave_instance and 'ssl_crt' in slave_instance -%}
{%     set cert_title = '%s-crt' % (slave_reference) -%}
{%     set key_title = '%s-key' % (slave_reference) -%}
{%     set cert_file = '/'.join([custom_ssl_directory, cert_title.replace('-','.')]) -%}
{%     set key_file = '/'.join([custom_ssl_directory, key_title.replace('-','.')]) -%}
{%     do part_list.append(cert_title) -%}
167 168
{%     do slave_parameter_dict.__setitem__("ssl_crt", cert_file) -%}
{%     do slave_parameter_dict.__setitem__("ssl_key", key_file) -%}
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
{%     do slave_instance.__setitem__('path_to_ssl_crt', cert_file) -%}
{%     do slave_instance.__setitem__('path_to_ssl_key', key_file) -%}

[{{cert_title}}]
recipe = slapos.cookbook:certificate_authority.request
#openssl-binary = ${openssl:location}/bin/openssl

requests-directory = ${cadirectory:requests}
ca-private = ${cadirectory:private}
ca-certs = ${cadirectory:certs}
ca-newcerts = ${cadirectory:newcerts}
ca-crl = ${cadirectory:crl}

key-file = {{ key_file }}
cert-file = {{ cert_file }}
key-content = {{ dumps(slave_instance.get('ssl_key')) }}
cert-content = {{ dumps(slave_instance.get('ssl_crt')) }} 
{%     endif -%}

188 189
{# ########################################## #}
{# Set Slave Configuration                    #}
190
[{{ slave_configuration_section_name }}]
191 192
{%     set apache_custom_http = ((slave_instance.pop('apache_custom_http', '')) % slave_parameter_dict) -%}
{%     set apache_custom_https = ((slave_instance.pop('apache_custom_https', '')) % slave_parameter_dict) -%}
193 194
apache_custom_http = {{ dumps(apache_custom_http) }}
apache_custom_https = {{ dumps(apache_custom_https) }}
195 196 197 198
{{ '\n' }}
{%     for key, value in slave_instance.iteritems() -%}
{{ key }} = {{ dumps(value) }}
{%     endfor %}
199 200 201

[{{ slave_section_title }}]
< = jinja2-template-base
202 203 204 205 206 207 208 209
{%   if slave_type in NGINX_TYPE_LIST %}
rendered = {{ nginx_configuration_directory }}/${:filename}
{%   else %}
rendered = {{ apache_configuration_directory }}/${:filename}
{%   endif %}


{%   if apache_custom_http %}
210
template = {{ template_custom_slave_configuration }}
211 212 213 214
{%   elif slave_type == 'eventsource' %}
template = {{ template_eventsource_slave_configuration }}
{%   elif slave_type == 'notebook' %}
template = {{ template_notebook_slave_configuration }}
215
{%   else %}
216
template = {{ template_default_slave_configuration }}
217
{%   endif %}
218

219 220 221 222
filename = {{ '%s.conf' % slave_reference }}
extra-context =
    raw https_port {{ https_port }}
    raw http_port {{ http_port }}
223 224 225 226
    raw global_ipv6 {{ global_ipv6 }}
    raw local_ipv4 {{ local_ipv4 }}
    raw nginx_http_port {{ nginx_http_port }} 
    raw nginx_https_port {{ nginx_https_port }}
227
    section slave_parameter {{ slave_configuration_section_name }}
228
{{ '\n' }}
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268


{%   set check_error_log_section_title = 'check-%s-error-log-last-hour' % slave_instance.get('slave_reference') -%}
{%   do part_list.append(check_error_log_section_title) -%}
[{{ check_error_log_section_title }}]
recipe = slapos.cookbook:wrapper
command-line = {{ bin_directory }}/check-error-on-apache-log -l {{ slave_instance.get('error_log') }} -d 3600 
filename = {{ check_error_log_section_title }}
wrapper-path = {{ promise_directory }}/${:filename}

{%   set check_error_log_section_title = 'check-%s-error-log-last-day' % slave_instance.get('slave_reference') -%}
{%   do part_list.append(check_error_log_section_title) -%}
[{{ check_error_log_section_title }}]
recipe = slapos.cookbook:wrapper
command-line = {{ bin_directory }}/check-error-on-apache-log -l {{ slave_instance.get('error_log') }} -d 86400
filename = {{ check_error_log_section_title }}
wrapper-path = {{ promise_directory }}/${:filename}

{%   set monitor_ipv6_test = slave_instance.get('monitor-ipv6-test', '') %}
{%   if monitor_ipv6_test %}
{%     set monitor_ipv6_section_title = 'check-%s-ipv6-packet-list-test' % slave_instance.get('slave_reference') %}
{%     do part_list.append(monitor_ipv6_section_title) -%}
[{{ monitor_ipv6_section_title }}]
recipe = slapos.cookbook:wrapper
command-line = {{ bin_directory }}/is-icmp-packet-lost -a {{monitor_ipv6_test}} 
filename = {{ monitor_ipv6_section_title }}
wrapper-path = {{ promise_directory }}/${:filename}
{%   endif %}

{%   set monitor_ipv4_test = slave_instance.get('monitor-ipv4-test', '') %}
{%   if monitor_ipv4_test %}
{%     set monitor_ipv4_section_title = 'check-%s-ipv4-packet-list-test' % slave_instance.get('slave_reference') %}
{%     do part_list.append(monitor_ipv4_section_title) -%}
[{{ monitor_ipv4_section_title }}]
recipe = slapos.cookbook:wrapper
command-line = {{ bin_directory }}/is-icmp-packet-lost -4 -a {{monitor_ipv4_test}}
filename = {{ monitor_ipv4_section_title }}
wrapper-path = {{ promise_directory }}/${:filename}
{%   endif %}

269 270
{# ###############################  #}
{# Publish Slave Information        #}
271 272 273 274 275 276 277 278 279 280 281
{%   if not extra_slave_instance_list -%}
{%     set publish_section_title = 'publish-%s-connection-information' % slave_instance.get('slave_reference') -%}
{%     do part_list.append(publish_section_title) -%}
[{{ publish_section_title }}]
recipe = slapos.cookbook:publish
{%     for key, value in slave_publish_dict.iteritems() %}
{{ key }} = {{ value }}
{%     endfor %}
{%   else -%}
{%     do slave_instance_information_list.append(slave_publish_dict) -%}
{%   endif -%}
282 283

{# End of the main for loop#}
284 285 286
{% endfor -%}

###############################################
287 288 289 290 291 292 293 294 295 296 297 298 299 300
### Prepare virtualhost for slaves using cache

{% for slave_reference, slave_configuration_section_name in cached_server_dict.iteritems() %}
{%   set cached_slave_configuration_section_title = '%s-cached-virtualhost' % slave_reference %}
{%   do part_list.append(cached_slave_configuration_section_title) -%}
[{{ cached_slave_configuration_section_title }}]
< = jinja2-template-base
template = {{ template_cached_slave_configuration }}
filename = {{ '%s.conf' % slave_reference }}
rendered = {{ apache_cached_configuration_directory }}/${:filename}
extensions = jinja2.ext.do
extra-context =
    section slave_parameter {{ slave_configuration_section_name }}
    raw cached_port {{ cached_port }}
301
    raw ssl_cached_port {{ ssl_cached_port }}
302 303 304
{{ '\n' }}
{% endfor %}

305
[slave-log-directories]
306
recipe = slapos.cookbook:mkdirectory
307 308 309 310
{% for key, value in slave_log_dict.iteritems() -%}
{{ key }} = {{ value }}
{% endfor %}

311 312
{# Define log access #}
[apache-log-access]
313 314 315 316 317 318 319 320
< = jinja2-template-base
template = {{frontend_configuration.get('template-log-access')}}
rendered = {{frontend_configuration.get('log-access-configuration')}}
extra-context =
    section slave_log_directory slave-log-directories
    raw apache_log_directory {{apache_log_directory}}
    raw apache_configuration_directory {{apache_configuration_directory}}

321
{# Publish information for the instance #}
322 323 324 325 326 327 328 329 330
{% set publish_section_title = 'publish-apache-information' -%}
{% do part_list.append(publish_section_title) -%}
[{{ publish_section_title }}]
recipe = slapos.cookbook:publish
public-ipv4 = {{ public_ipv4 }}
private-ipv4 = {{ local_ipv4 }}
{% if extra_slave_instance_list -%}
slave-instance-information-list = {{ json_module.dumps(slave_instance_information_list) }}
{% endif -%}
331
monitor-base-url = {{ monitor_base_url }}
332 333 334

[buildout]
parts +=
335
    slave-log-directories
336 337
{% for part in part_list -%}
{{ '    %s' % part }}
338 339
{% endfor %}
    apache-log-access
340 341 342 343

eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }}
offline = true
344 345 346
cache-access = {{ cache_access }}

{% endif -%}