#!/usr/bin/env sh # Options # # -V, --verbose # Enable verbose output for the installer # # -f, -y, --force, --yes # Skip the confirmation prompt during installation TERMSCP_VERSION="0.4.2" GITHUB_URL="https://github.com/veeso/termscp/releases/download/v${TERMSCP_VERSION}" DEB_URL="${GITHUB_URL}/termscp_${TERMSCP_VERSION}_amd64.deb" RPM_URL="${GITHUB_URL}/termscp-${TERMSCP_VERSION}-1.x86_64.rpm" set -eu printf "\n" BOLD="$(tput bold 2>/dev/null || printf '')" GREY="$(tput setaf 0 2>/dev/null || printf '')" UNDERLINE="$(tput smul 2>/dev/null || printf '')" RED="$(tput setaf 1 2>/dev/null || printf '')" GREEN="$(tput setaf 2 2>/dev/null || printf '')" YELLOW="$(tput setaf 3 2>/dev/null || printf '')" BLUE="$(tput setaf 4 2>/dev/null || printf '')" MAGENTA="$(tput setaf 5 2>/dev/null || printf '')" NO_COLOR="$(tput sgr0 2>/dev/null || printf '')" # Functions info() { printf '%s\n' "${BOLD}${GREY}>${NO_COLOR} $*" } warn() { printf '%s\n' "${YELLOW}! $*${NO_COLOR}" } error() { printf '%s\n' "${RED}x $*${NO_COLOR}" >&2 } completed() { printf '%s\n' "${GREEN}✓${NO_COLOR} $*" } has() { command -v "$1" 1>/dev/null 2>&1 } get_tmpfile() { local suffix suffix="$1" if has mktemp; then printf "%s.%s" "$(mktemp)" "${suffix}" else # No really good options here--let's pick a default + hope printf "/tmp/termscp.%s" "${suffix}" fi } download() { output="$1" url="$2" if has curl; then cmd="curl --fail --silent --location --output $output $url" elif has wget; then cmd="wget --quiet --output-document=$output $url" elif has fetch; then cmd="fetch --quiet --output=$output $url" else error "No HTTP download program (curl, wget, fetch) found, exiting…" return 1 fi $cmd && return 0 || rc=$? error "Command failed (exit code $rc): ${BLUE}${cmd}${NO_COLOR}" warn "If you believe this is a bug, please report immediately an issue to " return $rc } elevate_priv() { if ! has sudo; then error 'Could not find the command "sudo", needed to install termscp on your system.' info "If you are on Windows, please run your shell as an administrator, then" info "rerun this script. Otherwise, please run this script as root, or install" info "sudo." exit 1 fi if ! sudo -v; then error "Superuser not granted, aborting installation" exit 1 fi } test_writeable() { local path path="${1:-}/test.txt" if touch "${path}" 2>/dev/null; then rm "${path}" return 0 else return 1 fi } # Currently supporting: # - macos # - linux # - freebsd detect_platform() { local platform platform="$(uname -s | tr '[:upper:]' '[:lower:]')" case "${platform}" in linux) platform="linux" ;; darwin) platform="macos" ;; freebsd) platform="freebsd" ;; esac printf '%s' "${platform}" } # Currently supporting: # - x86_64 detect_arch() { local arch arch="$(uname -m | tr '[:upper:]' '[:lower:]')" case "${arch}" in amd64) arch="x86_64" ;; armv*) arch="arm" ;; arm64) arch="aarch64" ;; esac # `uname -m` in some cases mis-reports 32-bit OS as 64-bit, so double check if [ "${arch}" = "x86_64" ] && [ "$(getconf LONG_BIT)" -eq 32 ]; then arch="i686" elif [ "${arch}" = "aarch64" ] && [ "$(getconf LONG_BIT)" -eq 32 ]; then arch="arm" fi if [ "${arch}" != "x86_64" ]; then error "Unsupported arch ${arch}" return 1 fi printf '%s' "${arch}" } confirm() { if [ -z "${FORCE-}" ]; then printf "%s " "${MAGENTA}?${NO_COLOR} $* ${BOLD}[y/N]${NO_COLOR}" set +e read -r yn " fi } try_with_cargo() { err="$1" if has cargo; then info "Installing termscp via Cargo..." cargo install termscp else error "$err" error "Alternatively you can opt for installing Cargo " return 1 fi } # defaults if [ -z "${PLATFORM-}" ]; then PLATFORM="$(detect_platform)" fi if [ -z "${BIN_DIR-}" ]; then BIN_DIR=/usr/local/bin fi if [ -z "${ARCH-}" ]; then ARCH="$(detect_arch)" fi if [ -z "${BASE_URL-}" ]; then BASE_URL="https://github.com/starship/starship/releases" fi # parse argv variables while [ "$#" -gt 0 ]; do case "$1" in -V | --verbose) VERBOSE=1 shift 1 ;; -f | -y | --force | --yes) FORCE=1 shift 1 ;; -V=* | --verbose=*) VERBOSE="${1#*=}" shift 1 ;; -f=* | -y=* | --force=* | --yes=*) FORCE="${1#*=}" shift 1 ;; *) error "Unknown option: $1" exit 1 ;; esac done printf " %s\n" "${UNDERLINE}Termscp configuration${NO_COLOR}" info "${BOLD}Platform${NO_COLOR}: ${GREEN}${PLATFORM}${NO_COLOR}" info "${BOLD}Arch${NO_COLOR}: ${GREEN}${ARCH}${NO_COLOR}" # non-empty VERBOSE enables verbose untarring if [ -n "${VERBOSE-}" ]; then VERBOSE=v info "${BOLD}Verbose${NO_COLOR}: yes" else VERBOSE= fi printf "\n" confirm "Install ${GREEN}termscp ${TERMSCP_VERSION}${NO_COLOR}?" # Installation based on arch case $PLATFORM in "freebsd") install_on_bsd ;; "linux") install_on_linux ;; "macos") install_on_macos ;; *) error "${PLATFORM} is not supported by this installer" exit 1 ;; esac completed "Congratulations! Termscp has successfully been installed on your system!" info "If you're a new user, you might be interested in reading the user manual " info "While if you've just updated your termscp version, you can find the changelog at this link " info "Remember that if you encounter any issue, you can report them on Github " info "Feel free to open an issue also if you have an idea which could improve the project" info "If you want to support the project, please, consider a little donation " info "I hope you'll enjoy using termscp :D" exit 0