Advertisement
Guest User

/etc/init.d/dnsmasq

a guest
Mar 22nd, 2017
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.48 KB | None | 0 0
  1. #!/bin/sh /etc/rc.common
  2. # Copyright (C) 2007-2012 OpenWrt.org
  3.  
  4. START=19
  5.  
  6. logger guidebug "dnsmasq init $@"
  7. USE_PROCD=1
  8. PROG=/usr/sbin/dnsmasq
  9.  
  10. ADD_LOCAL_DOMAIN=1
  11. ADD_LOCAL_HOSTNAME=1
  12.  
  13. BASECONFIGFILE="/var/etc/dnsmasq.conf"
  14. BASEHOSTFILE="/tmp/hosts/dhcp"
  15. BASETIMESTAMPFILE="/etc/dnsmasq.time"
  16. TRUSTANCHORSFILE="/usr/share/dnsmasq/trust-anchors.conf"
  17. TIMEVALIDFILE="/var/state/dnsmasqsec"
  18. BASEDHCPSTAMPFILE="/var/run/dnsmasq"
  19.  
  20. xappend() {
  21. local value="$1"
  22.  
  23. echo "${value#--}" >> $CONFIGFILE_TMP
  24. }
  25.  
  26. hex_to_hostid() {
  27. local var="$1"
  28. local hex="${2#0x}" # strip optional "0x" prefix
  29.  
  30. if [ -n "${hex//[0-9a-fA-F]/}" ]; then
  31. # is invalid hex literal
  32. return 1
  33. fi
  34.  
  35. # convert into host id
  36. export "$var=$(
  37. printf "%0x:%0x" \
  38. $(((0x$hex >> 16) % 65536)) \
  39. $(( 0x$hex % 65536))
  40. )"
  41.  
  42. return 0
  43. }
  44.  
  45. dhcp_calc() {
  46. local ip="$1"
  47. local res=0
  48.  
  49. while [ -n "$ip" ]; do
  50. part="${ip%%.*}"
  51. res="$(($res * 256))"
  52. res="$(($res + $part))"
  53. [ "${ip%.*}" != "$ip" ] && ip="${ip#*.}" || ip=
  54. done
  55. echo "$res"
  56. }
  57.  
  58. dhcp_check() {
  59. local ifname="$1"
  60. local stamp="${BASEDHCPSTAMPFILE_CFG}.${ifname}.dhcp"
  61. local rv=0
  62.  
  63. [ -s "$stamp" ] && return $(cat "$stamp")
  64.  
  65. # If there's no carrier yet, skip this interface.
  66. # The init script will be called again once the link is up
  67. case "$(devstatus "$ifname" | jsonfilter -e @.carrier)" in
  68. false) return 1;;
  69. esac
  70.  
  71. udhcpc -n -q -s /bin/true -t 1 -i "$ifname" >&- && rv=1 || rv=0
  72.  
  73. [ $rv -eq 1 ] && \
  74. logger -t dnsmasq \
  75. "found already running DHCP-server on interface '$ifname'" \
  76. "refusing to start, use 'option force 1' to override"
  77.  
  78. echo $rv > "$stamp"
  79. return $rv
  80. }
  81.  
  82. log_once() {
  83. pidof dnsmasq >/dev/null || \
  84. logger -t dnsmasq "$@"
  85. }
  86.  
  87. append_bool() {
  88. local section="$1"
  89. local option="$2"
  90. local value="$3"
  91. local _loctmp
  92. config_get_bool _loctmp "$section" "$option" 0
  93. [ $_loctmp -gt 0 ] && xappend "$value"
  94. }
  95.  
  96. append_parm() {
  97. local section="$1"
  98. local option="$2"
  99. local switch="$3"
  100. local default="$4"
  101. local _loctmp
  102. config_get _loctmp "$section" "$option" "$default"
  103. [ -z "$_loctmp" ] && return 0
  104. xappend "$switch=$_loctmp"
  105. }
  106.  
  107. append_server() {
  108. xappend "--server=$1"
  109. }
  110.  
  111. append_address() {
  112. xappend "--address=$1"
  113. }
  114.  
  115. append_ipset() {
  116. xappend "--ipset=$1"
  117. }
  118.  
  119. append_interface() {
  120. network_get_device ifname "$1" || return
  121. xappend "--interface=$ifname"
  122. }
  123.  
  124. append_notinterface() {
  125. network_get_device ifname "$1" || return
  126. xappend "--except-interface=$ifname"
  127. }
  128.  
  129. append_addnhosts() {
  130. xappend "--addn-hosts=$1"
  131. }
  132.  
  133. append_bogusnxdomain() {
  134. xappend "--bogus-nxdomain=$1"
  135. }
  136.  
  137. append_pxe_service() {
  138. xappend "--pxe-service=$1"
  139. }
  140.  
  141. filter_dnsmasq() {
  142. local cfg="$1" func="$2" match_cfg="$3" found_cfg
  143.  
  144. # use entry when no instance entry set, or if it matches
  145. config_get found_cfg "$cfg" "instance"
  146. if [ -z "$found_cfg" -o "$found_cfg" = "$match_cfg" ]; then
  147. $func $cfg
  148. fi
  149. }
  150.  
  151. dhcp_subscrid_add() {
  152. local cfg="$1"
  153.  
  154. config_get networkid "$cfg" networkid
  155. [ -n "$networkid" ] || return 0
  156.  
  157. config_get subscriberid "$cfg" subscriberid
  158. [ -n "$subscriberid" ] || return 0
  159.  
  160. xappend "--dhcp-subscrid=$networkid,$subscriberid"
  161.  
  162. config_get_bool force "$cfg" force 0
  163.  
  164. dhcp_option_add "$cfg" "$networkid" "$force"
  165. }
  166.  
  167. dhcp_remoteid_add() {
  168. local cfg="$1"
  169.  
  170. config_get networkid "$cfg" networkid
  171. [ -n "$networkid" ] || return 0
  172.  
  173. config_get remoteid "$cfg" remoteid
  174. [ -n "$remoteid" ] || return 0
  175.  
  176. xappend "--dhcp-remoteid=$networkid,$remoteid"
  177.  
  178. config_get_bool force "$cfg" force 0
  179.  
  180. dhcp_option_add "$cfg" "$networkid" "$force"
  181. }
  182.  
  183. dhcp_circuitid_add() {
  184. local cfg="$1"
  185.  
  186. config_get networkid "$cfg" networkid
  187. [ -n "$networkid" ] || return 0
  188.  
  189. config_get circuitid "$cfg" circuitid
  190. [ -n "$circuitid" ] || return 0
  191.  
  192. xappend "--dhcp-circuitid=$networkid,$circuitid"
  193.  
  194. config_get_bool force "$cfg" force 0
  195.  
  196. dhcp_option_add "$cfg" "$networkid" "$force"
  197. }
  198.  
  199. dhcp_userclass_add() {
  200. local cfg="$1"
  201.  
  202. config_get networkid "$cfg" networkid
  203. [ -n "$networkid" ] || return 0
  204.  
  205. config_get userclass "$cfg" userclass
  206. [ -n "$userclass" ] || return 0
  207.  
  208. xappend "--dhcp-userclass=$networkid,$userclass"
  209.  
  210. config_get_bool force "$cfg" force 0
  211.  
  212. dhcp_option_add "$cfg" "$networkid" "$force"
  213. }
  214.  
  215. dhcp_vendorclass_add() {
  216. local cfg="$1"
  217.  
  218. config_get networkid "$cfg" networkid
  219. [ -n "$networkid" ] || return 0
  220.  
  221. config_get vendorclass "$cfg" vendorclass
  222. [ -n "$vendorclass" ] || return 0
  223.  
  224. xappend "--dhcp-vendorclass=$networkid,$vendorclass"
  225.  
  226. config_get_bool force "$cfg" force 0
  227.  
  228. dhcp_option_add "$cfg" "$networkid" "$force"
  229. }
  230.  
  231. dhcp_match_add() {
  232. local cfg="$1"
  233.  
  234. config_get networkid "$cfg" networkid
  235. [ -n "$networkid" ] || return 0
  236.  
  237. config_get match "$cfg" match
  238. [ -n "$match" ] || return 0
  239.  
  240. xappend "--dhcp-match=$networkid,$match"
  241.  
  242. config_get_bool force "$cfg" force 0
  243.  
  244. dhcp_option_add "$cfg" "$networkid" "$force"
  245. }
  246.  
  247. dhcp_host_add() {
  248. local cfg="$1"
  249.  
  250. config_get_bool force "$cfg" force 0
  251.  
  252. config_get networkid "$cfg" networkid
  253. [ -n "$networkid" ] && dhcp_option_add "$cfg" "$networkid" "$force"
  254.  
  255. config_get_bool enable "$cfg" enable 1
  256. [ "$enable" = "0" ] && return 0
  257.  
  258. config_get name "$cfg" name
  259. config_get ip "$cfg" ip
  260. [ -n "$ip" -o -n "$name" ] || return 0
  261.  
  262. config_get_bool dns "$cfg" dns 0
  263. [ "$dns" = "1" -a -n "$ip" -a -n "$name" ] && {
  264. echo "$ip $name${DOMAIN:+.$DOMAIN}" >> $HOSTFILE
  265. }
  266.  
  267. config_get mac "$cfg" mac
  268. if [ -n "$mac" ]; then
  269. # --dhcp-host=00:20:e0:3b:13:af,192.168.0.199,lap
  270. macs=""
  271. for m in $mac; do append macs "$m" ","; done
  272. else
  273. # --dhcp-host=lap,192.168.0.199
  274. [ -n "$name" ] || return 0
  275. macs="$name"
  276. name=""
  277. fi
  278.  
  279. config_get tag "$cfg" tag
  280.  
  281. if [ "$DHCPv6CAPABLE" -eq 1 ]; then
  282. config_get duid "$cfg" duid
  283. config_get hostid "$cfg" hostid
  284. if [ -n "$hostid" ]; then
  285. hex_to_hostid hostid "$hostid"
  286. fi
  287. fi
  288.  
  289. config_get_bool broadcast "$cfg" broadcast 0
  290. [ "$broadcast" = "0" ] && broadcast=
  291.  
  292. config_get leasetime "$cfg" leasetime
  293.  
  294. xappend "--dhcp-host=$macs${duid:+,id:$duid}${networkid:+,net:$networkid}${broadcast:+,set:needs-broadcast}${tag:+,set:$tag}${ip:+,$ip${hostid:+,[::$hostid]}}${name:+,$name}${leasetime:+,$leasetime}"
  295. }
  296.  
  297. dhcp_tag_add() {
  298. local cfg="$1"
  299.  
  300. tag="$cfg"
  301.  
  302. [ -n "$tag" ] || return 0
  303.  
  304. config_get_bool force "$cfg" force 0
  305. [ "$force" = "0" ] && force=
  306.  
  307. config_get option "$cfg" dhcp_option
  308. for o in $option; do
  309. xappend "--dhcp-option${force:+-force}=tag:$tag,$o"
  310. done
  311. }
  312.  
  313. dhcp_mac_add() {
  314. local cfg="$1"
  315.  
  316. config_get networkid "$cfg" networkid
  317. [ -n "$networkid" ] || return 0
  318.  
  319. config_get mac "$cfg" mac
  320. [ -n "$mac" ] || return 0
  321.  
  322. xappend "--dhcp-mac=$networkid,$mac"
  323.  
  324. dhcp_option_add "$cfg" "$networkid"
  325. }
  326.  
  327. dhcp_boot_add() {
  328. local cfg="$1"
  329.  
  330. config_get networkid "$cfg" networkid
  331.  
  332. config_get filename "$cfg" filename
  333. [ -n "$filename" ] || return 0
  334.  
  335. config_get servername "$cfg" servername
  336. config_get serveraddress "$cfg" serveraddress
  337.  
  338. [ -n "$serveraddress" -a ! -n "$servername" ] && return 0
  339.  
  340. xappend "--dhcp-boot=${networkid:+net:$networkid,}${filename}${servername:+,$servername}${serveraddress:+,$serveraddress}"
  341.  
  342. config_get_bool force "$cfg" force 0
  343.  
  344. dhcp_option_add "$cfg" "$networkid" "$force"
  345. }
  346.  
  347.  
  348. dhcp_add() {
  349. local cfg="$1"
  350. config_get net "$cfg" interface
  351. [ -n "$net" ] || return 0
  352.  
  353. config_get dhcpv4 "$cfg" dhcpv4
  354. [ "$dhcpv4" != "disabled" ] || return 0
  355.  
  356. config_get networkid "$cfg" networkid
  357. [ -n "$networkid" ] || networkid="$net"
  358.  
  359. network_get_subnet subnet "$net" || return 0
  360. network_get_device ifname "$net" || return 0
  361. network_get_protocol proto "$net" || return 0
  362.  
  363. [ "$cachelocal" = "0" ] && network_get_dnsserver dnsserver "$net" && {
  364. DNS_SERVERS="$DNS_SERVERS $dnsserver"
  365. }
  366.  
  367. append_bool "$cfg" ignore "--no-dhcp-interface=$ifname" && return 0
  368.  
  369. # Do not support non-static interfaces for now
  370. [ static = "$proto" ] || return 0
  371.  
  372. # Override interface netmask with dhcp config if applicable
  373. config_get netmask "$cfg" netmask "${subnet##*/}"
  374.  
  375. #check for an already active dhcp server on the interface, unless 'force' is set
  376. config_get_bool force "$cfg" force 0
  377. [ $force -gt 0 ] || dhcp_check "$ifname" || return 0
  378.  
  379. config_get start "$cfg" start
  380. config_get limit "$cfg" limit
  381. config_get leasetime "$cfg" leasetime
  382. config_get options "$cfg" options
  383. config_get_bool dynamicdhcp "$cfg" dynamicdhcp 1
  384.  
  385. leasetime="${leasetime:-12h}"
  386. start="$(dhcp_calc "${start:-100}")"
  387. limit="${limit:-150}"
  388. [ "$limit" -gt 0 ] && limit=$((limit-1))
  389. eval "$(ipcalc.sh "${subnet%%/*}" $netmask $start $limit)"
  390. if [ "$dynamicdhcp" = "0" ]; then END="static"; fi
  391. xappend "--dhcp-range=$networkid,$START,$END,$NETMASK,$leasetime${options:+ $options}"
  392.  
  393. dhcp_option_add "$cfg" "$networkid"
  394. }
  395.  
  396. dhcp_option_add() {
  397. local cfg="$1"
  398. local networkid="$2"
  399. local force="$3"
  400.  
  401. [ "$force" = "0" ] && force=
  402.  
  403. config_get dhcp_option "$cfg" dhcp_option
  404. for o in $dhcp_option; do
  405. xappend "--dhcp-option${force:+-force}=${networkid:+$networkid,}$o"
  406. done
  407.  
  408. }
  409.  
  410. dhcp_domain_add() {
  411. local cfg="$1"
  412. local ip name names record
  413.  
  414. config_get names "$cfg" name "$2"
  415. [ -n "$names" ] || return 0
  416.  
  417. config_get ip "$cfg" ip "$3"
  418. [ -n "$ip" ] || return 0
  419.  
  420. for name in $names; do
  421. record="${record:+$record }$name"
  422. done
  423.  
  424. echo "$ip $record" >> $HOSTFILE
  425. }
  426.  
  427. dhcp_srv_add() {
  428. local cfg="$1"
  429.  
  430. config_get srv "$cfg" srv
  431. [ -n "$srv" ] || return 0
  432.  
  433. config_get target "$cfg" target
  434. [ -n "$target" ] || return 0
  435.  
  436. config_get port "$cfg" port
  437. [ -n "$port" ] || return 0
  438.  
  439. config_get class "$cfg" class
  440. config_get weight "$cfg" weight
  441.  
  442. local service="$srv,$target,$port${class:+,$class${weight:+,$weight}}"
  443.  
  444. xappend "--srv-host=$service"
  445. }
  446.  
  447. dhcp_mx_add() {
  448. local cfg="$1"
  449. local domain relay pref
  450.  
  451. config_get domain "$cfg" domain
  452. [ -n "$domain" ] || return 0
  453.  
  454. config_get relay "$cfg" relay
  455. [ -n "$relay" ] || return 0
  456.  
  457. config_get pref "$cfg" pref 0
  458.  
  459. local service="$domain,$relay,$pref"
  460.  
  461. xappend "--mx-host=$service"
  462. }
  463.  
  464. dhcp_cname_add() {
  465. local cfg="$1"
  466. local cname target
  467.  
  468. config_get cname "$cfg" cname
  469. [ -n "$cname" ] || return 0
  470.  
  471. config_get target "$cfg" target
  472. [ -n "$target" ] || return 0
  473.  
  474. xappend "--cname=${cname},${target}"
  475. }
  476.  
  477. dhcp_hostrecord_add() {
  478. local cfg="$1"
  479. local names addresses record val
  480.  
  481. config_get names "$cfg" name "$2"
  482. if [ -z "$names" ]; then
  483. return 0
  484. fi
  485.  
  486. config_get addresses "$cfg" ip "$3"
  487. if [ -z "$addresses" ]; then
  488. return 0
  489. fi
  490.  
  491. for val in $names $addresses; do
  492. record="${record:+$record,}$val"
  493. done
  494.  
  495. xappend "--host-record=$record"
  496. }
  497.  
  498. dhcp_relay_add() {
  499. local cfg="$1"
  500. local local_addr server_addr interface
  501.  
  502. config_get local_addr "$cfg" local_addr
  503. [ -n "$local_addr" ] || return 0
  504.  
  505. config_get server_addr "$cfg" server_addr
  506. [ -n "$server_addr" ] || return 0
  507.  
  508. config_get interface "$cfg" interface
  509. if [ -z "$interface" ]; then
  510. xappend "--dhcp-relay=$local_addr,$server_addr"
  511. else
  512. xappend "--dhcp-relay=$local_addr,$server_addr,$interface"
  513. fi
  514. }
  515.  
  516. dnsmasq_start()
  517. {
  518. local cfg="$1" disabled
  519.  
  520. logger guidebug "dnsmasq realstart $@ wait 20"
  521. sleep 2
  522. logger guidebug "dnsmasq realstart $@ wait 18"
  523. sleep 2
  524. logger guidebug "dnsmasq realstart $@ wait 16"
  525. sleep 2
  526. logger guidebug "dnsmasq realstart $@ wait 14"
  527. sleep 2
  528. logger guidebug "dnsmasq realstart $@ wait 12"
  529. sleep 2
  530. logger guidebug "dnsmasq realstart $@ wait 10"
  531. sleep 2
  532. logger guidebug "dnsmasq realstart $@ wait 08"
  533. sleep 2
  534. logger guidebug "dnsmasq realstart $@ wait 06"
  535. sleep 2
  536. logger guidebug "dnsmasq realstart $@ wait 04"
  537. sleep 2
  538. logger guidebug "dnsmasq realstart $@ wait 02"
  539. sleep 2
  540. logger guidebug "dnsmasq realstart $@ postwait"
  541. config_get_bool disabled "$cfg" disabled 0
  542. [ "$disabled" -gt 0 ] && return 0
  543.  
  544. # reset list of DOMAINS and DNS servers (for each dnsmasq instance)
  545. DNS_SERVERS=""
  546. DOMAIN=""
  547. CONFIGFILE="${BASECONFIGFILE}.${cfg}"
  548. CONFIGFILE_TMP="${CONFIGFILE}.$$"
  549. HOSTFILE="${BASEHOSTFILE}.${cfg}"
  550. TIMESTAMPFILE="${BASETIMESTAMPFILE}.${cfg}"
  551. BASEDHCPSTAMPFILE_CFG="${BASEDHCPSTAMPFILE}.${cfg}"
  552.  
  553. # before we can call xappend
  554. mkdir -p /var/run/dnsmasq/
  555. mkdir -p $(dirname $CONFIGFILE)
  556. mkdir -p $(dirname $HOSTFILE)
  557. mkdir -p /var/lib/misc
  558. chown dnsmasq:dnsmasq /var/run/dnsmasq
  559.  
  560. [ -f "$TIMESTAMPFILE" ] && rm -f "$TIMESTAMPFILE"
  561.  
  562. echo "# auto-generated config file from /etc/config/dhcp" > $CONFIGFILE_TMP
  563. echo "# auto-generated config file from /etc/config/dhcp" > $HOSTFILE
  564.  
  565. # if we did this last, we could override auto-generated config
  566. [ -f /etc/dnsmasq.conf ] && {
  567. xappend "--conf-file=/etc/dnsmasq.conf"
  568. }
  569.  
  570. $PROG --version | grep -osqE "^Compile time options:.* DHCPv6( |$)" && DHCPv6CAPABLE=1 || DHCPv6CAPABLE=0
  571.  
  572. append_bool "$cfg" authoritative "--dhcp-authoritative"
  573. append_bool "$cfg" nodaemon "--no-daemon"
  574. append_bool "$cfg" domainneeded "--domain-needed"
  575. append_bool "$cfg" filterwin2k "--filterwin2k"
  576. append_bool "$cfg" nohosts "--no-hosts"
  577. append_bool "$cfg" nonegcache "--no-negcache"
  578. append_bool "$cfg" strictorder "--strict-order"
  579. append_bool "$cfg" logqueries "--log-queries=extra"
  580. append_bool "$cfg" noresolv "--no-resolv"
  581. append_bool "$cfg" localise_queries "--localise-queries"
  582. append_bool "$cfg" readethers "--read-ethers"
  583. append_bool "$cfg" dbus "--enable-dbus"
  584. append_bool "$cfg" boguspriv "--bogus-priv"
  585. append_bool "$cfg" expandhosts "--expand-hosts"
  586. config_get tftp_root "$cfg" "tftp_root"
  587. [ -d "$tftp_root" ] && append_bool "$cfg" enable_tftp "--enable-tftp"
  588. append_bool "$cfg" tftp_no_fail "--tftp-no-fail"
  589. append_bool "$cfg" nonwildcard "--bind-dynamic"
  590. append_bool "$cfg" fqdn "--dhcp-fqdn"
  591. append_bool "$cfg" proxydnssec "--proxy-dnssec"
  592. append_bool "$cfg" localservice "--local-service"
  593. append_bool "$cfg" logdhcp "--log-dhcp"
  594. append_bool "$cfg" quietdhcp "--quiet-dhcp"
  595. append_bool "$cfg" sequential_ip "--dhcp-sequential-ip"
  596. append_bool "$cfg" allservers "--all-servers"
  597. append_bool "$cfg" noping "--no-ping"
  598.  
  599. append_parm "$cfg" logfacility "--log-facility"
  600. append_parm "$cfg" dhcpscript "--dhcp-script"
  601. append_parm "$cfg" cachesize "--cache-size"
  602. append_parm "$cfg" dnsforwardmax "--dns-forward-max"
  603. append_parm "$cfg" port "--port"
  604. append_parm "$cfg" ednspacket_max "--edns-packet-max"
  605. append_parm "$cfg" dhcpleasemax "--dhcp-lease-max"
  606. append_parm "$cfg" "queryport" "--query-port"
  607. append_parm "$cfg" "minport" "--min-port"
  608. append_parm "$cfg" "maxport" "--max-port"
  609. append_parm "$cfg" "domain" "--domain"
  610. append_parm "$cfg" "local" "--server"
  611. config_list_foreach "$cfg" "server" append_server
  612. config_list_foreach "$cfg" "address" append_address
  613. config_list_foreach "$cfg" "ipset" append_ipset
  614. config_list_foreach "$cfg" "interface" append_interface
  615. config_list_foreach "$cfg" "notinterface" append_notinterface
  616. config_list_foreach "$cfg" "addnhosts" append_addnhosts
  617. config_list_foreach "$cfg" "bogusnxdomain" append_bogusnxdomain
  618. append_parm "$cfg" "leasefile" "--dhcp-leasefile" "/tmp/dhcp.leases"
  619. append_parm "$cfg" "resolvfile" "--resolv-file" "/tmp/resolv.conf.auto"
  620. append_parm "$cfg" "serversfile" "--servers-file"
  621. append_parm "$cfg" "tftp_root" "--tftp-root"
  622. append_parm "$cfg" "dhcp_boot" "--dhcp-boot"
  623. append_parm "$cfg" "local_ttl" "--local-ttl"
  624. append_parm "$cfg" "pxe_prompt" "--pxe-prompt"
  625. config_list_foreach "$cfg" "pxe_service" append_pxe_service
  626. config_get DOMAIN "$cfg" domain
  627.  
  628. config_get_bool ADD_LOCAL_DOMAIN "$cfg" add_local_domain 1
  629. config_get_bool ADD_LOCAL_HOSTNAME "$cfg" add_local_hostname 1
  630.  
  631. config_get_bool readethers "$cfg" readethers
  632. [ "$readethers" = "1" -a \! -e "/etc/ethers" ] && touch /etc/ethers
  633.  
  634. config_get resolvfile $cfg resolvfile
  635. config_get dhcpscript $cfg dhcpscript
  636.  
  637. config_get leasefile $cfg leasefile "/tmp/dhcp.leases"
  638. [ -n "$leasefile" -a \! -e "$leasefile" ] && touch "$leasefile"
  639. config_get_bool cachelocal "$cfg" cachelocal 1
  640.  
  641. config_get_bool noresolv "$cfg" noresolv 0
  642. if [ "$noresolv" != "1" ]; then
  643. config_get resolvfile "$cfg" resolvfile "/tmp/resolv.conf.auto"
  644. # So jail doesn't complain if file missing
  645. [ -n "$resolvfile" -a \! -e "$resolvfile" ] && touch "$resolvfile"
  646. fi
  647.  
  648. config_get hostsfile "$cfg" dhcphostsfile
  649. [ -e "$hostsfile" ] && xappend "--dhcp-hostsfile=$hostsfile"
  650.  
  651. local rebind
  652. config_get_bool rebind "$cfg" rebind_protection 1
  653. [ $rebind -gt 0 ] && {
  654. log_once \
  655. "DNS rebinding protection is active," \
  656. "will discard upstream RFC1918 responses!"
  657. xappend "--stop-dns-rebind"
  658.  
  659. local rebind_localhost
  660. config_get_bool rebind_localhost "$cfg" rebind_localhost 0
  661. [ $rebind_localhost -gt 0 ] && {
  662. log_once "Allowing 127.0.0.0/8 responses"
  663. xappend "--rebind-localhost-ok"
  664. }
  665.  
  666. append_rebind_domain() {
  667. log_once "Allowing RFC1918 responses for domain $1"
  668. xappend "--rebind-domain-ok=$1"
  669. }
  670.  
  671. config_list_foreach "$cfg" rebind_domain append_rebind_domain
  672. }
  673.  
  674. config_get_bool dnssec "$cfg" dnssec 0
  675. [ "$dnssec" -gt 0 ] && {
  676. xappend "--conf-file=$TRUSTANCHORSFILE"
  677. xappend "--dnssec"
  678. [ -x /etc/init.d/sysntpd ] && {
  679. /etc/init.d/sysntpd enabled
  680. [ "$?" -ne 0 -o "$(uci_get system.ntp.enabled)" = "1" ] && {
  681. [ -f "$TIMEVALIDFILE" ] || xappend "--dnssec-no-timecheck"
  682. }
  683. }
  684. append_bool "$cfg" dnsseccheckunsigned "--dnssec-check-unsigned"
  685. }
  686.  
  687. config_get addmac "$cfg" addmac 0
  688. [ "$addmac" != "0" ] && {
  689. [ "$addmac" = "1" ] && addmac=
  690. xappend "--add-mac${addmac:+="$addmac"}"
  691. }
  692.  
  693. dhcp_option_add "$cfg" "" 0
  694.  
  695. xappend "--dhcp-broadcast=tag:needs-broadcast"
  696.  
  697. xappend "--addn-hosts=$(dirname $HOSTFILE)"
  698.  
  699. config_get dnsmasqconfdir "$cfg" confdir "/tmp/dnsmasq.d"
  700. [ ! -d "$dnsmasqconfdir" ] && mkdir -p $dnsmasqconfdir
  701. xappend "--conf-dir=$dnsmasqconfdir"
  702. xappend "--user=dnsmasq"
  703. xappend "--group=dnsmasq"
  704. echo >> $CONFIGFILE_TMP
  705.  
  706. config_get_bool enable_tftp "$cfg" enable_tftp 0
  707. [ "$enable_tftp" -gt 0 ] && {
  708. config_get tftp_root "$cfg" tftp_root
  709. append EXTRA_MOUNT $tftp_root
  710. }
  711.  
  712. config_foreach filter_dnsmasq host dhcp_host_add "$cfg"
  713. echo >> $CONFIGFILE_TMP
  714. config_foreach filter_dnsmasq boot dhcp_boot_add "$cfg"
  715. config_foreach filter_dnsmasq mac dhcp_mac_add "$cfg"
  716. config_foreach filter_dnsmasq tag dhcp_tag_add "$cfg"
  717. config_foreach filter_dnsmasq vendorclass dhcp_vendorclass_add "$cfg"
  718. config_foreach filter_dnsmasq userclass dhcp_userclass_add "$cfg"
  719. config_foreach filter_dnsmasq circuitid dhcp_circuitid_add "$cfg"
  720. config_foreach filter_dnsmasq remoteid dhcp_remoteid_add "$cfg"
  721. config_foreach filter_dnsmasq subscrid dhcp_subscrid_add "$cfg"
  722. config_foreach filter_dnsmasq match dhcp_match_add "$cfg"
  723. config_foreach filter_dnsmasq domain dhcp_domain_add "$cfg"
  724. config_foreach filter_dnsmasq hostrecord dhcp_hostrecord_add "$cfg"
  725. config_foreach filter_dnsmasq relay dhcp_relay_add "$cfg"
  726.  
  727. # add own hostname
  728. [ $ADD_LOCAL_HOSTNAME -eq 1 ] && {
  729. local lanaddr lanaddr6
  730. local ulaprefix="$(uci_get network @globals[0] ula_prefix)"
  731. local hostname="$(uci_get system @system[0] hostname Lede)"
  732.  
  733. network_get_ipaddr lanaddr "lan" && {
  734. dhcp_domain_add "" "$hostname" "$lanaddr"
  735. }
  736.  
  737. [ -n "$ulaprefix" ] && network_get_ipaddrs6 lanaddr6 "lan" && {
  738. for lanaddr6 in $lanaddr6; do
  739. case "$lanaddr6" in
  740. "${ulaprefix%%:/*}"*)
  741. dhcp_domain_add "" "$hostname" "$lanaddr6"
  742. ;;
  743. esac
  744. done
  745. }
  746. }
  747.  
  748. echo >> $CONFIGFILE_TMP
  749. config_foreach filter_dnsmasq srvhost dhcp_srv_add "$cfg"
  750. config_foreach filter_dnsmasq mxhost dhcp_mx_add "$cfg"
  751. echo >> $CONFIGFILE_TMP
  752.  
  753. config_get odhcpd_is_active odhcpd maindhcp
  754. if [ "$odhcpd_is_active" != "1" ]; then
  755. config_foreach filter_dnsmasq dhcp dhcp_add "$cfg"
  756. fi
  757.  
  758. echo >> $CONFIGFILE_TMP
  759. config_foreach filter_dnsmasq cname dhcp_cname_add "$cfg"
  760. echo >> $CONFIGFILE_TMP
  761.  
  762. echo >> $CONFIGFILE_TMP
  763. mv -f $CONFIGFILE_TMP $CONFIGFILE
  764.  
  765. [ "$resolvfile" = "/tmp/resolv.conf.auto" ] && {
  766. rm -f /tmp/resolv.conf
  767. [ $ADD_LOCAL_DOMAIN -eq 1 ] && [ -n "$DOMAIN" ] && {
  768. echo "search $DOMAIN" >> /tmp/resolv.conf
  769. }
  770. DNS_SERVERS="$DNS_SERVERS 127.0.0.1"
  771. for DNS_SERVER in $DNS_SERVERS ; do
  772. echo "nameserver $DNS_SERVER" >> /tmp/resolv.conf
  773. done
  774. }
  775.  
  776. procd_open_instance $cfg
  777. procd_set_param command $PROG -C $CONFIGFILE -k -x /var/run/dnsmasq/dnsmasq."${cfg}".pid
  778. procd_set_param file $CONFIGFILE
  779. procd_set_param respawn
  780.  
  781. local dnsmasqconffile="/etc/dnsmasq.${cfg}.conf"
  782. if [ ! -r "$dnsmasqconffile" ]; then
  783. dnsmasqconffile=/etc/dnsmasq.conf
  784. fi
  785.  
  786. procd_add_jail dnsmasq ubus log
  787. procd_add_jail_mount $CONFIGFILE $TRUSTANCHORSFILE $HOSTFILE /etc/passwd /etc/group /etc/TZ /dev/null /dev/urandom $dnsmasqconffile $dnsmasqconfdir $resolvfile $dhcpscript /etc/hosts /etc/ethers $EXTRA_MOUNT
  788. procd_add_jail_mount_rw /var/run/dnsmasq/ $leasefile
  789.  
  790. procd_close_instance
  791. }
  792.  
  793. dnsmasq_stop()
  794. {
  795. local cfg="$1"
  796.  
  797. logger guidebug "dnsmasq realstop $@"
  798. config_get resolvfile "$cfg" "resolvfile"
  799.  
  800. #relink /tmp/resolve.conf only for main instance
  801. [ "$resolvfile" = "/tmp/resolv.conf.auto" ] && {
  802. [ -f /tmp/resolv.conf ] && {
  803. rm -f /tmp/resolv.conf
  804. ln -s "$resolvfile" /tmp/resolv.conf
  805. }
  806. }
  807.  
  808. rm -f ${BASEDHCPSTAMPFILE}.${cfg}.*.dhcp
  809. }
  810.  
  811. service_triggers()
  812. {
  813. logger guidebug "dnsmasq srvtrg $@"
  814. procd_add_reload_trigger "dhcp"
  815. procd_add_raw_trigger "interface.*" 2000 /etc/init.d/dnsmasq reload
  816. }
  817.  
  818. boot()
  819. {
  820. BOOT=1
  821. logger guidebug "dnsmasq boot $@"
  822. start "$@"
  823. }
  824.  
  825. start_service() {
  826. local instance="$1"
  827. local instance_found=0
  828.  
  829. logger guidebug "dnsmasq startsrv $BOOT, $@"
  830. [ -n "$BOOT" ] && return
  831.  
  832. . /lib/functions/network.sh
  833.  
  834. config_cb() {
  835. local type="$1"
  836. local name="$2"
  837. if [ "$type" = "dnsmasq" ]; then
  838. if [ -n "$instance" -a "$instance" = "$name" ]; then
  839. instance_found=1
  840. fi
  841. fi
  842. }
  843.  
  844. config_load dhcp
  845.  
  846. if [ -n "$instance" ]; then
  847. [ "$instance_found" -gt 0 ] || return
  848. dnsmasq_start "$instance"
  849. else
  850. config_foreach dnsmasq_start dnsmasq
  851. fi
  852. }
  853.  
  854. reload_service() {
  855. logger guidebug "dnsmasq reload $@"
  856. rc_procd start_service "$@"
  857. return 0
  858. }
  859.  
  860. stop_service() {
  861. local instance="$1"
  862. local instance_found=0
  863.  
  864. logger guidebug "dnsmasq stop $@"
  865. config_cb() {
  866. local type="$1"
  867. local name="$2"
  868. if [ "$type" = "dnsmasq" ]; then
  869. if [ -n "$instance" -a "$instance" = "$name" ]; then
  870. instance_found=1
  871. fi
  872. fi
  873. }
  874.  
  875. config_load dhcp
  876.  
  877. if [ -n "$instance" ]; then
  878. [ "$instance_found" -gt 0 ] || return
  879. dnsmasq_stop "$instance"
  880. else
  881. config_foreach dnsmasq_stop dnsmasq
  882. fi
  883. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement