From: Jo-Philipp Wich Date: Tue, 24 May 2011 10:01:23 +0000 (+0000) Subject: [PATCH] add interface and hosts parsing from uci dhcp config to ISC dhcpd (fix bridges) X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=commitdiff_plain;h=a6b1e8f84626783e09463767aa1b48d00cfd1253 [PATCH] add interface and hosts parsing from uci dhcp config to ISC dhcpd (fix bridges) This allows people to use the luci interface to specify to dhcpd which interfaces it should listen to, and which static MAC->IP host mappings should it define For the interface, this has to be done in the initscript, via commandline when the server is started For the static hosts, the initscript makes a file called /tmp/dhcpd.hosts which you can include in your dhcpd.config to use the webgui defined hosts Fix: 7.5.2011. Now works properly on interfaces which are in a bridge Signed-off-by: Rajko Stojadinovic SVN-Revision: 26998 --- diff --git a/net/dhcp/Makefile b/net/dhcp/Makefile index 60adc75bef..374ec6fc1f 100644 --- a/net/dhcp/Makefile +++ b/net/dhcp/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2006-2008 OpenWrt.org +# Copyright (C) 2006-2011 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=dhcp PKG_VERSION:=3.1.0 -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=ftp://ftp.isc.org/isc/dhcp/ diff --git a/net/dhcp/files/dhcpd.init b/net/dhcp/files/dhcpd.init index c9ac1e3084..308f3aa40d 100644 --- a/net/dhcp/files/dhcpd.init +++ b/net/dhcp/files/dhcpd.init @@ -4,6 +4,65 @@ START=60 lease_file=/tmp/dhcpd.leases config_file=/etc/dhcpd.conf pid_file=/var/run/dhcpd.pid +hosts_file=/tmp/dhcpd.hosts +dhcp_ifs="" + +append_interface() { + local ifname=$(uci_get_state network "$1" device) + if [ "$(uci_get_state network "$1" type)" = "bridge" ]; then + ifname=$(uci_get_state network "$1" ifname); fi + + if [ -z "$dhcp_ifs" ]; then + dhcp_ifs="$ifname" + else + dhcp_ifs="$dhcp_ifs $ifname" + fi +} + +parse_dhcp() { + local cfg="$1" + config_get net "$cfg" interface + [ -n "$net" ] || return 0 + + config_get_bool ignore "$1" ignore 0 + if [ "$ignore" -eq 1 ]; then return 0; fi + + append_interface $net +} + +parse_host_entry() { + local cfg="$1" + + config_get name "$cfg" name + + config_get ip "$cfg" ip + [ -n "$ip" ] || return 0 + + local i=0 + config_get mac "$cfg" mac + for m in $mac; do + local hostid="$name" + if [ $i -ne 0 ]; then hostid="$name"_"$i"; fi + + echo "host $hostid {" >> "$hosts_file" + echo "hardware ethernet $m;" >> "$hosts_file" + echo "fixed-address $ip;" >> "$hosts_file" + echo "}" >> $hosts_file + + i=$((i+1)) + done +} + +init_config() { + echo " #Automatically generated by dhcpd initscript, any modifications will be overwritten" > "$hosts_file" + + include /lib/network + scan_interfaces + config_load dhcp + + config_foreach parse_host_entry host + config_foreach parse_dhcp dhcp +} start() { if [ -e $pid_file ] ; then