instance-monitor.cfg.jinja2.in 15.1 KB
Newer Older
1 2 3 4 5 6 7 8
[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}

9 10 11 12
# XXX Default values if doesn't exists
root-instance-title = UNKNOWN H-S
instance-title = UNKNOWN Instance

13 14 15 16 17 18 19 20 21 22
[directory]
recipe = slapos.cookbook:mkdirectory
etc = ${buildout:directory}/etc
bin = ${buildout:directory}/bin
srv = ${buildout:directory}/srv
var = ${buildout:directory}/var
run = ${:var}/run
log = ${:var}/log
scripts = ${:etc}/run
services = ${:etc}/service
23
plugins = ${:etc}/plugin
24 25 26 27 28 29 30
monitor = ${:srv}/monitor

[monitor-directory]
recipe = slapos.cookbook:mkdirectory
bin = ${directory:bin}
etc = ${directory:etc}
pids = ${directory:run}/monitor
31
webdav = ${directory:monitor}/webdav
32 33
public = ${directory:monitor}/public
private = ${directory:monitor}/private
34
documents = ${:private}/documents
35
log = ${directory:log}/monitor
36 37
promise-result = ${buildout:directory}/.slapgrid/promise/result
promise-log = ${buildout:directory}/.slapgrid/promise/log
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

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

[certificate-authority]
recipe = slapos.cookbook:certificate_authority
openssl-binary = {{ openssl_executable_location }}
ca-dir = ${ca-directory:root}
requests-directory = ${ca-directory:requests}
53
wrapper = ${directory:bin}/certificate_authority
54 55 56 57 58
ca-private = ${ca-directory:private}
ca-certs = ${ca-directory:certs}
ca-newcerts = ${ca-directory:newcerts}
ca-crl = ${ca-directory:crl}

59 60 61 62
[certificate-authority-service]
recipe = slapos.cookbook:wrapper
command-line = ${certificate-authority:wrapper}
wrapper-path = ${directory:services}/certificate_authority
63
hash-existing-files = ${buildout:directory}/software_release/buildout.cfg
64

65
[ca-monitor-httpd]
66 67 68 69
<= certificate-authority
recipe = slapos.cookbook:certificate_authority.request
key-file = ${monitor-httpd-conf-parameter:key-file}
cert-file = ${monitor-httpd-conf-parameter:cert-file}
70
executable = ${monitor-httpd-wrapper:wrapper-path}
71
wrapper = ${directory:bin}/ca-monitor-httpd
72 73 74 75 76

[ca-monitor-httpd-service]
recipe = slapos.cookbook:wrapper
command-line = ${ca-monitor-httpd:wrapper}
wrapper-path = ${directory:services}/monitor-httpd
77
hash-existing-files = ${buildout:directory}/software_release/buildout.cfg
78 79 80

[monitor-conf-parameters]
title = ${monitor-instance-parameter:monitor-title}
81
root-title = ${monitor-instance-parameter:root-instance-title}
82 83
public-folder = ${monitor-directory:public}
private-folder = ${monitor-directory:private}
84
webdav-folder = ${monitor-directory:webdav}
85
base-url = ${monitor-instance-parameter:monitor-base-url}
86 87
service-pid-folder = ${monitor-directory:pids}
crond-folder = ${logrotate-directory:cron-entries}
88 89
log-folder = ${monitor-directory:log}
document-folder = ${monitor-directory:documents}
90
pid-file = ${monitor-directory:pids}/monitor-bootstrap.pid
Alain Takoudjou's avatar
Alain Takoudjou committed
91

92
public-path-list =
93 94
private-path-list = ${directory:log}
monitor-url-list = ${monitor-instance-parameter:monitor-url-list}
95 96
parameter-file-path = ${monitor-instance-parameter:configuration-file-path}

97
parameter-list =
98
  raw monitor-user ${monitor-instance-parameter:username}
99
  htpasswd monitor-password ${httpd-monitor-htpasswd:password-file} ${monitor-instance-parameter:username} ${httpd-monitor-htpasswd:htpasswd-path}
100
  file min-free-disk-MB ${promise-check-free-disk-space:config-threshold-file}
101 102 103
  ${monitor-instance-parameter:instance-configuration}
# htpasswd entry:  htpasswd key password-file username htpasswd-file

104 105
promise-output-file = ${directory:monitor}/monitor-bootstrap-status

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
[monitor-promise-conf]
output-folder = ${monitor-directory:public}/promise
history-folder = ${monitor-directory:public}
promise-folder = ${directory:plugins}
pid-path = ${monitor-directory:pids}/runpromise.pid
partition-folder = ${buildout:directory}
master-url = ${slap-connection:server-url}
partition-cert = ${slap-connection:cert-file}
partition-key = ${slap-connection:key-file}
partition-id = ${slap-connection:partition-id}
computer-id = ${slap-connection:computer-id}
ipv4 = ${slap-configuration:ipv4-random}
ipv6 = ${slap-configuration:ipv6-random}
software-release = ${slap-connection:software-release-url}
software-type = ${slap-configuration:slap-software-type}
121

122 123 124
[monitor-base-url-dict]
# place holder to be used to collect erp5 monitor urls

125 126 127 128 129
[monitor-conf]
recipe = slapos.recipe.template:jinja2
template = {{ monitor_conf_template }}
rendered = ${directory:etc}/${:filename}
filename = monitor.conf
130
context = section parameter_dict          monitor-conf-parameters
131
          section promise_parameter_dict  monitor-promise-conf
132
          section monitor_base_urls       monitor-base-url-dict
133

Alain Takoudjou's avatar
Alain Takoudjou committed
134 135
[start-monitor]
recipe = slapos.cookbook:wrapper
136
command-line = {{ monitor_bin }} -c ${monitor-conf:rendered}
137 138
name = bootstrap-monitor
wrapper-path = ${directory:scripts}/${:name}
Alain Takoudjou's avatar
Alain Takoudjou committed
139

140 141
[monitor-htpasswd]
recipe = slapos.cookbook:generate.password
142
storage-path = ${directory:etc}/.monitor_pwd
143

144 145 146
[httpd-monitor-htpasswd]
recipe = plone.recipe.command
stop-on-error = true
147
password-file = ${directory:etc}/.monitor_pwd
148
htpasswd-path = ${monitor-directory:etc}/monitor-htpasswd
149
command =
150 151 152 153 154
  echo "${monitor-instance-parameter:password}" >${:password-file}
  [ -s "${:htpasswd-path}" ] ||
    {{ apache_location }}/bin/htpasswd -ci ${:htpasswd-path} "${monitor-instance-parameter:username}" <${:password-file}
update-command =
  [ -s "${:password-file}" ] || ${:command}
155

156 157 158
[monitor-symlink]
recipe = cns.recipe.symlink
symlink =
159
  ${monitor-directory:promise-result} = ${monitor-directory:public}/promise
160
  ${monitor-directory:promise-log} = ${monitor-directory:log}/promise
161

162 163 164
[monitor-httpd-conf-parameter]
listening-ip = ${monitor-instance-parameter:monitor-httpd-ipv6}
port = ${monitor-instance-parameter:monitor-httpd-port}
165
pid-file = ${directory:run}/monitor-httpd.pid
166 167
access-log = ${directory:log}/monitor-httpd-access.log
error-log = ${directory:log}/monitor-httpd-error.log
168 169
cert-file = ${ca-directory:certs}/monitor-httpd.crt
key-file = ${ca-directory:certs}/monitor-httpd.key
170
htpasswd-file = ${httpd-monitor-htpasswd:htpasswd-path}
171 172
url = https://[${monitor-instance-parameter:monitor-httpd-ipv6}]:${:port}
httpd-cors-config-file = ${monitor-httpd-cors:rendered}
173
httpd-include-file =
174 175 176 177 178 179 180 181 182 183

[monitor-httpd-conf]
recipe = slapos.recipe.template:jinja2
template = {{ monitor_httpd_template }}
rendered = ${monitor-directory:etc}/monitor-httpd.conf
mode = 0744
context =
  section directory monitor-directory
  section parameter_dict monitor-httpd-conf-parameter

184 185 186 187 188 189 190 191 192
[monitor-httpd-cors]
recipe = slapos.recipe.template:jinja2
template = {{ monitor_https_cors }}
rendered = ${directory:etc}/httpd-cors.cfg
mode = 0600
context =
  key domain monitor-instance-parameter:cors-domains

[monitor-httpd-wrapper]
193 194 195 196
recipe = slapos.cookbook:wrapper
command-line = {{ apache_location }}/bin/httpd -f ${monitor-httpd-conf:rendered} -DFOREGROUND
wrapper-path = ${directory:bin}/monitor-httpd
wait-for-files =
197 198
  ${monitor-httpd-conf-parameter:key-file}
  ${monitor-httpd-conf-parameter:cert-file}
199
  ${monitor-httpd-graceful-wrapper:rendered}
200

201
[monitor-httpd-graceful-wrapper]
202 203
recipe = slapos.recipe.template:jinja2
template = {{ template_wrapper }}
204
rendered = ${directory:scripts}/monitor-httpd-graceful
205 206 207
mode = 0700
context =
    key content :command
208
    raw dash_binary {{ dash_executable_location }}
209 210
command = kill -USR1 $(cat ${monitor-httpd-conf-parameter:pid-file})

211 212 213
[logrotate-entry-monitor-httpd]
<= logrotate-entry-base
name = monitor-apache
214 215
log = ${directory:log}/monitor-httpd-*.log
post = test ! -s ${monitor-httpd-conf-parameter:pid-file} || {{ bin_directory }}/slapos-kill --pidfile ${monitor-httpd-conf-parameter:pid-file} -s USR1
216

217 218 219 220 221 222 223 224
[xnice-bin]
recipe = collective.recipe.template
input = inline:#!/bin/sh
  # run something at lowest possible priority
  exec nice -19 chrt --idle 0 ionice -c3 "$@"
output = ${directory:bin}/xnice
mode = 700

225 226
[monitor-globalstate-wrapper]
recipe = slapos.cookbook:wrapper
227
command-line = ${xnice-bin:output} {{ monitor_genstatus }} '${monitor-conf:rendered}'
228 229 230 231 232
wrapper-path = ${directory:bin}/monitor-globalstate

[monitor-configurator-wrapper]
recipe = slapos.cookbook:wrapper
# XXX - hard coded path
233 234 235 236 237
command-line = ${xnice-bin:output} {{ monitor_configwrite }}
              --config_folder '${monitor-conf-parameters:private-folder}/config/.jio_documents'
              --output_cfg_file '${monitor-instance-parameter:configuration-file-path}'
              --htpasswd_bin '{{ apache_location }}/bin/htpasswd'
              --monitor_https_cors {{ monitor_https_cors }}
238 239
wrapper-path = ${directory:bin}/monitor-configurator

240 241 242 243 244 245 246 247
[monitor-collect-wrapper]
recipe = slapos.cookbook:wrapper
command-line = ${xnice-bin:output} {{ monitor_collect }}
               --output_folder ${monitor-directory:documents}
               --collector_db ${monitor-instance-parameter:collector-db}
               --pid_file ${monitor-directory:pids}/monitor-collect.pid
wrapper-path = ${directory:bin}/monitor-collect

248 249 250 251
[monitor-globalstate-cron-entry]
recipe = slapos.cookbook:cron.d
cron-entries = ${cron:cron-entries}
name = monitor-globalstate
252
frequency = */2 * * * *
Julien Muchembled's avatar
Julien Muchembled committed
253
command = {{ randomsleep }} 20 && ${monitor-globalstate-wrapper:wrapper-path}
254

255 256 257 258 259
[monitor-globalstate-first-run]
recipe = plone.recipe.command
command = ${monitor-globalstate-wrapper:wrapper-path}
stop-on-error = true

260 261 262 263 264
[monitor-configurator-cron-entry]
recipe = slapos.cookbook:cron.d
cron-entries = ${cron:cron-entries}
name = monitor-configurator
frequency = * * * * *
Julien Muchembled's avatar
Julien Muchembled committed
265
command = {{ randomsleep }} 10 && ${monitor-configurator-wrapper:wrapper-path}
266 267 268 269 270 271

[monitor-collect-cron-entry]
recipe = slapos.cookbook:cron.d
cron-entries = ${cron:cron-entries}
name = monitor_collect
frequency = * * * * *
Julien Muchembled's avatar
Julien Muchembled committed
272
command = {{ randomsleep }} 40 && ${monitor-collect-wrapper:wrapper-path}
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299

[logrotate-entry-monitor-data]
recipe = collective.recipe.template
name = monitor.data
log = ${monitor-directory:private}/*.data.json ${monitor-directory:documents}/*.data.json
input = inline:${:log} {
    weekly
    nocreate
    olddir ${monitor-directory:documents}
    rotate 104
    nocompress
    missingok
    extension .json
    dateext
    dateformat -%Y-%m-%d
    notifempty
  }
output = ${logrotate-directory:logrotate-entries}/${:name}
mode = 600

[logrotate-entry-monitor-promise-history]
<= logrotate-entry-base
name = monitor.service.status
log = ${monitor-directory:public}/*.history.json
rotate-num = 0
frequency = weekly
pre = {{ monitor_statistic }} --history_folder ${monitor-directory:public}
300

301 302 303 304
[monitor-promise-base]
recipe = slapos.cookbook:promise.plugin
eggs =
  slapos.toolbox
305
module = slapos.promise.plugin.${:promise}
306 307
output = ${directory:plugins}/${:name}

308
[monitor-httpd-promise]
309
<= monitor-promise-base
310
promise = check_url_available
311 312
name = monitor-httpd-listening-on-tcp.py
config-url = ${monitor-httpd-conf-parameter:url}
313
config-http-code = 401
314

315
[monitor-publish-parameters]
316 317
# XXX depends on monitor-base section
monitor-base-url = ${monitor-base:base-url}
318 319 320
monitor-url = ${:monitor-base-url}/public/feeds
monitor-user = ${monitor-instance-parameter:username}
monitor-password = ${monitor-instance-parameter:password}
321 322

[monitor-instance-parameter]
323 324 325
monitor-title = ${slap-configuration:instance-title}
monitor-httpd-ipv6 = ${slap-configuration:ipv6-random}
monitor-httpd-port = 8196
326
# XXX - Set monitor-base-url = ${monitor-httpd-conf-parameter:url} => https://[ipv6]:port
327
monitor-base-url = ${monitor-frontend:connection-secure_access}
328
#monitor-base-url = ${monitor-httpd-conf-parameter:url}
329
root-instance-title = ${slap-configuration:root-instance-title}
330
monitor-url-list =
331
cors-domains = monitor.app.officejs.com
332 333 334 335
# XXX Hard coded parameter
collector-db = /srv/slapgrid/var/data-log/collector.db
# Credentials
password = ${monitor-htpasswd:passwd}
336
username = admin
337 338 339 340 341 342
# XXX: type key value
# ex raw monitor-password resqdsdsd34
instance-configuration =

configuration-file-path = ${monitor-directory:etc}/monitor_knowledge0.cfg

343 344
interface-url = https://monitor.app.officejs.com

345 346 347 348 349 350 351 352 353 354 355 356
[monitor-frontend]
<= slap-connection
recipe = slapos.cookbook:requestoptional
name = Monitor Frontend ${monitor-instance-parameter:monitor-title}
# 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 = ${monitor-httpd-conf-parameter:url}
config-https-only = true
#software-type = custom-personal
return = domain secure_access

357 358 359 360
# Requests to the frontend URL should succeed with the correct
# credentials.
[check-monitor-password-promise]
<= monitor-promise-base
361
promise = check_url_available
362 363 364 365
name = check-monitor-frontend-password.py
url = ${monitor-frontend:connection-secure_access}
config-url = ${:url}
config-username = ${monitor-instance-parameter:username}
366
config-password = ${monitor-instance-parameter:password}
367 368 369

# Requests to the frontend URL should fail when no credentials are
# supplied.
370
[monitor-frontend-promise]
371
<= monitor-promise-base
372
promise = check_url_available
373
name = monitor-http-frontend.py
374
url = ${monitor-frontend:connection-secure_access}
375
config-url = ${:url}
376
config-http-code = 401
377

378
[monitor-bootstrap-promise]
379
<= monitor-promise-base
380
promise = monitor_bootstrap_status
381
name = monitor-bootstrap-status.py
382 383
config-process-pid-file = ${monitor-conf-parameters:pid-file}
config-process-name = ${start-monitor:name}
384
config-status-file = ${monitor-conf-parameters:promise-output-file}
385

386
[promise-check-slapgrid]
387
<= monitor-promise-base
388
promise = check_partition_deployment_state
389
name = buildout-${slap-connection:partition-id}-status.py
390
config-monitor-url = ${monitor-instance-parameter:monitor-base-url}
391

392
[promise-check-free-disk-space]
393
<= monitor-promise-base
394
promise = check_free_disk_space
395
name = check-free-disk-space.py
396
config-collectordb = ${monitor-instance-parameter:collector-db}
397
config-threshold-file = ${directory:etc}/min-free-disk-size
398

399 400 401 402
[monitor-base]
# create dependencies between required monitor parts
recipe = plone.recipe.command
command = true
403
update-command =
404
base-url = ${monitor-conf-parameters:base-url}
405 406
depends =
  ${monitor-globalstate-cron-entry:name}
407
  ${monitor-globalstate-first-run:recipe}
408
  ${monitor-configurator-cron-entry:name}
409
  ${monitor-collect-cron-entry:name}
410
  ${cron-entry-logrotate:name}
411
  ${logrotate-entry-cron:name}
412
  ${certificate-authority-service:wrapper-path}
413
  ${start-monitor:wrapper-path}
414
  ${ca-monitor-httpd-service:wrapper-path}
415
  ${monitor-httpd-promise:name}
416
  ${monitor-frontend-promise:name}
417 418 419
# XXX this is not enabled yet because this conflicts with testnode's own
# monitoring.
#  ${check-monitor-password-promise:name}
420
  ${monitor-bootstrap-promise:name}
421 422
  ${monitor-symlink:recipe}
  ${promise-check-slapgrid:recipe}
423
  ${logrotate-entry-monitor-httpd:name}
424 425
  ${logrotate-entry-monitor-data:name}
  ${logrotate-entry-monitor-promise-history:name}
426

427
[monitor-publish]
428 429
monitor-base-url = ${monitor-publish-parameters:monitor-base-url}
monitor-setup-url = ${monitor-instance-parameter:interface-url}/#page=settings_configurator&url=${monitor-publish-parameters:monitor-url}&username=${monitor-publish-parameters:monitor-user}&password=${monitor-publish-parameters:monitor-password}
430 431 432 433


[buildout]

434
extends =
435
  {{ template_logrotate_base }}