UA3F/openwrt/files/ua3f.init
2025-11-19 16:34:52 +08:00

141 lines
3.7 KiB
Bash
Executable File

#!/bin/sh /etc/rc.common
# shellcheck disable=SC2034,SC3043
USE_PROCD=1
START=99
NAME="ua3f"
PROG="/usr/bin/$NAME"
SERVER_MODE=""
UA3F_GROUP="nogroup"
LOG_FILE="/var/log/ua3f/ua3f.log"
LOG() {
if [ -n "${1}" ]; then
printf '[%s] %s\n' "$(date "+%Y-%m-%d %H:%M:%S")" "$1" >>"$LOG_FILE"
fi
}
opkg_available() { command -v opkg >/dev/null 2>&1; }
openclash_exists() {
if opkg_available; then
if opkg list-installed luci-app-openclash | grep -q 'luci-app-openclash'; then
return 0
fi
fi
return 1
}
openclash_running() {
if pgrep -f "openclash" >/dev/null 2>&1; then
return 0
fi
return 1
}
shellclash_exists() {
if id -u shellclash >/dev/null 2>&1; then
return 0
fi
if id -u shellcrash >/dev/null 2>&1; then
return 0
fi
return 1
}
shellclash_running() {
if pgrep -f "ShellCrash" >/dev/null 2>&1; then
return 0
fi
return 1
}
set_ua3f_group() {
if [ "$SERVER_MODE" = "REDIRECT" ]; then
UA3F_GROUP="root"
return
elif [ "$SERVER_MODE" = "NFQUEUE" ]; then
UA3F_GROUP="root"
return
fi
if openclash_running; then
UA3F_GROUP="nogroup"
elif shellclash_running; then
UA3F_GROUP="shellcrash"
elif openclash_exists; then
UA3F_GROUP="nogroup"
elif shellclash_exists; then
UA3F_GROUP="shellcrash"
else
UA3F_GROUP="nogroup"
fi
}
start_service() {
config_load "$NAME"
mkdir -p /var/log/ua3f
chmod o+w /var/log/ua3f
touch /var/log/ua3f/ua3f.log
local enabled
config_get_bool enabled "enabled" "enabled" "0"
[ "$enabled" -eq "1" ] || return 0
local port bind ua log_level ua_regex partial_replace
local rewrite_mode rewrite_rules
local set_ttl set_ipid del_tcpts
config_get SERVER_MODE "main" "server_mode" "TPROXY"
config_get port "main" "port" "1080"
config_get bind "main" "bind" "127.0.0.1"
config_get ua "main" "ua" "FFF"
config_get ua_regex "main" "ua_regex" ""
config_get_bool partial_replace "main" "partial_replace" 0
config_get log_level "main" "log_level" "ERROR"
config_get rewrite_mode "main" "rewrite_mode" "GLOBAL"
config_get rewrite_rules "main" "rewrite_rules" ""
config_get_bool set_ttl "main" "set_ttl" 0
config_get_bool set_ipid "main" "set_ipid" 0
config_get_bool del_tcpts "main" "del_tcpts" 0
# compose set_ttl set_ipid del_tcpts with others ",ttl,ipid,tcpts,"
local others=","
[ "$set_ipid" -eq "1" ] && others="${others}ipid,"
[ "$del_tcpts" -eq "1" ] && others="${others}tcpts,"
[ "$set_ttl" -eq "1" ] && others="${others}ttl,"
SERVER_MODE="$(echo "$SERVER_MODE" | tr '[:lower:]' '[:upper:]')"
set_ua3f_group
LOG "Server Mode: $SERVER_MODE"
LOG "Group: $UA3F_GROUP"
procd_open_instance "$NAME"
procd_set_param command "$PROG"
procd_append_param command -m "$SERVER_MODE"
procd_append_param command -p "$port"
procd_append_param command -b "$bind"
procd_append_param command -f "$ua"
procd_append_param command -r "$ua_regex"
procd_append_param command -l "$log_level"
procd_append_param command -x "$rewrite_mode"
procd_append_param command -z "$rewrite_rules"
procd_append_param command -o "$others"
[ "$partial_replace" = "1" ] && procd_append_param command -s
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param limits nproc="unlimited" as="unlimited" memlock="unlimited" nofile="65535 65535"
procd_set_param group $UA3F_GROUP
procd_close_instance
LOG "$NAME service started"
}
service_triggers() {
procd_add_reload_trigger "$NAME"
}