Newer
Older
Felix Fietkau
committed
#!/bin/sh /etc/rc.common
# Copyright (C) 2007 OpenWrt.org
Felix Fietkau
committed
Felix Fietkau
committed
dhcp_calc() {
local ip="$1"
local res=0
Felix Fietkau
committed
Felix Fietkau
committed
while [ -n "$ip" ]; do
part="${ip%%.*}"
res="$(($res * 256))"
res="$(($res + $part))"
[ "${ip%.*}" != "$ip" ] && ip="${ip#*.}" || ip=
done
echo "$res"
}
append_bool() {
local section="$1"
local option="$2"
local value="$3"
local _tmp
config_get_bool _tmp "$section" "$option"
[ "$_tmp" -gt 0 ] && append args "$3"
}
dnsmasq() {
local cfg="$1"
append_bool "$cfg" authoritative "-K"
append_bool "$cfg" nodaemon "-d"
append_bool "$cfg" domainneeded "-D"
append_bool "$cfg" filterwin2k "-f"
append_bool "$cfg" nonegcache "-N"
append_bool "$cfg" strictorder "-o"
append_bool "$cfg" logqueries "-q"
append_bool "$cfg" noresolv "-R"
append_bool "$cfg" localise_queries "-y"
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
append_bool "$cfg" readethers "-Z"
append_bool "$cfg" dbus "-l"
config_get dnsforwardmax "$cfg" dnsforwardmax
dnsforwardmax="${dnsforwardmax:-150}"
append args "-0 $dnsforwardmax"
config_get port "$cfg" port
port="${port:-53}"
append args "-p $port"
config_get ednspacket_max "$cfg" ednspacket_max
ednspacket_max="${ednspacket_max:-1280}"
append args "-P $ednspacket_max"
config_get dhcpleasemax "$cfg" dhcpleasemax
dhcpleasemax="${dhcpleasemax:-150}"
append args "-X $dhcpleasemax"
config_get addnhosts "$cfg" addnhosts
config_get interface "$cfg" interface
config_get exceptinterface "$cfg" exceptinterface
config_get queryport "$cfg" queryport
config_get domain "$cfg" domain
}
dhcp_subscrid_add() {
local cfg="$1"
config_get name "$cfg" name
[ -n "$name" ] || return 0
config_get subscriberid "$cfg" subscriberid
[ -n "$subscriberid" ] || return 0
append args "--dhcp-subscrid=$name,$subscriberid"
dhcp_option_add "$cfg" "$name"
}
dhcp_remoteid_add() {
local cfg="$1"
config_get name "$cfg" name
[ -n "$name" ] || return 0
config_get remoteid "$cfg" remoteid
[ -n "$remoteid" ] || return 0
append args "--dhcp-remoteid=$name,$remoteid"
dhcp_option_add "$cfg" "$name"
}
dhcp_circuitid_add() {
local cfg="$1"
config_get name "$cfg" name
[ -n "$name" ] || return 0
config_get circuitid "$cfg" circuitid
[ -n "$circuitid" ] || return 0
append args "--dhcp-circuitid=$name,$circuitid"
dhcp_option_add "$cfg" "$name"
}
dhcp_userclass_add() {
local cfg="$1"
config_get name "$cfg" name
[ -n "$name" ] || return 0
config_get userclass "$cfg" userclass
[ -n "$userclass" ] || return 0
append args "--dhcp-userclass=$name,$userclass"
dhcp_option_add "$cfg" "$name"
}
dhcp_vendorclass_add() {
local cfg="$1"
config_get name "$cfg" name
[ -n "$name" ] || return 0
config_get vendorclass "$cfg" vendorclass
[ -n "$vendorclass" ] || return 0
append args "--dhcp-vendorclass=$name,$vendorclass"
dhcp_option_add "$cfg" "$name"
}
dhcp_host_add() {
local cfg="$1"
config_get name "$cfg" name
[ -n "$name" ] || return 0
config_get mac "$cfg" mac
[ -n "$mac" ] || return 0
append args "--dhcp-host=$mac,$ip"
dhcp_option_add "$cfg" "$name"
}
dhcp_mac_add() {
Felix Fietkau
committed
local cfg="$1"
config_get name "$cfg" name
[ -n "$name" ] || return 0
config_get mac "$cfg" mac
[ -n "$mac" ] || return 0
append args "--dhcp-mac=$name,$mac"
dhcp_option_add "$cfg" "$name"
}
Felix Fietkau
committed
dhcp_add() {
local cfg="$1"
Felix Fietkau
committed
config_get net "$cfg" interface
[ -n "$net" ] || return 0
config_get name "$cfg" name
[ -n "$name" ] || name="$net"
Felix Fietkau
committed
config_get ifname "$net" ifname
[ -n "$ifname" ] || return 0
config_get dnsserver "$net" dns
[ -n "$dnsserver" ] && {
DNS_SERVERS="$DNS_SERVERS $dnsserver"
}
Felix Fietkau
committed
config_get proto "$net" proto
[ static = "$proto" ] || return 0
Felix Fietkau
committed
config_get ipaddr "$net" ipaddr
config_get netmask "$net" netmask
#check for an already active dhcp server on the interface, unless 'force' is set
Felix Fietkau
committed
config_get_bool force "$cfg" force 0
[ "$force" -gt 0 ] || {
udhcpc -n -q -R -s /bin/true -t 1 -i $ifname >&- && return 0
Felix Fietkau
committed
}
Felix Fietkau
committed
Felix Fietkau
committed
config_get start "$cfg" start
config_get limit "$cfg" limit
Felix Fietkau
committed
config_get leasetime "$cfg" leasetime
config_get options "$cfg" options
Felix Fietkau
committed
leasetime="${leasetime:-12h}"
start="$(dhcp_calc "${start:-100}")"
limit="$((${limit:-150} + 1))"
eval "$(ipcalc.sh $ipaddr $netmask $start $limit)"
append args "--dhcp-range=$name,$START,$END,$NETMASK,$leasetime${options:+ $options}"
dhcp_option_add "$cfg" "$name"
}
dhcp_option_add () {
local cfg="$1"
local name="$2"
for count in $(seq 0 100); do
eval current_value=\$CONFIG_"$cfg"_dhcp"$count"
if [ -z "$current_value" ]; then
let "count-=1"
break
fi
append args "-O $name","$current_value"
done
Felix Fietkau
committed
}
start() {
include /lib/network
scan_interfaces
config_load dhcp
args=""
config_foreach dnsmasq dnsmasq
config_foreach dhcp_host_add host
config_foreach dhcp_mac_add mac
config_foreach dhcp_vendorclass_add vendorclass
config_foreach dhcp_userclass_add userclass
config_foreach dhcp_circuitid_add circuitid
config_foreach dhcp_remoteid_add remoteid
config_foreach dhcp_subscrid_add subscrid
Felix Fietkau
committed
config_foreach dhcp_add dhcp
/usr/sbin/dnsmasq $args && {
rm -f /tmp/resolv.conf
DNS_SERVERS="$DNS_SERVERS 127.0.0.1"
for DNS_SERVER in $DNS_SERVERS ; do
echo "nameserver $DNS_SERVER" >> /tmp/resolv.conf
done
}
Felix Fietkau
committed
}
stop() {
killall dnsmasq
}