64045af765
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
102 lines
1.9 KiB
Bash
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
|
|
}
|