diff --git a/install.sh b/install.sh index 9daeafb..34896b1 100644 --- a/install.sh +++ b/install.sh @@ -1 +1,260 @@ -test +#!/bin/bash + +# Get Username +uname=$(whoami) +admintoken=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c16) + +ARCH=$(uname -m) + + +# identify OS +if [ -f /etc/os-release ]; then + # freedesktop.org and systemd + . /etc/os-release + OS=$NAME + VER=$VERSION_ID + + UPSTREAM_ID=${ID_LIKE,,} + + # Fallback to ID_LIKE if ID was not 'ubuntu' or 'debian' + if [ "${UPSTREAM_ID}" != "debian" ] && [ "${UPSTREAM_ID}" != "ubuntu" ]; then + UPSTREAM_ID="$(echo ${ID_LIKE,,} | sed s/\"//g | cut -d' ' -f1)" + fi + + +elif type lsb_release >/dev/null 2>&1; then + # linuxbase.org + OS=$(lsb_release -si) + VER=$(lsb_release -sr) +elif [ -f /etc/lsb-release ]; then + # For some versions of Debian/Ubuntu without lsb_release command + . /etc/lsb-release + OS=$DISTRIB_ID + VER=$DISTRIB_RELEASE +elif [ -f /etc/debian_version ]; then + # Older Debian/Ubuntu/etc. + OS=Debian + VER=$(cat /etc/debian_version) +elif [ -f /etc/SuSe-release ]; then + # Older SuSE/etc. + OS=SuSE + VER=$(cat /etc/SuSe-release) +elif [ -f /etc/redhat-release ]; then + # Older Red Hat, CentOS, etc. + OS=RedHat + VER=$(cat /etc/redhat-release) +else + # Fall back to uname, e.g. "Linux ", also works for BSD, etc. + OS=$(uname -s) + VER=$(uname -r) +fi + + +# output ebugging info if $DEBUG set +if [ "$DEBUG" = "true" ]; then + echo "OS: $OS" + echo "VER: $VER" + echo "UPSTREAM_ID: $UPSTREAM_ID" + exit 0 +fi + +# Setup prereqs for server +# common named prereqs +PREREQ="curl wget unzip tar" +PREREQDEB="dnsutils ufw" +PREREQRPM="bind-utils" +PREREQARCH="bind" + +echo "Installing prerequisites" +if [ "${ID}" = "debian" ] || [ "$OS" = "Ubuntu" ] || [ "$OS" = "Debian" ] || [ "${UPSTREAM_ID}" = "ubuntu" ] || [ "${UPSTREAM_ID}" = "debian" ]; then + sudo apt-get update + sudo apt-get install -y ${PREREQ} ${PREREQDEB} # git +elif [ "$OS" = "CentOS" ] || [ "$OS" = "RedHat" ] || [ "${UPSTREAM_ID}" = "rhel" ] ; then +# opensuse 15.4 fails to run the relay service and hangs waiting for it +# needs more work before it can be enabled +# || [ "${UPSTREAM_ID}" = "suse" ] + sudo yum update -y + sudo yum install -y ${PREREQ} ${PREREQRPM} # git +elif [ "${ID}" = "arch" ] || [ "${UPSTREAM_ID}" = "arch" ]; then + sudo pacman -Syu + sudo pacman -S ${PREREQ} ${PREREQARCH} +else + echo "Unsupported OS" + # here you could ask the user for permission to try and install anyway + # if they say yes, then do the install + # if they say no, exit the script + exit 1 +fi + +# Setting up firewall + +ufw allow 21115:21119/tcp +ufw allow 22/tcp +ufw allow 21116/udp +sudo ufw enable + +# Make Folder /opt/rustdesk/ +if [ ! -d "/opt/rustdesk" ]; then + echo "Creating /opt/rustdesk" + sudo mkdir -p /opt/rustdesk/ +fi +sudo chown "${uname}" -R /opt/rustdesk +cd /opt/rustdesk/ || exit 1 + + +#Download latest version of Rustdesk +RDLATEST=$(curl https://api.github.com/repos/rustdesk/rustdesk-server-pro/releases/latest -s | grep "tag_name"| awk '{print substr($2, 2, length($2)-3) }') + +echo "Installing Rustdesk Server" +if [ "${ARCH}" = "x86_64" ] ; then +wget https://github.com/rustdesk/rustdesk-server-pro/releases/download/1.1.8/rustdesk-server-linux-amd64.zip +unzip rustdesk-server-linux-amd64.zip +mv amd64/* /opt/rustdesk/ +elif [ "${ARCH}" = "armv7l" ] ; then +wget "https://github.com/rustdesk/rustdesk-server-pro/releases/download/${RDLATEST}/rustdesk-server-linux-armv7.zip" +unzip rustdesk-server-linux-armv7.zip +mv armv7/* /opt/rustdesk/ +elif [ "${ARCH}" = "aarch64" ] ; then +wget "https://github.com/rustdesk/rustdesk-server-pro/releases/download/${RDLATEST}/rustdesk-server-linux-arm64v8.zip" +unzip rustdesk-server-linux-arm64v8.zip +mv arm64v8/* /opt/rustdesk/ +fi + +chmod +x /opt/rustdesk/hbbs +chmod +x /opt/rustdesk/hbbr + + +# Make Folder /var/log/rustdesk/ +if [ ! -d "/var/log/rustdesk" ]; then + echo "Creating /var/log/rustdesk" + sudo mkdir -p /var/log/rustdesk/ +fi +sudo chown "${uname}" -R /var/log/rustdesk/ + +# Setup Systemd to launch hbbs +rustdesksignal="$(cat << EOF +[Unit] +Description=Rustdesk Signal Server +[Service] +Type=simple +LimitNOFILE=1000000 +ExecStart=/opt/rustdesk/hbbs +WorkingDirectory=/opt/rustdesk/ +User=${uname} +Group=${uname} +Restart=always +StandardOutput=append:/var/log/rustdesk/signalserver.log +StandardError=append:/var/log/rustdesk/signalserver.error +# Restart service after 10 seconds if node service crashes +RestartSec=10 +[Install] +WantedBy=multi-user.target +EOF +)" +echo "${rustdesksignal}" | sudo tee /etc/systemd/system/rustdesksignal.service > /dev/null +sudo systemctl daemon-reload +sudo systemctl enable rustdesksignal.service +sudo systemctl start rustdesksignal.service + +# Setup Systemd to launch hbbr +rustdeskrelay="$(cat << EOF +[Unit] +Description=Rustdesk Relay Server +[Service] +Type=simple +LimitNOFILE=1000000 +ExecStart=/opt/rustdesk/hbbr +WorkingDirectory=/opt/rustdesk/ +User=${uname} +Group=${uname} +Restart=always +StandardOutput=append:/var/log/rustdesk/relayserver.log +StandardError=append:/var/log/rustdesk/relayserver.error +# Restart service after 10 seconds if node service crashes +RestartSec=10 +[Install] +WantedBy=multi-user.target +EOF +)" +echo "${rustdeskrelay}" | sudo tee /etc/systemd/system/rustdeskrelay.service > /dev/null +sudo systemctl daemon-reload +sudo systemctl enable rustdeskrelay.service +sudo systemctl start rustdeskrelay.service + +while ! [[ $CHECK_RUSTDESK_READY ]]; do + CHECK_RUSTDESK_READY=$(sudo systemctl status rustdeskrelay.service | grep "Active: active (running)") + echo -ne "Rustdesk Relay not ready yet...${NC}\n" + sleep 3 +done + +pubname=$(find /opt/rustdesk -name "*.pub") +key=$(cat "${pubname}") + +echo "Tidying up install" +if [ "${ARCH}" = "x86_64" ] ; then +rm rustdesk-server-linux-amd64.zip +rm -rf amd64 +elif [ "${ARCH}" = "armv7l" ] ; then +rm rustdesk-server-linux-armv7.zip +rm -rf armv7 +elif [ "${ARCH}" = "aarch64" ] ; then +rm rustdesk-server-linux-arm64v8.zip +rm -rf arm64v8 +fi + +# Choice for DNS or IP +PS3='Choose your preferred option, IP or DNS/Domain:' +WAN=("IP" "DNS/Domain") +select WANOPT in "${WAN[@]}"; do +case $WANOPT in +"IP") +wanip=$(dig @resolver4.opendns.com myip.opendns.com +short) +ufw allow 21114/tcp + +ufw enable && ufw reload +break +;; + +"DNS/Domain") +echo -ne "Enter your preferred domain/dns address ${NC}: " +read wanip +#check wanip is valid domain +if ! [[ $wanip =~ ^[a-zA-Z0-9]+([a-zA-Z0-9.-]*[a-zA-Z0-9]+)?$ ]]; then + echo -e "${RED}Invalid domain/dns address${NC}" + exit 1 +fi +apt -y install nginx +apt -y install python3-certbot-nginx + +rustdesknginx="$( + cat </dev/null + +rm /etc/nginx/sites-available/default +rm /etc/nginx/sites-enabled/default + +sudo ln -s /etc/nginx/sites-available/rustdesk.conf /etc/nginx/sites-enabled/rustdesk.conf + +ufw allow 80/tcp +ufw allow 443/tcp + +ufw enable && ufw reload + +certbot --nginx -d ${wanip} + +break +;; +*) echo "invalid option $REPLY";; +esac +done + +echo -e "Your IP/DNS Address is ${wanip}" +echo -e "Your public key is ${key}"