op-packages/luci-app-xjay/files/xjay.init
github-actions[bot] 32600acc60 🌴 Sync 2026-03-05 23:51:42
2026-03-05 23:51:42 +08:00

139 lines
4.6 KiB
Bash

#!/bin/sh /etc/rc.common
START=90
STOP=15
USE_PROCD=1
NAME=xjay
GENERATE_CONF="/usr/share/xjay/utils/gen_config.lua"
GENERAL_FIRST_SECTION=""
GENERAL_FIRST_SECTION=""
DEFAULT_INBOUND_CFG=""
DEFAULT_OUTBOUND_CFG=""
# call back funtion to invoked when config_load parse each config
# here we parse the first general section
config_cb(){
local type="$1"
local name="$2"
if [ "$type" == "general" ] && [ "$GENERAL_FIRST_SECTION" == "" ]; then
GENERAL_FIRST_SECTION="$name"
elif [ "$type" == "inbound" ] && [ "$INBOUND_FIRST_SECTION" == "" ]; then
INBOUND_FIRST_SECTION="$name"
elif [ "$type" == "outbound" ] && [ "$OUTBOUND_FIRST_SECTION" == "" ]; then
OUTBOUND_FIRST_SECTION="$name"
elif [ "$type" == "misc" ] && [ "$MISC_FIRST_SECTION" == "" ]; then
MISC_FIRST_SECTION="$name"
fi
}
log_procd_set_param() {
local type="$1"
shift
logger -st xjay[$$] -p4 "Using procd_set_param $type" "$@"
}
start_xjay() {
logger -st xjay[$$] -p4 "Starting Xray from $1"
procd_open_instance
procd_set_param respawn 1 1 0
procd_set_param command $1
procd_append_param command run
procd_append_param command -confdir
procd_append_param command /var/etc/xjay
procd_set_param limits nofile="163840 327680"
procd_set_param env XRAY_LOCATION_ASSET=/usr/share/xray
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param file /etc/config/xjay
procd_set_param pidfile /var/run/xjay.pid
procd_close_instance
}
gen_config_file() {
mkdir -p /var/etc/xjay
rm -f /var/etc/xjay/*
logger -st xjay[$$] -p4 "Generating Xray configuration files..."
/usr/bin/lua ${GENERATE_CONF} > /var/etc/xjay/config.json
}
start_service() {
config_load $NAME
# if not enabled exit without doing anything
local enabled=""
local xray_path=""
config_get enabled $GENERAL_FIRST_SECTION enabled
[ "$enabled" != "true" ] && logger -st xjay[$$] -p4 "Diabled, exiting..." && return
# if default inbound is not set or deleted, then exit
local default_inbound=""
config_get default_inbound $INBOUND_FIRST_SECTION default_inbound
[ "$default_inbound" == "" ] && logger -st xjay[$$] -p4 "No default inbound set, exiting..." && return
# if default outbound is not set or deleted, then exit
local default_outbound=""
config_get default_outbound $OUTBOUND_FIRST_SECTION default_outbound
[ "$default_outbound" == "" ] && logger -st xjay[$$] -p4 "No default outbound set, exiting..." && return
# find default inbound by matching tag
# we do not use config id because when delete an inbound
# the config id of default inbound may be changed
find_default_inbound_cfg() {
local cfg_id="$1"
local tag=$(config_get $cfg_id tag)
if [ "$tag" = "$default_inbound" ]; then
DEFAULT_INBOUND_CFG="$cfg_id"
logger -st xjay[$$] -p4 "Using default inbound: [$tag]..."
fi
}
config_foreach find_default_inbound_cfg inbound_service
[ "$DEFAULT_INBOUND_CFG" == "" ] && logger -st xjay[$$] -p4 "Default inbound not found, exiting..." && return
# find default outbound by matching tag
# we do not use config id because when delete an outbound
# the config id of default outbound may be changed
find_default_outbound_cfg() {
local cfg_id="$1"
local tag=$(config_get $cfg_id tag)
if [ "$tag" = "$default_outbound" ]; then
DEFAULT_OUTBOUND_CFG="$cfg_id"
fi
}
config_foreach find_default_outbound_cfg outbound_server
[ "$DEFAULT_OUTBOUND_CFG" == "" ] && \
[ "$default_outbound" != "direct" ] && \
[ "$default_outbound" != "blackhole" ] && \
logger -st xjay[$$] -p4 "Default outbound not found, exiting..." && return
logger -st xjay[$$] -p4 "Using default outbound: [$default_outbound]..."
# check xray bin and start it
mkdir -p /var/run /var/etc
config_get xray_path $MISC_FIRST_SECTION xray_path
command -v ${xray_path} > /dev/null 2>&1 || return 1
gen_config_file
start_xjay ${xray_path}
# set up firewall rules for routing
/usr/share/xjay/firewall/firewall_xjay.sh "$DEFAULT_INBOUND_CFG"
# restart xjay when wan IP changed
# to ensure new WAN IP will be added to rule
ln -s /usr/share/xjay/firewall/xjay-iface-wan-ip.hotplug /etc/hotplug.d/iface/90-xjay-iface-wan-ip
}
stop_service() {
rm -rf /etc/hotplug.d/iface/90-xjay-iface-wan-ip
/usr/share/xjay/firewall/firewall_reset.sh
}
reload_service() {
stop
start
}
service_triggers() {
procd_add_reload_trigger "xjay"
}