{% import "caucase" as caucase with context %} [buildout] parts = promises publish-connection-parameter extends = {{ template_monitor }} eggs-directory = {{ buildout['eggs-directory'] }} develop-eggs-directory = {{ buildout['develop-eggs-directory'] }} offline = true [instance-parameter] recipe = slapos.cookbook:slapconfiguration 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} [slap-configuration] # frontend reads from from a part named [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} [directory] recipe = slapos.cookbook:mkdirectory home = ${buildout:directory} etc = ${:home}/etc var = ${:home}/var srv = ${:home}/srv tmp = ${:home}/tmp var-log = ${:var}/log service = ${:etc}/service promise = ${:etc}/promise rest-server-data-dir = ${:srv}/restic backup-caucased = ${:srv}/backup/caucased/ # Macros [check-port-listening-promise] recipe = slapos.cookbook:check_port_listening path = ${directory:promise}/${:_buildout_section_name_} [check-url-available-promise] recipe = slapos.cookbook:check_url_available path = ${directory:promise}/${:_buildout_section_name_} dash_path = {{ dash_bin }} curl_path = {{ curl_bin }} # Caucase [rest-server-certificate] key-file = ${directory:etc}/${:_buildout_section_name_}.key cert-file = ${directory:etc}/${:_buildout_section_name_}.crt common-name = ${:_buildout_section_name_} ca-file = ${directory:etc}/${:_buildout_section_name_}.ca.crt crl-file = ${directory:etc}/${:_buildout_section_name_}.crl {{ caucase.updater( prefix='rest-server-certificate', buildout_bin_directory=buildout['bin-directory'], updater_path='${directory:service}/rest-server-certificate-updater', url='${caucased:url}', data_dir='${directory:srv}/caucase-updater', crt_path='${rest-server-certificate:cert-file}', ca_path='${rest-server-certificate:ca-file}', crl_path='${rest-server-certificate:crl-file}', key_path='${rest-server-certificate:key-file}', template_csr='${rest-server-certificate-prepare-csr:csr}', openssl=openssl_bin, )}} [rest-server-certificate-csr-config] recipe = slapos.recipe.template:jinja2 mode = 644 template = inline: [req] prompt = no req_extensions = req_ext distinguished_name = dn [ dn ] CN = restic-rest-server [ req_ext ] subjectAltName = @alt_names [ alt_names ] IP.1 = ${instance-parameter:ipv4-random} IP.2 = ${instance-parameter:ipv6-random} rendered = ${buildout:parts-directory}/${:_buildout_section_name_}/${:_buildout_section_name_}.txt [rest-server-certificate-prepare-csr] recipe = plone.recipe.command command = if [ ! -f '${:csr}' ] ; then {{ openssl_bin }} req \ -newkey rsa:2048 \ -batch \ -new \ -nodes \ -keyout /dev/null \ -config '${rest-server-certificate-csr-config:rendered}' \ -out '${:csr}' fi stop-on-error = true csr = ${directory:srv}/${:_buildout_section_name_}.csr.pem [caucased] port = 18080 ip = ${instance-parameter:ipv6-random} netloc = [${:ip}]:${:port} url = http://${:netloc}/ {{ caucase.caucased( prefix='caucased', buildout_bin_directory=buildout['bin-directory'], caucased_path='${directory:service}/caucased', backup_dir='${directory:backup-caucased}', data_dir='${directory:srv}/caucased', netloc='${caucased:netloc}', tmp='${directory:tmp}', service_auto_approve_count=1, user_auto_approve_count=0, key_len=2048, )}} [rest-server-password] recipe = slapos.cookbook:generate.password user = backup [rest-server-htpassword] recipe = plone.recipe.command command = if [ ! -f '${:htpassword}' ] ; then {{ htpasswd_bin }} \ -b \ -B \ -c ${:htpassword} \ ${rest-server-password:user} \ ${rest-server-password:passwd} fi htpassword = ${directory:rest-server-data-dir}/.htpasswd stop-on-error = true [rest-server] recipe = slapos.cookbook:wrapper command-line = {{ gowork_bin }}/rest-server \ --listen [${instance-parameter:ipv6-random}]:${:port} --log ${directory:var-log}/${:_buildout_section_name_}-access.log --path ${directory:rest-server-data-dir} --tls --tls-cert ${rest-server-certificate:cert-file} --tls-key ${rest-server-certificate:key-file} --prometheus wrapper-path = ${directory:service}/rest-server port = 19080 ip = ${instance-parameter:ipv6-random} url = https://[${:ip}]:${:port} depends = ${rest-server-htpassword:recipe} [rest-server-listen-promise] <= check-port-listening-promise hostname= ${rest-server:ip} port = ${rest-server:port} [frontend] <= slap-connection recipe = slapos.cookbook:requestoptional name = Rest Server Frontend # 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 = ${rest-server:url} return = domain secure_access [frontend-available-promise] <= check-url-available-promise url = ${frontend:connection-secure_access} config-http-code = 401 [promises] recipe = instance-promises = ${caucased-promise:recipe} ${rest-server-certificate-promise:recipe} ${rest-server-listen-promise:path} ${frontend-available-promise:path} [publish-connection-parameter] recipe = slapos.cookbook:publish rest-server-user = ${rest-server-password:user} rest-server-password = ${rest-server-password:passwd} url = ${frontend:connection-secure_access} caucase-url = ${caucased:url}