AdGuardHome 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. #!/bin/sh /etc/rc.common
  2. USE_PROCD=1
  3. START=95
  4. STOP=01
  5. CONFIGURATION=AdGuardHome
  6. EXTRA_COMMANDS="do_redirect"
  7. EXTRA_HELP=" do_redirect 0 or 1"
  8. set_forward_dnsmasq()
  9. {
  10. local PORT="$1"
  11. addr="127.0.0.1#$PORT"
  12. OLD_SERVER="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
  13. echo $OLD_SERVER | grep "^$addr" >/dev/null 2>&1
  14. if [ $? -eq 0 ]; then
  15. return
  16. fi
  17. uci delete dhcp.@dnsmasq[0].server 2>/dev/null
  18. uci add_list dhcp.@dnsmasq[0].server=$addr
  19. for server in $OLD_SERVER; do
  20. if [ "$server" = "$addr" ]; then
  21. continue
  22. fi
  23. uci add_list dhcp.@dnsmasq[0].server=$server
  24. done
  25. uci delete dhcp.@dnsmasq[0].resolvfile 2>/dev/null
  26. uci set dhcp.@dnsmasq[0].noresolv=1
  27. uci commit dhcp
  28. /etc/init.d/dnsmasq restart
  29. }
  30. stop_forward_dnsmasq()
  31. {
  32. local OLD_PORT="$1"
  33. addr="127.0.0.1#$OLD_PORT"
  34. OLD_SERVER="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
  35. echo $OLD_SERVER | grep "^$addr" >/dev/null 2>&1
  36. if [ $? -ne 0 ]; then
  37. return
  38. fi
  39. uci del_list dhcp.@dnsmasq[0].server=$addr 2>/dev/null
  40. addrlist="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
  41. if [ -z "$addrlist" ] ; then
  42. uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto 2>/dev/null
  43. uci delete dhcp.@dnsmasq[0].noresolv 2>/dev/null
  44. fi
  45. uci commit dhcp
  46. /etc/init.d/dnsmasq restart
  47. }
  48. set_iptable()
  49. {
  50. local ipv6_server=$1
  51. local tcp_server=$2
  52. IPS="`ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}'`"
  53. for IP in $IPS
  54. do
  55. if [ "$tcp_server" == "1" ]; then
  56. iptables -t nat -A PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
  57. fi
  58. iptables -t nat -A PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
  59. done
  60. if [ "$ipv6_server" == 0 ]; then
  61. return
  62. fi
  63. IPS="`ifconfig | grep "inet6 addr" | grep -v " fe80::" | grep -v " ::1" | grep "Global" | awk '{print $3}'`"
  64. for IP in $IPS
  65. do
  66. if [ "$tcp_server" == "1" ]; then
  67. ip6tables -t nat -A PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
  68. fi
  69. ip6tables -t nat -A PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
  70. done
  71. }
  72. clear_iptable()
  73. {
  74. local OLD_PORT="$1"
  75. local ipv6_server=$2
  76. IPS="`ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}'`"
  77. for IP in $IPS
  78. do
  79. iptables -t nat -D PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
  80. iptables -t nat -D PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
  81. done
  82. if [ "$ipv6_server" == 0 ]; then
  83. return
  84. fi
  85. echo "warn ip6tables nat mod is needed"
  86. IPS="`ifconfig | grep "inet6 addr" | grep -v " fe80::" | grep -v " ::1" | grep "Global" | awk '{print $3}'`"
  87. for IP in $IPS
  88. do
  89. ip6tables -t nat -D PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
  90. ip6tables -t nat -D PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
  91. done
  92. }
  93. service_triggers() {
  94. procd_add_reload_trigger firewall
  95. procd_add_reload_trigger "$CONFIGURATION"
  96. }
  97. get_tz()
  98. {
  99. SET_TZ=""
  100. if [ -e "/etc/localtime" ]; then
  101. return
  102. fi
  103. for tzfile in /etc/TZ /var/etc/TZ
  104. do
  105. if [ ! -e "$tzfile" ]; then
  106. continue
  107. fi
  108. tz="`cat $tzfile 2>/dev/null`"
  109. done
  110. if [ -z "$tz" ]; then
  111. return
  112. fi
  113. SET_TZ=$tz
  114. }
  115. rm_port53()
  116. {
  117. AdGuardHome_PORT=$(awk '/ port:/{printf($2)}' $configpath)
  118. dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
  119. if [ -z "$dnsmasq_port" ]; then
  120. dnsmasq_port="53"
  121. fi
  122. if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then
  123. if [ "$dnsmasq_port" == "53" ]; then
  124. dnsmasq_port="1745"
  125. fi
  126. elif [ "$dnsmasq_port" == "53" ]; then
  127. return
  128. fi
  129. config_editor "dns.port" "$dnsmasq_port" "$configpath"
  130. uci set dhcp.@dnsmasq[0].port="53"
  131. uci commit dhcp
  132. /etc/init.d/dnsmasq reload
  133. }
  134. use_port53()
  135. {
  136. AdGuardHome_PORT=$(awk '/ port:/{printf($2)}' $configpath)
  137. dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
  138. if [ -z "$dnsmasq_port" ]; then
  139. dnsmasq_port="53"
  140. fi
  141. if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then
  142. if [ "$dnsmasq_port" == "53" ]; then
  143. AdGuardHome_PORT="1745"
  144. fi
  145. elif [ "$AdGuardHome_PORT" == "53" ]; then
  146. return
  147. fi
  148. config_editor "dns.port" "53" "$configpath"
  149. uci set dhcp.@dnsmasq[0].port="$AdGuardHome_PORT"
  150. uci commit dhcp
  151. /etc/init.d/dnsmasq reload
  152. }
  153. do_redirect()
  154. {
  155. config_load "${CONFIGURATION}"
  156. local section="$CONFIGURATION"
  157. args=""
  158. ipv6_server=1
  159. tcp_server=0
  160. enabled=$1
  161. config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
  162. AdGuardHome_PORT=$(awk '/ port:/{printf($2)}' $configpath)
  163. if [ -z "$AdGuardHome_PORT" ]; then
  164. AdGuardHome_PORT="0"
  165. fi
  166. config_get "redirect" "$section" "redirect" "none"
  167. config_get "old_redirect" "$section" "old_redirect" "none"
  168. config_get "old_port" "$section" "old_port" "0"
  169. config_get "old_enabled" "$section" "old_enabled" "0"
  170. if [ "$old_enabled" = "1" -a "$old_redirect" == "exchange" ]; then
  171. AdGuardHome_PORT=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
  172. fi
  173. if [ "$old_redirect" != "$redirect" ] || [ "$old_port" != "$AdGuardHome_PORT" ] || [ "$old_enabled" = "1" -a "$enabled" = "0" ]; then
  174. if [ "$old_redirect" != "none" ]; then
  175. if [ "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then
  176. clear_iptable "$old_port" "$ipv6_server"
  177. elif [ "$old_redirect" == "dnsmasq-upstream" ]; then
  178. stop_forward_dnsmasq "$old_port"
  179. elif [ "$old_redirect" == "exchange" ]; then
  180. rm_port53
  181. fi
  182. fi
  183. elif [ "$old_enabled" = "1" -a "$enabled" = "1" ]; then
  184. if [ "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then
  185. clear_iptable "$old_port" "$ipv6_server"
  186. fi
  187. fi
  188. uci delete AdGuardHome.@AdGuardHome[0].old_redirect 2>/dev/null
  189. uci delete AdGuardHome.@AdGuardHome[0].old_port 2>/dev/null
  190. uci delete AdGuardHome.@AdGuardHome[0].old_enabled 2>/dev/null
  191. uci add_list AdGuardHome.@AdGuardHome[0].old_redirect="$redirect" 2>/dev/null
  192. uci add_list AdGuardHome.@AdGuardHome[0].old_port="$AdGuardHome_PORT" 2>/dev/null
  193. uci add_list AdGuardHome.@AdGuardHome[0].old_enabled="$enabled" 2>/dev/null
  194. uci commit AdGuardHome
  195. [ "$enabled" -gt 0 ] || return 1
  196. if [ "$AdGuardHome_PORT" == "0" ]; then
  197. return 1
  198. fi
  199. if [ "$redirect" = "redirect" ]; then
  200. set_iptable $ipv6_server $tcp_server
  201. elif [ "$redirect" = "dnsmasq-upstream" ]; then
  202. set_forward_dnsmasq "$AdGuardHome_PORT"
  203. elif [ "$redirect" == "exchange" -a "$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)" == "53" ]; then
  204. use_port53
  205. fi
  206. }
  207. get_filesystem()
  208. {
  209. # print out path filesystem
  210. echo $1 | awk '
  211. BEGIN{
  212. while (("mount"| getline ret) > 0)
  213. {
  214. split(ret,d);
  215. fs[d[3]]=d[5];
  216. m=index(d[1],":")
  217. if (m==0)
  218. {
  219. pt[d[3]]=d[1]
  220. }else{
  221. pt[d[3]]=substr(d[1],m+1)
  222. }}}{
  223. split($0,d,"/");
  224. if ("/" in fs)
  225. {
  226. result1=fs["/"];
  227. }
  228. if ("/" in pt)
  229. {
  230. result2=pt["/"];
  231. }
  232. for (i=2;i<=length(d);i++)
  233. {
  234. p[i]=p[i-1]"/"d[i];
  235. if (p[i] in fs)
  236. {
  237. result1=fs[p[i]];
  238. result2=pt[p[i]];
  239. }
  240. }
  241. if (result2 in fs){
  242. result=fs[result2]}
  243. else{
  244. result=result1}
  245. print(result);}'
  246. }
  247. config_editor()
  248. {
  249. awk -v yaml="$1" -v value="$2" -v file="$3" '
  250. BEGIN{split(yaml,part,"\.");s="";i=1;l=length(part);}
  251. {
  252. if (match($0,s""part[i]))
  253. {
  254. if (i==l)
  255. {
  256. split($0,t,":");
  257. system("sed -i '\''"FNR"c \\"t[1]": "value"'\'' "file);
  258. exit;
  259. }
  260. s=s"[- ]{2}";
  261. i++;
  262. }
  263. }' $3
  264. }
  265. start_service() {
  266. # Reading config
  267. config_load "${CONFIGURATION}"
  268. config_get hashpass $CONFIGURATION hashpass ""
  269. if [ ! -z "$hashpass" ]; then
  270. config_editor "users.password" "$hashpass" "$configpath"
  271. uci set $CONFIGURATION.$CONFIGURATION.hashpass=""
  272. fi
  273. local enabled
  274. config_get_bool enabled $CONFIGURATION enabled 0
  275. if [ "$enabled" == "1" ]; then
  276. local ADDITIONAL_ARGS=""
  277. config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
  278. config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome/AdGuardHome"
  279. echo -e "$configpath\n$binpath">/lib/upgrade/keep.d/luci-app-adguardhome
  280. mkdir -p ${binpath%/*}
  281. ADDITIONAL_ARGS="$ADDITIONAL_ARGS -c $configpath"
  282. config_get httpport $CONFIGURATION httpport 3000
  283. ADDITIONAL_ARGS="$ADDITIONAL_ARGS -p $httpport"
  284. config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome"
  285. ADDITIONAL_ARGS="$ADDITIONAL_ARGS -w $workdir"
  286. mkdir -p $workdir/data
  287. echo -e "$configpath\n$binpath">/lib/upgrade/keep.d/luci-app-adguardhome
  288. # hack to save config file when upgrade system
  289. config_get keepdb $CONFIGURATION keepdb 0
  290. if [ "$keepdb" -eq 1 ]; then
  291. echo -e "$workdir/data/sessions.db\n$workdir/data/stats.db\n$workdir/data/querylog.json">>/lib/upgrade/keep.d/luci-app-adguardhome
  292. fi
  293. config_get logfile $CONFIGURATION logfile ""
  294. if [ ! -z "$logfile" ]; then
  295. ADDITIONAL_ARGS="$ADDITIONAL_ARGS -l $logfile"
  296. fi
  297. if [ ! -f "$binpath" ]; then
  298. do_redirect 0
  299. rm /var/run/update_core_error 2>/dev/null
  300. touch /var/run/update_core
  301. sh /usr/share/AdGuardHome/update_core.sh 2>&1 >/tmp/AdGuardHome_update.log || touch /var/run/update_core_error
  302. rm /var/run/update_core
  303. exit 0
  304. fi
  305. config_get_bool verbose $CONFIGURATION verbose 0
  306. if [ "$verbose" -eq 1 ]; then
  307. ADDITIONAL_ARGS="$ADDITIONAL_ARGS -v"
  308. fi
  309. # for overlay data-stk-oo not suppport
  310. local cwdfs=$(get_filesystem $workdir)
  311. echo "workdir is a $cwdfs filesystem"
  312. if [ "$cwdfs" == "jffs2" ]; then
  313. echo "fs error ln db to tmp $workdir $cwdfs"
  314. logger "AdGuardHome" "warning db redirect to tmp"
  315. touch $workdir/data/stats.db
  316. if [ ! -L $workdir/data/stats.db ]; then
  317. mv -f $workdir/data/stats.db /tmp/stats.db
  318. ln -s /tmp/stats.db $workdir/data/stats.db
  319. fi
  320. touch $workdir/data/sessions.db
  321. if [ ! -L $workdir/data/sessions.db ]; then
  322. mv -f $workdir/data/sessions.db /tmp/sessions.db
  323. ln -s /tmp/sessions.db $workdir/data/sessions.db
  324. fi
  325. fi
  326. procd_open_instance
  327. get_tz
  328. if [ ! -z "$SET_TZ" ]; then
  329. procd_set_param env TZ="$SET_TZ"
  330. fi
  331. procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
  332. procd_set_param limits core="unlimited"
  333. procd_set_param stderr 1
  334. # pass config to script on start
  335. procd_set_param command $binpath $ADDITIONAL_ARGS
  336. procd_set_param file "$configpath"
  337. procd_set_param file "/etc/config/AdGuardHome"
  338. procd_close_instance
  339. if [ -f "$configpath" ]; then
  340. do_redirect 1
  341. else
  342. do_redirect 0
  343. config_get "redirect" "AdGuardHome" "redirect" "none"
  344. if [ "$redirect" != "none" ]; then
  345. procd_open_instance "waitconfig"
  346. procd_set_param command "/usr/share/AdGuardHome/watchconfig.sh"
  347. procd_close_instance
  348. fi
  349. fi
  350. echo "AdGuardHome turn on"
  351. (sleep 10 && [ -z "$(pgrep $binpath)" ] && do_redirect 0 )&
  352. fi
  353. }
  354. reload_service()
  355. {
  356. config_load "${CONFIGURATION}"
  357. echo "AdGuardHome reloading"
  358. config_get_bool enabled $CONFIGURATION enabled 0
  359. procd_send_signal $CONFIGURATION
  360. if [ "$enabled" == "0" ]; then
  361. do_redirect 0
  362. fi
  363. start
  364. echo "enabled=$enabled"
  365. }
  366. stop_service()
  367. {
  368. config_load "${CONFIGURATION}"
  369. do_redirect 0
  370. procd_send_signal $CONFIGURATION
  371. echo "AdGuardHome turn off"
  372. echo "enabled=$enabled"
  373. }