#! /usr/bin/env sh while [ $# -gt 0 ]; do case "$1" in --dry-run) DRY_RUN=1 shift ;; --*) echo "Illegal Operation" ;; esac done is_dry_run() { if [ -z "$DRY_RUN" ]; then return 1 else return 0 fi } command_exists() { command -v "$@" > /dev/null 2>&1 } to_lower() { echo "$@" | tr '[:upper:]' '[:lower:]' } check_distro() { distro="" if [ -r /etc/os-release ]; then distro="$(. /etc/os-release && echo "$ID")" fi echo "$distro" } detect_debian_version() { version="" vers_num="$(sed 's/\/.*//' /etc/debian_version | sed 's/\..*//')" case "$vers_num" in 12 | trixie) version="bookworm" ;; 11) version="bullseye" ;; 10) version="buster" ;; 9) version="stretch" ;; 8) version="jessie" ;; esac echo "$version" } exec_command() { uid="$(id -u 2>/dev/null || true)" sh_c="sh -c" if [ "$uid" != 0 ]; then if command_exists sudo; then sh_c="sudo -E sh -c" elif command_exists su; then sh_c="su -c" else cat >&2 <<-'EOF' Error: no method for command elevation found, but thats needed for this setup script EOF exit 1 fi fi if is_dry_run; then sh_c="echo" fi echo $sh_c } install_docker_apt() { pre_reqs="apt-transport-https ca-certificates curl" rem_pkgs="docker.io docker-doc docker-compose podman-docker containerd runc" inst_pkgs="docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin" apt_repo="deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] $download_url/linux/$distro $version $channel" ( if ! is_dry_run; then set -x fi $sh_c 'apt-get update -qq >/dev/null' $sh_c "DEBIAN_FRONTEND=noninteractive apt-get remove -y -qq $rem_pkgs >/dev/null" $sh_c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq $pre_reqs >/dev/null" $sh_c 'install -m 0755 -d /etc/apt/keyrings' $sh_c "curl -fsSL \"$download_url/linux/$distro/gpg\" -o /etc/apt/keyrings/docker.asc" $sh_c "chmod a+r /etc/apt/keyrings/docker.asc" $sh_c "echo \"$apt_repo\" > /etc/apt/sources.list.d/docker.list" $sh_c 'apt-get update -qq >/dev/null' $sh_c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq $inst_pkgs >/dev/null" ) } install_acl_apt() { inst_pkgs="acl" ( if ! is_dry_run; then set -x fi $sh_c 'apt-get update -qq >/dev/null' $sh_c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq $inst_pkgs >/dev/null" ) } group_add_docker() { sh_c="$( exec_command )" if [ -f /sbin/usermod ]; then $sh_c "usermod -aG docker $(id -un)" else cat >&2 <<-'EOF' Error: no command for group editing found EOF exit 1 fi } start_docker_boot() { sh_c="$( exec_command )" if command_exists systemctl; then $sh_c 'systemctl enable --now docker.service' else cat >&2 <<-'EOF' Error: no supported init system found EOF exit 1 fi } mk_docker_dir() { docker_root="/opt" sh_c="$( exec_command )" if ! command_exists setfacl; then install_acl_apt fi ( if ! is_dry_run; then set -x fi $sh_c "mkdir -p $docker_root/docker/ $docker_root/docker/compose $docker_root/docker/data" $sh_c "chgrp -R docker $docker_root/docker" $sh_c "chmod -R g+s $docker_root/docker" $sh_c "setfacl -R -m u::rwx,g::rwx $docker_root/docker" $sh_c "setfacl -R -d --set u::rwx,g::rwx,o::r-x $docker_root/docker" ) } install_docker() { sh_c="$( exec_command )" distro="$( check_distro )" version="" channel="stable" download_url="https://download.docker.com" case "$distro" in debian) echo " Debian detected" version="$( detect_debian_version )" install_docker_apt echo "󰡨 Docker successfully installed" ;; *) echo "Sorry currently only debian is supported" esac } read -p "Install docker? (y/N) " if_docker_group case $(to_lower $if_docker_group) in "yes" | "y" | "yeah" | 1) install docker ;; esac read -p "Add $(id -un) to docker group? (y/N) " if_docker_group case $(to_lower $if_docker_group) in "yes" | "y" | "yeah" | 1) group_add_docker ;; esac read -p "Start Docker at boot? (y/N)" if_start_docker_boot case $(to_lower $if_start_docker_boot) in "yes" | "y" | "yeah" | 1) start_docker_boot ;; esac read -p "Create Docker dir with ACL permissions? (y/N)" if_mk_docker_dir case $(to_lower $if_mk_docker_dir) in "yes" | "y" | "yeah" | 1) mk_docker_dir ;; esac