From e953eb805340b4219701a01f1a734baa05c3b05a Mon Sep 17 00:00:00 2001 From: Christoph Date: Fri, 24 Jan 2025 17:54:11 +0100 Subject: [PATCH] first commit --- README.install-latest | 79 ++++++ install-docker.sh | 542 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 621 insertions(+) create mode 100644 README.install-latest create mode 100755 install-docker.sh diff --git a/README.install-latest b/README.install-latest new file mode 100644 index 0000000..0e8c0ad --- /dev/null +++ b/README.install-latest @@ -0,0 +1,79 @@ +# ---------- +# Install latest version of docker on debian +# ---------- + +# see also: +# https://docs.docker.com/engine/install/debian/ + + +# Update reposotories +# +apt update + + +# einige vorausgesetzte Pakete, damit apt Pakete über HTTPS nutzen kann: +# +apt install apt-transport-https ca-certificates curl software-properties-common + + +# Create directory for apt keyrings +# +install -m 0755 -d /etc/apt/keyrings + + +# GPG-Schlüssel für das offizielle Docker-Repository hinzufügen: +# +curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc + + +# Give read permissions to all over the world +# +chmod a+r /etc/apt/keyrings/docker.asc + + +# Add the repository to Apt sources: +# +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ + tee /etc/apt/sources.list.d/docker.list > /dev/null + + + +# Install the latest version +# +apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + + + +# Configure Docker to start on boot with systemd +# +# On Debian and Ubuntu, the Docker service starts on boot by default. To automatically start +# Docker and containerd on boot for other Linux distributions using systemd, run the following +# commands: +# +# systemctl enable docker.service +# systemctl enable containerd.service +# +# To stop this behavior, use 'disable' instead. +# +# systemctl disable docker.service +# systemctl disable containerd.service +# +systemctl enable docker.service +systemctl enable containerd.service + + +# ---------- +# !! TIP !! +# +# Receiving errors when trying to run without root? +# +# The docker user group exists but contains no users, which is why you're required to use sudo +# to run Docker commands. Continue to +# +# https://docs.docker.com/engine/install/linux-postinstall (Linux postinstall) +# +# to allow non-privileged users to run Docker commands and for other optional configuration steps. +# ---------- + diff --git a/install-docker.sh b/install-docker.sh new file mode 100755 index 0000000..84a0b3e --- /dev/null +++ b/install-docker.sh @@ -0,0 +1,542 @@ +#!/usr/bin/env bash + +script_name="$(basename $(realpath $0))" +working_dir="$(dirname $(realpath $0))" + +#conf_file="${working_dir}/conf/${script_name%%.*}.conf" +conf_file="${working_dir}/conf/bbb.conf" + +LOCK_DIR="/tmp/$(basename $0).$$.LOCK" +log_file="${LOCK_DIR}/${script_name%%.*}.log" + + +# ---------- +# Base Function(s) +# ---------- + +clean_up() { + + # Perform program exit housekeeping + rm -rf "$LOCK_DIR" + blank_line + exit $1 +} + +echononl(){ + if $terminal ; then + echo X\\c > /tmp/shprompt$$ + if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then + echo -e -n " $*\\c" 1>&2 + else + echo -e -n " $*" 1>&2 + fi + rm /tmp/shprompt$$ + fi +} +fatal(){ + echo "" + if $terminal ; then + echo -e " [ \033[31m\033[1mFatal\033[m ] $*" + else + echo -e " [ Fatal ] $*" + fi + echo "" + if $terminal ; then + echo -e " \033[1mScript terminated\033[m.." + else + echo -e " Script terminated.." + fi + echo "" + rm -rf $LOCK_DIR + exit 1 +} +error (){ + echo "" + if $terminal ; then + echo -e " [ \033[31m\033[1mError\033[m ] $*" + else + echo " [ Error ] $*" + fi + echo "" +} +warn (){ + echo "" + if $terminal ; then + echo -e " [ \033[33m\033[1mWarning\033[m ] $*" + else + echo " [ Error ] $*" + fi + echo "" +} +info (){ + if $terminal ; then + echo "" + echo -e " [ \033[32m\033[1mInfo\033[m ] $*" + echo "" + fi +} + + +echo_ok() { + if $terminal ; then + echo -e "\033[85G[ \033[32mok\033[m ]" + fi +} +echo_failed(){ + if $terminal ; then + echo -e "\033[85G[ \033[1;31mfailed\033[m ]" + fi +} +echo_skipped() { + if $terminal ; then + echo -e "\033[85G[ \033[33m\033[1mskipped\033[m ]" + fi +} +echo_wait(){ + if $terminal ; then + echo -en "\033[85G[ \033[5m\033[1m..\033[m ]" + fi +} + +trim() { + local var="$*" + var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters + var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters + echo -n "$var" +} + +blank_line() { + if $terminal ; then + echo "" + fi +} + +detect_os () { + + if $(which lsb_release > /dev/null 2>&1) ; then + + DIST="$(lsb_release -i | awk '{print tolower($3)}')" + DIST_VERSION="$(lsb_release -r | awk '{print tolower($2)}')" + DIST_CODENAME="$(lsb_release -c | awk '{print tolower($2)}')" + + if [[ "$DIST" = "debian" ]]; then + if $(echo "$DIST_VERSION" | grep -q '\.') ; then + DIST_VERSION=$(echo "$DIST_VERSION" | cut --delimiter='.' -f1) + fi + fi + + elif [[ -e "/etc/os-release" ]]; then + + . /etc/os-release + + DIST=$ID + DIST_VERSION=${VERSION_ID} + + fi + + # remove whitespace from DIST and DIST_VERSION + DIST="${DIST// /}" + DIST_VERSION="${DIST_VERSION// /}" + +} + + + +# ---------- +# - Jobhandling +# ---------- + +# - Run 'clean_up' for signals SIGHUP SIGINT SIGTERM +# - +trap clean_up SIGHUP SIGINT SIGTERM + +# - Create lock directory '$LOCK_DIR" +# +mkdir "$LOCK_DIR" + + +# ---------- +# - Some checks .. +# ---------- + +# - Running in a terminal? +# - +if [[ -t 1 ]] ; then + terminal=true +else + fatal "Script must run in a terminal." +fi + + +# ========== +# - Begin Main Script +# ========== + +# ---------- +# - Headline +# ---------- + +if $terminal ; then + echo "" + echo -e "\033[1m----------\033[m" + echo -e "\033[32m\033[1mRunning script \033[m\033[1m$script_name\033[32m .. \033[m" + echo -e "\033[1m----------\033[m" +fi + + +# ---------- +# Read Configurations from $conf_file +# ---------- + + +# - Give your default values here +# - + +declare -a needed_debian_package_arr=() +NEEDED_DEBIAN_PACKAGES=" + haveged + apt-utils + apt-transport-https + ca-certificates + curl + software-properties-common +" + +NEEDED_DOCKER_DEB_PACKAGES=" + docker-ce + docker-ce-cli + containerd.io + docker-buildx-plugin + docker-compose-plugin +" + +if [[ -f "$conf_file" ]]; then + source "$conf_file" +else + warn "No configuration file '$conf_file' present.\n + Loading default values.." +fi + + +blank_line +echononl "Detect distribution/release of running OS.." +detect_os > "$log_file" 2>&1 +if [[ $? -ne 0 ]]; then + echo_failed + error "$(cat "$log_file")" +else + echo_ok +fi + +echo "" +echo "" +echo -e "\t\033[32mStart pre-install script for BigBlueButton Service with the following parameters\033[m" +echo "" +echo -e "\tOS Distribution..........: $DIST" +echo -e "\tDistribution's codename..: $DIST_CODENAME" +echo -e "\tDistribution's version...: $DIST_VERSION" +echo "" +echononl "einverstanden (yes/no): " +read OK +OK=${OK,,} +while [ "X$OK" != "Xyes" -a "X$OK" != "Xno" ]; do + echononl "Wrong entry! [yes/no]: " + read OK + OK=${OK,,} +done +[ $OK = "yes" ] || fatal Repeat with other settings.. + +echo "" +echo "" + +blank_line + + +# --- +# Install missing Debian packages +# --- + +echo "" +echo -e " \033[1m---\033[m" +echo -e " \033[32mInstall missing Debian packages\033[m" +echo -e " \033[1m---\033[m" +echo "" + + +_error=false +: > $log_file +echononl "Check if needed packages are installed.." +for _pkg in $NEEDED_DEBIAN_PACKAGES ; do + if aptitude search "$_pkg" | grep " $_pkg " | grep -e "^i" >> "$log_file" 2>&1 ; then + continue + else + needed_debian_package_arr+=("$_pkg") + fi + [[ $? -gt 0 ]] && _error=true +done +if $_error ; then + echo_failed + error "$(cat $log_file)" + + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interrupted by user." + +else + echo_ok +fi + +if [[ ${#needed_debian_package_arr[@]} -gt 0 ]]; then + + echononl "Update repositories.." + apt-get update > "$log_file" 2>&1 + if [[ $? -ne 0 ]]; then + echo_failed + error "$(cat "$log_file")" + + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interrupted by user." + + else + echo_ok + fi + + echononl "Upgrade System.." + DEBIAN_FRONTEND=noninteractive apt-get full-upgrade --assume-yes > "$log_file" 2>&1 + if [[ $? -ne 0 ]]; then + echo_failed + error "$(cat "$log_file")" + + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interrupted by user." + + + for _debian_pkg in ${needed_debian_package_arr[@]} ; do + + echononl "Installing $_debian_pkg .." + + DEBIAN_FRONTEND=noninteractive apt-get -y install $_debian_pkg > "$log_file" 2>&1 + if [[ $? -eq 0 ]] ; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interrupted by user." + + fi + done + +else + echo_ok +fi +else + info "All needed debian packages already installed." +fi + + +blank_line + +# --- +# Install latest version of docker +# --- + +echo "" +echo -e " \033[1m---\033[m" +echo -e " \033[32mInstall latest version of docker\033[m" +echo -e " \033[1m---\033[m" + +blank_line + +echononl "Create directory for apt keyrings" +if [[ -d "/etc/apt/keyrings" ]] ; then + echo_skipped +else + install -m 0755 -d /etc/apt/keyrings > "$log_file" 2>&1 + + if [[ $? -ne 0 ]]; then + echo_failed + error "$(cat "$log_file")" + + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interrupted by user." + + else + echo_ok + fi +fi + +echononl "Add GPG key for official Docker repository.." +curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc > "$log_file" 2>&1 + +if [[ $? -ne 0 ]]; then + echo_failed + error "$(cat "$log_file")" + + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interrupted by user." + +else + echo_ok +fi + + +echononl "Add (official) Docker-Repository to APT sources.." +echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian ${DIST_CODENAME} stable" > /etc/apt/sources.list.d/docker.list 2> "$log_file" + +if [[ $? -ne 0 ]]; then + echo_failed + error "$(cat "$log_file")" + + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interrupted by user." + +else + echo_ok +fi + +blank_line + +echononl "Update repositories.." +apt-get update > "$log_file" 2>&1 +if [[ $? -ne 0 ]]; then + echo_failed + error "$(cat "$log_file")" + + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interrupted by user." + +else + echo_ok +fi + +echononl "Upgrade System.." +DEBIAN_FRONTEND=noninteractive apt-get full-upgrade --assume-yes > "$log_file" 2>&1 +if [[ $? -ne 0 ]]; then + echo_failed + error "$(cat "$log_file")" + + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interrupted by user." + +else + echo_ok +fi + +blank_line + + +_error=false +: > $log_file +echononl "Check if needed docker debian packages are installed.." +for _pkg in $NEEDED_DOCKER_DEB_PACKAGES ; do + if aptitude search "$_pkg" | grep " $_pkg " | grep -e "^i" >> "$log_file" 2>&1 ; then + continue + else + needed_docker_deb_package_arr+=("$_pkg") + fi + [[ $? -gt 0 ]] && _error=true +done +if $_error ; then + echo_failed + error "$(cat $log_file)" + + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interrupted by user." + +else + echo_ok +fi + +if [[ ${#needed_docker_deb_package_arr[@]} -gt 0 ]]; then + + for _debian_pkg in ${needed_docker_deb_package_arr[@]} ; do + + echononl "Installing $_debian_pkg .." + + DEBIAN_FRONTEND=noninteractive apt-get -y install $_debian_pkg > "$log_file" 2>&1 + if [[ $? -eq 0 ]] ; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interrupted by user." + + fi + done + +else + echo_skipped + info "All needed debian packages already installed." +fi + +clean_up 0 +