{#
 #  Самостоятельная обратная зона.
 #  PTR-записи задаются явно через ptr_records, не зависит от прямой зоны и networks.
 #
 #  Формат ptr_records:
 #    - name: '221'           # последний октет (или октеты для /16, например '0.201')
 #      ptr: host.domain.     # целевое FQDN (с точкой на конце или без)
 #}
{% set _zone_data = {
    'ttl':     named_zone_ttl,
    'domain':  item.name,
    'mname':   item.name_servers | default([]),
    'rname':   item.hostmaster_email | default('hostmaster.' + item.name),
    'refresh': named_zone_time_to_refresh,
    'retry':   named_zone_time_to_retry,
    'expire':  named_zone_time_to_expire,
    'minimum': named_zone_minimum_ttl,
    'records': item.ptr_records | default([])
} %}
{#
 #  Сравниваем хэш текущих данных зоны с сохранённым, чтобы обновлять serial
 #  только при реальных изменениях содержимого.
 #}
{% set _zone = {'hash': _zone_data | string | hash('md5')} %}
{% for _result in named_reverse_standalone_hashes | default([]) if _result.name == item.name %}
{%   set _hash_serial = _result.hash.split(' ')[2:] %}
{%   if _hash_serial and _hash_serial[0] == _zone['hash'] %}
{%     set _ = _zone.update({'serial': _hash_serial[1]}) %}
{%   else %}
{%     set _ = _zone.update({'serial': named_timestamp.stdout}) %}
{%   endif %}
{% endfor %}
{% if _zone.serial is not defined %}
{%   set _ = _zone.update({'serial': named_timestamp.stdout}) %}
{% endif %}
; Hash: {{ _zone['hash'] }} {{ _zone['serial'] }}
; Обратная зона {{ _zone_data['domain'] }}
{{ ansible_managed | comment(decoration='; ') }}

$TTL {{ _zone_data['ttl'] }}
$ORIGIN {{ _zone_data['domain'] }}.

{% if _zone_data['mname'] | length > 0 %}
@ IN SOA {{ _zone_data['mname'] | first }}{% if not _zone_data['mname'] | first | regex_search('\.$') %}.{% endif %} {{ _zone_data['rname'] }}{% if not _zone_data['rname'] | regex_search('\.$') %}.{% endif %} (
{% else %}
@ IN SOA {{ ansible_hostname }}. {{ _zone_data['rname'] }}{% if not _zone_data['rname'] | regex_search('\.$') %}.{% endif %} (
{% endif %}
  {{ _zone['serial'] }}
  {{ _zone_data['refresh'] }}
  {{ _zone_data['retry'] }}
  {{ _zone_data['expire'] }}
  {{ _zone_data['minimum'] }} )

{% for ns in _zone_data['mname'] %}
                       IN  NS   {{ ns }}{% if not ns | regex_search('\.$') %}.{% endif %}

{% endfor %}

{% for record in _zone_data['records'] -%}
{% if record.ptr is defined -%}
{{ record.name.ljust(16) }}       IN  PTR  {{ record.ptr }}{{ '.' if not record.ptr | regex_search('\.$') }}
{% elif record.cname is defined -%}
{{ record.name.ljust(16) }}       IN  CNAME {{ record.cname }}
{% elif record.dns is defined -%}
{{ record.name.ljust(16) }}       IN  NS {{ record.dns }}
{% endif -%}
{% endfor %}
