#!/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" }