From 6dfd3d62dfcd6762359adbc970538faa147bb51c Mon Sep 17 00:00:00 2001 From: Alain Takoudjou <alain.takoudjou@nexedi.com> Date: Fri, 25 Mar 2016 09:38:16 +0100 Subject: [PATCH] webrunner now use his own apache server --- software/slaprunner/common.cfg | 16 +-- software/slaprunner/httpd_conf.in | 75 +++++++++-- .../slaprunner/instance-runner-export.cfg.in | 9 +- software/slaprunner/instance-runner.cfg | 125 +++++++++++------- 4 files changed, 157 insertions(+), 68 deletions(-) diff --git a/software/slaprunner/common.cfg b/software/slaprunner/common.cfg index 6bf1c22e0..19879d617 100644 --- a/software/slaprunner/common.cfg +++ b/software/slaprunner/common.cfg @@ -54,7 +54,7 @@ mode = 0644 recipe = slapos.recipe.template url = ${:_profile_base_location_}/instance-runner.cfg output = ${buildout:directory}/template-runner.cfg.in -md5sum = 04f5cd311b452836b76808cf29f5a23d +md5sum = c1c81a2042f262a52657da3d427222e4 mode = 0644 [template-runner-import-script] @@ -84,7 +84,7 @@ mode = 0644 recipe = slapos.recipe.template url = ${:_profile_base_location_}/instance-runner-export.cfg.in output = ${buildout:directory}/instance-runner-export.cfg -md5sum = d2c374858d421247dfabcf38589a904f +md5sum = 8f4912ca04a650298c3c260689109c2e mode = 0644 [template-resilient] @@ -114,7 +114,7 @@ mode = 0644 recipe = hexagonit.recipe.download url = ${:_profile_base_location_}/httpd_conf.in download-only = true -md5sum = 61ac2dd5aeb5af9745d4c72d2571df8a +md5sum = 21009dac6e9868bed61a669632103830 filename = httpd_conf.in mode = 0644 @@ -171,15 +171,6 @@ filename = listener_slapgrid.py.in download-only = true mode = 0644 -[cors-domain-cgi] -recipe = hexagonit.recipe.download -url = ${:_profile_base_location_}/template/${:filename} -download-only = true -md5sum = d4c564267dd98cd178a890158c52c384 -destination = ${buildout:parts-directory}/monitor-template-cors-domain-cgi -filename = cors-domain.jinja -mode = 0644 - [monitor-check-webrunner-internal-instance] recipe = hexagonit.recipe.download url = ${:_profile_base_location_}/template/${:filename} @@ -193,6 +184,7 @@ mode = 0644 recipe = zc.recipe.egg eggs = collective.recipe.environment + collective.recipe.template cns.recipe.symlink erp5.util lock-file diff --git a/software/slaprunner/httpd_conf.in b/software/slaprunner/httpd_conf.in index afce96dad..3e5ea4b71 100644 --- a/software/slaprunner/httpd_conf.in +++ b/software/slaprunner/httpd_conf.in @@ -1,9 +1,69 @@ +PidFile "{{ parameters.path_pid }}" +ServerName example.com +ServerAdmin someone@email + +<IfDefine !HTTPDPort> + Listen [{{ parameters.global_ip }}]:{{ parameters.global_port }} + Define HTTPDPort +</IfDefine> + +LoadModule unixd_module modules/mod_unixd.so +LoadModule access_compat_module modules/mod_access_compat.so +LoadModule auth_basic_module modules/mod_auth_basic.so +LoadModule authz_core_module modules/mod_authz_core.so +LoadModule authz_user_module modules/mod_authz_user.so +LoadModule authz_host_module modules/mod_authz_host.so +LoadModule authn_core_module modules/mod_authn_core.so +LoadModule authn_file_module modules/mod_authn_file.so +LoadModule mime_module modules/mod_mime.so +#LoadModule cgid_module modules/mod_cgid.so +LoadModule ssl_module modules/mod_ssl.so +LoadModule alias_module modules/mod_alias.so +LoadModule env_module modules/mod_env.so +LoadModule rewrite_module modules/mod_rewrite.so +LoadModule headers_module modules/mod_headers.so LoadModule log_config_module modules/mod_log_config.so +LoadModule dav_module modules/mod_dav.so +LoadModule dav_fs_module modules/mod_dav_fs.so LoadModule cache_module modules/mod_cache.so LoadModule file_cache_module modules/mod_file_cache.so +LoadModule setenvif_module modules/mod_setenvif.so +LoadModule dir_module modules/mod_dir.so +LoadModule cgid_module modules/mod_cgid.so +LoadModule autoindex_module modules/mod_autoindex.so + +ErrorLog "{{ parameters.path_error_log }}" +LogFormat "%h %l %u %t \"%r\" %>s %b" common +CustomLog "{{ parameters.path_access_log }}" common + +# SSL Configuration +Define SSLConfigured +SSLCertificateFile {{ parameters.cert_file }} +SSLCertificateKeyFile {{ parameters.key_file }} +SSLRandomSeed startup builtin +SSLRandomSeed connect builtin +SSLRandomSeed startup /dev/urandom 256 +SSLRandomSeed connect builtin +SSLProtocol -ALL +SSLv3 +TLSv1 +SSLHonorCipherOrder On +SSLCipherSuite RC4-SHA:HIGH:!ADH +SSLEngine On + +Include {{ parameters.httpd_cors_file }} +Header set Access-Control-Allow-Credentials "true" +Header set Access-Control-Allow-Methods "PROPFIND, PROPPATCH, COPY, MOVE, DELETE, MKCOL, LOCK, UNLOCK, PUT, GETLIB, VERSION-CONTROL, CHECKIN, CHECKOUT, UNCHECKOUT, REPORT, UPDATE, CANCELUPLOAD, HEAD, OPTIONS, GET, POST" +Header set Access-Control-Allow-Headers "Overwrite, Destination, Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control, Authorization" +DocumentRoot {{ parameters.runner_home }}/public -Alias /web-public {{ parameters.runner_home }}/public +# Directory protection +<Directory /> + Options FollowSymLinks + AllowOverride None + Require all denied +</Directory> + +Alias /public {{ parameters.runner_home }}/public <Directory {{ parameters.runner_home }}/public> Order Allow,Deny Allow from all @@ -17,20 +77,20 @@ Alias /web-public {{ parameters.runner_home }}/public </Files> </Directory> -Alias /shared {{ parameters.runner_home }} +DavLockDB {{ parameters.dav_lock }} +Alias /share {{ parameters.runner_home }} <Directory {{ parameters.runner_home }}> DirectoryIndex disabled DAV On Options Indexes FollowSymLinks AuthType Basic - AuthName "webdav" - AuthUserFile "{{ parameters.etc_dir }}/monitor-htpasswd" + AuthName "Webrunner Dav" + AuthUserFile "{{ parameters.htpasswd_file }}" <LimitExcept OPTIONS> Require valid-user </LimitExcept> </Directory> - SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ {{ parameters.git_http_backend }}/ ScriptAlias /git-public/ {{ parameters.git_http_backend }}/ @@ -45,7 +105,7 @@ RewriteCond %{REQUEST_URI} /git-receive-pack$ AuthType Basic AuthName "Git Access" - AuthUserFile "{{ parameters.etc_dir }}/monitor-htpasswd" + AuthUserFile "{{ parameters.htpasswd_file }}" Require valid-user </LocationMatch> @@ -56,8 +116,7 @@ RewriteCond %{REQUEST_URI} /git-receive-pack$ AuthType Basic AuthName "Git Access" - AuthUserFile "{{ parameters.etc_dir }}/monitor-htpasswd" + AuthUserFile "{{ parameters.htpasswd_file }}" Require valid-user Satisfy any </LocationMatch> - diff --git a/software/slaprunner/instance-runner-export.cfg.in b/software/slaprunner/instance-runner-export.cfg.in index 7ef23b337..e1c750402 100644 --- a/software/slaprunner/instance-runner-export.cfg.in +++ b/software/slaprunner/instance-runner-export.cfg.in @@ -15,6 +15,8 @@ parts += publish-connection-information slaprunner-promise slaprunner-frontend-promise + apache-httpd-promise + httpd-frontend-promise slaprunner-supervisord-wrapper dropbear-promise runtestsuite @@ -22,11 +24,15 @@ parts += shellinabox slapos-cfg slapos-repo - cron-entry-backup cron-entry-prepare-software deploy-instance-parameters + instance-software + instance-software-type minishell-cwd + bash-profile supervisord-wrapper + supervisord-promise + httpd-graceful-wrapper ## Monitoring part ## Monitor for runner monitor-check-resilient-feed-file @@ -50,6 +56,7 @@ monitor-httpd-port = 8437 # Pass some parameter to dispay in monitoring interface instance-configuration = file recovery-code $${recovery-code:storage-path} + httpdcors cors-domain $${slaprunner-httpd-cors:location} $${httpd-graceful-wrapper:output} raw webrunner-url https://$${request-frontend:connection-domain} # Extends publish section with resilient parameters diff --git a/software/slaprunner/instance-runner.cfg b/software/slaprunner/instance-runner.cfg index a3b1fa7d1..7e8744973 100644 --- a/software/slaprunner/instance-runner.cfg +++ b/software/slaprunner/instance-runner.cfg @@ -12,6 +12,8 @@ parts = publish-connection-information slaprunner-promise slaprunner-frontend-promise + apache-httpd-promise + httpd-frontend-promise slaprunner-supervisord-wrapper dropbear-promise runtestsuite @@ -27,6 +29,7 @@ parts = bash-profile supervisord-wrapper supervisord-promise + httpd-graceful-wrapper {% if slapparameter_dict.get('custom-frontend-backend-url') and slapparameter_dict.get('check-custom-frontend-promise', 'false') == 'true' %} custom-frontend-promise {% endif %} @@ -298,39 +301,69 @@ context = section param_nginx_frontend nginx-frontend [httpd-parameters] -#path_pid = $${directory:run}/httpd.pid -#path_error_log = $${directory:log}/httpd-error.log -#path_access_log = $${directory:log}/httpd-access.log -#key_file = $${ca-httpd:key-file} -#cert_file = $${ca-httpd:cert-file} +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} global_ip = $${slap-network-information:global-ipv6} -global_port = $${slaprunner:runner_port} -monitor_port = $${monitor-parameters:port} +global_port = 8386 +#httpd_port = $${monitor-parameters:port} #monitor_index = $${deploy-index:rendered} -#working_directory = $${slaprunner:working-directory} -#dav_lock = $${directory:var}/DavLock +working_directory = $${slaprunner:working-directory} +dav_lock = $${directory:var}/WebDavLock +htpasswd_file = $${monitor-httpd-conf-parameter:htpasswd-file} etc_dir = $${directory:etc} -#var_dir = $${directory:var} -#project_folder = $${directory:project} +var_dir = $${directory:var} +project_folder = $${directory:project} project_private_folder = $${runnerdirectory:private-project} project_public_folder = $${runnerdirectory:public-project} runner_home = $${runnerdirectory:home} git_http_backend = ${git:location}/libexec/git-core/git-http-backend #cgi_httpd_conf = $${monitor-httpd-configuration-file:rendered} -#httpd_cors_file = $${monitor-httpd-cors:location} +httpd_cors_file = $${slaprunner-httpd-cors:location} [httpd-conf] recipe = slapos.recipe.template:jinja2 template = ${template_httpd_conf:location}/${template_httpd_conf:filename} -rendered = $${directory:etc}/httpd-part.conf +rendered = $${directory:etc}/httpd.conf context = section parameters httpd-parameters -#[cgi-httpd-wrapper] -#recipe = slapos.cookbook:wrapper -#apache-executable = ${apache:location}/bin/httpd -#wrapper-path = $${ca-httpd:executable} -#command-line = $${:apache-executable} -f $${httpd-conf:rendered} -DFOREGROUND +[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 #-------------------- #-- @@ -405,6 +438,25 @@ config-url = $${slaprunner:access-url} config-domain = $${slap-parameter:frontend-domain} return = site_url domain +[request-httpd-frontend] +<= slap-connection +recipe = slapos.cookbook:requestoptional +name = SlapRunner httpd 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 = $${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 + #-------------------------------------- #-- #-- Send information to SlapOS Master @@ -417,10 +469,10 @@ backend_url = $${slaprunner:access-url} access_url = $${:url}/login url = https://$${request-frontend:connection-domain} ssh_command = ssh $${dropbear-runner-server:host} -p $${dropbear-runner-server:port} -webdav_url = $${:monitor-base-url}/shared/ -public_url = $${:monitor-base-url}/web-public/ -git_public_url = https://[$${httpd-parameters:global_ip}]:$${httpd-parameters:monitor_port}/git-public/ -git_private_url = https://[$${httpd-parameters:global_ip}]:$${httpd-parameters:monitor_port}/git/ +webdav_url = $${request-httpd-frontend:connection-secure_access}/shared/ +public_url = $${request-httpd-frontend:connection-secure_access}/public/ +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/ monitor-base-url = $${publish:monitor-base-url} monitor-url = $${publish:monitor-url} monitor-user = $${publish:monitor-user} @@ -473,6 +525,8 @@ auto-deploy-instance = true autorun = false monitor-port = 9687 instance-name = +monitor-cors-domains = +monitor-interface-url = [monitor-parameters] port = $${slap-parameter:monitor-port} @@ -682,12 +736,11 @@ opml-url-list = {{ slapparameter_dict['monitor-url-list'] }} # Pass some parameter to dispay in monitoring interface instance-configuration = file recovery-code $${recovery-code:storage-path} + httpdcors cors-domain $${slaprunner-httpd-cors:location} $${httpd-graceful-wrapper:output} + raw webrunner-url https://$${request-frontend:connection-domain} {% endif -%} configuration-file-path = $${buildout:directory}/knowledge0.cfg -[monitor-httpd-conf-parameter] -httpd-include-file = $${httpd-conf:rendered} - [monitor-check-webrunner-internal-instance] recipe = slapos.recipe.template:jinja2 template = ${monitor-check-webrunner-internal-instance:location}/${monitor-check-webrunner-internal-instance:filename} @@ -695,25 +748,3 @@ rendered = $${monitor-directory:promises}/$${:filename} filename = monitor-check-webrunner-internal-instance mode = 0744 -# XXX -not needed for monitor2 -[monitor-deploy-cors-domain-cgi] -recipe = slapos.recipe.template:jinja2 -template = ${cors-domain-cgi:location}/${cors-domain-cgi:filename} -rendered = $${monitor-directory:knowledge0-cgi}/$${:filename} -filename = cors-domain.cgi -mode = 0744 -context = - raw config_cfg $${buildout:directory}/knowledge0.cfg - raw timestamp $${buildout:directory}/.timestamp - raw python_executable ${buildout:executable} - key apache_file httpd-parameters:httpd_cors_file - key pwd monitor-directory:knowledge0-cgi - key this_file :filename - key httpd_graceful cgi-httpd-graceful-wrapper:rendered - -[monitor-httpd-cors-xx] -recipe = plone.recipe.command -command = if [ ! -f $${:location} ]; then touch $${:location}; fi -location = $${directory:etc}/$${:filename} -filename = httpd-cors.cfg -stop-on-error = true -- 2.30.9