diff --git a/README.md b/README.md index b645666..6176ae0 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,13 @@ ```sh cargo install --git https://github.com/EasyTier/EasyTier.git ``` + + 4. **Install by script (For Linux Only)** + ```sh + curl -fsSL "https://raw.githubusercontent.com/EasyTier/EasyTier/main/script/easytier.sh" | bash -s install + ``` + + You can aslo uninstall Easytier by the commend "uninstall" of this script ## Quick Start diff --git a/README_CN.md b/README_CN.md index 941d321..a90b8d4 100644 --- a/README_CN.md +++ b/README_CN.md @@ -49,6 +49,13 @@ cargo install --git https://github.com/EasyTier/EasyTier.git ``` +4. **使用一键脚本安装 (仅适用于 Linux)** + ```sh + curl -fsSL "https://raw.githubusercontent.com/EasyTier/EasyTier/main/script/easytier.sh" | bash -s install + ``` + + 使用本脚本安装的 Easytier 可以使用脚本的 uninstall 对其卸载 + ## 快速开始 > 下文仅描述命令行工具的使用,图形界面程序可参考下述概念自行配置。 diff --git a/script/easytier.sh b/script/easytier.sh new file mode 100644 index 0000000..f092b77 --- /dev/null +++ b/script/easytier.sh @@ -0,0 +1,318 @@ +#!/bin/bash + +# This script copy from alist , Thank for it! + +# INSTALL_PATH='/opt/easytier' +VERSION='latest' + +SKIP_FOLDER_VERIFY=false +SKIP_FOLDER_FIX=false + +COMMEND=$1 +shift + +# Check path +if [[ "$#" -ge 1 && ! "$1" == --* ]]; then + INSTALL_PATH=$1 + shift +fi + +# Check other option +while [[ "$#" -gt 0 ]]; do + case $1 in + --skip-folder-verify) SKIP_FOLDER_VERIFY=true ;; + --skip-folder-fix) SKIP_FOLDER_FIX=true ;; + *) echo "Unknown option: $1"; exit 1 ;; + esac + shift +done + +if [ -z "$INSTALL_PATH" ]; then + INSTALL_PATH='/opt/easytier' +fi + +if [[ "$INSTALL_PATH" == */ ]]; then + INSTALL_PATH=${INSTALL_PATH%?} +fi + +if ! $SKIP_FOLDER_FIX && ! [[ "$INSTALL_PATH" == */easytier ]]; then + INSTALL_PATH="$INSTALL_PATH/easytier" +fi + +echo INSTALL PATH : $INSTALL_PATH +echo SKIP FOLDER FIX : $SKIP_FOLDER_FIX +echo SKIP FOLDER VERIFY : $SKIP_FOLDER_VERIFY + +RED_COLOR='\e[1;31m' +GREEN_COLOR='\e[1;32m' +YELLOW_COLOR='\e[1;33m' +BLUE_COLOR='\e[1;34m' +PINK_COLOR='\e[1;35m' +SHAN='\e[1;33;5m' +RES='\e[0m' +# clear + +echo -e "\r\n${RED_COLOR}----------------------NOTICE----------------------${RES}\r\n" +echo " This is a temporary script to install EasyTier " +echo " EasyTier requires a dedicated empty folder to install" +echo " EasyTier is a developing product and may have some issues " +echo " Using EasyTier requires some basic skills " +echo " You need to face the risks brought by using EasyTier at your own risk " +echo -e "\r\n${RED_COLOR}-------------------------------------------------${RES}\r\n" + +read -p "Enter \"yes\" to accept our policy and continue: " -r agreement +if [[ ! "$agreement" =~ ^[Yy]es$ ]] +then + echo "You do not accept your policy, the script will exit ..." + exit 1 +fi + +# Get platform +if command -v arch >/dev/null 2>&1; then + platform=$(arch) +else + platform=$(uname -m) +fi + +case "$platform" in + amd64 | x86_64) + ARCH="x86_64" + ;; + arm64 | aarch64 | *armv8*) + ARCH="aarch64" + ;; + *armv7*) + ARCH="armv7" + ;; + *arm*) + ARCH="arm" + ;; + mips) + ARCH="mips" + ;; + mipsel) + ARCH="mipsel" + ;; + *) + ARCH="UNKNOWN" + ;; +esac + +# support hf +if [[ "$ARCH" == "armv7" || "$ARCH" == "arm" ]]; then + if cat /proc/cpuinfo | grep Features | grep -i 'half' >/dev/null 2>&1; then + ARCH=${ARCH}hf + fi +fi + +echo -e "\r\n${GREEN_COLOR}Your platform: ${ARCH} (${platform}) ${RES}\r\n" 1>&2 + +GH_PROXY='https://mirror.ghproxy.com/' + +if [ "$(id -u)" != "0" ]; then + echo -e "\r\n${RED_COLOR}This script requires run as Root !${RES}\r\n" 1>&2 + exit 1 +elif [ "$ARCH" == "UNKNOWN" ]; then + echo -e "\r\n${RED_COLOR}Opus${RES}, this script do not support your platfrom\r\nTry ${GREEN_COLOR}install by band${RES}\r\n" + exit 1 +elif ! command -v systemctl >/dev/null 2>&1; then + echo -e "\r\n${RED_COLOR}Opus${RES}, your Linux do not support systemctl\r\nnTry ${GREEN_COLOR}install by band${RES}\r\n" + exit 1 +else + if command -v netstat >/dev/null 2>&1; then + check_port=$(netstat -lnp | grep 11010 | awk '{print $7}' | awk -F/ '{print $1}') + else + echo -e "${GREEN_COLOR}Check port ...${RES}" + if command -v yum >/dev/null 2>&1; then + yum install net-tools -y >/dev/null 2>&1 + check_port=$(netstat -lnp | grep 11010 | awk '{print $7}' | awk -F/ '{print $1}') + else + apt-get update >/dev/null 2>&1 + apt-get install net-tools -y >/dev/null 2>&1 + check_port=$(netstat -lnp | grep 11010 | awk '{print $7}' | awk -F/ '{print $1}') + fi + fi +fi + +CHECK() { + if ! $SKIP_FOLDER_VERIFY; then + if [ -f "$INSTALL_PATH/easytier-core" ]; then + echo "There is EasyTier in $INSTALL_PATH. Please choose other path or use \"update\"" + echo -e "Or use Try ${GREEN_COLOR}--skip-folder-verify${RES} to skip" + exit 0 + fi + fi + if [ $check_port ]; then + kill -9 $check_port + fi + if [ ! -d "$INSTALL_PATH/" ]; then + mkdir -p $INSTALL_PATH + else + # Check weather path is empty + if ! $SKIP_FOLDER_VERIFY; then + if [ -n "$(ls -A $INSTALL_PATH)" ]; then + echo "EasyTier requires to be installed in an empty directory. Please choose a empty path" + echo -e "Or use Try ${GREEN_COLOR}--skip-folder-verify${RES} to skip" + echo -e "Current path: $INSTALL_PATH ( use ${GREEN_COLOR}--skip-folder-fix${RES} to disable folder fix )" + exit 1 + fi + fi + fi +} + +INSTALL() { + # Get version number + RESPONSE=$(curl -s "https://api.github.com/repos/EasyTier/EasyTier/releases/latest") + LATEST_VERSION=$(echo "$RESPONSE" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') + LATEST_VERSION=$(echo -e "$LATEST_VERSION" | tr -d '[:space:]') + + if [ -z "$LATEST_VERSION" ]; then + echo -e "\r\n${RED_COLOR}Opus${RES}, failure to get latest version. Check your internel\r\nOr try ${GREEN_COLOR}install by band${RES}\r\n" + exit 1 + fi + + # Download + echo -e "\r\n${GREEN_COLOR}Downloading EasyTier $LATEST_VERSION ...${RES}" + rm -rf /tmp/easytier_tmp_install.zip + curl -L ${GH_PROXY}https://github.com/EasyTier/EasyTier/releases/latest/download/easytier-linux-${ARCH}-${LATEST_VERSION}.zip -o /tmp/easytier_tmp_install.zip $CURL_BAR + # Unzip resource + echo -e "\r\n${GREEN_COLOR}Unzip resource ...${RES}" + unzip -o /tmp/easytier_tmp_install.zip -d $INSTALL_PATH/ + mv $INSTALL_PATH/easytier-linux-${ARCH}/* $INSTALL_PATH/ + rm -rf $INSTALL_PATH/easytier-linux-${ARCH}/ + if [ -f $INSTALL_PATH/easytier-core ] || [ -f $INSTALL_PATH/easytier-cli ]; then + echo -e "${GREEN_COLOR} Download successfully! ${RES}" + else + echo -e "${RED_COLOR} Download failed! ${RES}" + exit 1 + fi +} + +INIT() { + if [ ! -f "$INSTALL_PATH/easytier-core" ]; then + echo -e "\r\n${RED_COLOR}Opus${RES}, unable to find EasyTier\r\n" + exit 1 + fi + + # Create systemd + cat >/etc/systemd/system/easytier.service <$INSTALL_PATH/run.sh </dev/null 2>&1 + systemctl start easytier + + # For issues from the previous version + rm -rf /usr/bin/easytier-core + rm -rf /usr/bin/easytier-cli + + # Add link + ln -s $INSTALL_PATH/easytier-core /usr/sbin/easytier-core + ln -s $INSTALL_PATH/easytier-cli /usr/sbin/easytier-cli +} + +SUCCESS() { + clear + echo " Install EasyTier successfully!" + echo -e "\r\nDefault Port: ${GREEN_COLOR}11010(UDP+TCP)${RES}, Notice allowing in firewall!\r\n" + + echo -e "Staartup script path: ${GREEN_COLOR}$INSTALL_PATH/run.sh${RES}\n\r\n\rFor more advanced opinions, please modify the startup script" + + echo + echo -e "Status: ${GREEN_COLOR}systemctl status easytier${RES}" + echo -e "Start: ${GREEN_COLOR}systemctl start easytier${RES}" + echo -e "Restart: ${GREEN_COLOR}systemctl restart easytier${RES}" + echo -e "Stop: ${GREEN_COLOR}systemctl stop easytier${RES}" + echo +} + +UNINSTALL() { + echo -e "\r\n${GREEN_COLOR}Uninstall EasyTier ...${RES}\r\n" + echo -e "${GREEN_COLOR}Stop process ...${RES}" + systemctl disable easytier >/dev/null 2>&1 + systemctl stop easytier >/dev/null 2>&1 + echo -e "${GREEN_COLOR}Delete files ...${RES}" + rm -rf $INSTALL_PATH /etc/systemd/system/easytier.service /usr/bin/easytier-core /usr/bin/easytier-cli + systemctl daemon-reload + echo -e "\r\n${GREEN_COLOR}EasyTier was removed successfully! ${RES}\r\n" +} + +UPDATE() { + if [ ! -f "$INSTALL_PATH/easytier-core" ]; then + echo -e "\r\n${RED_COLOR}Opus${RES}, unable to find EasyTier\r\n" + exit 1 + else + echo + echo -e "${GREEN_COLOR}Stopping EasyTier process${RES}\r\n" + systemctl stop easytier + # Backup + rm -rf /tmp/easytier_tmp_update + mkdir -p /tmp/easytier_tmp_update + cp -a $INSTALL_PATH/* /tmp/easytier_tmp_update/ + INSTALL + if [ -f $INSTALL_PATH/easytier-core ]; then + echo -e "${GREEN_COLOR} Vrify successfully ${RES}" + else + echo -e "${RED_COLOR} Download failed, unable to update${RES}" + echo "Rollback all ..." + rm -rf $INSTALL_PATH/* + mv /tmp/easytier_tmp_update/* $INSTALL_PATH/ + systemctl start easytier + exit 1 + fi + echo -e "\r\n${GREEN_COLOR} Starting EasyTier process${RES}" + systemctl start easytier + echo -e "\r\n${GREEN_COLOR} EasyTier was the latest stable version! ${RES}\r\n" + fi +} + +# CURL progress +if curl --help | grep progress-bar >/dev/null 2>&1; then # $CURL_BAR + CURL_BAR="--progress-bar" +fi + +# The temp directory must exist +if [ ! -d "/tmp" ]; then + mkdir -p /tmp +fi + +echo $COMMEND + +if [ $COMMEND = "uninstall" ]; then + UNINSTALL +elif [ $COMMEND = "update" ]; then + UPDATE +elif [ $COMMEND = "install" ]; then + CHECK + INSTALL + INIT + if [ -f "$INSTALL_PATH/easytier-core" ]; then + SUCCESS + else + echo -e "${RED_COLOR} Install fail, try install by hand${RES}" + fi +else + echo -e "${RED_COLOR} Error Commend ${RES}\n\r" + echo " ALLOW:" + echo -e "\n\r${GREEN_COLOR} install, uninstall, update ${RES}" +fi + +rm -rf /tmp/easytier_tmp_* \ No newline at end of file