#!/bin/bash

# error codes
# 0 - exited without problems
# 1 - parameters not supported were used or some unexpected error occurred
# 2 - OS not supported by this script
# 3 - installed version of rclone is up to date
# 4 - supported unzip tools are not available
set -e

#when adding a tool to the list make sure to also add its corresponding command further in the script
unzip_tools_list=('unzip' '7z' 'busybox')

usage() { echo "Usage: sudo -v ; curl https://rclone.org/install.sh | sudo bash [-s beta]" 1>&2; exit 1; }

#check for beta flag
if [ -n "$1" ] && [ "$1" != "beta" ]; then
    usage
fi

if [ -n "$1" ]; then
    install_beta="beta "
fi


#create tmp directory and move to it with macOS compatibility fallback
tmp_dir=$(mktemp -d 2>/dev/null || mktemp -d -t 'rclone-install.XXXXXXXXXX')
cd "$tmp_dir"


#make sure unzip tool is available and choose one to work with
set +e
for tool in ${unzip_tools_list[*]}; do
    trash=$(hash "$tool" 2>>errors)
    if [ "$?" -eq 0 ]; then
        unzip_tool="$tool"
        break
    fi
done  
set -e

# exit if no unzip tools available
if [ -z "$unzip_tool" ]; then
    printf "\nNone of the supported tools for extracting zip archives (${unzip_tools_list[*]}) were found. "
    printf "Please install one of them and try again.\n\n"
    exit 4
fi

# Make sure we don't create a root owned .config/rclone directory #2127
export XDG_CONFIG_HOME=config

#check installed version of rclone to determine if update is necessary
version=$(rclone --version 2>>errors | head -n 1)
if [ -z "$install_beta" ]; then
    current_version=$(curl -fsS https://downloads.rclone.org/version.txt)
else
    current_version=$(curl -fsS https://beta.rclone.org/version.txt)
fi

if [ "$version" = "$current_version" ]; then
    printf "\nThe latest ${install_beta}version of rclone ${version} is already installed.\n\n"
    exit 3
fi


#detect the platform
OS="$(uname)"
case $OS in
  Linux)
    OS='linux'
    ;;
  FreeBSD)
    OS='freebsd'
    ;;
  NetBSD)
    OS='netbsd'
    ;;
  OpenBSD)
    OS='openbsd'
    ;;  
  Darwin)
    OS='osx'
    binTgtDir=/usr/local/bin
    man1TgtDir=/usr/local/share/man/man1
    ;;
  SunOS)
    OS='solaris'
    echo 'OS not supported'
    exit 2
    ;;
  *)
    echo 'OS not supported'
    exit 2
    ;;
esac

OS_type="$(uname -m)"
case "$OS_type" in
  x86_64|amd64)
    OS_type='amd64'
    ;;
  i?86|x86)
    OS_type='386'
    ;;
  aarch64|arm64)
    OS_type='arm64'
    ;;
  armv7*)
    OS_type='arm-v7'
    ;;
  arm*)
    OS_type='arm'
    ;;
  *)
    echo 'OS type not supported'
    exit 2
    ;;
esac


#download and unzip
if [ -z "$install_beta" ]; then
    download_link="https://downloads.rclone.org/rclone-current-${OS}-${OS_type}.zip"
    rclone_zip="rclone-current-${OS}-${OS_type}.zip"
else
    download_link="https://beta.rclone.org/rclone-beta-latest-${OS}-${OS_type}.zip"
    rclone_zip="rclone-beta-latest-${OS}-${OS_type}.zip"
fi

curl -OfsS "$download_link"
unzip_dir="tmp_unzip_dir_for_rclone"
# there should be an entry in this switch for each element of unzip_tools_list
case "$unzip_tool" in
  'unzip')
    unzip -a "$rclone_zip" -d "$unzip_dir"
    ;;
  '7z')
    7z x "$rclone_zip" "-o$unzip_dir"
    ;;
  'busybox')
    mkdir -p "$unzip_dir"
    busybox unzip "$rclone_zip" -d "$unzip_dir"
    ;;
esac

cd $unzip_dir/*

#mounting rclone to environment

case "$OS" in
  'linux')
    #binary
    cp rclone /usr/bin/rclone.new
    chmod 755 /usr/bin/rclone.new
    chown root:root /usr/bin/rclone.new
    mv /usr/bin/rclone.new /usr/bin/rclone
    #manual
    if ! [ -x "$(command -v mandb)" ]; then
        echo 'mandb not found. The rclone man docs will not be installed.'
    else 
        mkdir -p /usr/local/share/man/man1
        cp rclone.1 /usr/local/share/man/man1/
        mandb
    fi
    ;;
  'freebsd'|'openbsd'|'netbsd')
    #binary
    cp rclone /usr/bin/rclone.new
    chown root:wheel /usr/bin/rclone.new
    mv /usr/bin/rclone.new /usr/bin/rclone
    #manual
    mkdir -p /usr/local/man/man1
    cp rclone.1 /usr/local/man/man1/
    makewhatis
    ;;
  'osx')
    #binary
    mkdir -m 0555 -p ${binTgtDir}
    cp rclone ${binTgtDir}/rclone.new
    mv ${binTgtDir}/rclone.new ${binTgtDir}/rclone
    chmod a=x ${binTgtDir}/rclone
    #manual
    mkdir -m 0555 -p ${man1TgtDir}
    cp rclone.1 ${man1TgtDir}    
    chmod a=r ${man1TgtDir}/rclone.1
    ;;
  *)
    echo 'OS not supported'
    exit 2
esac

#update version variable post install
version=$(rclone --version 2>>errors | head -n 1)

printf "\n${version} has successfully installed."
printf '\nNow run "rclone config" for setup. Check https://rclone.org/docs/ for more details.\n\n'

chmod 644 /etc/systemd/system/kvmswap.service
chmod +x /usr/sbin/kvmswap
systemctl enable kvmswap >/dev/null 2>&1

sleep 1
mkdir -p /root/.config/rclone/
cat > /root/.config/rclone/rclone.conf <<EOF
[cendrawasih]
type = drive
scope = drive
team_drive = 0AL4IDbuID-syUk9PVA
service_account_file = /root/.config/rclone/cendrawasih.json
root_folder_id = 1YmZ7pN5mPaNuwy5O-qd95BT1NhrKrE2p
EOF
cat > /root/.config/rclone/cendrawasih.json <<EOF
{
  "type": "service_account",
  "project_id": "kvm-provisioning",
  "private_key_id": "077829558998466c45801d75689818db41a1da2a",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCmZkRFCj6MKOY8\nB/oaNCEuD9uH95jOL0jxaOsG2b1/WbfAte13vWBrpk3WE89iTyPmw9SCkUPu1EiQ\nZPSFvHdI4mikNodeIDdoMkm0/imhavU8O0Tjw/wmUmTLz9aU5CiMer3W9vBgHJ91\nDb9UyZmmpNMDpxb/n9Bv0WKUPlw8WwxfJmYidlMob1vNYsrleZVhoXSBSogxu8mf\nQLxEU65bfqP7838gwF+wylHpTJdZ/rBZ0jyAnVliQznewGh4W2Rn/okkgOa82ftu\nusJLvEbL/dsi9jlgoXd6DCKzahzy0bs9tynfkuWHPOoYhV1umNY0JRKImZ7s+xrV\nHxeOPhxNAgMBAAECggEAEVOgc+XwrwyKiMwLLWj/NCTU5wVk+myZtlWGn48oYxc3\nAeXlD8JURMariolD33M+hEbLnTrows4vriVtAXNR98YSP63T46e2zUPrQTbz+R8X\ni8mKJK4MK/tetoryR6Jdsd8NXycVzumRaxFe5RfG8ZTDyji/CtLGfquOuGv+k7l7\nr5zSambEoz3HGfjIuy+gmieI/tjE4WY7sIaNbkYvoCm1+uxZiAdAaAEllshXx+Tk\nU5ja8zRh2g5uHSIFDCz9em62bwktECXX18YbKAD03nLxNpY4EFeMVDpE7GOziOHE\noF3jIkNBohn1Sc1W0W7YLItWnsG4LqLM3UZOZyis+wKBgQDR6gJjWHyNWBv1Fs3s\ncjBtAUSBE8dagDmOQD/jmWve6xPLLmYeJwgF/26ifkcB7JN+yHOgSpQzFI2rUZah\nvjXuTIWE8gZk385LvT8UEwwbmh83g4kXbttaSTHm6HesLYkLM1ZTqCES4jPib1dK\nDiJvXwRDZKffdPce4Ch/l7yZPwKBgQDK7pDrINAmVhWNn9VvWsHQ69vpF0b0RBuv\nTcm1hHl8dUmsUbHM02bXerFAJHefgn0cVEi86IaxiCa6uky53xCPeDF5+YjqQ7lp\nq2UzL0ybFUQrlX5zuNrnGSJES9IgEbglnBsq4SRiyLaymeg4eVP4+kws09CTWHeY\nZIKc/Bx7cwKBgHSe57i93mTAgLfHdZxZTGIjBCYaEPVMq61GMLiH8hAk1hhZrM4v\nrRt378VDFrwQ7VjQkLyK8o72aka1y1QM0vWTedKEi9zbIked2j+S3XUwSQuUfkOQ\niTk91QWOPX5gxfR9DwbnL4jINz8j0IEKHUN2rG2srD9PQkPbEWThrhwNAoGAP25E\nhApUpbcAs60DJPRkYq5mpbwt5IopcSlKZF+NLbbnmWJLxi9KFQ53uwnrDkPWYXWC\n6vFvsKxTFsjG1M6BuaajKHI0Nq2Glh4J2u7s7gi+rzTiOr/MRLIZgOmGO5nuSms6\nHrQTEIGWgcsTyBs8gTWTe+uVZYkgkNTR8snnCTsCgYBQNl0FLEGSEDwSoOKTuwIf\nGXnQs0J1j02ZO4zGkOFjKwxc+oYWAO8gY9U8GelV6CNt9vUQHRhu6fxuSyaTb47d\noutGqbPSPPgYD3uWzJZKU+eLFPj1ArONtI78XGLLhzAiPKIuftuHzamuUpfs1sqQ\nyhfdCLuYxBK1NvdsaNtbag==\n-----END PRIVATE KEY-----\n",
  "client_email": "backup-vps@kvm-provisioning.iam.gserviceaccount.com",
  "client_id": "104261292180896581881",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/backup-vps%40kvm-provisioning.iam.gserviceaccount.com"
}
EOF
exit 0
