mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-10-26 18:52:51 +08:00
251 lines
7.1 KiB
Diff
251 lines
7.1 KiB
Diff
From 2cfa7fa8e6b2c20824bdb81a3d7449c9757ae793 Mon Sep 17 00:00:00 2001
|
|
From: Jackie264 <125248570+Jackie264@users.noreply.github.com>
|
|
Date: Sat, 6 Jun 2026 23:21:32 +0800
|
|
Subject: [PATCH] Enhance AdGuardHome init script with new features
|
|
|
|
Add extra commands and improve cron handling in AdGuardHome init script.
|
|
---
|
|
root/etc/init.d/adguardhome | 164 +++++++++++++++++++++++++++++++++++-
|
|
1 file changed, 162 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/root/etc/init.d/adguardhome b/root/etc/init.d/adguardhome
|
|
index 4712913..1383834 100755
|
|
--- a/root/etc/init.d/adguardhome
|
|
+++ b/root/etc/init.d/adguardhome
|
|
@@ -3,6 +3,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
#
|
|
# shellcheck disable=SC3043 # ash supports local
|
|
+. /usr/share/AdGuardHome/helper.sh
|
|
|
|
# matches dnsmasq
|
|
START=19
|
|
@@ -12,22 +13,87 @@ STOP=89
|
|
PROG=/usr/bin/AdGuardHome
|
|
USE_PROCD=1
|
|
|
|
+EXTRA_COMMANDS="do_redirect force_reload isrunning"
|
|
+EXTRA_HELP="\
|
|
+\tdo_redirect \t0 or 1\n\
|
|
+\tforce_reload\n\
|
|
+\tisrunning"
|
|
+
|
|
+CONTROL_SCRIPT="/usr/share/AdGuardHome/control.sh"
|
|
+CRON_FILE=/etc/crontabs/root
|
|
+
|
|
+get_tz() {
|
|
+ SET_TZ=""
|
|
+ local zonename
|
|
+ zonename="$(uci get system.@system[0].zonename 2>/dev/null)"
|
|
+ if [ -n "$zonename" ]; then
|
|
+ SET_TZ="$zonename"
|
|
+ return
|
|
+ fi
|
|
+ for tzfile in /etc/TZ /var/etc/TZ; do
|
|
+ [ -e "$tzfile" ] && tz="$(cat "$tzfile" 2>/dev/null)" && break
|
|
+ done
|
|
+ [ -n "$tz" ] && SET_TZ=$tz && return
|
|
+}
|
|
+
|
|
+do_crontab() {
|
|
+ local enabled="$1"
|
|
+ local crontab="$2"
|
|
+ local findstr default cronenable cronreload=0
|
|
+
|
|
+ findstr="/usr/share/AdGuardHome/update_core.sh"
|
|
+ default="30 3 * * * /usr/share/AdGuardHome/update_core.sh 2>&1"
|
|
+ [ "$enabled" = "0" ] || [ "${crontab//autoupdate/}" = "$crontab" ] && cronenable=0 || cronenable=1
|
|
+ crontab_editor
|
|
+
|
|
+ [ "$cronreload" -gt 0 ] && /etc/init.d/cron restart
|
|
+}
|
|
+
|
|
+crontab_editor() {
|
|
+ local line
|
|
+ line="$(grep "$findstr" $CRON_FILE 2>/dev/null)"
|
|
+ if [ "${line:0:1}" != "#" ]; then
|
|
+ if [ "$cronenable" -eq 1 ]; then
|
|
+ if [ -z "$line" ]; then
|
|
+ echo "$default" >> $CRON_FILE
|
|
+ cronreload=$((cronreload+1))
|
|
+ fi
|
|
+ elif [ -n "$line" ]; then
|
|
+ sed -i "\,$findstr,d" $CRON_FILE
|
|
+ echo "#$line" >> $CRON_FILE
|
|
+ cronreload=$((cronreload+1))
|
|
+ fi
|
|
+ else
|
|
+ if [ "$cronenable" -eq 1 ]; then
|
|
+ sed -i "\,$findstr,d" $CRON_FILE
|
|
+ echo "${line:1}" >> $CRON_FILE
|
|
+ cronreload=$((cronreload+1))
|
|
+ fi
|
|
+ fi
|
|
+}
|
|
+
|
|
boot() {
|
|
ADGUARDHOME_BOOT=1
|
|
start "$@"
|
|
}
|
|
|
|
start_service() {
|
|
+ mkdir -p /var/etc
|
|
+ [ ! -f /var/etc/adguardhome.nft ] && touch /var/etc/adguardhome.nft
|
|
+ chmod 644 /var/etc/adguardhome.nft
|
|
+
|
|
if [ -n "$ADGUARDHOME_BOOT" ]; then
|
|
# Do not start yet, wait for triggers
|
|
return 0
|
|
fi
|
|
|
|
+ rm -f /var/run/AdGserverdis 2>/dev/null
|
|
config_load 'adguardhome'
|
|
|
|
local config_name='config'
|
|
local config_file config group user verbose work_dir workdir
|
|
local gc maxprocs memlimit
|
|
+ local enabled hashpass crontab redirect
|
|
|
|
uci_validate_section 'adguardhome' 'adguardhome' "$config_name" \
|
|
'gc:uinteger:0' \
|
|
@@ -41,12 +107,46 @@ start_service() {
|
|
'user:string:adguardhome' \
|
|
'verbose:bool:0' \
|
|
'workdir:string' \
|
|
- 'work_dir:string:/var/lib/adguardhome'
|
|
+ 'work_dir:string:/var/lib/adguardhome' \
|
|
+ 'enabled:bool:0' \
|
|
+ 'hashpass:string' \
|
|
+ 'crontab:string' \
|
|
+ 'redirect:string:none' \
|
|
+ 'http_address:string'
|
|
|
|
# Compatibility with older configs
|
|
[ -n "$config" ] && config_file="$config"
|
|
[ -n "$workdir" ] && work_dir="$workdir"
|
|
|
|
+ # Handle hashpass clear text issuance and back brush removal
|
|
+ if [ -n "$hashpass" ]; then
|
|
+ config_editor "users.password" "$hashpass" "$config_file"
|
|
+ uci set adguardhome."$config_name".hashpass=""
|
|
+ uci commit adguardhome
|
|
+ fi
|
|
+
|
|
+ # Synchronize the front-end incing WebUI listening address to YAML
|
|
+ if [ -n "$http_address" ]; then
|
|
+ config_editor "http.address" "$http_address" "$config_file"
|
|
+ uci set adguardhome."$config_name".http_address=""
|
|
+ uci commit adguardhome
|
|
+ fi
|
|
+
|
|
+ # Isse the plan task change
|
|
+ do_crontab "$enabled" "$crontab"
|
|
+
|
|
+ # If it is not enabled, the linkage cleans up the redirection firewall rules and exits safely.
|
|
+ if [ "$enabled" = 0 ]; then
|
|
+ $CONTROL_SCRIPT 0
|
|
+ return 0
|
|
+ fi
|
|
+
|
|
+ if [ "$user" = "adguardhome" ] && ! grep -q "^adguardhome:" /etc/passwd; then
|
|
+ echo "luci-app: User 'adguardhome' is missing, injecting UID 853 into system files..." >&2
|
|
+ grep -q "^adguardhome:" /etc/group || echo "adguardhome:x:853:" >> /etc/group
|
|
+ echo "adguardhome:x:853:853:adguardhome:/var/run/adguardhome:/bin/false" >> /etc/passwd
|
|
+ fi
|
|
+
|
|
local config_dir
|
|
config_dir=$(dirname "$config_file")
|
|
if [ "$config_dir" = '/etc' ]; then
|
|
@@ -59,6 +159,13 @@ start_service() {
|
|
mkdir -m 0700 -p "$work_dir"
|
|
chown -R "$user":"$group" "$work_dir"
|
|
|
|
+ # Silently downgrade and call the kernel download script when the kernel is missing.
|
|
+ if [ ! -f "$PROG" ]; then
|
|
+ $CONTROL_SCRIPT 0
|
|
+ /usr/share/AdGuardHome/update_core.sh >/tmp/AdGuardHome_update.log 2>&1 &
|
|
+ return 0
|
|
+ fi
|
|
+
|
|
procd_open_instance adguardhome
|
|
|
|
procd_set_param command "$PROG"
|
|
@@ -67,12 +174,17 @@ start_service() {
|
|
[ "$maxprocs" -le 0 ] || procd_append_param env GOMAXPROCS="$maxprocs"
|
|
[ "$memlimit" -le 0 ] || procd_append_param env GOMEMLIMIT="$memlimit"
|
|
|
|
+ local SET_TZ
|
|
+ get_tz
|
|
+ [ -n "$SET_TZ" ] && procd_append_param env TZ="$SET_TZ"
|
|
+
|
|
procd_append_param command --config "$config_file"
|
|
procd_append_param command --logfile syslog
|
|
- procd_append_param command --no-check-update
|
|
+ # procd_append_param command --no-check-update
|
|
[ "$verbose" = 1 ] && procd_append_param command --verbose
|
|
procd_append_param command --work-dir "$work_dir"
|
|
|
|
+ procd_set_param file /etc/config/adguardhome "$config_file"
|
|
procd_set_param stdout 1
|
|
procd_set_param stderr 1
|
|
procd_set_param user "$user"
|
|
@@ -91,10 +203,58 @@ start_service() {
|
|
|
|
procd_add_jail_mount '/etc/hosts'
|
|
procd_add_jail_mount '/etc/ssl/certs'
|
|
+ [ -f /etc/TZ ] && procd_add_jail_mount '/etc/TZ'
|
|
+
|
|
config_list_foreach "$config_name" jail_mount procd_add_jail_mount
|
|
config_list_foreach "$config_name" jail_mount_rw procd_add_jail_mount_rw
|
|
|
|
procd_close_instance
|
|
+
|
|
+ # After the main process is successfully submitted for start-up, it begins to intervene asynchronously and take over the control.
|
|
+ if [ -f "$config_file" ]; then
|
|
+ ($CONTROL_SCRIPT 1) &
|
|
+ else
|
|
+ $CONTROL_SCRIPT 0
|
|
+ if [ "$redirect" != "none" ]; then
|
|
+ procd_open_instance "waitconfig"
|
|
+ procd_set_param command "/usr/share/AdGuardHome/watchconfig.sh"
|
|
+ procd_close_instance
|
|
+ fi
|
|
+ fi
|
|
+
|
|
+ (sleep 10 && [ -z "$(pgrep -f "$(basename "$PROG")")" ] && logger -t adguardhome "no process in 10s cancel redirect" && $CONTROL_SCRIPT 0 ) &
|
|
+}
|
|
+
|
|
+stop_service() {
|
|
+ config_load 'adguardhome'
|
|
+ local config_name='config'
|
|
+ local crontab
|
|
+ config_get crontab "$config_name" crontab ""
|
|
+
|
|
+ $CONTROL_SCRIPT 0
|
|
+ do_crontab 0 "$crontab"
|
|
+ touch /var/run/AdGserverdis
|
|
+}
|
|
+
|
|
+do_redirect() {
|
|
+ $CONTROL_SCRIPT "$1"
|
|
+}
|
|
+
|
|
+_isrunning() {
|
|
+ [ ! -f "$PROG" ] && return 2
|
|
+ pgrep -f "$(basename "$PROG")" >/dev/null 2>&1 && return 0
|
|
+ return 1
|
|
+}
|
|
+
|
|
+isrunning() {
|
|
+ _isrunning
|
|
+ local r=$?
|
|
+ [ "$r" = "0" ] && echo "running" || ([ "$r" = "1" ] && echo "not run" || echo "no bin")
|
|
+ return $r
|
|
+}
|
|
+
|
|
+force_reload() {
|
|
+ _isrunning && procd_send_signal adguardhome || start
|
|
}
|
|
|
|
service_triggers() {
|