Last active
June 12, 2025 18:10
-
-
Save GokhanOfficial/b3519ceba1da2ca8b67082fe1fd5b4fa to your computer and use it in GitHub Desktop.
Install Teldrive Rclone with 7za
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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