| {# Macro, put quotation marks around strings that are not ipv4 address #} |
| {%- macro quote_if_not_ip(var) -%} |
| {%- set var_split_str = var.split(".") -%} |
| {%- if var_split_str|length == 4 -%} |
| {%- set var_is_ipaddr = True -%} |
| {%- for octet in var_split_str -%} |
| {%- if not octet|int in range(255) -%} |
| {%- set var_is_ipaddr = False -%} |
| {%- endif -%} |
| {%- endfor -%} |
| {%- endif -%} |
| {%- if var_is_ipaddr is defined and var_is_ipaddr == True -%} |
| {{ var }} |
| {%- else -%} |
| "{{ var }}" |
| {%- endif -%} |
| {%- endmacro -%} |
| |
| {# Macro, renders nested options for specific key #} |
| {%- macro render_key(section, key) -%} |
| {%- if section.get(key) and section.get(key)|length > 0 %} |
| {%- for item in section.get(key) %} |
| {%- if item.declaration is string %} |
| {{ key }} {{ item.option }} {{ quote_if_not_ip(item.declaration) }}; |
| {%- elif item.declaration is sequence %} |
| {{ key }} {{ item.option }} |
| {%- for value in item.declaration -%} |
| {%- set space = " " -%} |
| {{ space }}{{ quote_if_not_ip(value) }} |
| {%- if not loop.last -%},{%- endif -%} |
| {%- endfor -%} |
| ; |
| {%- else %} |
| {{ key }} {{ item.option }} {{ item.declaration }}; |
| {%- endif -%} |
| {%- endfor -%} |
| {%- endif -%} |
| {%- endmacro -%} |
| |
| {# Macro, renders set of options for global section or for interface section #} |
| {%- macro render_section(section) -%} |
| {%- if section.backoff_cutoff is defined %} |
| backoff-cutoff {{ section.backoff_cutoff|default(15, true) }}; |
| {%- endif -%} |
| |
| {%- if section.initial_interval is defined %} |
| initial-interval {{ section.initial_interval|default(10, true) }}; |
| {%- endif -%} |
| |
| {%- if section.reboot is defined %} |
| # The reboot statement sets the time that must elapse after the client |
| # first tries to reacquire its old address before it gives up and tries |
| # to discover a new address. |
| reboot {{ section.reboot|default(10, true) }}; |
| {%- endif -%} |
| |
| {%- if section.retry is defined %} |
| retry {{ section.retry|default(60, true) }}; |
| {%- endif -%} |
| |
| {%- if section.select_timeout is defined %} |
| # The select-timeout is the time after the client sends its first lease |
| # discovery request at which it stops waiting for offers from servers, |
| # assuming that it has received at least one such offer |
| select-timeout {{ section.select_timeout|default(0, True) }}; |
| {%- endif -%} |
| |
| {%- if section.timeout is defined %} |
| timeout {{ section.timeout|default(120, True) }}; |
| {%- endif -%} |
| |
| {{ render_key(section, "send") }} |
| {{ render_key(section, "supersede") }} |
| {{ render_key(section, "prepend") }} |
| {{ render_key(section, "append") }} |
| |
| {%- if section.reject is defined and section.reject|length > 0 %} |
| reject {{ section.reject|join(",\n ") }}; |
| {%- endif %} |
| |
| {%- if section.request is defined and section.request|length > 0 %} |
| request {{ section.request|join(",\n ") }}; |
| {%- endif %} |
| |
| {%- if section.require is defined and section.require|length > 0 %} |
| require {{ section.require|join(",\n ") }}; |
| {% endif -%} |
| {%- endmacro -%} |
| |
| {# Actual template start #} |
| {%- from "linux/map.jinja" import network with context -%} |
| {%- set dhclient = network.get('dhclient', {}) %} |
| # dhclient.conf(5) file managed by salt-minion(1) |
| # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN |
| option rfc3442-classless-static-routes code 121 = array of unsigned integer 8; |
| {{ render_section(dhclient) }} |
| {%- if dhclient.get("interface") -%} |
| {%- for iface_name, options in dhclient.interface.iteritems() %} |
| {%- if network.interface.get(iface_name) and network.interface.get(iface_name).enabled == True |
| and network.interface.get(iface_name).proto == 'dhcp' -%} |
| interface "{{ iface_name }}" { |
| {{ render_section(options)|indent }} |
| } |
| {%- endif -%} |
| {%- endfor %} |
| {%- endif -%} |