#!/usr/bin/env bash main(){ os=''; arch=''; case $(uname) in Linux) os='linux'; case $(uname -m) in i386 | i686) arch='386' ;; x86_64 | amd64) arch='amd64' ;; armv8 | arm64 | aarch64) arch='arm64' ;; *) echo 'unsupported CPU' && exit 1 ;; esac; ;; *) echo 'unsupported OS' && exit 1 ;; esac; build_arch=$os_$arch; if [ -z "$PROG_PATH" ] || [ -z "$PROG_NAME" ] || [ -z "$REPO" ]; then usage exit 1 fi echo "Update for $REPO" api_url="https://$API_DOMAIN/repos/$REPO/releases/latest" dl_url=$(curl -sSf $api_url | grep -i $build_arch | grep browser_download_url | cut -d '"' -f 4) dl_url=$(echo $dl_url | sed -i -r s/$GH_DOMAIN/$DL_DOMAIN/g) curr_ver=$($PROG_PATH/$PROG_NAME -v) if (echo $dl_url | grep -i $curr_ver) >/dev/null 2>&1; then echo "Already latest version!" else tmp_dir="/tmp/$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)" mkdir -p "$tmp_dir" pushd "$tmp_dir" >/dev/null ext=$(echo $dl_url | awk -F'.' '{print $NF}') if (echo $ext | grep -i zip) >/dev/null 2>&1; then curl -Sfo pkg.zip "$dl_url" unzip -o pkg.zip else curl -Sfo pkg.tar.$ext "$dl_url" tar -xvf pkg.tar.$ext fi if [ ! -z "$PKG_DIR" ]; then cd $PKG_DIR fi cp -f "$PROG_NAME" "$PROG_PATH/" echo "Update Complete ($curr_ver -> $($PROG_PATH/$PROG_NAME -v))!" popd >/dev/null rm -rf "$tmp_dir" if [ ! -z "$SRV_NAME" ]; then systemctl restart $SRV_NAME fi fi } usage(){ echo "Usage: $0 [OPTIONS]"; echo "Options:"; echo " -p Program path"; echo " -n Program name"; echo " -r Github repo"; echo " -d Dir inside package"; echo " -s Service name"; echo " -a API domain"; echo " -b Download domain"; } PROG_PATH= PROG_NAME= REPO= PKG_DIR= SRV_NAME= API_DOMAIN=api.github.com GH_DOMAIN=github.com DL_DOMAIN=github.com while getopts ":p:n:r:d:s:a:b:" OPT; do case $OPT in p) PROG_PATH=$OPTARG; ;; n) PROG_NAME=$OPTARG; ;; r) REPO=$OPTARG; ;; d) PKG_DIR=$OPTARG; ;; s) SRV_NAME=$OPTARG; ;; a) API_DOMAIN=$OPTARG; ;; b) DL_DOMAIN=$OPTARG; ;; :) echo "Option -$OPTARG requires an argument."; exit 1;; ?) echo "Invalid Option: -$OPTARG"; usage; exit 1;; esac; done; main