Skip to content

Instantly share code, notes, and snippets.

@benpitman
Last active January 6, 2020 11:04
Show Gist options
  • Save benpitman/773fe7fc24b9dd5d86ed6df5d6c86c5c to your computer and use it in GitHub Desktop.
Save benpitman/773fe7fc24b9dd5d86ed6df5d6c86c5c to your computer and use it in GitHub Desktop.
Install latest version of tmux on CentOS 7
#!/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[31mError:\e[0m %3s\n' $errorCode
[[ -n "$error" ]] && printf '%s\n\n' "$error" || echo
};;
(1) {
printf '\e[32m%-11s\e[0m\n' "Success"
};;
(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 yum -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="/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 "$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 "$tarFile" ]] && _filesToRemove+=( "$tarFile" )
error=$( tar xf "$tarFile" 2>&1 >/dev/null )
updateStatus $(( $? > 0 ? 0 : 4 )) $? "$error"
(( $? )) || return 1
tarFile="${tarFile//.tar.gz/}"
[[ -d "$tarFile" ]] && _foldersToRemove+=( "${tmpDir}/${tarFile}" )
cd "$tarFile"
./configure --prefix=/usr/local >/dev/null 2>&1
updateStatus $(( $? > 0 ? 0 : 5 )) $?
(( $? )) || return 1
error=$( make 2>&1 >/dev/null )
updateStatus $(( $? > 0 ? 0 : 6 )) $? "$error"
(( $? )) || return 1
error=$( $_sudo make install 2>&1 >/dev/null )
updateStatus $(( $? == 0 )) $? "$error"
(( $? )) || return 1
}
runInstall ()
{
installFromRepo "gcc" "make" "libevent-devel" "ncurses-devel"
installFromGit "tmux/tmux"
(( $? )) && return 1
}
if (( $EUID ))
then
enableRoot
fi
runInstall
cleanup
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment