# {{ ansible_managed }}

{# Domain, table, chain #}
{# ==================== #}
{% set ferm__tpl_domain = ferm__domains %}
{% set ferm__tpl_table = [ 'filter' ] %}
{% set ferm__tpl_chain = [ 'INPUT' ] %}
{% if item.domain|d() %}
{%   if item.domain is string %}
{%     set ferm__tpl_domain = [ item.domain ] %}
{%   else %}
{%     set ferm__tpl_domain = item.domain | unique %}
{%   endif %}
{% elif item.domains|d() %}
{%   if item.domains is string %}
{%     set ferm__tpl_domain = [ item.domains ] %}
{%   else %}
{%     set ferm__tpl_domain = item.domains | unique %}
{%   endif %}
{% endif %}
{% if item.table|d() %}
{%   if item.table is string %}
{%     set ferm__tpl_table = [ item.table ] %}
{%   else %}
{%     set ferm__tpl_table = item.table | unique %}
{%   endif %}
{% elif item.tables|d() %}
{%   if item.tables is string %}
{%     set ferm__tpl_table = [ item.tables ] %}
{%   else %}
{%     set ferm__tpl_table = item.tables | unique %}
{%   endif %}
{% endif %}
{% if item.chain|d() %}
{%   if item.chain is string %}
{%     set ferm__tpl_chain = [ item.chain ] %}
{%   else %}
{%     set ferm__tpl_chain = item.chain | unique %}
{%   endif %}
{% elif item.chains|d() %}
{%   if item.chains is string %}
{%     set ferm__tpl_chain = [ item.chains ] %}
{%   else %}
{%     set ferm__tpl_chain = item.chains | unique %}
{%   endif %}
{% endif %}
{% set ferm__tpl_domain_args = [] %}
{% if ferm__tpl_domain %}
{%   if ferm__tpl_domain | length == 1 %}
{%     set _ = ferm__tpl_domain_args.append("domain " +  ferm__tpl_domain | join(" ")) %}
{%   else %}
{%     set _ = ferm__tpl_domain_args.append("domain (" + ferm__tpl_domain | join(" ") + ")") %}
{%   endif %}
{% endif %}
{% if ferm__tpl_table %}
{%   if ferm__tpl_table | length == 1 %}
{%     set _ = ferm__tpl_domain_args.append("table " +  ferm__tpl_table | join(" ")) %}
{%   else %}
{%     set _ = ferm__tpl_domain_args.append("table (" + ferm__tpl_table | join(" ") + ")") %}
{%   endif %}
{% endif %}
{% if ferm__tpl_chain %}
{%   if ferm__tpl_chain | length == 1 %}
{%     set _ = ferm__tpl_domain_args.append("chain " +  ferm__tpl_chain | join(" ")) %}
{%   else %}
{%     set _ = ferm__tpl_domain_args.append("chain (" + ferm__tpl_chain | join(" ") + ")") %}
{%   endif %}
{% endif %}
{# Rule arguments #}
{# ============== #}
{% set ferm__tpl_recent_target = 'NOP' %}
{% set ferm__tpl_reject_with = 'icmp-admin-prohibited' %}
{% set ferm__tpl_protocol = [] %}
{% set ferm__tpl_protocol_syn = [] %}
{% set ferm__tpl_dport = [] %}
{% set ferm__tpl_state = [] %}
{% set ferm__tpl_subchain = item.type + "-" + item.name %}
{% set ferm__tpl_recent_name = '' %}
{% set ferm__tpl_recent_set_name = '' %}
{% set ferm__tpl_recent_update = False %}
{% set ferm__tpl_recent_remove = False %}
{% set ferm__tpl_recent_seconds = '' %}
{% set ferm__tpl_recent_hitcount = '' %}
{% if item.protocol|d() %}
{%   if item.protocol is string %}
{%     set ferm__tpl_protocol = [ item.protocol ] %}
{%   else %}
{%     set ferm__tpl_protocol = item.protocol | unique %}
{%   endif %}
{% elif item.protocols|d() %}
{%   if item.protocols is string %}
{%     set ferm__tpl_protocol = [ item.protocols ] %}
{%   else %}
{%     set ferm__tpl_protocol = item.protocols | unique %}
{%   endif %}
{% endif %}
{% if item.protocol_syn is defined %}
{%   if item.protocol_syn | bool %}
{%     set ferm__tpl_protocol_syn = [ 'syn' ] %}
{%   elif not item.protocol_syn | bool %}
{%     set ferm__tpl_protocol_syn = [ '! syn' ] %}
{%   endif %}
{% endif %}
{% if item.dport|d() %}
{%   if item.dport is string %}
{%     set ferm__tpl_dport = [ item.dport ] %}
{%   else %}
{%     set ferm__tpl_dport = item.dport | unique %}
{%   endif %}
{% endif %}
{% if item.state|d() %}
{%   if item.state is string %}
{%     set ferm__tpl_state = [ item.state ] %}
{%   else %}
{%     set ferm__tpl_state = item.state | unique %}
{%   endif %}
{% endif %}
{% if item.subchain is defined %}
{%   if item.subchain | bool %}
{%     set ferm__tpl_subchain = item.subchain %}
{%   else %}
{%     set ferm__tpl_subchain = '' %}
{%   endif %}
{% endif %}
{% if item.recent_name|d() %}
{%   set ferm__tpl_recent_name = item.recent_name %}
{% elif item.recent_set_name|d() %}
{%   set ferm__tpl_recent_set_name = item.recent_set_name %}
{% endif %}
{% if item.recent_update|d() and item.recent_update | bool %}
{%   set ferm__tpl_recent_update = True %}
{% endif %}
{% if item.recent_remove|d() and item.recent_remove | bool %}
{%   set ferm__tpl_recent_remove = True %}
{% endif %}
{% if item.recent_seconds|d() %}
{%   set ferm__tpl_recent_seconds = item.recent_seconds | string %}
{% endif %}
{% if item.recent_hitcount|d() %}
{%   set ferm__tpl_recent_hitcount = item.recent_hitcount | string %}
{% endif %}
{% if item.recent_target|d() %}
{%   set ferm__tpl_recent_target = item.recent_target %}
{% endif %}
{% if item.reject_with|d() %}
{%   set ferm__tpl_reject_with = item.reject_with %}
{% endif %}
{% set ferm__tpl_arguments = [] %}
{% if ferm__tpl_protocol %}
{%   if ferm__tpl_protocol | length == 1 %}
{%     set _ = ferm__tpl_arguments.append("protocol " +  ferm__tpl_protocol | join(" ")) %}
{%   else %}
{%     set _ = ferm__tpl_arguments.append("protocol (" + ferm__tpl_protocol | join(" ") + ")") %}
{%   endif %}
{% elif not ferm__tpl_protocol and ferm__tpl_dport %}
{%   set _ = ferm__tpl_arguments.append("protocol tcp") %}
{% endif %}
{% if ferm__tpl_protocol_syn %}
{%   set _ = ferm__tpl_arguments.append(ferm__tpl_protocol_syn | join(" ")) %}
{% endif %}
{% if ferm__tpl_dport %}
{%   if item.multiport|d() and item.multiport | bool %}
{%     if ferm__tpl_dport | length == 1 %}
{%       set _ = ferm__tpl_arguments.append("dport " +  ferm__tpl_dport | join(" ")) %}
{%     else %}
{%       set _ = ferm__tpl_arguments.append("mod multiport destination-ports (" + ferm__tpl_dport | join(" ") + ")") %}
{%     endif %}
{%   else %}
{%     if ferm__tpl_dport | length == 1 %}
{%       set _ = ferm__tpl_arguments.append("dport " +  ferm__tpl_dport | join(" ")) %}
{%     else %}
{%       set _ = ferm__tpl_arguments.append("dport (" + ferm__tpl_dport | join(" ") + ")") %}
{%     endif %}
{%   endif %}
{% endif %}
{% if ferm__tpl_state %}
{%   if ferm__tpl_state | length == 1 %}
{%     set _ = ferm__tpl_arguments.append("mod state state " +  ferm__tpl_state | join(" ")) %}
{%   else %}
{%     set _ = ferm__tpl_arguments.append("mod state state (" + ferm__tpl_state | join(" ") + ")") %}
{%   endif %}
{% endif %}
{% if ferm__tpl_arguments %}
{%   if ferm__tpl_subchain %}
{%     set _ = ferm__tpl_arguments.append('@subchain "' + ferm__tpl_subchain + '"') %}
{%   endif %}
{% endif %}
{% set ferm__tpl_recent_args = [] %}
{% if ferm__tpl_recent_name %}
{%   set _ = ferm__tpl_recent_args.append('name "' + ferm__tpl_recent_name + '"') %}
{% elif ferm__tpl_recent_set_name %}
{%   set _ = ferm__tpl_recent_args.append('set name "' + ferm__tpl_recent_set_name + '"') %}
{% endif %}
{% if ferm__tpl_recent_update | bool %}
{%   set _ = ferm__tpl_recent_args.append('update') %}
{% endif %}
{% if ferm__tpl_recent_remove | bool %}
{%   set _ = ferm__tpl_recent_args.append('remove') %}
{% endif %}
{% if ferm__tpl_recent_seconds %}
{%   set _ = ferm__tpl_recent_args.append('seconds ' + ferm__tpl_recent_seconds) %}
{% endif %}
{% if ferm__tpl_recent_hitcount %}
{%   set _ = ferm__tpl_recent_args.append('hitcount ' + ferm__tpl_recent_hitcount) %}
{% endif %}
{# Main template #}
{# ============= #}
{% if item.comment|d() %}
# {{ item.comment }}

{% endif %}
{% if item.when is undefined or item.when | bool %}
{%   if ferm__tpl_domain_args %}{{ ferm__tpl_domain_args | join(" ") }} {% endif %}{
    {% if ferm__tpl_arguments %}{{ ferm__tpl_arguments | join(" ") }} {% endif %}{

        mod recent {{ ferm__tpl_recent_args | join(" ") }} {
{%   if ((item.recent_log is undefined or item.recent_log | bool) and ferm__log | bool) %}

            &log("{{ item.recent_log_prefix | d('ipt-recent-' + item.recent_name | d(item.recent_set_name) + ': ') }}");
{%   endif %}
{%   if ferm__tpl_recent_target %}
{%     if ferm__tpl_recent_target not in [ 'ACCEPT', 'DROP', 'REJECT', 'RETURN', 'NOP' ] %}
{%       if item.include|d() %}

            @include "{{ item.include }}";
{%       elif item.realgoto is undefined or not item.realgoto | bool %}

            jump "{{ ferm__tpl_recent_target }}";
{%       elif item.realgoto|d() and item.realgoto | bool %}

            realgoto "{{ ferm__tpl_recent_target }}";
{%       endif %}
{%     elif ferm__tpl_recent_target in [ 'REJECT' ] %}

            REJECT reject-with {{ ferm__tpl_reject_with }};
{%     else %}

            {{ ferm__tpl_recent_target }};
{%     endif %}
{%   endif %}
        }
    }
}
{% else %}
# Rule disabled by 'item.when' condition
{% endif %}

