AdGuardHome 18 KB

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