Skip to content

Instantly share code, notes, and snippets.

@blha303
Last active January 27, 2021 08:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save blha303/cda113a650af34291b97631b3c0b04d5 to your computer and use it in GitHub Desktop.
Save blha303/cda113a650af34291b97631b3c0b04d5 to your computer and use it in GitHub Desktop.
Provisions a droplet on DigitalOcean to download a given torrent file, then reupload to a given rclone remote
#!/bin/bash
# Provisions a droplet on DigitalOcean to download a given torrent file, then reupload to a given rclone remote
# Prints estimated USD cost of transaction when complete
# uses your user's rclone.conf, so set up the remote locally and make sure it works
# torrentdl.sh https://releases.ubuntu.com/20.04/ubuntu-20.04.1-live-server-amd64.iso.torrent b2:my-linux-isos/ubuntu/
echo "Checking dependencies (wget, installed doctl, configured rclone)"
[ -s "$HOME/.config/rclone/rclone.conf" ] || (echo "Set up rclone (from rclone.org, not from package manager) with a remote, or write to ~/.config/rclone/rclone.conf, then run this script again"; exit)
if type doctl >/dev/null 2>&1; then
if ! doctl compute droplet list >/dev/null 2>&1; then
echo doctl not authenticated, running doctl auth init
doctl auth init
fi
else
echo 'doctl not found, attempting to install with "go get github.com/digitalocean/doctl/cmd/doctl"'
if ! go version >/dev/null 2>&1; then
echo golang-go not found, installing gvm and go1.15.6 to ~/.gvm in 5 seconds. Ctrl-C to abort
sleep 5
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
source ~/.gvm/scripts/gvm
gvm install go1.4 -B
gvm use go1.4
export GOROOT_BOOTSTRAP=$GOROOT
gvm install go1.15.6
gvm use --default go1.15.6
fi
go get github.com/digitalocean/doctl/cmd/doctl
doctl auth init
fi
IMAGE="ubuntu-20-04-x64"
REGION="sgp1"
HOSTNAME="torrent-dl"
URLREGEX='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]$'
TORRENT="$1"
DESTREMOTE="$2"
if [[ $TORRENT =~ $URLREGEX ]]; then
if ! type wget >/dev/null 2>&1; then
echo wget not found for downloading torrent file from url, installing from apt using sudo.
echo "If this isn't right for your environment, install wget before running script again"
sudo apt-get install -y wget || exit
fi
echo Downloading torrent from url...
wget "$TORRENT" -c
export TORRENT=`basename "$TORRENT"`
fi
TORRENTSIZE=`head -1 "$TORRENT" | grep -aoE '6:lengthi[0-9]+' | cut -di -f2 | awk '{s+=$1} END {print s}'`
if (($TORRENTSIZE<=30000000000)); then # 30GB
SIZE="s-1vcpu-2gb"
elif (($TORRENTSIZE<=60000000000)); then # 60GB
SIZE="s-2vcpu-4gb"
elif (($TORRENTSIZE<=140000000000)); then # 140GB
SIZE="s-4vcpu-8gb"
else # up to 300GB
SIZE="s-8vcpu-16gb"
fi
if [ -v $1 ]; then
echo Usage: $0 https://releases.ubuntu.com/20.04/ubuntu-20.04.1-live-server-amd64.iso.torrent b2:my-linux-isos/ubuntu/
exit
fi
echo "Downloading '$TORRENT' on $REGION:$IMAGE:$SIZE with hostname $HOSTNAME, then uploading to '$DESTREMOTE'"
read -p "Press enter to continue, ctrl-c to abort..."
echo "Started at `date`"
export STARTTIME=`date +%s`
echo "Provisioning droplet..."
export SSHKEYS=`doctl compute ssh-key list --no-header --format ID | tr '\n' ',' | sed 's/,$/\n/'`
export IP=$( set -x; doctl compute droplet create $HOSTNAME --ssh-keys $SSHKEYS --region $REGION --size $SIZE --image $IMAGE --wait --no-header --format PublicIPv4 )
echo -n "Droplet at $IP, waiting for connection"
until (ssh -o StrictHostKeyChecking=no root@$IP mkdir -p /root/.config/rclone /root/t 2>/dev/null >/dev/null); do
echo -n "."
sleep 1
done
ssh-keyscan -H $IP 2>/dev/null >> ~/.ssh/known_hosts
echo
echo Copying rclone conf and torrent to droplet...
scp ~/.config/rclone/rclone.conf root@$IP:/root/.config/rclone/rclone.conf
scp "$TORRENT" root@$IP:/root/t/
echo Installing dependencies...
ssh -t root@$IP "apt-get update; apt-get install -y aria2; curl https://rclone.org/install.sh | sudo bash"
echo Downloading torrent...
ssh -t root@$IP aria2c -d "/root/t/" --enable-dht=false --enable-peer-exchange=false --seed-time=0 "/root/t/*.torrent"
echo Uploading torrent to rclone remote...
ssh -t root@$IP rclone copy /root/t/ "$DESTREMOTE" -P --fast-list --transfers=$(($LINES-5))
echo Job complete, deleting droplet
$(set -x; doctl compute droplet delete -f $HOSTNAME)
echo "Finished at `date`"
export ENDTIME=`date +%s`
echo "Total run time: $(($ENDTIME-$STARTTIME))"
echo -n "Total (estimated) cost: USD $"
doctl compute size list | grep $SIZE | awk '{print $5}' | while read p; do python3 -c "print(($p/2592000)*($ENDTIME-$STARTTIME))"; done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment