mirror of
https://github.com/caiwx86/small-packages.git
synced 2026-11-05 01:44:24 +08:00
691 lines
19 KiB
Bash
Executable File
691 lines
19 KiB
Bash
Executable File
#!/bin/sh /etc/rc.common
|
|
|
|
USE_PROCD=1
|
|
|
|
START=95
|
|
STOP=01
|
|
|
|
CONFIGURATION=AdGuardHome
|
|
CRON_FILE=/etc/crontabs/root
|
|
|
|
extra_command "do_redirect" "0 or 1"
|
|
extra_command "testbackup" "backup or restore"
|
|
extra_command "test_crontab"
|
|
extra_command "force_reload"
|
|
extra_command "isrunning"
|
|
|
|
set_forward_dnsmasq()
|
|
{
|
|
local PORT="$1"
|
|
local addr="127.0.0.1#$PORT"
|
|
local OLD_SERVER="$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)"
|
|
echo "$OLD_SERVER" | grep -q "^$addr"
|
|
[ $? -eq 0 ] && return
|
|
|
|
uci delete dhcp.@dnsmasq[0].server 2>/dev/null
|
|
uci add_list dhcp.@dnsmasq[0].server="$addr"
|
|
for server in $OLD_SERVER; do
|
|
[ "$server" = "$addr" ] && continue
|
|
done
|
|
uci delete dhcp.@dnsmasq[0].resolvfile 2>/dev/null
|
|
uci set dhcp.@dnsmasq[0].noresolv=1
|
|
uci commit dhcp
|
|
/etc/init.d/dnsmasq restart
|
|
}
|
|
|
|
stop_forward_dnsmasq()
|
|
{
|
|
local OLD_PORT="$1"
|
|
local addr="127.0.0.1#$OLD_PORT"
|
|
local OLD_SERVER="$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)"
|
|
echo "$OLD_SERVER" | grep -q "^$addr"
|
|
[ $? -ne 0 ] && return
|
|
|
|
uci del_list dhcp.@dnsmasq[0].server="$addr" 2>/dev/null
|
|
local addrlist="$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)"
|
|
if [ -z "$addrlist" ]; then
|
|
uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.d/resolv.conf.auto 2>/dev/null
|
|
uci delete dhcp.@dnsmasq[0].noresolv 2>/dev/null
|
|
fi
|
|
uci commit dhcp
|
|
/etc/init.d/dnsmasq restart
|
|
}
|
|
|
|
set_iptable()
|
|
{
|
|
local ipv6_server="$1"
|
|
local tcp_server="$2"
|
|
|
|
uci -q batch <<-EOF >/dev/null 2>&1
|
|
delete firewall.AdGuardHome
|
|
set firewall.AdGuardHome=include
|
|
set firewall.AdGuardHome.type=script
|
|
set firewall.AdGuardHome.path=/usr/share/AdGuardHome/firewall.start
|
|
set firewall.AdGuardHome.reload=1
|
|
commit firewall
|
|
EOF
|
|
|
|
local IPS="$(ip -4 addr show | grep inet | grep -v ':' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)"
|
|
for IP in $IPS; do
|
|
[ -z "$IP" ] && continue
|
|
iptables -t nat -I PREROUTING -p udp -d "$IP" --dport 53 -j REDIRECT --to-ports "$AdGuardHome_PORT" >/dev/null 2>&1
|
|
[ "$tcp_server" = "1" ] && iptables -t nat -I PREROUTING -p tcp -d "$IP" --dport 53 -j REDIRECT --to-ports "$AdGuardHome_PORT" >/dev/null 2>&1
|
|
done
|
|
|
|
[ "$ipv6_server" = "0" ] && return
|
|
|
|
IPS="$(ip -6 addr show | grep inet6 | grep -v 'fe80::' | grep -v '::1' | grep 'Global' | awk '{print $2}' | cut -d'/' -f1)"
|
|
for IP in $IPS; do
|
|
[ -z "$IP" ] && continue
|
|
ip6tables -t nat -I PREROUTING -p udp -d "$IP" --dport 53 -j REDIRECT --to-ports "$AdGuardHome_PORT" >/dev/null 2>&1
|
|
[ "$tcp_server" = "1" ] && ip6tables -t nat -I PREROUTING -p tcp -d "$IP" --dport 53 -j REDIRECT --to-ports "$AdGuardHome_PORT" >/dev/null 2>&1
|
|
done
|
|
}
|
|
|
|
clear_iptable()
|
|
{
|
|
uci -q batch <<-EOF >/dev/null 2>&1
|
|
delete firewall.AdGuardHome
|
|
commit firewall
|
|
EOF
|
|
|
|
local OLD_PORT="$1"
|
|
local ipv6_server="$2"
|
|
local IPS="$(ip -4 addr show | grep inet | grep -v ':' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)"
|
|
for IP in $IPS; do
|
|
[ -z "$IP" ] && continue
|
|
iptables -t nat -D PREROUTING -p udp -d "$IP" --dport 53 -j REDIRECT --to-ports "$OLD_PORT" >/dev/null 2>&1
|
|
iptables -t nat -D PREROUTING -p tcp -d "$IP" --dport 53 -j REDIRECT --to-ports "$OLD_PORT" >/dev/null 2>&1
|
|
done
|
|
|
|
[ "$ipv6_server" = "0" ] && return
|
|
echo "warn ip6tables nat mod is needed"
|
|
IPS="$(ip -6 addr show | grep inet6 | grep -v 'fe80::' | grep -v '::1' | grep 'Global' | awk '{print $2}' | cut -d'/' -f1)"
|
|
for IP in $IPS; do
|
|
[ -z "$IP" ] && continue
|
|
ip6tables -t nat -D PREROUTING -p udp -d "$IP" --dport 53 -j REDIRECT --to-ports "$OLD_PORT" >/dev/null 2>&1
|
|
ip6tables -t nat -D PREROUTING -p tcp -d "$IP" --dport 53 -j REDIRECT --to-ports "$OLD_PORT" >/dev/null 2>&1
|
|
done
|
|
}
|
|
|
|
service_triggers() {
|
|
procd_add_reload_trigger "$CONFIGURATION"
|
|
[ "$(uci get AdGuardHome.AdGuardHome.redirect 2>/dev/null)" = "redirect" ] && procd_add_reload_trigger firewall
|
|
}
|
|
|
|
isrunning(){
|
|
config_load "${CONFIGURATION}"
|
|
_isrunning
|
|
local r=$?
|
|
if [ "$r" = "0" ]; then
|
|
echo "running"
|
|
elif [ "$r" = "1" ]; then
|
|
echo "not run"
|
|
else
|
|
echo "no bin"
|
|
fi
|
|
return $r
|
|
}
|
|
|
|
_isrunning(){
|
|
config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome"
|
|
[ ! -f "$binpath" ] && return 2
|
|
# 用进程名匹配,避免 pgrep -f 自匹配
|
|
pgrep "${binpath##*/}" >/dev/null 2>&1 && return 0
|
|
return 1
|
|
}
|
|
|
|
force_reload(){
|
|
config_load "${CONFIGURATION}"
|
|
if _isrunning; then
|
|
procd_send_signal "$CONFIGURATION"
|
|
else
|
|
start
|
|
fi
|
|
}
|
|
|
|
get_tz()
|
|
{
|
|
SET_TZ=""
|
|
|
|
[ -e "/etc/localtime" ] && return
|
|
|
|
for tzfile in /etc/TZ /var/etc/TZ; do
|
|
[ ! -e "$tzfile" ] && continue
|
|
tz="$(cat "$tzfile" 2>/dev/null)"
|
|
done
|
|
|
|
[ -z "$tz" ] && return
|
|
SET_TZ="$tz"
|
|
}
|
|
|
|
rm_port53()
|
|
{
|
|
local AdGuardHome_PORT
|
|
AdGuardHome_PORT="$(config_editor "dns.port" "" "$configpath" "1")"
|
|
local dnsmasq_port="$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)"
|
|
[ -z "$dnsmasq_port" ] && dnsmasq_port="53"
|
|
|
|
if [ "$dnsmasq_port" = "$AdGuardHome_PORT" ]; then
|
|
[ "$dnsmasq_port" = "53" ] && dnsmasq_port="1745"
|
|
elif [ "$dnsmasq_port" = "53" ]; then
|
|
return
|
|
fi
|
|
|
|
config_editor "dns.port" "$dnsmasq_port" "$configpath"
|
|
uci set dhcp.@dnsmasq[0].port="53"
|
|
uci commit dhcp
|
|
|
|
config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome"
|
|
local binname="${binpath##*/}"
|
|
pkill -TERM "$binname" 2>/dev/null
|
|
sleep 2
|
|
pkill -KILL "$binname" 2>/dev/null
|
|
/etc/init.d/dnsmasq restart
|
|
}
|
|
|
|
use_port53()
|
|
{
|
|
local AdGuardHome_PORT
|
|
AdGuardHome_PORT="$(config_editor "dns.port" "" "$configpath" "1")"
|
|
local dnsmasq_port="$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)"
|
|
[ -z "$dnsmasq_port" ] && dnsmasq_port="53"
|
|
# AGH 端口未配置或无法读取时,使用默认 1745 作为 dnsmasq 的新端口
|
|
[ -z "$AdGuardHome_PORT" ] && AdGuardHome_PORT="1745"
|
|
|
|
if [ "$dnsmasq_port" = "$AdGuardHome_PORT" ]; then
|
|
[ "$dnsmasq_port" = "53" ] && AdGuardHome_PORT="1745"
|
|
elif [ "$AdGuardHome_PORT" = "53" ]; then
|
|
return
|
|
fi
|
|
|
|
config_editor "dns.port" "53" "$configpath"
|
|
uci set dhcp.@dnsmasq[0].port="$AdGuardHome_PORT"
|
|
uci commit dhcp
|
|
/etc/init.d/dnsmasq reload
|
|
}
|
|
|
|
do_redirect()
|
|
{
|
|
config_load "${CONFIGURATION}"
|
|
_do_redirect "$1"
|
|
}
|
|
|
|
_do_redirect()
|
|
{
|
|
local section="$CONFIGURATION"
|
|
ipv6_server=1
|
|
tcp_server=0
|
|
local enabled="$1"
|
|
|
|
if [ "$enabled" = "1" ]; then
|
|
echo -n "1" > /var/run/AdGredir
|
|
else
|
|
echo -n "0" > /var/run/AdGredir
|
|
fi
|
|
|
|
config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
|
|
AdGuardHome_PORT="$(config_editor "dns.port" "" "$configpath" "1")"
|
|
|
|
[ ! -s "$configpath" ] && cp -f /usr/share/AdGuardHome/AdGuardHome_template.yaml "$configpath"
|
|
[ -z "$AdGuardHome_PORT" ] && AdGuardHome_PORT="0"
|
|
|
|
config_get redirect "$section" redirect "none"
|
|
config_get old_redirect "$section" old_redirect "none"
|
|
config_get old_port "$section" old_port "0"
|
|
config_get old_enabled "$section" old_enabled "0"
|
|
|
|
uci get dhcp.@dnsmasq[0].port >/dev/null 2>&1 || uci set dhcp.@dnsmasq[0].port="53" >/dev/null 2>&1
|
|
|
|
if [ "$old_enabled" = "1" ] && [ "$old_redirect" = "exchange" ]; then
|
|
AdGuardHome_PORT="$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)"
|
|
fi
|
|
|
|
if [ "$old_redirect" != "$redirect" ] || [ "$old_port" != "$AdGuardHome_PORT" ] || { [ "$old_enabled" = "1" ] && [ "$enabled" = "0" ]; }; then
|
|
if [ "$old_redirect" != "none" ]; then
|
|
if [ "$old_redirect" = "redirect" ] && [ "$old_port" != "0" ]; then
|
|
clear_iptable "$old_port" "$ipv6_server"
|
|
elif [ "$old_redirect" = "dnsmasq-upstream" ]; then
|
|
stop_forward_dnsmasq "$old_port"
|
|
elif [ "$old_redirect" = "exchange" ]; then
|
|
rm_port53
|
|
fi
|
|
fi
|
|
elif [ "$old_enabled" = "1" ] && [ "$enabled" = "1" ]; then
|
|
if [ "$old_redirect" = "redirect" ] && [ "$old_port" != "0" ]; then
|
|
clear_iptable "$old_port" "$ipv6_server"
|
|
fi
|
|
fi
|
|
|
|
uci delete AdGuardHome.@AdGuardHome[0].old_redirect 2>/dev/null
|
|
uci delete AdGuardHome.@AdGuardHome[0].old_port 2>/dev/null
|
|
uci delete AdGuardHome.@AdGuardHome[0].old_enabled 2>/dev/null
|
|
uci add_list AdGuardHome.@AdGuardHome[0].old_redirect="$redirect" 2>/dev/null
|
|
uci add_list AdGuardHome.@AdGuardHome[0].old_port="$AdGuardHome_PORT" 2>/dev/null
|
|
uci add_list AdGuardHome.@AdGuardHome[0].old_enabled="$enabled" 2>/dev/null
|
|
uci commit AdGuardHome
|
|
|
|
[ "$enabled" = "0" ] && return 1
|
|
[ "$AdGuardHome_PORT" = "0" ] && return 1
|
|
|
|
if [ "$redirect" = "redirect" ]; then
|
|
set_iptable "$ipv6_server" "$tcp_server"
|
|
elif [ "$redirect" = "dnsmasq-upstream" ]; then
|
|
set_forward_dnsmasq "$AdGuardHome_PORT"
|
|
elif [ "$redirect" = "exchange" ] && [ "$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)" = "53" ]; then
|
|
use_port53
|
|
fi
|
|
}
|
|
|
|
get_filesystem()
|
|
{
|
|
local path="$1"
|
|
local mntpt=""
|
|
local fstype=""
|
|
|
|
while IFS= read -r line; do
|
|
case "$line" in
|
|
/dev/root|/dev/ubi0*|/dev/mtdblock*)
|
|
continue
|
|
;;
|
|
esac
|
|
local mp="$(echo "$line" | awk '{print $2}')"
|
|
local fs="$(echo "$line" | awk '{print $3}')"
|
|
case "$path" in
|
|
"$mp"*)
|
|
fstype="$fs"
|
|
mntpt="$mp"
|
|
break
|
|
;;
|
|
esac
|
|
done < /proc/mounts
|
|
|
|
if [ -z "$mntpt" ]; then
|
|
mntpt="/"
|
|
fstype="$(awk '$2=="/" {print $3}' /proc/mounts)"
|
|
fi
|
|
|
|
echo "$fstype"
|
|
}
|
|
|
|
config_editor()
|
|
{
|
|
local yaml="$1"
|
|
local value="$2"
|
|
local file="$3"
|
|
local ro="$4"
|
|
|
|
if [ "$ro" = "1" ]; then
|
|
awk -v yaml="$yaml" '
|
|
BEGIN {
|
|
split(yaml, part, "\\.")
|
|
i = 1
|
|
l = length(part)
|
|
s = ""
|
|
}
|
|
{
|
|
if (match($0, s "" part[i] ":")) {
|
|
if (i == l) {
|
|
sub(/^[^:]+: */, "")
|
|
print
|
|
exit
|
|
}
|
|
s = s "[- ]{2}"
|
|
i++
|
|
}
|
|
}' "$file"
|
|
else
|
|
# 安全写入:用 sed 只改匹配行,不改其他内容
|
|
# yaml 路径如 "dns.port" → 匹配带缩进的 "port:" 行
|
|
local last_key
|
|
last_key="${yaml##*.}"
|
|
if grep -qE "^[[:space:]]*${last_key}:" "$file" 2>/dev/null; then
|
|
sed -i "s|^\\([[:space:]]*${last_key}:\\).*|\\1 ${value}|" "$file"
|
|
else
|
|
echo "${last_key}: ${value}" >> "$file"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
boot_service() {
|
|
rm -f /var/run/AdGserverdis >/dev/null 2>&1
|
|
config_load "${CONFIGURATION}"
|
|
config_get waitonboot $CONFIGURATION waitonboot "0"
|
|
config_get_bool enabled $CONFIGURATION enabled 0
|
|
config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome"
|
|
|
|
[ -f "$binpath" ] && start_service
|
|
|
|
if [ "$enabled" = "1" ] && [ "$waitonboot" = "1" ]; then
|
|
procd_open_instance
|
|
procd_set_param command "/usr/share/AdGuardHome/waitnet.sh"
|
|
procd_close_instance
|
|
echo "AdGuardHome: waiting for network..."
|
|
fi
|
|
}
|
|
|
|
testbackup(){
|
|
config_load "${CONFIGURATION}"
|
|
if [ "$1" = "backup" ]; then
|
|
backup
|
|
elif [ "$1" = "restore" ]; then
|
|
restore
|
|
fi
|
|
}
|
|
|
|
restore()
|
|
{
|
|
config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome"
|
|
config_get backupwdpath $CONFIGURATION backupwdpath "/etc/AdGuardHome"
|
|
[ -d "$backupwdpath/data" ] && cp -u -r -f "$backupwdpath/data" "$workdir/"
|
|
}
|
|
|
|
backup() {
|
|
config_get backupwdpath $CONFIGURATION backupwdpath "/etc/AdGuardHome"
|
|
mkdir -p "$backupwdpath/data"
|
|
config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome"
|
|
config_get backupfile $CONFIGURATION backupfile ""
|
|
|
|
for one in $backupfile; do
|
|
while : ; do
|
|
local cpret
|
|
if [ -d "$backupwdpath/data/$one" ]; then
|
|
cpret="$(cp -u -r -f "$workdir/data/$one" "$backupwdpath/data" 2>&1)"
|
|
else
|
|
cpret="$(cp -u -r -f "$workdir/data/$one" "$backupwdpath/data/$one" 2>&1)"
|
|
fi
|
|
echo "$cpret"
|
|
echo "$cpret" | grep -q "no space left on device"
|
|
if [ $? -eq 0 ]; then
|
|
echo "disk full, deleting querylog and retrying..."
|
|
del_querylog && continue
|
|
rm -rf "$backupwdpath/data/filters"
|
|
rm -rf "$workdir/data/filters" && continue
|
|
echo "backup failed"
|
|
fi
|
|
break
|
|
done
|
|
done
|
|
}
|
|
|
|
start_service() {
|
|
rm -f /var/run/AdGserverdis >/dev/null 2>&1
|
|
config_load "${CONFIGURATION}"
|
|
|
|
config_get hashpass $CONFIGURATION hashpass ""
|
|
config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
|
|
|
|
if [ -n "$hashpass" ]; then
|
|
config_editor "users.password" "$hashpass" "$configpath"
|
|
uci set "$CONFIGURATION"."$CONFIGURATION".hashpass=""
|
|
uci commit AdGuardHome
|
|
fi
|
|
|
|
local enabled
|
|
config_get_bool enabled $CONFIGURATION enabled 0
|
|
|
|
do_crontab
|
|
|
|
if [ "$enabled" = "0" ]; then
|
|
_do_redirect 0
|
|
local binpid
|
|
config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome"
|
|
# 用进程名匹配,避免 pgrep -f 自匹配
|
|
binpid=$(pgrep "${binpath##*/}" 2>/dev/null | head -1)
|
|
if [ -n "$binpid" ]; then
|
|
kill -TERM "$binpid" 2>/dev/null
|
|
sleep 1
|
|
kill -KILL "$binpid" 2>/dev/null
|
|
fi
|
|
return
|
|
fi
|
|
|
|
config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome"
|
|
config_get backupfile $CONFIGURATION backupfile ""
|
|
mkdir -p "$workdir/data"
|
|
|
|
if [ -n "$backupfile" ] && [ ! -d "$workdir/data" ]; then
|
|
restore
|
|
fi
|
|
|
|
local cwdfs
|
|
cwdfs="$(get_filesystem "$workdir")"
|
|
echo "AdGuardHome: workdir is on $cwdfs filesystem"
|
|
if [ "$cwdfs" = "jffs2" ]; then
|
|
logger -t AdGuardHome -p daemon.warn "jffs2 detected, redirecting db to tmp"
|
|
mkdir -p /tmp/adg_tmp
|
|
for db in stats.db sessions.db; do
|
|
touch "$workdir/data/$db"
|
|
[ ! -L "$workdir/data/$db" ] && mv -f "$workdir/data/$db" "/tmp/adg_tmp/$db" 2>/dev/null
|
|
[ ! -e "/tmp/adg_tmp/$db" ] && touch "/tmp/adg_tmp/$db"
|
|
[ -f "/tmp/adg_tmp/$db" ] && ln -sf "/tmp/adg_tmp/$db" "$workdir/data/$db"
|
|
done
|
|
fi
|
|
|
|
local ADDITIONAL_ARGS=""
|
|
config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome"
|
|
mkdir -p "${binpath%/*}"
|
|
|
|
ADDITIONAL_ARGS="-c $configpath -w $workdir"
|
|
config_get httpport $CONFIGURATION httpport 3000
|
|
ADDITIONAL_ARGS="$ADDITIONAL_ARGS -p $httpport"
|
|
|
|
config_get upprotect $CONFIGURATION upprotect ""
|
|
if [ -n "$upprotect" ]; then
|
|
{
|
|
for item in $upprotect; do
|
|
echo "$item" | sed 's/\\n/\n/g'
|
|
done
|
|
} > /lib/upgrade/keep.d/luci-app-adguardhome
|
|
fi
|
|
|
|
config_get logfile $CONFIGURATION logfile ""
|
|
[ -n "$logfile" ] && ADDITIONAL_ARGS="$ADDITIONAL_ARGS -l $logfile"
|
|
|
|
if [ ! -f "$binpath" ]; then
|
|
_do_redirect 0
|
|
/usr/share/AdGuardHome/update_core.sh >/tmp/AdGuardHome_update.log 2>&1 &
|
|
exit 0
|
|
fi
|
|
|
|
config_get_bool verbose $CONFIGURATION verbose 0
|
|
[ "$verbose" -eq 1 ] && ADDITIONAL_ARGS="$ADDITIONAL_ARGS -v"
|
|
|
|
config_get user $CONFIGURATION user ""
|
|
config_get group $CONFIGURATION group ""
|
|
config_get gc $CONFIGURATION gc "0"
|
|
config_get maxprocs $CONFIGURATION maxprocs "0"
|
|
config_get memlimit $CONFIGURATION memlimit "0"
|
|
|
|
procd_open_instance
|
|
get_tz
|
|
[ -n "$SET_TZ" ] && procd_set_param env TZ="$SET_TZ"
|
|
procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
|
|
procd_set_param limits core="unlimited" nofile="65535 65535"
|
|
procd_set_param stderr 1
|
|
[ -n "$user" ] && procd_set_param user "$user"
|
|
[ -n "$group" ] && procd_set_param group "$group"
|
|
[ "$gc" != "0" ] && procd_set_param env GOGC="$gc"
|
|
[ "$maxprocs" != "0" ] && procd_set_param env GOMAXPROCS="$maxprocs"
|
|
[ -n "$memlimit" ] && [ "$memlimit" != "0" ] && procd_set_param env GOMEMLIMIT="${memlimit}MiB"
|
|
|
|
# DynamicList 写入 uci 是 `list jail_mount '...'` 格式
|
|
config_list_foreach $CONFIGURATION jail_mount procd_add_jail_mount
|
|
config_list_foreach $CONFIGURATION jail_mount_rw procd_add_jail_mount_rw
|
|
|
|
# 兼容旧的 newline-separated `option jail_mount '...'` 格式(迁移期)
|
|
local jm jmrw
|
|
jm="$(uci -q get AdGuardHome.AdGuardHome.jail_mount 2>/dev/null)"
|
|
case "$jm" in
|
|
*$'\n'*)
|
|
printf '%s\n' "$jm" | while IFS= read -r mp; do
|
|
[ -n "$mp" ] && procd_add_jail_mount "$mp"
|
|
done
|
|
;;
|
|
esac
|
|
jmrw="$(uci -q get AdGuardHome.AdGuardHome.jail_mount_rw 2>/dev/null)"
|
|
case "$jmrw" in
|
|
*$'\n'*)
|
|
printf '%s\n' "$jmrw" | while IFS= read -r mp; do
|
|
[ -n "$mp" ] && procd_add_jail_mount_rw "$mp"
|
|
done
|
|
;;
|
|
esac
|
|
|
|
procd_set_param command $binpath $ADDITIONAL_ARGS
|
|
procd_set_param file "$configpath" "/etc/hosts" "/etc/config/AdGuardHome"
|
|
procd_close_instance
|
|
|
|
if [ -f "$configpath" ]; then
|
|
_do_redirect 1
|
|
else
|
|
_do_redirect 0
|
|
config_get redirect "$CONFIGURATION" redirect "none"
|
|
if [ "$redirect" != "none" ]; then
|
|
procd_open_instance
|
|
procd_set_param command "/usr/share/AdGuardHome/watchconfig.sh"
|
|
procd_close_instance
|
|
echo "AdGuardHome: no config found, watching for config file..."
|
|
fi
|
|
fi
|
|
|
|
echo "AdGuardHome service enabled (switch=$enabled)"
|
|
|
|
(sleep 10 && \
|
|
pgrep "${binpath##*/}" >/dev/null 2>&1 || { \
|
|
logger -t AdGuardHome "no process found after 10s, canceling redirect"; \
|
|
_do_redirect 0; \
|
|
}) &
|
|
|
|
local bypass_global="$(uci get bypass.@global[0].global_server 2>/dev/null)"
|
|
local bypass_adg="$(uci get bypass.@global[0].adguardhome 2>/dev/null)"
|
|
local dnsmasq_port="$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)"
|
|
if [ -n "$bypass_global" ] && [ "$bypass_adg" = "1" ] && [ "$dnsmasq_port" = "53" ]; then
|
|
uci -q set AdGuardHome.AdGuardHome.redirect='exchange'
|
|
uci commit AdGuardHome
|
|
do_redirect 1
|
|
fi
|
|
}
|
|
|
|
reload_service()
|
|
{
|
|
rm -f /var/run/AdGlucitest >/dev/null 2>&1
|
|
echo "AdGuardHome reloading"
|
|
start
|
|
}
|
|
|
|
del_querylog(){
|
|
local backupwdpath
|
|
config_get backupwdpath $CONFIGURATION backupwdpath "/etc/AdGuardHome"
|
|
local workdir
|
|
config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome"
|
|
|
|
local btarget
|
|
btarget="$(ls "$backupwdpath/data" 2>/dev/null | grep "querylog.json" | sort -r | head -n1)"
|
|
local wtarget
|
|
wtarget="$(ls "$workdir/data" 2>/dev/null | grep "querylog.json" | sort -r | head -n1)"
|
|
|
|
if [ "$btarget" = "$wtarget" ]; then
|
|
[ -z "$btarget" ] && return 1
|
|
rm -f "$workdir/data/$wtarget"
|
|
rm -f "$backupwdpath/data/$btarget"
|
|
return 0
|
|
fi
|
|
|
|
if [ "$btarget" \> "$wtarget" ]; then
|
|
rm -f "$backupwdpath/data/$btarget"
|
|
else
|
|
rm -f "$workdir/data/$wtarget"
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
stop_service()
|
|
{
|
|
config_load "${CONFIGURATION}"
|
|
_do_redirect 0
|
|
do_crontab
|
|
|
|
if [ "$1" != "nobackup" ]; then
|
|
config_get backupfile $CONFIGURATION backupfile "0"
|
|
[ -n "$backupfile" ] && backup
|
|
fi
|
|
|
|
echo "AdGuardHome service disabled"
|
|
touch /var/run/AdGserverdis
|
|
}
|
|
|
|
boot() {
|
|
rc_procd boot_service "$@"
|
|
if eval "type service_started" 2>/dev/null >/dev/null; then
|
|
service_started
|
|
fi
|
|
}
|
|
|
|
test_crontab(){
|
|
config_load "${CONFIGURATION}"
|
|
do_crontab
|
|
}
|
|
|
|
do_crontab(){
|
|
config_get_bool enabled $CONFIGURATION enabled 0
|
|
config_get crontab $CONFIGURATION crontab ""
|
|
local cronreload=0
|
|
|
|
local findstr default cronenable
|
|
findstr="/usr/share/AdGuardHome/update_core.sh"
|
|
default="30 3 * * * /usr/share/AdGuardHome/update_core.sh"
|
|
[ "$enabled" = "0" ] || [ "${crontab//autoupdate/}" = "$crontab" ] && cronenable=0 || cronenable=1
|
|
crontab_editor
|
|
|
|
findstr="/usr/share/AdGuardHome/tailto.sh"
|
|
default="0 * * * * /usr/share/AdGuardHome/tailto.sh 2000 \$(uci get AdGuardHome.AdGuardHome.workdir)/data/querylog.json"
|
|
[ "$enabled" = "0" ] || [ "${crontab//cutquerylog/}" = "$crontab" ] && cronenable=0 || cronenable=1
|
|
crontab_editor
|
|
|
|
findstr="/usr/share/AdGuardHome/tailto.sh"
|
|
default="30 3 * * * /usr/share/AdGuardHome/tailto.sh 2000 \$(uci get AdGuardHome.AdGuardHome.logfile)"
|
|
[ "$enabled" = "0" ] || [ "${crontab//cutruntimelog/}" = "$crontab" ] && cronenable=0 || cronenable=1
|
|
crontab_editor
|
|
|
|
findstr="/usr/share/AdGuardHome/addhost.sh"
|
|
default="0 * * * * /usr/share/AdGuardHome/addhost.sh"
|
|
[ "$enabled" = "0" ] || [ "${crontab//autohost/}" = "$crontab" ] && cronenable=0 || cronenable=1
|
|
crontab_editor
|
|
|
|
[ "$cronreload" -gt 0 ] && /etc/init.d/cron restart
|
|
}
|
|
|
|
crontab_editor(){
|
|
local line
|
|
local reload
|
|
line="$(grep "$findstr" "$CRON_FILE" 2>/dev/null)"
|
|
|
|
if [ "${line#\#}" != "$line" ]; then
|
|
if [ "$cronenable" = "1" ]; then
|
|
sed -i "\|$findstr|d" "$CRON_FILE"
|
|
echo "${line#\#}" >> "$CRON_FILE"
|
|
cronreload=$((cronreload + 1))
|
|
elif [ -z "$reload" ]; then
|
|
sed -i "\|$findstr|d" "$CRON_FILE"
|
|
echo "$line" >> "$CRON_FILE"
|
|
fi
|
|
else
|
|
if [ "$cronenable" = "1" ]; then
|
|
if [ -z "$line" ]; then
|
|
line="$default"
|
|
reload=1
|
|
fi
|
|
if [ -n "$reload" ]; then
|
|
sed -i "\|$findstr|d" "$CRON_FILE"
|
|
echo "$line" >> "$CRON_FILE"
|
|
cronreload=$((cronreload + 1))
|
|
fi
|
|
elif [ -n "$line" ]; then
|
|
sed -i "\|$findstr|d" "$CRON_FILE"
|
|
echo "#$line" >> "$CRON_FILE"
|
|
cronreload=$((cronreload + 1))
|
|
fi
|
|
fi
|
|
}
|