S50smartdns 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. #!/bin/sh
  2. #
  3. # Copyright (C) 2018-2020 Ruilin Peng (Nick) <[email protected]>.
  4. #
  5. # smartdns is free software: you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation, either version 3 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # smartdns is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. SMARTDNS_BIN=/opt/usr/sbin/smartdns
  18. SMARTDNS_CONF=/opt/etc/smartdns/smartdns.conf
  19. DNSMASQ_CONF="/etc/dnsmasq.conf /var/etc/dnsmasq.conf /etc/storage/dnsmasq/dnsmasq.conf"
  20. SMARTDNS_PID=/var/run/smartdns.pid
  21. SMARTDNS_PORT=535
  22. SMARTDNS_OPT=/opt/etc/smartdns/smartdns-opt.conf
  23. # workmode
  24. # 0: run as port only
  25. # 1: redirect port
  26. # 2: replace
  27. SMARTDNS_WORKMODE="1"
  28. if [ -f "$SMARTDNS_OPT" ]; then
  29. . $SMARTDNS_OPT
  30. fi
  31. set_iptable()
  32. {
  33. local redirect_tcp
  34. redirect_tcp=0;
  35. grep ^bind-tcp $SMARTDNS_CONF > /dev/null 2>&1
  36. if [ $? -eq 0 ]; then
  37. redirect_tcp=1;
  38. fi
  39. IPS="$(ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F: '{print $2}')"
  40. for IP in $IPS
  41. do
  42. if [ $redirect_tcp -eq 1 ]; then
  43. iptables -t nat -A PREROUTING -p tcp -d "$IP" --dport 53 -j REDIRECT --to-ports "$SMARTDNS_PORT" > /dev/null 2>&1
  44. fi
  45. iptables -t nat -A PREROUTING -p udp -d "$IP" --dport 53 -j REDIRECT --to-ports "$SMARTDNS_PORT" > /dev/null 2>&1
  46. done
  47. }
  48. clear_iptable()
  49. {
  50. IPS="$(ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F: '{print $2}')"
  51. for IP in $IPS
  52. do
  53. iptables -t nat -D PREROUTING -p tcp -d "$IP" --dport 53 -j REDIRECT --to-ports "$SMARTDNS_PORT" > /dev/null 2>&1
  54. iptables -t nat -D PREROUTING -p udp -d "$IP" --dport 53 -j REDIRECT --to-ports "$SMARTDNS_PORT" > /dev/null 2>&1
  55. done
  56. }
  57. get_dnsmasq_cmd()
  58. {
  59. CMD="$(ps 2>/dev/null | grep -e '[a-zA-Z]\{0,2\} \{1,\}dnsmasq' | grep -v grep 2>/dev/null)"
  60. if [ ! -z "$CMD" ]; then
  61. return
  62. fi
  63. CMD="$(ps 2>/dev/null | grep '/usr/sbin/dnsmasq' | grep -v grep 2>/dev/null)"
  64. if [ ! -z "$CMD" ]; then
  65. return
  66. fi
  67. CMD="$(ps 2>/dev/null | grep 'dnsmasq' | grep -v grep 2>/dev/null)"
  68. if [ ! -z "$CMD" ]; then
  69. return
  70. fi
  71. CMD="$(ps ax 2>/dev/null | grep -e '[a-zA-Z]\{0,2\} \{1,\}dnsmasq' | grep -v grep 2>/dev/null)"
  72. if [ ! -z "$CMD" ]; then
  73. return
  74. fi
  75. CMD="$(ps ax 2>/dev/null | grep /usr/sbin/dnsmasq | grep -v grep 2>/dev/null)"
  76. if [ ! -z "$CMD" ]; then
  77. return
  78. fi
  79. CMD="$(ps ax 2>/dev/null | grep 'dnsmasq' | grep -v grep 2>/dev/null)"
  80. if [ ! -z "$CMD" ]; then
  81. return
  82. fi
  83. }
  84. restart_dnsmasq()
  85. {
  86. local CMD=""
  87. get_dnsmasq_cmd
  88. if [ -z "$CMD" ]; then
  89. echo "cannot find dnsmasq"
  90. return 1
  91. fi
  92. PID="$(echo "$CMD" | awk '{print $1}')"
  93. if [ ! -d "/proc/$PID" ]; then
  94. echo "dnsmasq is not running"
  95. return 1
  96. fi
  97. kill -9 "$PID"
  98. DNSMASQ_CMD="$(echo "$CMD" | awk '{for(i=5; i<=NF;i++)printf $i " "}')"
  99. $DNSMASQ_CMD
  100. }
  101. get_server_ip()
  102. {
  103. CONF_FILE=$1
  104. IPS="$(ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F: '{print $2}')"
  105. for IP in $IPS
  106. do
  107. N=3
  108. while [ $N -gt 0 ]
  109. do
  110. ADDR="$(echo "$IP" | awk -F. "{for(i=1;i<="$N";i++)printf \$i\".\"}")"
  111. grep "dhcp-range=" "$CONF_FILE" | grep "$ADDR" >/dev/null 2>&1
  112. if [ $? -eq 0 ]; then
  113. SERVER_TAG="$(grep "^dhcp-range *=" "$CONF_FILE" | grep "$ADDR" | awk -F= '{print $2}' | awk -F, '{print $1}')"
  114. LOCAL_SERVER_IP="$IP"
  115. return 1
  116. fi
  117. N=$((N-1))
  118. done
  119. done
  120. return 1
  121. }
  122. set_dnsmasq_conf()
  123. {
  124. local LOCAL_SERVER_IP=""
  125. local SERVER_TAG=""
  126. local CONF_FILE=$1
  127. get_server_ip $CONF_FILE
  128. if [ "$LOCAL_SERVER_IP" ] && [ "$SERVER_TAG" ]; then
  129. grep "dhcp-option *=" "$CONF_FILE" | grep "$SERVER_TAG,6,$LOCAL_SERVER_IP" > /dev/null 2>&1
  130. if [ $? -ne 0 ]; then
  131. sed -i "/^dhcp-option *=$SERVER_TAG,6,/d" "$CONF_FILE"
  132. echo "dhcp-option=$SERVER_TAG,6,$LOCAL_SERVER_IP" >> "$CONF_FILE"
  133. RESTART_DNSMASQ=1
  134. fi
  135. fi
  136. grep "^port *=0" "$CONF_FILE" > /dev/null 2>&1
  137. if [ $? -ne 0 ]; then
  138. sed -i "/^port *=/d" "$CONF_FILE"
  139. echo "port=0" >> "$CONF_FILE"
  140. RESTART_DNSMASQ=1
  141. fi
  142. }
  143. set_dnsmasq()
  144. {
  145. local RESTART_DNSMASQ=0
  146. for conf in $DNSMASQ_CONF
  147. do
  148. if [ ! -e "$conf" ]; then
  149. continue
  150. fi
  151. set_dnsmasq_conf "$conf"
  152. done
  153. if [ $RESTART_DNSMASQ -ne 0 ]; then
  154. restart_dnsmasq
  155. fi
  156. }
  157. clear_dnsmasq_conf()
  158. {
  159. local LOCAL_SERVER_IP=""
  160. local SERVER_TAG=""
  161. local CONF_FILE=$1
  162. get_server_ip "$CONF_FILE"
  163. if [ "$LOCAL_SERVER_IP" ] && [ "$SERVER_TAG" ]; then
  164. grep "dhcp-option *=" "$CONF_FILE" | grep "$SERVER_TAG,6,$LOCAL_SERVER_IP" > /dev/null 2>&1
  165. if [ $? -eq 0 ]; then
  166. sed -i "/^dhcp-option *=$SERVER_TAG,6,/d" "$CONF_FILE"
  167. RESTART_DNSMASQ=1
  168. fi
  169. fi
  170. grep "^port *=" "$CONF_FILE" > /dev/null 2>&1
  171. if [ $? -eq 0 ]; then
  172. sed -i "/^port *=/d" "$CONF_FILE"
  173. RESTART_DNSMASQ=1
  174. fi
  175. }
  176. clear_dnsmasq()
  177. {
  178. local RESTART_DNSMASQ=0
  179. for conf in $DNSMASQ_CONF
  180. do
  181. if [ ! -e "$conf" ]; then
  182. continue
  183. fi
  184. clear_dnsmasq_conf "$conf"
  185. done
  186. if [ $RESTART_DNSMASQ -ne 0 ]; then
  187. restart_dnsmasq
  188. fi
  189. }
  190. set_smartdns_port()
  191. {
  192. if [ "$SMARTDNS_WORKMODE" = "0" ]; then
  193. return 0
  194. elif [ "$SMARTDNS_WORKMODE" = "1" ]; then
  195. sed -i "s/^\\(bind .*\\):53 *\\(.*\\)\$/\\1:$SMARTDNS_PORT \\2/g" $SMARTDNS_CONF
  196. sed -i "s/^\\(bind-tcp .*\\):53 *\\(.*\\)\$/\\1:$SMARTDNS_PORT \\2/g" $SMARTDNS_CONF
  197. elif [ "$SMARTDNS_WORKMODE" = "2" ]; then
  198. sed -i "s/^\\(bind .*\\):$SMARTDNS_PORT *\\(.*\\)\$/\\1:53 \\2/g" $SMARTDNS_CONF
  199. sed -i "s/^\\(bind-tcp .*\\):$SMARTDNS_PORT *\\(.*\\)\$/\\1:53 \\2/g" $SMARTDNS_CONF
  200. else
  201. return 1
  202. fi
  203. return 0
  204. }
  205. set_rule()
  206. {
  207. if [ "$SMARTDNS_WORKMODE" = "0" ]; then
  208. return 0
  209. elif [ "$SMARTDNS_WORKMODE" = "1" ]; then
  210. set_iptable
  211. return $?
  212. elif [ "$SMARTDNS_WORKMODE" = "2" ]; then
  213. set_dnsmasq
  214. return $?
  215. else
  216. return 1
  217. fi
  218. }
  219. clear_rule()
  220. {
  221. if [ "$SMARTDNS_WORKMODE" = "0" ]; then
  222. return 0
  223. elif [ "$SMARTDNS_WORKMODE" = "1" ]; then
  224. clear_iptable
  225. return $?
  226. elif [ "$SMARTDNS_WORKMODE" = "2" ]; then
  227. clear_dnsmasq
  228. return $?
  229. else
  230. return 1
  231. fi
  232. }
  233. get_tz()
  234. {
  235. if [ -e "/etc/localtime" ]; then
  236. return
  237. fi
  238. for tzfile in /etc/TZ /var/etc/TZ
  239. do
  240. if [ ! -e "$tzfile" ]; then
  241. continue
  242. fi
  243. tz="$(cat $tzfile 2>/dev/null)"
  244. done
  245. if [ -z "$tz" ]; then
  246. return
  247. fi
  248. export TZ=$tz
  249. }
  250. case "$1" in
  251. start)
  252. set_rule
  253. if [ $? -ne 0 ]; then
  254. exit 1
  255. fi
  256. set_smartdns_port
  257. get_tz
  258. $SMARTDNS_BIN -c $SMARTDNS_CONF -p $SMARTDNS_PID
  259. if [ $? -ne 0 ]; then
  260. clear_rule
  261. fi
  262. ;;
  263. status)
  264. pid="$(cat $SMARTDNS_PID |head -n 1 2>/dev/null)"
  265. if [ -z "$pid" ]; then
  266. echo "smartdns not running."
  267. return 0
  268. fi
  269. if [ -d "/proc/$pid" ]; then
  270. echo "smartdns running"
  271. return 0;
  272. fi
  273. echo "smartdns not running."
  274. return 0;
  275. ;;
  276. stop)
  277. clear_rule
  278. pid="$(cat "$SMARTDNS_PID" | head -n 1 2>/dev/null)"
  279. if [ -z "$pid" ]; then
  280. echo "smartdns not running."
  281. return 0
  282. fi
  283. kill -15 "$pid" 2>/dev/null
  284. SLEEP=`which usleep`
  285. SLEEPTIME=200000
  286. if [ -z "$SLEEP" ]; then
  287. SLEEP="sleep"
  288. SLEEPTIME=0.2
  289. fi
  290. N=300
  291. while [ $N -gt 0 ]
  292. do
  293. pid="$(cat "$SMARTDNS_PID" | head -n 1 2>/dev/null)"
  294. if [ -z "$pid" ]; then
  295. return 0
  296. fi
  297. if [ ! -d "/proc/$pid" ]; then
  298. return 0;
  299. fi
  300. $SLEEP $SLEEPTIME 2>/dev/null
  301. N=$((N-1))
  302. done
  303. kill -9 "$pid" 2>/dev/null
  304. ;;
  305. restart)
  306. $0 stop
  307. $0 start
  308. ;;
  309. enable)
  310. nvram set apps_state_enable=2
  311. nvram set apps_state_error=0
  312. nvram set apps_state_install=5
  313. nvram set apps_state_action=install
  314. nvram set apps_u2ec_ex=2
  315. ;;
  316. firewall-start|reload|force-reload|reconfigure)
  317. $0 restart
  318. ;;
  319. *)
  320. ;;
  321. esac