From 726463c3ab591ba888c8a6def27176234eff27d2 Mon Sep 17 00:00:00 2001 From: Gal Szkolnik Date: Wed, 5 Oct 2022 21:53:39 -0400 Subject: [PATCH] Utilities revamped docker-system install moved into sz-install improvement of functionality and output on all other scripts --- .../bin/executable_sz-add-apt-repo | 29 +- .../bin/executable_sz-doctor | 1 + .../bin/executable_sz-install | 276 ++++++++++++++++++ .../bin/executable_sz-prep-docker-system.sh | 53 ---- .../private_share/private_emoji/.keep | 0 5 files changed, 284 insertions(+), 75 deletions(-) create mode 100644 _home/private_dot_local/bin/executable_sz-install delete mode 100644 _home/private_dot_local/bin/executable_sz-prep-docker-system.sh create mode 100644 _home/private_dot_local/private_share/private_emoji/.keep diff --git a/_home/private_dot_local/bin/executable_sz-add-apt-repo b/_home/private_dot_local/bin/executable_sz-add-apt-repo index 0827e26..bdb61e8 100644 --- a/_home/private_dot_local/bin/executable_sz-add-apt-repo +++ b/_home/private_dot_local/bin/executable_sz-add-apt-repo @@ -80,25 +80,10 @@ function _repo_custom_xscreensavers() { ############ Script Logic starts here set -e - -ANSI_Print() { printf "\E[${ANSI_Code}m%s\E[0m" "$@"; } -ANSI_Red() { ANSI_Code=31 ANSI_Print "$@"; } -ANSI_Green() { ANSI_Code=32 ANSI_Print "$@"; } -ANSI_Yellow() { ANSI_Code=33 ANSI_Print "$@"; } -ANSI_Blue() { ANSI_Code=34 ANSI_Print "$@"; } -ANSI_Indiego() { ANSI_Code=35 ANSI_Print "$@"; } -ANSI_Cyan() { ANSI_Code=36 ANSI_Print "$@"; } - -error() { - (>&2 ANSI_Red 'ERROR: ' && printf '%s\n' "$@" ) -} - -require_root() { - if [[ $EUID -ne 0 ]]; then - error "This script should only be run using sudo or as the root user" - exit 1 - fi -} +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +USER_HOME=$HOME +[[ -n "${SUDO_USER}" ]] && USER_HOME="$(eval "echo ~${SUDO_USER}")" +. ${SHRC_D:-$USER_HOME/.pqb.shrc.d}/01_util.functions # The function that does the _Heavy Lifting_. # see the code that follows for the parameter signature @@ -111,14 +96,14 @@ function add_repo() { return $? # If no repo defintion exist, exit with an error elif [[ "$(type -t _repo_$1)" != 'function' ]]; then - error "Can't configure $1, could not find _repo_$1 definition!" + eval $(error 1 "Can't configure $1, could not find _repo_$1 definition!") || return $? return 1 fi # Grab the repo's defintion eval "_repo_$1" # Prepare all necessary vraiables - [[ -z "$REPO_FQDN" ]] && error "REPO_FQDN not defined for '$1'" && return 1 + [[ -z "$REPO_FQDN" ]] && eval $(error 1 "REPO_FQDN not defined for '$1'") GPG_KEY_URL=${GPG_KEY_URL:-https:\/\/$REPO_FQDN\/gpg} GPG_KEY_PATH=${GPG_KEY_PATH:-/usr/share/keyrings/$REPO_FQDN.gpg} REPO_ARCH=${REPO_ARCH:-${_ARC}} @@ -225,4 +210,4 @@ else done < <( eval $READCMD ) main -fi \ No newline at end of file +fi diff --git a/_home/private_dot_local/bin/executable_sz-doctor b/_home/private_dot_local/bin/executable_sz-doctor index bb9d7c8..0f54213 100644 --- a/_home/private_dot_local/bin/executable_sz-doctor +++ b/_home/private_dot_local/bin/executable_sz-doctor @@ -1,4 +1,5 @@ #! /usr/bin/env bash +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) USER_HOME=$HOME [[ -n "${SUDO_USER}" ]] && USER_HOME="$(eval "echo ~${SUDO_USER}")" . ${SHRC_D:-$USER_HOME/.pqb.shrc.d}/01_util.functions diff --git a/_home/private_dot_local/bin/executable_sz-install b/_home/private_dot_local/bin/executable_sz-install new file mode 100644 index 0000000..22bed6c --- /dev/null +++ b/_home/private_dot_local/bin/executable_sz-install @@ -0,0 +1,276 @@ +#! /usr/bin/env bash +########_ App list + +# this is a reference template +# function _app_nosudo_template_function() { +# In function name `nosudo_` means, sudo isn't allowed, if replaced by +# `sudo_`, installtion will require sudo, or it can be `auto_` +# +# APP_TYPE='' # bash-url, deb-github-release, deb-url +# APP_ADDRESS='' # bash-url: +# # The complete URL to the installation bash script +# # deb-github-release: +# # Owner/RepoName from the GitHub URL +# APP_RELEASE='' # Used by deb-github-release, default is 'latest' +# } +# this is a reference custom template +# function _app_template_function_custom() { +# } + +function _app_sudo_gcm() { +# Installs GitCredentialManager from Microsoft + APP_TYPE='deb-github-release' + APP_ADDRESS='GitCredentialManager/git-credential-manager' +} + +function _app_nosudo_homebrew() { +# Installs HomeBrew + APP_TYPE='bash-url' + APP_ADDRESS='https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh' +} + +function _app_sudo_gcloud_custom() { + if [[ ! -r "/etc/apt/sources.list.d/packages.cloud.google.com" ]]; then + eval $(error 1 \ + "Google Cloud Platform sources are not installed yet, please run 'pqb-add-apt-repo gcloud' first" \ + ) || exit $? + exit 1 + fi + + apt install google-cloud-sdk-gke-gcloud-auth-plugin google-cloud-cli kubectl +} + +function _app_sudo_systeroid_custom() { + if [[ -n "$(type cargo 2>/dev/null)" ]]; then + cargo install systeroid + cargo install systeroid-tui + else + DL_URL=$( \ + get-github-release.sh orhun/systeroid '' 'x86_64-unknown-linux-gnu.tar.gz' \ + | grep 'tar.gz$' \ + ) + DL_PATH=$(download_temp $DL_URL) + DL_DIR=$(dirname $DL_PATH) + echo "Extracting..." + tar zxC "$DL_DIR" -f "$DL_PATH" + SRC_DIR=$( \ + find "$DL_DIR" -mindepth 1 -maxdepth 1 -type d -not -name '.' \ + | head -1 \ + ) + echo "Installing into /usr/local/bin..." + mv "$SRC_DIR/systeroid"* /usr/local/bin + [[ -n "$DL_DIR" && "$DL_DIR" =~ "/tmp/tmp." ]] && rm -R "$DL_DIR/" + fi +} + +function _apt_sudo_rstudio() { + APP_TYPE='deb-url' + APP_ADDRESS=$( \ + wget -qO- https://rstudio.com/products/rstudio/download/ \ + | grep -Eoi ']+>' | grep -Eo 'href="[^\"]+"' \ + | grep -Eo '(http|https)://download.*\.deb' \ + | grep 'jammy' \ + ) +} + +function _app_sudo_docker_system_custom() { + if [[ ! -r "/etc/apt/sources.list.d/download.docker.com.list" ]]; then + eval $(error 1 \ + "Docker sources are not installed yet, please run 'pqb-add-apt-repo docker' first" \ + ) || exit $? + exit 1 + fi + + [[ -z "$(type -fP docker)" ]] \ + && echo "Installting docker-ce and related packages..." \ + && DEBIAN_FRONTEND=noninteractive apt-get install --yes docker-ce docker-ce-cli containerd.io docker-compose-plugin \ + && printf "\n\ndocker installed\n\n" + CUR_USER=$USER + [[ -n "$SUDO_USER" ]] \ + && CUR_USER=$SUDO_USER + echo "Adding current user ($CUR_USER) to the 'docker' group..." + usermod --groups docker --append $CUR_USER + + if [[ ! -x /usr/local/bin/compose-switch ]]; then + echo "Setting up docker-switch for docker-compose backward compatibility..." + curl -fL https://raw.githubusercontent.com/docker/compose-switch/master/install_on_linux.sh | sh + update-alternatives --install /usr/local/bin/docker-compose docker-compose /usr/local/bin/compose-switch 99 + fi +} + +############ Script Logic starts here +set -e +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +USER_HOME=$HOME +[[ -n "${SUDO_USER}" ]] && USER_HOME="$(eval "echo ~${SUDO_USER}")" +. ${SHRC_D:-$USER_HOME/.pqb.shrc.d}/01_util.functions + +get_clean_path() { + sed 's/ *:\?$//g;s/`/``/g;s/:/`:`/g;s/\\`:`/\\:/g;' <<< $1 | \ + awk -v RS='`:`' -v ORS='`:`' '!arr[$0]++' | \ + sed 's/`:`/:/g;s/:$//g' +} +#PATH=$( get_clean_path "${PATH}:${SCRIPT_DIR}" ) +#echo $PATH + +function download_temp() { + local APP_ADDRESS=${1:-${APP_ADDRESS}} + + local DL_URL="${1}" + local DL_FILENAME="${2:-${DL_URL##*/}}" + local DL_DIR=$(mktemp -dt) + pushd "$DL_DIR" > /dev/null || return $? + # Download the .targz file + echo "Downloading $DL_FILENAME to $DL_DIR..." 1>&2 + wget -q "$DL_URL" && [[ -n "$SUDO_USER" ]] && chown -R $SUDO_USER "$DL_DIR" + popd > /dev/null || return $? + + printf "${DL_DIR}/${DL_FILENAME}" +} + +function install_app_bash_url() { + local APP_ADDRESS=${1:-${APP_ADDRESS}} + + /bin/bash -c "$(curl -fsSL ${APP_ADDRESS})" +} +function install_app_deb_url() { + local APP_ADDRESS=${1:-${APP_ADDRESS}} + + install-deb-from-web.sh "${APP_ADDRESS}" +} +function install_app_deb_github_release() { + local APP_PROJECT=${1:-${APP_ADDRESS}} + local APP_RELEASE=${2:-${APP_RELEASE:-latest}} + + install_app_deb_url $( \ + get-github-release.sh "${APP_PROJECT}" "${APP_RELEASE}" \ + ) +} + +# The function that does the _Heavy Lifting_. +# see the code that follows for the parameter signature +function install_app() { + + local allFuncs=$( printf '%s\n' $(get_app_install_functions) $allFuncs | grep "_${1}\(_custom\)\?$" ) + local okFuncs=$allFuncs + + if [[ -n $okFuncs ]]; then + if [[ $EUID -ne 0 ]]; then + okFuncs=$(printf '%s\n' $okFuncs | grep -v "^sudo_") + else + okFuncs=$(printf '%s\n' $okFuncs | grep -v "^nosudo_") + fi + + if [[ -n $okFuncs ]]; then + okFuncs=$(printf '%s\n' $okFuncs | head -1) + if [[ "$(type -t _app_${okFuncs})" != 'function' \ + && "$(type -t _app_${okFuncs}_custom)" != 'function' ]]; then + unset okFuncs + fi + fi + + if [[ -n $okFuncs ]]; then + if [[ "$okFuncs" =~ "${1}_custom" ]]; then + eval "_app_$okFuncs" + return $? + else + eval "_app_$okFuncs" || return $? + + printf "%s=%s\n" \ + 'APP_TYPE' "${APP_TYPE}" \ + 'APP_ADDRESS' "${APP_ADDRESS}" \ + 'APP_RELEASE' "${APP_RELEASE}" + + #echo \ + eval "install_app_$(echo ${APP_TYPE} | sed 's/-/_/g;')" + fi + else + echo "Failed to launch $allFuncs" + return 1 + fi + else + echo "Could not find installation instructions for ${1}" + return 1 + fi + + echo "App $1 installed" +} + +function get_app_install_functions() { + typeset -f \ + | grep '^_app_' | sed 's/^_app_//; s/ () *$//;' +} + +function usage() { + printf " %s\n" \ + "Usage:" \ + " $0 [-v[v]] " \ + " [--no-init] [--no-overwrite] " \ + " all|[ ...] " \ + "" \ + "Apps: $( \ + printf "\n %s" $( \ + get_app_install_functions \ + | sed 's/_custom$//' \ + | sed 's/^\([^_]*sudo[^_]*\)_\(.*\)$/\2(\1)/' \ + | sort \ + ))" \ + "" \ + "Options:" \ + " --no-init - skip initialization." \ + " -v[v] - script verbosity, equivalent to set -x and set -xv" \ + "" +} + +function main() { + [[ ${#APP_LIST[@]} -eq 0 ]] && usage && return 1 + + _OS=$(lsb_release -is | awk '{ print tolower($0) }') + [[ $_OS == 'pop' ]] && _OS='ubuntu' + _REL=$(lsb_release -rs) # Release + _CNM=$(lsb_release -cs) # CodeName + _ARC=$(dpkg --print-architecture) # Architecture + + ANSI_Cyan "Initializing: Installing basic packages..."; echo + if [[ -n "$SHOULD_INIT" ]]; then + # Make sure the /usr/share/keyrings dir exists + mkdir -p /usr/share/keyrings 2>&1 > /dev/null + + # Make sure all of the basic required tools are installed for the code + # below to work + apt-get install --yes --no-install-recommends \ + curl gnupg software-properties-common apt-transport-https + fi + ANSI_Green "Done."; echo + + while read r; do + ANSI_Cyan "Installing $r..."; echo + install_app $r || return 2 + ANSI_Green "Installation of $r completed."; echo + done < <(printf "%s\n" "${APP_LIST[@]}") + + [[ -z "${SUDO_USER}" ]] && exec $SHELL \ + || echo 'It is recommended that you restart your shell (exec $SHELL)' +} + +# Iterate through stdin or parameters +if [[ $# == 0 ]]; then + usage +else + APP_LIST=() + _SHOULD_INIT=1 + + READCMD='printf "%s\n" "${@}"' + [[ $# == 1 && $1 == '-' ]] && READCMD='cat - ' + while read a; do + # Switch on _YES + [[ "$a" == "-v" ]] && set -x && continue + [[ "$a" == "-vv" ]] && set -xv && continue + [[ "$a" == "--no-init" ]] && unset _SHOULD_INIT && continue + + # Add app + [[ -n "$a" ]] && APP_LIST+=("$a") + done < <( eval $READCMD ) + + main +fi diff --git a/_home/private_dot_local/bin/executable_sz-prep-docker-system.sh b/_home/private_dot_local/bin/executable_sz-prep-docker-system.sh deleted file mode 100644 index 07b6d85..0000000 --- a/_home/private_dot_local/bin/executable_sz-prep-docker-system.sh +++ /dev/null @@ -1,53 +0,0 @@ -#! /usr/bin/env bash -. ~/.sz.shrc.d/01_util.functions - -require_root - -if [[ ! -r "/etc/apt/sources.list.d/download.docker.com.list" ]]; then - error "Docker sources are not installed yet, please run 'sz-add-my-apt-repos' script first" - exit 1 -fi - -[[ -z "$(getent group szdocker)" ]] \ - && groupadd --gid 2001 szdocker -[[ -z "$(getent passwd szdocker)" ]] \ - && useradd --gid szdocker --uid 2001 szdocker -[[ -z "$(type -fP docker)" ]] \ - && DEBIAN_FRONTEND=noninteractive apt-get install --yes docker-ce docker-ce-cli containerd.io docker-compose-plugin \ - && printf "\n\ndocker installed\n\n" -CUR_USER=$USER -[[ -n "$SUDO_USER" ]] \ - && CUR_USER=$SUDO_USER -echo $CUR_USER -sudo usermod --groups docker,szdocker --append $CUR_USER -sudo usermod --groups docker --append szdocker - -if [[ ! -x /usr/local/bin/compose-switch ]]; then - curl -fL https://raw.githubusercontent.com/docker/compose-switch/master/install_on_linux.sh | sh - update-alternatives --install /usr/local/bin/docker-compose docker-compose /usr/local/bin/compose-switch 99 -fi - -CTSZ_ROOT=/srv/containeriszed -[[ -n "${SZ_DEBUG}" ]] \ - && echo "Creating $CTSZ_ROOT/docker-compose/0.template.off..." -mkdir -p $CTSZ_ROOT/docker-compose/0.template.off -[[ -n "${SZ_DEBUG}" ]] \ - && echo "Creating $CTSZ_ROOT/0.local/0.shared..." -mkdir -p $CTSZ_ROOT/0.local/0.shared - -setacl -R szdocker:szdocker 775 $CTSZ_ROOT - -[[ -n "${SZ_DEBUG}" ]] \ - && echo "Creating $CTSZ_ROOT/docker-compose/.env..." -touch $CTSZ_ROOT/docker-compose/.env -pushd $CTSZ_ROOT/docker-compose/0.template.off > /dev/null -[[ -r ".env" ]] || ln -s ../.env . -chown szdocker:szdocker $CTSZ_ROOT/docker-compose/0.template.off/.env -setacl '' szdocker:szdocker 660 $CTSZ_ROOT/docker-compose/.env -popd > /dev/null -[[ -n "${SZ_DEBUG}" ]] \ - && echo "Template created with .env as a symbloiv link" - -[[ -n "type tree" ]] \ - && echo "Containerized Directory Tree initialized:" \ - && tree -Fapug --dirsfirst --noreport $CTSZ_ROOT diff --git a/_home/private_dot_local/private_share/private_emoji/.keep b/_home/private_dot_local/private_share/private_emoji/.keep new file mode 100644 index 0000000..e69de29