AdGuardHome 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. #!/bin/sh /etc/rc.common
  2. USE_PROCD=1
  3. START=95
  4. STOP=01
  5. CONFIGURATION=AdGuardHome
  6. CRON_FILE=/etc/crontabs/root
  7. EXTRA_COMMANDS="do_redirect testbackup test_crontab"
  8. EXTRA_HELP=" do_redirect 0 or 1\
  9. testbackup backup or restore\
  10. test_crontab"
  11. set_forward_dnsmasq()
  12. {
  13. local PORT="$1"
  14. addr="127.0.0.1#$PORT"
  15. OLD_SERVER="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
  16. echo $OLD_SERVER | grep "^$addr" >/dev/null 2>&1
  17. if [ $? -eq 0 ]; then
  18. return
  19. fi
  20. uci delete dhcp.@dnsmasq[0].server 2>/dev/null
  21. uci add_list dhcp.@dnsmasq[0].server=$addr
  22. for server in $OLD_SERVER; do
  23. if [ "$server" = "$addr" ]; then
  24. continue
  25. fi
  26. uci add_list dhcp.@dnsmasq[0].server=$server
  27. done
  28. uci delete dhcp.@dnsmasq[0].resolvfile 2>/dev/null
  29. uci set dhcp.@dnsmasq[0].noresolv=1
  30. uci commit dhcp
  31. /etc/init.d/dnsmasq restart
  32. }
  33. stop_forward_dnsmasq()
  34. {
  35. local OLD_PORT="$1"
  36. addr="127.0.0.1#$OLD_PORT"
  37. OLD_SERVER="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
  38. echo $OLD_SERVER | grep "^$addr" >/dev/null 2>&1
  39. if [ $? -ne 0 ]; then
  40. return
  41. fi
  42. uci del_list dhcp.@dnsmasq[0].server=$addr 2>/dev/null
  43. addrlist="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
  44. if [ -z "$addrlist" ] ; then
  45. uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto 2>/dev/null
  46. uci delete dhcp.@dnsmasq[0].noresolv 2>/dev/null
  47. fi
  48. uci commit dhcp
  49. /etc/init.d/dnsmasq restart
  50. }
  51. set_iptable()
  52. {
  53. local ipv6_server=$1
  54. local tcp_server=$2
  55. uci -q batch <<-EOF >/dev/null 2>&1
  56. delete firewall.AdGuardHome
  57. set firewall.AdGuardHome=include
  58. set firewall.AdGuardHome.type=script
  59. set firewall.AdGuardHome.path=/usr/share/AdGuardHome/firewall.start
  60. set firewall.AdGuardHome.reload=1
  61. commit firewall
  62. EOF
  63. IPS="`ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}'`"
  64. for IP in $IPS
  65. do
  66. if [ "$tcp_server" == "1" ]; then
  67. iptables -t nat -A PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
  68. fi
  69. iptables -t nat -A PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
  70. done
  71. if [ "$ipv6_server" == 0 ]; then
  72. return
  73. fi
  74. IPS="`ifconfig | grep "inet6 addr" | grep -v " fe80::" | grep -v " ::1" | grep "Global" | awk '{print $3}'`"
  75. for IP in $IPS
  76. do
  77. if [ "$tcp_server" == "1" ]; then
  78. ip6tables -t nat -A PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
  79. fi
  80. ip6tables -t nat -A PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
  81. done
  82. }
  83. clear_iptable()
  84. {
  85. uci -q batch <<-EOF >/dev/null 2>&1
  86. delete firewall.AdGuardHome
  87. commit firewall
  88. EOF
  89. local OLD_PORT="$1"
  90. local ipv6_server=$2
  91. IPS="`ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}'`"
  92. for IP in $IPS
  93. do
  94. iptables -t nat -D PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
  95. iptables -t nat -D PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
  96. done
  97. if [ "$ipv6_server" == 0 ]; then
  98. return
  99. fi
  100. echo "warn ip6tables nat mod is needed"
  101. IPS="`ifconfig | grep "inet6 addr" | grep -v " fe80::" | grep -v " ::1" | grep "Global" | awk '{print $3}'`"
  102. for IP in $IPS
  103. do
  104. ip6tables -t nat -D PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
  105. ip6tables -t nat -D PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
  106. done
  107. }
  108. service_triggers() {
  109. procd_add_reload_trigger firewall
  110. procd_add_reload_trigger "$CONFIGURATION"
  111. }
  112. get_tz()
  113. {
  114. SET_TZ=""
  115. if [ -e "/etc/localtime" ]; then
  116. return
  117. fi
  118. for tzfile in /etc/TZ /var/etc/TZ
  119. do
  120. if [ ! -e "$tzfile" ]; then
  121. continue
  122. fi
  123. tz="`cat $tzfile 2>/dev/null`"
  124. done
  125. if [ -z "$tz" ]; then
  126. return
  127. fi
  128. SET_TZ=$tz
  129. }
  130. rm_port53()
  131. {
  132. local AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1")
  133. dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
  134. if [ -z "$dnsmasq_port" ]; then
  135. dnsmasq_port="53"
  136. fi
  137. if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then
  138. if [ "$dnsmasq_port" == "53" ]; then
  139. dnsmasq_port="1745"
  140. fi
  141. elif [ "$dnsmasq_port" == "53" ]; then
  142. return
  143. fi
  144. config_editor "dns.port" "$dnsmasq_port" "$configpath"
  145. uci set dhcp.@dnsmasq[0].port="53"
  146. uci commit dhcp
  147. /etc/init.d/dnsmasq reload
  148. }
  149. use_port53()
  150. {
  151. local AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1")
  152. dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
  153. if [ -z "$dnsmasq_port" ]; then
  154. dnsmasq_port="53"
  155. fi
  156. if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then
  157. if [ "$dnsmasq_port" == "53" ]; then
  158. AdGuardHome_PORT="1745"
  159. fi
  160. elif [ "$AdGuardHome_PORT" == "53" ]; then
  161. return
  162. fi
  163. config_editor "dns.port" "53" "$configpath"
  164. uci set dhcp.@dnsmasq[0].port="$AdGuardHome_PORT"
  165. uci commit dhcp
  166. /etc/init.d/dnsmasq reload
  167. }
  168. do_redirect()
  169. {
  170. config_load "${CONFIGURATION}"
  171. local section="$CONFIGURATION"
  172. args=""
  173. ipv6_server=1
  174. tcp_server=0
  175. enabled=$1
  176. if [ "$enabled" == "1" ]; then
  177. echo -n "1">/var/run/AdGredir
  178. else
  179. echo -n "0">/var/run/AdGredir
  180. fi
  181. config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
  182. AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1")
  183. if [ -z "$AdGuardHome_PORT" ]; then
  184. AdGuardHome_PORT="0"
  185. fi
  186. config_get "redirect" "$section" "redirect" "none"
  187. config_get "old_redirect" "$section" "old_redirect" "none"
  188. config_get "old_port" "$section" "old_port" "0"
  189. config_get "old_enabled" "$section" "old_enabled" "0"
  190. uci get dhcp.@dnsmasq[0].port >/dev/null 2>&1 || uci set dhcp.@dnsmasq[0].port="53" >/dev/null 2>&1
  191. if [ "$old_enabled" = "1" -a "$old_redirect" == "exchange" ]; then
  192. AdGuardHome_PORT=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
  193. fi
  194. if [ "$old_redirect" != "$redirect" ] || [ "$old_port" != "$AdGuardHome_PORT" ] || [ "$old_enabled" = "1" -a "$enabled" = "0" ]; then
  195. if [ "$old_redirect" != "none" ]; then
  196. if [ "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then
  197. clear_iptable "$old_port" "$ipv6_server"
  198. elif [ "$old_redirect" == "dnsmasq-upstream" ]; then
  199. stop_forward_dnsmasq "$old_port"
  200. elif [ "$old_redirect" == "exchange" ]; then
  201. rm_port53
  202. fi
  203. fi
  204. elif [ "$old_enabled" = "1" -a "$enabled" = "1" ]; then
  205. if [ "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then
  206. clear_iptable "$old_port" "$ipv6_server"
  207. fi
  208. fi
  209. uci delete AdGuardHome.@AdGuardHome[0].old_redirect 2>/dev/null
  210. uci delete AdGuardHome.@AdGuardHome[0].old_port 2>/dev/null
  211. uci delete AdGuardHome.@AdGuardHome[0].old_enabled 2>/dev/null
  212. uci add_list AdGuardHome.@AdGuardHome[0].old_redirect="$redirect" 2>/dev/null
  213. uci add_list AdGuardHome.@AdGuardHome[0].old_port="$AdGuardHome_PORT" 2>/dev/null
  214. uci add_list AdGuardHome.@AdGuardHome[0].old_enabled="$enabled" 2>/dev/null
  215. uci commit AdGuardHome
  216. [ "$enabled" == "0" ] && return 1
  217. if [ "$AdGuardHome_PORT" == "0" ]; then
  218. return 1
  219. fi
  220. if [ "$redirect" = "redirect" ]; then
  221. set_iptable $ipv6_server $tcp_server
  222. elif [ "$redirect" = "dnsmasq-upstream" ]; then
  223. set_forward_dnsmasq "$AdGuardHome_PORT"
  224. elif [ "$redirect" == "exchange" -a "$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)" == "53" ]; then
  225. use_port53
  226. fi
  227. }
  228. get_filesystem()
  229. {
  230. # print out path filesystem
  231. echo $1 | awk '
  232. BEGIN{
  233. while (("mount"| getline ret) > 0)
  234. {
  235. split(ret,d);
  236. fs[d[3]]=d[5];
  237. m=index(d[1],":")
  238. if (m==0)
  239. {
  240. pt[d[3]]=d[1]
  241. }else{
  242. pt[d[3]]=substr(d[1],m+1)
  243. }}}{
  244. split($0,d,"/");
  245. if ("/" in fs)
  246. {
  247. result1=fs["/"];
  248. }
  249. if ("/" in pt)
  250. {
  251. result2=pt["/"];
  252. }
  253. for (i=2;i<=length(d);i++)
  254. {
  255. p[i]=p[i-1]"/"d[i];
  256. if (p[i] in fs)
  257. {
  258. result1=fs[p[i]];
  259. result2=pt[p[i]];
  260. }
  261. }
  262. if (result2 in fs){
  263. result=fs[result2]}
  264. else{
  265. result=result1}
  266. print(result);}'
  267. }
  268. config_editor()
  269. {
  270. awk -v yaml="$1" -v value="$2" -v file="$3" -v ro="$4" '
  271. BEGIN{split(yaml,part,"\.");s="";i=1;l=length(part);}
  272. {
  273. if (match($0,s""part[i]":"))
  274. {
  275. if (i==l)
  276. {
  277. split($0,t,": ");
  278. if (ro==""){
  279. system("sed -i '\''"FNR"c \\"t[1]": "value"'\'' "file);
  280. }else{
  281. print(t[2]);
  282. }
  283. exit;
  284. }
  285. s=s"[- ]{2}";
  286. i++;
  287. }
  288. }' $3
  289. }
  290. boot_service() {
  291. config_load "${CONFIGURATION}"
  292. config_get waitonboot $CONFIGURATION waitonboot "0"
  293. config_get_bool enabled $CONFIGURATION enabled 0
  294. if [ "$enabled" == "1" ]; then
  295. if [ "$waitonboot" == "1" ]; then
  296. do_redirect 0
  297. procd_open_instance "waitnet"
  298. procd_set_param command "/usr/share/AdGuardHome/waitnet.sh"
  299. procd_close_instance
  300. echo "no net start pinging"
  301. else
  302. start_service
  303. fi
  304. fi
  305. }
  306. testbackup(){
  307. config_load "${CONFIGURATION}"
  308. if [ "$1" == "backup" ]; then
  309. backup
  310. elif [ "$1" == "restore" ]; then
  311. restore
  312. fi
  313. }
  314. restore()
  315. {
  316. config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome"
  317. config_get backupwdpath $CONFIGURATION backupwdpath "/usr/bin/AdGuardHome"
  318. cp -u -r -f $backupwdpath/data $workdir
  319. }
  320. backup() {
  321. config_get backupwdpath $CONFIGURATION backupwdpath "/usr/bin/AdGuardHome"
  322. mkdir -p $backupwdpath/data
  323. config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome"
  324. config_get backupfile $CONFIGURATION backupfile ""
  325. for one in $backupfile;
  326. do
  327. while :
  328. do
  329. if [ -d "$backupwdpath/data/$one" ]; then
  330. cpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data 2>&1)
  331. else
  332. cpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data/$one 2>&1)
  333. fi
  334. echo "$cpret"
  335. echo "$cpret" | grep "no space left on device"
  336. if [ "$?" == "0" ]; then
  337. echo "磁盘已满,删除log重试中"
  338. del_querylog && continue
  339. rm -f -r $backupwdpath/data/filters
  340. rm -f -r $workdir/data/filters && continue
  341. echo "backup failed"
  342. fi
  343. break
  344. done
  345. done
  346. }
  347. start_service() {
  348. # Reading config
  349. config_load "${CONFIGURATION}"
  350. # update password
  351. config_get hashpass $CONFIGURATION hashpass ""
  352. if [ -n "$hashpass" ]; then
  353. config_editor "users.password" "$hashpass" "$configpath"
  354. uci set $CONFIGURATION.$CONFIGURATION.hashpass=""
  355. fi
  356. local enabled
  357. config_get_bool enabled $CONFIGURATION enabled 0
  358. # update crontab
  359. do_crontab
  360. if [ "$enabled" == "0" ]; then
  361. procd_kill $CONFIGURATION
  362. do_redirect 0
  363. return
  364. fi
  365. #what need to do before reload
  366. config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome"
  367. config_get backupfile $CONFIGURATION backupfile ""
  368. mkdir -p $workdir/data
  369. if [ -n "$backupfile" ] && [ ! -d "$workdir/data" ]; then
  370. restore
  371. fi
  372. # for overlay data-stk-oo not suppport
  373. local cwdfs=$(get_filesystem $workdir)
  374. echo "workdir is a $cwdfs filesystem"
  375. if [ "$cwdfs" == "jffs2" ]; then
  376. echo "fs error ln db to tmp $workdir $cwdfs"
  377. logger "AdGuardHome" "warning db redirect to tmp"
  378. touch $workdir/data/stats.db
  379. if [ ! -L $workdir/data/stats.db ]; then
  380. mv -f $workdir/data/stats.db /tmp/stats.db 2>/dev/null
  381. ln -s /tmp/stats.db $workdir/data/stats.db 2>/dev/null
  382. fi
  383. touch $workdir/data/sessions.db
  384. if [ ! -L $workdir/data/sessions.db ]; then
  385. mv -f $workdir/data/sessions.db /tmp/sessions.db 2>/dev/null
  386. ln -s /tmp/sessions.db $workdir/data/sessions.db 2>/dev/null
  387. fi
  388. fi
  389. local ADDITIONAL_ARGS=""
  390. config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
  391. config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome/AdGuardHome"
  392. echo -e "$configpath\n$binpath">/lib/upgrade/keep.d/luci-app-adguardhome
  393. mkdir -p ${binpath%/*}
  394. ADDITIONAL_ARGS="$ADDITIONAL_ARGS -c $configpath"
  395. ADDITIONAL_ARGS="$ADDITIONAL_ARGS -w $workdir"
  396. config_get httpport $CONFIGURATION httpport 3000
  397. ADDITIONAL_ARGS="$ADDITIONAL_ARGS -p $httpport"
  398. echo -e "$configpath\n$binpath">/lib/upgrade/keep.d/luci-app-adguardhome
  399. # hack to save config file when upgrade system
  400. config_get keepdb $CONFIGURATION keepdb 0
  401. if [ "$keepdb" -eq 1 ]; then
  402. echo -e "$workdir/data/sessions.db\n$workdir/data/stats.db\n$workdir/data/querylog.json">>/lib/upgrade/keep.d/luci-app-adguardhome
  403. fi
  404. config_get logfile $CONFIGURATION logfile ""
  405. if [ -n "$logfile" ]; then
  406. ADDITIONAL_ARGS="$ADDITIONAL_ARGS -l $logfile"
  407. fi
  408. if [ ! -f "$binpath" ]; then
  409. do_redirect 0
  410. /usr/share/AdGuardHome/update_core.sh 2>&1 >/tmp/AdGuardHome_update.log &
  411. exit 0
  412. fi
  413. config_get_bool verbose $CONFIGURATION verbose 0
  414. if [ "$verbose" -eq 1 ]; then
  415. ADDITIONAL_ARGS="$ADDITIONAL_ARGS -v"
  416. fi
  417. procd_open_instance
  418. get_tz
  419. if [ -n "$SET_TZ" ]; then
  420. procd_set_param env TZ="$SET_TZ"
  421. fi
  422. procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
  423. procd_set_param limits core="unlimited" nofile="unlimited"
  424. procd_set_param stderr 1
  425. procd_set_param command $binpath $ADDITIONAL_ARGS
  426. procd_set_param file "$configpath"
  427. procd_close_instance
  428. if [ -f "$configpath" ]; then
  429. do_redirect 1
  430. else
  431. do_redirect 0
  432. config_get "redirect" "AdGuardHome" "redirect" "none"
  433. if [ "$redirect" != "none" ]; then
  434. procd_open_instance "waitconfig"
  435. procd_set_param command "/usr/share/AdGuardHome/watchconfig.sh"
  436. procd_close_instance
  437. echo "no config start watching"
  438. fi
  439. fi
  440. echo "AdGuardHome turn on"
  441. (sleep 10 && [ -z "$(pgrep $binpath)" ] && logger "AdGuardHome" "no process in 10s cancel redirect" && do_redirect 0 )&
  442. }
  443. reload_service()
  444. {
  445. rm /var/run/AdGucitest >/dev/null 2>&1
  446. echo "AdGuardHome reloading"
  447. start
  448. }
  449. del_querylog(){
  450. local btarget=$(ls $backupwdpath/data | grep -F "querylog.json" | sort -r | head -n 1)
  451. local wtarget=$(ls $workdir/data | grep -F "querylog.json" | sort -r | head -n 1)
  452. if [ "$btarget"x == "$wtarget"x ]; then
  453. [ -z "$btarget" ] && return 1
  454. rm -f $workdir/data/$wtarget
  455. rm -f $backupwdpath/data/$btarget
  456. return 0
  457. fi
  458. if [ "$btarget" \> "$wtarget" ]; then
  459. rm -f $backupwdpath/data/$btarget
  460. return 0
  461. else
  462. rm -f $workdir/data/$wtarget
  463. return 0
  464. fi
  465. }
  466. stop_service()
  467. {
  468. config_load "${CONFIGURATION}"
  469. do_redirect 0
  470. do_crontab
  471. config_get backupfile $CONFIGURATION backupfile "0"
  472. if [ -n "$backupfile" ]; then
  473. backup
  474. fi
  475. echo "AdGuardHome turn off"
  476. echo "enabled=$enabled"
  477. }
  478. boot() {
  479. rc_procd boot_service "$@"
  480. if eval "type service_started" 2>/dev/null >/dev/null; then
  481. service_started
  482. fi
  483. }
  484. test_crontab(){
  485. config_load "${CONFIGURATION}"
  486. do_crontab
  487. }
  488. do_crontab(){
  489. config_get_bool enabled $CONFIGURATION enabled 0
  490. config_get crontab $CONFIGURATION crontab ""
  491. local findstr default cronenable replace commit
  492. local cronreload=0
  493. local commit=0
  494. findstr="/usr/share/AdGuardHome/update_core.sh"
  495. default="30 3 * * * /usr/share/AdGuardHome/update_core.sh 2>&1"
  496. [ "$enabled" == "0" ] || [ "${crontab//autoupdate/}" == "$crontab" ] && cronenable=0 || cronenable=1
  497. crontab_editor
  498. config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome"
  499. config_get lastworkdir $CONFIGURATION lastworkdir "/usr/bin/AdGuardHome"
  500. findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $workdir/data/querylog.json"
  501. [ -n "$lastworkdir" ] && findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $lastworkdir/data/querylog.json" && [ "$lastworkdir" != "$workdir" ] && replace="${lastworkdir//\//\\/}/${workdir//\//\\/}"
  502. default="0 * * * * /usr/share/AdGuardHome/tailto.sh 2000 $workdir/data/querylog.json"
  503. [ "$enabled" == "0" ] || [ "${crontab//cutquerylog/}" == "$crontab" ] && cronenable=0 || cronenable=1
  504. crontab_editor
  505. [ "$lastworkdir" != "$workdir" ] && uci set AdGuardHome.AdGuardHome.lastworkdir="$workdir" && commit=1
  506. config_get logfile $CONFIGURATION logfile ""
  507. config_get lastlogfile $CONFIGURATION lastlogfile ""
  508. findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $logfile"
  509. default="30 3 * * * /usr/share/AdGuardHome/tailto.sh 2000 $logfile"
  510. [ -n "$lastlogfile" ] && findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $lastlogfile" && [ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && replace="${lastlogfile//\//\\/}/${logfile//\//\\/}"
  511. [ "$logfile" == "syslog" ] || [ "$logfile" == "" ] || [ "$enabled" == "0" ] || [ "${crontab//cutruntimelog/}" == "$crontab" ] && cronenable=0 || cronenable=1
  512. crontab_editor
  513. [ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && uci set AdGuardHome.AdGuardHome.lastlogfile="$logfile" && commit=1
  514. findstr="/usr/share/AdGuardHome/addhost.sh"
  515. default="0 * * * * /usr/share/AdGuardHome/addhost.sh"
  516. [ "$enabled" == "0" ] || [ "${crontab//autohost/}" == "$crontab" ] && cronenable=0 || cronenable=1
  517. crontab_editor
  518. [ "$cronenable" == "0" ] && /usr/share/AdGuardHome/addhost.sh "del" "noreload" || /usr/share/AdGuardHome/addhost.sh "" "noreload"
  519. findstr="/usr/share/AdGuardHome/gfw2adg.sh"
  520. default="30 3 * * * /usr/share/AdGuardHome/gfw2adg.sh"
  521. [ "$enabled" == "0" ] || [ "${crontab//autogfw/}" == "$crontab" ] && cronenable=0 || cronenable=1
  522. crontab_editor
  523. [ "$cronreload" -gt 0 ] && /etc/init.d/cron restart
  524. [ "$commit" -gt 0 ] && uci commit AdGuardHome
  525. }
  526. crontab_editor(){
  527. #
  528. local testline reload
  529. local line="$(grep "$findstr" $CRON_FILE)"
  530. [ -n "$replace" ] && [ -n "$line" ] && eval testline="\${line//$replace}" && [ "$testline" != "$line" ] && line="$testline" && reload="1" && replace=""
  531. if [ "${line:0:1}" != "#" ]; then
  532. if [ $cronenable -eq 1 ]; then
  533. [ -z "$line" ] && line="$default" && reload="1"
  534. if [ -n "$reload" ]; then
  535. sed -i "\,$findstr,d" $CRON_FILE
  536. echo "$line" >> $CRON_FILE
  537. cronreload=$((cronreload+1))
  538. fi
  539. elif [ -n "$line" ]; then
  540. sed -i "\,$findstr,d" $CRON_FILE
  541. echo "#$line" >> $CRON_FILE
  542. cronreload=$((cronreload+1))
  543. fi
  544. else
  545. if [ $cronenable -eq 1 ]; then
  546. sed -i "\,$findstr,d" $CRON_FILE
  547. echo "${line:1}" >> $CRON_FILE
  548. cronreload=$((cronreload+1))
  549. elif [ -z "$reload" ]; then
  550. sed -i "\,$findstr,d" $CRON_FILE
  551. echo "$line" >> $CRON_FILE
  552. fi
  553. fi
  554. }