AdGuardHome 18 KB

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