AdGuardHome 8.5 KB

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