initial commit
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..46f89c1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,18 @@
+
+# ISC DHCP server
+
+
+## Sample pillars
+
+ISC DHCP server
+
+ isc_dhcp:
+ server:
+ enabled: true
+ interfaces:
+ - name: eth0
+ - name: eth1
+
+## Read more
+
+* http://chschneider.eu/linux/server/tftpd-hpa.shtml
\ No newline at end of file
diff --git a/files/defaults.Debian b/files/defaults.Debian
new file mode 100644
index 0000000..186270b
--- /dev/null
+++ b/files/defaults.Debian
@@ -0,0 +1,13 @@
+# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
+#DHCPD_CONF=/etc/dhcp/dhcpd.conf
+
+# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
+#DHCPD_PID=/var/run/dhcpd.pid
+
+# Additional options to start dhcpd with.
+# Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
+#OPTIONS=""
+
+# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
+# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
+INTERFACES="{% for interface in salt['pillar.get']('isc_dhcp:server:interfaces', []) %}{{ interface.name }}{% if not loop.last %} {% endif %}{% endfor %}"
\ No newline at end of file
diff --git a/files/dhcpd.conf b/files/dhcpd.conf
new file mode 100644
index 0000000..2dc1836
--- /dev/null
+++ b/files/dhcpd.conf
@@ -0,0 +1,103 @@
+{%- from "isc_dhcp/map.jinja" import server with context %}
+
+{%- if server.omapi_port is defined -%}
+omapi-port {{ server.omapi_port }};
+{% endif -%}
+
+ddns-update-style {{ server.ddns_update_style|default('none') }};
+
+{%- if server.ddns_updates is defined %}
+ddns-updates {{ server.ddns_updates }};
+{%- endif -%}
+
+{%- if server.update_static_leases is defined %}
+update-static-leases {{ server.update_static_leases }};
+{%- endif -%}
+
+{%- if server.use_host_decl_names is defined %}
+use-host-decl-names {{ server.use_host_decl_names }};
+{{- "\n" }}
+{%- endif -%}
+
+{%- if server.zones is defined -%}
+{%- for zone in server.dhcpd.zones|default({}) %}
+zone {{ zone.name }} {
+ primary {{ zone.primary }};
+ {%- if 'key' in zone %}
+ key {{ zone.key|default('rndc-key') }};
+ {%- endif %}
+}
+{{- "\n" }}
+{%- endfor -%}
+{%- endif %}
+
+default-lease-time {{ server.default_lease_time|default('600') }};
+max-lease-time {{ server.max_lease_time|default('7200') }};
+
+{%- if server.authoritative|default(False) %}
+authoritative;
+{%- endif %}
+
+log-facility {{ server.logging.facility|default('local7') }};
+
+{%- if server.next_server is defined -%}
+{{ "\n" }}
+next-server {{ server.next_server }};
+{%- endif -%}
+
+{%- if server.filename is defined %}
+filename "{{ server.filename }}";
+{{- "\n" }}
+{%- endif -%}
+
+{%- if server.allow is defined -%}
+ {%- for a in server.dhcpd.allow|default([]) %}
+allow {{ a }};
+ {%- endfor -%}
+{{ "\n" }}
+{%- endif -%}
+
+{%- if server.deny is defined -%}
+ {%- for d in server.dhcpd.deny|default([]) %}
+deny {{ d }};
+ {%- endfor -%}
+{{ "\n" }}
+{%- endif -%}
+
+{%- if server.ignore is defined -%}
+ {%- for i in server.ignore|default([]) %}
+ignore {{ i }};
+ {%- endfor -%}
+{{ "\n" }}
+{%- endif -%}
+
+{%- set options = server.dhcpd.default_options|default([]) -%}
+{%- if server.dhcpd.options is defined -%}
+ {%- do options.extend(server.dhcpd.options) -%}
+{%- endif -%}
+
+{%- for o in options %}
+option {{ o }};
+{%- endfor -%}
+{%- set options = [] -%}
+
+{%- if server.default_includes is defined -%}
+ {%- set includes = server.dhcpd.default_includes -%}
+{%- endif -%}
+{%- if server.dhcpd.includes is defined -%}
+ {%- do includes.extend(server.dhcpd.includes) -%}
+{%- endif -%}
+{{ "\n" }}
+
+{%- for i in includes %}
+include "{{ i }}";
+{%- endfor -%}
+{%- set includes = [] -%}
+
+{%- if server.dhcpd.file_append is defined %}
+
+{{ server.dhcpd.file_append }}
+
+{%- endif -%}
+
+{%- endif -%}
diff --git a/init.sls b/init.sls
new file mode 100644
index 0000000..d8a93c5
--- /dev/null
+++ b/init.sls
@@ -0,0 +1,8 @@
+
+include:
+{%- if pillar.foreman.server.enabled %}
+- foreman.server
+{%- endif %}
+{%- if pillar.foreman.smart_proxy.enabled %}
+- foreman.smart_proxy
+{%- endif %}
diff --git a/map.jinja b/map.jinja
new file mode 100644
index 0000000..16af0eb
--- /dev/null
+++ b/map.jinja
@@ -0,0 +1,31 @@
+{%- load_yaml as raw_server %}
+Debian:
+ pkgs:
+ - isc-dhcp-server
+ service: isc-dhcp-server
+ logging:
+ facility: local7
+ defaults_config: /etc/default/isc-dhcp-server
+ dhcpd_config: /etc/dhcp/dhcpd.conf
+ hosts_config: /etc/dhcp/dhcpd.hosts
+ subnets_config: /etc/dhcp/dhcpd.subnets
+FreeBSD:
+ pkgs:
+ - isc-dhcp42-server
+ service: isc-dhcpd
+ logging:
+ facility: local7
+ defaults_config: /etc/rc.conf.d/dhcpd
+ dhcpd_config: /usr/local/etc/dhcpd.conf
+ hosts_config: /usr/local/etc/dhcpd.hosts
+ subnets_config:/usr/local/etc/dhcpd.subnets
+RedHat:
+ pkgs:
+ - dhcp
+ service: dhcpd
+ logging:
+ facility: local7
+ defaults_config: /etc/sysconfig/dhcpd
+{%- endload %}
+
+{%- set server = salt['grains.filter_by'](raw_server, merge=salt['pillar.get']('isc_dhcp:server')) %}
diff --git a/server.sls b/server.sls
new file mode 100644
index 0000000..4feed67
--- /dev/null
+++ b/server.sls
@@ -0,0 +1,66 @@
+{%- from "isc_dhcp/map.jinja" import server with context %}
+{%- if server.enabled %}
+
+isc_dhcp_packages:
+ pkg.installed:
+ - pkgs: {{ server.pkgs }}
+
+{{ server.config.defaults_config }}:
+ file.managed:
+ - makedirs: True
+ - source: 'salt://isc_dhcp/files/defaults.{{ salt['grains.get']('os_family')) }}'
+ - template: jinja
+ - mode: 644
+ - require:
+ - pkg: isc_dhcp_packages
+ - watch_in:
+ - service: isc_dhcp_service
+
+{%- if server.dhcpd_config is defined %}
+
+{{ server.config.dhcpd.path }}:
+ file.managed:
+ - source: salt://isc_dhcp/files/dhcpd.conf
+ - template: jinja
+ - mode: 644
+ - require:
+ - pkg: isc_dhcp_packages
+ - watch_in:
+ - service: isc_dhcp_service
+
+{%- endif %}
+
+{%- if server.hosts_config is defined %}
+
+{{ server.hosts_config }}:
+ file.managed:
+ - source: salt://isc_dhcp/files/dhcpd.hosts
+ - template: jinja
+ - mode: 644
+ - require:
+ - pkg: isc_dhcp_packages
+ - watch_in:
+ - service: isc_dhcp_service
+
+{%- endif %}
+
+{%- if server.subnets_config is defined %}
+
+{{ server.subnets_config }}:
+ file.managed:
+ - source: salt://isc_dhcp/files/dhcpd.subnets
+ - template: jinja
+ - mode: 644
+ - require:
+ - pkg: isc_dhcp_packages
+ - watch_in:
+ - service: isc_dhcp_service
+
+{%- endif %}
+
+isc_dhcp_service:
+ service.running:
+ - name: {{ server.service }}
+ - enable: true
+
+{%- endif %}
\ No newline at end of file