#!/usr/bin/env bash ## CONSTANTS BASE_ARCHIVE_URL='https://git.artcode.re/miaou/miaou-bash/archive' BASE_TAG_URL='https://git.artcode.re/api/v1/repos/miaou/miaou-bash/tags' ## FUNCTIONS function upgrade { echo 'upgrading...' execute_miaou_lib self-upgrade } function install { local release release=$( curl -s "$BASE_TAG_URL" | grep '"name":' | cut -d '"' -f4 ) echo "deploying release=$release in progress..." local tempfile='/tmp/miaou-bash-latest.tar.gz' if curl -so "$tempfile" "${BASE_ARCHIVE_URL}/${release}.tar.gz"; then if sudo tar -xzf "$tempfile" --directory "$(dirname "$MIAOU_BASH_DIR")"; then rm "$tempfile" if execute_miaou_lib initiate; then echo 'successfully deployed' else miaou_error 'unable to initiate further' fi else miaou_error 'unable to uncompress archive' fi else miaou_error 'unable to download release' fi } function assert_supported_distro { if ! grep -E '^ID=debian|^ID_LIKE=debian' /etc/os-release && ! grep -E '^ID=arch|^ID_LIKE=arch' /etc/os-release; then local distro distro=$(grep -oP '^ID=\K(.*)' /etc/os-release) >&2 echo "unsupported GNU/Linux distribution: $distro" >&2 echo 'only debian-like OR arch-like currently supported' return 10 fi } function once_installed { [[ -v MIAOU_BASH_DIR && -d "$MIAOU_BASH_DIR" && -L /etc/inputrc && "$(readlink /etc/inputrc)" == "$MIAOU_BASH_DIR"/etc/inputrc ]] } function miaou_error { >&2 echo -------------------------------------------------------------- >&2 echo "MIAOU_ERROR: $1" >&2 echo "Either retry later when a newer version will come up" >&2 echo "Or report the errorstack printed out above to: contact@artcode.re" >&2 echo -------------------------------------------------------------- >&2 echo "QUICK FIX:" >&2 echo " MIAOU_BASH_DIR=/opt/miaou-bash" >&2 echo " export MIAOU_BASH_DIR" >&2 echo " sudo -E \"\$MIAOU_BASH_DIR\"/bin/miaou-bash \"\$MIAOU_BASH_DIR\"/lib/initiate.bash" } function execute_miaou_lib { sudo -E "$MIAOU_BASH_DIR"/bin/miaou-bash "$MIAOU_BASH_DIR"/lib/"$1".bash 3>&1 } function assert_bash { if [[ $(basename "$SHELL") != 'bash' ]]; then >&2 echo "running on SHELL=$SHELL rather than 'bash'!" return 11 fi } function sudo_root { if [[ "$UID" -ne 0 ]] && ! sudo -vp 'SUDO privilege required: '; then >&2 echo "unauthorized!" return 12 fi } ## MAIN set -Eeuo pipefail if assert_supported_distro && assert_bash && sudo_root; then if [[ ! -v MIAOU_BASH_DIR ]]; then MIAOU_BASH_DIR=/opt/miaou-bash export MIAOU_BASH_DIR fi deployment_type_adjective="${1:-installed}" # `miaou-bash --self-upgrade` provides the 'upgrade' term if once_installed; then upgrade; else install; fi if [[ $deployment_type_adjective == 'installed' ]]; then exec bash -l fi else >&2 echo "MIAOU_ERROR: missing requirements" fi