pull/83/merge
xiagw 2024-12-07 22:00:12 +08:00 committed by GitHub
commit ef816156b9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 288 additions and 156 deletions

View File

@ -117,17 +117,28 @@ systemd_cat_config() {
check_if_running_as_root() {
# If you want to run as another user, please modify $EUID to be owned by this user
if [[ "$EUID" -ne '0' ]]; then
if [[ "$(id -u)" -eq 0 ]]; then
return 0
else
echo "error: You must run this script as root!"
exit 1
return 1
fi
}
identify_the_operating_system_and_architecture() {
if [[ "$(uname)" != 'Linux' ]]; then
echo "error: This operating system is not supported."
exit 1
return 1
fi
# Add OpenWrt detection
if grep -q -i 'openwrt' /etc/openwrt_release 2>/dev/null; then
echo "info: OpenWrt system detected."
OPENWRT=1
else
OPENWRT=0
fi
case "$(uname -m)" in
'i386' | 'i686')
MACHINE='32'
@ -176,12 +187,23 @@ identify_the_operating_system_and_architecture() {
;;
*)
echo "error: The architecture is not supported."
exit 1
return 1
;;
esac
if [[ "$OPENWRT" -eq '1' ]]; then
if [[ ! -f '/etc/openwrt_release' ]]; then
echo "error: Not a supported OpenWrt system."
return 1
fi
PACKAGE_MANAGEMENT_INSTALL='opkg update; opkg install'
PACKAGE_MANAGEMENT_REMOVE='opkg remove'
package_provide_tput='ncurses-utils'
return 0
fi
if [[ ! -f '/etc/os-release' ]]; then
echo "error: Don't use outdated Linux distributions."
exit 1
return 1
fi
# Do not combine this judgment condition with the following judgment condition.
## Be aware of Linux distribution like Gentoo, which kernel supports switch between Systemd and OpenRC.
@ -191,7 +213,7 @@ identify_the_operating_system_and_architecture() {
true
else
echo "error: Only Linux distributions using systemd are supported."
exit 1
return 1
fi
if [[ "$(type -P apt)" ]]; then
PACKAGE_MANAGEMENT_INSTALL='apt -y --no-install-recommends install'
@ -219,7 +241,7 @@ identify_the_operating_system_and_architecture() {
package_provide_tput='ncurses'
else
echo "error: The script does not support the package manager in this operating system."
exit 1
return 1
fi
}
@ -256,7 +278,7 @@ judgment_parameters() {
'--version')
if [[ -z "$2" ]]; then
echo "error: Please specify the correct version."
exit 1
return 1
fi
temp_version='1'
SPECIFIED_VERSION="$2"
@ -272,7 +294,7 @@ judgment_parameters() {
local_install='1'
if [[ -z "$2" ]]; then
echo "error: Please specify the correct local file."
exit 1
return 1
fi
LOCAL_FILE="$2"
shift
@ -280,7 +302,7 @@ judgment_parameters() {
'-p' | '--proxy')
if [[ -z "$2" ]]; then
echo "error: Please specify the proxy server address."
exit 1
return 1
fi
PROXY="$2"
shift
@ -288,7 +310,7 @@ judgment_parameters() {
'-u' | '--install-user')
if [[ -z "$2" ]]; then
echo "error: Please specify the install user.}"
exit 1
return 1
fi
INSTALL_USER="$2"
shift
@ -310,7 +332,7 @@ judgment_parameters() {
;;
*)
echo "$0: unknown option -- -"
exit 1
return 1
;;
esac
shift
@ -319,11 +341,11 @@ judgment_parameters() {
INSTALL='1'
elif ((INSTALL+INSTALL_GEODATA+HELP+CHECK+REMOVE>1)); then
echo 'You can only choose one action.'
exit 1
return 1
fi
if [[ "$INSTALL" -eq '1' ]] && ((temp_version+local_install+REINSTALL+BETA>1)); then
echo "--version,--reinstall,--beta and --local can't be used together."
exit 1
return 1
fi
}
@ -372,7 +394,10 @@ get_latest_version() {
# Get Xray latest release version number
local tmp_file
tmp_file="$(mktemp)"
if ! curl -x "${PROXY}" -sS -H "Accept: application/vnd.github.v3+json" -o "$tmp_file" 'https://api.github.com/repos/XTLS/Xray-core/releases/latest'; then
local url='https://api.github.com/repos/XTLS/Xray-core/releases/latest'
if curl -x "${PROXY}" -sSfLo "$tmp_file" -H "Accept: application/vnd.github.v3+json" "$url"; then
echo "get release list success"
else
"rm" "$tmp_file"
echo 'error: Failed to get release list, please check your network.'
exit 1
@ -390,14 +415,16 @@ get_latest_version() {
fi
"rm" "$tmp_file"
RELEASE_LATEST="v${RELEASE_LATEST#v}"
if ! curl -x "${PROXY}" -sS -H "Accept: application/vnd.github.v3+json" -o "$tmp_file" 'https://api.github.com/repos/XTLS/Xray-core/releases'; then
if curl -x "${PROXY}" -sSfLo "$tmp_file" -H "Accept: application/vnd.github.v3+json" "$url"; then
echo "get release list success"
else
"rm" "$tmp_file"
echo 'error: Failed to get release list, please check your network.'
exit 1
fi
local releases_list
releases_list=($(sed 'y/,/\n/' "$tmp_file" | grep 'tag_name' | awk -F '"' '{print $4}'))
if [[ "${#releases_list[@]}" -eq '0' ]]; then
readarray -t releases_list < <(sed 'y/,/\n/' "$tmp_file" | grep 'tag_name' | awk -F '"' '{print $4}')
if [[ "${#releases_list[@]}" -eq 0 ]]; then
if grep -q "API rate limit exceeded" "$tmp_file"; then
echo "error: github API rate limit exceeded"
else
@ -407,14 +434,16 @@ get_latest_version() {
"rm" "$tmp_file"
exit 1
fi
local i
for i in "${!releases_list[@]}"
do
local i url_zip
for i in "${!releases_list[@]}"; do
releases_list["$i"]="v${releases_list[$i]#v}"
grep -q "https://github.com/XTLS/Xray-core/releases/download/${releases_list[$i]}/Xray-linux-$MACHINE.zip" "$tmp_file" && break
url_zip="https://github.com/XTLS/Xray-core/releases/download/${releases_list[$i]}/Xray-linux-$MACHINE.zip"
if grep -q "$url_zip" "$tmp_file"; then
PRE_RELEASE_LATEST="${releases_list[$i]}"
break
fi
done
"rm" "$tmp_file"
PRE_RELEASE_LATEST="${releases_list[$i]}"
}
version_gt() {
@ -422,7 +451,7 @@ version_gt() {
}
download_xray() {
DOWNLOAD_LINK="https://github.com/XTLS/Xray-core/releases/download/${INSTALL_VERSION}/Xray-linux-${MACHINE}.zip"
local DOWNLOAD_LINK="https://github.com/XTLS/Xray-core/releases/download/${INSTALL_VERSION}/Xray-linux-${MACHINE}.zip"
echo "Downloading Xray archive: $DOWNLOAD_LINK"
if curl -f -x "${PROXY}" -R -H 'Cache-Control: no-cache' -o "$ZIP_FILE" "$DOWNLOAD_LINK"; then
echo "ok."
@ -471,6 +500,27 @@ install_file() {
}
install_xray() {
# Install Xray binary to /usr/bin/ and /etc/xray (OpenWrt)
if [[ "$OPENWRT" -eq '1' ]]; then
cp "${TMP_DIRECTORY}/xray" "/usr/bin/xray"
chmod 755 "/usr/bin/xray"
mkdir -p /etc/xray
if [[ ! -f /etc/xray/config.json ]]; then
echo "{}" >"/etc/xray/config.json"
CONFIG_NEW='1'
fi
mkdir -p "/usr/share/xray"
cp "${TMP_DIRECTORY}/geoip.dat" "/usr/share/xray/geoip.dat"
cp "${TMP_DIRECTORY}/geosite.dat" "/usr/share/xray/geosite.dat"
mkdir -p /var/log/xray
chown -R "$INSTALL_USER_UID:$INSTALL_USER_GID" /var/log/xray
if [[ ! -f /var/log/xray/access.log ]]; then
touch /var/log/xray/access.log
touch /var/log/xray/error.log
LOG=1
fi
return 0
fi
# Install Xray binary to /usr/local/bin/ and $DAT_PATH
install_file xray
# If the file exists, geoip.dat and geosite.dat will not be installed or updated
@ -512,6 +562,74 @@ install_xray() {
}
install_startup_service_file() {
if [[ "$OPENWRT" -eq '1' ]]; then
[[ -f /etc/init.d/xray ]] && return 0
# Create OpenWrt init script
cat >/etc/init.d/xray <<'EOF'
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=99
CONF="xray"
PROG="/usr/bin/xray"
start_service() {
config_load "$CONF"
local enabled
config_get_bool enabled "enabled" "enabled" "0"
[ "$enabled" -eq "1" ] || return 1
local confdir
local conffiles
local datadir
local dialer
local format
config_get confdir "config" "confdir"
config_get conffiles "config" "conffiles"
config_get datadir "config" "datadir" "/usr/share/xray"
config_get dialer "config" "dialer"
config_get format "config" "format" "json"
procd_open_instance "$CONF"
procd_set_param command "$PROG" run
[ -n "$confdir" ] && procd_append_param command -confdir "$confdir"
[ -n "$conffiles" ] && {
for i in $conffiles
do
procd_append_param command -config "$i"
done
}
[ -n "$format" ] && procd_append_param command -format "$format"
[ -n "$dialer" ] && procd_set_param env XRAY_BROWSER_DIALER="$dialer"
procd_set_param env XRAY_LOCATION_ASSET="$datadir"
procd_set_param file $conffiles
procd_set_param limits core="unlimited"
procd_set_param limits nofile="1000000 1000000"
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param respawn
procd_close_instance
}
reload_service() {
stop
start
}
service_triggers() {
procd_add_reload_trigger "$CONF"
}
EOF
chmod +x /etc/init.d/xray
/etc/init.d/xray enable
return 0
fi
mkdir -p '/etc/systemd/system/xray.service.d'
mkdir -p '/etc/systemd/system/xray@.service.d/'
local temp_CapabilityBoundingSet="CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE"
@ -604,6 +722,15 @@ ExecStart=/usr/local/bin/xray run -config ${JSON_PATH}/%i.json" > \
}
start_xray() {
if [[ "$OPENWRT" -eq 1 ]]; then
if /etc/init.d/xray start; then
echo 'info: Start the Xray service.'
else
echo 'error: Failed to start Xray service.'
exit 1
fi
return 0
fi
if [[ -f '/etc/systemd/system/xray.service' ]]; then
systemctl start "${XRAY_CUSTOMIZE:-xray}"
sleep 1s
@ -617,6 +744,11 @@ start_xray() {
}
stop_xray() {
if [[ "$OPENWRT" -eq '1' ]]; then
/etc/init.d/xray stop
echo 'info: Stop the Xray service.'
return 0
fi
XRAY_CUSTOMIZE="$(systemctl list-units | grep 'xray@' | awk -F ' ' '{print $1}')"
if [[ -z "$XRAY_CUSTOMIZE" ]]; then
local xray_daemon_to_stop='xray.service'
@ -811,9 +943,9 @@ show_help() {
}
main() {
check_if_running_as_root
identify_the_operating_system_and_architecture
judgment_parameters "$@"
check_if_running_as_root || return 1
identify_the_operating_system_and_architecture || return 1
judgment_parameters "$@" || return 1
install_software "$package_provide_tput" 'tput'
red=$(tput setaf 1)