Skip to content

Instantly share code, notes, and snippets.

@benpitman
Last active January 6, 2020 11:04
Show Gist options
  • Select an option

  • Save benpitman/773fe7fc24b9dd5d86ed6df5d6c86c5c to your computer and use it in GitHub Desktop.

Select an option

Save benpitman/773fe7fc24b9dd5d86ed6df5d6c86c5c to your computer and use it in GitHub Desktop.

Revisions

  1. benpitman revised this gist Jan 6, 2020. No changes.
  2. benpitman revised this gist Jan 6, 2020. 1 changed file with 36 additions and 21 deletions.
    57 changes: 36 additions & 21 deletions install_tmux.sh
    Original file line number Diff line number Diff line change
    @@ -81,11 +81,11 @@ updateStatus ()

    case $statusCode in
    (0) {
    printf '\e[32m%-11s\e[0m\n' "Success"
    printf '\e[31mError:\e[0m %3s\n' $errorCode
    [[ -n "$error" ]] && printf '%s\n\n' "$error" || echo
    };;
    (1) {
    printf '\e[31mError:\e[0m %3s\n' $errorCode
    [[ -n "$error" ]] && printf '%s\n\n' "$error"
    printf '\e[32m%-11s\e[0m\n' "Success"
    };;
    (2) {
    printf '\e[34m%s\e[0m\e[10D' "Downloading"
    @@ -121,9 +121,9 @@ installFromRepo ()
    do
    showProgress "${packages[$packageIndex]}" $packageIndex $packageCount

    error=$( $_sudo apt-get -y install "${packages[$packageIndex]}" 2>&1 >/dev/null )
    error=$( $_sudo yum -y install "${packages[$packageIndex]}" 2>&1 >/dev/null )

    updateStatus $(( $? > 0 )) $? "$error"
    updateStatus $(( $? == 0 )) $? "$error"
    done
    }

    @@ -133,47 +133,61 @@ installFromGit ()
    local -r -- repo="${1#*/}"
    local -r -- link="https://api.github.com/repos/${account}/${repo}/releases/latest"
    local -r -- tmpDir="/tmp/${account}_${repo}"
    local -r -- tmpFile="${RANDOM}.tar.gz"
    local -r -- tmpFile="/dev/shm/dump_${RANDOM}.txt"

    local -- tarFile=
    local -- error=

    printf "\nInstalling from git...\n"

    showProgress "${account}/${repo}"

    if [[ ! -d "$tmpDir" ]]; then
    _foldersToRemove+=( "$tmpDir" )
    mkdir "$tmpDir" 2>/dev/null
    fi

    cd "$tmpDir"

    updateStatus 2
    error=$( wget -qO- "$link" 2>&1 >/dev/null | grep -Pom1 '(?<=download_url": ").+?gz(?=")' | wget -iqO "$tmpFile" 2>&1 >/dev/null)
    updateStatus $(( $? > 0 ? 1 : 3 )) $? "$error"
    (( $? )) || return
    error=$( wget -qO "$tmpFile" "$link" )
    updateStatus $(( $? > 0 ? 0 : 3 )) $? "$error"
    (( $? )) || return 1

    tarFile=$( grep -Pom1 '(?<=name": ").+?gz(?=")' "$tmpFile" )

    error=$( grep -Pom1 '(?<=download_url": ").+?gz(?=")' "$tmpFile" | wget -i- -qO "$tarFile" 2>&1 >/dev/null)
    updateStatus $(( $? > 0 ? 0 : 3 )) $? "$error"
    (( $? )) || return 1

    [[ -f "$tmpFile" ]] && _filesToRemove+=( "$tmpFile" )
    [[ -f "$tarFile" ]] && _filesToRemove+=( "$tarFile" )

    error=$( tar xf "$tmpFile" 2>&1 >/dev/null )
    updateStatus $(( $? > 0 ? 1 : 4 )) $? "$error"
    (( $? )) || return
    error=$( tar xf "$tarFile" 2>&1 >/dev/null )
    updateStatus $(( $? > 0 ? 0 : 4 )) $? "$error"
    (( $? )) || return 1

    [[ -d "${tmpFile##.*}" ]] && _foldersToRemove+=( "${tmpDir}/${tmpFile##.*}" )
    cd "${tmpFile##.*}"
    tarFile="${tarFile//.tar.gz/}"
    [[ -d "$tarFile" ]] && _foldersToRemove+=( "${tmpDir}/${tarFile}" )
    cd "$tarFile"

    ./configure --prefix=/usr/local >/dev/null 2>&1
    updateStatus $(( $? > 0 ? 1 : 5 )) $?
    (( $? )) || return
    updateStatus $(( $? > 0 ? 0 : 5 )) $?
    (( $? )) || return 1

    error=$( make 2>&1 >/dev/null )
    updateStatus $(( $? > 0 ? 1 : 6 )) $? "$error"
    (( $? )) || return
    updateStatus $(( $? > 0 ? 0 : 6 )) $? "$error"
    (( $? )) || return 1

    error=$( $_sudo make install 2>&1 >/dev/null )
    updateStatus $(( $? > 0 )) $? "$error"
    (( $? )) || return
    updateStatus $(( $? == 0 )) $? "$error"
    (( $? )) || return 1
    }

    runInstall ()
    {
    installFromRepo "gcc" "make" "libevent-devel" "ncurses-devel"
    installFromGit "tmux/tmux"
    (( $? )) && return 1
    }

    if (( $EUID ))
    @@ -182,3 +196,4 @@ then
    fi

    runInstall
    cleanup
  3. benpitman created this gist Jan 5, 2020.
    184 changes: 184 additions & 0 deletions install_tmux.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,184 @@
    #!/usr/bin/env bash

    declare -g -- _sudo=
    declare -ag -- _foldersToRemove=()
    declare -ag -- _filesToRemove=()

    trap cleanup SIGINT SIGTERM

    die ()
    {
    (( $# )) && printf '\e[31mError: \e[0m%s\n' "$@"
    echo "Exiting ..."
    exit 1
    }

    cleanup ()
    {
    local -- fileToRemove=
    local -- folderToRemove=

    for fileToRemove in "${_filesToRemove[@]}"; do
    [[ -f "$fileToRemove" ]] && rm -f "$fileToRemove"
    done

    for folderToRemove in "${_foldersToRemove[@]}"; do
    [[ -d "$folderToRemove" ]] && rm -rf "$folderToRemove"
    done

    die
    }

    enableRoot ()
    {
    local -- attempts=3

    echo "The script requires sudo privileges to install applications"
    sudo -k

    while (( attempts-- )) && read -srp "> " -t 60 password 2>&1
    do
    printf "checking ... "

    if echo "$password" | sudo -Sv 2>/dev/null
    then
    echo "Correct"
    _sudo="sudo"
    return
    fi

    echo "Incorrect password"
    done

    die "Sudo privileges not granted"
    }

    showProgress ()
    {
    local -r -- maxWidth=$(( $( tput cols ) - 45 ))
    local -r -- index=${2:-0}
    local -r -- count=${3:-1}
    local -r -- percent=$(( (((200 * $index) / $count) % 2) + ((100 * $index) / $count) ))

    local -- lengthOver=
    local -- padding=
    local -- package="$1"

    lengthOver=$(( $maxWidth - ${#package} ))
    (( $lengthOver > 0 )) && package="${package:0:$lengthOver}"
    eval printf -v padding '%.s.' {2..$lengthOver}

    printf "Total: %3s%% | Package: %s %s | Status: Processing\e[10D" "$percent" "$package" "$padding"
    }

    updateStatus ()
    {
    local -r -- statusCode=$1
    local -r -- errorCode=$2
    local -r -- errors="${3:-}"

    local -- status=

    case $statusCode in
    (0) {
    printf '\e[32m%-11s\e[0m\n' "Success"
    };;
    (1) {
    printf '\e[31mError:\e[0m %3s\n' $errorCode
    [[ -n "$error" ]] && printf '%s\n\n' "$error"
    };;
    (2) {
    printf '\e[34m%s\e[0m\e[10D' "Downloading"
    };;
    (3) {
    printf '\e[33m%-11s\e[0m\e[10D' "Extracting"
    };;
    (4) {
    printf '\e[33m%s\e[0m\e[10D' "Configuring"
    };;
    (5) {
    printf '\e[33m%-11s\e[0m\e[10D' "Making"
    };;
    (6) {
    printf '\e[34m%-11s\e[0m\e[10D' "Installing"
    };;
    esac

    return $statusCode
    }

    installFromRepo ()
    {
    local -r -- packages=( "$@" )
    local -r -- packageCount=$#

    local -- packageIndex=-1
    local -- error=

    printf "\nInstalling from repo...\n"

    while (( ++packageIndex < $packageCount ))
    do
    showProgress "${packages[$packageIndex]}" $packageIndex $packageCount

    error=$( $_sudo apt-get -y install "${packages[$packageIndex]}" 2>&1 >/dev/null )

    updateStatus $(( $? > 0 )) $? "$error"
    done
    }

    installFromGit ()
    {
    local -r -- account="${1%/*}"
    local -r -- repo="${1#*/}"
    local -r -- link="https://api.github.com/repos/${account}/${repo}/releases/latest"
    local -r -- tmpDir="/tmp/${account}_${repo}"
    local -r -- tmpFile="${RANDOM}.tar.gz"

    local -- error=

    if [[ ! -d "$tmpDir" ]]; then
    _foldersToRemove+=( "$tmpDir" )
    mkdir "$tmpDir" 2>/dev/null
    fi
    cd "$tmpDir"

    updateStatus 2
    error=$( wget -qO- "$link" 2>&1 >/dev/null | grep -Pom1 '(?<=download_url": ").+?gz(?=")' | wget -iqO "$tmpFile" 2>&1 >/dev/null)
    updateStatus $(( $? > 0 ? 1 : 3 )) $? "$error"
    (( $? )) || return

    [[ -f "$tmpFile" ]] && _filesToRemove+=( "$tmpFile" )

    error=$( tar xf "$tmpFile" 2>&1 >/dev/null )
    updateStatus $(( $? > 0 ? 1 : 4 )) $? "$error"
    (( $? )) || return

    [[ -d "${tmpFile##.*}" ]] && _foldersToRemove+=( "${tmpDir}/${tmpFile##.*}" )
    cd "${tmpFile##.*}"

    ./configure --prefix=/usr/local >/dev/null 2>&1
    updateStatus $(( $? > 0 ? 1 : 5 )) $?
    (( $? )) || return

    error=$( make 2>&1 >/dev/null )
    updateStatus $(( $? > 0 ? 1 : 6 )) $? "$error"
    (( $? )) || return

    error=$( $_sudo make install 2>&1 >/dev/null )
    updateStatus $(( $? > 0 )) $? "$error"
    (( $? )) || return
    }

    runInstall ()
    {
    installFromRepo "gcc" "make" "libevent-devel" "ncurses-devel"
    installFromGit "tmux/tmux"
    }

    if (( $EUID ))
    then
    enableRoot
    fi

    runInstall