From b900716d24d56a2200b2f326c2a935c7a7944e4e Mon Sep 17 00:00:00 2001 From: piecka Date: Tue, 25 Feb 2025 10:58:12 +0100 Subject: [PATCH] addet sh scripts --- installs/docker.sh | 180 ++++++++++ installs/flatpak.sh | 152 +++++++++ installs/ghostty.sh | 310 +++++++++++++++++ installs/hyprland.sh | 632 +++++++++++++++++++++++++++++++++++ installs/hyprpanel.sh | 97 ++++++ installs/install-blesh.sh | 71 ++++ installs/neovide.sh | 131 ++++++++ installs/neovim.sh | 185 ++++++++++ installs/virt-manager.sh | 208 ++++++++++++ installs/xmrig.sh | 187 +++++++++++ installs/yazi.sh | 149 +++++++++ installs/ytgo.sh | 157 +++++++++ logging.sh | 76 +++++ setup/arch-hyprland.sh | 203 +++++++++++ setup/debian-major.sh | 157 +++++++++ setup/docker-network.sh | 110 ++++++ setup/postinstall.sh | 369 ++++++++++++++++++++ setup/realmjoin.sh | 143 ++++++++ setup/unattendet-upgrades.sh | 86 +++++ setup/updates.sh | 157 +++++++++ 20 files changed, 3760 insertions(+) create mode 100755 installs/docker.sh create mode 100755 installs/flatpak.sh create mode 100644 installs/ghostty.sh create mode 100644 installs/hyprland.sh create mode 100644 installs/hyprpanel.sh create mode 100755 installs/install-blesh.sh create mode 100755 installs/neovide.sh create mode 100755 installs/neovim.sh create mode 100755 installs/virt-manager.sh create mode 100755 installs/xmrig.sh create mode 100644 installs/yazi.sh create mode 100644 installs/ytgo.sh create mode 100644 logging.sh create mode 100644 setup/arch-hyprland.sh create mode 100644 setup/debian-major.sh create mode 100644 setup/docker-network.sh create mode 100755 setup/postinstall.sh create mode 100644 setup/realmjoin.sh create mode 100644 setup/unattendet-upgrades.sh create mode 100755 setup/updates.sh diff --git a/installs/docker.sh b/installs/docker.sh new file mode 100755 index 0000000..b07d514 --- /dev/null +++ b/installs/docker.sh @@ -0,0 +1,180 @@ +#!/bin/sh -e + +# ─< ANSI color codes >─────────────────────────────────────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +check_sudo() { + # check for $su + if [ "$USER" != "root" ]; then + if command -v sudo >/dev/null 2>&1; then + su="sudo" + else + echo "Are you sure you can handle this? You're not root and sudo cannot be found.. [y/n]" + read -r sud ──────────────────────────────────────── +check_dist() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + # ─< Convert $ID and $ID_LIKE to lowercase >────────────────────────────────────────────── + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop) _ubuntu ;; + debian) _debian ;; + fedora) _fedora ;; + # alpine) _alpine ;; + arch | manjaro | garuda | endeavour) _arch ;; + opensuse*) inst_opensuse ;; + *) + if [ "${ID_LIKE#*debian}" != "$ID_LIKE" ]; then + _debian + elif [ "${ID_LIKE#*ubuntu}" != "$ID_LIKE" ]; then + _ubuntu + elif [ "${ID_LIKE#*arch}" != "$ID_LIKE" ]; then + _arch + elif [ "${ID_LIKE#*fedora}" != "$ID_LIKE" ]; then + _fedora + # elif [ "${ID_LIKE#*suse}" != "$ID_LIKE" ]; then + # _opensuse + else + echo_error "Unsupported distribution: $ID" + exit 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + exit 1 + fi +} + +_debian() { + clear + echo_info "executing debian" + sleep 2 + $su apt-get update && + $su apt-get install -y ca-certificates curl && + $su install -m 0755 -d /etc/apt/keyrings && + $su curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc && + $su chmod a+r /etc/apt/keyrings/docker.asc && + sleep 0.5 + if [ "$VERSION_CODENAME" == "trixie" ]; then + VERSION_CODENAME="bookworm" + fi + 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" | $su tee /etc/apt/sources.list.d/docker.list >/dev/null + clear && + echo_info "Addet repository. Updating and installing now.." + sleep 1 + $su apt-get update + $su apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +} + +_ubuntu() { + clear + echo_info "executing ubuntu" + sleep 2 + $su apt-get update && + $su apt-get install -y ca-certificates curl && + $su install -m 0755 -d /etc/apt/keyrings && + $su curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc && + $su chmod a+r /etc/apt/keyrings/docker.asc + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | $su tee /etc/apt/sources.list.d/docker.list >/dev/null + clear && + echo_info "Addet repository. Updating and installing now.." + sleep 0.5 + $su apt-get update + $su apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +} + +_fedora() { + clear + echo_info "executing fedora" + sleep 2 + $su dnf -y install dnf-plugins-core + $su dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo + $su dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +} + +_arch() { + clear + echo_info "executing arch" + sleep 2 + $su pacman -S docker docker-compose --noconfirm +} + +init_docker() { + if command -v docker >/dev/null 2>&1; then + echo_info "Docker was installed correctly. Do you want to add $(whoami) to the docker group? (y/n)" + read -r dgroup &2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +# ─< Silent execution >───────────────────────────────────────────────────────────────── +silentexec() { + "$@" >/dev/null 2>&1 +} + +# ─< Check if the given command exists silently >───────────────────────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# Check if the user is root and set sudo variable if necessary +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_note "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_note "Root access confirmed." + _sudo="" + fi +} + +flatpak_init() { + if command_exists flatpak; then + echo_info "Flatpak exists, initializing flathub repository!" + flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + else + echo_error "Flatpak was not found!" + fi +} + +inst_arch() { + echo_note "Using Arch script, btw!" + + if command_exists yay; then + i_arch="yay" + elif command_exists paru; then + i_arch="paru" + elif command_exists pacman; then + i_arch="$_sudo pacman" + fi + + if [ -n "$i_arch" ]; then + i_arch -S flatpak + else + echo_error "No packager for installation found.. (not even pacman...)" + fi + +} + +inst_debian() { + echo_note "Using Debian script!" + if command_exists nala; then + $_sudo nala update + $_sudo nala install flatpak -y + elif command_exists apt-get; then + echo_info "Couldn't find nala, falling back to apt-get" + $_sudo apt-get update + $_sudo apt-get install flatpak -y + fi +} + +inst_ubuntu() { + echo_note "Using Ubuntu script!" + if command_exists nala; then + $_sudo nala update + $_sudo nala install flatpak -y + elif command_exists apt-get; then + echo_info "Couldn't find nala, falling back to apt-get" + $_sudo apt-get update + $_sudo apt-get install flatpak -y + fi +} + +# ─< Distribution detection and installation >──────────────────────────────────────── +get_packager() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + # Convert $ID and $ID_LIKE to lowercase + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop) inst_ubuntu ;; + debian) inst_debian ;; + fedora) inst_fedora ;; + alpine) inst_alpine ;; + arch | manjaro | garuda | endeavour) inst_arch ;; + opensuse*) inst_opensuse ;; + *) + # Use standard [ ] syntax for string matching + if [ "${ID_LIKE#*debian}" != "$ID_LIKE" ]; then + inst_debian + elif [ "${ID_LIKE#*ubuntu}" != "$ID_LIKE" ]; then + inst_ubuntu + elif [ "${ID_LIKE#*arch}" != "$ID_LIKE" ]; then + inst_arch + elif [ "${ID_LIKE#*fedora}" != "$ID_LIKE" ]; then + inst_fedora + elif [ "${ID_LIKE#*suse}" != "$ID_LIKE" ]; then + inst_opensuse + else + echo_error "Unsupported distribution: $ID" + exit 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + exit 1 + fi +} + +install_flatpak() { + check_root && + get_packager && + flatpak_init +} + +install_flatpak diff --git a/installs/ghostty.sh b/installs/ghostty.sh new file mode 100644 index 0000000..47ee6e5 --- /dev/null +++ b/installs/ghostty.sh @@ -0,0 +1,310 @@ +#!/bin/sh + +# ╭───────────────╮ +# │ env functions │ +# ╰───────────────╯ +# ───────────────────────────────────< ANSI color codes >─────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ─────────────< Check if the user is root and set sudo variable if necessary >───────────── +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi +} + +# ──────────────────────< Check if the given command exists silently >────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +_cd() { + cd "$1" || echo_error "Could not cd into $1!" +} + +# ─< Distribution detection and installation >──────────────────────────────────────── +# checks for variable dist={debian,ubuntu,fedora,arch,suse} +get_packager() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + # ─< Convert $ID and $ID_LIKE to lowercase >────────────────────────────────────────────── + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop | linuxmint | elementary) dist="ubuntu" ;; + debian | kali | zorin | parrot | deepin | raspbian | devuan) dist="debian" ;; + fedora | nobara | rhel | centos) dist="fedora" ;; + arch | manjaro | garuda | endeavour | artix) dist="arch" ;; + opensuse*) dist="suse" ;; + *) + if [ "${ID_LIKE#*debian}" != "$ID_LIKE" ]; then + dist="debian" + echo_note "Detected Debian-based distribution" + elif [ "${ID_LIKE#*ubuntu}" != "$ID_LIKE" ]; then + dist="ubuntu" + echo_note "Detected Ubuntu-based distribution" + elif [ "${ID_LIKE#*arch}" != "$ID_LIKE" ]; then + dist="arch" + echo_note "Detected Arch-based distribution" + elif [ "${ID_LIKE#*fedora}" != "$ID_LIKE" ]; then + dist="fedora" + echo_note "Detected Fedora-based distribution" + elif [ "${ID_LIKE#*suse}" != "$ID_LIKE" ]; then + dist="suse" + echo_note "Detected SUSE-based distribution" + else + echo_error "Unsupported distribution: $ID" + echo_note "Please report this issue with your distribution details" + exit 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + exit 1 + fi +} + +# ╭────────────────────────────────────╮ +# │ insert your scripts/functions here │ +# ╰────────────────────────────────────╯ +# ─────────────────────────────────────< dependencies >───────────────────────────────────── +deps_common="git curl tar" +deps_arch="$deps_common gtk4 libadwaita" +deps_deb="$deps_common libgtk-4-dev libadwaita-1-dev" +deps_fedora="$deps_common gtk4-devel zig libadwaita-devel" +deps_suse="$deps_common gtk4-tools libadwaita-devel pkgconf-pkg-config zig" + +checkDeps="" +checkDeps() { + get_packager + case "$dist" in + debian | ubuntu) + pkg="apt-get" + echo "Detected packagemanager ${RED}${pkg}" + echo_info "Updating sources.." + $_sudo apt-get update + + echo_info "Checking dependencies now.." + + sleep 3 + + for dep in $deps_deb; do + if ! command_exists $dep; then + echo_info "Installing $dep.." + $_sudo apt-get install "$dep" --assume-yes /dev/null 2>&1 + $_sudo ln -rs ./zig/zig /bin/zig +} + +cloneGhostty() { + if [ ! "$checkDeps" = "done" ]; then + echo_error "Dependencies are not installed, aborting now!" + exit 1 + fi + + # buildDir=$(mktemp -d) + buildDir="$HOME/.local/ghostty-build" + if [ -d "$buildDir" ] && [ -n "$(ls -A "$buildDir")" ]; then + echo_warning "Ghostty build directory already exists at ${buildDir}, do you want to remove it? (y/n)" + read -r removeBuildDir ─────────────────────────────── +main() { + if check_root; then + checkDeps || ErrorExit "Step 1/3" + checkZig || ErrorExit "Step 2/3" + cloneGhostty || ErrorExit "Step 3/3" + else + echo_error "Something went terribly wrong!" + fi +} + +main ─────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +# ─────────────< Check if the user is root and set sudo variable if necessary >───────────── +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi +} + +# ──────────────────────< Check if the given command exists silently >────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ╭────────────────────────────────────╮ +# │ insert your scripts/functions here │ +# ╰────────────────────────────────────╯ +hyprSlim="hyprland hyprland-protocols hyprwayland-scanner libhyprcursor-dev wayland-utils wayland-protocols wl-clipboard nwg-look xdg-desktop-portal-hyprland liblz4" +hyprAdvanced="$menu pavucontrol pamixer btop bluez wlogout wob" + +OPTIONAL_SCREENSHOT="grimshot slurp swappy" +OPTIONAL_SCREENRECORD="wf-recorder" +OPTIONAL_AUDIO="pulseaudio pavucontrol" +OPTIONAL_NOTIFY="sway-notification-center libnotify" +OPTIONAL_UTILS="brightnessctl network-manager-gnome gnome-keyring swayidle playerctl" +OPTIONAL_FILES="xdg-user-dirs nautilus gvfs" +OPTIONAL_SDDM_DEPS="qml6-module-qtquick-controls qml6-module-qtquick-effects sddm" + +BUILD_DEPS="git gcc make cmake meson ninja-build pkg-config" +RUST_DEPS="cargo rustc" # Separate rust dependencies + +askThings() { + echo_note "Do you want to install hyprland? (y/N)" + read -r askHyprland ─────────────────────────────── +main() { + if check_root; then + askThings + if [ "$askHyprland" = "true" ]; then + checkDependencies + instDeps + instTools + checkConfig + fi + else + echo_error "Something went terribly wrong!" + fi +} + +main diff --git a/installs/hyprpanel.sh b/installs/hyprpanel.sh new file mode 100644 index 0000000..8a2c7a1 --- /dev/null +++ b/installs/hyprpanel.sh @@ -0,0 +1,97 @@ +#!/bin/sh -c + +# ─< ANSI color codes >─────────────────────────────────────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +# ─< Check if the given command exists silently >───────────────────────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ─< Check if the user is root and set sudo variable if necessary >─────────────────────── +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi +} + +inst_arch() { + dependencies="aylurs-gtk-shell grimblast hyprpicker" + if command_exists curl; then + if [ ! -d "$HOME/.bun" ]; then + echo_info "Downloading bun and linking it.." + curl -fsSL https://bun.sh/install | bash && $_sudo ln -s $HOME/.bun/bin/bun /usr/local/bin/bun + else + echo_note "Bun is already installed" + fi + + $_sudo pacman -S pipewire libgtop bluez bluez-utils btop networkmanager dart-sass wl-clipboard brightnessctl swww python gnome-bluetooth-3.0 pacman-contrib power-profiles-daemon gvfs --noconfirm + + if command_exists yay; then + echo_info "Using yay to install $dependencies" + yay -S --noconfirm $dependencies + elif command_exists paru; then + echo_info "Using paru to install $dependencies" + paru -S --noconfirm $dependencies + else + echo_error "No aur helper found.. Cannot continue!" + exit 1 + fi + else + echo_warning "No curl was found, cannot continue!" + exit 1 + fi + +} + +clone_to_ags() { + if [ ! -d "$HOME/.config/ags" ]; then + if command_exists git; then + git clone --depth=1 https://github.com/Jas-SinghFSU/HyprPanel "$HOME/.config/ags" + else + echo_error "There was no git found, cannot continue!" + exit 1 + fi + else + echo_note "ags is already present, try running 'ags' in your terminal" + fi +} + +main() { + if check_root; then + inst_arch + clone_to_ags + fi +} + +main diff --git a/installs/install-blesh.sh b/installs/install-blesh.sh new file mode 100755 index 0000000..4e03c4e --- /dev/null +++ b/installs/install-blesh.sh @@ -0,0 +1,71 @@ +{ + #!/bin/bash + # ─< Helper functions >───────────────────────────────────────────────────────────────── + echo_error() { echo -e "\033[0;1;31mError: \033[0;31m\t${*}\033[0m"; } + echo_binfo() { echo -e "\033[0;1;34mINFO:\033[0;34m\t${*}\033[0m"; } + echo_info() { echo -e "\033[0;1;35mInfo: \033[0;35m${*}\033[0m"; } + + # ─< Check if the given command exists silently >───────────────────────────────────────── + command_exists() { + command -v "$@" >/dev/null 2>&1 + } + + # ─< Check root and set sudo variable if necessary >─────────────────────────────────────────────── + check_root() { + if [[ "${EUID}" -ne 0 ]]; then + if command_exists sudo; then + echo_binfo "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_binfo "Root access confirmed." + _sudo="" + fi + } + + install_pkg() { + bash -c "$(curl -sSL https://git.k4li.de/pika/scripts/raw/branch/main/bash/snippets/install_pkg.sh)" -- "$@" + } + + i_blesh() { + dir="$(mktemp -d)" + local deps=("bash" "git" "make" "gawk") + for pkg in "${deps[@]}"; do + if ! command_exists "$pkg"; then + install_pkg "$pkg" + fi + done && + git clone --recursive --depth 1 --shallow-submodules https://github.com/akinomyoga/ble.sh.git "$dir" && + make -C "$dir" install PREFIX=$HOME/.local + } + + cleanup() { + echo_info "Do you want to clear the temp dir ($dir/) which was created for installation? [Y|n]" && read -r ask_dir + case "$ask_dir" in + [Nn]) + echo_info "All right, didn't clean anything!" + ;; + [Yy] | *) + $_sudo command rm -rf "$dir/" + ;; + esac + } + + main() { + # Check root access and set _sudo + if ! check_root; then + return 1 + fi + if [[ ! -f $HOME/.local/share/blesh/ble.sh ]]; then + i_blesh + cleanup + else + echo_info "Blesh is already installed" + fi + } + + main +} diff --git a/installs/neovide.sh b/installs/neovide.sh new file mode 100755 index 0000000..faebbd2 --- /dev/null +++ b/installs/neovide.sh @@ -0,0 +1,131 @@ +#!/bin/sh + +# ─< ANSI color codes >─────────────────────────────────────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +# ─< check if command exists silently >─────────────────────────────────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ─< Silent execution >───────────────────────────────────────────────────────────────── +silentexec() { + "$@" >/dev/null 2>&1 +} + +# ─< Check if the user is root and set _sudo variable if necessary >─────────────────────── +checkRoot() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi +} + +installNeovide() { + if ! command_exists cargo; then + curl --proto '=https' --tlsv1.2 -sSf "https://sh.rustup.rs" | sh + "$HOME/.cargo/bin/cargo" install --git https://github.com/neovide/neovide + else + cargo install --git https://github.com/neovide/neovide + fi + + if [ -e "$HOME/.cargo/bin/neovide" ]; then + $_sudo ln -rs "$HOME/.cargo/bin/neovide" /bin/neovide + fi +} + +i_arch() { + deps="base-devel fontconfig freetype2 libglvnd sndio cmake git gtk3 python sdl2 vulkan-intel libxkbcommon-x11" + $_sudo pacman -Sy + for dep in $deps; do + if ! command_exists $dep; then + silentexec $_sudo pacman --noconfirm -S "$dep" || echo_error "Couldn't install $dep" + fi + done +} + +i_debian() { + $_sudo apt-get update + deps="curl gnupg ca-certificates git gcc-multilib g++-multilib cmake libssl-dev pkg-config libfreetype6-dev libasound2-dev libexpat1-dev libxcb-composite0-dev libbz2-dev libsndio-dev freeglut3-dev libxmu-dev libxi-dev libfontconfig1-dev libxcursor-dev" + for dep in $deps; do + if ! command_exists $dep; then + silentexec $_sudo apt-get install --assume-yes "$dep" || echo_error "Couldn't install $dep" + fi + done +} + +i_fedora() { + deps="fontconfig-devel freetype-devel libX11-xcb libX11-devel libstdc++-static libstdc++-devel" + $_sudo dnf update + for dep in $deps; do + if ! command_exists $dep; then + silentexec $_sudo dnf install "$dep" || echo_error "Couldn't install $dep" + fi + done + $_sudo dnf groupinstall "Development Tools" "Development Libraries" + $_sudo dnf install dnf-plugins-core +} + +checkDistrosAndDependencies() { + if [ -f /etc/os-release ]; then + echo_info "Sourcing /etc/os-release to determine the distribution..." + . /etc/os-release + + case "$ID" in + debian | ubuntu | kali | linuxmint | pop | elementary | zorin | kubuntu | neon | kdeneon | deepin | linuxlite | linuxmintdebian | linuxmintubuntu | linuxmintkali | linuxmintpop | linuxmintelementary | linuxmintzorin | linuxmintkubuntu | linuxmintneon | linuxmintkdeneon | linuxmintdeepin | linuxmintlinuxlite) i_debian ;; + arch | manjaro | endeavouros) i_arch ;; + fedora | centos | rhel | rocky | almalinux) i_fedora ;; + *) + case "$ID_LIKE" in + *debian*) i_debian ;; + *arch*) i_arch ;; + *fedora*) i_fedora ;; + *) + echo_error "Unsupported distribution: $ID" + exit 1 + ;; + esac + ;; + esac + else + echo_error "No os-release file found under /etc/. Exiting now!" + exit 1 + fi +} + +main() { + if checkRoot; then + checkDistrosAndDependencies && installNeovide + fi +} + +main diff --git a/installs/neovim.sh b/installs/neovim.sh new file mode 100755 index 0000000..5fff9ce --- /dev/null +++ b/installs/neovim.sh @@ -0,0 +1,185 @@ +{ + #!/bin/sh -e + + # ANSI color codes + RED='\033[0;31m' + CYAN='\033[0;36m' + YELLOW='\033[0;33m' + LIGHT_GREEN='\033[0;92m' + BOLD='\033[1m' + NC='\033[0m' # No Color + + echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 + } + + echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" + } + + echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" + } + + echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" + } + + # ─< Check if the given command exists silently >───────────────────────────────────────── + command_exists() { + command -v "$@" >/dev/null 2>&1 + } + + # Check if the user is root and set sudo variable if necessary + check_root() { + if [ "$(id -u)" -ne 0 ]; then + echo_note "checked $(id -u)" + if command_exists sudo; then + echo_note "Checking sudo" + echo_warning "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi + if [ -n "$_sudo" ]; then + echo_info "--- check_root done --- echo '$_sudo' |" + else + echo_warning "sudo variable is empty: $_sudo" + fi + } + + # ─< Dependencies >───────────────────────────────────────────────────────────────────── + deps="git cargo meson luarocks pipx curl ripgrep make composer npm gcc g++ unzip zip" + + # ─< Distribution-specific installation functions >───────────────────────────────────── + inst_ubuntu() { + $_sudo apt-get update + for _deps in $deps; do + $_sudo apt-get install -y "$_deps" ──────────────────────────────────────── + get_packager() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + # Convert $ID and $ID_LIKE to lowercase + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop) inst_ubuntu ;; + debian) inst_debian ;; + fedora) inst_fedora ;; + alpine) inst_alpine ;; + arch | manjaro | garuda | endeavour) inst_arch ;; + opensuse*) inst_opensuse ;; + *) + if [ "${ID_LIKE#*debian}" != "$ID_LIKE" ]; then + inst_debian + elif [ "${ID_LIKE#*ubuntu}" != "$ID_LIKE" ]; then + inst_ubuntu + elif [ "${ID_LIKE#*arch}" != "$ID_LIKE" ]; then + inst_arch + elif [ "${ID_LIKE#*fedora}" != "$ID_LIKE" ]; then + inst_fedora + elif [ "${ID_LIKE#*suse}" != "$ID_LIKE" ]; then + inst_opensuse + else + echo_error "Unsupported distribution: $ID" + exit 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + exit 1 + fi + } + + # ─< Main function >───────────────────────────────────────────────────────────────── + main() { + echo_info "Starting Neovim installation script..." + get_packager + if command -v nvim >/dev/null 2>&1; then + echo_note "Neovim has been successfully installed!" + echo_info "Neovim version: $(nvim --version | head -n1)" + else + echo_error "Neovim installation failed." + exit 1 + fi + } + + # ─< Script execution >───────────────────────────────────────────────────────────── + check_root && main +} diff --git a/installs/virt-manager.sh b/installs/virt-manager.sh new file mode 100755 index 0000000..88a56ef --- /dev/null +++ b/installs/virt-manager.sh @@ -0,0 +1,208 @@ +#!/bin/sh + +# ─< ANSI color codes >─────────────────────────────────────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' + +# ─< Initialize storage variables >─────────────────────────────────────────────────────── +_STORED_ERRORS="" +_STORED_WARNINGS="" +_STORED_INFOS="" +_STORED_NOTES="" + +# ─< echo functions that store and display messages >──────────────────────────── +echo_error() { + message="${RED}$1${NC}\n" + printf "$message" >&2 + _STORED_ERRORS="${_STORED_ERRORS}${message}" +} + +echo_warning() { + message="${YELLOW}$1${NC}\n" + printf "$message" + _STORED_WARNINGS="${_STORED_WARNINGS}${message}" +} + +echo_info() { + message="${CYAN}$1${NC}\n" + printf "$message" + _STORED_INFOS="${_STORED_INFOS}${message}" +} + +echo_note() { + message="${LIGHT_GREEN}$1${NC}\n" + printf "$message" + _STORED_NOTES="${_STORED_NOTES}${message}" +} + +# ─< Improved display function that only shows categories with content >────────────────── +display_stored_messages() { + has_messages=0 + + # ─< First check if we have any messages at all >───────────────────────────────────────── + if [ -z "$_STORED_ERRORS" ] && [ -z "$_STORED_WARNINGS" ] && [ -z "$_STORED_INFOS" ] && [ -z "$_STORED_NOTES" ]; then + return 0 + fi + + # ─< Now display each non-empty category with proper spacing >──────────────────────────── + if [ -n "$_STORED_ERRORS" ]; then + printf "\n${BOLD}${RED}=== Errors ===${NC}\n" + printf "$_STORED_ERRORS" + has_messages=1 + fi + + if [ -n "$_STORED_WARNINGS" ]; then + [ "$has_messages" -eq 1 ] && printf "\n" + printf "${BOLD}${YELLOW}=== Warnings ===${NC}\n" + printf "$_STORED_WARNINGS" + has_messages=1 + fi + + if [ -n "$_STORED_INFOS" ]; then + [ "$has_messages" -eq 1 ] && printf "\n" + printf "${BOLD}${CYAN}=== Info ===${NC}\n" + printf "$_STORED_INFOS" + has_messages=1 + fi + + if [ -n "$_STORED_NOTES" ]; then + [ "$has_messages" -eq 1 ] && printf "\n" + printf "${BOLD}${LIGHT_GREEN}=== Notes ===${NC}\n" + printf "$_STORED_NOTES" + fi +} + +# ─< Check if the given command exists silently >───────────────────────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ─< Check if the user is root and set $_sudo variable if necessary >─────────────────────── +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_binfo "User is not root. Using $_sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_binfo "Root access confirmed." + _sudo="" + fi +} + +# ─< Distribution detection and installation >──────────────────────────────────────── +get_packager() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + # ─< Convert $ID and $ID_LIKE to lowercase >────────────────────────────────────────────── + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop) install_debian ;; + debian) install_debian ;; + fedora) install_fedora ;; + # alpine) inst_alpine ;; + arch | manjaro | garuda | endeavour) install_arch ;; + # opensuse*) inst_opensuse ;; + *) + if [ "${ID_LIKE#*debian}" != "$ID_LIKE" ]; then + install_debian + elif [ "${ID_LIKE#*ubuntu}" != "$ID_LIKE" ]; then + install_debian + elif [ "${ID_LIKE#*arch}" != "$ID_LIKE" ]; then + inst_arch + elif [ "${ID_LIKE#*fedora}" != "$ID_LIKE" ]; then + install_fedora + # elif [ "${ID_LIKE#*suse}" != "$ID_LIKE" ]; then + # inst_opensuse + else + echo_error "Unsupported distribution: $ID" + exit 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + exit 1 + fi +} + +# Function to add user to the 'libvirt' group and start services +configure_libvirt() { + echo_note "Adding user to 'libvirt' group..." + $_sudo usermod -aG libvirt "$(whoami)" + + echo_note "Starting and enabling libvirt service..." + if command -v systemctl &>/dev/null; then + $_sudo systemctl start libvirtd + $_sudo systemctl enable libvirtd + else + echo_warning "systemctl command not found, skipping service management." + fi + + echo_note "Configuration complete. You might need to log out and log back in for group changes to take effect." +} + +# Install packages for Debian/Ubuntu/Pop!_OS +install_debian() { + echo_info "Updating package list..." + $_sudo apt update -y + + echo_info "Installing virt-manager, qemu-full, and related packages..." + $_sudo apt install -y virt-manager qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils + + echo_note "Installation complete on Debian/Ubuntu/Pop!_OS!" +} + +# Install packages for Fedora +install_fedora() { + echo_info "Updating package list..." + $_sudo dnf check-update -y + + echo_info "Installing virt-manager, qemu-full, and related packages..." + $_sudo dnf install -y virt-manager qemu-kvm libvirt libvirt-client bridge-utils + + echo_note "Installation complete on Fedora!" +} + +# Install packages for Arch Linux/Manjaro/EndeavourOS +install_arch() { + echo_info "Updating package list..." + $_sudo pacman -Syu --noconfirm + + echo_info "Installing virt-manager, qemu-full, and related packages..." + $_sudo pacman -S --noconfirm virt-manager qemu-full libvirt dnsmasq bridge-utils + + echo_note "Installation complete on Arch Linux/Manjaro/EndeavourOS!" +} + +# Install packages for openSUSE +install_opensuse() { + echo_info "Updating package list..." + $_sudo zypper refresh + + echo_info "Installing virt-manager, qemu-full, and related packages..." + $_sudo zypper install -y virt-manager qemu-kvm libvirt libvirt-client bridge-utils + + echo_note "Installation complete on openSUSE!" +} + +main() { + check_root && + get_packager && + configure_libvirt + + display_stored_messages +} + +main diff --git a/installs/xmrig.sh b/installs/xmrig.sh new file mode 100755 index 0000000..1a680e3 --- /dev/null +++ b/installs/xmrig.sh @@ -0,0 +1,187 @@ +{ + #!/bin/sh + + # ANSI color codes + RED='\033[0;31m' + CYAN='\033[0;36m' + YELLOW='\033[0;33m' + LIGHT_GREEN='\033[0;92m' + BOLD='\033[1m' + NC='\033[0m' # No Color + + echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 + } + + echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" + } + + echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" + } + + echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" + } + + # Check if the user is root and set sudo variable if necessary + check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi + } + + # < Distribution detection and installation > + get_packager() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + # < Convert $ID and $ID_LIKE to lowercase > + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop) _install() { + $_sudo apt-get install "$@" --assume-yes + } ;; + debian) _install() { + $_sudo apt-get install "$@" --assume-yes + } ;; + fedora) _install() { + $_sudo dnf install "$@" -y + } ;; + alpine) _install() { + $_sudo apk add "$@" + } ;; + arch | manjaro | garuda | endeavour) _install() { + $_sudo pacman -S "$@" --noconfirm + } ;; + opensuse*) _install() { $_sudo zypper in "$@" -y; } ;; + *) + if [ "${ID_LIKE#*debian}" != "$ID_LIKE" ]; then + _install() { $_sudo apt-get install "$@" --assume-yes; } + elif [ "${ID_LIKE#*ubuntu}" != "$ID_LIKE" ]; then + _install() { $_sudo apt-get install "$@" --assume-yes; } + elif [ "${ID_LIKE#*arch}" != "$ID_LIKE" ]; then + _install() { $_sudo pacman -S "$@" --noconfirm; } + elif [ "${ID_LIKE#*fedora}" != "$ID_LIKE" ]; then + _install() { $_sudo dnf install "$@" -y; } + elif [ "${ID_LIKE#*suse}" != "$ID_LIKE" ]; then + _install() { $_sudo zypper in "$@" -y; } + else + echo_error "Unsupported distribution: $ID" + exit 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + exit 1 + fi + } + + # Check if a command exists + command_exists() { + command -v "$@" >/dev/null 2>&1 + } + + # Install dependencies + _dependencies() { + tools="git cmake make" + packages="libuv1-dev libssl-dev libhwloc-dev argon2" + + for tool in $tools; do + if command_exists "$tool"; then + echo_note "$tool is already installed" + else + echo_info "Installing $tool.." + _install "$tool" || echo_error "Failed to install $tool" + fi + done + + for package in $packages; do + echo_info "Installing $package" + _install "$package" || echo_error "Failed to install $package" + done + + echo_note "Dependency check completed!" + } + + # Clone the repository and prepare build directory + _git() { + xmrig_dir="$HOME/.bin/xmrig" + + if [ -d "$xmrig_dir" ]; then + echo_warning "$xmrig_dir already exists. Skipping clone." + else + echo_info "Cloning xmrig repository to $xmrig_dir" + mkdir -p "$HOME/.bin" + if ! git clone --depth=1 https://github.com/xmrig/xmrig.git "$xmrig_dir"; then + echo_error "Failed to clone xmrig repository." + return 1 + fi + fi + + build_dir="$xmrig_dir/build" + mkdir -p "$build_dir" || { + echo_error "Failed to create build directory: $build_dir" + return 1 + } + + cd "$build_dir" || { + echo_error "Failed to navigate to build directory: $build_dir" + return 1 + } + } + + # Initialize and build the application + _appinit() { + echo_info "Running cmake .." + if ! cmake ..; then + echo_error "CMake failed." + return 1 + fi + + echo_info "Running make (this could take a while)" + if ! make; then + echo_error "Make failed." + return 1 + fi + + $_sudo ln -s ./xmrig /usr/bin/xmrig || "Link of application failed hard! Is not accessible at /usr/bin/xmrig" + } + + # Main function + main() { + if ! check_root; then + echo_error "Root check failed. Exiting." + return 1 + fi + + if ! get_packager; then + echo_error "Failed to detect distribution or set packager." + return 1 + fi + + _dependencies || return 1 + + if _git; then + _appinit || echo_error "Build initialization failed." + else + echo_error "Failed during Git operations." + fi + } + + main +} diff --git a/installs/yazi.sh b/installs/yazi.sh new file mode 100644 index 0000000..518e6e0 --- /dev/null +++ b/installs/yazi.sh @@ -0,0 +1,149 @@ +{ + #!/bin/sh -e + + # ─< ANSI color codes >─────────────────────────────────────────────────────────────────── + RED='\033[0;31m' + CYAN='\033[0;36m' + YELLOW='\033[0;33m' + LIGHT_GREEN='\033[0;92m' + BOLD='\033[1m' + NC='\033[0m' # No Color + + echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 + } + + echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" + } + + echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" + } + + echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" + } + + # ─< Check if the given command exists silently >───────────────────────────────────────── + command_exists() { + command -v "$@" >/dev/null 2>&1 + } + + # ─< Check if the user is root and set sudo variable if necessary >─────────────────────── + check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi + } + + evalCargo() { + if [ -e "$HOME/.cargo/env" ]; then + echo_note "Using $HOME/.cargo/env.." + . "$HOME/.cargo/env" + fi + } + + i_cargo() { + # if ! command_exists make || ! command_exists gcc; then + # echo_error "The script might run into issues, because of make and gcc not being installed. Please install it, and run the script again, if it fails!" + # fi + evalCargo + if command_exists cargo; then + echo_info "Installing yazi through cargo" + elif command_exists curl; then + echo_note "no cargo found, using curl to install rustup" + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + + evalCargo + + rustup update + evalCargo + + echo_info "Installing yazi through cargo" + else + echo_warning "neither cargo, nor curl were found. Cannot continue!" + fi + + cargo install --locked yazi-fm yazi-cli + + c_yazi + } + + i_arch() { + $_sudo pacman -S yazi --noconfirm + c_yazi + } + + i_opensuse() { + $_sudo zypper install yazi + c_yazi + } + + c_yazi() { + if [ -e "$HOME/.config/yazi/package.toml" ]; then + if command_exists ya; then + ya pack -i + fi + else + echo_warning "There was no yazi config found.. " + fi + } + + # ─< Distribution detection and installation >──────────────────────────────────────── + get_packager() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + # ─< Convert $ID and $ID_LIKE to lowercase >────────────────────────────────────────────── + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop) i_cargo ;; + debian) i_cargo ;; + fedora) i_cargo ;; + alpine) i_cargo ;; + arch | manjaro | garuda | endeavour) i_arch ;; + opensuse*) i_opensuse ;; + *) + if [ "${ID_LIKE#*debian}" != "$ID_LIKE" ]; then + i_cargo + elif [ "${ID_LIKE#*ubuntu}" != "$ID_LIKE" ]; then + i_cargo + elif [ "${ID_LIKE#*arch}" != "$ID_LIKE" ]; then + i_arch + elif [ "${ID_LIKE#*fedora}" != "$ID_LIKE" ]; then + i_cargo + elif [ "${ID_LIKE#*suse}" != "$ID_LIKE" ]; then + i_opensuse + else + echo_error "Unsupported distribution: $ID" + exit 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + exit 1 + fi + } + + main() { + if check_root; then + get_packager + fi + } + + main +} diff --git a/installs/ytgo.sh b/installs/ytgo.sh new file mode 100644 index 0000000..091e2d8 --- /dev/null +++ b/installs/ytgo.sh @@ -0,0 +1,157 @@ +#!/bin/sh + +# ╭───────────────╮ +# │ env functions │ +# ╰───────────────╯ +# ───────────────────────────────────< ANSI color codes >─────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ─────────────< Check if the user is root and set sudo variable if necessary >───────────── +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi +} + +# ──────────────────────< Check if the given command exists silently >────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ╭────────────────────────────────────╮ +# │ insert your scripts/functions here │ +# ╰────────────────────────────────────╯ + +# ─< Distribution detection and installation >──────────────────────────────────────── +get_packager() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + # ─< Convert $ID and $ID_LIKE to lowercase >────────────────────────────────────────────── + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop) _install() { + $_sudo apt-get install --assume-yes "$@" + } ;; + debian) _install() { + $_sudo apt-get install --assume-yes "$@" + } ;; + fedora) _install() { + $_sudo dnf install -y "$@" + } ;; + alpine) inst_alpine ;; + arch | manjaro | garuda | endeavour) _install() { + $_sudo pacman -S --noconfirm "$@" + } ;; + opensuse*) inst_opensuse ;; + *) + if [ "${ID_LIKE#*debian}" != "$ID_LIKE" ]; then + _install() { + $_sudo apt-get install --assume-yes "$@" + } + elif [ "${ID_LIKE#*ubuntu}" != "$ID_LIKE" ]; then + _install() { + $_sudo apt-get install --assume-yes "$@" + } + elif [ "${ID_LIKE#*arch}" != "$ID_LIKE" ]; then + _install() { + $_sudo pacman -S --noconfirm "$@" + } + elif [ "${ID_LIKE#*fedora}" != "$ID_LIKE" ]; then + _install() { + $_sudo dnf install -y "$@" + } + elif [ "${ID_LIKE#*suse}" != "$ID_LIKE" ]; then + inst_opensuse + else + echo_error "Unsupported distribution: $ID" + exit 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + exit 1 + fi +} + +_dependencies() { + get_packager + if [[ "$ID" == "arch" || "$ID_LIKE" == *"arch"* ]]; then + _deps="go git mpv yt-dlp" + else + _deps="golang git mpv yt-dlp" + fi + + for dependency in $_deps; do + if ! command_exists "$dependency"; then + echo_info "Installing $dependency" + _install "$dependency" || echo_error "$dependency could not be installed!" + else + echo_note "$dependency - was already installed." + fi + done +} + +_clone() { + tmpdir="$(mktemp --dir)" + repo="https://git.k4li.de/pika/ytgo.git" + + cd "$tmpdir" || echo_error "$tmpdir is not a valid directory!" + git clone --depth=1 "$repo" + cd ytgo || echo_error "$tmpdir/ytgo is not a valid directory!" +} + +_build() { + $_sudo make install +} + +# ───────────────────────────────< main function to execute >─────────────────────────────── +main() { + if check_root; then + _dependencies || echo_error "dependency function failed hard!" + _clone || echo_error "clone function failed hard!" + _build || echo_error "build function failed hard!" + else + echo_error "Something went terribly wrong!" + fi +} + +main diff --git a/logging.sh b/logging.sh new file mode 100644 index 0000000..0739b62 --- /dev/null +++ b/logging.sh @@ -0,0 +1,76 @@ +#!/bin/sh + +# POSIX-compliant color codes +RED='\033[0;31m' +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# Simple echo functions without any arrays or typeset +echo_error() { + printf "${RED}❌ %s${NC}\n" "$1" >&2 +} + +echo_warning() { + printf "${YELLOW}⚠️ %s${NC}\n" "$1" +} + +echo_info() { + printf "${GREEN}ℹ️ %s${NC}\n" "$1" +} + +echo_note() { + printf "${CYAN}📝 %s${NC}\n" "$1" +} + +# ─< Check if the given command exists silently >───────────────────────────────────────── +command_exists() { + for i in which command; do + if command_exists $i; then + case $i in + command) command -v "$@" >/dev/null 2>&1 ;; + which) which "$@" >/dev/null 2>&1 ;; + esac + fi + done +} + +_cd() { + cd "$1" || { echo_error "Cannot navigate to the directory: $1"; return 1; } +} + +_exit() { + echo_error "There was an error, which caused the script to exit immediately" + echo_error "$1" + echo_error "Exiting now!" + exit 1 +} + +confirm_action() { + read -p "$1 - [y/n]: " confirm + case $confirm in + [yY] ) return 0 ;; + [nN] ) return 1 ;; + * ) echo_warning "Invalid input. Action cancelled." ; return 1 ;; + esac +} + +create_dir() { + if [ ! -d "$1" ]; then + echo_info "Creating directory: $1" + mkdir -p "$1" || _exit "Failed to create directory $1" + else + echo_info "Directory $1 already exists" + fi +} + +check_disk_space() { + threshold=1000000 # Minimum space in KB (e.g., 1GB) + available_space=$(df / | awk 'NR==2 {print $4}') + if [ "$available_space" -lt "$threshold" ]; then + echo_warning "Not enough disk space. Only $((available_space / 1024))MB remaining." + return 1 + fi + echo_info "Sufficient disk space available." +} \ No newline at end of file diff --git a/setup/arch-hyprland.sh b/setup/arch-hyprland.sh new file mode 100644 index 0000000..66b367e --- /dev/null +++ b/setup/arch-hyprland.sh @@ -0,0 +1,203 @@ +#!/bin/sh + +# ╭───────────────╮ +# │ env functions │ +# ╰───────────────╯ +# ───────────────────────────────────< ANSI color codes >─────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +# ─────────────< Check if the user is root and set sudo variable if necessary >───────────── +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi +} + +# ─< Distribution detection and installation >──────────────────────────────────────── +get_packager() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop) _install() { $_sudo apt-get install --assume-yes "$@"; } ;; + debian) _install() { $_sudo apt-get install --assume-yes "$@"; } ;; + fedora) _install() { $_sudo dnf install -y "$@"; } ;; + alpine) _install() { $_sudo apk add "$@"; } ;; + arch | manjaro | garuda | endeavour) _install() { $pkger -S --noconfirm "$@"; } ;; + opensuse*) _install() { $_sudo zypper in -y "$@"; } ;; + *) + if echo "$ID_LIKE" | grep -q "debian"; then + _install() { $_sudo apt-get install --assume-yes "$@"; } + elif echo "$ID_LIKE" | grep -q "ubuntu"; then + _install() { $_sudo apt-get install --assume-yes "$@"; } + elif echo "$ID_LIKE" | grep -q "arch"; then + _install() { $pkger -S --noconfirm "$@"; } + elif echo "$ID_LIKE" | grep -q "fedora"; then + _install() { $_sudo dnf install -y "$@"; } + elif echo "$ID_LIKE" | grep -q "suse"; then + _install() { $_sudo zypper in -y "$@"; } + else + echo_error "Unsupported distribution: $ID" + return 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + return 1 + fi +} + +# ──────────────────────< Check if the given command exists silently >────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +check_aur() { + if ! command_exists yay; then + echo_error "Yay was not found.. looking for paru instead" + if ! command_exists paru; then + echo_error "No AUR helper found, please install before continuing!" + exit 1 + else + echo_info "Found paru, using it.." + pkger="paru" + fi + exit 1 + else + echo_info "Found yay, using it.." + pkger="yay" + fi +} + +check_deps() { + deps=" + hyprland + hyprpicker + hyprlang + hyprutils + hyprwayland-scanner + xdg-desktop-portal-hyprland + + $BarOfChoise + swww + rofi + wlogout + libnotify + " + for dependency in $deps; do + if ! command_exists "$dependency"; then + echo_note "Installing $dependency.." + _install "$dependency" + else + echo_info "$dependency is already installed" + fi + done +} + +ask_bar() { + echo_note "Which bar do you want to use?" + echo_note "[g]Bar, [H]yprpanel, [W]aybar" + read -r ask_bar ─────────────────────────────── +main() { + if check_root; then + if check_aur; then + get_packager + fi + else + echo_error "Something went terribly wrong!" + exit 1 + fi + + ask_bar + check_deps + ask_dotfiles +} + +if ! command_exists hyprland; then + main +else + echo_warning "Hyprland is already installed!" +fi diff --git a/setup/debian-major.sh b/setup/debian-major.sh new file mode 100644 index 0000000..5010649 --- /dev/null +++ b/setup/debian-major.sh @@ -0,0 +1,157 @@ +#!/bin/sh + +# ╭───────────────╮ +# │ env functions │ +# ╰───────────────╯ +# ───────────────────────────────────< ANSI color codes >─────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ─────────────< Check if the user is root and set sudo variable if necessary >───────────── +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi +} + +# ──────────────────────< Check if the given command exists silently >────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ╭────────────────────────────────────╮ +# │ insert your scripts/functions here │ +# ╰────────────────────────────────────╯ + +full_update_and_upgrade() { + if command_exists apt-get; then + echo_info "Updating sources.." + $_sudo apt-get update || echo_error "Something went wrong, please check your connection and permissions!" + $_sudo apt-get upgrade --assume-yes || echo_error "Something went wrong, please check your connection and permissions!" + $_sudo apt-get full-upgrade --assume-yes || echo_error "Something went wrong, please check your connection and permissions!" + else + echo_error "The OS is not suitable for this script!" + fi +} + +clean_and_full_upgrade() { + if command_exists apt-get; then + echo_info "Cleaning the environment.." + $_sudo apt-get clean --assume-yes + full_update_and_upgrade + else + echo_error "The OS is not suitable for this script!" + fi +} + +post_clean() { + if command_exists apt-get; then + $_sudo apt-get autoremove --assume-yes + else + echo_error "The OS is not suitable for this script!" + fi +} + +detect_version() { + . /etc/os-release + case "$VERSION_CODENAME" in + bookworm) + cur_os="bookworm" + tar_os="trixie" + ;; + buster) + cur_os="buster" + tar_os="bullseye" + ;; + bullseye) + cur_os="bullseye" + tar_os="bookworm" + ;; + *) + echo_error "$VERSION_CODENAME is either not a debian version, or just simply not defined" + return 1 + ;; + esac +} + +update_sources() { + # Create backup directory if it doesn't exist + BACKUP_DIR="/var/backups/apt-sources" + echo_info "Creating backup directory at $BACKUP_DIR..." + $_sudo mkdir -p "$BACKUP_DIR" + + echo_info "Backing up current sources lists..." + $_sudo cp /etc/apt/sources.list "$BACKUP_DIR/sources.list.backup.$(date +%Y%m%d)" + + echo_info "Updating sources from Bookworm to Trixie..." + # Replace bookworm with trixie in main sources.list + $_sudo sed -i "s/$cur_os/$tar_os/g" /etc/apt/sources.list + + # Check and update any additional source files in sources.list.d + if [ -d "/etc/apt/sources.list.d" ]; then + for sourcefile in /etc/apt/sources.list.d/*.list; do + if [ -f "$sourcefile" ]; then + filename=$(basename "$sourcefile") + echo_info "Backing up and updating $sourcefile..." + $_sudo cp "$sourcefile" "$BACKUP_DIR/${filename}.backup.$(date +%Y%m%d)" + $_sudo sed -i "s/$cur_os/$tar_os/g" "$sourcefile" + fi + done + fi + + echo_note "Sources have been updated to Trixie. Please run a full system update." + echo_warning "Make sure to review the changes and ensure all repositories are compatible with Trixie!" + echo_info "Backups stored in $BACKUP_DIR" + echo "" + __lsb_release__="$(lsb_release -a)" + echo_info "$__lsb_release__" +} + +# ───────────────────────────────< main function to execute >─────────────────────────────── +main() { + if check_root; then + full_update_and_upgrade + if detect_version; then + update_sources + fi + clean_and_full_upgrade + post_clean + else + echo_error "Something went terribly wrong!" + fi +} + +main diff --git a/setup/docker-network.sh b/setup/docker-network.sh new file mode 100644 index 0000000..3ff2deb --- /dev/null +++ b/setup/docker-network.sh @@ -0,0 +1,110 @@ +#!/bin/sh + +# ╭───────────────╮ +# │ env functions │ +# ╰───────────────╯ +# ───────────────────────────────────< ANSI color codes >─────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ─────────────< Check if the user is root and set sudo variable if necessary >───────────── +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi +} + +# ──────────────────────< Check if the given command exists silently >────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ╭────────────────────────────────────╮ +# │ insert your scripts/functions here │ +# ╰────────────────────────────────────╯ + +# Function to initialize or update the Docker daemon configuration +dnetwork_init() { + if ! command_exists docker; then + echo_error "No docker was found! Cannot continue!" + return 1 + fi + + CONFIG_FILE="/etc/docker/daemon.json" + + echo_info "Checking Docker daemon configuration..." + + # Check if the configuration file exists + if [ ! -f "$CONFIG_FILE" ]; then + echo_warning "Docker daemon configuration file not found. Creating it." + ${_sudo} mkdir -p /etc/docker + ${_sudo} tee "$CONFIG_FILE" >/dev/null </dev/null + ${_sudo} mv "$CONFIG_FILE.tmp" "$CONFIG_FILE" + echo_note "Default address pool added to configuration." + fi + fi + + echo_info "Restarting Docker to apply changes..." + ${_sudo} systemctl restart docker && echo_note "Docker restarted successfully." || echo_error "Failed to restart Docker." +} + +# ───────────────────────────────< main function to execute >─────────────────────────────── +main() { + if check_root; then + dnetwork_init + else + echo_error "Something went terribly wrong!" + fi +} + +main diff --git a/setup/postinstall.sh b/setup/postinstall.sh new file mode 100755 index 0000000..a1f242c --- /dev/null +++ b/setup/postinstall.sh @@ -0,0 +1,369 @@ +{ + #!/bin/sh -e + + # ╭──────────────╮ + # │ dependencies │ + # ╰──────────────╯ + deps=" + 7zip + bc + btop + exa + fzf + gawk + gdu + git + make + pv + ripgrep + rsync + stow + tmux + trash-cli + unzip + zoxide + zsh + " + + # ╭─────────────╮ + # │ ENVIRONMENT │ + # ╰─────────────╯ + # ANSI color codes + RED='\033[0;31m' + CYAN='\033[0;36m' + YELLOW='\033[0;33m' + LIGHT_GREEN='\033[0;92m' + BOLD='\033[1m' + NC='\033[0m' + + # Initialize storage variables + _STORED_ERRORS="" + _STORED_WARNINGS="" + _STORED_INFOS="" + _STORED_NOTES="" + + # Modified echo functions that store and display messages + echo_error() { + message="${RED}$1${NC}\n" + printf "$message" >&2 + _STORED_ERRORS="${_STORED_ERRORS}${message}" + } + + echo_warning() { + message="${YELLOW}$1${NC}\n" + printf "$message" + _STORED_WARNINGS="${_STORED_WARNINGS}${message}" + } + + echo_info() { + message="${CYAN}$1${NC}\n" + printf "$message" + _STORED_INFOS="${_STORED_INFOS}${message}" + } + + echo_note() { + message="${LIGHT_GREEN}$1${NC}\n" + printf "$message" + _STORED_NOTES="${_STORED_NOTES}${message}" + } + + # ─< Check if the given command exists silently >───────────────────────────────────────── + command_exists() { + command -v "$@" >/dev/null 2>&1 + } + + # ─────────────────────────────────────< get packager >───────────────────────────────────── + checkPkg() { + for pkg in apt-get dnf pacman apk zypper; do + if command_exists $pkg; then + printf "Using ${RED}${pkg}${NC} method.." + pkger="$pkg" + fi + done + } + + # ─────────────────────────────────< check for root/sudo >─────────────────────────────── + checkRoot() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo -E" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi + } + + # ╭─────╮ + # │ apt │ + # ╰─────╯ + aptCommentCDinSources() { + # Path to sources.list + sources_file="/etc/apt/sources.list" + + # Check if file exists + if [ ! -f "$sources_file" ]; then + echo_error "Error: $sources_file not found" + return 1 + fi + + # Comment out CD-ROM entries using sudo + $_sudo sed -i 's/^[[:space:]]*deb[[:space:]]\+cdrom:/#&/' "$sources_file" + echo_info "CD-ROM entries have been commented out in $sources_file" + } + + aptBase() { + aptCommentCDinSources + echo_info "Updating sources.." + if ! $_sudo apt-get update; then + echo_error "Maybe you need a proxy?" + + exit 1 + fi + + if ! command_exists sudo; then + echo_note "Installing sudo" + apt-get install sudo --assume-yes + fi + + echo_note "Installing base packages: $deps" + + for _deps in $deps; do + if ! command_exists "$_deps"; then + echo_info "Installing $_deps.." + if ! $_sudo apt-get install "$_deps" --assume-yes; then + echo_error "$_deps - failed to install!" + fi + else + echo_note "$_deps - was already installed!" + fi + done + } + + aptOptimize() { + if command_exists nala; then + echo_info "Nala is already present, fetching mirros now! (This might take a minute or two, depending on your internet speed)" + $_sudo nala fetch --auto --assume-yes --https-only + else + echo_note "Nala is not installed on the system, do you want to install it now? (Y/n): " + read -r inst_nala ─────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +# ────────────────< function to check if the given command exists silently >──────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ─────────────< Check if the user is root and set sudo variable if necessary >───────────── +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi +} + +# ─< Distribution detection and installation >──────────────────────────────────────── +get_packager() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop) _install() { $_sudo apt-get install --assume-yes "$@"; } ;; + debian) _install() { $_sudo apt-get install --assume-yes "$@"; } ;; + fedora) _install() { $_sudo dnf install -y "$@"; } ;; + alpine) _install() { $_sudo apk add "$@"; } ;; + arch | manjaro | garuda | endeavour) _install() { $_sudo pacman -S --noconfirm "$@"; } ;; + opensuse*) _install() { $_sudo zypper in -y "$@"; } ;; + *) + if echo "$ID_LIKE" | grep -q "debian"; then + _install() { $_sudo apt-get install --assume-yes "$@"; } + elif echo "$ID_LIKE" | grep -q "ubuntu"; then + _install() { $_sudo apt-get install --assume-yes "$@"; } + elif echo "$ID_LIKE" | grep -q "arch"; then + _install() { $_sudo pacman -S --noconfirm "$@"; } + elif echo "$ID_LIKE" | grep -q "fedora"; then + _install() { $_sudo dnf install -y "$@"; } + elif echo "$ID_LIKE" | grep -q "suse"; then + _install() { $_sudo zypper in -y "$@"; } + else + echo_error "Unsupported distribution: $ID" + return 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + return 1 + fi +} + +# ──────────────────────────< define your functions/script here >──────────────────────── +dependencies() { + _deps="krb5-user realmd sssd-tools sssd libnss-sss libpam-sss adcli" + + for dependency in $_deps; do + if ! command_exists "$dependency"; then + echo_info "Installing $dependency.." + sleep 0.3 + if ! _install "$dependency"; then + echo_error "$dependency - could not be installed!" + else + echo_note "$dependency - was installed successfully!" + fi + else + echo_note "$dependency is already installed." + fi + done +} + +_join() { + domain="swu.dom" + echo_note "You are trying to connect to $domain.." + sleep 1 + echo_note "Please enter an administrator user like this: [example-user]" + printf "Admin User: " >&2 + read -r _admin ─────────────────────────────── +main() { + if check_root; then + get_packager && + dependencies && + _join + else + echo_error "Root privileges are required. Exiting." + return 1 + fi +} + +# ──────────────────────────────< execute the main function >──────────────────────────── +main diff --git a/setup/unattendet-upgrades.sh b/setup/unattendet-upgrades.sh new file mode 100644 index 0000000..d2a0c2d --- /dev/null +++ b/setup/unattendet-upgrades.sh @@ -0,0 +1,86 @@ +#!/bin/sh -e + +LOG_FILE="/var/log/unattended-upgrades-check.log" + +# Colors +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +# ─< Check if the given command exists silently >───────────────────────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +run_checks() { + echo_info "Checking if unattended-upgrades is active..." + + if command_exists unattended-upgrades; then + # if dpkg-query -W -f='${Status}' unattended-upgrades 2>/dev/null | grep -q "install ok installed"; then + echo_note "unattended-upgrades is already installed." + else + echo_warning "unattended-upgrades is not installed. Attempting to install..." + if command_exists apt-get; then + if apt-get update && apt-get install --assume-yes unattended-upgrades; then + echo_note "unattended-upgrades successfully installed." + else + echo_error "Failed to install unattended-upgrades. Exiting." + exit 1 + fi + else + echo_error "apt is not available on this system. Exiting." + exit 1 + fi + fi + + # Enable unattended-upgrades + UNATTENDED_UPGRADES_FILE="/etc/apt/apt.conf.d/50unattended-upgrades" + if [ -f "$UNATTENDED_UPGRADES_FILE" ]; then + echo_info "Configuring unattended upgrades in $UNATTENDED_UPGRADES_FILE" + # Add or modify configurations as needed + # Example: $_sudo sed -i 's/old_value/new_value/' "$UNATTENDED_UPGRADES_FILE" + else + echo_error "Unattended upgrades file not found!" + fi +} + +run_setup() { + if command_exists unattended-upgrades; then + systemctl enable --now unattended-upgrades || echo_error "Something went wrong! Could not setup the service/autostart" + fi +} + +# Main script +main() { + echo_info "Starting unattended-upgrades check script..." + + if [ "$(id -u)" -ne 0 ]; then + echo_error "This script must be run as root. Please run with sudo." + exit 1 + fi + + run_checks + + run_setup && echo_note "Script completed successfully!" +} + +main diff --git a/setup/updates.sh b/setup/updates.sh new file mode 100755 index 0000000..430e519 --- /dev/null +++ b/setup/updates.sh @@ -0,0 +1,157 @@ +#!/bin/sh + +# ─< ANSI color codes >─────────────────────────────────────────────────────────────────── +RED='\033[0;31m' +CYAN='\033[0;36m' +YELLOW='\033[0;33m' +LIGHT_GREEN='\033[0;92m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +echo_error() { + printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2 +} + +echo_info() { + printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1" +} + +echo_warning() { + printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1" +} + +echo_note() { + printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1" +} + +# ─< Check if the given command exists silently >───────────────────────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ─< Check if the user is root and set sudo variable if necessary >─────────────────────── +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi +} + +# ─< Distribution detection and installation >──────────────────────────────────────── +get_packager() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + # ─< Convert $ID and $ID_LIKE to lowercase >────────────────────────────────────────────── + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop) packager="apt" ;; + debian) packager="apt" ;; + fedora) packager="dnf" ;; + alpine) packager="apk" ;; + arch | manjaro | garuda | endeavour) packager="pacman" ;; + opensuse*) packager="zypper" ;; + *) + if [ "${ID_LIKE#*debian}" != "$ID_LIKE" ]; then + packager="apt" + elif [ "${ID_LIKE#*ubuntu}" != "$ID_LIKE" ]; then + packager="apt" + elif [ "${ID_LIKE#*arch}" != "$ID_LIKE" ]; then + packager="pacman" + elif [ "${ID_LIKE#*fedora}" != "$ID_LIKE" ]; then + packager="dnf" + elif [ "${ID_LIKE#*suse}" != "$ID_LIKE" ]; then + packager="zypper" + else + echo_error "Unsupported distribution: $ID" + exit 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + exit 1 + fi +} + +_update() { + case "$packager" in + apt) + if command_exists nala; then + echo_note "Using nala to update packages.. Please be patient.." + sleep 1 + $_sudo nala update + $_sudo nala upgrade -y + $_sudo nala autoremove -y + $_sudo apt-get autoclean -y + else + echo_note "Using nala to update packages.. Please be patient.." + sleep 1 + $_sudo apt-get update + $_sudo apt-get upgrade -y + $_sudo apt-get autoremove -y + $_sudo apt-get autoclean -y + fi + ;; + dnf) + echo_note "Using dnf to update packages.. Please be patient.." + sleep 1 + $_sudo dnf update + ;; + pacman) + echo_note "Using pacman to update packages.. Please be patient.." + sleep 1 + $_sudo pacman -Syu --noconfirm + ;; + apk) + echo_note "Using apk to update packages.. Please be patient.." + sleep 1 + $_sudo apk update + $_sudo apk upgrade + ;; + zypper) + echo_note "Using zypper to update packages.. Please be patient.." + sleep 1 + $_sudo zypper dup + ;; + *) + if [ -z "$packager" ]; then + echo_error "The packager variable is not declared.." + else + echo_error "$packager is not a known packager.." + fi + ;; + esac +} + +_flatpak() { + if command_exists flatpak; then + echo_info "Trying to update flatpaks.." + sleep 1 + flatpak update + else + echo_note "No flatpaks found" + fi +} + +main() { + check_root + sleep 1 + if get_packager; then + _update + _flatpak + fi +} + +main