ScriptUI/core/tabs/system-setup/postinstall.sh
2024-12-26 00:29:38 +01:00

466 lines
11 KiB
Bash
Executable file

#!/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'
# 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}"
}
echo_db() {
message="${LIGHT_GREEN}$1${NC}\n"
printf "$message"
}
# ─< Check if the given command exists silently >─────────────────────────────────────────
command_exists() {
command -v "$@" >/dev/null 2>&1
}
# ─< to get the alias to install everything either with your shell or inside your script! >─
if command_exists curl; then
install_pkg() {
sh -c "$(curl -sSL https://git.k4li.de/pika/scripts/raw/branch/main/bash/snippets/install_pkg.sh)" -- "$@"
}
else
echo_error "curl is not installed, universal install disabled!"
fi
# 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
}
comment_cd_sources() {
# 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"
}
i_yazi() {
if command_exists curl; then
curl -fsSL https://git.k4li.de/pika/scripts/raw/branch/main/bash/installs/yazi.sh | sh
else
echo_error "No curl was found"
fi
}
deps="zsh tmux gdu rsync fzf unzip go btop make stow git npm bc pv zoxide ripgrep trash-cli"
check_nala() {
deb_pkger=""
echo_info "Updating sources.."
if ! $_sudo apt-get update; then
echo_error "Maybe you need a proxy?"
fi
if ! command_exists sudo; then
echo_note "Installing sudo"
apt-get install sudo --assume-yes
fi
if command_exists nala; then
deb_pkger="nala"
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
else
echo_note "Nala is not installed on the system, do you want to install it now? (Y/n): "
read -r inst_nala
case "$inst_nala" in
N | n)
deb_pkger="apt-get"
echo_warning "All right, continue without nala!"
;;
*)
echo_note "Installing nala.."
$_sudo apt-get install nala --assume-yes &&
deb_pkger="nala"
echo_info "Fetching best mirrors"
$_sudo nala fetch --auto --assume-yes
;;
esac
fi
}
inst_debian() {
comment_cd_sources
check_nala
if command_exists nano; then
if command_exists vi; then
echo_note "Removing nano"
$_sudo $deb_pkger remove nano --assume-yes
else
echo_info "Removing nano and installing vi as a backup"
$_sudo $deb_pkger remove nano --assume-yes && $_sudo apt-get install vi --assume-yes
fi
fi
echo_note "Installing base packages: $deps"
for _deps in $deps; do
if ! command_exists "$_deps"; then
if ! $_sudo $deb_pkger install "$_deps" --assume-yes; then
echo_error "$_deps - failed to install"
fi
else
echo_note "$_deps - was already installed"
fi
done
i_yazi
}
inst_ubuntu() {
comment_cd_sources
check_nala
if command_exists nano; then
if command_exists vi; then
echo_note "Removing nano"
$_sudo $deb_pkger remove nano --assume-yes
else
echo_note "Removing nano and installing vi as a backup"
$_sudo $deb_pkger remove nano --assume-yes && $_sudo apt-get install vi --assume-yes
fi
fi
echo_note "Installing base packages: $deps"
for _deps in $deps; do
if ! command_exists "$_deps"; then
if ! $_sudo $deb_pkger install "$_deps" --assume-yes; then
echo_error "$_deps - failed to install"
fi
else
echo_note "$_deps - was already installed"
fi
done
i_yazi
}
inst_fedora() {
if command_exists nano; then
if command_exists vi; then
echo_note "Removing nano"
$_sudo dnf remove nano </dev/tty
else
echo_note "Removing nano and installing vi as a backup"
$_sudo dnf remove nano </dev/tty &&
$_sudo dnf install vi </dev/tty
fi
fi
echo_note "Installing base packages: $deps"
for _deps in $deps; do
if ! command_exists "$_deps"; then
if ! $_sudo dnf install "$_deps" </dev/tty; then
echo_error "$_deps - failed to install"
fi
else
echo_note "$_deps - was already installed"
fi
done
i_yazi
}
inst_opensuse() {
if command_exists nano; then
if command_exists vi; then
echo_note "Removing nano"
$_sudo zypper install -y nano </dev/tty
else
echo_note "Removing nano and installing vi as a backup"
$_sudo zypper install -y vi </dev/tty
fi
fi
echo_note "Installing base packages: $deps"
for _deps in $deps; do
if ! command_exists "$_deps"; then
if ! $_sudo zypper in -y "$_deps" </dev/tty; then
echo_error "$_deps - failed to install"
fi
else
echo_note "$_deps - was already installed"
fi
done
i_yazi
}
inst_arch() {
if command_exists nano; then
if command_exists vi; then
echo_note "Removing nano"
$_sudo pacman -R nano --noconfirm
else
echo_note "Removing nano and installing vi as a backup"
$_sudo pacman -S vi --noconfirm
fi
fi
$_sudo pacman -S base-devel --noconfirm
echo_note "Installing base packages: $deps"
for _deps in $deps; do
if ! command_exists "$_deps"; then
if ! $_sudo pacman -S "$_deps" --noconfirm; then
echo_error "$_deps - failed to install"
fi
else
echo_note "$_deps - was already installed"
fi
done
i_yazi
}
# ─< 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 | zorin) 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
}
# 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
}
_inst_docker() {
if ! command_exists docker; then
bash --norc -c "$(curl -fsSL https://git.k4li.de/pika/scripts/raw/branch/main/bash/installs/docker.sh)"
else
echo_note "Docker is already installed, do you need to activate it and make the group changes for $(whoami)? (y/n): "
read -r _docker
case "$_docker" in
N | n)
return 1
;;
*)
$_sudo systemctl enable --now docker &&
$_sudo usermod -aG docker "$(whoami)"
echo_info "Docker was configured"
;;
esac
fi
}
_inst_lazydocker() {
if [ ! -e "$HOME/.local/bin/lazydocker" ]; then
if command_exists curl; then
curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash
else
echo_error "curl is not installed, cannot continue!"
exit 1
fi
else
echo_warning "$HOME/.local/bin/lazydocker is already present."
fi
_dashboard
}
_check_gitpath() {
if [ ! -d "$HOME/git/" ]; then
mkdir $HOME/git
else
echo_note "git dir is already present"
fi
}
_ytgo() {
if ! command_exists go; then
if ! install_pkg golang; then
echo_error "Something went wrong, couldn't install golang"
fi
fi
if ! command_exists ytgo; then
cd "$(mktemp --dir)"
git clone --depth=1 https://git.k4li.de/pika/ytgo.git
cd ytgo
make install
else
echo_info "ytgo is already present at $(whereis ytgo)"
fi
}
_init_dotfiles() {
_check_gitpath
echo_db "What dotfiles do you want to clone?
1. homelab-dotfiles
2. hyprdots
3. tty-dotfiles
q. Quit"
read -r _dotfiles_db
case "$_dotfiles_db" in
1)
git clone --recursive --depth=1 https://git.k4li.de/dotfiles/homelab-dotfiles.git $HOME/git/homelab-dotfiles
;;
2)
git clone --recursive --depth=1 https://git.k4li.de/dotfiles/hyprdots.git $HOME/git/hyprdots
;;
3)
git clone --recursive --depth=1 https://git.k4li.de/dotfiles/tty-dotfiles.git $HOME/git/tty-dotfiles
;;
q)
return 1
;;
*)
echo default
;;
esac
_dashboard
}
_dashboard() {
echo_db "What else can I do for you?
1. Docker installation
2. Dotfile initialization
3. lazydocker installation
4. ytgo
q. Quit"
read -r _db </dev/tty
case "$_db" in
1)
_inst_docker
;;
2)
_init_dotfiles
;;
3)
_inst_lazydocker
;;
4)
_ytgo
;;
q)
exit 1
;;
esac
}
main() {
# set -x
if check_root; then
get_packager
_dashboard
fi
}
main