#!/usr/bin/env ash # shellcheck shell=dash set -euxo 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_software() { if [ -n "$(command -v curl)" ]; then return fi if [ -n "$(command -v unzip)" ]; then return fi if [ "$(command -v apk)" ]; then apk add curl unzip else echo "error: The script does not support the package manager in this operating system." exit 1 fi } download_xray() { if ! curl -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 -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 755 "${TMP_DIRECTORY}geoip.dat" "/usr/local/share/xray/geoip.dat" install -m 755 "${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 -o "${TMP_DIRECTORY}init.d/xray" https://raw.githubusercontent.com/XTLS/Xray-install/main/alpinelinux/init.d/xray -s; 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_software 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 information } main