AdGuardHome 8.6 KB

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