Configuration Settings

Configuration can be done either by using a toml configuration file, environnement variable or secret files.

The configuration framework is based on the pydantic settings package which provides strong validation for configuration data.

Environment variables

The mapping of configuration values follows the following pattern:

  • Environment variable names are case-insensitive.

  • Environment variables must be prefixed with CONF_

  • Nested settings are separated by __ (double underscore)

  • List and dictionnaries are populated from environnement by treating the environnement variable’s value as JSON-encoded strinf.

Example:

Consider the following the toml configuration:

[logging]
level = "DEBUG"

[worker]
service_name = "MyService"
broker_host = "rabbitmq"
broker_backend = "redis:6370/0"

[processing]
workdir = "/qgis-workdir"

[processing.plugins]
paths = ["/qgis-plugins"]

[processing.projects.search_paths]
'/' = "/qgis-projects"

And the corresponding configuration with environment variables:

CONF_LOGGING__LEVEL=DEBUG
CONF_WORKER__SERVICE_NAME=MyService
CONF_WORKER__BROKER_HOST=rabbitmq
CONF_WORKER__BACKEND_HOST=redis:6379/0
CONF_PROCESSING__WORKDIR=/qgis-workdir
CONF_PROCESSING__PLUGINS__PATHS='["/qgis-plugins"]'
CONF_PROCESSING__PROJECTS__SEARCH_PATHS: '{"/":"/qgis-projects"}'

Secret files

Instead of using exposed environment variables or configuration files, values may be stored in files that contains a single value and where the name of the file is the configuration.

A common usecase is to allow for storing sensitive values in Docker encrypted secret files.

Configuration precedence

Configuration precedence is (by decreasing priority):

  • Configuration file

  • Environment variables

  • Secret files

  • Default values

Worker configuration

  1[logging]
  2level = "INFO"
  3
  4
  5# Worker configuration
  6#
  7# Configure celery worker settings
  8[worker]
  9#
 10# Celery amqp broker host
 11broker_host = "localhost"
 12broker_use_tls = false
 13#broker_user =   	# Optional
 14#broker_password =   	# Optional
 15#
 16# Celery redis backend host
 17backend_host = "localhost:6379/0"
 18backend_use_tls = false
 19#backend_password =   	# Optional
 20#
 21# Task hard time limit in seconds.
 22# The worker processing the task will be killed
 23# and replaced with a new one when this is exceeded.
 24# 
 25task_time_limit = 3600
 26#
 27# Grace period to add to the 'task_time_limit' value.
 28# The SoftTimeLimitExceeded exception will be raised
 29# when the 'task_time_limit' is exceeded.
 30# 
 31task_time_grace_period = 60
 32#
 33# Time (in seconds), for when after stored task tombstones will
 34# be deleted
 35# 
 36result_expires = 86400
 37#
 38# Concurrency
 39#
 40# The number of concurrent worker processes executing tasks.
 41#concurrency =   	# Optional
 42#
 43# Autoscale
 44#
 45# Activate concurrency autoscaling
 46#max_concurrency =   	# Optional
 47#
 48# Processes life cycle
 49#
 50# Maximum number of tasks a pool worker process can execute
 51# before it's replaced with a new one. Default is no limit.
 52# 
 53#max_tasks_per_child =   	# Optional
 54#
 55# Maximum consumed memory
 56#
 57# Maximum amount of resident memory, in kilobytes,
 58# that may be consumed by a worker before it will
 59# be replaced by a new worker.
 60# 
 61#max_memory_per_child =   	# Optional
 62#
 63# Name of the service
 64#
 65# Name used as location service name
 66# for initializing Celery worker.
 67# 
 68#service_name =   	# Required
 69#
 70# Service short title
 71title = ""
 72#
 73# Service description
 74description = ""
 75#
 76# Cleanup interval
 77#
 78# Interval is seconds between two cleanup of expired jobs.
 79# The minimun is 300s (5mn).
 80# 
 81cleanup_interval = 3600
 82#
 83# Reload watch file
 84#
 85# The file to watch for reloading processing plugins.
 86# When the the modified time of the file is changed, processing
 87# providers are reloaded.
 88# The restart is graceful, all running jobs are terminated normally.
 89# 
 90#reload_monitor =   	# Optional
 91#
 92# Hide presence versions
 93#
 94# Hide version details in presence.
 95# This may be useful when you do not want to
 96# display versions of libraries and OS for security
 97# reasons.
 98# 
 99hide_presence_versions = false
100
101#
102#[worker.broker_tls]
103#
104# CA file
105#cafile =   	# Optional
106#
107# TLS  certificat
108#
109# Path to the TLS cert file
110#certfile =   	# Optional
111#
112# TLS key file
113#
114# Path to the TLS key file
115#keyfile =   	# Optional
116
117#
118#[worker.backend_tls]
119#
120# CA file
121#cafile =   	# Optional
122#
123# TLS  certificat
124#
125# Path to the TLS cert file
126#certfile =   	# Optional
127#
128# TLS key file
129#
130# Path to the TLS key file
131#keyfile =   	# Optional
132
133#
134# Message signing configuration
135#[worker.security]
136#cert_store =   	# Required
137#keyfile =   	# Required
138#certfile =   	# Required
139
140#
141# Scheduler configuration
142[worker.scheduler]
143#
144# Enable scheduler
145#
146# Enable embedded scheduler.
147# Prefer scheduler as a service if more
148# than one worker node is used.
149# 
150enabled = false
151#
152# Max interval
153#
154# Max seconds to sleep between schedule iterations.
155#max_interval =   	# Optional
156#
157# Scheduler database path
158#
159# Path to the schedule database.
160# Defaults to `celerybeat-schedule` (from Celery doc).
161# 
162#database =   	# Optional
163
164#
165# Service related links
166#
167[[worker.links]]
168#rel =   	# Optional
169#mimeType =   	# Optional
170title = ""
171#description =   	# Optional
172#length =   	# Optional
173templated = false
174#hreflang =   	# Optional
175#href =   	# Required
176
177
178# Configure storage for processing data
179[storage]
180#
181# Storage module
182#
183# The module implementing storage accesses for
184# job's files.
185# 
186storage_class = "qjazz_processes.worker.storages.local.LocalStorage"
187config = {}
188
189
190#
191# Callbacks
192#
193# Define a mapping between a uri scheme and a handler for that
194# scheme.
195# 
196#
197# Example:
198#
199# [callbacks.https]
200# handler = "qjazz_processes.callbacks.Http",
201# 
202[callbacks.'key']
203#
204# Enable callback
205enabled = true
206#
207# Callback module
208#
209# The callback handler import string
210#handler =   	# Required
211#
212# Callback configuration
213config = {}
214
215
216[processing]
217#
218# Working directory
219#
220# Parent working directory where processes are executed.
221# Each processes will create a working directory for storing
222# result files and logs.
223# 
224#workdir =   	# Required
225#
226# Exposed internal providers
227#
228# List of exposed QGIS internal processing providers.
229# Providers registered by plugins are always exposed; this
230# list sets which QGIS internal providers are exposed in
231# addition, if they are loaded.
232# The 'grass' and 'otb' providers loaded with the plugins
233# 'extra_builtin_providers' option must be listed here
234# for being exposed.
235# NOTE: It is not recommended exposing the 'native' provider,
236# instead provide your own wrapping algorithm, script or model.
237# The 'qgis' provider is not supported.
238# 
239exposed_providers = ["script", "model"]
240#
241# Expose deprecated algorithms
242#
243# Expose algorithm wich have the `Deprecated`
244# flag set.
245# 
246expose_deprecated_algorithms = true
247#
248# Default vector file extension
249#
250# Define the default vector file extensions for vector destination
251# parameters. If not specified, then the QGIS default value is used.
252# 
253default_vector_file_format = "fgb"
254#
255# Default raster file extension
256#
257# Define the default raster file extensions for raster destination
258# parameters. If not specified, then the QGIS default value is used.
259# 
260#default_raster_file_ext =   	# Optional
261#
262# Force ellipsoid imposed by the source project
263#
264# Force the ellipsoid from the src project into the destination project.
265# This only apply if the src project has a valid CRS.
266# 
267adjust_ellipsoid = false
268#
269# Set default CRS
270#
271# Set the CRS to use when no source map is specified.
272# For more details on supported formats see the GDAL method
273# 'GdalSpatialReference::SetFromUserInput()'
274# 
275default_crs = "urn:ogc:def:crs:OGC:1.3:CRS84"
276#
277# Advertised services urls
278#
279# Url template used for OGC services references.
280advertised_services_url = "ows:$jobId/$name"
281#
282# Public download url
283#
284# Url template for downloading resources.
285# This is the public base url that will be seen in
286# referenced responses.
287# This url will need to be translated by the front end
288# executor to an effective download url.
289# 
290store_url = "${public_url}/jobs/$jobId/files/$resource"
291#
292# Use destination input as sink
293#
294# Allow input value as sink for destination layers.
295# This allow value passed as input value to be interpreted as
296# path or uri sink definition. This enable passing any string
297# that QGIS may use a input source but without open options except for the
298# 'layername=<name>' option.
299# 
300# NOTE: Running concurrent jobs with this option may result in unpredictable
301# behavior.
302# 
303# For that reason it is considered as an UNSAFE OPTION and you should never enable
304# this option if you are exposing the service publicly.
305# 
306# File path inputs prefixed with '/' will correspond to path located in the root
307# directory specified by the `raw_destination_root_path` option.
308# Otherwise, they will be stored in the job folder.
309# 
310raw_destination_input_sink = false
311#
312# Raw destination root path
313#
314# Specify the root directory for storing destination layers files when
315# the `raw_destination_input_sink` option is enabled.
316# If not specified, files will be stored in the job folder.
317# 
318#raw_destination_root_path =   	# Optional
319#
320# Project cache size
321#
322# The maximum number of projects in cache by process.
323max_cached_projects = 10
324#
325# Qgis settings
326#
327# Qgis settings override.
328# Use the syntax '<section>/<path>' for keys.
329# Not that values defined here will override those
330# from QGIS3.ini file."
331# 
332qgis_settings = {}
333#
334# Download timeout
335#
336# Download timeout is seconds for reference values
337download_timeout = 20.0
338
339#
340# Projects configuration
341#
342# Projects and cache configuration
343#
344[processing.projects]
345#
346# Trust layer metadata
347#
348# Trust layer metadata.
349# Improves layer load time by skipping expensive checks
350# like primary key unicity, geometry type and
351# srid and by using estimated metadata on layer load.
352# Since QGIS 3.16
353# 
354trust_layer_metadata = false
355#
356# Disable GetPrint requests
357#
358# Don't load print layouts.
359# Improves project read time if layouts are not required,
360# and allows projects to be safely read in background threads
361# (since print layouts are not thread safe).
362# 
363disable_getprint = false
364#
365# Force read only mode
366#
367# Force layers to open in read only mode."
368# This is the default, unless you have really good reason
369# to open layers in write mode.
370# Note that some handlers (like S3) do not support opening layers
371# in write mode.
372# 
373force_readonly_layers = true
374#
375# Ignore bad layers
376#
377# Allow projects to be loaded with event if it contains
378# layers that cannot be loaded.
379# Note that the 'dont_resolve_layers flag' trigger automatically
380# this option.
381# 
382ignore_bad_layers = false
383#
384# Disable OWS advertised urls
385#
386# Disable ows urls defined in projects.
387# This may be necessary because Qgis projects
388# urls override proxy urls.
389disable_advertised_urls = false
390#
391# Scheme mapping definitions
392#
393# Defines mapping betweeen location base path and storage handler root url.
394# Resource path relative to location will be joined the the root url path.
395# In the case of Qgis storage, the handler is responsible for transforming
396# the result url into a comprehensive format for the corresponding
397# QgsProjectStorage implementation.
398# This is handled by the default storage implementation for Qgis native
399# project storage.
400# In case of custom QgsProjectStorage, if the scheme does not allow passing
401# project as path component, it is possible to specify a custom resolver function.
402# 
403search_paths = {}
404#
405# Allow direct path resolution
406#
407# Allow direct path resolution if there is
408# no matching from the search paths.
409# Uri are directly interpreted as valid Qgis project's path.
410# WARNING: allowing this may be a security vulnerabilty."
411# 
412allow_direct_path_resolution = false
413
414#
415# Project storage Handler configurations
416#
417# Configure storage handlers.
418# The name will be used as scheme for project's search path
419# configuration.
420# 
421#
422# Example:
423#
424# [projects.search_paths]
425# "/public/location1/" = "postgres1://?dbname=mydatabase1"
426# "/public/location2/" = "postgres1://?dbname=mydatabase2"
427# 
428# [projects.handlers.postgres1]
429# handler_class = qjazz_cache.handlers.postgresql.PostgresHandler
430# 
431# [projects.handlers.postgres1.config]
432# uri = "postgresql://user@host/?schema=myschema"
433# 
434#
435[processing.projects.handlers.'key']
436#handler =   	# Required
437config = {}
438
439#
440# Plugin configuration
441#
442[processing.plugins]
443#
444# Plugin paths
445#
446# The list of search paths for plugins.
447# Qgis plugins found will be loaded according to
448# the 'install' list.
449# If the list is empty, the 'QGIS_PLUGINPATH'
450# variable will be checked.
451paths = []
452#
453# Installable plugins
454#
455# The list of installable plugins.
456# Note: if the plugin directory contains other plugins
457# plugins not in the list will NOT be loaded !
458# The Plugins will be installed at startup
459# if the 'install_mode' is set to 'auto'.
460# Note that an empty list means what it is:
461# i.e, *no* installed plugins.
462#install =   	# Optional
463#
464# Plugin installation mode
465#
466# If set to 'auto', plugins installation
467# will be checked at startup. Otherwise,
468# Installation will be done from already available
469# plugins.
470install_mode = "external"
471#
472# Plugins repository
473#
474# Url plugin repository for downloading plugins
475plugins_repository = "https://qgis-plugins.3liz.org/"
476#
477# Repository type
478#
479# Type of repository api
480# - rest: use a yapt rest api
481# - qgis-xml: use a xml qgis-compatible index
482plugins_repository_type = "rest"
483#
484# Extra builtins providers
485#
486# Load extra builtin processing providers
487# such as 'grass' and 'otb'.
488extra_builtin_providers = []
489
490#
491# TLS Certificates
492#
493# TLS credentials to use for references inputs
494#
495[processing.certificats]
496#
497# CA file
498#cafile =   	# Optional
499#
500# TLS  certificat
501#
502# Path to the TLS cert file
503#certfile =   	# Optional
504#
505# TLS key file
506#
507# Path to the TLS key file
508#keyfile =   	# Optional
509
510#
511# Qgis network
512#
513[processing.network]
514#
515# Transfer timeout in ms
516#
517# Transfers are aborted if no bytes are transferred before
518# the timeout expires.
519# If set to 0, the timeout is disobled.
520# Default value is set to 10000 milliseconds.
521# 
522transfer_timeout = 10000
523#
524# Trace network activity
525trace = false
526#
527# Global cache policy
528#
529# Set a global cache policy for all requests"
530# If set, this will override requests cache policy".
531# 
532#cache_policy =   	# Optional
533
534#
535# Domain policies
536#
537# Set per domain policy
538#
539[processing.network.domain_policy.'key']
540#
541# Cache load control
542#
543# Override QNetworkRequest::CacheLoadControl for request.
544#cache_policy =   	# Optional
545#
546# Transfer timeout in ms
547#transfer_timeout =   	# Optional

Server configuration

  1[logging]
  2level = "INFO"
  3
  4
  5# OAPI configuration
  6[oapi]
  7title = "Qjazz-Processes"
  8description = "Publish Qgis processing algorithms as OGC api processes"
  9
 10
 11# Defining job realm allow filtering job's requests by a token that is
 12# set by the client when requesting task execution (see description below).
 13[job_realm]
 14#
 15# Enable job realm header
 16#
 17# When enabled, use the 'X-Job-Realm' http header
 18# as a client identification token for retrieving jobs status and results.
 19# 
 20enabled = false
 21#
 22# Admininistrator realm jobs tokens
 23#
 24# Define catch all tokens for listing and retrieve status and results
 25# for all jobs.
 26# 
 27admin_tokens = []
 28
 29
 30# Configure access policy
 31[access_policy]
 32#
 33# Access policy module
 34#
 35# The module implementing the access policy for
 36# processes execution.
 37# 
 38policy_class = "qjazz_processes.server.policies.default.DefaultAccessPolicy"
 39config = {}
 40
 41
 42[http]
 43#
 44# Interfaces to listen to
 45listen = ["127.0.0.1", 9180]
 46#
 47# Use tls
 48use_tls = false
 49#
 50# CORS origin
 51#
 52# Allows to specify origin for CORS. If set 'all' will set
 53# Access-Control-Allow-Origin to '*'; 'same-origin' return
 54# the same value as the 'Origin' request header.
 55# A url may may be specified, restricting allowed origin to
 56# this url.
 57# 
 58cross_origin = "all"
 59#
 60# Service update interval
 61#
 62# Interval in seconds between update of available services
 63update_interval = 30
 64#
 65# Backend request timeout
 66timeout = 20
 67
 68#
 69# TLS configuration
 70#
 71[http.tls]
 72#
 73# CA file
 74#cafile =   	# Optional
 75#
 76# TLS  certificat
 77#
 78# Path to the TLS cert file
 79#certfile =   	# Optional
 80#
 81# TLS key file
 82#
 83# Path to the TLS key file
 84#keyfile =   	# Optional
 85
 86#
 87# Forwarded Configuration
 88[http.proxy]
 89#
 90# Enabled Forwarded headers
 91#
 92# Enable proxy headers resolution.
 93# Include support for 'Forwarded' headers
 94# and 'X-Forwarded' headers if allow_x_headers is
 95# enabled."
 96# 
 97enable = false
 98#
 99# Support for 'X-Forwarded' headers
100allow_x_headers = false
101
102
103[executor]
104#
105# Message expiration timeout
106#
107# The amount of time an execution message
108# can wait on queue before beeing processed
109# with asynchronous response.
110# 
111message_expiration_timeout = 600
112
113#
114# Celery configuration
115[executor.celery]
116#
117# Celery amqp broker host
118broker_host = "localhost"
119broker_use_tls = false
120#broker_user =   	# Optional
121#broker_password =   	# Optional
122#
123# Celery redis backend host
124backend_host = "localhost:6379/0"
125backend_use_tls = false
126#backend_password =   	# Optional
127#
128# Task hard time limit in seconds.
129# The worker processing the task will be killed
130# and replaced with a new one when this is exceeded.
131# 
132task_time_limit = 3600
133#
134# Grace period to add to the 'task_time_limit' value.
135# The SoftTimeLimitExceeded exception will be raised
136# when the 'task_time_limit' is exceeded.
137# 
138task_time_grace_period = 60
139#
140# Time (in seconds), for when after stored task tombstones will
141# be deleted
142# 
143result_expires = 86400
144#
145# Concurrency
146#
147# The number of concurrent worker processes executing tasks.
148#concurrency =   	# Optional
149#
150# Autoscale
151#
152# Activate concurrency autoscaling
153#max_concurrency =   	# Optional
154#
155# Processes life cycle
156#
157# Maximum number of tasks a pool worker process can execute
158# before it's replaced with a new one. Default is no limit.
159# 
160#max_tasks_per_child =   	# Optional
161#
162# Maximum consumed memory
163#
164# Maximum amount of resident memory, in kilobytes,
165# that may be consumed by a worker before it will
166# be replaced by a new worker.
167# 
168#max_memory_per_child =   	# Optional
169
170#
171#[executor.celery.broker_tls]
172#
173# CA file
174#cafile =   	# Optional
175#
176# TLS  certificat
177#
178# Path to the TLS cert file
179#certfile =   	# Optional
180#
181# TLS key file
182#
183# Path to the TLS key file
184#keyfile =   	# Optional
185
186#
187#[executor.celery.backend_tls]
188#
189# CA file
190#cafile =   	# Optional
191#
192# TLS  certificat
193#
194# Path to the TLS cert file
195#certfile =   	# Optional
196#
197# TLS key file
198#
199# Path to the TLS key file
200#keyfile =   	# Optional
201
202#
203# Message signing configuration
204#[executor.celery.security]
205#cert_store =   	# Required
206#keyfile =   	# Required
207#certfile =   	# Required
208
209#
210# Scheduler configuration
211[executor.celery.scheduler]
212#
213# Enable scheduler
214#
215# Enable embedded scheduler.
216# Prefer scheduler as a service if more
217# than one worker node is used.
218# 
219enabled = false
220#
221# Max interval
222#
223# Max seconds to sleep between schedule iterations.
224#max_interval =   	# Optional
225#
226# Scheduler database path
227#
228# Path to the schedule database.
229# Defaults to `celerybeat-schedule` (from Celery doc).
230# 
231#database =   	# Optional
232
233
234# The storage configuration is used for configuring the
235# connections to storage backends used by workers.
236[storage]
237#
238# Allow insecure downloads
239#
240# If set to false, only TLS encrypted downloads are allowed
241allow_insecure_connection = true
242#
243# Download chunksize
244chunksize = 65536
245#
246# Download url expiration
247#
248# Download url expiration in seconds
249download_url_expiration = 3600
250
251#
252# TLS certifificats
253#
254# Certificats required for TLS downloads connections
255#
256[storage.tls]
257#
258# CA file
259#cafile =   	# Optional
260#
261# TLS  certificat
262#
263# Path to the TLS cert file
264#certfile =   	# Optional
265#
266# TLS key file
267#
268# Path to the TLS key file
269#keyfile =   	# Optional
270
271
272#[store]
273#
274# S3/Minio endpoint
275#endpoint = "localhost:9000"
276#cafile =   	# Optional
277#access_key =   	# Required
278#secret_key =   	# Required
279#
280# Enable TLS
281#enable_tls = false
282#
283# Check certificat
284#check_certificat = true
285#region =   	# Optional
286#
287# Access TTL
288#
289# Lifetime in seconds given to a job store access since the job
290# was scheduled for execution; the access credentials will no be
291# longer valid after this time.
292# The minimum lifetime is 900s, and the store backend may cap
293# the lifetime (e.g. 12h for RustFS and AWS).
294# 
295#access_ttl = 43200

Callbacks

Callbacks requirements are specified by OGC standards.

It allows to set up a push based mechanism for processes results to others services.

Originally, only http POST requests are considered but Qjazz processes support arbitrary uri schemes.

Callbacks handlers are declared in worker configuration under the [callbacks."<scheme,...>"] section along with their configuration and the import string to the class implementing the callback support.

Qjazz implement natively ‘http’ and ‘mailto’ scheme callbacks.

HTTP Callback configuration

 1[callbacks]
 2
 3#
 4[callbacks.https]
 5#
 6# Enable callback
 7enabled = true
 8handler = "qjazz_processes.callbacks.Http"
 9
10#
11[callbacks.https.config]
12#
13# Path to CA file
14#ca_cert =   	# Optional
15#
16# User agent
17user_agent = "Qjazz processes v0.10.1"
18#
19# Request timeout
20#
21# The request timeout value for both connect and read timeout.
22# 
23timeout = 5
24
25#
26# Access control configuration
27[callbacks.https.config.acl]
28#
29# Authorization order
30#
31# Set the order of evaluation of allow and deny directives:
32# - Allow: allow by default  except thoses in deny then
33#   put back those in deny with the allow directive.
34# - Deny: deny by default  except thoses in allow then deny
35#   those in allow with the deny directive.
36# 
37order = "Allow"
38#
39# Allowed addresses
40#
41# List of allowed hosts. An host may be a IP addresse at IP range
42# in CIDR format or a FQDN or FQDN suffix starting with a dot (and
43# an optional '*').
44# 
45#
46# Example:
47#
48# allow = [
49#     "foo.bar.com",
50#     "*.mydomain.com",
51#     "192.168.0.0/24",
52#     "192.168.1.2",
53# ]
54# 
55allow = []
56#
57# Forbidden addresses
58#
59# List of forbidden hosts in the same format as for 'allow' list.
60deny = []

Note

For serving both http and https use [callbacks."http,https"].

MailTo Callback configuration

Allow sending e-mail with callbacks.

  1[callbacks]
  2
  3#
  4[callbacks.mailto]
  5#
  6# Enable callback
  7enabled = true
  8handler = "qjazz_processes.callbacks.MailTo"
  9
 10#
 11# Mail callback configuration
 12#
 13# Callback handler for sending mails,
 14# The callback uri must conform to RFC 2368 (https://www.rfc-editor.org/rfc/rfc2368)
 15# body and subject may contains template variables:
 16#
 17# $service: name of the service
 18# $process: name of the process
 19# $jobid: id of the job
 20# $tag: Tag associated with the job
 21[callbacks.mailto.config]
 22#
 23# SMTP host
 24#smtp_host =   	# Required
 25#
 26# SMTP port
 27smtp_port = 587
 28#
 29# SMTP login
 30#smtp_login =   	# Optional
 31#
 32# SMTP password
 33smtp_password = ""
 34#
 35# TLS/SSL
 36smtp_tls = false
 37#
 38# From address
 39#mail_from =   	# Required
 40#
 41# Format
 42#
 43# The format of the e-mail body
 44body_format = "plain"
 45#
 46# Attach results
 47#
 48# Send job results as attachment
 49send_results_as_attachment = false
 50#
 51# Request timeout
 52#
 53# The request timeout value in seconds
 54timeout = 5
 55#
 56# Debug mode
 57debug = false
 58
 59#
 60# Subject and body to set on success notification
 61# If a subject is provided then it will override the configuration value.
 62# 
 63#
 64[callbacks.mailto.config.content_success]
 65subject = "[Qjazz:$service] Job $process successfull"
 66body = '''
 67The job $jobid ($process) has been executed with success.
 68'''
 69
 70#
 71# Subject and body to set on failed notification.
 72# If a subject is provided then it will override the configuration value.
 73# 
 74#
 75[callbacks.mailto.config.content_failed]
 76subject = "[QJazz:$service] Job $process failed"
 77body = '''
 78The job $jobid ($process) has failed.
 79'''
 80
 81#
 82# Subject and body to set on inProgresss notification.
 83# If a subject is provided then it will override the configuration value.
 84# 
 85#
 86[callbacks.mailto.config.content_in_progress]
 87subject = "[QJazz:$service] Job $process started"
 88body = '''
 89The job $jobid ($process) has started.
 90'''
 91
 92#
 93# Access control configuration
 94[callbacks.mailto.config.acl]
 95#
 96# Authorization order
 97#
 98# Set the order of evaluation of allow and deny directives:
 99# - Allow: allow by default  except thoses in deny then
100#   put back those in deny with the allow directive.
101# - Deny: deny by default  except thoses in allow then deny
102#   those in allow with the deny directive.
103# 
104order = "Allow"
105#
106# Allowed addresses
107#
108# List of allowed hosts. An host may be a IP addresse at IP range
109# in CIDR format or a FQDN or FQDN suffix starting with a dot (and
110# an optional '*').
111# 
112#
113# Example:
114#
115# allow = [
116#     "foo.bar.com",
117#     "*.mydomain.com",
118#     "192.168.0.0/24",
119#     "192.168.1.2",
120# ]
121# 
122allow = []
123#
124# Forbidden addresses
125#
126# List of forbidden hosts in the same format as for 'allow' list.
127deny = []