diff --git a/dae/files/dae.init b/dae/files/dae.init index b1b524f9..6fe8197b 100755 --- a/dae/files/dae.init +++ b/dae/files/dae.init @@ -1,5 +1,4 @@ #!/bin/sh /etc/rc.common -# Copyright (C) 2023 Tianling Shen USE_PROCD=1 START=96 @@ -10,93 +9,106 @@ extra_command "hot_reload" "Hot-reload service" CONF="dae" PROG="/usr/bin/dae" LOG="/var/log/dae/dae.log" -CRON_FILE="/etc/crontabs/root" DAENETNS="/run/netns/daens" -RANDOM_SEED=$RANDOM -RANDOM_NUM=$((RANDOM_SEED % 10 + 1)) - -setcron() { - touch $CRON_FILE - sed -i '/dae hot_reload/d' $CRON_FILE 2>/dev/null - [ "$(uci -q get dae.config.subscribe_auto_update)" -eq 1 ] && echo "${RANDOM_NUM} $(uci -q get dae.config.subscribe_update_day_time) * * $(uci -q get dae.config.subscribe_update_week_time) /etc/init.d/dae hot_reload >/dev/null 2>&1" >>$CRON_FILE - crontab $CRON_FILE -} - -delcron() { - sed -i '/dae hot_reload/d' $CRON_FILE 2>/dev/null - crontab $CRON_FILE -} +RESOLV_DAE="/tmp/resolv.conf.dae" set_chmod_640() { - chmod -R 640 /etc/dae/ - mkdir -p /etc/dae/config.d - mkdir -p /var/log/dae + chmod -R 640 /etc/dae/ 2>/dev/null || true + mkdir -p /etc/dae/config.d + mkdir -p /var/log/dae } -setlocaluse() { - uci set dhcp.@dnsmasq[0].localuse="1" - uci commit dhcp - /etc/init.d/dnsmasq restart +update_cron() { + local temp_cron="/tmp/root.cron" + + if [ -f /etc/crontabs/root ]; then + grep -v '/etc/init.d/dae hot_reload' /etc/crontabs/root > "$temp_cron" 2>/dev/null + fi + : >> "$temp_cron" + + local auto_update + auto_update=$(uci -q get dae.config.subscribe_auto_update) + if [ "$1" = "add" ] && [ "${auto_update:-0}" -eq 1 ]; then + local min=$((RANDOM % 60)) + local hr=$(uci -q get dae.config.subscribe_update_day_time) + local wk=$(uci -q get dae.config.subscribe_update_week_time) + echo "$min ${hr:-*} * * ${wk:-*} /etc/init.d/dae hot_reload >/dev/null 2>&1" >> "$temp_cron" + fi + + crontab "$temp_cron" 2>/dev/null + rm -f "$temp_cron" } -dellocaluse() { - local dns_list - uci set dhcp.@dnsmasq[0].localuse="0" - uci commit dhcp - /etc/init.d/dnsmasq restart - . /lib/functions/network.sh - network_find_wan LOGICAL_WAN || exit 1 - dns_list=$(ubus call network.interface.$LOGICAL_WAN status | jsonfilter -e '@["dns-server"]' | sed 's/[]["]//g' | sed 's/,/\n/g' | grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b') - [ -z "$dns_list" ] && dns_list="119.29.29.29 180.76.76.76 223.5.5.5" - grep -v '^nameserver ' /etc/resolv.conf > /tmp/resolv.conf.new.dae 2>/dev/null - for dns in $dns_list; do - echo "nameserver $dns" >> /tmp/resolv.conf.new.dae - done - cat /tmp/resolv.conf.new.dae > /etc/resolv.conf - rm -f /tmp/resolv.conf.new.dae +hijack_resolv_conf() { + grep -q ' /tmp/resolv\.conf ' /proc/mounts && return 0 + + cat /dev/null > "$RESOLV_DAE" + + if [ -f "/tmp/resolv.conf.d/resolv.conf.auto" ]; then + grep '^nameserver' "/tmp/resolv.conf.d/resolv.conf.auto" >> "$RESOLV_DAE" + fi + + if [ ! -s "$RESOLV_DAE" ]; then + echo "nameserver 223.5.5.5" > "$RESOLV_DAE" + echo "nameserver 119.29.29.29" >> "$RESOLV_DAE" + fi + + mount --bind "$RESOLV_DAE" /tmp/resolv.conf + mount -o remount,ro,bind /tmp/resolv.conf +} + +restore_resolv_conf() { + grep -q ' /tmp/resolv\.conf ' /proc/mounts || return 0 + mount -o remount,rw,bind /tmp/resolv.conf 2>/dev/null + umount /tmp/resolv.conf 2>/dev/null + rm -f "$RESOLV_DAE" } start_service() { - local enabled config_file log_maxbackups log_maxsize - set_chmod_640 - uci commit "$CONF" 2>/dev/null - config_load "$CONF" - - config_get_bool enabled "config" "enabled" "0" - [ "$enabled" -eq "1" ] || return 1 - config_get config_file "config" "config_file" "/etc/dae/config.dae" - "$PROG" validate -c "$config_file" || return 1 - setcron - dellocaluse - config_get log_maxbackups "config" "log_maxbackups" "1" - config_get log_maxsize "config" "log_maxsize" "1" - procd_open_instance "$CONF" - uname -r | grep -Eq "^6\.6" && procd_set_param env "QUIC_GO_DISABLE_GSO"="true" - procd_set_param env DAE_LOCATION_ASSET="/usr/share/v2ray" - procd_set_param command "$PROG" run - procd_append_param command --config "$config_file" - procd_append_param command --disable-timestamp - procd_append_param command --logfile "$LOG" - procd_append_param command --logfile-maxbackups "$log_maxbackups" - procd_append_param command --logfile-maxsize "$log_maxsize" - procd_set_param limits core="unlimited" - procd_set_param limits nofile="1000000 1000000" - procd_set_param respawn - procd_set_param stderr 1 - procd_close_instance + local enabled config_file log_maxbackups log_maxsize + + uci commit "$CONF" 2>/dev/null + config_load "$CONF" + config_get_bool enabled "config" "enabled" "0" + [ "$enabled" -eq "1" ] || return 1 + + config_get config_file "config" "config_file" "/etc/dae/config.dae" + "$PROG" validate -c "$config_file" || return 1 + + set_chmod_640 + update_cron "add" + hijack_resolv_conf + + config_get log_maxbackups "config" "log_maxbackups" "1" + config_get log_maxsize "config" "log_maxsize" "1" + + procd_open_instance "$CONF" + uname -r | grep -Eq "^6\.6" && procd_set_param env "QUIC_GO_DISABLE_GSO"="true" + procd_set_param env DAE_LOCATION_ASSET="/usr/share/v2ray" + procd_set_param command "$PROG" run + procd_append_param command --config "$config_file" + procd_append_param command --disable-timestamp + procd_append_param command --logfile "$LOG" + procd_append_param command --logfile-maxbackups "$log_maxbackups" + procd_append_param command --logfile-maxsize "$log_maxsize" + procd_set_param limits core="unlimited" + procd_set_param limits nofile="1000000 1000000" + procd_set_param respawn + procd_set_param stderr 1 + procd_close_instance } stop_service() { - delcron - setlocaluse - [ -f "$DAENETNS" ] && umount "$DAENETNS" + update_cron "remove" + restore_resolv_conf + [ -f "$DAENETNS" ] && umount "$DAENETNS" 2>/dev/null || true } service_triggers() { - procd_add_reload_trigger "$CONF" + procd_add_reload_trigger "$CONF" } hot_reload() { - set_chmod_640 - /etc/init.d/dae running && "$PROG" reload + set_chmod_640 + /etc/init.d/dae running && "$PROG" reload } diff --git a/luci-app-dae/root/etc/hotplug.d/iface/98-dae b/luci-app-dae/root/etc/hotplug.d/iface/98-dae index c89c1825..ae659c00 100644 --- a/luci-app-dae/root/etc/hotplug.d/iface/98-dae +++ b/luci-app-dae/root/etc/hotplug.d/iface/98-dae @@ -1,6 +1,7 @@ #!/bin/sh -[ "$ACTION" = ifup ] || [ "$ACTION" = ifupdate ] || exit 0 -[ "$ACTION" = ifupdate ] && [ -z "$IFUPDATE_ADDRESSES" ] && [ -z "$IFUPDATE_DATA" ] && exit 0 + +[ "$ACTION" = "ifup" ] || [ "$ACTION" = "ifupdate" ] || exit 0 +[ "$ACTION" = "ifupdate" ] && [ -z "$IFUPDATE_ADDRESSES" ] && [ -z "$IFUPDATE_DATA" ] && exit 0 UPTIME=$(cut -d. -f1 /proc/uptime 2>/dev/null) [ -n "$UPTIME" ] && [ "$UPTIME" -lt 30 ] && exit 0 @@ -11,26 +12,21 @@ network_find_wan6 NET_IF6 network_find_wan NET_IF [ "$INTERFACE" != "$NET_IF6" ] && [ "$INTERFACE" != "$NET_IF" ] && exit 0 +[ "$(uci -q get dae.config.enabled)" = "1" ] || exit 0 + +DEBOUNCE_FILE="/tmp/run/dae_hotplug_gen" +mkdir -p /tmp/run + +my_gen="$$.$(date +%s)" +echo "$my_gen" > "$DEBOUNCE_FILE" + ( - LOCK_FILE="/tmp/lock/dae_hotplug_lock" - if [ -f "$LOCK_FILE" ]; then - exit 1 + sleep 5 + [ "$(cat "$DEBOUNCE_FILE" 2>/dev/null)" = "$my_gen" ] || exit 0 + + if /etc/init.d/dae running; then + /etc/init.d/dae hot_reload else - echo $$ > "$LOCK_FILE" 2>/dev/null - trap 'rm -f "$LOCK_FILE"' EXIT - - sleep 30 - - DAE_STATUS=$(/etc/init.d/dae status 2>/dev/null) - - if echo "$DAE_STATUS" | grep -q 'running'; then - /etc/init.d/dae hot_reload 2>&1 - else - DAE_ENABLED=$(uci -q get dae.config.enabled) - - if [ "$DAE_ENABLED" = "1" ]; then - /etc/init.d/dae start 2>&1 - fi - fi + /etc/init.d/dae start fi -) & \ No newline at end of file +) &