From cbfc8c75ad54ec4d7e7e5781a62fbf0d822393c9 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Fri, 13 Nov 2020 23:30:21 +0100 Subject: [PATCH] bundles/dhcpd add defaults file and some escaping --- bundles/dhcpd/files/dhcpd.conf | 9 ++++++++- bundles/dhcpd/files/isc-dhcp-server | 18 ++++++++++++++++++ bundles/dhcpd/items.py | 25 ++++++++++++++++++++++++- bundles/dhcpd/metadata.py | 13 ++++++++++++- 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 bundles/dhcpd/files/isc-dhcp-server diff --git a/bundles/dhcpd/files/dhcpd.conf b/bundles/dhcpd/files/dhcpd.conf index 1854552..98ff2b4 100644 --- a/bundles/dhcpd/files/dhcpd.conf +++ b/bundles/dhcpd/files/dhcpd.conf @@ -1,5 +1,8 @@ #dhcpd.conf +<% +import re +%> ddns-update-style none; authoritative; @@ -9,11 +12,15 @@ subnet ${subnet['subnet']} netmask ${subnet['netmask']} { % if subnet.get('range_lower', None) and subnet.get('range_higher', None): range ${subnet['range_lower']} ${subnet['range_higher']}; % endif - interface ${subnet['interface']}; + interface "${subnet['interface']}"; default-lease-time ${subnet.get('default-lease-time', 600)}; max-lease-time ${subnet.get('max-lease-time', 3600)}; % for option, value in sorted(subnet.get('options', {}).items()): + % if re.match('([^0-9\.,\ ])', value): + option ${option} "${value}"; + % else: option ${option} ${value}; + % endif % endfor } % endfor diff --git a/bundles/dhcpd/files/isc-dhcp-server b/bundles/dhcpd/files/isc-dhcp-server new file mode 100644 index 0000000..8d0ee70 --- /dev/null +++ b/bundles/dhcpd/files/isc-dhcp-server @@ -0,0 +1,18 @@ +# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server) + +# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf). +#DHCPDv4_CONF=/etc/dhcp/dhcpd.conf +#DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf + +# Path to dhcpd's PID file (default: /var/run/dhcpd.pid). +#DHCPDv4_PID=/var/run/dhcpd.pid +#DHCPDv6_PID=/var/run/dhcpd6.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". +INTERFACESv4="${listen_interfaces}" +INTERFACESv6="" diff --git a/bundles/dhcpd/items.py b/bundles/dhcpd/items.py index 3d47949..85e388e 100644 --- a/bundles/dhcpd/items.py +++ b/bundles/dhcpd/items.py @@ -5,10 +5,33 @@ files = { 'dhcp_config': node.metadata.get('dhcpd'), }, 'needs': { - 'pkg_apt:' + 'pkg_apt:isc-dhcp-server' + }, + 'triggers': { + 'svc_systemd:isc-dhcp-server:restart', + }, + }, + '/etc/default/isc-dhcp-server': { + 'content_type': 'mako', + 'context': { + 'listen_interfaces': node.metadata.get('dhcpd', {}).get('listen_interfaces'), + }, + 'needs': { + 'pkg_apt:isc-dhcp-server' }, 'triggers': { 'svc_systemd:isc-dhcp-server:restart', }, }, } + +svc_systemd = { + 'isc-dhcp-server': { + 'needs': { + 'pkg_apt:isc-dhcp-server', + 'file:/etc/dhcp/dhcpd.conf', + 'file:/etc/default/isc-dhcp-server', + }, + }, +} + diff --git a/bundles/dhcpd/metadata.py b/bundles/dhcpd/metadata.py index 03af663..ce6fb6b 100644 --- a/bundles/dhcpd/metadata.py +++ b/bundles/dhcpd/metadata.py @@ -1,7 +1,7 @@ defaults = { 'apt': { 'packages': { - 'isc-dhcpd-server': {}, + 'isc-dhcp-server': {}, }, }, } @@ -23,3 +23,14 @@ def get_static_allocations(metadata): } } +@metadata_reactor +def get_listen_interfaces(metadata): + listen_interfaces = [] + for identfier, subnet in node.metadata.get('dhcpd/subnets', {}).items(): + listen_interfaces.append(subnet.get('interface')) + + return { + 'dhcpd': { + 'listen_interfaces': ' '.join(sorted(listen_interfaces)), + } + }