# dhcpd templates/dhcpd.conf.j2 - {{ ansible_managed }}
{#
SPDX-FileCopyrightText: © 2020 Open Networking Foundation <support@opennetworking.org>
SPDX-License-Identifier: Apache-2.0
#}

# global lease options
default-lease-time {{ subnet.lease_time | default("240") }};
max-lease-time {{ subnet.max_lease_time | default("480") }};

# option definitions
{% if ansible_system == "Linux" %}
option rfc3442-classless-static-routes code 121 = array of integer 8;
{% endif %}

{% for subnet in dhcpd_subnets %}
subnet {{ subnet.subnet | ipaddr('network') }} netmask {{ subnet.subnet | ipaddr('netmask') }} {

  # routing
{% if subnet.routers is defined %}
  # custom router IP set
  option routers {{ subnet.routers | map(attribute="ip") | join (",") }};
{% set r3442ns = namespace(r3442list = []) %}
{% for rtr in subnet.routers %}
{% if "rfc3442routes" in rtr %}
{% set r3442ns.r3442list = r3442ns.r3442list + (rtr | rfc3442_words() ) %}
{% endif %}
{% endfor %}
{% if r3442ns.r3442list %}
  option rfc3442-classless-static-routes {{ r3442ns.r3442list | join(', ') }};
{% endif %}
{% else %}
  # first IP address in range used as router
  option routers {{ subnet.subnet | ipaddr('next_usable') }};
{% endif %}

  # DNS/naming options
  option domain-name-servers {{ subnet.dns_servers | join(", ") }};
  option domain-name "{{ subnet.dns_search [0] }}";
  option domain-search "{{ subnet.dns_search | join('", "') }}";

{% if subnet.tftpd_server is defined %}
  # tftpd options
  filename "{{ subnet.pxe_filename | default(dhcpd_pxe_filename) }}";
  next-server {{ subnet.tftpd_server }};

{% endif %}
{% if subnet.ntp_servers is defined %}
  # ntp options
  option ntp-servers {{ subnet.ntp_servers | join('", "') }};

{% endif %}
{% if subnet.range is defined %}
  # dynamically assignable range
  range {{ subnet.range | ipaddr('next_usable') }} {{ subnet.range | ipaddr('last_usable') }};
{% endif %}
}

{% if subnet.hosts is defined %}
# hosts for subnet: {{ subnet.dns_search [0] }}
{% for host in subnet.hosts %}
host {{ host.name }}.{{ subnet.dns_search [0] }} {
  option host-name "{{ host.name }}";
  fixed-address {{ host.ip_addr }};
  hardware ethernet {{ host.mac_addr | hwaddr('linux') }};
{% if host.pxe_filename is defined %}
  filename "{{ host.pxe_filename }}";
{% endif %}
{% if host.default_url is defined %}
  option default-url "{{ host.default_url }}";
{% endif %}
}

{% endfor %}
{% endif %}

{% endfor %}
