|
|
@@ -0,0 +1,231 @@
|
|
|
+#!/usr/bin/env ash
|
|
|
+# shellcheck shell=dash
|
|
|
+
|
|
|
+set -euo pipefail
|
|
|
+
|
|
|
+check_alpine() {
|
|
|
+ if [ -f /etc/alpine-release ]; then
|
|
|
+ return 0
|
|
|
+ else
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+check_if_running_as_root() {
|
|
|
+ # If you want to run as another user, please modify $EUID to be owned by this user
|
|
|
+ if [ "$(id -u)" -eq 0 ]; then
|
|
|
+ return 0
|
|
|
+ else
|
|
|
+ echo "error: You must run this script as root!"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+identify_architecture() {
|
|
|
+ if [ "$(uname)" != 'Linux' ]; then
|
|
|
+ echo "error: This operating system is not supported."
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ case "$(uname -m)" in
|
|
|
+ 'i386' | 'i686')
|
|
|
+ MACHINE='32'
|
|
|
+ ;;
|
|
|
+ 'amd64' | 'x86_64')
|
|
|
+ MACHINE='64'
|
|
|
+ ;;
|
|
|
+ 'armv5tel')
|
|
|
+ MACHINE='arm32-v5'
|
|
|
+ ;;
|
|
|
+ 'armv6l')
|
|
|
+ MACHINE='arm32-v6'
|
|
|
+ grep Features /proc/cpuinfo | grep -qw 'vfp' || MACHINE='arm32-v5'
|
|
|
+ ;;
|
|
|
+ 'armv7' | 'armv7l')
|
|
|
+ MACHINE='arm32-v7a'
|
|
|
+ grep Features /proc/cpuinfo | grep -qw 'vfp' || MACHINE='arm32-v5'
|
|
|
+ ;;
|
|
|
+ 'armv8' | 'aarch64')
|
|
|
+ MACHINE='arm64-v8a'
|
|
|
+ ;;
|
|
|
+ 'mips')
|
|
|
+ MACHINE='mips32'
|
|
|
+ ;;
|
|
|
+ 'mipsle')
|
|
|
+ MACHINE='mips32le'
|
|
|
+ ;;
|
|
|
+ 'mips64')
|
|
|
+ MACHINE='mips64'
|
|
|
+ lscpu | grep -q "Little Endian" && MACHINE='mips64le'
|
|
|
+ ;;
|
|
|
+ 'mips64le')
|
|
|
+ MACHINE='mips64le'
|
|
|
+ ;;
|
|
|
+ 'ppc64')
|
|
|
+ MACHINE='ppc64'
|
|
|
+ ;;
|
|
|
+ 'ppc64le')
|
|
|
+ MACHINE='ppc64le'
|
|
|
+ ;;
|
|
|
+ 'riscv64')
|
|
|
+ MACHINE='riscv64'
|
|
|
+ ;;
|
|
|
+ 's390x')
|
|
|
+ MACHINE='s390x'
|
|
|
+ ;;
|
|
|
+ *)
|
|
|
+ echo "error: The architecture is not supported."
|
|
|
+ return 1
|
|
|
+ ;;
|
|
|
+ esac
|
|
|
+ if [ ! -f '/etc/os-release' ]; then
|
|
|
+ echo "error: Don't use outdated Linux distributions."
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+install_dependencies() {
|
|
|
+ if [ -n "$(command -v curl)" ]; then
|
|
|
+ return
|
|
|
+ fi
|
|
|
+ if [ -n "$(command -v unzip)" ]; then
|
|
|
+ return
|
|
|
+ fi
|
|
|
+ if [ "$(command -v apk)" ]; then
|
|
|
+ echo "Installing required dependencies..."
|
|
|
+ apk add curl unzip
|
|
|
+ else
|
|
|
+ echo "error: The script does not support the package manager in this operating system."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+download_xray() {
|
|
|
+ echo "Downloading Xray files..."
|
|
|
+ if ! curl -f -L -H 'Cache-Control: no-cache' -o "$ZIP_FILE" "$DOWNLOAD_LINK" -#; then
|
|
|
+ echo 'error: Download failed! Please check your network or try again.'
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ if ! curl -f -L -H 'Cache-Control: no-cache' -o "$ZIP_FILE.dgst" "$DOWNLOAD_LINK.dgst" -#; then
|
|
|
+ echo 'error: Download failed! Please check your network or try again.'
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+verification_xray() {
|
|
|
+ CHECKSUM=$(awk -F '= ' '/256=/ {print $2}' "$ZIP_FILE.dgst")
|
|
|
+ LOCALSUM=$(sha256sum "$ZIP_FILE" | awk '{printf $1}')
|
|
|
+ if [ "$CHECKSUM" != "$LOCALSUM" ]; then
|
|
|
+ echo 'error: SHA256 check failed! Please check your network or try again.'
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+decompression() {
|
|
|
+ unzip -q "$ZIP_FILE" -d "$TMP_DIRECTORY"
|
|
|
+}
|
|
|
+
|
|
|
+is_it_running() {
|
|
|
+ XRAY_RUNNING='0'
|
|
|
+ if [ -n "$(pgrep xray)" ]; then
|
|
|
+ rc-service xray stop
|
|
|
+ XRAY_RUNNING='1'
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+install_xray() {
|
|
|
+ install -m 755 "${TMP_DIRECTORY}xray" "/usr/local/bin/xray"
|
|
|
+ install -d /usr/local/share/xray/
|
|
|
+ install -m 644 "${TMP_DIRECTORY}geoip.dat" "/usr/local/share/xray/geoip.dat"
|
|
|
+ install -m 644 "${TMP_DIRECTORY}geosite.dat" "/usr/local/share/xray/geosite.dat"
|
|
|
+}
|
|
|
+
|
|
|
+install_confdir() {
|
|
|
+ CONFDIR='0'
|
|
|
+ if [ ! -d '/usr/local/etc/xray/' ]; then
|
|
|
+ install -d /usr/local/etc/xray/
|
|
|
+ for BASE in 00_log 01_api 02_dns 03_routing 04_policy 05_inbounds 06_outbounds 07_transport 08_stats 09_reverse; do
|
|
|
+ echo '{}' >"/usr/local/etc/xray/$BASE.json"
|
|
|
+ done
|
|
|
+ CONFDIR='1'
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+install_log() {
|
|
|
+ LOG='0'
|
|
|
+ if [ ! -d '/var/log/xray/' ]; then
|
|
|
+ install -d -o nobody -g nobody /var/log/xray/
|
|
|
+ install -m 600 -o nobody -g nobody /dev/null /var/log/xray/access.log
|
|
|
+ install -m 600 -o nobody -g nobody /dev/null /var/log/xray/error.log
|
|
|
+ LOG='1'
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+install_startup_service_file() {
|
|
|
+ OPENRC='0'
|
|
|
+ if [ ! -f '/etc/init.d/xray' ]; then
|
|
|
+ mkdir "${TMP_DIRECTORY}init.d/"
|
|
|
+ if ! curl -f -L -o "${TMP_DIRECTORY}init.d/xray" https://raw.githubusercontent.com/XTLS/Xray-install/main/alpinelinux/init.d/xray -sS; then
|
|
|
+ echo 'error: Failed to start service file download! Please check your network or try again.'
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ install -m 755 "${TMP_DIRECTORY}init.d/xray" /etc/init.d/xray
|
|
|
+ OPENRC='1'
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+information() {
|
|
|
+ echo 'installed: /usr/local/bin/xray'
|
|
|
+ echo 'installed: /usr/local/share/xray/geoip.dat'
|
|
|
+ echo 'installed: /usr/local/share/xray/geosite.dat'
|
|
|
+ if [ "$CONFDIR" -eq '1' ]; then
|
|
|
+ echo 'installed: /usr/local/etc/xray/00_log.json'
|
|
|
+ echo 'installed: /usr/local/etc/xray/01_api.json'
|
|
|
+ echo 'installed: /usr/local/etc/xray/02_dns.json'
|
|
|
+ echo 'installed: /usr/local/etc/xray/03_routing.json'
|
|
|
+ echo 'installed: /usr/local/etc/xray/04_policy.json'
|
|
|
+ echo 'installed: /usr/local/etc/xray/05_inbounds.json'
|
|
|
+ echo 'installed: /usr/local/etc/xray/06_outbounds.json'
|
|
|
+ echo 'installed: /usr/local/etc/xray/07_transport.json'
|
|
|
+ echo 'installed: /usr/local/etc/xray/08_stats.json'
|
|
|
+ echo 'installed: /usr/local/etc/xray/09_reverse.json'
|
|
|
+ fi
|
|
|
+ if [ "$LOG" -eq '1' ]; then
|
|
|
+ echo 'installed: /var/log/xray/'
|
|
|
+ fi
|
|
|
+ if [ "$OPENRC" -eq '1' ]; then
|
|
|
+ echo 'installed: /etc/init.d/xray'
|
|
|
+ fi
|
|
|
+ rm -r "$TMP_DIRECTORY"
|
|
|
+ echo "removed: $TMP_DIRECTORY"
|
|
|
+ echo "You may need to execute a command to remove dependent software: apk del curl unzip"
|
|
|
+ if [ "$XRAY_RUNNING" -eq '1' ]; then
|
|
|
+ rc-service xray start
|
|
|
+ else
|
|
|
+ echo 'Please execute the command: rc-update add xray; rc-service xray start'
|
|
|
+ fi
|
|
|
+ echo "info: Xray is installed."
|
|
|
+}
|
|
|
+
|
|
|
+main() {
|
|
|
+ check_alpine || return 1
|
|
|
+ check_if_running_as_root || return 1
|
|
|
+ identify_architecture || return 1
|
|
|
+ install_dependencies
|
|
|
+
|
|
|
+ TMP_DIRECTORY="$(mktemp -d)/"
|
|
|
+ ZIP_FILE="${TMP_DIRECTORY}Xray-linux-$MACHINE.zip"
|
|
|
+ DOWNLOAD_LINK="https://github.com/XTLS/Xray-core/releases/latest/download/Xray-linux-$MACHINE.zip"
|
|
|
+
|
|
|
+ download_xray
|
|
|
+ verification_xray
|
|
|
+ decompression
|
|
|
+ is_it_running
|
|
|
+ install_xray
|
|
|
+ install_confdir
|
|
|
+ install_log
|
|
|
+ install_startup_service_file || return 1
|
|
|
+ information
|
|
|
+}
|
|
|
+
|
|
|
+main
|