AdGuardHome 16 KB

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