Add DNS server (#83)

Add DNS server
This commit is contained in:
Pascal Vizeli
2017-05-23 17:18:14 +02:00
committed by GitHub
parent e653ed73bf
commit 2cb7569634
5 changed files with 127 additions and 13 deletions

15
dhcp_server/Dockerfile Normal file
View File

@@ -0,0 +1,15 @@
FROM %%BASE_IMAGE%%
# Add env
ENV LANG C.UTF-8
# Setup base
RUN apk add --no-cache tzdata jq dhcp
# Copy data
COPY run.sh /
COPY dhcpd.conf /etc/
RUN chmod a+x /run.sh
CMD [ "/run.sh" ]

52
dhcp_server/config.json Normal file
View File

@@ -0,0 +1,52 @@
{
"name": "DHCP server",
"version": "0.1",
"slug": "dhcp_server",
"description": "A simple dhcp server",
"url": "https://home-assistant.io/addons/dhcp_server/",
"startup": "before",
"boot": "auto",
"ports": {
"67/tcp": 67,
"67/udp": 67
},
"options": {
"domain": null,
"domain-name-servers": [null],
"networks": [
{
"subnet": "192.168.1.0",
"netmask": "255.255.255.0",
"range_start": "192.168.1.100",
"range_end": "192.168.1.200",
"broadcast": "192.168.1.254",
"routers": ["192.168.1.1"]
}
],
"hosts": [
{}
]
},
"schema": {
"domain": null,
"dns": ["8.8.8.8", "8.8.4.4"],
"networks": [
{
"subnet": "str",
"netmask": "str",
"range_start": "str",
"range_end": "str",
"broadcast": "str",
"routers": ["str"]
}
],
"hosts": [
{
"mac": "str",
"name": "str",
"ip": "str"
}
]
},
"image": "homeassistant/{arch}-addon-dhcp_server"
}

7
dhcp_server/dhcpd.conf Normal file
View File

@@ -0,0 +1,7 @@
option domain-name "%%DOMAIN%%";
option domain-name-servers %%DNS_SERVERS%%;
default-lease-time 600;
max-lease-time 7200;
authoritative;

48
dhcp_server/run.sh Normal file
View File

@@ -0,0 +1,48 @@
#!/bin/bash
set -e
CONFIG_PATH=/data/options.json
DOMAIN=$(jq --raw-output '.domain' $CONFIG_PATH)
DNS=$(jq --raw-output '.dns | join(", ")' $CONFIG_PATH)
NETWORKS=$(jq --raw-output '.networks | length' $CONFIG_PATH)
HOSTS=$(jq --raw-output '.hosts | length' $CONFIG_PATH)
sed -i "s/%%DOMAIN%%/$DOMAIN/g" /etc/dhcpd.conf
sed -i "s/%%DNS_SERVERS%%/$DNS/g" /etc/dhcpd.conf
# Create networks
for (( i=0; i < "$NETWORKS"; i++ )); do
SUBNET=$(jq --raw-output ".networks[$i].subnet" $CONFIG_PATH)
NETMASK=$(jq --raw-output ".networks[$i].netmask" $CONFIG_PATH)
RANGE_START=$(jq --raw-output ".networks[$i].range_start" $CONFIG_PATH)
RANGE_END=$(jq --raw-output ".networks[$i].range_end" $CONFIG_PATH)
BROADCAST=$(jq --raw-output ".networks[$i].broadcast" $CONFIG_PATH)
ROUTERS=$(jq --raw-output ".networks[$i].routers | joint(\", \")" $CONFIG_PATH)
{
echo "subnet $SUBNET netmask $NETMASK {"
echo " range $RANGE_START $RANGE_END;"
echo " option routers $ROUTERS;"
echo " option broadcast-address $BROADCAST;"
echo "}"
} >> /etc/dhcpd.conf
done
# Create hosts
for (( i=0; i < "$HOSTS"; i++ )); do
MAC=$(jq --raw-output ".hosts[$i].mac" $CONFIG_PATH)
NAME=$(jq --raw-output ".hosts[$i].name" $CONFIG_PATH)
IP=$(jq --raw-output ".hosts[$i].ip" $CONFIG_PATH)
{
echo "host $NAME {"
echo " hardware ethernet $MAC;"
echo " fixed-address $IP;"
echo " option host-name \"$NAME\";"
echo "}"
} >> /etc/dhcpd.conf
done
# run dhcp server
exec /usr/sbin/dhcpd -4 -f -d --no-pid -lf /data/dhcpd.lease -cf /etc/dhcpd.conf < /dev/null