From 406958012da0769681cc4d249b75654baee1fe41 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Le=20Ninivin?= <cedric.leninivin@tiolive.com>
Date: Fri, 2 May 2014 11:49:58 +0200
Subject: [PATCH] apache-runner: add log access and publish monitoring url

---
 .../instance-apache-frontend.cfg              |  12 +-
 .../instance-apache-replicate.cfg.in          |   8 +-
 stack/monitor/monitor.cfg.in                  | 113 ++++++++++++------
 stack/monitor/webfiles/index.html.jinja2      |   2 +
 4 files changed, 94 insertions(+), 41 deletions(-)

diff --git a/software/apache-frontend/instance-apache-frontend.cfg b/software/apache-frontend/instance-apache-frontend.cfg
index 4776c78cc..714dd74b0 100644
--- a/software/apache-frontend/instance-apache-frontend.cfg
+++ b/software/apache-frontend/instance-apache-frontend.cfg
@@ -48,7 +48,9 @@ parts =
   zero-parameters
   public-symlink
   cgi-httpd-wrapper
-
+## Monitor for apache
+  monitor-current-log-access
+  monitor-backup-log-access
 extends = ${monitor-template:output}
 
 
@@ -119,6 +121,14 @@ apache-directory = ${apache-2.2:location}
 apache-ipv6 = $${instance-parameter:ipv6-random}
 apache-https-port = $${instance-parameter:configuration.port}
 
+[monitor-current-log-access]
+< = monitor-directory-access
+source = $${directory:log}
+
+[monitor-backup-log-access]
+< = monitor-directory-access
+source = $${directory:logrotate-backup}
+
 [jinja2-template-base]
 recipe = slapos.recipe.template:jinja2
 rendered = $${buildout:directory}/$${:filename}
diff --git a/software/apache-frontend/instance-apache-replicate.cfg.in b/software/apache-frontend/instance-apache-replicate.cfg.in
index 3dc995961..2e8bc8034 100644
--- a/software/apache-frontend/instance-apache-replicate.cfg.in
+++ b/software/apache-frontend/instance-apache-replicate.cfg.in
@@ -59,20 +59,24 @@ sla-{{ parameter }} = {{ slapparameter_dict.pop( sla_key + parameter ) }}
 
 [replicate]
 <= slap-connection
-recipe = slapos.cookbook:request
+recipe = slapos.cookbook:requestoptional
 software-url = ${slap-connection:software-release-url}
 software-type = {{frontend_type}}
-return = private-ipv4 public-ipv4 slave-instance-information-list
+return = private-ipv4 public-ipv4 slave-instance-information-list monitor_url
 config = {{ ' '.join(slapparameter_dict.keys()) + ' ' + slave_list_name }}
 {% for parameter, value in slapparameter_dict.iteritems() -%}
 config-{{parameter}} = {{ value }}
 {% endfor -%}
 config-{{ slave_list_name }} = {{ json_module.dumps(slave_instance_list) }}
+connection-monitor_url =
 
 [publish-information]
 recipe = slapos.cookbook:publish
 domain = {{ slapparameter_dict.get('domain') }}
 slave-amount = {{ slave_instance_list | length }}
+{% for frontend in frontend_section_list %}
+{{ frontend }}-monitor-url = {{ '${' + frontend + ':connection-monitor_url}' }}
+{% endfor -%}
 {% for frontend in frontend_list -%}
 #{{frontend}}-private-ipv4 = ${request-{{frontend}}:private-ipv4}
 {% endfor -%}
diff --git a/stack/monitor/monitor.cfg.in b/stack/monitor/monitor.cfg.in
index aa39270eb..47963f018 100644
--- a/stack/monitor/monitor.cfg.in
+++ b/stack/monitor/monitor.cfg.in
@@ -7,20 +7,23 @@ key = $${slap-connection:key-file}
 cert = $${slap-connection:cert-file}
 
 [monitor-parameters]
-monitor-dir = $${directory:var}/monitor
+monitor-dir = $${monitor-directory:var}/monitor
 result-dir = $${:monitor-dir}/bool
 json-filename = monitor.json
 json-path = $${:monitor-dir}/$${:json-filename}
 rss-path = $${:public-cgi}/$${:rss-filename}
 rss-filename = rssfeed.html
-executable = $${directory:bin}/monitor.py
-cgi-bin = $${directory:cgi-bin}
-monitoring-cgi = $${directory:monitoring-cgi}
-knowledge0-cgi = $${directory:knowledge0-cgi}
-public-cgi = $${directory:public-cgi}
+executable = $${monitor-directory:bin}/monitor.py
+cgi-bin = $${monitor-directory:cgi-bin}
+monitoring-cgi = $${monitor-directory:monitoring-cgi}
+knowledge0-cgi = $${monitor-directory:knowledge0-cgi}
+public-cgi = $${monitor-directory:public-cgi}
 port = 9685
+private-directory = $${monitor-directory:monitor-private-directory}
+htaccess-file = $${monitor-htaccess:htaccess-path}
 
-[directory]
+[monitor-directory]
+recipe = slapos.cookbook:mkdirectory
 home = $${buildout:directory}
 etc = $${:home}/etc
 bin = $${:home}/bin
@@ -37,34 +40,35 @@ crontabs = $${:etc}/crontabs
 cronstamps = $${:etc}/cronstamps
 log = $${:var}/log
 monitor = $${:etc}/monitor
-monitor-result = $${monitor-parameters:monitor-dir}
-monitor-result-bool = $${monitor-parameters:result-dir}
+monitor-result = $${:var}/monitor
+monitor-result-bool = $${:var}/monitor
 promise = $${:etc}/promise
 public-cgi = $${:cgi-bin}/public
 run = $${:var}/run
 service = $${:etc}/service/
 tmp = $${:home}/tmp
 www = $${:var}/www
+monitor-private-directory = $${:srv}/monitor-private
 
 [public-symlink]
 recipe = cns.recipe.symlink
-symlink = $${monitor-parameters:public-cgi} = $${directory:www}/public
+symlink = $${monitor-parameters:public-cgi} = $${monitor-directory:www}/public
 autocreate = true
 
 [cron]
 recipe = slapos.cookbook:cron
 dcrond-binary = ${dcron:location}/sbin/crond
-cron-entries = $${directory:cron-entries}
-crontabs = $${directory:crontabs}
-cronstamps = $${directory:cronstamps}
+cron-entries = $${monitor-directory:cron-entries}
+crontabs = $${monitor-directory:crontabs}
+cronstamps = $${monitor-directory:cronstamps}
 catcher = $${cron-simplelogger:wrapper}
-binary = $${directory:service}/crond
+binary = $${monitor-directory:service}/crond
 
 # Add log to cron
 [cron-simplelogger]
 recipe = slapos.cookbook:simplelogger
-wrapper = $${directory:bin}/cron_simplelogger
-log = $${directory:log}/cron.log
+wrapper = $${monitor-directory:bin}/cron_simplelogger
+log = $${monitor-directory:log}/cron.log
 
 [cron-entry-monitor]
 <= cron
@@ -84,14 +88,14 @@ command = $${make-rss:output}
 recipe = hexagonit.recipe.download
 url = ${download-static-files:destination}/${download-static-files:filename}
 filename = static
-destination = $${directory:www}
+destination = $${monitor-directory:www}
 ignore-existing = true
 mode = 0644
 
 [deploy-index]
 recipe = slapos.recipe.template:jinja2
 template = ${index:location}/${index:filename}
-rendered = $${directory:www}/$${:filename}
+rendered = $${monitor-directory:www}/$${:filename}
 filename = index.cgi
 mode = 0744
 context =
@@ -104,7 +108,7 @@ context =
 [deploy-index-template]
 recipe = hexagonit.recipe.download
 url = ${index-template:location}/$${:filename}
-destination = $${directory:www}
+destination = $${monitor-directory:www}
 filename = ${index-template:filename}
 download-only = true
 mode = 0644
@@ -138,7 +142,7 @@ template = ${monitor-bin:location}/${monitor-bin:filename}
 rendered = $${monitor-parameters:executable}
 mode = 0744
 context =
-  section directory directory
+  section directory monitor-directory
   key monitoring_file_json monitor-parameters:json-path
   key monitoring_folder_bool monitor-parameters:result-dir
   raw python_executable ${buildout:executable}
@@ -146,7 +150,7 @@ context =
 [deploy-rss-script]
 recipe = hexagonit.recipe.download
 url = ${rss-bin:destination}/${rss-bin:filename}
-destination = $${directory:bin}
+destination = $${monitor-directory:bin}
 filename = ${rss-bin:filename}
 mode = 0744
 download-only = true
@@ -154,23 +158,34 @@ download-only = true
 [make-rss]
 recipe = slapos.recipe.template
 url = ${make-rss-script:output}
-output = $${directory:bin}/make-rss.sh
+output = $${monitor-directory:bin}/make-rss.sh
 mode = 0744
 
+[monitor-htaccess]
+recipe = plone.recipe.command
+stop-on-error = true
+htaccess-path = $${monitor-directory:monitor}/.htaccess
+command = ${apache:location}/bin/htpasswd -cb $${:htaccess-path} admin $${zero-parameters:monitor-password}
+
+[monitor-directory-access]
+recipe = plone.recipe.command
+command = ln -s $${:source} $${monitor-directory:monitor-private-directory}
+source =
+
 [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/
+requests = $${monitor-directory:ca-dir}/requests/
+private = $${monitor-directory:ca-dir}/private/
+certs = $${monitor-directory:ca-dir}/certs/
+newcerts = $${monitor-directory:ca-dir}/newcerts/
+crl = $${monitor-directory:ca-dir}/crl/
 
 [certificate-authority]
 recipe = slapos.cookbook:certificate_authority
 openssl-binary = ${openssl:location}/bin/openssl
-ca-dir = $${directory:ca-dir}
+ca-dir = $${monitor-directory:ca-dir}
 requests-directory = $${cadirectory:requests}
-wrapper = $${directory:service}/certificate_authority
+wrapper = $${monitor-directory:service}/certificate_authority
 ca-private = $${cadirectory:private}
 ca-certs = $${cadirectory:certs}
 ca-newcerts = $${cadirectory:newcerts}
@@ -181,8 +196,8 @@ ca-crl = $${cadirectory:crl}
 recipe = slapos.cookbook:certificate_authority.request
 key-file = $${cadirectory:certs}/httpd.key
 cert-file = $${cadirectory:certs}/httpd.crt
-executable = $${directory:bin}/cgi-httpd
-wrapper = $${directory:service}/cgi-httpd
+executable = $${monitor-directory:bin}/cgi-httpd
+wrapper = $${monitor-directory:service}/cgi-httpd
 # Put domain name
 name = example.com
 
@@ -214,11 +229,18 @@ input = inline:
   LoadModule unixd_module modules/mod_unixd.so
   LoadModule access_compat_module modules/mod_access_compat.so
   LoadModule authz_core_module modules/mod_authz_core.so
+  LoadModule authn_core_module modules/mod_authn_core.so
   LoadModule authz_host_module modules/mod_authz_host.so
   LoadModule mime_module modules/mod_mime.so
   LoadModule cgid_module modules/mod_cgid.so
   LoadModule dir_module modules/mod_dir.so
   LoadModule ssl_module modules/mod_ssl.so
+  LoadModule alias_module modules/mod_alias.so
+  LoadModule autoindex_module modules/mod_autoindex.so
+  LoadModule auth_basic_module modules/mod_auth_basic.so
+  LoadModule authz_user_module modules/mod_authz_user.so
+  LoadModule authn_file_module modules/mod_authn_file.so
+
   # SSL Configuration
   <IfDefine !SSLConfigured>
   Define SSLConfigured
@@ -243,14 +265,29 @@ input = inline:
     AddHandler cgi-script .cgi
     DirectoryIndex $${deploy-index:filename}
   </Directory>
-output = $${directory:etc}/cgi-httpd.conf
+  Alias /private/ $${monitor-parameters:private-directory}/
+  <Directory $${monitor-parameters:private-directory}>
+  Order Deny,Allow
+  Deny from env=AUTHREQUIRED
+  <Files ".??*">
+    Order Allow,Deny
+    Deny from all
+  </Files>
+  AuthType Basic
+  AuthName "Private access"
+  AuthUserFile "$${monitor-parameters:htaccess-file}"
+  Require valid-user
+  Options Indexes FollowSymLinks
+  Satisfy all
+  </Directory>
+output = $${monitor-directory:etc}/cgi-httpd.conf
 listening-ip = $${slap-parameters:ipv6-random}
 # XXX: randomize-me
-htdocs = $${directory:www}
-pid-file = $${directory:run}/cgi-httpd.pid
-cgid-pid-file = $${directory:run}/cgi-httpd-cgid.pid
-document-root = $${directory:www}
-error-log = $${directory:log}/cgi-httpd-error-log
+htdocs = $${monitor-directory:www}
+pid-file = $${monitor-directory:run}/cgi-httpd.pid
+cgid-pid-file = $${monitor-directory:run}/cgi-httpd-cgid.pid
+document-root = $${monitor-directory:www}
+error-log = $${monitor-directory:log}/cgi-httpd-error-log
 
 [cgi-httpd-wrapper]
 recipe = slapos.cookbook:wrapper
@@ -260,7 +297,7 @@ wrapper-path = $${ca-httpd:executable}
 
 [monitor-promise]
 recipe = slapos.cookbook:check_url_available
-path = $${directory:promises}/monitor
+path = $${monitor-directory:promises}/monitor
 url = https://[$${cgi-httpd-configuration-file:listening-ip}]:$${monitor-parameters:port}/$${deploy-index:filename}
 check-secure = 1
 dash_path = ${dash:location}/bin/dash
diff --git a/stack/monitor/webfiles/index.html.jinja2 b/stack/monitor/webfiles/index.html.jinja2
index 4977ae82f..a8250012d 100644
--- a/stack/monitor/webfiles/index.html.jinja2
+++ b/stack/monitor/webfiles/index.html.jinja2
@@ -17,6 +17,8 @@
     <li><a href="{{ category }}/{{ script }}" class="script">{{ script }}</a></li>
     {% endfor %}
    {% endfor %}
+   <li class="pure-menu-heading category">Files</li>
+   <li><a href="./private/" class="link">  User: admin</br>  Password is yours</a></li>
   </ul>
  </div>
  </div>
-- 
2.30.9