{%- from "rsyslog/map.jinja" import global with context -%}

{% for modname in global.modules -%}
$ModLoad {{ modname }}
{% endfor -%}
{% if global.preserve_fqdn == true -%}
$PreserveFQDN on
{% else -%}
$PreserveFQDN off
{% endif -%}
{% if global.non_kernel_facility is defined and global.non_kernel_facility == true -%}
$KLogPermitNonKernelFacility on
{% endif -%}
{% if global.omit_local_logging is defined and global.omit_local_logging == true -%}
$OmitLocalLogging on
{% endif -%}
{% if global.msg_reduction == true -%}
$RepeatedMsgReduction on
{% endif -%}
{% if global.max_message_size is defined -%}
$MaxMessageSize {{ global.max_message_size }}
{% endif -%}
{% if global.system_log_rate_limit_interval is defined -%}
$SystemLogRateLimitInterval {{ global.system_log_rate_limit_interval }}
{% endif -%}
{% if global.system_log_rateLimit_burst is defined -%}
$SystemLogRateLimitBurst {{ global.system_log_rateLimit_burst }}
{% endif -%}
$DirCreateMode {{ global.perm_dir }}
$PrivDropToUser {{ global.run_user }}
$PrivDropToGroup {{ global.run_group }}
$WorkDirectory {{ global.spool_dir }}
$IncludeConfig {{ global.rsyslog_d }}/*.conf
{% if global.format is defined -%}
$template {{ global.format.name }},{{ global.format.template }}
$ActionFileDefaultTemplate {{ global.format.name }}
{% else -%}
$template RSYSLOG_TraditionalFileFormat
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
{% endif -%}

{% for name,config in global.output.file.iteritems() -%}
{% if config.owner is defined -%}
$FileOwner {{ config['owner'] }}
{% endif -%}
{% if config.group is defined -%}
$FileGroup {{ config['group'] }}
{% endif -%}
{% if config.createmode is defined -%}
$FileCreateMode {{ config['createmode'] }}
{% endif -%}
{% if config.umask is defined -%}
$Umask {{ config['umask'] }}
{% endif -%}
{{ config['filter'] }}     {% if config.sync == true %}-{% endif %}{{ name }}
{% endfor %}

{% if global.output.console is defined -%}
{% for name,config in global.output.console.iteritems() -%}
{{ config['filter'] }}      {{ config['action'] }}
{% endfor %}
{% endif -%}

{% if global.output.remote is defined -%}
{% for name,config in global.output.remote.iteritems() -%}
{{ config['filter'] }}      {{ config['action'] }}
{% endfor %}
{% endif %}
