diff options
Diffstat (limited to 'data/templates/dhcp-server/dhcpd.conf.j2')
-rw-r--r-- | data/templates/dhcp-server/dhcpd.conf.j2 | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/data/templates/dhcp-server/dhcpd.conf.j2 b/data/templates/dhcp-server/dhcpd.conf.j2 new file mode 100644 index 000000000..4c2da0aa5 --- /dev/null +++ b/data/templates/dhcp-server/dhcpd.conf.j2 @@ -0,0 +1,246 @@ +### Autogenerated by dhcp_server.py ### + +# For options please consult the following website: +# https://www.isc.org/wp-content/uploads/2017/08/dhcp43options.html +# +# log-facility local7; +{% if hostfile_update is vyos_defined %} +on release { + set ClientName = pick-first-value(host-decl-name, option fqdn.hostname, option host-name); + set ClientIp = binary-to-ascii(10, 8, ".",leased-address); + execute("/usr/libexec/vyos/system/on-dhcp-event.sh", "release", "", ClientIp, "", ""); +} +on expiry { + set ClientName = pick-first-value(host-decl-name, option fqdn.hostname, option host-name); + set ClientIp = binary-to-ascii(10, 8, ".",leased-address); + execute("/usr/libexec/vyos/system/on-dhcp-event.sh", "release", "", ClientIp, "", ""); +} +{% endif %} + +{{ 'use-host-decl-names on;' if host_decl_name is vyos_defined }} +ddns-update-style {{ 'interim' if dynamic_dns_update is vyos_defined else 'none' }}; +option rfc3442-static-route code 121 = array of integer 8; +option windows-static-route code 249 = array of integer 8; +option wpad-url code 252 = text; + +# Vendor specific options - Ubiquiti Networks +option space ubnt; +option ubnt.unifi-controller code 1 = ip-address; +class "ubnt" { + match if substring (option vendor-class-identifier , 0, 4) = "ubnt"; + option vendor-class-identifier "ubnt"; + vendor-option-space ubnt; +} + +{% if global_parameters is vyos_defined %} +# The following {{ global_parameters | length }} line(s) have been added as +# global-parameters in the CLI and have not been validated !!! +{% for parameter in global_parameters %} +{{ parameter }} +{% endfor %} + +{% endif %} +{% if failover is vyos_defined %} +# DHCP failover configuration +failover peer "{{ failover.name }}" { +{% if failover.status == 'primary' %} + primary; + mclt 1800; + split 128; +{% elif failover.status == 'secondary' %} + secondary; +{% endif %} + address {{ failover.source_address }}; + port 647; + peer address {{ failover.remote }}; + peer port 647; + max-response-delay 30; + max-unacked-updates 10; + load balance max seconds 3; +} +{% endif %} +{% if listen_address is vyos_defined %} + +# DHCP server serving relay subnet, we need a connector to the real world +{% for address in listen_address %} +# Connected subnet statement for listen-address {{ address }} +subnet {{ address | network_from_ipv4 }} netmask {{ address | netmask_from_ipv4 }} { } +{% endfor %} +{% endif %} + +# Shared network configration(s) +{% if shared_network_name is vyos_defined %} +{% for network, network_config in shared_network_name.items() if network_config.disable is not vyos_defined %} +shared-network {{ network }} { +{% if network_config.authoritative is vyos_defined %} + authoritative; +{% endif %} +{% if network_config.name_server is vyos_defined %} + option domain-name-servers {{ network_config.name_server | join(', ') }}; +{% endif %} +{% if network_config.domain_name is vyos_defined %} + option domain-name "{{ network_config.domain_name }}"; +{% endif %} +{% if network_config.domain_search is vyos_defined %} + option domain-search "{{ network_config.domain_search | join('", "') }}"; +{% endif %} +{% if network_config.ntp_server is vyos_defined %} + option ntp-servers {{ network_config.ntp_server | join(', ') }}; +{% endif %} +{% if network_config.ping_check is vyos_defined %} + ping-check true; +{% endif %} +{% if network_config.shared_network_parameters is vyos_defined %} + # The following {{ network_config.shared_network_parameters | length }} line(s) + # were added as shared-network-parameters in the CLI and have not been validated +{% for parameter in network_config.shared_network_parameters %} + {{ parameter }} +{% endfor %} +{% endif %} +{% if network_config.subnet is vyos_defined %} +{% for subnet, subnet_config in network_config.subnet.items() %} +{% if subnet_config.description is vyos_defined %} + # {{ subnet_config.description }} +{% endif %} + subnet {{ subnet | address_from_cidr }} netmask {{ subnet | netmask_from_cidr }} { +{% if subnet_config.name_server is vyos_defined %} + option domain-name-servers {{ subnet_config.name_server | join(', ') }}; +{% endif %} +{% if subnet_config.domain_name is vyos_defined %} + option domain-name "{{ subnet_config.domain_name }}"; +{% endif %} +{% if subnet_config.domain_search is vyos_defined %} + option domain-search "{{ subnet_config.domain_search | join('", "') }}"; +{% endif %} +{% if subnet_config.ntp_server is vyos_defined %} + option ntp-servers {{ subnet_config.ntp_server | join(', ') }}; +{% endif %} +{% if subnet_config.pop_server is vyos_defined %} + option pop-server {{ subnet_config.pop_server | join(', ') }}; +{% endif %} +{% if subnet_config.smtp_server is vyos_defined %} + option smtp-server {{ subnet_config.smtp_server | join(', ') }}; +{% endif %} +{% if subnet_config.time_server is vyos_defined %} + option time-servers {{ subnet_config.time_server | join(', ') }}; +{% endif %} +{% if subnet_config.wins_server is vyos_defined %} + option netbios-name-servers {{ subnet_config.wins_server | join(', ') }}; +{% endif %} +{% if subnet_config.static_route is vyos_defined %} +{% set static_default_route = '' %} +{% if subnet_config.default_router is vyos_defined %} +{% set static_default_route = ', ' ~ '0.0.0.0/0' | isc_static_route(subnet_config.default_router) %} +{% endif %} +{% if subnet_config.static_route is vyos_defined %} +{% set rfc3442_routes = [] %} +{% for route, route_options in subnet_config.static_route.items() %} +{% set rfc3442_routes = rfc3442_routes.append(route | isc_static_route(route_options.next_hop)) %} +{% endfor %} + option rfc3442-static-route {{ rfc3442_routes | join(', ') }}{{ static_default_route }}; + option windows-static-route {{ rfc3442_routes | join(', ') }}; +{% endif %} +{% endif %} +{% if subnet_config.ip_forwarding is vyos_defined %} + option ip-forwarding true; +{% endif %} +{% if subnet_config.default_router is vyos_defined %} + option routers {{ subnet_config.default_router }}; +{% endif %} +{% if subnet_config.server_identifier is vyos_defined %} + option dhcp-server-identifier {{ subnet_config.server_identifier }}; +{% endif %} +{% if subnet_config.subnet_parameters is vyos_defined %} + # The following {{ subnet_config.subnet_parameters | length }} line(s) were added as + # subnet-parameters in the CLI and have not been validated!!! +{% for parameter in subnet_config.subnet_parameters %} + {{ parameter }} +{% endfor %} +{% endif %} +{% if subnet_config.tftp_server_name is vyos_defined %} + option tftp-server-name "{{ subnet_config.tftp_server_name }}"; +{% endif %} +{% if subnet_config.bootfile_name is vyos_defined %} + option bootfile-name "{{ subnet_config.bootfile_name }}"; + filename "{{ subnet_config.bootfile_name }}"; +{% endif %} +{% if subnet_config.bootfile_server is vyos_defined %} + next-server {{ subnet_config.bootfile_server }}; +{% endif %} +{% if subnet_config.bootfile_size is vyos_defined %} + option boot-size {{ subnet_config.bootfile_size }}; +{% endif %} +{% if subnet_config.time_offset is vyos_defined %} + option time-offset {{ subnet_config.time_offset }}; +{% endif %} +{% if subnet_config.wpad_url is vyos_defined %} + option wpad-url "{{ subnet_config.wpad_url }}"; +{% endif %} +{% if subnet_config.client_prefix_length is vyos_defined %} + option subnet-mask {{ ('0.0.0.0/' ~ subnet_config.client_prefix_length) | netmask_from_cidr }}; +{% endif %} +{% if subnet_config.lease is vyos_defined %} + default-lease-time {{ subnet_config.lease }}; + max-lease-time {{ subnet_config.lease }}; +{% endif %} +{% if network_config.ping_check is not vyos_defined and subnet_config.ping_check is vyos_defined %} + ping-check true; +{% endif %} +{% if subnet_config.static_mapping is vyos_defined %} +{% for host, host_config in subnet_config.static_mapping.items() if host_config.disable is not vyos_defined %} + host {{ host | replace('_','-') if host_decl_name is vyos_defined else network | replace('_','-') ~ '_' ~ host | replace('_','-') }} { +{% if host_config.ip_address is vyos_defined %} + fixed-address {{ host_config.ip_address }}; +{% endif %} + hardware ethernet {{ host_config.mac_address }}; +{% if host_config.static_mapping_parameters is vyos_defined %} + # The following {{ host_config.static_mapping_parameters | length }} line(s) were added + # as static-mapping-parameters in the CLI and have not been validated +{% for parameter in host_config.static_mapping_parameters %} + {{ parameter }} +{% endfor %} +{% endif %} + } +{% endfor %} +{% endif %} +{% if subnet_config.vendor_option.ubiquiti.unifi_controller is vyos_defined %} + option ubnt.unifi-controller {{ subnet_config.vendor_option.ubiquiti.unifi_controller }}; +{% endif %} +{% if subnet_config.range is vyos_defined %} +{# pool configuration can only be used if there follows a range option #} + pool { +{% endif %} +{% if subnet_config.enable_failover is vyos_defined %} + failover peer "{{ failover.name }}"; + deny dynamic bootp clients; +{% endif %} +{% if subnet_config.range is vyos_defined %} +{% for range, range_options in subnet_config.range.items() %} + range {{ range_options.start }} {{ range_options.stop }}; +{% endfor %} +{% endif %} +{% if subnet_config.range is vyos_defined %} +{# pool configuration can only be used if there follows a range option #} + } +{% endif %} + } +{% endfor %} +{% endif %} + on commit { + set shared-networkname = "{{ network }}"; +{% if hostfile_update is vyos_defined %} + set ClientIp = binary-to-ascii(10, 8, ".", leased-address); + set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6)); + set ClientName = pick-first-value(host-decl-name, option fqdn.hostname, option host-name, "empty_hostname"); + if not (ClientName = "empty_hostname") { + set ClientDomain = pick-first-value(config-option domain-name, "..YYZ!"); + execute("/usr/libexec/vyos/system/on-dhcp-event.sh", "commit", ClientName, ClientIp, ClientMac, ClientDomain); + } else { + log(concat("Hostname is not defined for client with IP: ", ClientIP, " MAC: ", ClientMac)); + } +{% endif %} + } +} + +{% endfor %} +{% endif %} |