From dcf944b1981f72dd5f7dba78303eac9e2cf6ae15 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Fri, 13 Nov 2020 22:11:56 +0100 Subject: [PATCH 1/3] bundles/dhcpd add initial items, metadata and template --- bundles/dhcpd/.metadata.py.swp | Bin 0 -> 12288 bytes bundles/dhcpd/files/dhcpd.conf | 26 ++++++++++++++++++++++++++ bundles/dhcpd/items.py | 14 ++++++++++++++ bundles/dhcpd/metadata.py | 25 +++++++++++++++++++++++++ groups/locations.py | 1 + nodes/home/router.py | 21 +++++++++++++++++++++ 6 files changed, 87 insertions(+) create mode 100644 bundles/dhcpd/.metadata.py.swp create mode 100644 bundles/dhcpd/files/dhcpd.conf create mode 100644 bundles/dhcpd/items.py create mode 100644 bundles/dhcpd/metadata.py diff --git a/bundles/dhcpd/.metadata.py.swp b/bundles/dhcpd/.metadata.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..0de9b1ec730fda0459480bded686c39209f51111 GIT binary patch literal 12288 zcmeI2F>ezw6vtimPy`YZVmV;AL`p6RFjSS0n2k`ndi%0b5y8w1>TeXv3-8;`T1urr`%@m_QuU|a-?Dcf8q8@kmJlY6Hn=<5@nfmBj&@`B7YVzW7E+D6n=>UQuw%I?yRIw7nGxM7 zcrLi-iMjWOj5JLIh`_N3%zWNiYp^Sq`@P_Q>Eeax%;{Ul3MD5ZKm>>Y5g-CYfCvx) zB0vQG4FcY*um`x66XkZ!mF>!*wj5GJ1c(3;AOb{y2oM1xKm>>Y5g-CYfC&7B1h`;q zwZYgURQUhDdjJ2v%Gg)bC)8`yE7Wt;Gt^VmKI$Rr4r&8+9`*htV=qt|)kiVZH_ZD5 z^%3>Y5g-CYfCvx)B0vQGR{{~*oQ2?RSv>~%6`pXJq>L<zIktVK%W;$dsh`%QGM`hitiK%)2*hS9Y{#manHN-_f9EOr>TqZ@qU zpta7ba&m1WDL{FdOR()_6!xOU3J0H;7kLiqbeL^#-b$p0scV)gL%JfW2nVB+P^3$x zN=H`DOfw$qDa56BZ8u>Db0#2 literal 0 HcmV?d00001 diff --git a/bundles/dhcpd/files/dhcpd.conf b/bundles/dhcpd/files/dhcpd.conf new file mode 100644 index 0000000..1854552 --- /dev/null +++ b/bundles/dhcpd/files/dhcpd.conf @@ -0,0 +1,26 @@ +#dhcpd.conf + +ddns-update-style none; + +authoritative; + +% for identfier, subnet in dhcp_config.get('subnets', {}).items(): +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']}; + 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()): + option ${option} ${value}; +% endfor +} +% endfor + +% for identifier, allocation in dhcp_config.get('fixed_allocations', {}).items(): +host ${identifier} { + hardware ethernet ${allocation['mac']}; + fixed-address ${allocation['ipv4']}; +} +% endfor diff --git a/bundles/dhcpd/items.py b/bundles/dhcpd/items.py new file mode 100644 index 0000000..3d47949 --- /dev/null +++ b/bundles/dhcpd/items.py @@ -0,0 +1,14 @@ +files = { + '/etc/dhcp/dhcpd.conf': { + 'content_type': 'mako', + 'context': { + 'dhcp_config': node.metadata.get('dhcpd'), + }, + 'needs': { + 'pkg_apt:' + }, + 'triggers': { + 'svc_systemd:isc-dhcp-server:restart', + }, + }, +} diff --git a/bundles/dhcpd/metadata.py b/bundles/dhcpd/metadata.py new file mode 100644 index 0000000..03af663 --- /dev/null +++ b/bundles/dhcpd/metadata.py @@ -0,0 +1,25 @@ +defaults = { + 'apt': { + 'packages': { + 'isc-dhcpd-server': {}, + }, + }, +} + + +@metadata_reactor +def get_static_allocations(metadata): + allocations = {} + for rnode in repo.nodes_in_group('home'): + for identifier, interface in rnode.metadata.get('interfaces', {}).items(): + if interface.get('dhcp', False): + allocations[rnode.name] = { + 'ipv4': sorted(interface['ips'])[0], + 'mac': interface['mac'], + } + return { + 'dhcpd': { + 'fixed_allocations': allocations, + } + } + diff --git a/groups/locations.py b/groups/locations.py index c52b766..b9bc5c3 100644 --- a/groups/locations.py +++ b/groups/locations.py @@ -49,6 +49,7 @@ groups['home'] = { 'lldp', }, 'metadata': { + 'location': 'home', 'nameservers': { '172.19.138.1', }, diff --git a/nodes/home/router.py b/nodes/home/router.py index 4c7f197..12a6f45 100644 --- a/nodes/home/router.py +++ b/nodes/home/router.py @@ -3,6 +3,7 @@ nodes['home.router'] = { 'bundles': { 'iptables', 'pppd', + 'dhcpd', }, 'groups': set(), 'metadata': { @@ -45,6 +46,26 @@ nodes['home.router'] = { 'password': vault.decrypt('encrypt$gAAAAABfruaXEDkaFksFMU8g97ydWyJF8p2KcSDJJBlzaOLDsLL6oCDYjG1kMPVESOzqjn8ThtSht1uZDuMCstA-sATmLS-EWQ=='), 'interface': 'enp1s0.100', }, + 'dhcpd': { + 'subnets': { + 'home': { + 'subnet': '172.19.138.0', + 'netmask': '255.255.255.0', + 'range_lower': '172.19.138.100', + 'range_higher': '172.19.138.250', + 'interface': 'enp1s0.42', + 'options': { + 'routers': '172.19.138.1', + 'domain-name-servers': '8.8.8.8, 8.8.4.4', + 'domain-name': 'franzi-home.kunbox.net', + 'broadcast-address': '172.19.138.255', + 'subnet-mask': '255.255.255.0', + }, + 'default-lease-time': 300, + 'max-lease-time': 1800, + }, + }, + }, 'vm': { 'cpu': 2, 'ram': 2, -- 2.39.2 From ef211f735638cf2fe78fcf60c12793fe63186fb8 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Fri, 13 Nov 2020 22:12:42 +0100 Subject: [PATCH 2/3] update gitignore --- .gitignore | 1 + bundles/dhcpd/.metadata.py.swp | Bin 12288 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 bundles/dhcpd/.metadata.py.swp diff --git a/.gitignore b/.gitignore index d1f7e7b..6feee2d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .secrets.cfg __pycache__ +*.swp diff --git a/bundles/dhcpd/.metadata.py.swp b/bundles/dhcpd/.metadata.py.swp deleted file mode 100644 index 0de9b1ec730fda0459480bded686c39209f51111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2F>ezw6vtimPy`YZVmV;AL`p6RFjSS0n2k`ndi%0b5y8w1>TeXv3-8;`T1urr`%@m_QuU|a-?Dcf8q8@kmJlY6Hn=<5@nfmBj&@`B7YVzW7E+D6n=>UQuw%I?yRIw7nGxM7 zcrLi-iMjWOj5JLIh`_N3%zWNiYp^Sq`@P_Q>Eeax%;{Ul3MD5ZKm>>Y5g-CYfCvx) zB0vQG4FcY*um`x66XkZ!mF>!*wj5GJ1c(3;AOb{y2oM1xKm>>Y5g-CYfC&7B1h`;q zwZYgURQUhDdjJ2v%Gg)bC)8`yE7Wt;Gt^VmKI$Rr4r&8+9`*htV=qt|)kiVZH_ZD5 z^%3>Y5g-CYfCvx)B0vQGR{{~*oQ2?RSv>~%6`pXJq>L<zIktVK%W;$dsh`%QGM`hitiK%)2*hS9Y{#manHN-_f9EOr>TqZ@qU zpta7ba&m1WDL{FdOR()_6!xOU3J0H;7kLiqbeL^#-b$p0scV)gL%JfW2nVB+P^3$x zN=H`DOfw$qDa56BZ8u>Db0#2 -- 2.39.2 From cbfc8c75ad54ec4d7e7e5781a62fbf0d822393c9 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Fri, 13 Nov 2020 23:30:21 +0100 Subject: [PATCH 3/3] 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)), + } + } -- 2.39.2