Skip to content

Instantly share code, notes, and snippets.

@GokhanOfficial
Last active June 12, 2025 18:10
Show Gist options
  • Save GokhanOfficial/b3519ceba1da2ca8b67082fe1fd5b4fa to your computer and use it in GitHub Desktop.
Save GokhanOfficial/b3519ceba1da2ca8b67082fe1fd5b4fa to your computer and use it in GitHub Desktop.
Install Teldrive Rclone with 7za
#!/bin/bash
if [ "$DEBUG" == "1" ]; then
set -x
fi
TMP_DIR=$(mktemp -d -t installer-XXXXXXXXXX)
function cleanup {
rm -rf $TMP_DIR > /dev/null
}
function fail {
cleanup
msg=$1
echo "============"
echo "Error: $msg" 1>&2
exit 1
}
function move {
#move into PATH or cwd
chmod +x $1 || fail "chmod +x failed"
#move without sudo
OUT=$(mv $1 $2 2>&1)
STATUS=$?
# failed and string contains "Permission denied"
if [ $STATUS -ne 0 ]; then
if [[ $OUT =~ "Permission denied" ]]; then
echo "mv with sudo..."
sudo mv $1 $2 || fail "sudo mv failed"
else
fail "mv failed ($OUT)"
fi
fi
echo "Installed at $2"
}
function install {
#settings
USER="tgdrive"
PROG="rclone"
ASPROG=""
DEFAULT_ARCH=""
MOVE="true"
PRIVATE="false"
TOKEN=$GITHUB_TOKEN
INSECURE="false"
OUT_DIR="/usr/bin"
GH="https://github.com"
#bash check
[ ! "$BASH_VERSION" ] && fail "Please use bash instead"
[ ! -d $OUT_DIR ] && fail "output directory missing: $OUT_DIR"
#dependency check, assume we are a standard POISX machine
which find > /dev/null || fail "find not installed"
which xargs > /dev/null || fail "xargs not installed"
which sort > /dev/null || fail "sort not installed"
which tail > /dev/null || fail "tail not installed"
which cut > /dev/null || fail "cut not installed"
which du > /dev/null || fail "du not installed"
#choose an HTTP client
GET=""
if which curl > /dev/null; then
GET="curl"
if [[ $INSECURE = "true" ]]; then GET="$GET --insecure"; fi
GET="$GET --fail -s -L"
elif which wget > /dev/null; then
GET="wget"
if [[ $INSECURE = "true" ]]; then GET="$GET --no-check-certificate"; fi
GET="$GET -qO-"
else
fail "neither wget/curl are installed"
fi
#debug HTTP
if [ "$DEBUG" == "1" ]; then
GET="$GET -v"
fi
if [ "$PRIVATE" = "true" ] && [ -n "$TOKEN" ]; then
GET="$GET -H 'Authorization: token $TOKEN' -H 'Accept: application/octet-stream'"
fi
#find OS #TODO BSDs and other posixs
case `uname -s` in
Darwin) OS="darwin";;
Linux) OS="linux";;
*) fail "unknown os: $(uname -s)";;
esac
#find ARCH
if uname -m | grep -E '(arm|arch)64' > /dev/null; then
ARCH="arm64"
elif uname -m | grep 64 > /dev/null; then
ARCH="amd64"
elif uname -m | grep arm > /dev/null; then
ARCH="arm" #TODO armv6/v7
elif uname -m | grep 386 > /dev/null; then
ARCH="386"
else
fail "unknown arch: $(uname -m)"
fi
if [ ! -z "$DEFAULT_ARCH" ]; then
ARCH="$DEFAULT_ARCH"
fi
#choose from asset list
URL=""
FTYPE=""
case "${OS}_${ARCH}" in
"linux_amd64")
URL="https://github.com/tgdrive/rclone/releases/download/v1.69.2/rclone-v1.69.2-linux-amd64.zip"
FTYPE=".zip"
;;
"linux_arm")
URL="https://github.com/tgdrive/rclone/releases/download/v1.69.2/rclone-v1.69.2-linux-arm-v7.zip"
FTYPE=".zip"
;;
"linux_arm64")
URL="https://github.com/tgdrive/rclone/releases/download/v1.69.2/rclone-v1.69.2-linux-arm64.zip"
FTYPE=".zip"
;;
"darwin_amd64")
URL="https://github.com/tgdrive/rclone/releases/download/v1.69.2/rclone-v1.69.2-osx-amd64.zip"
FTYPE=".zip"
;;
"darwin_arm64")
URL="https://github.com/tgdrive/rclone/releases/download/v1.69.2/rclone-v1.69.2-osx-arm64.zip"
FTYPE=".zip"
;;
"windows_amd64")
URL="https://github.com/tgdrive/rclone/releases/download/v1.69.2/rclone-v1.69.2-windows-amd64.zip"
FTYPE=".zip"
;;
"windows_arm64")
URL="https://github.com/tgdrive/rclone/releases/download/v1.69.2/rclone-v1.69.2-windows-arm64.zip"
FTYPE=".zip"
;;
*) fail "No asset for platform ${OS}-${ARCH}";;
esac
#got URL! download it...
echo -n "Installing"
echo -n " $USER/$PROG"
echo -n " v1.69.1"
if [ ! -z "$ASPROG" ]; then
echo -n " as $ASPROG"
fi
echo -n " (${OS}/${ARCH})"
#enter tempdir
mkdir -p $TMP_DIR
cd $TMP_DIR
if [[ $FTYPE = ".gz" ]]; then
which gzip > /dev/null || fail "gzip is not installed"
bash -c "$GET $URL" | gzip -d - > $PROG || fail "download failed"
elif [[ $FTYPE = ".bz2" ]]; then
which bzip2 > /dev/null || fail "bzip2 is not installed"
bash -c "$GET $URL" | bzip2 -d - > $PROG || fail "download failed"
elif [[ $FTYPE = ".tar.bz" ]] || [[ $FTYPE = ".tar.bz2" ]]; then
which tar > /dev/null || fail "tar is not installed"
which bzip2 > /dev/null || fail "bzip2 is not installed"
bash -c "$GET $URL" | tar jxf - || fail "download failed"
elif [[ $FTYPE = ".tar.gz" ]] || [[ $FTYPE = ".tgz" ]]; then
which tar > /dev/null || fail "tar is not installed"
which gzip > /dev/null || fail "gzip is not installed"
bash -c "$GET $URL" | tar zxf - || fail "download failed"
elif [[ $FTYPE = ".tar.xz" ]] || [[ $FTYPE = ".txz" ]]; then
which tar > /dev/null || fail "tar is not installed"
which xz > /dev/null || fail "xz is not installed"
bash -c "$GET $URL" | tar -xJf - || fail "download failed"
elif [[ $FTYPE = ".zip" ]]; then
which 7za > /dev/null || fail "7za is not installed"
bash -c "$GET $URL" > tmp.zip || fail "download failed"
7za x tmp.zip || fail "7za extraction failed"
rm tmp.zip || fail "cleanup failed"
elif [[ $FTYPE = ".bin" ]]; then
bash -c "$GET $URL" > "rclone_${OS}_${ARCH}" || fail "download failed"
else
fail "unknown file type: $FTYPE"
fi
if [ ! -z "$ASPROG" ]; then
# Split ASPROG into array using comma as delimiter
IFS=',' read -ra BINARIES <<< "$ASPROG"
for BIN in "${BINARIES[@]}"; do
# Trim whitespace
BIN=$(echo "$BIN" | tr -d '[:space:]')
DEST="$OUT_DIR/$BIN"
# Search for the binary in entire directory structure
TMP_BIN=$(find . -type f -name "*$BIN*" | head -n 1)
if [ ! -f "$TMP_BIN" ]; then
fail "could not find binary: $BIN"
fi
move "$TMP_BIN" "$DEST"
done
else
# Find the largest executable file in the entire directory structure
TMP_BIN=$(find . -type f -executable | xargs du | sort -n | tail -n 1 | cut -f 2)
if [ ! -f "$TMP_BIN" ]; then
# If no executable foun d, just get the largest file
TMP_BIN=$(find . -type f | xargs du | sort -n | tail -n 1 | cut -f 2)
if [ ! -f "$TMP_BIN" ]; then
fail "could not find binary (largest file)"
fi
fi
move "$TMP_BIN" "$OUT_DIR/$(basename "$TMP_BIN")"
fi
cleanup
}
install
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment