10 sshkeys-dropbear-runner
11 dropbear-server-add-authorized-key
13 publish-connection-informations
15 slaprunner-frontend-promise
23 cron-entry-prepare-software
24 deploy-instance-parameters
25 instance-software-type
30 {% if slapparameter_dict.get('custom-frontend-backend-url') %}
31 custom-frontend-promise
34 ###Parts to add for monitoring
42 deploy-status-history-cgi
48 cgi-httpd-graceful-wrapper
50 monitor-instance-log-access
52 monitor-current-log-access
54 extends = ${monitor-template:output}
56 eggs-directory = ${buildout:eggs-directory}
57 develop-eggs-directory = ${buildout:develop-eggs-directory}
60 {% if slapparameter_dict.get('custom-frontend-backend-url') -%}
61 # Requests, if defined, a frontend to allow access to a server
62 # located inside of the virtual machine listening to port X
64 # Internaly, the frontend will be asked to listen on the IPv6
65 # with port X + 10000, to match NAT rules of Qemu.
66 [request-custom-frontend]
67 recipe = slapos.cookbook:requestoptional
68 software-url = {{ slapparameter_dict.get('custom-frontend-software-url', 'http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg') }}
69 software-type = {{ slapparameter_dict.get('custom-frontend-software-type', 'RootSoftwareInstance') }}
71 name = Custom Web Frontend
73 server-url = $${slap-connection:server-url}
74 key-file = $${slap-connection:key-file}
75 cert-file = $${slap-connection:cert-file}
76 computer-id = $${slap-connection:computer-id}
77 partition-id = $${slap-connection:partition-id}
79 {%- if slapparameter_dict.get('custom-frontend-instance-guid') -%}
81 sla-instance_guid = $${slap-parameter:frontend-instance-guid}
84 {% set custom_frontend_backend_type = slapparameter_dict.get('custom-frontend-backend-type')%}
85 {% if custom_frontend_backend_type %}
87 config-type = {{ custom_frontend_backend_type }}
91 config-url = {{ slapparameter_dict.get('custom-frontend-backend-url') }}
92 return = site_url domain
94 [custom-frontend-promise]
95 recipe = slapos.cookbook:check_url_available
96 path = $${directory:promises}/custom_frontend_promise
97 url = https://$${request-custom-frontend:connection-domain}
98 {% if slapparameter_dict.get('custom-frontend-basic-auth') -%}
101 dash_path = {{ dash_executable_location }}
102 curl_path = {{ curl_executable_location }}
104 [publish-connection-informations]
105 custom-frontend-url = https://$${request-custom-frontend:connection-domain}
108 # Create all needed directories
110 recipe = slapos.cookbook:mkdirectory
111 etc = $${buildout:directory}/etc/
112 var = $${buildout:directory}/var/
113 srv = $${buildout:directory}/srv/
114 bin = $${buildout:directory}/bin/
115 tmp = $${buildout:directory}/tmp/
117 sshkeys = $${:srv}/sshkeys
118 services = $${:etc}/service/
119 scripts = $${:etc}/run/
123 backup = $${:srv}/backup/
124 promises = $${:etc}/promise/
125 test = $${:etc}/test/
126 nginx-data = $${directory:srv}/nginx
127 ca-dir = $${:srv}/ssl
128 project = $${:srv}/runner/project
131 recipe = slapos.cookbook:mkdirectory
132 home = $${directory:srv}/runner/
133 test = $${directory:srv}/test/
134 project = $${:home}/project
135 public = $${:home}/public
136 software-root = $${:home}/software
137 instance-root = $${:home}/instance
138 project-test = $${:test}/project
139 software-test = $${:test}/software
140 instance-test = $${:test}/instance
141 sessions = $${buildout:directory}/.sessions
142 private-project = $${:home}/.git-private
143 public-project = $${:home}/.git-public
145 #Create password recovery code for slaprunner
147 recipe = slapos.cookbook:generate.password
148 storage-path = $${directory:etc}/.rcode
152 slaprunner = ${buildout:directory}/bin/slaprunner
153 slapos = ${buildout:directory}/bin/slapos
154 slapproxy = ${buildout:directory}/bin/slapproxy
155 supervisor = ${buildout:directory}/bin/slapgrid-supervisorctl
156 git-binary = ${git:location}/bin/git
158 slapos.cfg = $${directory:etc}/slapos.cfg
159 working-directory = $${runnerdirectory:home}
160 project-directory = $${runnerdirectory:project}
161 instance_root = $${runnerdirectory:instance-root}
162 software_root = $${runnerdirectory:software-root}
163 instance-monitor-url = https://[$${:ipv6}]:$${monitor-parameters:port}
164 etc_dir = $${directory:etc}
165 log_dir = $${directory:log}
166 run_dir = $${directory:run}
167 ssh_client = $${sshkeys-dropbear-runner:wrapper}
168 public_key = $${sshkeys-dropbear-runner:public-key}
169 private_key = $${sshkeys-dropbear-runner:private-key}
170 ipv4 = $${slap-network-information:local-ipv4}
171 ipv6 = $${slap-network-information:global-ipv6}
172 instance_root = $${runnerdirectory:instance-root}
175 partition-amount = $${slap-parameter:instance-amount}
176 wrapper = $${directory:services}/slaprunner
177 debug = $${slap-parameter:debug}
178 access-url = https://[$${:ipv6}]:$${:runner_port}
179 supervisord_config = $${directory:etc}/supervisord.conf
180 supervisord_server = http://$${supervisord:server}
181 proxy_database = $${slaprunner:working-directory}/proxy.db
185 auto_deploy = $${slap-parameter:auto-deploy}
186 auto_deploy_instance = $${slap-parameter:auto-deploy-instance}
187 autorun = $${slap-parameter:autorun}
188 knowledge0_file = $${buildout:directory}/$${public:filename}
189 minishell_cwd_file = $${directory:etc}/.minishell-cwd
190 minishell_history_file = $${directory:etc}/.minishell_history
191 software_info_json = $${runnerdirectory:home}/software_info.json
192 instance_info_json = $${runnerdirectory:home}/instance_info.json
196 slapos.cfg = $${directory:etc}/slapos-test.cfg
197 working-directory = $${runnerdirectory:test}
198 project-directory = $${runnerdirectory:project-test}
199 software_root = $${runnerdirectory:software-test}
200 instance_root = $${runnerdirectory:instance-test}
202 etc_dir = $${directory:test}
207 recipe = slapos.cookbook:wrapper
208 command-line = ${buildout:directory}/bin/slaprunnertest
209 wrapper-path = $${directory:bin}/runTestSuite
210 environment = RUNNER_CONFIG=$${slapos-test-cfg:rendered}
212 # Deploy dropbear (minimalist SSH server)
214 recipe = slapos.cookbook:mkdirectory
215 requests = $${directory:sshkeys}/requests/
216 keys = $${directory:sshkeys}/keys/
219 recipe = slapos.cookbook:sshkeys_authority
220 request-directory = $${sshkeys-directory:requests}
221 keys-directory = $${sshkeys-directory:keys}
222 wrapper = $${directory:services}/sshkeys_authority
223 keygen-binary = ${dropbear:location}/bin/dropbearkey
225 [dropbear-runner-server]
226 recipe = slapos.cookbook:dropbear
227 host = $${slap-network-information:global-ipv6}
229 home = $${buildout:directory}
230 wrapper = $${directory:bin}/runner_sshd
231 shell = ${bash:location}/bin/bash
232 rsa-keyfile = $${directory:ssh}/server_key.rsa
233 dropbear-binary = ${dropbear:location}/sbin/dropbear
235 [sshkeys-dropbear-runner]
237 recipe = slapos.cookbook:sshkeys_authority.request
240 executable = $${dropbear-runner-server:wrapper}
241 public-key = $${dropbear-runner-server:rsa-keyfile}.pub
242 private-key = $${dropbear-runner-server:rsa-keyfile}
243 wrapper = $${directory:services}/runner_sshd
245 [dropbear-server-add-authorized-key]
246 <= dropbear-runner-server
247 recipe = slapos.cookbook:dropbear.add_authorized_key
248 key = $${slap-parameter:user-authorized-key}
250 #---------------------------
252 #-- Set nginx frontend
255 recipe = slapos.cookbook:mkdirectory
256 client_body_temp_path = $${directory:tmp}/client_body_temp_path
257 proxy_temp_path = $${directory:tmp}/proxy_temp_path
258 fastcgi_temp_path = $${directory:tmp}/fastcgi_temp_path
259 uwsgi_temp_path = $${directory:tmp}/uwsgi_temp_path
260 scgi_temp_path = $${directory:tmp}/scgi_temp_path
266 local-ip = $${slap-network-information:local-ipv4}
268 global-ip = $${slap-network-information:global-ipv6}
269 global-port = $${slaprunner:runner_port}
271 runner-ip = $${slaprunner:ipv4}
272 runner-port = $${slaprunner:runner_port}
274 ssl-certificate = $${ca-nginx:cert-file}
275 ssl-key = $${ca-nginx:key-file}
277 path_pid = $${directory:run}/nginx.pid
278 path_log = $${directory:log}/nginx.log
279 path_access_log = $${directory:log}/nginx.access.log
280 path_error_log = $${directory:log}/nginx.error.log
281 path_tmp = $${directory:tmp}/
283 path_nginx_conf = $${directory:etc}/nginx.conf
285 bin_nginx = ${nginx-webdav:location}/sbin/nginx
286 bin_launcher = $${directory:bin}/launcher
288 path_shell = ${dash:location}/bin/dash
290 etc_dir = $${directory:etc}
291 work_dir = $${slaprunner:working-directory}
294 recipe = slapos.recipe.template:jinja2
295 template = ${template_nginx_conf:location}/${template_nginx_conf:filename}
296 rendered = $${nginx-frontend:path_nginx_conf}
298 key shellinabox_port shellinabox:port
299 key socket gunicorn:socket
300 section param_nginx_frontend nginx-frontend
301 section param_tempdir tempdirectory
304 recipe = slapos.recipe.template:jinja2
305 template = ${template_launcher:location}/${template_launcher:filename}
306 rendered = $${nginx-frontend:bin_launcher}
309 section param_nginx_frontend nginx-frontend
312 path_pid = $${directory:run}/httpd.pid
313 path_error_log = $${directory:log}/httpd-error.log
314 path_access_log = $${directory:log}/httpd-access.log
315 key_file = $${ca-httpd:key-file}
316 cert_file = $${ca-httpd:cert-file}
317 global_ip = $${slap-network-information:global-ipv6}
318 global_port = $${slaprunner:runner_port}
319 monitor_port = $${monitor-parameters:port}
320 monitor_index = $${deploy-index:rendered}
321 working_directory = $${slaprunner:working-directory}
322 dav_lock = $${directory:var}/DavLock
323 etc_dir = $${directory:etc}
324 var_dir = $${directory:var}
325 project_folder = $${directory:project}
326 project_private_folder = $${runnerdirectory:private-project}
327 project_public_folder = $${runnerdirectory:public-project}
328 runner_home = $${runnerdirectory:home}
329 git_http_backend = ${git:location}/libexec/git-core/git-http-backend
330 cgi_httpd_conf = $${monitor-httpd-configuration-file:rendered}
333 recipe = slapos.recipe.template:jinja2
334 template = ${template_httpd_conf:location}/${template_httpd_conf:filename}
335 rendered = $${directory:etc}/httpd.conf
337 section parameters httpd-parameters
340 recipe = slapos.cookbook:wrapper
341 apache-executable = ${apache:location}/bin/httpd
342 wrapper-path = $${ca-httpd:executable}
343 command-line = $${:apache-executable} -f $${httpd-conf:rendered} -DFOREGROUND
345 #--------------------
350 bin_gunicorn = $${directory:bin}/gunicorn
351 bin_launcher = $${directory:services}/gunicorn
352 path_shell = ${dash:location}/bin/dash
353 socket = $${directory:tmp}/flaskserver.sock
354 path_pid = $${directory:run}/gunicorn.pid
357 recipe = slapos.cookbook:wrapper
358 command-line = $${gunicorn:bin_gunicorn} slapos.runner:app -p $${gunicorn:path_pid} -b unix:$${gunicorn:socket} -e RUNNER_CONFIG=$${slaprunner:slapos.cfg} --error-logfile $${directory:log}/$${:error-log-file} --log-level error --preload
359 error-log-file = gunicorn-error.log
360 wrapper-path = $${gunicorn:bin_launcher}
361 environment = PATH=$${environ:PATH}:${git:location}/bin/
362 RUNNER_CONFIG=$${slaprunner:slapos.cfg}
366 recipe = slapos.cookbook:wrapper
367 command-line = $${directory:bin}/killpidfromfile $${gunicorn:path_pid} SIGHUP
368 wrapper-path = $${directory:scripts}/gunicorn-graceful
370 #--------------------
374 [certificate-authority]
375 recipe = slapos.cookbook:certificate_authority
376 openssl-binary = ${openssl:location}/bin/openssl
377 ca-dir = $${directory:ca-dir}
378 requests-directory = $${cadirectory:requests}
379 wrapper = $${directory:services}/certificate_authority
380 ca-private = $${cadirectory:private}
381 ca-certs = $${cadirectory:certs}
382 ca-newcerts = $${cadirectory:newcerts}
383 ca-crl = $${cadirectory:crl}
386 recipe = slapos.cookbook:mkdirectory
387 requests = $${directory:ca-dir}/requests/
388 private = $${directory:ca-dir}/private/
389 certs = $${directory:ca-dir}/certs/
390 newcerts = $${directory:ca-dir}/newcerts/
391 crl = $${directory:ca-dir}/crl/
394 <= certificate-authority
395 recipe = slapos.cookbook:certificate_authority.request
396 key-file = $${cadirectory:certs}/nginx_frontend.key
397 cert-file = $${cadirectory:certs}/nginx_frontend.crt
398 executable = $${nginx-launcher:rendered}
399 wrapper = $${directory:services}/nginx-frontend
404 <= certificate-authority
405 recipe = slapos.cookbook:certificate_authority.request
406 executable = $${shellinabox:wrapper}
407 wrapper = $${directory:services}/shellinaboxd
408 key-file = $${cadirectory:certs}/shellinabox.key
409 cert-file = $${cadirectory:certs}/shellinabox.crt
410 #--------------------
416 recipe = slapos.cookbook:requestoptional
417 name = SlapRunner Frontend
418 # XXX We have hardcoded SR URL here.
419 software-url = http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg
422 config-url = $${slaprunner:access-url}
423 config-domain = $${slap-parameter:frontend-domain}
424 return = site_url domain
428 recipe = slapos.cookbook:requestoptional
429 name = Monitor Frontend
430 # XXX We have hardcoded SR URL here.
431 software-url = http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg
434 config-url = https://[$${monitor-httpd-configuration:listening-ip}]:$${monitor-parameters:port}
435 config-domain = $${slap-parameter:frontend-domain}
436 return = site_url domain
438 #--------------------------------------
440 #-- Send informations to SlapOS Master
442 [publish-connection-informations]
443 recipe = slapos.cookbook:publish
444 1_info = On your first run, Use "access_url" to setup you account. Then you can use both "url" or "access_url". Or "backend_url" if you want to use ipv6. Set up your account in the webrunner in order to use webdav, and being able to clone your git repositories from the runner.
445 2_info = In order to set up your account, get the recovery-code from the monitoring interface. Before read the notification on monitor_info.
446 backend_url = $${slaprunner:access-url}
447 access_url = $${:url}/login
448 url = https://$${request-frontend:connection-domain}
449 ssh_command = ssh $${dropbear-runner-server:host} -p $${dropbear-runner-server:port}
450 monitor_url = https://$${monitor-frontend:connection-domain}
451 webdav_url = $${:monitor_url}/share/
452 public_url = $${:monitor_url}/public/
453 git_public_url = https://[$${httpd-parameters:global_ip}]:$${httpd-parameters:monitor_port}/git-public/
454 git_private_url = https://[$${httpd-parameters:global_ip}]:$${httpd-parameters:monitor_port}/git/
456 #---------------------------
458 #-- Deploy promises scripts
461 recipe = slapos.cookbook:check_port_listening
462 path = $${directory:promises}/slaprunner
463 hostname = $${slaprunner:ipv6}
464 port = $${slaprunner:runner_port}
466 [slaprunner-frontend-promise]
467 recipe = slapos.cookbook:check_url_available
468 path = $${directory:promises}/slaprunner_frontend
469 url = https://$${request-frontend:connection-domain}/login
470 dash_path = ${dash:location}/bin/dash
471 curl_path = ${curl:location}/bin/curl
475 recipe = slapos.cookbook:check_port_listening
476 path = $${directory:promises}/dropbear
477 hostname = $${dropbear-runner-server:host}
478 port = $${dropbear-runner-server:port}
480 [shellinabox-promise]
481 recipe = slapos.cookbook:check_port_listening
482 path = $${directory:promises}/shellinabox
483 hostname = $${shellinabox:ipv6}
484 port = $${shellinabox:port}
487 recipe = cns.recipe.symlink
488 symlink_target = $${directory:bin}
489 symlink_base = ${buildout:directory}/bin
492 # Default value if no ssh key is specified
493 user-authorized-key =
494 # Default value of instances number in slaprunner
498 slapos-repository = http://git.erp5.org/repos/slapos.git
500 slapos-software-type =
501 slapos-reference = master
503 auto-deploy-instance = true
508 port = $${slap-parameter:monitor-port}
511 recipe = slapos.recipe.template:jinja2
512 template = ${template-slapos-cfg:location}/${template-slapos-cfg:filename}
513 rendered = $${slaprunner:slapos.cfg}
516 section slaprunner slaprunner
519 recipe = slapos.recipe.template:jinja2
520 template = ${template-slapos-cfg:location}/${template-slapos-cfg:filename}
521 rendered = $${test-runner:slapos.cfg}
524 section slaprunner test-runner
527 recipe = slapos.cookbook:shellinabox
528 ipv6 = $${slap-network-information:global-ipv6}
530 shell = $${shell:wrapper}
531 wrapper = $${directory:bin}/shellinaboxd
532 shellinabox-binary = ${shellinabox:location}/bin/shellinaboxd
533 password = $${zero-parameters:shell-password}
534 directory = $${runnerdirectory:home}
535 login-shell = $${directory:bin}/login
536 certificate-directory = $${cadirectory:certs}
537 cert-file = $${ca-shellinabox:cert-file}
538 key-file = $${ca-shellinabox:key-file}
541 recipe = slapos.cookbook:generate.password
542 storage-path = $${directory:etc}/.scode
546 recipe = slapos.cookbook:shell
547 wrapper = $${directory:bin}/sh
548 shell = ${bash:location}/bin/bash
549 home = $${runnerdirectory:home}
550 path = $${environ:PATH}:${nano:location}/bin:${vim:location}/bin:${screen:location}/bin:${git:location}/bin
554 recipe = collective.recipe.environment
557 recipe = slapos.recipe.build:gitclone
558 repository = $${slap-parameter:slapos-repository}
559 git-executable = ${git:location}/bin/git
561 location = $${directory:project}/slapos
564 recipe = plone.recipe.command
566 command = cd $${slapos-repo:location} && ${git:location}/bin/git checkout $${slap-parameter:slapos-reference} && SR=$${slap-parameter:slapos-software} && if [ -n "$SR" ] && [ ! -f "$${directory:etc}/.project" ]; then echo workspace/slapos/$${slap-parameter:slapos-software}/ > $${directory:etc}/.project; fi
567 update-command = true
570 recipe = slapos.cookbook:wrapper
571 command-line = ${curl:location}/bin/curl -g https://[$${slaprunner:ipv6}]:$${slaprunner:runner_port}/isSRReady --max-time 1 --insecure
572 wrapper-path = $${directory:scripts}/prepareSoftware
574 [cron-entry-prepare-software]
576 recipe = slapos.cookbook:cron.d
577 name = prepare-software
578 frequency = */2 * * * *
579 command = $${prepare-software:wrapper-path}
581 [instance-parameters]
582 recipe = slapos.recipe.template:jinja2
583 extensions = jinja2.ext.do
584 template = ${template-parameters:location}/${template-parameters:filename}
585 rendered = $${directory:etc}/.parameter.xml.default
588 key slapparameter_dict slap-configuration:configuration
590 [deploy-instance-parameters]
591 recipe = plone.recipe.command
593 parameter-xml = $${directory:etc}/.parameter.xml
594 command = if [ ! -f $${:parameter-xml} ]; then cp $${instance-parameters:rendered} $${:parameter-xml}; fi
596 [instance-software-type]
597 recipe = plone.recipe.command
599 # XXX It should not be named with .xml as it is not xml
600 software-type-path = $${directory:etc}/.software_type.xml
601 command = if [ ! -f $${:software-type-path} -a "$${slap-parameter:slapos-software-type}" != "" ]; then echo "$${slap-parameter:slapos-software-type}" > $${:software-type-path}; fi
604 recipe = slapos.cookbook:slapconfiguration.serialised
605 computer = $${slap-connection:computer-id}
606 partition = $${slap-connection:partition-id}
607 url = $${slap-connection:server-url}
608 key = $${slap-connection:key-file}
609 cert = $${slap-connection:cert-file}
612 shell-password = $${shellinabox-code:passwd}
613 recovery-code = $${recovery-code:passwd}
619 recipe = plone.recipe.command
620 command = if [ ! -f $${slaprunner:minishell_cwd_file} ]; then echo $${runnerdirectory:home} > $${slaprunner:minishell_cwd_file}; fi
621 location = $${slaprunner:minishell_cwd_file}
625 recipe = slapos.recipe.template:jinja2
626 template = ${template-bash-profile:location}/${template-bash-profile:filename}
627 rendered = $${buildout:directory}/.bash_profile
629 raw path $PATH:${nano:location}/bin:${vim:location}/bin:${screen:location}/bin:${git:location}/bin:${curl:location}/bin:${python2.7:location}/bin
630 key workdir runnerdirectory:home
635 directory = $${buildout:directory}
637 logfile = $${directory:log}/supervisord.log
640 path = $${environ:PATH}
641 pidfile = $${directory:run}/supervisord.pid
642 server = $${slaprunner:ipv4}:$${:port}
644 slapgrid-cp = slapgrid-cp
645 slapgrid-cp-command = $${slaprunner:slapos} node instance --all --cfg $${slaprunner:slapos.cfg} --pidfile $${:slapgrid-cp-pid} --verbose --logfile $${:slapgrid-cp-log}
646 slapgrid-cp-log = $${runnerdirectory:home}/instance.log
647 slapgrid-cp-pid = $${directory:run}/slapgrid-cp.pid
648 slapgrid-cp-startretries = 0
649 slapgrid-sr = slapgrid-sr
650 slapgrid-sr-command = $${slaprunner:slapos} node software --all --cfg $${slaprunner:slapos.cfg} --pidfile $${:slapgrid-sr-pid} --verbose --logfile $${:slapgrid-sr-log}
651 slapgrid-sr-log = $${runnerdirectory:home}/software.log
652 slapgrid-sr-pid = $${directory:run}/slapgrid-sr.pid
653 slapgrid-sr-startretries = 0
654 slapproxy = slapproxy
655 slapproxy-autorestart = true
656 slapproxy-autostart = true
657 slapproxy-startsecs = 1
658 slapproxy-command = $${slaprunner:slapos} proxy start --logfile $${:slapproxy-log} --cfg $${slaprunner:slapos.cfg}
659 slapproxy-log = $${directory:log}/slapproxy.log
660 socket_name = unix://$${:socket_path}
661 socket_path = $${directory:tmp}/supervisord.sock
663 # This file logs errors from listeners. Supervisord has its own logfile.
664 # Processes should handle their logs by themselves
665 stderr_logfile = $${directory:log}/supervisord-errors.log
668 recipe = slapos.recipe.template:jinja2
669 template = ${template-supervisord:location}/${template-supervisord:filename}
670 rendered = $${directory:etc}/supervisord.conf
672 section supervisord supervisord
673 key listener_slapgrid listener-slapgrid-bin:rendered
675 [listener-slapgrid-bin]
676 recipe = slapos.recipe.template:jinja2
677 template = ${template-listener-slapgrid:location}/${template-listener-slapgrid:filename}
678 rendered = $${directory:bin}/listener_slapgrid.py
681 section supervisord supervisord
682 section slaprunner slaprunner
683 raw python_executable ${buildout:directory}/bin/${extra-eggs:interpreter}
685 [supervisord-wrapper]
686 recipe = slapos.cookbook:wrapper
687 command-line = $${buildout:directory}/bin/supervisord -c $${supervisord-conf:rendered} --nodaemon
688 wrapper-path = $${directory:services}/supervisord
690 [supervisord-promise]
691 recipe = slapos.cookbook:check_port_listening
692 path = $${directory:promises}/supervisord
693 hostname = $${slaprunner:ipv4}
694 port = $${supervisord:port}
696 [monitor-current-log-access]
697 < = monitor-directory-access
698 source = $${directory:log}