packages/net/dhcp/files/dhcpd.init
jow 64045af765 [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 <admin@rajko.info>


git-svn-id: svn://svn.openwrt.org/openwrt/packages@26998 3c298f89-4303-0410-b956-a3cf2f4a3e73
2011-05-24 10:01:23 +00:00

102 lines
1.9 KiB
Bash

#!/bin/sh /etc/rc.common
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
echo " dhcpd already running with PID `cat $pid_file`"
return 1
fi
echo Starting isc-dhcpd
if [ ! -e $lease_file ]; then
echo " Creating $lease_file"
touch $lease_file
fi
/usr/sbin/dhcpd -q -cf $config_file -lf $lease_file
if [ $? -ne 0 ]; then
echo " isc-dhcpd failed to start"
fi
}
stop() {
echo "Stopping isc-dhcpd"
if [ -e $pid_file ]; then
kill -KILL `cat $pid_file`
if [ $? -ne 0 ]; then
echo " PID " `cat $pid_file` not found
echo " Is the DHCP server running?"
fi
rm -f $pid_file
else
echo " $pid_file not found"
fi
}