digitalocean-torrentdl.sh
· 2.9 KiB · Bash
Raw
#!/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/
IMAGE="ubuntu-20-04-x64"
REGION="sgp1"
SIZE="s-4vcpu-8gb"
HOSTNAME="torrent-dl"
URLREGEX='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]$'
TORRENT="$1"
DESTREMOTE="$2"
if [[ $TORRENT =~ $URLREGEX ]]; then
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
| 1 | #!/bin/bash |
| 2 | # Provisions a droplet on DigitalOcean to download a given torrent file, then reupload to a given rclone remote |
| 3 | # Prints estimated USD cost of transaction when complete |
| 4 | # uses your user's rclone.conf, so set up the remote locally and make sure it works |
| 5 | # torrentdl.sh https://releases.ubuntu.com/20.04/ubuntu-20.04.1-live-server-amd64.iso.torrent b2:my-linux-isos/ubuntu/ |
| 6 | IMAGE="ubuntu-20-04-x64" |
| 7 | REGION="sgp1" |
| 8 | SIZE="s-4vcpu-8gb" |
| 9 | HOSTNAME="torrent-dl" |
| 10 | URLREGEX='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]$' |
| 11 | TORRENT="$1" |
| 12 | DESTREMOTE="$2" |
| 13 | if [[ $TORRENT =~ $URLREGEX ]]; then |
| 14 | echo Downloading torrent from url... |
| 15 | wget "$TORRENT" -c |
| 16 | export TORRENT=`basename "$TORRENT"` |
| 17 | fi |
| 18 | |
| 19 | TORRENTSIZE=`head -1 "$TORRENT" | grep -aoE '6:lengthi[0-9]+' | cut -di -f2 | awk '{s+=$1} END {print s}'` |
| 20 | if (($TORRENTSIZE<=30000000000)); then # 30GB |
| 21 | SIZE="s-1vcpu-2gb" |
| 22 | elif (($TORRENTSIZE<=60000000000)); then # 60GB |
| 23 | SIZE="s-2vcpu-4gb" |
| 24 | elif (($TORRENTSIZE<=140000000000)); then # 140GB |
| 25 | SIZE="s-4vcpu-8gb" |
| 26 | else # up to 300GB |
| 27 | SIZE="s-8vcpu-16gb" |
| 28 | fi |
| 29 | |
| 30 | if [ -v $1 ]; then |
| 31 | echo Usage: $0 https://releases.ubuntu.com/20.04/ubuntu-20.04.1-live-server-amd64.iso.torrent b2:my-linux-isos/ubuntu/ |
| 32 | exit |
| 33 | fi |
| 34 | |
| 35 | echo "Downloading '$TORRENT' on $REGION:$IMAGE:$SIZE with hostname $HOSTNAME, then uploading to '$DESTREMOTE'" |
| 36 | read -p "Press enter to continue, ctrl-c to abort..." |
| 37 | |
| 38 | echo "Started at `date`" |
| 39 | export STARTTIME=`date +%s` |
| 40 | |
| 41 | echo "Provisioning droplet..." |
| 42 | export SSHKEYS=`doctl compute ssh-key list --no-header --format ID | tr '\n' ',' | sed 's/,$/\n/'` |
| 43 | export IP=$( set -x; doctl compute droplet create $HOSTNAME --ssh-keys $SSHKEYS --region $REGION --size $SIZE --image $IMAGE --wait --no-header --format PublicIPv4 ) |
| 44 | |
| 45 | echo -n "Droplet at $IP, waiting for connection" |
| 46 | until (ssh -o StrictHostKeyChecking=no root@$IP mkdir -p /root/.config/rclone /root/t 2>/dev/null >/dev/null); do |
| 47 | echo -n "." |
| 48 | sleep 1 |
| 49 | done |
| 50 | ssh-keyscan -H $IP 2>/dev/null >> ~/.ssh/known_hosts |
| 51 | echo |
| 52 | |
| 53 | echo Copying rclone conf and torrent to droplet... |
| 54 | scp ~/.config/rclone/rclone.conf root@$IP:/root/.config/rclone/rclone.conf |
| 55 | scp "$TORRENT" root@$IP:/root/t/ |
| 56 | |
| 57 | echo Installing dependencies... |
| 58 | ssh -t root@$IP "apt-get update; apt-get install -y aria2; curl https://rclone.org/install.sh | sudo bash" |
| 59 | echo Downloading torrent... |
| 60 | ssh -t root@$IP aria2c -d "/root/t/" --enable-dht=false --enable-peer-exchange=false --seed-time=0 "/root/t/*.torrent" |
| 61 | echo Uploading torrent to rclone remote... |
| 62 | ssh -t root@$IP rclone copy /root/t/ "$DESTREMOTE" -P --fast-list --transfers=$(($LINES-5)) |
| 63 | echo Job complete, deleting droplet |
| 64 | $(set -x; doctl compute droplet delete -f $HOSTNAME) |
| 65 | |
| 66 | echo "Finished at `date`" |
| 67 | export ENDTIME=`date +%s` |
| 68 | echo "Total run time: $(($ENDTIME-$STARTTIME))" |
| 69 | echo -n "Total (estimated) cost: USD $" |
| 70 | doctl compute size list | grep $SIZE | awk '{print $5}' | while read p; do python3 -c "print(($p/2592000)*($ENDTIME-$STARTTIME))"; done |