mirror of
https://github.com/caiwx86/small-packages.git
synced 2026-11-03 22:53:56 +08:00
653 lines
21 KiB
Bash
Executable File
653 lines
21 KiB
Bash
Executable File
#!/bin/sh /etc/rc.common
|
|
|
|
USE_PROCD=1
|
|
|
|
START=95
|
|
STOP=01
|
|
|
|
CONFIGURATION=AdGuardHome
|
|
NFT_RULES_FILE="/var/etc/adguardhome.nft"
|
|
NFT_RULES_TPL="/usr/share/AdGuardHome/adguardhome.nft.tpl"
|
|
NFT_TABLE="adguardhome"
|
|
|
|
EXTRA_COMMANDS="do_redirect force_reload isrunning"
|
|
EXTRA_HELP=" do_redirect 0 or 1\
|
|
force_reload
|
|
isrunning"
|
|
|
|
get_wan_return_line() {
|
|
local wan
|
|
wan="$(uci -q get AdGuardHome.AdGuardHome.wan_ifname 2>/dev/null)"
|
|
|
|
[ -z "$wan" ] && { echo ""; return 0; }
|
|
|
|
local wan_set
|
|
wan_set="\"$(printf '%s' "$wan" | sed 's/ /\", \"/g')\""
|
|
echo "iifname { $wan_set } return"
|
|
}
|
|
|
|
set_nft_redirect() {
|
|
local port="$1"
|
|
case "$port" in
|
|
*[!0-9]*|"") return 1 ;;
|
|
esac
|
|
[ ! -f "$NFT_RULES_TPL" ] && return 1
|
|
|
|
local return_line
|
|
return_line="$(get_wan_return_line)"
|
|
|
|
awk -v port="$port" -v wan_line="$return_line" '{
|
|
gsub("__AGH_PORT__", port)
|
|
gsub("__AGH_WAN_RETURN_LINE__", wan_line)
|
|
print
|
|
}' "$NFT_RULES_TPL" > "$NFT_RULES_FILE" || return 1
|
|
|
|
[ ! -s "$NFT_RULES_FILE" ] && return 1
|
|
|
|
nft delete table inet "$NFT_TABLE" 2>/dev/null
|
|
nft -f "$NFT_RULES_FILE" 2>/dev/null
|
|
}
|
|
|
|
clear_nft_redirect() {
|
|
uci -q delete firewall.adguardhome_nft_include
|
|
uci -q commit firewall
|
|
|
|
[ -f "$NFT_RULES_FILE" ] && rm -f "$NFT_RULES_FILE"
|
|
nft delete table inet "$NFT_TABLE" 2>/dev/null
|
|
}
|
|
|
|
wait_for_pid_exit() {
|
|
local pid="$1" attempts=0
|
|
case "$pid" in ''|*[!0-9]*) return 0 ;; esac
|
|
while kill -0 "$pid" 2>/dev/null; do
|
|
[ "$attempts" -lt 15 ] || return 1
|
|
sleep 1
|
|
attempts=$((attempts + 1))
|
|
done
|
|
}
|
|
|
|
wait_for_dns_port_release() {
|
|
local port="$1" attempts=0 tables="" table busy
|
|
for table in /proc/net/tcp /proc/net/tcp6 /proc/net/udp /proc/net/udp6; do
|
|
[ -r "$table" ] && tables="$tables $table"
|
|
done
|
|
[ -n "$tables" ] || return 1
|
|
port="$(printf '%04X' "$port")" || return 1
|
|
while :; do
|
|
busy="$(awk -v port="$port" '
|
|
FNR > 1 {
|
|
split($2, address, ":")
|
|
if (toupper(address[2]) == port &&
|
|
((FILENAME ~ /tcp/ && $4 == "0A") ||
|
|
(FILENAME ~ /udp/ && $4 == "07"))) found = 1
|
|
}
|
|
END { print found ? 1 : 0 }
|
|
' $tables)" || return 1
|
|
[ "$busy" = "0" ] && return 0
|
|
[ "$attempts" -lt 15 ] || return 1
|
|
sleep 1
|
|
attempts=$((attempts + 1))
|
|
done
|
|
}
|
|
|
|
restart_dnsmasq() {
|
|
local released_port="$1" service pids pid
|
|
service="$(ubus call service list '{"name":"dnsmasq"}' 2>/dev/null)" || return 1
|
|
pids="$(printf '%s' "$service" | jsonfilter -e '@.dnsmasq.instances.*.pid')"
|
|
/etc/init.d/dnsmasq stop 8>&- 1000>&- || return 1
|
|
for pid in $pids; do
|
|
if ! wait_for_pid_exit "$pid"; then
|
|
logger -t AdGuardHome 'dnsmasq did not stop; refusing to reuse its old jail.'
|
|
return 1
|
|
fi
|
|
done
|
|
if [ -n "$released_port" ] && ! wait_for_dns_port_release "$released_port"; then
|
|
logger -t AdGuardHome "DNS port $released_port is still occupied after stopping dnsmasq."
|
|
/etc/init.d/dnsmasq start 8>&- 1000>&-
|
|
return 1
|
|
fi
|
|
/etc/init.d/dnsmasq start 8>&- 1000>&- || return 1
|
|
if [ -n "$released_port" ] && ! wait_for_dns_port_release "$released_port"; then
|
|
logger -t AdGuardHome "DNS port $released_port was occupied again after starting dnsmasq."
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
save_dnsmasq_upstream_config() {
|
|
local backup="AdGuardHome.dnsmasq_backup" option value server
|
|
[ "$(uci -q get "$backup.ready")" = "1" ] && return 0
|
|
|
|
uci -q delete "$backup"
|
|
uci set "$backup=dnsmasq_backup" || return 1
|
|
value="$(uci -q get dhcp.@dnsmasq[0].server)"
|
|
for server in $value; do
|
|
uci add_list "$backup.server=$server" || return 1
|
|
done
|
|
for option in resolvfile noresolv; do
|
|
if value="$(uci -q get "dhcp.@dnsmasq[0].$option")"; then
|
|
uci set "$backup.$option=$value" || return 1
|
|
fi
|
|
done
|
|
uci set "$backup.ready=1" || return 1
|
|
if ! uci commit AdGuardHome; then
|
|
uci -q revert "$backup"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
apply_dnsmasq_config() {
|
|
[ "${AGH_DEFER_DNSMASQ_RESTART:-0}" = "1" ] && return 0
|
|
restart_dnsmasq "$@"
|
|
}
|
|
|
|
is_scoped_dnsmasq_server() {
|
|
local domains="${1%/*}"
|
|
case "$1" in
|
|
/*) case "$domains/" in */\#/*) return 1 ;; esac; return 0 ;;
|
|
esac
|
|
return 1
|
|
}
|
|
|
|
set_forward_dnsmasq() (
|
|
set -f
|
|
local addr="127.0.0.1#$1" servers desired server
|
|
|
|
if [ "$(uci -q get AdGuardHome.dnsmasq_backup.ready)" != "1" ] &&
|
|
[ "$2" = "dnsmasq-upstream" ] && [ "$3" = "1" ]; then
|
|
stop_forward_dnsmasq "$4" || return 1
|
|
fi
|
|
save_dnsmasq_upstream_config || return 1
|
|
|
|
servers="$(uci -q get dhcp.@dnsmasq[0].server)"
|
|
desired="$addr"
|
|
for server in $servers; do
|
|
is_scoped_dnsmasq_server "$server" && desired="$desired $server"
|
|
done
|
|
if [ "$servers" = "$desired" ] && [ "$(uci -q get dhcp.@dnsmasq[0].noresolv)" = "1" ]; then
|
|
return 0
|
|
fi
|
|
|
|
uci -q delete dhcp.@dnsmasq[0].server
|
|
for server in $desired; do
|
|
uci add_list "dhcp.@dnsmasq[0].server=$server" || return 1
|
|
done
|
|
uci set dhcp.@dnsmasq[0].noresolv=1 || return 1
|
|
uci commit dhcp || return 1
|
|
apply_dnsmasq_config >/dev/null 2>&1
|
|
)
|
|
|
|
stop_forward_dnsmasq() (
|
|
set -f
|
|
local backup="AdGuardHome.dnsmasq_backup" option value server
|
|
local addr="127.0.0.1#$1" found=0 has_general=0
|
|
|
|
if [ "$(uci -q get "$backup.ready")" = "1" ]; then
|
|
uci -q delete dhcp.@dnsmasq[0].server
|
|
value="$(uci -q get "$backup.server")"
|
|
for server in $value; do
|
|
uci add_list "dhcp.@dnsmasq[0].server=$server" || return 1
|
|
done
|
|
for option in resolvfile noresolv; do
|
|
if value="$(uci -q get "$backup.$option")"; then
|
|
uci set "dhcp.@dnsmasq[0].$option=$value" || return 1
|
|
else
|
|
uci -q delete "dhcp.@dnsmasq[0].$option"
|
|
fi
|
|
done
|
|
uci commit dhcp || return 1
|
|
apply_dnsmasq_config >/dev/null 2>&1 || return 1
|
|
[ "${AGH_DEFER_DNSMASQ_RESTART:-0}" = "1" ] && return 0
|
|
uci -q delete "$backup"
|
|
uci commit AdGuardHome
|
|
return $?
|
|
fi
|
|
|
|
value="$(uci -q get dhcp.@dnsmasq[0].server)"
|
|
for server in $value; do
|
|
if [ "$server" = "$addr" ]; then
|
|
found=1
|
|
elif ! is_scoped_dnsmasq_server "$server"; then
|
|
has_general=1
|
|
fi
|
|
done
|
|
[ "$found" = "1" ] || return 0
|
|
uci -q del_list "dhcp.@dnsmasq[0].server=$addr" || return 1
|
|
if [ "$has_general" = "0" ]; then
|
|
if ! uci -q get dhcp.@dnsmasq[0].resolvfile >/dev/null; then
|
|
value="/tmp/resolv.conf.d/resolv.conf.auto"
|
|
[ -f "$value" ] || value="/tmp/resolv.conf.auto"
|
|
uci set "dhcp.@dnsmasq[0].resolvfile=$value" || return 1
|
|
fi
|
|
uci -q delete dhcp.@dnsmasq[0].noresolv
|
|
fi
|
|
logger -t AdGuardHome 'No DNS snapshot from previous version; removed old upstream, original resolver settings are unavailable.'
|
|
uci commit dhcp || return 1
|
|
apply_dnsmasq_config >/dev/null 2>&1
|
|
)
|
|
|
|
stop_core() {
|
|
local service instance pid
|
|
service="$(ubus call service list '{"name":"AdGuardHome"}' 2>/dev/null)" || return 1
|
|
instance="$(printf '%s' "$service" | jsonfilter -e '@.AdGuardHome.instances.instance1')"
|
|
[ -n "$instance" ] || return 0
|
|
pid="$(printf '%s' "$instance" | jsonfilter -e '@.pid')"
|
|
ubus call service delete '{"name":"AdGuardHome","instance":"instance1"}' >/dev/null || return 1
|
|
if ! wait_for_pid_exit "$pid"; then
|
|
logger -t AdGuardHome 'Core did not stop; DNS port settings were not changed.'
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
agh_reload() {
|
|
[ "${AGH_REDIRECT_RELOAD:-1}" = "1" ] || return 0
|
|
if [ "${AGH_DEFER_DNSMASQ_RESTART:-0}" = "1" ]; then
|
|
AGH_RELOAD_PENDING=1
|
|
return 0
|
|
fi
|
|
ubus call service event '{"type":"config.change","data":{"package":"AdGuardHome"}}' >/dev/null 2>&1
|
|
}
|
|
|
|
rm_port53() {
|
|
local configpath
|
|
config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
|
|
|
|
local AdGuardHome_PORT dnsmasq_port
|
|
AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1")
|
|
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
|
|
|
|
stop_core || return 1
|
|
config_editor "dns.port" "$dnsmasq_port" "$configpath"
|
|
[ "$(config_editor "dns.port" "" "$configpath" "1")" = "$dnsmasq_port" ] || return 1
|
|
uci set dhcp.@dnsmasq[0].port="53" || return 1
|
|
uci commit dhcp || return 1
|
|
apply_dnsmasq_config "$dnsmasq_port" || return 1
|
|
agh_reload
|
|
}
|
|
|
|
use_port53() {
|
|
local configpath
|
|
config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
|
|
|
|
local AdGuardHome_PORT dnsmasq_port
|
|
AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1")
|
|
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" ] && AdGuardHome_PORT="1745"
|
|
elif [ "$AdGuardHome_PORT" = "53" ]; then
|
|
return
|
|
fi
|
|
|
|
stop_core || return 1
|
|
config_editor "dns.port" "53" "$configpath"
|
|
[ "$(config_editor "dns.port" "" "$configpath" "1")" = "53" ] || return 1
|
|
uci set dhcp.@dnsmasq[0].port="$AdGuardHome_PORT" || return 1
|
|
uci commit dhcp || return 1
|
|
apply_dnsmasq_config "$dnsmasq_port" || return 1
|
|
agh_reload
|
|
}
|
|
|
|
mark_redirect_flag() {
|
|
local enabled="$1" redirect="$2" agh_port="$3"
|
|
|
|
local configpath
|
|
config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
|
|
|
|
local flag=0
|
|
|
|
if [ "$enabled" = "1" ] && [ "$redirect" != "none" ]; then
|
|
flag=1
|
|
|
|
if [ "$redirect" = "redirect" ]; then
|
|
nft list table inet "$NFT_TABLE" >/dev/null 2>&1 || flag=0
|
|
|
|
elif [ "$redirect" = "dnsmasq-upstream" ]; then
|
|
local s
|
|
s="$(uci -q get dhcp.@dnsmasq[0].server | tr '\n' ' ')"
|
|
printf '%s\n' "$s" | grep -q -E "(^|[[:space:]])127\.0\.0\.1#${agh_port}([[:space:]]|$)" || flag=0
|
|
|
|
elif [ "$redirect" = "exchange" ]; then
|
|
local cfgp dport
|
|
cfgp="$(config_editor "dns.port" "" "$configpath" "1")"
|
|
dport="$(uci -q get dhcp.@dnsmasq[0].port)"
|
|
if [ "$cfgp" != "53" ] || [ "$dport" = "53" ] ; then
|
|
flag=0
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
echo -n "$flag" > /var/run/AdGredir
|
|
}
|
|
|
|
finish_dnsmasq_config() {
|
|
case "$old_redirect:$redirect" in
|
|
*dnsmasq-upstream*|*exchange*)
|
|
if [ "$dnsmasq_before" != "$(uci -q export dhcp)" ] || [ "$previous_flag" != "1" ] || [ "$enabled" = "0" ]; then
|
|
local released_port=""
|
|
if [ "$enabled" = "1" ] && [ "$redirect" = "exchange" ]; then
|
|
released_port=53
|
|
elif [ "$dnsmasq_previous_port" != "$(uci -q get dhcp.@dnsmasq[0].port)" ]; then
|
|
released_port="$dnsmasq_previous_port"
|
|
fi
|
|
restart_dnsmasq "$released_port" || return 1
|
|
fi
|
|
;;
|
|
esac
|
|
if { [ "$enabled" = "0" ] || [ "$redirect" != "dnsmasq-upstream" ]; } &&
|
|
[ "$(uci -q get AdGuardHome.dnsmasq_backup.ready)" = "1" ]; then
|
|
uci -q delete AdGuardHome.dnsmasq_backup
|
|
uci commit AdGuardHome || return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
_do_redirect() (
|
|
exec 8>/var/lock/AdGuardHome-redirect.lock || return 1
|
|
flock -w 10 8 || return 1
|
|
local AGH_DEFER_DNSMASQ_RESTART=1 AGH_RELOAD_PENDING=0
|
|
local dnsmasq_before dnsmasq_previous_port previous_flag
|
|
dnsmasq_before="$(uci -q export dhcp)" || return 1
|
|
dnsmasq_previous_port="$(uci -q get dhcp.@dnsmasq[0].port)"
|
|
dnsmasq_previous_port="${dnsmasq_previous_port:-53}"
|
|
previous_flag="$(cat /var/run/AdGredir 2>/dev/null)"
|
|
echo -n "0" > /var/run/AdGredir
|
|
local section="$CONFIGURATION"
|
|
args=""
|
|
ipv6_server=1
|
|
tcp_server=0
|
|
enabled="$1"
|
|
AGH_REDIRECT_RELOAD="${2:-$enabled}"
|
|
|
|
config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
|
|
AdGuardHome_PORT="$(config_editor "dns.port" "" "$configpath" "1")"
|
|
[ -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
|
|
uci commit dhcp
|
|
|
|
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_nft_redirect
|
|
elif [ "$old_redirect" = "dnsmasq-upstream" ]; then
|
|
if [ "$old_enabled" = "1" ] || [ "$(uci -q get AdGuardHome.dnsmasq_backup.ready)" = "1" ]; then
|
|
if ! stop_forward_dnsmasq "$old_port"; then
|
|
echo -n "0" > /var/run/AdGredir
|
|
return 1
|
|
fi
|
|
fi
|
|
old_enabled=0
|
|
elif [ "$old_redirect" = "exchange" ]; then
|
|
if ! rm_port53; then
|
|
echo -n "0" > /var/run/AdGredir
|
|
return 1
|
|
fi
|
|
fi
|
|
fi
|
|
elif [ "$old_enabled" = "1" ] && [ "$enabled" = "1" ]; then
|
|
if [ "$old_redirect" = "redirect" ] && [ "$old_port" != "0" ]; then
|
|
clear_nft_redirect
|
|
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
|
|
|
|
if [ "$enabled" = "0" ] || [ "$AdGuardHome_PORT" = "0" ]; then
|
|
finish_dnsmasq_config || return 1
|
|
echo -n "0" > /var/run/AdGredir
|
|
return 1
|
|
fi
|
|
|
|
if [ "$redirect" = "redirect" ]; then
|
|
set_nft_redirect "$AdGuardHome_PORT"
|
|
elif [ "$redirect" = "dnsmasq-upstream" ]; then
|
|
if ! set_forward_dnsmasq "$AdGuardHome_PORT" "$old_redirect" "$old_enabled" "$old_port"; then
|
|
echo -n "0" > /var/run/AdGredir
|
|
return 1
|
|
fi
|
|
elif [ "$redirect" = "exchange" ] && [ "$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)" = "53" ]; then
|
|
if ! use_port53; then
|
|
echo -n "0" > /var/run/AdGredir
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
finish_dnsmasq_config || return 1
|
|
mark_redirect_flag "$enabled" "$redirect" "$AdGuardHome_PORT" || return 1
|
|
AGH_DEFER_DNSMASQ_RESTART=0
|
|
[ "$AGH_RELOAD_PENDING" = "0" ] || agh_reload
|
|
return 0
|
|
)
|
|
|
|
do_redirect() {
|
|
config_load "${CONFIGURATION}"
|
|
_do_redirect "$1"
|
|
}
|
|
|
|
service_triggers() {
|
|
procd_add_reload_trigger "$CONFIGURATION"
|
|
}
|
|
|
|
isrunning() {
|
|
config_load "${CONFIGURATION}"
|
|
_isrunning
|
|
local r=$?
|
|
[ "$r" = "0" ] && echo "running" || ([ "$r" = "1" ] && echo "not run" || echo "no bin")
|
|
return $r
|
|
}
|
|
|
|
_isrunning() {
|
|
config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome/AdGuardHome"
|
|
[ ! -f "$binpath" ] && return 2
|
|
pgrep -f "$(basename "$binpath")" >/dev/null 2>&1 && return 0
|
|
return 1
|
|
}
|
|
|
|
force_reload() {
|
|
config_load "${CONFIGURATION}"
|
|
_isrunning && procd_send_signal "$CONFIGURATION" || start
|
|
}
|
|
|
|
get_tz() {
|
|
SET_TZ=""
|
|
[ -e "/etc/localtime" ] && return
|
|
for tzfile in /etc/TZ /var/etc/TZ; do
|
|
[ -e "$tzfile" ] && tz="$(cat "$tzfile" 2>/dev/null)" && break
|
|
done
|
|
[ -n "$tz" ] && SET_TZ=$tz
|
|
}
|
|
|
|
get_filesystem() {
|
|
echo "$1" | awk '
|
|
BEGIN{
|
|
while (("mount"| getline ret) > 0) {
|
|
split(ret,d); fs[d[3]]=d[5];
|
|
m=index(d[1],":");
|
|
if (m==0) { pt[d[3]]=d[1] } else { pt[d[3]]=substr(d[1],m+1) }
|
|
}
|
|
}
|
|
{
|
|
split($0,d,"/");
|
|
if ("/" in fs) { result1=fs["/"]; }
|
|
if ("/" in pt) { result2=pt["/"]; }
|
|
for (i=2;i<=length(d);i++) {
|
|
p[i]=p[i-1]"/"d[i];
|
|
if (p[i] in fs) { result1=fs[p[i]]; result2=pt[p[i]]; }
|
|
}
|
|
if (result2 in fs) { result=fs[result2] } else { result=result1 }
|
|
print(result);
|
|
}'
|
|
}
|
|
|
|
config_editor() {
|
|
awk -v yaml="$1" -v value="$2" -v file="$3" -v ro="$4" '
|
|
BEGIN{split(yaml,part,"\.");s="";i=1;l=length(part);}
|
|
{
|
|
if (match($0,s""part[i]":")) {
|
|
if (i==l) {
|
|
split($0,t,": ");
|
|
if (ro==""){
|
|
system("sed -i '\''"FNR"c\\" t[1] ": " value "'\'' " file);
|
|
} else {
|
|
print(t[2]);
|
|
}
|
|
exit;
|
|
}
|
|
s=s"[- ]{2}";
|
|
i++;
|
|
}
|
|
}' "$3"
|
|
}
|
|
|
|
boot_service() {
|
|
rm -f /var/run/AdGserverdis 2>/dev/null
|
|
config_load "${CONFIGURATION}"
|
|
config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome/AdGuardHome"
|
|
[ -f "$binpath" ] && start_service
|
|
}
|
|
|
|
start_service() {
|
|
stop_core || return 1
|
|
rm -f /var/run/AdGserverdis 2>/dev/null
|
|
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 $CONFIGURATION
|
|
fi
|
|
local enabled
|
|
config_get_bool enabled $CONFIGURATION enabled 0
|
|
if [ "$enabled" = "0" ]; then
|
|
_do_redirect 0
|
|
return
|
|
fi
|
|
config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome"
|
|
|
|
mkdir -p "$workdir/data"
|
|
local cwdfs
|
|
cwdfs=$(get_filesystem "$workdir")
|
|
echo "workdir is a $cwdfs filesystem"
|
|
if [ "$cwdfs" = "jffs2" ]; then
|
|
echo "fs error ln db to tmp $workdir $cwdfs"
|
|
logger "AdGuardHome" "warning db redirect to tmp"
|
|
touch "$workdir/data/stats.db"
|
|
if [ ! -L "$workdir/data/stats.db" ]; then
|
|
mv -f "$workdir/data/stats.db" /tmp/stats.db 2>/dev/null
|
|
ln -s /tmp/stats.db "$workdir/data/stats.db" 2>/dev/null
|
|
fi
|
|
touch "$workdir/data/sessions.db"
|
|
if [ ! -L "$workdir/data/sessions.db" ]; then
|
|
mv -f "$workdir/data/sessions.db" /tmp/sessions.db 2>/dev/null
|
|
ln -s /tmp/sessions.db "$workdir/data/sessions.db" 2>/dev/null
|
|
fi
|
|
fi
|
|
local ADDITIONAL_ARGS=""
|
|
config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome/AdGuardHome"
|
|
|
|
mkdir -p "${binpath%/*}"
|
|
ADDITIONAL_ARGS="$ADDITIONAL_ARGS -c $configpath"
|
|
ADDITIONAL_ARGS="$ADDITIONAL_ARGS -w $workdir"
|
|
config_get httpport $CONFIGURATION httpport 3000
|
|
ADDITIONAL_ARGS="$ADDITIONAL_ARGS -p $httpport"
|
|
|
|
printf '%s\n' "$binpath" "$configpath" > /lib/upgrade/keep.d/luci-app-adguardhome
|
|
|
|
config_get logfile $CONFIGURATION logfile ""
|
|
if [ -n "$logfile" ]; then
|
|
ADDITIONAL_ARGS="$ADDITIONAL_ARGS -l $logfile"
|
|
fi
|
|
|
|
if [ ! -f "$binpath" ]; then
|
|
_do_redirect 0
|
|
/usr/share/AdGuardHome/update_core.sh >/dev/null 2>&1 &
|
|
exit 0
|
|
fi
|
|
|
|
config_get_bool verbose $CONFIGURATION verbose 0
|
|
if [ "$verbose" -eq 1 ]; then
|
|
ADDITIONAL_ARGS="$ADDITIONAL_ARGS -v"
|
|
fi
|
|
|
|
if [ "$(uci -q get bypass.@global[0].global_server)" ] && [ "$(uci -q get bypass.@global[0].adguardhome)" = "1" ] && [ "$(uci -q get dhcp.@dnsmasq[0].port)" = "53" ]; then
|
|
uci -q set AdGuardHome.AdGuardHome.redirect='exchange'
|
|
uci -q commit AdGuardHome
|
|
config_load "${CONFIGURATION}"
|
|
fi
|
|
|
|
if [ -f "$configpath" ]; then
|
|
if ! _do_redirect 1 0; then
|
|
[ "$(config_editor "dns.port" "" "$configpath" "1")" = "0" ] || return 1
|
|
fi
|
|
else
|
|
_do_redirect 0 0
|
|
fi
|
|
|
|
procd_open_instance
|
|
get_tz
|
|
if [ -n "$SET_TZ" ]; then
|
|
procd_set_param env TZ="$SET_TZ"
|
|
fi
|
|
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
|
|
procd_set_param command "$binpath" $ADDITIONAL_ARGS
|
|
procd_set_param file "$configpath" "/etc/hosts" "/etc/config/AdGuardHome"
|
|
procd_close_instance
|
|
if [ ! -f "$configpath" ]; then
|
|
config_get "redirect" "AdGuardHome" "redirect" "none"
|
|
if [ "$redirect" != "none" ]; then
|
|
procd_open_instance "waitconfig"
|
|
procd_set_param command "/usr/share/AdGuardHome/watchconfig.sh"
|
|
procd_close_instance
|
|
echo "no config start watching"
|
|
fi
|
|
fi
|
|
echo "AdGuardHome service enabled"
|
|
echo "luci enable switch=$enabled"
|
|
|
|
}
|
|
|
|
reload_service() {
|
|
rm -f /var/run/AdGlucitest 2>/dev/null
|
|
echo "AdGuardHome reloading"
|
|
start
|
|
}
|
|
|
|
stop_service() {
|
|
stop_core || return 1
|
|
config_load "${CONFIGURATION}"
|
|
_do_redirect 0
|
|
echo "AdGuardHome service disabled"
|
|
touch /var/run/AdGserverdis
|
|
}
|
|
|
|
boot() {
|
|
rc_procd boot_service "$@"
|
|
eval "type service_started" 2>/dev/null >/dev/null && service_started
|
|
} |