This commit is contained in:
pika 2025-05-23 20:13:15 +02:00
parent 73049cbde6
commit bf57d47fed
3 changed files with 237 additions and 320 deletions

View file

@ -73,6 +73,10 @@ echo_error() {
echo "${BOLD}${RED}${UNDERLINE}ERROR:${NC}${BRIGHT_RED} $1 ${NC}" >&2
}
echo-error() {
echo "${BOLD}${RED}${UNDERLINE}ERROR:${NC}${BRIGHT_RED} $1 ${NC}" >&2
}
# INFO:
# ↓ should get set in the install script itself
# ↓
@ -107,84 +111,64 @@ echo_pkg() {
}
echo_info() {
echo "${BOLD}${BLUE}INFO:${NC}${BRIGHT_BLUE} $1${NC}"
echo "${BOLD}${BLUE}INFO:${NC} $1${NC}"
}
echo_info() {
echo "${BOLD}${BLUE}INFO:${NC} $1${NC}"
}
echo-warning() {
echo "${BOLD}${YELLOW}WARNING:${NC} $1${NC}"
}
echo_warning() {
echo "${BOLD}${YELLOW}WARNING:${NC}${BRIGHT_YELLOW} $1${NC}"
echo "${BOLD}${YELLOW}WARNING:${NC} $1${NC}"
}
echo-note() {
echo "${BOLD}${GREEN}NOTE:${NC} $1${NC}"
}
echo_note() {
echo "${BOLD}${GREEN}NOTE:${NC}${BRIGHT_GREEN} $1${NC}"
echo "${BOLD}${GREEN}NOTE:${NC} $1${NC}"
}
# ─< Check if the given command exists silently >─────────────────────────────────────────
command_exists() {
command -v "$@" >/dev/null 2>&1
}
command-exists() {
command -v "$@" >/dev/null 2>&1
}
silentexec() {
"$@" >/dev/null 2>&1
}
source_script() {
local url="$1"
local import="$(mktemp)"
# ─< if $1 is a local file, source this one instead >─────────────────────────────────────
if [ -f "$url" ]; then
source "$url"
sleep 0.1
return 0
else
# ─< if $1 is a url, grab it and source it, also deletes afterwards >─────────────────────
if command_exists curl; then
curl -fsSL $url -o $import
elif command_exists wget; then
wget -o $import $url
else
echo "curl/wget is required, but missing.."
exit 69
fi
source "$import"
echo "${BLUE}Sourcing external script:${NC} $url"
sleep 0.1
rm -f "$import"
fi
}
# just an alias for source_script
source-script() {
source_script "$1"
}
run-silent() {
[[ -z $silent ]] &&
"$@" ||
# else
if $silent; then
silentexec "$@"
else
"$@"
fi
# fi
if [[ -z $silent ]] || ! $silent; then
"$@"
else
silentexec "$@"
fi
}
# if given an array, it checks if the command is available, and if not - installs all packages in that array one by one
checkAndInstall() {
local pkg=$1
# echo "DEBUG:: GOT ARRAY :: ${@}"
# ─< if it's not a list, then just check and install the package.. >──────────────────────
# INFO: if it's not a list, then just check and install the package..
if [[ -z $2 ]]; then
if ! command_exists "$1"; then
if run-silent pkg-install "$1"; then
echo_pkg deps "$1 - ${GREEN}installed"
if ! command_exists "$pkg"; then
echo_pkg deps "Installing $pkg"
if run-silent pkg-install "$pkg"; then
echo_pkg deps "Installed $pkg"
else
echo_pkg deps "$1 is already installed.."
echo_pkg deps "$pkg is already installed.."
fi
else
echo_pkg deps "skipping $1 - as it's ${RED}already installed.."
echo_pkg deps "skipping $pkg - as it's ${RED}already installed.."
fi
else
# ─< else go though the list of items and do the same >───────────────────────────────────
@ -220,7 +204,6 @@ check_env() {
_sudo=""
fi
pikaCheckFile="$HOME/.cache/pika_script_detection"
checkFileAge() {
local file="$1"
[[ ! -e "$file" ]] && return 2 # File doesn't exist
@ -232,6 +215,8 @@ check_env() {
fi
}
pikaCheckFile="$HOME/.cache/pika_script_detection"
if [ -f "$pikaCheckFile" ]; then
if checkFileAge $pikaCheckFile; then
PIKA_INIT=true
@ -478,6 +463,7 @@ get_packager() {
dist_setup() {
case "$distro" in
debian)
echo "${BOLD}Found ${RED}debian${NC}"
_setup debian
# Codename support
if [ -n $VERSION_CODENAME ]; then
@ -490,6 +476,7 @@ dist_setup() {
fi
;;
ubuntu)
echo "${BOLD}Found ${BRIGHT_YELLOW}ubuntu${NC}"
_setup ubuntu
# Codename support
if [ -n $VERSION_CODENAME ]; then
@ -502,12 +489,14 @@ dist_setup() {
fi
;;
fedora)
echo "${BOLD}Found ${BRIGHT_BLUE}fedora${NC}"
_setup fedora
# Add version-specific var like: fedora_40=true
fedora_version="fedora_${VERSION_ID//./_}"
eval "$fedora_version=true"
;;
arch)
echo "${BOLD}Found ${BLUE}arch${NC}"
_setup arch
if command_exists yay || command_exists paru; then
aur=true
@ -515,16 +504,20 @@ dist_setup() {
aur=false
fi
;;
alpine | opensuse)
alpine)
echo "${BOLD}Found ${BLUE}alpine${NC}"
_setup $distro
;;
opensuse)
echo "${BOLD}Found ${GREEN}opensuse${NC}"
_setup $distro
;;
# opensuse)
# _setup opensuse
# ;;
esac
}
update_package_list() {
local USER="${USER:-$(whoami)}"
echo_info "Refreshing repository sources.."
case "$distro" in
ubuntu | debian) run-silent $_sudo apt-get update ;;
@ -533,21 +526,31 @@ update_package_list() {
if command_exists pacman; then
if ! checkAUR; then
local paruBuildDir="/opt/builds"
local USER="$(whoami)"
$_sudo mkdir -p "$paruBuildDir"
# if ! command_exists paru; then
echo "${YELLOW}Installing paru as AUR helper...${NC}"
run-silent $_sudo pacman -S --needed --noconfirm base-devel git
cd "$paruBuildDir" && $_sudo git clone https://aur.archlinux.org/paru-bin.git paru
$_sudo pacman -S --needed --noconfirm base-devel git
cd "$paruBuildDir" && echo "${YELLOW} Cloning paru from ${NC}https://aur.archlinux.org/paru-bin.git"
$_sudo git clone https://aur.archlinux.org/paru-bin.git paru
$_sudo chown -R "$USER": "$paruBuildDir/paru"
cd "$paruBuildDir/paru" && makepkg --noconfirm -si
echo "${GREEN}Paru installed${NC}"
# else
# printf "%b\n" "${GREEN}Paru already installed${RC}"
# fi
cd "$paruBuildDir/paru"
echo "${GREEN}${BOLD}Installing paru"
makepkg --noconfirm -si
sleep 1
if command_exists paru; then
echo "${GREEN}Paru installed${NC}"
else
echo "${RED}${BOLD}Error: Something went wrong when installing paru!"
fi
fi
fi
sleep 0.01
if command_exists paru; then
run-silent paru -Sy
elif command_exists yay; then
@ -571,17 +574,16 @@ if check_env; then
# WHY:
# ╭─────────────────────────────────────────────────────────────────────────╮
# │ check if the script has run-silent at least once, so that the sources dont │
# │ check if the script has run at least once, so that the sources dont │
# │ have to get updated again.. │
# ╰─────────────────────────────────────────────────────────────────────────╯
if [[ -z "$PIKA_INIT" ]]; then
echo_pkg "First time being imported.."
echo_pkg "First time importing.."
if update_package_list; then
touch "$pikaCheckFile"
silentexec touch "$pikaCheckFile"
fi
else
echo_pkg "Skipping repo refresh (PIKA_INIT is already set)"
echo_pkg "Skipping repo refresh"
fi
fi

View file

@ -95,6 +95,7 @@ echo_pkg() {
fi
}
# alias for echo_pkg
echo-pkg() {
echo_pkg "$@"
}
@ -126,7 +127,7 @@ check-and-install() {
# INFO: if it's not a list, then just check and install the package..
if [[ -z $2 ]]; then
spin bold yellow "Installing $pkg"
if ! command_exists "$pkg"; then
if ! command-exists "$pkg"; then
if run pkg-install "$pkg"; then
check "Installed $pkg"
else
@ -141,7 +142,7 @@ check-and-install() {
# ─< else go though the list of items and do the same >───────────────────────────────────
pen grey "Packages to install: $(pen green bold $pkgs)"
for pkg in "$@"; do
if ! command_exists $pkg; then
if ! command-exists $pkg; then
spin bold "$(pen bold yellow Installing) $pkg"
if run --err err pkg-install $pkg; then
check "$(pen bold green Installed) $pkg"
@ -159,8 +160,10 @@ check-and-install() {
# ─< Check if the user is root and set sudo variable if necessary >───────────────────────
check_env() {
if [ "$(id -u)" -ne 0 ]; then
if command_exists sudo; then
if command-exists sudo; then
_sudo="sudo -E"
pen blue "Testing your access.."
$_sudo echo "${GREEN}${BOLD}Aye, it works!${NC}"
else
echo-error "No sudo found and you're not root! Can't install packages."
return 69
@ -180,31 +183,19 @@ check_env() {
return 0 # File is within 1 week
fi
}
pikaCheckFile="$HOME/.cache/pika_script_detection"
if [ -f "$pikaCheckFile" ]; then
if checkFileAge $pikaCheckFile; then
PIKA_INIT=true
else
unset PIKA_INIT
fi
else
unset PIKA_INIT
fi
}
# CAUTION:
# ╭─────────────────────────────────────────────────────────────────────
# │ This can break really quickly, since the pkg-remove() function removes │
# │ without confirmation! use with CAUTION!!
# ╰─────────────────────────────────────────────────────────────────────
# ╭──────────────────────────────────────────────────────────────────────╮
# │ This can break really quickly, since the pkg-remove function removes │
# │ without confirmation! use with CAUTION!! │
# ╰──────────────────────────────────────────────────────────────────────╯
_setup() {
case "$1" in
debian | ubuntu)
pkg-install() {
# $_sudo apt-get install --assume-yes "$@"
if command_exists nala; then
if command-exists nala; then
pkger=nala
$_sudo nala install --assume-yes "$@"
else
@ -215,7 +206,7 @@ _setup() {
# CAUTION:
pkg-remove() {
if command_exists nala; then
if command-exists nala; then
pkger=nala
$_sudo nala remove --assume-yes "$@"
$_sudo nala autoremove --assume-yes
@ -241,7 +232,7 @@ _setup() {
;;
arch)
checkAUR() {
if ! command_exists yay && ! command_exists paru; then
if ! command-exists yay && ! command_exists paru; then
return 69
else
return 0
@ -249,10 +240,10 @@ _setup() {
}
pkg-install() {
if command_exists paru; then
if command-exists paru; then
pkger=paru
paru -S --color always --noconfirm --needed "$@"
elif command_exists yay; then
elif command-exists yay; then
pkger=yay
yay -S --color always --noconfirm --needed "$@"
else
@ -263,10 +254,10 @@ _setup() {
# CAUTION:
pkg-remove() {
if command_exists paru; then
if command-exists paru; then
pkger=paru
paru -R --color always --noconfirm "$@"
elif command_exists yay; then
elif command-exists yay; then
pkger=yay
yay -R --color always --noconfirm "$@"
else
@ -306,15 +297,13 @@ _setup() {
get_packager() {
# ─< define fallback function >───────────────────────────────────────────────────────────
fallback() {
# ─────────────────────────────────────< get packager >─────────────────────────────────────
local pkger=""
for pkg in apt-get dnf pacman apk zypper; do
if command_exists $pkg; then
if command-exists $pkg; then
printf "Using ${RED}${pkg}${NC} method.."
pkger="$pkg"
# break
return 0
break
fi
done
@ -459,7 +448,7 @@ dist_setup() {
arch)
echo "${BOLD}Found ${BLUE}arch${NC}"
_setup arch
if command_exists yay || command_exists paru; then
if command-exists yay || command_exists paru; then
aur=true
else
aur=false
@ -493,7 +482,7 @@ update-package-list() {
run $_sudo dnf update || repo::check
;;
arch)
if command_exists pacman; then
if command-exists pacman; then
if ! checkAUR; then
pen grey bold "If this is your first time after boot (or simmilarly soon) then this might take a while.."
spin bold grey "You don't have an AUR helper, gonna install one for ya!"
@ -519,7 +508,7 @@ update-package-list() {
echo-error "${err:-}"
fi
if command_exists paru; then
if command-exists paru; then
pen green bold "Paru is installed"
else
echo-error "Something went wrong when installing paru!"
@ -530,9 +519,9 @@ update-package-list() {
spin blue bold "Refreshing $distro repositories.."
sleep 0.01
if command_exists paru; then
if command-exists paru; then
run paru -Sy || repo::check
elif command_exists yay; then
elif command-exists yay; then
run yay -Sy || repo::check
else
run $_sudo pacman -Sy || repo::check
@ -697,6 +686,7 @@ spin() {
pen -n cyan "${spinner:0:1} "
pen "${message[@]}"
while true; do
line
for ((i = 0; i < ${#spinner}; i++)); do
frame="${spinner:$i:1}"
up
@ -903,7 +893,9 @@ if check_env; then
# │ check if the script has run at least once, so that the sources dont │
# │ have to get updated again.. │
# ╰─────────────────────────────────────────────────────────────────────────╯
if [[ -z "$PIKA_INIT" ]]; then
pikaCheckFile="$HOME/.cache/pika_script_detection"
if [ ! -f "$pikaCheckFile" ]; then
pen bold grey "First time importing.."
if update-package-list; then

351
test.sh
View file

@ -1,221 +1,144 @@
#!/usr/bin/env bash
{
#!/usr/bin/env bash
PACKAGE=postinstallation
# ─< Check if the given command exists silently >─────────────────────────────────────────
command_exists() {
command -v "$@" >/dev/null 2>&1
}
# ─< Check if the given command exists silently >─────────────────────────────────────────
command_exists() {
command -v "$@" >/dev/null 2>&1
}
# run() {
# if $silent; then
# # silentexec "$@" &
# spin "Installing packages" &
# silentexec "$@"
# else
# "$@"
# fi
# }
# if command_exists "$PACKAGE"; then
# echo_warning "$PACKAGE is already installed!"
# echo_warning "Exiting now!"
# exit 69
# fi
# WHY:
# This import will give you the following variables:
# _sudo="sudo -E" <- only if non root user
# distro = <distro name, like 'arch', 'debian', 'fedora'..>
# arch = bool
# fedora = bool
# opensuse = bool....
# You can then use it for, `if $arch; then`
# Also this gives you the _install and _remove command, which installs/removes a package pased on the packagemanager/distro used.
# CAUTION:
# This only works for generic package names, like neovim, or vim, or tmux etc..
# not every package packagemanager has the same packagenames for their packages..
getImports() {
local url="https://git.k4li.de/scripts/imports/raw/branch/main/distros.sh"
local import="$(mktemp)"
if command_exists curl; then
curl -fsSL $url -o $import
elif command_exists wget; then
wget -o $import $url
else
echo "curl/wget is required, but missing.."
exit 69
fi
source "$import"
sleep 0.2
rm "$import"
}
getDependencies() {
echo_info "Checking build dependencies.."
# INFO:
# ╭─────────────────────────────────────────────────────────────────────────╮
# │ You can define dependencies for various linux distros here. It will │
# │ automagically be pulled via the $pkgArray[$distro] variable │
# ╰─────────────────────────────────────────────────────────────────────────╯
generalDeps=(
"awk"
"7zip"
"bc"
"btop"
"curl"
"fzf"
"gawk"
"git"
"keychain"
"make"
"pv"
"ripgrep"
"rsync"
"stow"
"sudo"
"unzip"
"vi"
"zsh"
"zoxide"
)
generalBloat=(
"nano"
)
depsDebian=(
"eza"
)
depsFedora=()
depsOpensuse=()
depsArch=(
"tldr"
"oh-my-posh"
"eza"
"ytui-bin"
)
depsAlpine=()
declare -A deps=(
[debian]="depsDebian"
[ubuntu]="depsUbuntu"
[fedora]="depsFedora"
[arch]="depsArch"
[alpine]="depsAlpine"
[opensuse]="depsOpensuse"
)
# INFO:
# ╭────────────────────────────────────────────────────────────────╮
# │ This variable stores the packages you provided for each distro │
# ╰────────────────────────────────────────────────────────────────╯
declare -n pkgArray="${deps[$distro]}"
case "$distro" in
debian | ubuntu | arch | fedora | alpine | opensuse)
echo_info "Installing base packages.."
checkAndInstall "${generalDeps[@]}"
checkAndInstall "${pkgArray[@]}"
;;
*)
echo_error "There are no dependencies to install for $distro"
return 69
;;
esac
}
removeBloat() {
if ! $arch; then
echo_info "Removing bloat.."
_remove "${generalBloat[@]}"
fi
}
_nala() {
if command_exists nala; then
echo_info "Nala is already present, fetching mirros now!"
echo_warning "(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 </dev/tty
case "$inst_nala" in
N | n)
echo_warning "All right, continue without nala!"
;;
*)
echo_note "Installing nala.."
$_sudo apt install nala --assume-yes &&
echo_info "Fetching best mirrors"
$_sudo nala fetch --auto --assume-yes --https-only
;;
esac
fi
}
main() {
if $silent; then
echo_warning "Executing script silently!"
fi
# Getting general dependencies
if ! getDependencies; then
echo_error "Error when installing dependencies.."
fi
# removing 'bloat'
if ! removeBloat; then
echo_error "Error when removing bloat.."
fi
case "$distro" in
debian)
# Path to sources.list
sources_file="/etc/apt/sources.list"
# Check if file exists
if [ -f "$sources_file" ]; then
# 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"
# WHY:
# This import will give you the following variables:
# _sudo="sudo -E" <- only if non root user
# distro = <distro name, like 'arch', 'debian', 'fedora'..>
# arch = bool
# fedora = bool
# opensuse = bool....
# You can then use it for, `if $arch; then`
# Also this gives you the _install command, which installs a package pased on the packagemanager/distro used.
# CAUTION:
# This only wokrs for generic package names, like neovim, or vim, or tmux etc..
# not every package packagemanager has the same packagenames for their packages..
getImports() {
local url="$1"
local import="$(mktemp)"
if command_exists curl; then
curl -fsSL $url -o $import
elif command_exists wget; then
wget -o $import $url
else
if [ ! -f "/etc/apt/sources.d/sources.list" ]; then
echo_error "Error: $sources_file not found"
fi
echo "curl/wget is required, but missing.."
exit 69
fi
_nala
;;
esac
. "$import"
sleep 0.1
rm -f "$import"
}
ask-stuff() {
choose multiplexer "Select a multiplexer" tmux zellij </dev/tty
choose menu "Select a menu package" rofi wofi tofi </dev/tty
choose shell "Select a shell" zsh bash fish nushell </dev/tty
}
install-stuff() {
arr=(
firefox-bin
blender-bin
$package
)
# case "$distro" in
# arch)
# $_sudo pacman -Syu
# ;;
# esac
check-and-install ${arr[@]}
if confirm "Do you want to remove the previous installed packages?"; then
for pkg in "${arr[@]}"; do
pkg-remove $pkg
done
fi
}
func1() {
spin yellow "installing stuff"
# if run install-stuff; then
if run --err err --out out git clone --depth=1 https://github.com/neovim/neovim.git; then
check "Installation complete"
line
pen "${out:-}"
else
throw "Installation failed!"
pen "${err:-}"
fi
}
func2() {
# run --err install-stuff
if [ -d ./neovim ]; then
if confirm "$(pen bold blue 'Do you want to remove the cloned ./neovim directory?')" </dev/tty; then
rm -rf ./neovim/
else
pen red bold "Did not remove the neovim directory!"
fi
fi
}
func3() {
local err
arr=(
firefox-esr
)
if $arch; then
spin blue "Installing.."
if run --err err checkAndInstall "${arr[@]}"; then
check "Installed $(pen red ${arr[*]})"
else
throw "Something went wrong installing ${arr[*]}.."
throw "${err:-}"
fi
fi
}
main() {
# if $silent; then
# echo_warning "Executing script silently!"
# fi
# func1
# func2
# func3
# if ask-stuff; then
choose package "What packages should also get installed? space separated list.."
if confirm "Do you want to 'install-stuff'?"; then
install-stuff
fi
# fi
# while install-stuff && break; do
# spin "Installing packages.."
# done
}
dream="https://git.k4li.de/scripts/imports/raw/branch/main/dream.sh"
if getImports "$dream"; then
main
fi
# fi
}
# checkAUR() {
# if ! command_exists yay && ! command_exists paru; then
# return 69
# else
# return 0
# fi
# }
#
# if command_exists pacman; then
# if ! checkAUR; then
# paruTempDir="$(mktemp -d)"
# # if ! command_exists paru; then
# echo "${YELLOW}Installing paru as AUR helper...${NC}"
# $_sudo pacman -S --needed --noconfirm base-devel git
# cd /opt && $_sudo git clone https://aur.archlinux.org/paru-bin.git "$paruTempDir/paru" && $_sudo chown -R "$USER": "$paruTempDir/paru"
# cd "$paruTempDir/paru" && makepkg --noconfirm -si
# echo "${GREEN}Paru installed${NC}"
# # else
# # printf "%b\n" "${GREEN}Paru already installed${RC}"
# # fi
# fi
# fi
if getImports; then
# ─< package variable >───────────────────────────────────────────────────────────────────
unset PACKAGE
# ─< argument list variables >────────────────────────────────────────────────────────────
silent=false
PACKAGE=postinstallation
main
fi