#!/bin/bash # source: https://github.com/trojan-gfw/trojan-quickstart set -eo pipefail # trojan: 0, trojan-go: 1 TYPE=0 INSTALL_VERSION="" while [[ $# > 0 ]];do KEY="$1" case $KEY in -v|--version) INSTALL_VERSION="$2" echo -e "prepare install $INSTALL_VERSION version..\n" shift ;; -g|--go) TYPE=1 ;; *) # unknown option ;; esac shift # past argument or value done ############################# function prompt() { while true; do read -p "$1 [y/N] " yn case $yn in [Yy] ) return 0;; [Nn]|"" ) return 1;; esac done } if [[ $(id -u) != 0 ]]; then echo Please run this script as root. exit 1 fi ARCH=$(uname -m 2> /dev/null) if [[ $ARCH != x86_64 && $ARCH != aarch64 ]];then echo "not support $ARCH machine". exit 1 fi if [[ $TYPE == 0 && $ARCH != x86_64 ]];then echo "trojan not support $ARCH machine" exit 1 fi if [[ $TYPE == 0 ]];then CHECKVERSION="https://api.github.com/repos/trojan-gfw/trojan/releases/latest" else CHECKVERSION="https://api.github.com/repos/p4gefau1t/trojan-go/releases" fi NAME=trojan if [[ -z $INSTALL_VERSION ]];then VERSION=$(curl -H 'Cache-Control: no-cache' -s "$CHECKVERSION" | grep 'tag_name' | cut -d\" -f4 | sed 's/v//g' | head -n 1) else if [[ -z `curl -H 'Cache-Control: no-cache' -s "$CHECKVERSION"|grep 'tag_name'|grep $INSTALL_VERSION` ]];then echo "no $INSTALL_VERSION version file!" exit 1 fi VERSION=`echo "$INSTALL_VERSION"|sed 's/v//g'` fi if [[ $TYPE == 0 ]];then TARBALL="$NAME-$VERSION-linux-amd64.tar.xz" DOWNLOADURL="https://github.com/trojan-gfw/$NAME/releases/download/v$VERSION/$TARBALL" else [[ $ARCH == x86_64 ]] && TARBALL="trojan-go-linux-amd64.zip" || TARBALL="trojan-go-linux-armv8.zip" DOWNLOADURL="https://github.com/p4gefau1t/trojan-go/releases/download/v$VERSION/$TARBALL" fi TMPDIR="$(mktemp -d)" INSTALLPREFIX="/usr/bin/$NAME" SYSTEMDPREFIX=/etc/systemd/system BINARYPATH="$INSTALLPREFIX/$NAME" CONFIGPATH="/usr/local/etc/$NAME/config.json" SYSTEMDPATH="$SYSTEMDPREFIX/$NAME.service" echo Creating $NAME install directory mkdir -p $INSTALLPREFIX /usr/local/etc/$NAME echo Entering temp directory $TMPDIR... cd "$TMPDIR" echo Downloading $NAME $VERSION... curl -LO --progress-bar "$DOWNLOADURL" || wget -q --show-progress "$DOWNLOADURL" echo Unpacking $NAME $VERSION... if [[ $TYPE == 0 ]];then tar xf "$TARBALL" cd "$NAME" else if [[ -z `command -v unzip` ]];then if [[ `command -v dnf` ]];then dnf install unzip -y elif [[ `command -v yum` ]];then yum install unzip -y elif [[ `command -v apt-get` ]];then apt-get install unzip -y fi fi unzip "$TARBALL" mv trojan-go trojan fi echo Installing $NAME $VERSION to $BINARYPATH... install -Dm755 "$NAME" "$BINARYPATH" echo Installing $NAME server config to $CONFIGPATH... if ! [[ -f "$CONFIGPATH" ]] || prompt "The server config already exists in $CONFIGPATH, overwrite?"; then cat > "$CONFIGPATH" << EOF { "run_type": "server", "local_addr": "0.0.0.0", "local_port": 443, "remote_addr": "127.0.0.1", "remote_port": 80, "password": [ "password1", "password2" ], "log_level": 1, "ssl": { "cert": "/path/to/certificate.crt", "key": "/path/to/private.key", "key_password": "", "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384", "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384", "prefer_server_cipher": true, "alpn": [ "http/1.1" ], "alpn_port_override": { "h2": 81 }, "reuse_session": true, "session_ticket": false, "session_timeout": 600, "plain_http_response": "", "curves": "", "dhparam": "" }, "tcp": { "prefer_ipv4": false, "no_delay": true, "keep_alive": true, "reuse_port": false, "fast_open": false, "fast_open_qlen": 20 }, "mysql": { "enabled": false, "server_addr": "127.0.0.1", "server_port": 3306, "database": "trojan", "username": "trojan", "password": "", "key": "", "cert": "", "ca": "" } } EOF else echo Skipping installing $NAME server config... fi if [[ -d "$SYSTEMDPREFIX" ]]; then echo Installing $NAME systemd service to $SYSTEMDPATH... [[ $TYPE == 1 ]] && { NAME="trojan-go"; FLAG="-config"; } cat > "$SYSTEMDPATH" << EOF [Unit] Description=$NAME After=network.target network-online.target nss-lookup.target mysql.service mariadb.service mysqld.service [Service] Type=simple StandardError=journal ExecStart=$BINARYPATH $FLAG $CONFIGPATH ExecReload=/bin/kill -HUP \$MAINPID Restart=on-failure RestartSec=3s [Install] WantedBy=multi-user.target EOF echo Reloading systemd daemon... systemctl daemon-reload fi echo Deleting temp directory $TMPDIR... rm -rf "$TMPDIR" echo Done!