instance-runner.cfg 28.8 KB
Newer Older
1 2
[buildout]
parts =
3 4 5 6
  nginx_conf
  nginx-launcher
  certificate-authority
  ca-nginx
7 8
  gunicorn-launcher
  gunicorn-graceful
9
  publish-connection-information
10
  slaprunner-promise
11
  apache-httpd-promise
12
  slaprunner-supervisord-wrapper
13 14 15
  runner-sshd-add-authorized-key
  runner-sshd-graceful
  runner-sshd-promise
16 17
  runner-sshkeys-authority
  runner-sshkeys-sshd
18
  runtestsuite
19
  symlinks
20
  shellinabox
21
  slapos-cfg
22
  cron-entry-prepare-software
23
  deploy-instance-parameters
24
  instance-software
25
  instance-software-type
26
  minishell-cwd
27
  bash-profile
28
  supervisord-wrapper
29
  supervisord-promise
30
  httpd-graceful-wrapper
31 32 33 34
{% if slapparameter_dict.get('no-ipv4-frontend', 'false') == 'false' %}
  slaprunner-frontend-promise
  httpd-frontend-promise
{% endif %}
35
{% if slapparameter_dict.get('custom-frontend-backend-url') and slapparameter_dict.get('check-custom-frontend-promise', 'false') == 'true' %}
36 37
  custom-frontend-promise
{% endif %}
38
## Monitoring part
39
  monitor-base
40
  monitor-check-webrunner-internal-instance
41 42
## Usability part
  template-slapuser-script
43

44
extends = ${monitor2-template:rendered}
45 46 47 48 49

eggs-directory = ${buildout:eggs-directory}
develop-eggs-directory = ${buildout:develop-eggs-directory}
offline = true

50 51
{% if slapparameter_dict.get('custom-frontend-backend-url') -%}
[request-custom-frontend]
52
recipe = slapos.cookbook:requestoptional
53
software-url = {{ slapparameter_dict.get('custom-frontend-software-url', 'http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg') }}
54 55 56 57
software-type = {{ slapparameter_dict.get('custom-frontend-software-type', 'RootSoftwareInstance') }}
slave = true
name = Custom Web Frontend

58 59 60 61 62
server-url = $${slap-connection:server-url}
key-file = $${slap-connection:key-file}
cert-file = $${slap-connection:cert-file}
computer-id = $${slap-connection:computer-id}
partition-id = $${slap-connection:partition-id}
63

64
{% if slapparameter_dict.get('custom-frontend-instance-guid') -%}
65
sla-instance_guid = $${slap-parameter:frontend-instance-guid}
66 67
{% endif -%}

68 69
{% set custom_frontend_backend_type = slapparameter_dict.get('custom-frontend-backend-type') -%}
{% if custom_frontend_backend_type -%}
70 71
config-type = {{ custom_frontend_backend_type }}
{% endif -%}
72
config-url = {{ slapparameter_dict.get('custom-frontend-backend-url') }}
73
return = site_url domain
74 75 76

[custom-frontend-promise]
recipe = slapos.cookbook:check_url_available
77 78 79 80 81
path = $${directory:promises}/custom_frontend_promise
url = https://$${request-custom-frontend:connection-domain}
{% if slapparameter_dict.get('custom-frontend-basic-auth') -%}
check-secure = 1
{% endif -%}
82 83 84
dash_path = {{ dash_executable_location }}
curl_path = {{ curl_executable_location }}

85
[publish-connection-information]
86
custom-frontend-url = https://$${request-custom-frontend:connection-domain}
87
{% endif %}
88

89
# Create all needed directories
90
[directory]
91
recipe = slapos.cookbook:mkdirectory
92 93 94 95 96 97
home = $${buildout:directory}
etc = $${:home}/etc/
var = $${:home}/var/
srv = $${:home}/srv/
bin = $${:home}/bin/
tmp = $${:home}/tmp/
98

99 100 101 102 103 104 105 106 107
sshkeys = $${:srv}/sshkeys
services = $${:etc}/service/
scripts = $${:etc}/run/
ssh = $${:etc}/ssh/
log = $${:var}/log/
run = $${:var}/run/
backup = $${:srv}/backup/
promises = $${:etc}/promise/
test = $${:etc}/test/
108
nginx-data = $${:srv}/nginx
109
ca-dir = $${:srv}/ssl
110
project = $${:srv}/runner/project
111
cgi-bin = $${:srv}/cgi-bin
112 113 114

[runnerdirectory]
recipe = slapos.cookbook:mkdirectory
115 116
home = $${directory:srv}/runner/
test = $${directory:srv}/test/
117
project = $${:home}/project
118
public = $${:home}/public
119
software-root = {{ slapparameter_dict.get('software-root', '$${:home}/software') }}
120
instance-root = $${:home}/instance
121 122 123
project-test = $${:test}/project
software-test = $${:test}/software
instance-test = $${:test}/instance
124
sessions = $${buildout:directory}/.sessions
125 126
private-project = $${:home}/.git-private
public-project = $${:home}/.git-public
127 128

[slaprunner]
129
slaprunner = ${buildout:directory}/bin/slaprunner
130
slapos = ${buildout:directory}/bin/slapos
131 132
slapproxy = ${buildout:directory}/bin/slapproxy
supervisor = ${buildout:directory}/bin/slapgrid-supervisorctl
133
git-binary = ${git:location}/bin/git
134
root_check = false
135
slapos.cfg = $${directory:etc}/slapos.cfg
136 137
working-directory = $${runnerdirectory:home}
project-directory = $${runnerdirectory:project}
138 139
instance_root = $${runnerdirectory:instance-root}
software_root = $${runnerdirectory:software-root}
140 141
pidfile-software = $${directory:run}/slapgrid-cp.pid
pidfile-instance = $${directory:run}/slapgrid-sr.pid
142
ssh_client = ${openssh:location}/bin/ssh
143 144
public_key = $${runner-sshd-raw-server:rsa-keyfile}.pub
private_key = $${runner-sshd-raw-server:rsa-keyfile}
145
instance-monitor-url = https://[$${:ipv6}]:$${monitor-parameters:port}
146 147 148
etc_dir = $${directory:etc}
log_dir =  $${directory:log}
run_dir = $${directory:run}
149 150
ipv4 = $${slap-network-information:local-ipv4}
ipv6 = $${slap-network-information:global-ipv6}
151
instance_root = $${runnerdirectory:instance-root}
152 153
proxy_port = 50000
runner_port = 50005
154
partition-amount = $${slap-parameter:instance-amount}
155
wrapper = $${directory:services}/slaprunner
156
debug = $${slap-parameter:debug}
157
access-url = https://[$${:ipv6}]:$${:runner_port}
158
supervisord_config = $${directory:etc}/supervisord.conf
159
supervisord_server = http://$${supervisord:server}
160
proxy_database = $${slaprunner:working-directory}/proxy.db
161 162 163
console = False
verbose = False
debug = False
164 165 166
auto_deploy = $${slap-parameter:auto-deploy}
auto_deploy_instance = $${slap-parameter:auto-deploy-instance}
autorun = $${slap-parameter:autorun}
167
knowledge0_file = $${monitor-instance-parameter:configuration-file-path}
168
minishell_cwd_file = $${directory:etc}/.minishell-cwd
169
minishell_history_file = $${directory:etc}/.minishell_history
170 171
software_info_json = $${runnerdirectory:home}/software_info.json
instance_info_json = $${runnerdirectory:home}/instance_info.json
172
path = $${shell:path}
173
instance_name = $${slap-parameter:instance-name}
174

175 176 177
default_repository = $${slap-parameter:slapos-repository}
default_repository_branch = $${slap-parameter:slapos-reference}

178 179 180 181 182 183 184 185 186 187 188

#---------------------------
#--
#-- supervisord managing slaprunner instance processes
[slaprunner-supervisord-wrapper]
recipe = slapos.cookbook:wrapper
# XXX hardcoded locations
command-line = $${buildout:directory}/bin/slapos node supervisord --cfg $${directory:etc}/slapos.cfg -n
wrapper-path = $${directory:services}/slaprunner-supervisord


189 190
[test-runner]
<= slaprunner
191
slapos.cfg = $${directory:etc}/slapos-test.cfg
192 193
working-directory = $${runnerdirectory:test}
project-directory = $${runnerdirectory:project-test}
194 195
software_root = $${runnerdirectory:software-test}
instance_root = $${runnerdirectory:instance-test}
196
proxy_port = 8602
197
etc_dir = $${directory:test}
198 199
autorun = False
auto_deploy = True
200

201 202
[runtestsuite]
recipe = slapos.cookbook:wrapper
203 204
arguments = --server_url=$${slap-connection:server-url} --key_file=$${slap-connection:key-file} --cert_file=$${slap-connection:cert-file} --computer_id=$${slap-connection:computer-id} --partition_id=$${slap-connection:partition-id}
command-line = ${buildout:directory}/bin/slaprunnertest $${:arguments}
205
wrapper-path = $${directory:bin}/runTestSuite
206
environment = RUNNER_CONFIG=$${slapos-cfg:rendered}
207
parameters-extra = true
208

209 210 211 212 213 214 215 216 217 218 219
# Deploy openssh-server
[runner-sshd-port]
recipe = slapos.cookbook:free_port
minimum = 22222
maximum = 22231
ip = $${slap-network-information:global-ipv6}

[runner-sshd-config]
recipe = slapos.recipe.template:jinja2
rendered = $${directory:etc}/runner-sshd.conf
path_pid = $${directory:run}/runner-sshd.pid
220
host_key = $${directory:ssh}/runner_server_key.rsa
221 222 223 224 225 226
template = inline:
  PidFile $${:path_pid}
  Port $${runner-sshd-port:port}
  ListenAddress $${slap-network-information:global-ipv6}
  Protocol 2
  UsePrivilegeSeparation no
227
  HostKey $${:host_key}
228 229 230
  PasswordAuthentication no
  PubkeyAuthentication yes
  AuthorizedKeysFile $${buildout:directory}/.ssh/authorized_keys
231
  ForceCommand if [ -z "$SSH_ORIGINAL_COMMAND" ]; then ${bash:location}/bin/bash -l; else eval "$SSH_ORIGINAL_COMMAND"; fi
232
  Subsystem sftp ${openssh:location}/libexec/sftp-server
233

234
[runner-sshd-raw-server]
235
recipe = slapos.cookbook:wrapper
236
host = $${slap-network-information:global-ipv6}
237
rsa-keyfile = $${runner-sshd-config:host_key}
238
home = $${directory:ssh}
239
command-line = ${openssh:location}/sbin/sshd -D -e -f $${runner-sshd-config:rendered}
240 241 242 243 244 245 246 247 248
wrapper-path = $${directory:bin}/runner_raw_sshd

[runner-sshd-authorized-key]
<= runner-sshd-raw-server
recipe = slapos.cookbook:dropbear.add_authorized_key
key = $${slap-parameter:user-authorized-key}

[runner-sshd-server]
recipe = collective.recipe.template
249
log = $${directory:log}/runner-sshd.log
250 251 252
input = inline:#!/bin/sh
    exec $${runner-sshd-raw-server:wrapper-path} >> $${:log} 2>&1

253
output = $${directory:bin}/runner_raw_sshd_log
254
mode = 700
255 256 257 258 259 260

[runner-sshd-graceful]
recipe = slapos.cookbook:wrapper
command-line = $${directory:bin}/killpidfromfile $${runner-sshd-config:path_pid} SIGHUP
wrapper-path = $${directory:scripts}/runner-sshd-graceful

261
[runner-sshkeys-directory]
262
recipe = slapos.cookbook:mkdirectory
263 264
requests = $${directory:sshkeys}/runner-requests/
keys = $${directory:sshkeys}/runner-keys/
265 266 267

[runner-sshkeys-authority]
recipe = slapos.cookbook:sshkeys_authority
268 269 270
request-directory = $${runner-sshkeys-directory:requests}
keys-directory = $${runner-sshkeys-directory:keys}
wrapper = $${directory:services}/runner_sshkeys_authority
271 272 273 274 275
keygen-binary = ${openssh:location}/bin/ssh-keygen

[runner-sshkeys-sshd]
<= runner-sshkeys-authority
recipe = slapos.cookbook:sshkeys_authority.request
276
name = sshd
277 278 279 280 281 282
type = rsa
executable = $${runner-sshd-server:output}
public-key = $${runner-sshd-raw-server:rsa-keyfile}.pub
private-key = $${runner-sshd-raw-server:rsa-keyfile}
wrapper = $${directory:services}/runner-sshd

283
[runner-sshd-add-authorized-key]
284
recipe = slapos.cookbook:dropbear.add_authorized_key
285
home = $${buildout:directory}
286
key = $${slap-parameter:user-authorized-key}
287

288
#---------------------------
289
#--
290 291
#-- Set nginx frontend

292 293 294 295 296 297 298 299 300 301
[tempdirectory]
recipe = slapos.cookbook:mkdirectory
client_body_temp_path = $${directory:tmp}/client_body_temp_path
proxy_temp_path = $${directory:tmp}/proxy_temp_path
fastcgi_temp_path = $${directory:tmp}/fastcgi_temp_path
uwsgi_temp_path = $${directory:tmp}/uwsgi_temp_path
scgi_temp_path = $${directory:tmp}/scgi_temp_path

[nginx-frontend]
# Options
302
nb_workers = 5
303
# Network
304 305 306
local-ip = $${slap-network-information:local-ipv4}
global-ip = $${slap-network-information:global-ipv6}
global-port = $${slaprunner:runner_port}
307
# Backend
308 309
runner-ip = $${slaprunner:ipv4}
runner-port = $${slaprunner:runner_port}
310 311 312 313 314 315 316 317
# SSL
ssl-certificate = $${ca-nginx:cert-file}
ssl-key = $${ca-nginx:key-file}
# Log
path_pid = $${directory:run}/nginx.pid
path_log = $${directory:log}/nginx.log
path_access_log = $${directory:log}/nginx.access.log
path_error_log = $${directory:log}/nginx.error.log
318
path_tmp = $${directory:tmp}/
319
nginx_prefix = $${buildout:directory}
320 321 322
# Config files
path_nginx_conf = $${directory:etc}/nginx.conf
# Executables
323
bin_nginx = ${nginx-webdav:location}/sbin/nginx
324
bin_launcher = $${directory:bin}/launcher
325 326
# Utils
path_shell = ${dash:location}/bin/dash
327 328
# Misc.
etc_dir = $${directory:etc}
329
work_dir = $${slaprunner:working-directory}
330 331 332 333 334 335

[nginx_conf]
recipe = slapos.recipe.template:jinja2
template = ${template_nginx_conf:location}/${template_nginx_conf:filename}
rendered = $${nginx-frontend:path_nginx_conf}
context =
336
    key shellinabox_socket shellinabox:socket
337
    key socket gunicorn:socket
338 339 340 341 342 343 344 345 346 347 348
    section param_nginx_frontend nginx-frontend
    section param_tempdir tempdirectory

[nginx-launcher]
recipe = slapos.recipe.template:jinja2
template = ${template_launcher:location}/${template_launcher:filename}
rendered = $${nginx-frontend:bin_launcher}
mode = 700
context =
    section param_nginx_frontend nginx-frontend

349
[httpd-parameters]
350 351 352 353 354 355
path_pid = $${directory:run}/httpd.pid
path_error_log = $${directory:log}/httpd-error.log
path_access_log = $${directory:log}/httpd-access.log
# XXX Use ca-nginx, no need to regenerate certificate
cert_file = $${ca-nginx:cert-file}
key_file = $${ca-nginx:key-file}
356
global_ip = $${slap-network-information:global-ipv6}
357
global_port = $${slap-parameter:slaprunner-httpd-port}
358 359
working_directory = $${slaprunner:working-directory}
dav_lock = $${directory:var}/WebDavLock
360
htpasswd_file = $${directory:etc}/.htpasswd
361
etc_dir = $${directory:etc}
362 363
var_dir = $${directory:var}
project_folder = $${directory:project}
364
project_private_folder = $${runnerdirectory:private-project}
365
project_public_folder = $${runnerdirectory:public-project}
366
runner_home = $${runnerdirectory:home}
367
git_http_backend = ${git:location}/libexec/git-core/git-http-backend
368
cgid_sock = $${directory:run}/cgid.sock
369
#cgi_httpd_conf = $${monitor-httpd-configuration-file:rendered}
370
httpd_cors_file = $${slaprunner-httpd-cors:location}
371 372 373 374

[httpd-conf]
recipe = slapos.recipe.template:jinja2
template = ${template_httpd_conf:location}/${template_httpd_conf:filename}
375
rendered = $${directory:etc}/httpd.conf
376
context =
377 378
    section parameters httpd-parameters

379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
[apache-httpd]
recipe = slapos.cookbook:wrapper
apache-executable = ${apache:location}/bin/httpd
wrapper-path = $${directory:services}/slaprunner-httpd
command-line = $${:apache-executable} -f $${httpd-conf:rendered} -DFOREGROUND
access-url = https://[$${httpd-parameters:global_ip}]:$${httpd-parameters:global_port}
wait-for-files =
  $${ca-nginx:cert-file}
  $${ca-nginx:key-file}

[httpd-graceful-wrapper]
recipe = collective.recipe.template
input = inline:
  #!/bin/sh
  exec kill -USR1 $(cat $${httpd-parameters:path_pid})
output = $${directory:scripts}/slaprunner-httpd-graceful
mode = 700

[apache-httpd-promise]
recipe = slapos.cookbook:check_url_available
path = $${directory:promises}/$${:filename}
filename = apache-httpd-listening-on-tcp
url = $${apache-httpd:access-url}
check-secure = 1
dash_path = {{ dash_executable_location }}
curl_path = {{ curl_executable_location }}

[slaprunner-httpd-cors]
recipe = plone.recipe.command
command = if [ ! -f $${:location} ]; then touch $${:location}; fi
location = $${directory:etc}/$${:filename}
filename = slaprunner-httpd-cors.cfg
stop-on-error = true
412

413 414 415 416
#--------------------
#--
#-- WSGI

417
[gunicorn]
418 419 420 421 422 423 424 425
bin_gunicorn = $${directory:bin}/gunicorn
bin_launcher = $${directory:services}/gunicorn
path_shell = ${dash:location}/bin/dash
socket = $${directory:tmp}/flaskserver.sock
path_pid = $${directory:run}/gunicorn.pid

[gunicorn-launcher]
recipe = slapos.cookbook:wrapper
426
command-line = $${gunicorn:bin_gunicorn} slapos.runner.run:app -p $${gunicorn:path_pid} -b unix:$${gunicorn:socket} -e RUNNER_CONFIG=$${slaprunner:slapos.cfg} --error-logfile $${directory:log}/$${:error-log-file} --timeout 200 --threads 3 --log-level error --preload
427
error-log-file = gunicorn-error.log
428
wrapper-path = $${gunicorn:bin_launcher}
429
environment = PATH=$${environ:PATH}:${git:location}/bin/
430
  RUNNER_CONFIG=$${slaprunner:slapos.cfg}
431
  LANG=en_GB.UTF-8
432 433 434

[gunicorn-graceful]
recipe = slapos.cookbook:wrapper
435
command-line = $${directory:bin}/killpidfromfile $${gunicorn:path_pid} SIGHUP
436 437
wrapper-path = $${directory:scripts}/gunicorn-graceful

438
#--------------------
439
#--
440
#-- ssl certificates
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465

[certificate-authority]
recipe = slapos.cookbook:certificate_authority
openssl-binary = ${openssl:location}/bin/openssl
ca-dir = $${directory:ca-dir}
requests-directory = $${cadirectory:requests}
wrapper = $${directory:services}/certificate_authority
ca-private = $${cadirectory:private}
ca-certs = $${cadirectory:certs}
ca-newcerts = $${cadirectory:newcerts}
ca-crl = $${cadirectory:crl}

[cadirectory]
recipe = slapos.cookbook:mkdirectory
requests = $${directory:ca-dir}/requests/
private = $${directory:ca-dir}/private/
certs = $${directory:ca-dir}/certs/
newcerts = $${directory:ca-dir}/newcerts/
crl = $${directory:ca-dir}/crl/

[ca-nginx]
<= certificate-authority
recipe = slapos.cookbook:certificate_authority.request
key-file = $${cadirectory:certs}/nginx_frontend.key
cert-file = $${cadirectory:certs}/nginx_frontend.crt
466 467
executable = $${nginx-launcher:rendered}
wrapper = $${directory:services}/nginx-frontend
468 469 470
# Put domain name
name = example.com

471
#--------------------
472 473
#--
#-- Request frontend
474

475
{% if slapparameter_dict.get('no-ipv4-frontend', 'false') == 'false' -%}
476 477
[request-frontend]
<= slap-connection
478
recipe = slapos.cookbook:requestoptional
479
name = SlapRunner Frontend
480
# XXX We have hardcoded SR URL here.
481
software-url = http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg
482
slave = true
483
config-url = $${slaprunner:access-url}
484
config-domain = $${slap-parameter:frontend-domain}
485
return = site_url domain
486

487 488 489 490 491 492 493 494
[slaprunner-frontend-promise]
recipe = slapos.cookbook:check_url_available
path = $${directory:promises}/slaprunner_frontend
url = https://$${request-frontend:connection-domain}/login
dash_path = ${dash:location}/bin/dash
curl_path = ${curl:location}/bin/curl
check-secure = 1

495 496 497
[request-httpd-frontend]
<= slap-connection
recipe = slapos.cookbook:requestoptional
498 499 500
# XXX - Unfortunately, we still call webrunner httpd frontend "Monitor Frontend" otherwise 
# buildout will ignore previous frontend that was created and create a new one (in case of upgrade)
name = Monitor Frontend
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
# XXX We have hardcoded SR URL here.
software-url = http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg
slave = true
config-url = $${apache-httpd:access-url}
config-domain = 
return = secure_access domain

[httpd-frontend-promise]
recipe = slapos.cookbook:check_url_available
path = $${directory:promises}/slaprunner-apache-http-frontend
url = $${request-httpd-frontend:connection-secure_access}
dash_path = {{ dash_executable_location }}
curl_path = {{ curl_executable_location }}
check-secure = 1

516
{% endif %}
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535

[htpasswd]
recipe = slapos.cookbook:generate.password
storage-path = $${directory:etc}/.pwd
bytes = 8

[runner-htpasswd]
recipe = plone.recipe.command
stop-on-error = true
htpasswd-path = $${monitor-directory:etc}/.htpasswd
command = if [ ! -f "$${:htpasswd-path}" ]; then ${apache:location}//bin/htpasswd -cb $${:htpasswd-path} $${:user} $${:password}; fi
update-command = $${:command}
user = admin
{% if slapparameter_dict.get('monitor-password', '') -%}
password = {{ slapparameter_dict['monitor-password'] }}
{% else -%}
password = $${htpasswd:passwd}
{% endif -%}

536
#--------------------------------------
537
#--
538
#-- Send information to SlapOS Master
539

540 541 542
[user-info]
recipe = slapos.cookbook:userinfo

543
[publish-connection-information]
544
recipe = slapos.cookbook:publish
545 546 547
backend-url = $${slaprunner:access-url}
init-user = $${runner-htpasswd:user}
init-password = $${runner-htpasswd:password}
548
ssh-command = ssh $${user-info:pw-name}@$${slap-network-information:global-ipv6} -p $${runner-sshd-port:port}
549 550
git-public-url = https://[$${httpd-parameters:global_ip}]:$${httpd-parameters:global_port}/git-public/
git-private-url = https://[$${httpd-parameters:global_ip}]:$${httpd-parameters:global_port}/git/
551
monitor-base-url = $${monitor-publish-parameters:monitor-base-url}
552 553 554 555 556
{% if slapparameter_dict.get('no-ipv4-frontend', 'false') == 'false' -%}
url =  https://$${request-frontend:connection-domain}
webdav-url = $${request-httpd-frontend:connection-secure_access}/share/
public-url =  $${request-httpd-frontend:connection-secure_access}/public/
{% else %}
557
url =  $${slaprunner:access-url}
558 559 560 561
webdav-url = $${apache-httpd:access-url}/share/
public-url =  $${apache-httpd:access-url}/public/
{% endif %}

562 563
{% if slapparameter_dict.get('instance-type', '') != 'resilient' -%}
{% set monitor_interface_url = slapparameter_dict.get('monitor-interface-url', 'https://monitor.app.officejs.com') -%}
564
monitor-setup-url = {{ monitor_interface_url }}/#page=settings_configurator&url=$${monitor-publish-parameters:monitor-url}&username=$${monitor-publish-parameters:monitor-user}&password=$${monitor-publish-parameters:monitor-password}
565
{% else -%}
566 567 568
monitor-url = $${monitor-publish-parameters:monitor-url}
monitor-user = $${monitor-publish-parameters:monitor-user}
monitor-password = $${monitor-publish-parameters:monitor-password}
569
{% endif -%}
570 571 572
#---------------------------
#--
#-- Deploy promises scripts
Jean-Baptiste Petre's avatar
Jean-Baptiste Petre committed
573

574 575
[slaprunner-promise]
recipe = slapos.cookbook:check_port_listening
576
path = $${directory:promises}/slaprunner
577 578
hostname = $${slaprunner:ipv6}
port = $${slaprunner:runner_port}
Jean-Baptiste Petre's avatar
Jean-Baptiste Petre committed
579

580
[runner-sshd-promise]
581
recipe = slapos.cookbook:check_port_listening
582 583 584
path = $${directory:promises}/runner-sshd
hostname = $${slap-network-information:global-ipv6}
port = $${runner-sshd-port:port}
585

586 587
[symlinks]
recipe = cns.recipe.symlink
588
symlink_target = $${directory:bin}
589
symlink_base = ${buildout:directory}/bin
590 591 592

[slap-parameter]
# Default value if no ssh key is specified
593
user-authorized-key =
594
# Default value of instances number in slaprunner
595
instance-amount = 10
596 597
debug = false
frontend-domain =
598
slapos-repository = https://lab.nexedi.com/nexedi/slapos.git
599
slapos-software =
600
slapos-software-type =
601
slapos-reference = master
602
auto-deploy = false
603
auto-deploy-instance = true
604
autorun = false
605 606
slaprunner-httpd-port = $${:monitor-port}
# XXX - for backward compatibility, monitor-port was for slaprunner httpd server
607
monitor-port = 9686
608
instance-name =
609 610
monitor-cors-domains = 
monitor-interface-url = 
611
# XXX - define a new port for monitor here and use monitor-port for backward compatibility
612
monitor-httpd-port = 8386
613 614 615

[monitor-parameters]
port = $${slap-parameter:monitor-port}
616

617 618
[slapos-cfg]
recipe = slapos.recipe.template:jinja2
619
template = ${template-slapos-cfg:location}/${template-slapos-cfg:filename}
620 621 622
rendered = $${slaprunner:slapos.cfg}
mode = 700
context =
623
  section slaprunner slaprunner
624

625 626
[slapos-test-cfg]
recipe = slapos.recipe.template:jinja2
627
template = ${template-slapos-cfg:location}/${template-slapos-cfg:filename}
628 629 630 631 632
rendered = $${test-runner:slapos.cfg}
mode = 700
context =
  section slaprunner test-runner

633
[shellinabox]
634 635 636 637 638 639 640 641 642 643 644
recipe = slapos.recipe.template:jinja2
# We cannot use slapos.cookbook:wrapper here because this recipe escapes too much
socket = $${directory:run}/siab.sock
mode = 0700
rendered = $${directory:services}/shellinaboxd
template = inline:
  #!/bin/sh
  exec ${shellinabox:location}/bin/shellinaboxd \
    --disable-ssl \
    --disable-ssl-menu \
    --unixdomain-only=$${:socket}:$(id -u):$(id -g):0600 \
Jérome Perrin's avatar
Jérome Perrin committed
645
    --service "/:$(id -u):$(id -g):HOME:$${shell:wrapper} -l"
646 647 648

[shell]
recipe = slapos.cookbook:shell
Jérome Perrin's avatar
Jérome Perrin committed
649
wrapper = $${directory:bin}/bash
650
shell = ${bash:location}/bin/bash
651
home = $${buildout:directory}
652
path = $${environ:PATH}:/usr/bin:/bin/:${nano:location}/bin:${vim:location}/bin:${screen:location}/bin:${git:location}/bin:${tig:location}/bin
653 654
ps1 = "\\w> "

655 656 657
[environ]
recipe = collective.recipe.environment

658 659
[prepare-software]
recipe = slapos.cookbook:wrapper
660
command-line = ${curl:location}/bin/curl -g https://[$${slaprunner:ipv6}]:$${slaprunner:runner_port}/isSRReady --max-time 1 --insecure
661 662
wrapper-path = $${directory:scripts}/prepareSoftware

663 664 665 666 667 668 669
[cron-entry-prepare-software]
<= cron
recipe = slapos.cookbook:cron.d
name = prepare-software
frequency = */2 * * * *
command = $${prepare-software:wrapper-path}

670 671 672
[instance-parameters]
recipe = slapos.recipe.template:jinja2
extensions = jinja2.ext.do
673
template = ${template-parameters:location}/${template-parameters:filename}
674 675
rendered = $${directory:etc}/.parameter.xml.default
mode = 0644
676
context =
677 678 679 680 681 682 683 684
  key slapparameter_dict slap-configuration:configuration

[deploy-instance-parameters]
recipe = plone.recipe.command
stop-on-error = true
parameter-xml = $${directory:etc}/.parameter.xml
command = if [ ! -f $${:parameter-xml} ]; then cp $${instance-parameters:rendered} $${:parameter-xml}; fi

685 686 687 688 689 690 691
[instance-software-type]
recipe = plone.recipe.command
stop-on-error = true
# XXX It should not be named with .xml as it is not xml
software-type-path = $${directory:etc}/.software_type.xml
command = if [ ! -f $${:software-type-path} -a "$${slap-parameter:slapos-software-type}" != "" ]; then echo "$${slap-parameter:slapos-software-type}" > $${:software-type-path}; fi

692 693 694 695 696
[instance-software]
recipe = plone.recipe.command
stop-on-error = true
command = SR=$${slap-parameter:slapos-software} && if [ -n "$SR" ] && [ ! -f "$${directory:etc}/.project" ]; then echo workspace/slapos/$${slap-parameter:slapos-software}/ > $${directory:etc}/.project; fi

697 698 699 700 701 702 703 704
[slap-configuration]
recipe = slapos.cookbook:slapconfiguration.serialised
computer = $${slap-connection:computer-id}
partition = $${slap-connection:partition-id}
url = $${slap-connection:server-url}
key = $${slap-connection:key-file}
cert = $${slap-connection:cert-file}

705

706 707 708 709 710 711
[minishell-cwd]
recipe = plone.recipe.command
command = if [ ! -f $${slaprunner:minishell_cwd_file} ]; then echo $${runnerdirectory:home} > $${slaprunner:minishell_cwd_file}; fi
location = $${slaprunner:minishell_cwd_file}
stop-on-error = true

712
[bash-profile]
713 714 715 716
recipe = slapos.recipe.template:jinja2
template = ${template-bash-profile:location}/${template-bash-profile:filename}
rendered = $${buildout:directory}/.bash_profile
context =
717
    raw path $PATH:${nano:location}/bin:${vim:location}/bin:${screen:location}/bin:${git:location}/bin:${curl:location}/bin:${python2.7:location}/bin:${tig:location}/bin:${zip:location}/bin
718
    key workdir runnerdirectory:home
719 720 721 722 723 724 725
    
[bashrc]
recipe = slapos.recipe.template:jinja2
template = ${template-bashrc:location}/${template-bashrc:filename}
rendered = $${buildout:directory}/.bashrc
context =
    raw bin_folder ${buildout:bin-directory}
726 727 728 729 730

#---------------------------
#--
#-- supervisord managing slaprunner automation features

731
[supervisord]
732
autorestart = false
733 734 735 736
autostart = false
directory = $${buildout:directory}
exitcodes = 0
logfile = $${directory:log}/supervisord.log
737
no_logfile = NONE
738
numprocs = 1
739
path = $${shell:path}
740
pidfile = $${directory:run}/supervisord.pid
741 742
ip = $${slaprunner:ipv4}
server = $${:ip}:$${:port}
743
port = 39986
744
slapgrid-cp = slapgrid-cp
745
slapgrid-cp-command = $${slaprunner:slapos} node instance --all --cfg $${:slapos-cfg} --verbose --logfile $${:slapgrid-cp-log}
746
slapgrid-cp-log = $${runnerdirectory:home}/instance.log
747
slapgrid-cp-startretries = 0
748
slapgrid-sr = slapgrid-sr
749
slapgrid-sr-command = $${slaprunner:slapos} node software --all --cfg $${:slapos-cfg} --verbose --logfile $${:slapgrid-sr-log}
750
slapgrid-sr-log = $${runnerdirectory:home}/software.log
751
slapgrid-sr-startretries = 0
752 753 754
slapproxy = slapproxy
slapproxy-autorestart = true
slapproxy-autostart = true
755
slapproxy-startsecs = 1
756
slapproxy-command = $${slaprunner:slapos} proxy start --logfile $${:slapproxy-log} --cfg $${:slapos-cfg}
757
slapproxy-log = $${directory:log}/slapproxy.log
758 759
socket_name = unix://$${:socket_path}
socket_path = $${directory:tmp}/supervisord.sock
760
startsecs = 0
761 762 763
# This file logs errors from listeners. Supervisord has its own logfile.
# Processes should handle their logs by themselves
stderr_logfile = $${directory:log}/supervisord-errors.log
764
slapos-cfg = $${slaprunner:slapos.cfg}
765 766 767 768 769 770

[supervisord-conf]
recipe = slapos.recipe.template:jinja2
template = ${template-supervisord:location}/${template-supervisord:filename}
rendered = $${directory:etc}/supervisord.conf
context =
771 772
    import multiprocessing multiprocessing
    import builtin __builtin__
773
    section supervisord supervisord
774
    key slapparameter_dict slap-configuration:configuration
775 776 777 778 779 780 781 782 783 784
    key listener_slapgrid listener-slapgrid-bin:rendered

[listener-slapgrid-bin]
recipe = slapos.recipe.template:jinja2
template = ${template-listener-slapgrid:location}/${template-listener-slapgrid:filename}
rendered = $${directory:bin}/listener_slapgrid.py
mode = 0744
context =
    section supervisord supervisord
    section slaprunner slaprunner
785
    raw python_executable ${buildout:directory}/bin/${extra-eggs:interpreter}
786 787 788 789 790 791

[supervisord-wrapper]
recipe = slapos.cookbook:wrapper
command-line = $${buildout:directory}/bin/supervisord -c $${supervisord-conf:rendered} --nodaemon
wrapper-path = $${directory:services}/supervisord

792 793 794 795 796 797
[supervisord-promise]
recipe = slapos.cookbook:check_port_listening
path = $${directory:promises}/supervisord
hostname = $${slaprunner:ipv4}
port = $${supervisord:port}

798 799
# XXX Monitor 
[monitor-instance-parameter]
800
monitor-httpd-port = $${slap-parameter:monitor-httpd-port}
801 802 803
{% if slapparameter_dict.get('name', '') -%}
monitor-title = {{ slapparameter_dict['name'] }}
{% endif -%}
804
cors-domains = {{ slapparameter_dict.get('monitor-cors-domains', 'monitor.app.officejs.com') }}
805 806 807
{% if slapparameter_dict.get('monitor-username', '') -%}
username = {{ slapparameter_dict['monitor-username'] }}
{% endif -%}
808
password = $${runner-htpasswd:password}
809
{% if slapparameter_dict.get('monitor-url-list', '') -%}
810
monitor-url-list = {{ slapparameter_dict['monitor-url-list'] }}
811 812
{% endif -%}
instance-configuration =
813
  httpdcors cors-domain $${slaprunner-httpd-cors:location} $${httpd-graceful-wrapper:output}
814
configuration-file-path = $${buildout:directory}/knowledge0.cfg
815

816 817 818
[monitor-check-webrunner-internal-instance]
recipe = slapos.recipe.template:jinja2
template = ${monitor-check-webrunner-internal-instance:location}/${monitor-check-webrunner-internal-instance:filename}
819
rendered = $${monitor-directory:reports}/$${:filename}
820 821 822
filename = monitor-check-webrunner-internal-instance
mode = 0744

823 824 825
## Slapuser slapos command script
[template-slapuser-script]
recipe = slapos.recipe.template:jinja2
826
template = ${template-slapuser-script:location}/${template-slapuser-script:filename}
827 828 829 830 831
rendered = $${buildout:bin-directory}/slapos
mode = 0744
context =
  raw config_location $${slapos-cfg:rendered}
  raw slapos_python_file_location ${buildout:bin-directory}/slapos