instance-monitor.cfg.jinja2.in 14.4 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 23 24 25
[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
promises = ${:etc}/promise
monitor = ${:srv}/monitor
monitor-promise = ${:etc}/monitor-promise
26
monitor-report = ${:etc}/monitor-report
27 28 29 30 31 32 33

[monitor-directory]
recipe = slapos.cookbook:mkdirectory
bin = ${directory:bin}
etc = ${directory:etc}
run = ${directory:monitor}/run
#run = ${directory:scripts}
34
promises = ${directory:monitor-promise}
35
reports = ${directory:monitor-report}
36 37
pids = ${directory:run}/monitor
cgi-bin = ${directory:monitor}/cgi-bin
38
webdav = ${directory:monitor}/webdav
39 40 41 42 43
public = ${directory:monitor}/public
private = ${directory:monitor}/private
services = ${directory:services}
services-conf = ${directory:etc}/monitor.conf.d
log = ${directory:log}/monitor
44
monitor-var = ${directory:var}/monitor
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

[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}
wrapper = ${monitor-directory:services}/certificate_authority
ca-private = ${ca-directory:private}
ca-certs = ${ca-directory:certs}
ca-newcerts = ${ca-directory:newcerts}
ca-crl = ${ca-directory:crl}

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

[monitor-conf-parameters]
title = ${monitor-instance-parameter:monitor-title}
76
root-title = ${monitor-instance-parameter:root-instance-title}
77 78
public-folder = ${monitor-directory:public}
private-folder = ${monitor-directory:private}
79
webdav-folder = ${monitor-directory:webdav}
80
report-folder = ${monitor-directory:reports}
81
base-url = ${monitor-instance-parameter:monitor-base-url}
82
monitor-hal-json = ${monitor-directory:public}/monitor.hal.json
83 84
service-pid-folder = ${monitor-directory:pids}
crond-folder = ${logrotate-directory:cron-entries}
85
logrotate-folder = ${logrotate-directory:logrotate-entries}
86
promise-runner = {{ monitor_runpromise }}
87
promise-folder = ${directory:promises}
88
monitor-promise-folder = ${monitor-directory:promises}
89
promises-timeout-file = ${monitor-promise-timeout-file:file}
90
pid-file = ${monitor-directory:pids}/monitor-bootstrap.pid
Alain Takoudjou's avatar
Alain Takoudjou committed
91

92 93
public-path-list = 
private-path-list = 
94 95
    ${directory:log}
# 
96
monitor-url-list = 
97
  ${monitor-instance-parameter:monitor-url-list}
98 99 100 101 102

parameter-file-path = ${monitor-instance-parameter:configuration-file-path}

parameter-list = 
  raw monitor-user ${monitor-instance-parameter:username}
103
  htpasswd monitor-password ${httpd-monitor-htpasswd:password-file} ${monitor-instance-parameter:username} ${httpd-monitor-htpasswd:htpasswd-path}
104
  file promise-timeout ${monitor-promise-timeout-file:file}
105
  file min-free-disk-MB ${promise-check-free-disk-space:config-file}
106 107 108 109 110
  ${monitor-instance-parameter:instance-configuration}
# htpasswd entry:  htpasswd key password-file username htpasswd-file

collector-db = ${monitor-instance-parameter:collector-db}
collect-script = {{ monitor_collect }}
111
statistic-script = {{ monitor_statistic }}
112
python = {{ python_with_eggs }}
113
nice-cmd = ${xnice-bin:output}
114

115 116
promise-output-file = ${directory:monitor}/monitor-bootstrap-status

117
[monitor-promise-timeout-file]
118
recipe = plone.recipe.command
119
file = ${directory:etc}/promise_timeout
120 121 122 123 124
command = 
  if [ ! -s "${:file}" ]; then
    echo "20" > ${:file}
  fi

125 126 127
[monitor-base-url-dict]
# place holder to be used to collect erp5 monitor urls

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

136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
[instance-info-parameters]
name = ${monitor-instance-parameter:monitor-title}
root-name = ${monitor-instance-parameter:root-instance-title}
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}
partition-id = ${slap-connection:partition-id}

[monitor-instance-info]
recipe = slapos.recipe.template:jinja2
template = {{ monitor_instance_info }}
rendered = ${directory:etc}/${:filename}
filename = instance-info.conf
context = 
  section instance_dict instance-info-parameters

Alain Takoudjou's avatar
Alain Takoudjou committed
154 155 156
[python-symlink]
recipe = plone.recipe.command
target = ${directory:bin}
157
command = ln -sf {{ python_with_eggs }} ${:target}/python
Alain Takoudjou's avatar
Alain Takoudjou committed
158 159 160 161 162
update-command = ${:command}

[start-monitor]
recipe = slapos.cookbook:wrapper
command-line = {{ python_executable }} {{ monitor_bin }} --config_file ${monitor-conf:rendered}
163 164
name = bootstrap-monitor
wrapper-path = ${directory:scripts}/${:name}
Alain Takoudjou's avatar
Alain Takoudjou committed
165 166 167
environment = 
  PATH=${python-symlink:target}:/usr/local/bin:/usr/bin:/bin

168 169
[monitor-htpasswd]
recipe = slapos.cookbook:generate.password
170
storage-path = ${directory:etc}/.monitor_pwd
171 172
bytes = 8

173 174 175
[httpd-monitor-htpasswd]
recipe = plone.recipe.command
stop-on-error = true
176
password-file = ${directory:etc}/.monitor_pwd
177
htpasswd-path = ${monitor-directory:etc}/monitor-htpasswd
178 179 180 181 182
# Keep multiple lines as password can end with newline char.
command = 
  if [ ! -s "${:htpasswd-path}" ]; then 
    {{ apache_location }}/bin/htpasswd -cb ${:htpasswd-path} ${:user} ${:password}
  fi
183
  if [ ! -s "${:password-file}" ]; then echo "${monitor-instance-parameter:password}" > ${:password-file}; fi
184
update-command = ${:command}
185 186
user = ${monitor-instance-parameter:username}
password = ${monitor-instance-parameter:password}
187 188 189 190

[monitor-httpd-conf-parameter]
listening-ip = ${monitor-instance-parameter:monitor-httpd-ipv6}
port = ${monitor-instance-parameter:monitor-httpd-port}
191 192 193
pid-file = ${directory:run}/monitor-httpd.pid
access-log = ${monitor-directory:log}/monitor-httpd-access.log
error-log = ${monitor-directory:log}/monitor-httpd-error.log
194 195 196
cert-file = ${ca-directory:certs}/httpd.crt
key-file = ${ca-directory:certs}/httpd.key
htpasswd-file = ${httpd-monitor-htpasswd:htpasswd-path}
197 198 199
url = https://[${monitor-instance-parameter:monitor-httpd-ipv6}]:${:port}
httpd-cors-config-file = ${monitor-httpd-cors:rendered}
httpd-include-file = 
200 201 202 203 204 205 206 207 208 209

[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

210 211 212 213 214 215 216 217 218
[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]
219 220 221 222 223 224
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 =
  ${ca-directory:certs}/httpd.key
  ${ca-directory:certs}/httpd.crt
225
  ${monitor-httpd-graceful-wrapper:rendered}
226

227
[monitor-httpd-graceful-wrapper]
228 229
recipe = slapos.recipe.template:jinja2
template = {{ template_wrapper }}
230
rendered = ${directory:scripts}/monitor-httpd-graceful
231 232 233
mode = 0700
context =
    key content :command
234
    raw dash_binary {{ dash_executable_location }}
235 236
command = kill -USR1 $(cat ${monitor-httpd-conf-parameter:pid-file})

237 238 239 240 241 242 243 244
[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

245 246 247 248 249 250
[promise-monitor-httpd-is-process-older-than-dependency-set]
recipe = slapos.cookbook:wrapper
command-line = {{ bin_directory }}/is-process-older-than-dependency-set ${monitor-httpd-conf-parameter:pid-file} 
wrapper-path = ${directory:promises}/promise-monitor-httpd-is-process-older-than-dependency-set
parameters-extra = true

251 252
[monitor-globalstate-wrapper]
recipe = slapos.cookbook:wrapper
253
command-line = ${xnice-bin:output} {{ monitor_genstatus }} '${monitor-conf:rendered}' '${monitor-instance-info:rendered}'
254 255 256 257 258
wrapper-path = ${directory:bin}/monitor-globalstate

[monitor-configurator-wrapper]
recipe = slapos.cookbook:wrapper
# XXX - hard coded path
259
command-line = {{ 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 }}
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
wrapper-path = ${directory:bin}/monitor-configurator

[monitor-globalstate-cron-entry]
recipe = slapos.cookbook:cron.d
cron-entries = ${cron:cron-entries}
name = monitor-globalstate
frequency = * * * * *
command = ${monitor-globalstate-wrapper:wrapper-path}

[monitor-configurator-cron-entry]
recipe = slapos.cookbook:cron.d
cron-entries = ${cron:cron-entries}
name = monitor-configurator
frequency = * * * * *
command = ${monitor-configurator-wrapper:wrapper-path}

276 277 278 279 280 281 282 283 284
[monitor-httpd-promise]
recipe = slapos.cookbook:check_url_available
path = ${directory:promises}/${:filename}
filename = monitor-httpd-listening-on-tcp
url = ${monitor-httpd-conf-parameter:url}
check-secure = 1
dash_path = {{ dash_executable_location }}
curl_path = {{ curl_executable_location }}

285
[monitor-publish-parameters]
286 287
# XXX depends on monitor-base section
monitor-base-url = ${monitor-base:base-url}
288 289 290
monitor-url = ${:monitor-base-url}/public/feeds
monitor-user = ${monitor-instance-parameter:username}
monitor-password = ${monitor-instance-parameter:password}
291 292

[monitor-instance-parameter]
293 294 295
monitor-title = ${slap-configuration:instance-title}
monitor-httpd-ipv6 = ${slap-configuration:ipv6-random}
monitor-httpd-port = 8196
296 297
# XXX - Set monitor-base-url = ${monitor-httpd-conf-parameter:url} => https://[ipv6]:port
monitor-base-url = ${monitor-frontend-promise:url}
298
#monitor-base-url = ${monitor-httpd-conf-parameter:url}
299
root-instance-title = ${slap-configuration:root-instance-title}
300
monitor-url-list =
301
cors-domains = monitor.app.officejs.com
302 303 304 305
# XXX Hard coded parameter
collector-db = /srv/slapgrid/var/data-log/collector.db
# Credentials
password = ${monitor-htpasswd:passwd}
306
username = admin
307 308 309 310 311 312
# XXX: type key value
# ex raw monitor-password resqdsdsd34
instance-configuration =

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

313 314
interface-url = https://monitor.app.officejs.com

315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
[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

[monitor-frontend-promise]
recipe = slapos.cookbook:check_url_available
path = ${directory:promises}/monitor-http-frontend
url = ${monitor-frontend:connection-secure_access}
dash_path = {{ dash_executable_location }}
curl_path = {{ curl_executable_location }}
check-secure = 1

335
[monitor-bootstrap-promise]
336
recipe = collective.recipe.template
337
file = ${monitor-conf-parameters:promise-output-file}
338
error-log-file = ${buildout:directory}/.${slap-connection:partition-id}_${start-monitor:name}.log
339
input = inline:#!{{ dash_executable_location }}
340 341
  pidfile=${monitor-conf-parameters:pid-file}
  if [ -s $pidfile ]; then
342 343
    COUNTER=0
    # Wait until max 20 seconds, the limit promise timeout
344
    while [ $COUNTER -lt 40 ]; do
345 346
      if [ -n "$(ps -p $(cat $pidfile) -o pid=)" ]; then
        ((COUNTER=COUNTER+1))
347
        sleep 0.5
348 349
      else
        break
350 351 352
      fi
    done
  fi
353 354 355 356 357 358 359 360 361 362 363 364
  if [ ! -f "${:file}" ]; then
    echo "Monitor bootstrap exited with error."
    log_file="${:error-log-file}"
    if [ -s "$log_file" ]; then
      echo " ---- Latest monitor-boostrap.log ----"
      echo ""
      tail -n 3 $log_file
    fi
    exit 2
  else
    echo "Bootstrap OK";
  fi
365 366
output = ${directory:promises}/monitor-bootstrap-status
mode = 700
367

368 369 370 371 372 373 374 375 376 377 378
[promise-check-slapgrid]
recipe = collective.recipe.template
error-log-file = ${buildout:directory}/.slapgrid-${slap-connection:partition-id}-error.log
input = inline:#!/bin/sh
  if [ -f "${:error-log-file}" ]; then
    >&2 cat ${:error-log-file}
    exit 1
  fi
output = ${monitor-directory:promises}/buildout-${slap-connection:partition-id}-status
mode = 700

379 380 381 382 383 384 385 386 387 388 389 390
[promise-check-free-disk-space]
recipe = slapos.recipe.template:jinja2
template = {{ template_check_disk_space }}
rendered = ${monitor-directory:promises}/check-free-disk-space
mode = 0700
context =
    key config_file :config-file
    raw home_path ${buildout:directory}
    raw python_bin {{ python_with_eggs }}
config-file = ${directory:etc}/min-free-disk-size


391 392 393 394 395
[monitor-base]
# create dependencies between required monitor parts
recipe = plone.recipe.command
command = true
update-command = 
396
base-url = ${monitor-conf-parameters:base-url}
397 398 399 400
depends =
  ${monitor-globalstate-cron-entry:name}
  ${monitor-configurator-cron-entry:name}
  ${cron-entry-logrotate:name}
401
  ${logrotate-entry-cron:name}
402 403 404
  ${certificate-authority:wrapper}
  ${monitor-conf:rendered}
  ${start-monitor:wrapper-path}
405
  ${ca-monitor-httpd:wrapper}
406
  ${monitor-httpd-promise:filename}
407
  ${monitor-bootstrap-promise:file}
408
  ${promise-check-slapgrid:output}
409
  ${promise-monitor-httpd-is-process-older-than-dependency-set:wrapper-path}
410

411
[monitor-publish]
412 413
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}
414 415 416 417 418


[buildout]

extends = 
419
  {{ template_logrotate_base }}