Compare commits
14 Commits
4f615233c7
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 322cd72cc6 | |||
| 3c1fc38fae | |||
| fca58a98c7 | |||
| b593617163 | |||
| 84522b8b8a | |||
| 79a66c0d4b | |||
| 3a4845d999 | |||
| 09ff03a527 | |||
| c361a8bd12 | |||
| 2a13d31a94 | |||
| edb22899e6 | |||
| 26c7b549d7 | |||
| de695092c0 | |||
| cea2204433 |
@@ -0,0 +1,633 @@
|
||||
#!/usr/bin/env bash
|
||||
iatest=$(expr index "$-" i)
|
||||
#######################################################
|
||||
# SOURCED ALIAS'S AND SCRIPTS BY zachbrowne.me
|
||||
#######################################################
|
||||
if [ -f /usr/bin/fastfetch ]; then
|
||||
fastfetch
|
||||
fi
|
||||
|
||||
# Source global definitions
|
||||
if [ -f /etc/bashrc ]; then
|
||||
. /etc/bashrc
|
||||
fi
|
||||
|
||||
# Enable bash programmable completion features in interactive shells
|
||||
if [ -f /usr/share/bash-completion/bash_completion ]; then
|
||||
. /usr/share/bash-completion/bash_completion
|
||||
elif [ -f /etc/bash_completion ]; then
|
||||
. /etc/bash_completion
|
||||
fi
|
||||
|
||||
#######################################################
|
||||
# EXPORTS
|
||||
#######################################################
|
||||
|
||||
# Disable the bell
|
||||
if [[ $iatest -gt 0 ]]; then bind "set bell-style visible"; fi
|
||||
|
||||
# Expand the history size
|
||||
export HISTFILESIZE=10000
|
||||
export HISTSIZE=500
|
||||
export HISTTIMEFORMAT="%F %T" # add timestamp to history
|
||||
|
||||
# Don't put duplicate lines in the history and do not add lines that start with a space
|
||||
export HISTCONTROL=erasedups:ignoredups:ignorespace
|
||||
|
||||
# Check the window size after each command and, if necessary, update the values of LINES and COLUMNS
|
||||
shopt -s checkwinsize
|
||||
|
||||
# Causes bash to append to history instead of overwriting it so if you start a new terminal, you have old session history
|
||||
shopt -s histappend
|
||||
PROMPT_COMMAND='history -a'
|
||||
|
||||
# set up XDG folders
|
||||
export XDG_DATA_HOME="$HOME/.local/share"
|
||||
export XDG_CONFIG_HOME="$HOME/.config"
|
||||
export XDG_STATE_HOME="$HOME/.local/state"
|
||||
export XDG_CACHE_HOME="$HOME/.cache"
|
||||
|
||||
# Seeing as other scripts will use it might as well export it
|
||||
export LINUXTOOLBOXDIR="$HOME/linuxtoolbox"
|
||||
|
||||
# Allow ctrl-S for history navigation (with ctrl-R)
|
||||
[[ $- == *i* ]] && stty -ixon
|
||||
|
||||
# Ignore case on auto-completion
|
||||
# Note: bind used instead of sticking these in .inputrc
|
||||
if [[ $iatest -gt 0 ]]; then bind "set completion-ignore-case on"; fi
|
||||
|
||||
# Show auto-completion list automatically, without double tab
|
||||
if [[ $iatest -gt 0 ]]; then bind "set show-all-if-ambiguous On"; fi
|
||||
|
||||
# Set the default editor
|
||||
export EDITOR=nvim
|
||||
export VISUAL=nvim
|
||||
alias spico='sudo pico'
|
||||
alias snano='sudo nano'
|
||||
alias vim='nvim'
|
||||
|
||||
# To have colors for ls and all grep commands such as grep, egrep and zgrep
|
||||
export CLICOLOR=1
|
||||
export LS_COLORS='no=00:fi=00:di=00;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.ogg=01;35:*.mp3=01;35:*.wav=01;35:*.xml=00;31:'
|
||||
#export GREP_OPTIONS='--color=auto' #deprecated
|
||||
|
||||
# Check if ripgrep is installed
|
||||
if command -v rg &> /dev/null; then
|
||||
# Alias grep to rg if ripgrep is installed
|
||||
alias grep='rg'
|
||||
else
|
||||
# Alias grep to /usr/bin/grep with GREP_OPTIONS if ripgrep is not installed
|
||||
alias grep="/usr/bin/grep $GREP_OPTIONS"
|
||||
fi
|
||||
unset GREP_OPTIONS
|
||||
|
||||
# Color for manpages in less makes manpages a little easier to read
|
||||
export LESS_TERMCAP_mb=$'\E[01;31m'
|
||||
export LESS_TERMCAP_md=$'\E[01;31m'
|
||||
export LESS_TERMCAP_me=$'\E[0m'
|
||||
export LESS_TERMCAP_se=$'\E[0m'
|
||||
export LESS_TERMCAP_so=$'\E[01;44;33m'
|
||||
export LESS_TERMCAP_ue=$'\E[0m'
|
||||
export LESS_TERMCAP_us=$'\E[01;32m'
|
||||
|
||||
#######################################################
|
||||
# MACHINE SPECIFIC ALIAS'S
|
||||
#######################################################
|
||||
|
||||
# Alias's for SSH
|
||||
# alias SERVERNAME='ssh YOURWEBSITE.com -l USERNAME -p PORTNUMBERHERE'
|
||||
|
||||
# Alias's to change the directory
|
||||
alias web='cd /var/www/html'
|
||||
|
||||
# Alias's to mount ISO files
|
||||
# mount -o loop /home/NAMEOFISO.iso /home/ISOMOUNTDIR/
|
||||
# umount /home/NAMEOFISO.iso
|
||||
# (Both commands done as root only.)
|
||||
|
||||
#######################################################
|
||||
# GENERAL ALIAS'S
|
||||
#######################################################
|
||||
# To temporarily bypass an alias, we precede the command with a \
|
||||
# EG: the ls command is aliased, but to use the normal ls command you would type \ls
|
||||
|
||||
# Add an "alert" alias for long running commands. Use like so:
|
||||
# sleep 10; alert
|
||||
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
|
||||
|
||||
# Edit this .bashrc file
|
||||
alias ebrc='edit ~/.bashrc'
|
||||
|
||||
# Show help for this .bashrc file
|
||||
alias hlp='less ~/.bashrc_help'
|
||||
|
||||
# alias to show the date
|
||||
alias da='date "+%Y-%m-%d %A %T %Z"'
|
||||
|
||||
# Alias's to modified commands
|
||||
alias cp='cp -i'
|
||||
alias mv='mv -i'
|
||||
alias rm='trash -v'
|
||||
alias mkdir='mkdir -p'
|
||||
alias ps='ps auxf'
|
||||
alias ping='ping -c 10'
|
||||
alias less='less -R'
|
||||
alias cls='clear'
|
||||
alias apt-get='sudo apt-get'
|
||||
alias multitail='multitail --no-repeat -c'
|
||||
alias freshclam='sudo freshclam'
|
||||
alias vi='nvim'
|
||||
alias svi='sudo vi'
|
||||
alias vis='nvim "+set si"'
|
||||
alias yayf="yay -Slq | fzf --multi --preview 'yay -Sii {1}' --preview-window=down:75% | xargs -ro yay -S"
|
||||
|
||||
# Change directory aliases
|
||||
alias home='cd ~'
|
||||
alias cd..='cd ..'
|
||||
alias ..='cd ..'
|
||||
alias ...='cd ../..'
|
||||
alias ....='cd ../../..'
|
||||
alias .....='cd ../../../..'
|
||||
|
||||
# cd into the old directory
|
||||
alias bd='cd "$OLDPWD"'
|
||||
|
||||
# Remove a directory and all files
|
||||
alias rmd='/bin/rm --recursive --force --verbose '
|
||||
|
||||
# Alias's for multiple directory listing commands
|
||||
alias la='ls -Alh' # show hidden files
|
||||
alias ls='ls -aFh --color=always' # add colors and file type extensions
|
||||
alias lx='ls -lXBh' # sort by extension
|
||||
alias lk='ls -lSrh' # sort by size
|
||||
alias lc='ls -ltcrh' # sort by change time
|
||||
alias lu='ls -lturh' # sort by access time
|
||||
alias lr='ls -lRh' # recursive ls
|
||||
alias lt='ls -ltrh' # sort by date
|
||||
alias lm='ls -alh |more' # pipe through 'more'
|
||||
alias lw='ls -xAh' # wide listing format
|
||||
alias ll='ls -Fls' # long listing format
|
||||
alias labc='ls -lap' # alphabetical sort
|
||||
alias lf="ls -l | egrep -v '^d'" # files only
|
||||
alias ldir="ls -l | egrep '^d'" # directories only
|
||||
alias lla='ls -Al' # List and Hidden Files
|
||||
alias las='ls -A' # Hidden Files
|
||||
alias lls='ls -l' # List
|
||||
|
||||
# alias chmod commands
|
||||
alias mx='chmod a+x'
|
||||
alias 000='chmod -R 000'
|
||||
alias 644='chmod -R 644'
|
||||
alias 666='chmod -R 666'
|
||||
alias 755='chmod -R 755'
|
||||
alias 777='chmod -R 777'
|
||||
|
||||
# Search command line history
|
||||
alias h="history | grep "
|
||||
|
||||
# Search running processes
|
||||
alias p="ps aux | grep "
|
||||
alias topcpu="/bin/ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10"
|
||||
|
||||
# Search files in the current folder
|
||||
alias f="find . | grep "
|
||||
|
||||
# Count all files (recursively) in the current folder
|
||||
alias countfiles="for t in files links directories; do echo \`find . -type \${t:0:1} | wc -l\` \$t; done 2> /dev/null"
|
||||
|
||||
# To see if a command is aliased, a file, or a built-in command
|
||||
alias checkcommand="type -t"
|
||||
|
||||
# Show open ports
|
||||
alias openports='netstat -nape --inet'
|
||||
|
||||
# Alias's for safe and forced reboots
|
||||
alias rebootsafe='sudo shutdown -r now'
|
||||
alias rebootforce='sudo shutdown -r -n now'
|
||||
|
||||
# Alias's to show disk space and space used in a folder
|
||||
alias diskspace="du -S | sort -n -r |more"
|
||||
alias folders='du -h --max-depth=1'
|
||||
alias folderssort='find . -maxdepth 1 -type d -print0 | xargs -0 du -sk | sort -rn'
|
||||
alias tree='tree -CAhF --dirsfirst'
|
||||
alias treed='tree -CAFd'
|
||||
alias mountedinfo='df -hT'
|
||||
|
||||
# Alias's for archives
|
||||
alias mktar='tar -cvf'
|
||||
alias mkbz2='tar -cvjf'
|
||||
alias mkgz='tar -cvzf'
|
||||
alias untar='tar -xvf'
|
||||
alias unbz2='tar -xvjf'
|
||||
alias ungz='tar -xvzf'
|
||||
|
||||
# Show all logs in /var/log
|
||||
alias logs="sudo find /var/log -type f -exec file {} \; | grep 'text' | cut -d' ' -f1 | sed -e's/:$//g' | grep -v '[0-9]$' | xargs tail -f"
|
||||
|
||||
# SHA1
|
||||
alias sha1='openssl sha1'
|
||||
|
||||
alias clickpaste='sleep 3; xdotool type "$(xclip -o -selection clipboard)"'
|
||||
|
||||
# KITTY - alias to be able to use kitty features when connecting to remote servers(e.g use tmux on remote server)
|
||||
|
||||
alias kssh="kitty +kitten ssh"
|
||||
|
||||
# alias to cleanup unused docker containers, images, networks, and volumes
|
||||
|
||||
alias docker-clean=' \
|
||||
docker container prune -f ; \
|
||||
docker image prune -f ; \
|
||||
docker network prune -f ; \
|
||||
docker volume prune -f '
|
||||
|
||||
#######################################################
|
||||
# SPECIAL FUNCTIONS
|
||||
#######################################################
|
||||
# Extracts any archive(s) (if unp isn't installed)
|
||||
extract() {
|
||||
for archive in "$@"; do
|
||||
if [ -f "$archive" ]; then
|
||||
case $archive in
|
||||
*.tar.bz2) tar xvjf $archive ;;
|
||||
*.tar.gz) tar xvzf $archive ;;
|
||||
*.bz2) bunzip2 $archive ;;
|
||||
*.rar) rar x $archive ;;
|
||||
*.gz) gunzip $archive ;;
|
||||
*.tar) tar xvf $archive ;;
|
||||
*.tbz2) tar xvjf $archive ;;
|
||||
*.tgz) tar xvzf $archive ;;
|
||||
*.zip) unzip $archive ;;
|
||||
*.Z) uncompress $archive ;;
|
||||
*.7z) 7z x $archive ;;
|
||||
*) echo "don't know how to extract '$archive'..." ;;
|
||||
esac
|
||||
else
|
||||
echo "'$archive' is not a valid file!"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Searches for text in all files in the current folder
|
||||
ftext() {
|
||||
# -i case-insensitive
|
||||
# -I ignore binary files
|
||||
# -H causes filename to be printed
|
||||
# -r recursive search
|
||||
# -n causes line number to be printed
|
||||
# optional: -F treat search term as a literal, not a regular expression
|
||||
# optional: -l only print filenames and not the matching lines ex. grep -irl "$1" *
|
||||
grep -iIHrn --color=always "$1" . | less -r
|
||||
}
|
||||
|
||||
# Copy file with a progress bar
|
||||
cpp() {
|
||||
set -e
|
||||
strace -q -ewrite cp -- "${1}" "${2}" 2>&1 |
|
||||
awk '{
|
||||
count += $NF
|
||||
if (count % 10 == 0) {
|
||||
percent = count / total_size * 100
|
||||
printf "%3d%% [", percent
|
||||
for (i=0;i<=percent;i++)
|
||||
printf "="
|
||||
printf ">"
|
||||
for (i=percent;i<100;i++)
|
||||
printf " "
|
||||
printf "]\r"
|
||||
}
|
||||
}
|
||||
END { print "" }' total_size="$(stat -c '%s' "${1}")" count=0
|
||||
}
|
||||
|
||||
# Copy and go to the directory
|
||||
cpg() {
|
||||
if [ -d "$2" ]; then
|
||||
cp "$1" "$2" && cd "$2"
|
||||
else
|
||||
cp "$1" "$2"
|
||||
fi
|
||||
}
|
||||
|
||||
# Move and go to the directory
|
||||
mvg() {
|
||||
if [ -d "$2" ]; then
|
||||
mv "$1" "$2" && cd "$2"
|
||||
else
|
||||
mv "$1" "$2"
|
||||
fi
|
||||
}
|
||||
|
||||
# Create and go to the directory
|
||||
mkdirg() {
|
||||
mkdir -p "$1"
|
||||
cd "$1"
|
||||
}
|
||||
|
||||
# Goes up a specified number of directories (i.e. up 4)
|
||||
up() {
|
||||
local d=""
|
||||
limit=$1
|
||||
for ((i = 1; i <= limit; i++)); do
|
||||
d=$d/..
|
||||
done
|
||||
d=$(echo $d | sed 's/^\///')
|
||||
if [ -z "$d" ]; then
|
||||
d=..
|
||||
fi
|
||||
cd $d
|
||||
}
|
||||
|
||||
# Automatically do an ls after each cd, z, or zoxide
|
||||
cd ()
|
||||
{
|
||||
if [ -n "$1" ]; then
|
||||
builtin cd "$@" && ls
|
||||
else
|
||||
builtin cd ~ && ls
|
||||
fi
|
||||
}
|
||||
|
||||
# Returns the last 2 fields of the working directory
|
||||
pwdtail() {
|
||||
pwd | awk -F/ '{nlast = NF -1;print $nlast"/"$NF}'
|
||||
}
|
||||
|
||||
# Show the current distribution
|
||||
distribution () {
|
||||
local dtype="unknown" # Default to unknown
|
||||
|
||||
# Use /etc/os-release for modern distro identification
|
||||
if [ -r /etc/os-release ]; then
|
||||
source /etc/os-release
|
||||
case $ID in
|
||||
fedora|rhel|centos)
|
||||
dtype="redhat"
|
||||
;;
|
||||
sles|opensuse*)
|
||||
dtype="suse"
|
||||
;;
|
||||
ubuntu|debian)
|
||||
dtype="debian"
|
||||
;;
|
||||
gentoo)
|
||||
dtype="gentoo"
|
||||
;;
|
||||
arch|manjaro)
|
||||
dtype="arch"
|
||||
;;
|
||||
slackware)
|
||||
dtype="slackware"
|
||||
;;
|
||||
*)
|
||||
# Check ID_LIKE only if dtype is still unknown
|
||||
if [ -n "$ID_LIKE" ]; then
|
||||
case $ID_LIKE in
|
||||
*fedora*|*rhel*|*centos*)
|
||||
dtype="redhat"
|
||||
;;
|
||||
*sles*|*opensuse*)
|
||||
dtype="suse"
|
||||
;;
|
||||
*ubuntu*|*debian*)
|
||||
dtype="debian"
|
||||
;;
|
||||
*gentoo*)
|
||||
dtype="gentoo"
|
||||
;;
|
||||
*arch*)
|
||||
dtype="arch"
|
||||
;;
|
||||
*slackware*)
|
||||
dtype="slackware"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# If ID or ID_LIKE is not recognized, keep dtype as unknown
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo $dtype
|
||||
}
|
||||
|
||||
|
||||
DISTRIBUTION=$(distribution)
|
||||
if [ "$DISTRIBUTION" = "redhat" ] || [ "$DISTRIBUTION" = "arch" ]; then
|
||||
alias cat='bat'
|
||||
else
|
||||
alias cat='batcat'
|
||||
fi
|
||||
|
||||
# Show the current version of the operating system
|
||||
ver() {
|
||||
local dtype
|
||||
dtype=$(distribution)
|
||||
|
||||
case $dtype in
|
||||
"redhat")
|
||||
if [ -s /etc/redhat-release ]; then
|
||||
cat /etc/redhat-release
|
||||
else
|
||||
cat /etc/issue
|
||||
fi
|
||||
uname -a
|
||||
;;
|
||||
"suse")
|
||||
cat /etc/SuSE-release
|
||||
;;
|
||||
"debian")
|
||||
lsb_release -a
|
||||
;;
|
||||
"gentoo")
|
||||
cat /etc/gentoo-release
|
||||
;;
|
||||
"arch")
|
||||
cat /etc/os-release
|
||||
;;
|
||||
"slackware")
|
||||
cat /etc/slackware-version
|
||||
;;
|
||||
*)
|
||||
if [ -s /etc/issue ]; then
|
||||
cat /etc/issue
|
||||
else
|
||||
echo "Error: Unknown distribution"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Automatically install the needed support files for this .bashrc file
|
||||
install_bashrc_support() {
|
||||
local dtype
|
||||
dtype=$(distribution)
|
||||
|
||||
case $dtype in
|
||||
"redhat")
|
||||
sudo yum install multitail tree zoxide trash-cli fzf bash-completion fastfetch
|
||||
;;
|
||||
"suse")
|
||||
sudo zypper install multitail tree zoxide trash-cli fzf bash-completion fastfetch
|
||||
;;
|
||||
"debian")
|
||||
sudo apt-get install multitail tree zoxide trash-cli fzf bash-completion
|
||||
# Fetch the latest fastfetch release URL for linux-amd64 deb file
|
||||
FASTFETCH_URL=$(curl -s https://api.github.com/repos/fastfetch-cli/fastfetch/releases/latest | grep "browser_download_url.*linux-amd64.deb" | cut -d '"' -f 4)
|
||||
|
||||
# Download the latest fastfetch deb file
|
||||
curl -sL $FASTFETCH_URL -o /tmp/fastfetch_latest_amd64.deb
|
||||
|
||||
# Install the downloaded deb file using apt-get
|
||||
sudo apt-get install /tmp/fastfetch_latest_amd64.deb
|
||||
;;
|
||||
"arch")
|
||||
sudo paru multitail tree zoxide trash-cli fzf bash-completion fastfetch
|
||||
;;
|
||||
"slackware")
|
||||
echo "No install support for Slackware"
|
||||
;;
|
||||
*)
|
||||
echo "Unknown distribution"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# IP address lookup
|
||||
alias whatismyip="whatsmyip"
|
||||
function whatsmyip () {
|
||||
# Internal IP Lookup.
|
||||
if command -v ip &> /dev/null; then
|
||||
echo -n "Internal IP: "
|
||||
ip addr show wlan0 | grep "inet " | awk '{print $2}' | cut -d/ -f1
|
||||
else
|
||||
echo -n "Internal IP: "
|
||||
ifconfig wlan0 | grep "inet " | awk '{print $2}'
|
||||
fi
|
||||
|
||||
# External IP Lookup
|
||||
echo -n "External IP: "
|
||||
curl -4 ifconfig.me
|
||||
}
|
||||
|
||||
# View Apache logs
|
||||
apachelog() {
|
||||
if [ -f /etc/httpd/conf/httpd.conf ]; then
|
||||
cd /var/log/httpd && ls -xAh && multitail --no-repeat -c -s 2 /var/log/httpd/*_log
|
||||
else
|
||||
cd /var/log/apache2 && ls -xAh && multitail --no-repeat -c -s 2 /var/log/apache2/*.log
|
||||
fi
|
||||
}
|
||||
|
||||
# Edit the Apache configuration
|
||||
apacheconfig() {
|
||||
if [ -f /etc/httpd/conf/httpd.conf ]; then
|
||||
sedit /etc/httpd/conf/httpd.conf
|
||||
elif [ -f /etc/apache2/apache2.conf ]; then
|
||||
sedit /etc/apache2/apache2.conf
|
||||
else
|
||||
echo "Error: Apache config file could not be found."
|
||||
echo "Searching for possible locations:"
|
||||
sudo updatedb && locate httpd.conf && locate apache2.conf
|
||||
fi
|
||||
}
|
||||
|
||||
# Edit the PHP configuration file
|
||||
phpconfig() {
|
||||
if [ -f /etc/php.ini ]; then
|
||||
sedit /etc/php.ini
|
||||
elif [ -f /etc/php/php.ini ]; then
|
||||
sedit /etc/php/php.ini
|
||||
elif [ -f /etc/php5/php.ini ]; then
|
||||
sedit /etc/php5/php.ini
|
||||
elif [ -f /usr/bin/php5/bin/php.ini ]; then
|
||||
sedit /usr/bin/php5/bin/php.ini
|
||||
elif [ -f /etc/php5/apache2/php.ini ]; then
|
||||
sedit /etc/php5/apache2/php.ini
|
||||
else
|
||||
echo "Error: php.ini file could not be found."
|
||||
echo "Searching for possible locations:"
|
||||
sudo updatedb && locate php.ini
|
||||
fi
|
||||
}
|
||||
|
||||
# Edit the MySQL configuration file
|
||||
mysqlconfig() {
|
||||
if [ -f /etc/my.cnf ]; then
|
||||
sedit /etc/my.cnf
|
||||
elif [ -f /etc/mysql/my.cnf ]; then
|
||||
sedit /etc/mysql/my.cnf
|
||||
elif [ -f /usr/local/etc/my.cnf ]; then
|
||||
sedit /usr/local/etc/my.cnf
|
||||
elif [ -f /usr/bin/mysql/my.cnf ]; then
|
||||
sedit /usr/bin/mysql/my.cnf
|
||||
elif [ -f ~/my.cnf ]; then
|
||||
sedit ~/my.cnf
|
||||
elif [ -f ~/.my.cnf ]; then
|
||||
sedit ~/.my.cnf
|
||||
else
|
||||
echo "Error: my.cnf file could not be found."
|
||||
echo "Searching for possible locations:"
|
||||
sudo updatedb && locate my.cnf
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Trim leading and trailing spaces (for scripts)
|
||||
trim() {
|
||||
local var=$*
|
||||
var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters
|
||||
var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters
|
||||
echo -n "$var"
|
||||
}
|
||||
# GitHub Titus Additions
|
||||
|
||||
gcom() {
|
||||
git add .
|
||||
git commit -m "$1"
|
||||
}
|
||||
lazyg() {
|
||||
git add .
|
||||
git commit -m "$1"
|
||||
git push
|
||||
}
|
||||
|
||||
function hb {
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "No file path specified."
|
||||
return
|
||||
elif [ ! -f "$1" ]; then
|
||||
echo "File path does not exist."
|
||||
return
|
||||
fi
|
||||
|
||||
uri="http://bin.christitus.com/documents"
|
||||
response=$(curl -s -X POST -d @"$1" "$uri")
|
||||
if [ $? -eq 0 ]; then
|
||||
hasteKey=$(echo $response | jq -r '.key')
|
||||
echo "http://bin.christitus.com/$hasteKey"
|
||||
else
|
||||
echo "Failed to upload the document."
|
||||
fi
|
||||
}
|
||||
|
||||
#######################################################
|
||||
# Set the ultimate amazing command prompt
|
||||
#######################################################
|
||||
|
||||
alias hug="systemctl --user restart hugo"
|
||||
alias lanm="systemctl --user restart lan-mouse"
|
||||
|
||||
# Check if the shell is interactive
|
||||
if [[ $- == *i* ]]; then
|
||||
# Bind Ctrl+f to insert 'zi' followed by a newline
|
||||
bind '"\C-f":"zi\n"'
|
||||
fi
|
||||
|
||||
export PATH=$PATH:"$HOME/.local/bin:$HOME/.cargo/bin:/var/lib/flatpak/exports/bin:/.local/share/flatpak/exports/bin"
|
||||
|
||||
eval "$(starship init bash)"
|
||||
eval "$(zoxide init bash)"
|
||||
Generated
+10
@@ -0,0 +1,10 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Ignored default folder with query files
|
||||
/queries/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
Generated
+9
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
Generated
+6
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
Generated
+8
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/Fedora-postInstall-Script.iml" filepath="$PROJECT_DIR$/.idea/Fedora-postInstall-Script.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
Generated
+6
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="GENERAL_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../Fedora-PostInstall-Script" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
@@ -35,10 +35,6 @@ This script automates the following tasks:
|
||||
* **Internet Connection**: Required to download packages and repositories.
|
||||
|
||||
## Usage
|
||||
1. **Run script directly**
|
||||
```bash
|
||||
bash <(curl -fsSL https://gitea.schantli.ca/jschantli/Fedora-PIS/raw/branch/main/postinstall.sh)
|
||||
```
|
||||
|
||||
1. **Clone the repository:**
|
||||
```bash
|
||||
|
||||
@@ -0,0 +1,449 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Post install script for Fedora
|
||||
# Author: Jacob Schantli
|
||||
# Version: 0.8
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Helper Functions
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# Colors for output
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
log_info() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||
}
|
||||
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Check if the last command was successful
|
||||
check_status() {
|
||||
if [ $? -eq 0 ]; then
|
||||
log_info "$1 successful."
|
||||
else
|
||||
log_error "$1 failed."
|
||||
# If the second argument is "critical", exit the script
|
||||
if [ "$2" == "critical" ]; then
|
||||
log_error "Critical error encountered. Exiting."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Append text to a file if it doesn't already exist
|
||||
append_to_file_if_missing() {
|
||||
local file="$1"
|
||||
local text="$2"
|
||||
local description="$3"
|
||||
local use_sudo="$4"
|
||||
|
||||
if grep -Fq "$text" "$file"; then
|
||||
log_warn "$description already exists in $file. Skipping."
|
||||
else
|
||||
if [ "$use_sudo" == "true" ]; then
|
||||
echo "$text" | sudo tee -a "$file" > /dev/null
|
||||
else
|
||||
echo "$text" >> "$file"
|
||||
fi
|
||||
log_info "Added $description to $file."
|
||||
fi
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Installation Functions
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
optimize_dnf() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Modifying /etc/dnf/dnf.conf for faster downloads."
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
DNF_CONF="/etc/dnf/dnf.conf"
|
||||
if [ -f "$DNF_CONF" ]; then
|
||||
append_to_file_if_missing "$DNF_CONF" "max_parallel_downloads=10" "max_parallel_downloads" "true"
|
||||
append_to_file_if_missing "$DNF_CONF" "defaultyes=True" "defaultyes" "true"
|
||||
append_to_file_if_missing "$DNF_CONF" "keepcache=True" "keepcache" "true"
|
||||
else
|
||||
log_error "$DNF_CONF not found!"
|
||||
fi
|
||||
sleep 1
|
||||
}
|
||||
|
||||
install_fonts() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Microsoft Core Fonts and Meslo Nerd Font."
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
log_info "Updating system and installing prerequisites..."
|
||||
sudo dnf upgrade --refresh -y
|
||||
check_status "System upgrade" "critical"
|
||||
|
||||
sudo dnf install -y curl cabextract xorg-x11-font-utils fontconfig wget
|
||||
check_status "Prerequisites installation" "critical"
|
||||
|
||||
log_info "Installing Microsoft Core Fonts..."
|
||||
if rpm -q msttcore-fonts-installer > /dev/null 2>&1; then
|
||||
log_warn "Microsoft Core Fonts already installed."
|
||||
else
|
||||
sudo rpm -i https://downloads.sourceforge.net/project/mscorefonts2/rpms/msttcore-fonts-installer-2.6-1.noarch.rpm
|
||||
check_status "Microsoft Core Fonts installation" "non-critical"
|
||||
fi
|
||||
|
||||
log_info "Installing Meslo Nerd Font..."
|
||||
FONT_NAME="MesloLGS Nerd Font Mono"
|
||||
if fc-list :family | grep -iq "$FONT_NAME"; then
|
||||
log_info "Font '$FONT_NAME' is already installed."
|
||||
else
|
||||
log_info "Installing font '$FONT_NAME'..."
|
||||
FONT_URL="https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.zip"
|
||||
FONT_DIR="$HOME/.local/share/fonts"
|
||||
TEMP_DIR=$(mktemp -d)
|
||||
|
||||
wget -O "$TEMP_DIR/$FONT_NAME.zip" "$FONT_URL"
|
||||
unzip "$TEMP_DIR/$FONT_NAME.zip" -d "$TEMP_DIR"
|
||||
mkdir -p "$FONT_DIR/$FONT_NAME"
|
||||
mv "$TEMP_DIR"/*.ttf "$FONT_DIR/$FONT_NAME/"
|
||||
|
||||
fc-cache -fv
|
||||
rm -rf "$TEMP_DIR"
|
||||
check_status "Meslo Nerd Font installation" "non-critical"
|
||||
fi
|
||||
}
|
||||
|
||||
install_repos() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Adding RPM Fusion repositories."
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
sudo dnf install -y \
|
||||
https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
|
||||
https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
|
||||
check_status "RPM Fusion repositories installation" "non-critical"
|
||||
}
|
||||
|
||||
install_software() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing most used software."
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
DNF_PACKAGES=(
|
||||
"gnome-tweaks"
|
||||
"steam"
|
||||
"lutris"
|
||||
"btop"
|
||||
"fastfetch"
|
||||
"jstest-gtk"
|
||||
"yaru-icon-theme"
|
||||
"distrobox"
|
||||
"pipx"
|
||||
"bash-completion"
|
||||
"tar"
|
||||
"bat"
|
||||
"tree"
|
||||
"unzip"
|
||||
"git"
|
||||
"fzf"
|
||||
)
|
||||
|
||||
log_info "Installing DNF packages..."
|
||||
sudo dnf install -y "${DNF_PACKAGES[@]}"
|
||||
check_status "DNF packages installation" "non-critical"
|
||||
|
||||
# Ensure flatpak is set up
|
||||
if ! command -v flatpak &> /dev/null; then
|
||||
log_info "Flatpak not found. Installing..."
|
||||
sudo dnf install -y flatpak
|
||||
fi
|
||||
|
||||
log_info "Adding Flathub remote..."
|
||||
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
check_status "Flathub remote add" "non-critical"
|
||||
|
||||
FLATPAK_PACKAGES=(
|
||||
"com.discordapp.Discord"
|
||||
"com.github.tchx84.Flatseal"
|
||||
"net.nokyan.Resources"
|
||||
"com.mattjakeman.ExtensionManager"
|
||||
"io.github.realmazharhussain.GdmSettings"
|
||||
"io.github.dvlv.boxbuddyrs"
|
||||
"it.mijorus.gearlever"
|
||||
"io.github.fastrizwaan.WineZGUI"
|
||||
"com.vysp3r.ProtonPlus"
|
||||
"io.missioncenter.MissionCenter"
|
||||
"io.github.peazip.PeaZip"
|
||||
"app.devsuite.Ptyxis"
|
||||
"re.sonny.Junction"
|
||||
"com.github.rafostar.Clapper"
|
||||
"io.github.flattool.Ignition"
|
||||
"io.github.swordpuffin.rewaita"
|
||||
"page.tesk.Refine"
|
||||
"io.gitlab.adhami3310.Converter"
|
||||
"com.bitwarden.desktop"
|
||||
"com.usebottles.bottles"
|
||||
"com.ulaa.Ulaa"
|
||||
"com.bambulab.BambuStudio"
|
||||
"com.collaboraoffice.Office"
|
||||
"org.mozilla.Thunderbird"
|
||||
)
|
||||
|
||||
log_info "Installing Flatpak packages..."
|
||||
for app in "${FLATPAK_PACKAGES[@]}"; do
|
||||
log_info "Installing $app..."
|
||||
flatpak install flathub -y "$app"
|
||||
check_status "Flatpak $app" "non-critical"
|
||||
done
|
||||
}
|
||||
|
||||
install_cachyos() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing CachyOS kernel"
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
sudo dnf copr enable -y bieszczaders/kernel-cachyos
|
||||
check_status "Enabling CachyOS Copr" "non-critical"
|
||||
|
||||
sudo dnf install -y kernel-cachyos kernel-cachyos-devel-matched
|
||||
check_status "CachyOS Kernel installation" "non-critical"
|
||||
|
||||
log_info "Installing CachyOS addons"
|
||||
sudo dnf copr enable -y bieszczaders/kernel-cachyos-addons
|
||||
check_status "Enabling CachyOS Addons Copr" "non-critical"
|
||||
|
||||
sudo dnf swap -y zram-generator-defaults cachyos-settings
|
||||
sudo dracut -f
|
||||
sudo dnf -y install scx-scheds scx-tools scx-manager ananicy-cpp
|
||||
check_status "CachyOS addons installation" "non-critical"
|
||||
}
|
||||
|
||||
install_linuxtoys() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing LinuxToys"
|
||||
log_info "----------------------------------------------------"
|
||||
curl -fsSL https://linux.toys/install.sh | bash
|
||||
check_status "LinuxToys installation" "non-critical"
|
||||
}
|
||||
|
||||
install_shell_env() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Shell Environment (Starship, FZF, Zoxide, MyBash)"
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
# Install Starship
|
||||
if command_exists starship; then
|
||||
log_info "Starship already installed."
|
||||
else
|
||||
log_info "Installing Starship..."
|
||||
curl -sSL https://starship.rs/install.sh | sudo sh
|
||||
check_status "Starship installation" "non-critical"
|
||||
fi
|
||||
|
||||
# Install FZF (Fallback if not installed via DNF)
|
||||
if ! command_exists fzf; then
|
||||
log_info "Installing FZF via git..."
|
||||
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
|
||||
~/.fzf/install --all
|
||||
fi
|
||||
|
||||
# Install Zoxide
|
||||
if command_exists zoxide; then
|
||||
log_info "Zoxide already installed."
|
||||
else
|
||||
log_info "Installing Zoxide..."
|
||||
curl -sSL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
|
||||
check_status "Zoxide installation" "non-critical"
|
||||
fi
|
||||
|
||||
# Clone MyBash
|
||||
log_info "Cloning MyBash configuration..."
|
||||
GITPATH="$HOME/.local/share/mybash"
|
||||
if [ -d "$GITPATH" ]; then
|
||||
rm -rf "$GITPATH"
|
||||
fi
|
||||
mkdir -p "$HOME/.local/share"
|
||||
|
||||
if git clone https://gitea.schantli.ca/jschantli/mybash.git "$GITPATH"; then
|
||||
log_info "MyBash cloned successfully."
|
||||
|
||||
# Link Config
|
||||
log_info "Linking configuration files..."
|
||||
OLD_BASHRC="$HOME/.bashrc"
|
||||
|
||||
# Check if .bashrc exists in the cloned repo
|
||||
if [ -f "$GITPATH/.bashrc" ]; then
|
||||
if [ -e "$OLD_BASHRC" ] && [ ! -e "$HOME/.bashrc.bak" ]; then
|
||||
log_info "Backing up .bashrc to .bashrc.bak..."
|
||||
mv "$OLD_BASHRC" "$HOME/.bashrc.bak"
|
||||
fi
|
||||
|
||||
log_info "Linking new .bashrc..."
|
||||
ln -svf "$GITPATH/.bashrc" "$HOME/.bashrc"
|
||||
|
||||
# Ensure Starship is initialized in the new .bashrc
|
||||
if ! grep -q "starship init bash" "$HOME/.bashrc"; then
|
||||
log_warn ".bashrc does not contain starship init. Appending it..."
|
||||
echo 'eval "$(starship init bash)"' >> "$HOME/.bashrc"
|
||||
fi
|
||||
else
|
||||
log_error "$GITPATH/.bashrc not found! Skipping .bashrc linking."
|
||||
fi
|
||||
|
||||
# Check if starship.toml exists in the cloned repo
|
||||
if [ -f "$GITPATH/starship.toml" ]; then
|
||||
log_info "Linking starship.toml..."
|
||||
mkdir -p "$HOME/.config"
|
||||
ln -svf "$GITPATH/starship.toml" "$HOME/.config/starship.toml"
|
||||
else
|
||||
log_warn "$GITPATH/starship.toml not found! Skipping Starship config linking."
|
||||
fi
|
||||
|
||||
check_status "Linking config files" "non-critical"
|
||||
else
|
||||
log_error "Failed to clone MyBash repository. Skipping shell configuration."
|
||||
fi
|
||||
}
|
||||
|
||||
install_gnome_extensions() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing GNOME extensions"
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
# Ensure pipx is installed and path is set
|
||||
if ! command -v pipx &> /dev/null; then
|
||||
log_info "pipx not found. Installing..."
|
||||
sudo dnf install -y pipx
|
||||
pipx ensurepath
|
||||
fi
|
||||
|
||||
# Install gnome-extensions-cli
|
||||
log_info "Installing gnome-extensions-cli..."
|
||||
pipx install gnome-extensions-cli --system-site-packages
|
||||
check_status "gnome-extensions-cli installation" "non-critical"
|
||||
|
||||
# Define the tool path explicitly to avoid 'pipx run' overhead/warnings
|
||||
EXTENSION_TOOL="$HOME/.local/bin/gnome-extensions-cli"
|
||||
|
||||
GNOME_EXTENSIONS=(
|
||||
"dash-to-dock@micxgx.gmail.com"
|
||||
"app-grid-wizard@mirzadeh.pro"
|
||||
"appindicatorsupport@rgcjonas.gmail.com"
|
||||
"blur-my-shell@aunetx"
|
||||
"caffeine@patapon.info"
|
||||
"dynamic-music-pill@andbal"
|
||||
"gnome-fuzzy-app-search@gnome-shell-extensions.Czarlie.gitlab.com"
|
||||
"IP-Finder@linxgem33.com"
|
||||
"lan-ip-address@mrhuber.com"
|
||||
"update-extension@purejava.org"
|
||||
"user-theme@gnome-shell-extensions.gcampax.github.com"
|
||||
)
|
||||
|
||||
log_info "Installing GNOME extensions..."
|
||||
log_info "NOTE: A popup may appear asking you to confirm installation for each extension."
|
||||
log_info "If the extension is already installed, no popup will appear."
|
||||
|
||||
for extension in "${GNOME_EXTENSIONS[@]}"; do
|
||||
log_info "Processing $extension..."
|
||||
|
||||
# Install (using the direct binary path)
|
||||
"$EXTENSION_TOOL" install "$extension"
|
||||
|
||||
# Attempt to enable the extension (in case it's installed but disabled)
|
||||
log_info "Ensuring $extension is enabled..."
|
||||
gnome-extensions enable "$extension"
|
||||
|
||||
# Prompt user to press Enter to continue
|
||||
read -p "Press Enter to continue (if a popup appeared, confirm it first)..."
|
||||
|
||||
check_status "GNOME Extension $extension" "non-critical"
|
||||
done
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Main Menu
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
show_menu() {
|
||||
clear
|
||||
echo "===================================================="
|
||||
echo " Fedora Post-Install Script - Main Menu"
|
||||
echo "===================================================="
|
||||
echo "1. Install Everything (Recommended)"
|
||||
echo "2. Optimize DNF"
|
||||
echo "3. Install Fonts"
|
||||
echo "4. Add Repositories (RPM Fusion)"
|
||||
echo "5. Install Software (DNF & Flatpak)"
|
||||
echo "6. Install CachyOS Kernel"
|
||||
echo "7. Install LinuxToys"
|
||||
echo "8. Install Shell Environment (Starship, MyBash)"
|
||||
echo "9. Install GNOME Extensions"
|
||||
echo "0. Exit"
|
||||
echo "===================================================="
|
||||
read -p "Enter your choice [0-9]: " choice
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Main Execution
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
log_info "Starting Post-install script for Fedora..."
|
||||
sleep 2
|
||||
|
||||
# Ensure sudo permissions are available upfront
|
||||
sudo -v
|
||||
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
|
||||
|
||||
while true; do
|
||||
show_menu
|
||||
case $choice in
|
||||
1)
|
||||
optimize_dnf
|
||||
install_fonts
|
||||
install_repos
|
||||
install_software
|
||||
install_cachyos
|
||||
install_linuxtoys
|
||||
install_shell_env
|
||||
install_gnome_extensions
|
||||
log_info "All tasks completed successfully!"
|
||||
break
|
||||
;;
|
||||
2) optimize_dnf ;;
|
||||
3) install_fonts ;;
|
||||
4) install_repos ;;
|
||||
5) install_software ;;
|
||||
6) install_cachyos ;;
|
||||
7) install_linuxtoys ;;
|
||||
8) install_shell_env ;;
|
||||
9) install_gnome_extensions ;;
|
||||
0)
|
||||
log_info "Exiting..."
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
log_error "Invalid option. Please try again."
|
||||
sleep 2
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "$choice" != "1" ]; then
|
||||
read -p "Press Enter to return to the main menu..."
|
||||
fi
|
||||
done
|
||||
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Post-install script completed successfully!"
|
||||
log_info "Please restart your shell or run 'source ~/.bashrc' to see the changes."
|
||||
log_info "----------------------------------------------------"
|
||||
@@ -0,0 +1,425 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Post install script for Bazzite (Fedora Atomic)
|
||||
# Author: Jacob Schantli
|
||||
# Version: 0.1
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Global Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# Note: Packages like Steam, Lutris, Git, and Distrobox are pre-installed on Bazzite.
|
||||
SYSTEM_PACKAGES=(
|
||||
"gnome-tweaks"
|
||||
"btop"
|
||||
"fastfetch"
|
||||
"jstest-gtk"
|
||||
"yaru-icon-theme"
|
||||
"pipx"
|
||||
"bash-completion"
|
||||
"bat"
|
||||
"tree"
|
||||
"fzf"
|
||||
"syncthing"
|
||||
)
|
||||
|
||||
FLATPAK_PACKAGES=(
|
||||
"com.discordapp.Discord"
|
||||
"com.github.tchx84.Flatseal"
|
||||
"net.nokyan.Resources"
|
||||
"com.mattjakeman.ExtensionManager"
|
||||
"io.github.realmazharhussain.GdmSettings"
|
||||
"com.ranfdev.DistroShelf"
|
||||
"it.mijorus.gearlever"
|
||||
"io.github.fastrizwaan.WineZGUI"
|
||||
"com.vysp3r.ProtonPlus"
|
||||
"io.missioncenter.MissionCenter"
|
||||
"io.github.peazip.PeaZip"
|
||||
"app.devsuite.Ptyxis"
|
||||
"re.sonny.Junction"
|
||||
"com.github.rafostar.Clapper"
|
||||
"io.github.flattool.Ignition"
|
||||
"io.github.swordpuffin.rewaita"
|
||||
"page.tesk.Refine"
|
||||
"io.gitlab.adhami3310.Converter"
|
||||
"com.usebottles.bottles"
|
||||
"com.bambulab.BambuStudio"
|
||||
"com.collaboraoffice.Office"
|
||||
"org.mozilla.Thunderbird"
|
||||
"io.github.martchus.syncthingtray"
|
||||
"io.github.kolunmi.Bazaar"
|
||||
)
|
||||
|
||||
GNOME_EXTENSIONS=(
|
||||
"dash-to-dock@micxgx.gmail.com"
|
||||
"app-grid-wizard@mirzadeh.pro"
|
||||
"appindicatorsupport@rgcjonas.gmail.com"
|
||||
"blur-my-shell@aunetx"
|
||||
"caffeine@patapon.info"
|
||||
"dynamic-music-pill@andbal"
|
||||
"gnome-fuzzy-app-search@gnome-shell-extensions.Czarlie.gitlab.com"
|
||||
"IP-Finder@linxgem33.com"
|
||||
"lan-ip-address@mrhuber.com"
|
||||
"update-extension@purejava.org"
|
||||
"user-theme@gnome-shell-extensions.gcampax.github.com"
|
||||
)
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Helper Functions
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# Colors for output
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
log_info() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||
}
|
||||
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Check if the last command was successful
|
||||
check_status() {
|
||||
if [ $? -eq 0 ]; then
|
||||
log_info "$1 successful."
|
||||
else
|
||||
log_error "$1 failed."
|
||||
# If the second argument is "critical", exit the script
|
||||
if [ "$2" == "critical" ]; then
|
||||
log_error "Critical error encountered. Exiting."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Installation Functions
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
install_fonts() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Microsoft Core Fonts and Meslo Nerd Font."
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
log_info "Updating system (rpm-ostree upgrade)..."
|
||||
sudo rpm-ostree upgrade
|
||||
check_status "System upgrade" "non-critical"
|
||||
|
||||
log_info "Installing Microsoft Core Fonts..."
|
||||
if rpm -q msttcore-fonts-installer > /dev/null 2>&1; then
|
||||
log_warn "Microsoft Core Fonts already installed."
|
||||
else
|
||||
sudo rpm-ostree install https://downloads.sourceforge.net/project/mscorefonts2/rpms/msttcore-fonts-installer-2.6-1.noarch.rpm
|
||||
check_status "Microsoft Core Fonts installation" "non-critical"
|
||||
fi
|
||||
|
||||
log_info "Installing Meslo Nerd Font..."
|
||||
FONT_NAME="MesloLGS Nerd Font Mono"
|
||||
if fc-list :family | grep -iq "$FONT_NAME"; then
|
||||
log_info "Font '$FONT_NAME' is already installed."
|
||||
else
|
||||
log_info "Installing font '$FONT_NAME'..."
|
||||
FONT_URL="https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.zip"
|
||||
FONT_DIR="$HOME/.local/share/fonts"
|
||||
TEMP_DIR=$(mktemp -d)
|
||||
|
||||
wget -O "$TEMP_DIR/$FONT_NAME.zip" "$FONT_URL"
|
||||
unzip "$TEMP_DIR/$FONT_NAME.zip" -d "$TEMP_DIR"
|
||||
mkdir -p "$FONT_DIR/$FONT_NAME"
|
||||
mv "$TEMP_DIR"/*.ttf "$FONT_DIR/$FONT_NAME/"
|
||||
|
||||
fc-cache -fv
|
||||
rm -rf "$TEMP_DIR"
|
||||
check_status "Meslo Nerd Font installation" "non-critical"
|
||||
fi
|
||||
}
|
||||
|
||||
install_software() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing most used software."
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
log_info "Installing System packages via rpm-ostree..."
|
||||
local PKGS_TO_INSTALL=()
|
||||
for pkg in "${SYSTEM_PACKAGES[@]}"; do
|
||||
if rpm -q "$pkg" > /dev/null 2>&1; then
|
||||
log_info "$pkg is already installed."
|
||||
else
|
||||
PKGS_TO_INSTALL+=("$pkg")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#PKGS_TO_INSTALL[@]} -gt 0 ]; then
|
||||
log_info "Installing: ${PKGS_TO_INSTALL[*]}"
|
||||
sudo rpm-ostree install ${PKGS_TO_INSTALL[@]}
|
||||
check_status "System packages installation" "non-critical"
|
||||
else
|
||||
log_info "All system packages are already installed."
|
||||
fi
|
||||
|
||||
# Ensure flatpak is set up
|
||||
if ! command -v flatpak &> /dev/null; then
|
||||
log_info "Flatpak not found. Installing..."
|
||||
sudo rpm-ostree install flatpak
|
||||
fi
|
||||
|
||||
log_info "Adding Flathub remote..."
|
||||
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
check_status "Flathub remote add" "non-critical"
|
||||
|
||||
log_info "Installing Flatpak packages..."
|
||||
for app in "${FLATPAK_PACKAGES[@]}"; do
|
||||
log_info "Installing $app..."
|
||||
flatpak install flathub -y "$app"
|
||||
check_status "Flatpak $app" "non-critical"
|
||||
done
|
||||
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Homebrew and Gemini CLI"
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
# Install Homebrew
|
||||
if command_exists brew; then
|
||||
log_info "Homebrew already installed."
|
||||
else
|
||||
log_info "Installing Homebrew..."
|
||||
# Using NONINTERACTIVE=1 to avoid prompts during brew install
|
||||
NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||
|
||||
# Add brew to path for the current session
|
||||
if [ -d "/home/linuxbrew/.linuxbrew/bin" ]; then
|
||||
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
|
||||
elif [ -d "$HOME/.linuxbrew/bin" ]; then
|
||||
eval "$($HOME/.linuxbrew/bin/brew shellenv)"
|
||||
fi
|
||||
|
||||
check_status "Homebrew installation" "non-critical"
|
||||
fi
|
||||
|
||||
# Install Gemini CLI
|
||||
log_info "Installing gemini-cli via Homebrew..."
|
||||
brew install gemini-cli
|
||||
check_status "gemini-cli installation" "non-critical"
|
||||
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing 1Password"
|
||||
log_info "----------------------------------------------------"
|
||||
if rpm -q 1password > /dev/null 2>&1; then
|
||||
log_info "1Password already installed."
|
||||
else
|
||||
log_info "Downloading and installing 1Password..."
|
||||
sudo rpm-ostree install https://downloads.1password.com/linux/rpm/stable/x86_64/1password-latest.rpm
|
||||
sudo rpm-ostree install 1password-cli
|
||||
check_status "1Password installation" "non-critical"
|
||||
fi
|
||||
}
|
||||
|
||||
install_shell_env() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Shell Environment (Starship, FZF, Zoxide, MyBash)"
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
# Install Starship
|
||||
if command_exists starship; then
|
||||
log_info "Starship already installed."
|
||||
else
|
||||
log_info "Installing Starship to ~/.local/bin..."
|
||||
# Bazzite's /usr/local/bin might be read-only so we install into user directory
|
||||
mkdir -p ~/.local/bin
|
||||
curl -sSL https://starship.rs/install.sh | sh -s -- -b ~/.local/bin -y
|
||||
check_status "Starship installation" "non-critical"
|
||||
fi
|
||||
|
||||
# Install FZF (Fallback if not installed via base system)
|
||||
if ! command_exists fzf; then
|
||||
log_info "Installing FZF via git..."
|
||||
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
|
||||
~/.fzf/install --all
|
||||
fi
|
||||
|
||||
# Install Zoxide
|
||||
if command_exists zoxide; then
|
||||
log_info "Zoxide already installed."
|
||||
else
|
||||
log_info "Installing Zoxide..."
|
||||
curl -sSL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
|
||||
check_status "Zoxide installation" "non-critical"
|
||||
fi
|
||||
|
||||
# Clone MyBash
|
||||
log_info "Cloning MyBash configuration..."
|
||||
GITPATH="$HOME/.local/share/mybash"
|
||||
if [ -d "$GITPATH" ]; then
|
||||
rm -rf "$GITPATH"
|
||||
fi
|
||||
mkdir -p "$HOME/.local/share"
|
||||
|
||||
if git clone https://gitea.schantli.ca/jschantli/mybash.git "$GITPATH"; then
|
||||
log_info "MyBash cloned successfully."
|
||||
|
||||
# Link Config
|
||||
log_info "Linking configuration files..."
|
||||
OLD_BASHRC="$HOME/.bashrc"
|
||||
|
||||
# Check if .bashrc exists in the cloned repo
|
||||
if [ -f "$GITPATH/.bashrc" ]; then
|
||||
if [ -e "$OLD_BASHRC" ] && [ ! -e "$HOME/.bashrc.bak" ]; then
|
||||
log_info "Backing up .bashrc to .bashrc.bak..."
|
||||
mv "$OLD_BASHRC" "$HOME/.bashrc.bak"
|
||||
fi
|
||||
|
||||
log_info "Linking new .bashrc..."
|
||||
ln -svf "$GITPATH/.bashrc" "$HOME/.bashrc"
|
||||
|
||||
# Ensure Starship is initialized in the new .bashrc
|
||||
if ! grep -q "starship init bash" "$HOME/.bashrc"; then
|
||||
log_warn ".bashrc does not contain starship init. Appending it..."
|
||||
echo 'eval "$(starship init bash)"' >> "$HOME/.bashrc"
|
||||
fi
|
||||
else
|
||||
log_error "$GITPATH/.bashrc not found! Skipping .bashrc linking."
|
||||
fi
|
||||
|
||||
# Check if starship.toml exists in the cloned repo
|
||||
if [ -f "$GITPATH/starship.toml" ]; then
|
||||
log_info "Linking starship.toml..."
|
||||
mkdir -p "$HOME/.config"
|
||||
ln -svf "$GITPATH/starship.toml" "$HOME/.config/starship.toml"
|
||||
else
|
||||
log_warn "$GITPATH/starship.toml not found! Skipping Starship config linking."
|
||||
fi
|
||||
|
||||
# Check if config.jsonc exists in the cloned repo
|
||||
if [ -f "$GITPATH/config.jsonc" ]; then
|
||||
log_info "Linking config.jsonc..."
|
||||
mkdir -p "$HOME/.config/fastfetch/"
|
||||
ln -svf "$GITPATH/config.jsonc" "$HOME/.config/fastfetch/config.jsonc"
|
||||
else
|
||||
log_warn "$GITPATH/config.jsonc not found! Skipping fastfetch config linking."
|
||||
fi
|
||||
|
||||
check_status "Linking config files" "non-critical"
|
||||
else
|
||||
log_error "Failed to clone MyBash repository. Skipping shell configuration."
|
||||
fi
|
||||
}
|
||||
|
||||
install_gnome_extensions() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing GNOME extensions"
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
# Ensure pipx is installed and path is set
|
||||
if ! command -v pipx &> /dev/null; then
|
||||
log_info "pipx not found. Installing via rpm-ostree..."
|
||||
sudo rpm-ostree install pipx
|
||||
pipx ensurepath
|
||||
fi
|
||||
|
||||
# Install gnome-extensions-cli
|
||||
log_info "Installing gnome-extensions-cli..."
|
||||
pipx install gnome-extensions-cli --system-site-packages
|
||||
check_status "gnome-extensions-cli installation" "non-critical"
|
||||
|
||||
# Define the tool path explicitly to avoid 'pipx run' overhead/warnings
|
||||
EXTENSION_TOOL="$HOME/.local/bin/gnome-extensions-cli"
|
||||
|
||||
log_info "Installing GNOME extensions..."
|
||||
log_info "NOTE: A popup may appear asking you to confirm installation for each extension."
|
||||
log_info "If the extension is already installed, no popup will appear."
|
||||
|
||||
for extension in "${GNOME_EXTENSIONS[@]}"; do
|
||||
log_info "Processing $extension..."
|
||||
|
||||
# Install (using the direct binary path)
|
||||
"$EXTENSION_TOOL" install "$extension"
|
||||
|
||||
# Attempt to enable the extension (in case it's installed but disabled)
|
||||
log_info "Ensuring $extension is enabled..."
|
||||
gnome-extensions enable "$extension"
|
||||
|
||||
# Prompt user to press Enter to continue
|
||||
read -p "Press Enter to continue (if a popup appeared, confirm it first)..."
|
||||
|
||||
check_status "GNOME Extension $extension" "non-critical"
|
||||
done
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Main Menu
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
show_menu() {
|
||||
clear
|
||||
echo "===================================================="
|
||||
echo " Bazzite Post-Install Script - Main Menu"
|
||||
echo "===================================================="
|
||||
echo "1. Install Everything"
|
||||
echo "2. Install Fonts"
|
||||
echo "3. Install Software (rpm-ostree & Flatpak)"
|
||||
echo "4. Install Shell Environment (Starship, MyBash)"
|
||||
echo "5. Install GNOME Extensions"
|
||||
echo "0. Exit"
|
||||
echo "===================================================="
|
||||
read -p "Enter your choice [0-6]: " choice
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Main Execution
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
log_info "Starting Post-install script for Bazzite..."
|
||||
sleep 2
|
||||
|
||||
# Ensure sudo permissions are available upfront
|
||||
sudo -v
|
||||
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
|
||||
|
||||
while true; do
|
||||
show_menu
|
||||
case $choice in
|
||||
1)
|
||||
install_fonts
|
||||
install_software
|
||||
install_shell_env
|
||||
install_gnome_extensions
|
||||
log_info "All tasks completed successfully!"
|
||||
log_warn "IMPORTANT: You MUST REBOOT your system to apply rpm-ostree package installations!"
|
||||
break
|
||||
;;
|
||||
2) install_fonts ;;
|
||||
3) install_software ;;
|
||||
4) install_shell_env ;;
|
||||
5) install_gnome_extensions ;;
|
||||
0)
|
||||
log_info "Exiting..."
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
log_error "Invalid option. Please try again."
|
||||
sleep 2
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "$choice" != "1" ]; then
|
||||
read -p "Press Enter to return to the main menu..."
|
||||
fi
|
||||
done
|
||||
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Post-install script completed successfully!"
|
||||
log_info "Please restart your shell or run 'source ~/.bashrc' to see the changes."
|
||||
log_warn "If you installed system packages via rpm-ostree, PLEASE REBOOT now."
|
||||
log_info "----------------------------------------------------"
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
|
||||
{
|
||||
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
|
||||
"logo": {
|
||||
"padding": {
|
||||
"top": 1
|
||||
}
|
||||
},
|
||||
"display": {
|
||||
"separator": " "
|
||||
},
|
||||
"modules": [
|
||||
"break",
|
||||
{
|
||||
"type": "os",
|
||||
"key": " DISTRO",
|
||||
"keyColor": "yellow"
|
||||
},
|
||||
{
|
||||
"type": "kernel",
|
||||
"key": "│ ├",
|
||||
"keyColor": "yellow"
|
||||
},
|
||||
{
|
||||
"type": "packages",
|
||||
"key": "│ ├",
|
||||
"keyColor": "yellow"
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"key": "│ ├",
|
||||
"keyColor": "yellow",
|
||||
"text": "birth_install=$(stat -c %W /); current=$(date +%s); time_progression=$((current - birth_install)); days_difference=$((time_progression / 86400)); echo $days_difference days"
|
||||
},
|
||||
{
|
||||
"type": "shell",
|
||||
"key": "│ └",
|
||||
"keyColor": "yellow"
|
||||
},
|
||||
|
||||
{
|
||||
"type": "wm",
|
||||
"key": " DE/WM",
|
||||
"keyColor": "blue"
|
||||
},
|
||||
{
|
||||
"type": "wmtheme",
|
||||
"key": "│ ├",
|
||||
"keyColor": "blue"
|
||||
},
|
||||
{
|
||||
"type": "icons",
|
||||
"key": "│ ├",
|
||||
"keyColor": "blue"
|
||||
},
|
||||
{
|
||||
"type": "cursor",
|
||||
"key": "│ ├",
|
||||
"keyColor": "blue",
|
||||
},
|
||||
{
|
||||
"type": "terminalfont",
|
||||
"key": "│ ├",
|
||||
"keyColor": "blue",
|
||||
},
|
||||
{
|
||||
"type": "terminal",
|
||||
"key": "│ └",
|
||||
"keyColor": "blue"
|
||||
},
|
||||
{
|
||||
"type": "host",
|
||||
"key": " SYSTEM",
|
||||
"keyColor": "green"
|
||||
},
|
||||
{
|
||||
"type": "cpu",
|
||||
"key": "│ ├",
|
||||
"keyColor": "green"
|
||||
},
|
||||
{
|
||||
"type": "gpu",
|
||||
"key": "│ ├",
|
||||
"format": "{2}",
|
||||
"keyColor": "green"
|
||||
},
|
||||
{
|
||||
"type": "display",
|
||||
"key": "│ ├",
|
||||
"keyColor": "green",
|
||||
"compactType": "original-with-refresh-rate"
|
||||
},
|
||||
{
|
||||
"type": "memory",
|
||||
"key": "│ ├",
|
||||
"keyColor": "green"
|
||||
},
|
||||
{
|
||||
"type": "swap",
|
||||
"key": "│ ├",
|
||||
"keyColor": "green"
|
||||
},
|
||||
{
|
||||
"type": "uptime",
|
||||
"key": "│ ├",
|
||||
"keyColor": "green"
|
||||
},
|
||||
{
|
||||
"type": "sound",
|
||||
"key": " AUDIO",
|
||||
"format": "{2}",
|
||||
"keyColor": "magenta"
|
||||
},
|
||||
{
|
||||
"type": "player",
|
||||
"key": "│ ├",
|
||||
"keyColor": "magenta"
|
||||
},
|
||||
{
|
||||
"type": "media",
|
||||
"key": "│ └",
|
||||
"keyColor": "magenta"
|
||||
},
|
||||
{
|
||||
"type": "custom",
|
||||
"format": "\u001b[90m \u001b[31m \u001b[32m \u001b[33m \u001b[34m \u001b[35m \u001b[36m \u001b[37m \u001b[38m \u001b[39m \u001b[39m \u001b[38m \u001b[37m \u001b[36m \u001b[35m \u001b[34m \u001b[33m \u001b[32m \u001b[31m \u001b[90m "
|
||||
},
|
||||
"break",
|
||||
]
|
||||
}
|
||||
+228
@@ -0,0 +1,228 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Fedora Post-Install Script</title>
|
||||
<style>
|
||||
:root {
|
||||
--bg-color: #121212;
|
||||
--card-bg: #1e1e1e;
|
||||
--text-color: #e0e0e0;
|
||||
--accent-color: #007bff;
|
||||
--accent-hover: #0056b3;
|
||||
--success-color: #28a745;
|
||||
--code-bg: #2d2d2d;
|
||||
--code-text: #a5d6ff;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||
background-color: var(--bg-color);
|
||||
color: var(--text-color);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-height: 100vh;
|
||||
margin: 0;
|
||||
padding: 20px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.container {
|
||||
background-color: var(--card-bg);
|
||||
padding: 3rem;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
|
||||
text-align: center;
|
||||
max-width: 700px;
|
||||
width: 100%;
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
.container:hover {
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #ffffff;
|
||||
margin-bottom: 1rem;
|
||||
font-size: 2.5rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.5px;
|
||||
background: linear-gradient(45deg, #007bff, #00d4ff);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
p {
|
||||
line-height: 1.6;
|
||||
margin-bottom: 2.5rem;
|
||||
color: #b0b0b0;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.command-box {
|
||||
background-color: var(--code-bg);
|
||||
padding: 1.2rem;
|
||||
border-radius: 8px;
|
||||
border: 1px solid #3d3d3d;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 2rem;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: "Fira Code", monospace;
|
||||
color: var(--code-text);
|
||||
word-break: break-all;
|
||||
text-align: left;
|
||||
margin-right: 1rem;
|
||||
font-size: 0.95rem;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.copy-btn {
|
||||
background-color: var(--accent-color);
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 0.6rem 1.2rem;
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
transition: all 0.2s ease;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.copy-btn:hover {
|
||||
background-color: var(--accent-hover);
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 4px 12px rgba(0, 123, 255, 0.3);
|
||||
}
|
||||
|
||||
.copy-btn:active {
|
||||
transform: scale(0.98);
|
||||
}
|
||||
|
||||
.features {
|
||||
text-align: left;
|
||||
margin-top: 2.5rem;
|
||||
font-size: 1rem;
|
||||
color: #ccc;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.feature-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
padding: 0.8rem;
|
||||
border-radius: 8px;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
.feature-item:hover {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.feature-icon {
|
||||
color: var(--success-color);
|
||||
margin-right: 0.8rem;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.container {
|
||||
padding: 1.5rem;
|
||||
}
|
||||
h1 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
.command-box {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
gap: 1rem;
|
||||
}
|
||||
.copy-btn {
|
||||
width: 100%;
|
||||
}
|
||||
code {
|
||||
margin-right: 0;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<!-- Preload fonts for better performance -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&family=Fira+Code&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>Fedora Post-Install Script</h1>
|
||||
<p>
|
||||
Supercharge your Fedora workstation in minutes. Optimize performance, install essential apps, and configure a powerful development environment with a single command.
|
||||
</p>
|
||||
|
||||
<div class="command-box">
|
||||
<code id="install-cmd">bash <(curl -fsSL https://gitea.schantli.ca/jschantli/Fedora-PIS/raw/branch/main/postinstall.sh)</code>
|
||||
<button class="copy-btn" onclick="copyCommand()">Copy Command</button>
|
||||
</div>
|
||||
|
||||
<div class="features">
|
||||
<div class="feature-item">
|
||||
<span class="feature-icon">⚡</span>
|
||||
<span>Optimized DNF Config</span>
|
||||
</div>
|
||||
<div class="feature-item">
|
||||
<span class="feature-icon">📦</span>
|
||||
<span>Essential Flatpaks</span>
|
||||
</div>
|
||||
<div class="feature-item">
|
||||
<span class="feature-icon">🚀</span>
|
||||
<span>CachyOS Kernel</span>
|
||||
</div>
|
||||
<div class="feature-item">
|
||||
<span class="feature-icon">🐚</span>
|
||||
<span>Starship + MyBash</span>
|
||||
</div>
|
||||
<div class="feature-item">
|
||||
<span class="feature-icon">🧩</span>
|
||||
<span>GNOME Extensions</span>
|
||||
</div>
|
||||
<div class="feature-item">
|
||||
<span class="feature-icon">🛠️</span>
|
||||
<span>Dev Tools (Git, FZF)</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function copyCommand() {
|
||||
const commandText = document.getElementById('install-cmd').innerText;
|
||||
const btn = document.querySelector('.copy-btn');
|
||||
|
||||
navigator.clipboard.writeText(commandText).then(() => {
|
||||
const originalText = btn.innerText;
|
||||
const originalBg = btn.style.backgroundColor;
|
||||
|
||||
btn.innerText = 'Copied!';
|
||||
btn.style.backgroundColor = 'var(--success-color)';
|
||||
|
||||
setTimeout(() => {
|
||||
btn.innerText = originalText;
|
||||
btn.style.backgroundColor = ''; // Reset to CSS default
|
||||
}, 2000);
|
||||
}).catch(err => {
|
||||
console.error('Failed to copy: ', err);
|
||||
alert('Failed to copy command. Please select and copy manually.');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,525 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Post install script for openSUSE
|
||||
# Author: Jacob Schantli
|
||||
# Version: 1.0
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Global Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
ZYPPER_PACKAGES=(
|
||||
"gnome-tweaks"
|
||||
"steam"
|
||||
"lutris"
|
||||
"btop"
|
||||
"fastfetch"
|
||||
"jstest-gtk"
|
||||
"distrobox"
|
||||
"python3-pipx"
|
||||
"bash-completion"
|
||||
"tar"
|
||||
"bat"
|
||||
"tree"
|
||||
"unzip"
|
||||
"git"
|
||||
"fzf"
|
||||
"syncthing"
|
||||
"mpv"
|
||||
"fuse"
|
||||
"fuse3"
|
||||
"nodejs"
|
||||
)
|
||||
|
||||
FLATPAK_PACKAGES=(
|
||||
"com.github.tchx84.Flatseal"
|
||||
"net.nokyan.Resources"
|
||||
"com.mattjakeman.ExtensionManager"
|
||||
"io.github.realmazharhussain.GdmSettings"
|
||||
"com.ranfdev.DistroShelf"
|
||||
"it.mijorus.gearlever"
|
||||
"io.github.fastrizwaan.WineZGUI"
|
||||
"com.vysp3r.ProtonPlus"
|
||||
"io.missioncenter.MissionCenter"
|
||||
"io.github.peazip.PeaZip"
|
||||
"app.devsuite.Ptyxis"
|
||||
"re.sonny.Junction"
|
||||
"com.github.rafostar.Clapper"
|
||||
"io.github.flattool.Ignition"
|
||||
"io.github.swordpuffin.rewaita"
|
||||
"page.tesk.Refine"
|
||||
"io.gitlab.adhami3310.Converter"
|
||||
"com.usebottles.bottles"
|
||||
"com.bambulab.BambuStudio"
|
||||
"com.collaboraoffice.Office"
|
||||
"io.github.martchus.syncthingtray"
|
||||
"io.github.kolunmi.Bazaar"
|
||||
"com.fastmail.Fastmail"
|
||||
)
|
||||
|
||||
GNOME_EXTENSIONS=(
|
||||
"dash-to-dock@micxgx.gmail.com"
|
||||
"app-grid-wizard@mirzadeh.pro"
|
||||
"appindicatorsupport@rgcjonas.gmail.com"
|
||||
"blur-my-shell@aunetx"
|
||||
"caffeine@patapon.info"
|
||||
"dynamic-music-pill@andbal"
|
||||
"gnome-fuzzy-app-search@gnome-shell-extensions.Czarlie.gitlab.com"
|
||||
"IP-Finder@linxgem33.com"
|
||||
"lan-ip-address@mrhuber.com"
|
||||
"update-extension@purejava.org"
|
||||
"user-theme@gnome-shell-extensions.gcampax.github.com"
|
||||
"gnome-wallpaper-engine@gjs.com.zip"
|
||||
)
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Helper Functions
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# Colors for output
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
log_info() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||
}
|
||||
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Check if the last command was successful
|
||||
check_status() {
|
||||
if [ $? -eq 0 ]; then
|
||||
log_info "$1 successful."
|
||||
else
|
||||
log_error "$1 failed."
|
||||
# If the second argument is "critical", exit the script
|
||||
if [ "$2" == "critical" ]; then
|
||||
log_error "Critical error encountered. Exiting."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Append text to a file if it doesn't already exist
|
||||
append_to_file_if_missing() {
|
||||
local file="$1"
|
||||
local text="$2"
|
||||
local description="$3"
|
||||
local use_sudo="$4"
|
||||
|
||||
if grep -Fq "$text" "$file"; then
|
||||
log_warn "$description already exists in $file. Skipping."
|
||||
else
|
||||
if [ "$use_sudo" == "true" ]; then
|
||||
echo "$text" | sudo tee -a "$file" > /dev/null
|
||||
else
|
||||
echo "$text" >> "$file"
|
||||
fi
|
||||
log_info "Added $description to $file."
|
||||
fi
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Installation Functions
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
optimize_zypper() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Modifying /etc/zypp/zypp.conf for faster downloads."
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
ZYPP_CONF="/etc/zypp/zypp.conf"
|
||||
if [ -f "$ZYPP_CONF" ]; then
|
||||
if grep -q "^# download.max_concurrent_connections" "$ZYPP_CONF" || ! grep -q "download.max_concurrent_connections = 10" "$ZYPP_CONF"; then
|
||||
sudo sed -i 's/^# download.max_concurrent_connections.*/download.max_concurrent_connections = 10/' "$ZYPP_CONF"
|
||||
log_info "Enabled max concurrent connections."
|
||||
fi
|
||||
else
|
||||
log_warn "$ZYPP_CONF not found!"
|
||||
fi
|
||||
sleep 1
|
||||
}
|
||||
|
||||
install_fonts() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Microsoft Core Fonts and Meslo Nerd Font."
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
log_info "Updating system and installing prerequisites..."
|
||||
sudo zypper refresh
|
||||
sudo zypper --non-interactive update
|
||||
check_status "System upgrade" "critical"
|
||||
|
||||
sudo zypper install -y curl cabextract fontconfig wget fetchmsttfonts
|
||||
check_status "Prerequisites installation" "critical"
|
||||
|
||||
log_info "Installing Meslo Nerd Font..."
|
||||
FONT_NAME="MesloLGS Nerd Font Mono"
|
||||
if fc-list :family | grep -iq "$FONT_NAME"; then
|
||||
log_info "Font '$FONT_NAME' is already installed."
|
||||
else
|
||||
log_info "Installing font '$FONT_NAME'..."
|
||||
FONT_URL="https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.zip"
|
||||
FONT_DIR="$HOME/.local/share/fonts"
|
||||
TEMP_DIR=$(mktemp -d)
|
||||
|
||||
wget -O "$TEMP_DIR/$FONT_NAME.zip" "$FONT_URL"
|
||||
unzip "$TEMP_DIR/$FONT_NAME.zip" -d "$TEMP_DIR"
|
||||
mkdir -p "$FONT_DIR/$FONT_NAME"
|
||||
mv "$TEMP_DIR"/*.ttf "$FONT_DIR/$FONT_NAME/"
|
||||
|
||||
fc-cache -fv
|
||||
rm -rf "$TEMP_DIR"
|
||||
check_status "Meslo Nerd Font installation" "non-critical"
|
||||
fi
|
||||
}
|
||||
|
||||
install_repos() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Adding Packman repository."
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
sudo zypper addrepo -cfp 90 'https://ftp.gwdg.de/pub/linux/misc/packman/suse/openSUSE_Tumbleweed/' packman
|
||||
sudo zypper refresh
|
||||
sudo zypper --non-interactive dist-upgrade --from packman --allow-vendor-change
|
||||
check_status "Packman repository installation" "non-critical"
|
||||
}
|
||||
|
||||
install_software() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing most used software."
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
log_info "Installing Zypper packages..."
|
||||
sudo zypper install -y "${ZYPPER_PACKAGES[@]}"
|
||||
check_status "Zypper packages installation" "non-critical"
|
||||
|
||||
# Ensure flatpak is set up
|
||||
if ! command -v flatpak &> /dev/null; then
|
||||
log_info "Flatpak not found. Installing..."
|
||||
sudo zypper install -y flatpak
|
||||
fi
|
||||
|
||||
log_info "Adding Flathub remote..."
|
||||
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
check_status "Flathub remote add" "non-critical"
|
||||
|
||||
log_info "Installing Flatpak packages..."
|
||||
for app in "${FLATPAK_PACKAGES[@]}"; do
|
||||
log_info "Installing $app..."
|
||||
flatpak install flathub -y "$app"
|
||||
check_status "Flatpak $app" "non-critical"
|
||||
done
|
||||
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Homebrew and Gemini CLI"
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
# Install Homebrew
|
||||
if command_exists brew; then
|
||||
log_info "Homebrew already installed."
|
||||
else
|
||||
log_info "Installing Homebrew..."
|
||||
# Using NONINTERACTIVE=1 to avoid prompts during brew install
|
||||
NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||
|
||||
# Add brew to path for the current session
|
||||
if [ -d "/home/linuxbrew/.linuxbrew/bin" ]; then
|
||||
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
|
||||
elif [ -d "$HOME/.linuxbrew/bin" ]; then
|
||||
eval "$($HOME/.linuxbrew/bin/brew shellenv)"
|
||||
fi
|
||||
|
||||
check_status "Homebrew installation" "non-critical"
|
||||
fi
|
||||
|
||||
# Install Gemini CLI
|
||||
log_info "Installing gemini-cli via Homebrew..."
|
||||
brew install gemini-cli
|
||||
check_status "gemini-cli installation" "non-critical"
|
||||
}
|
||||
|
||||
install_discord() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Discord"
|
||||
log_info "----------------------------------------------------"
|
||||
if rpm -q discord > /dev/null 2>&1; then
|
||||
log_info "Discord already installed."
|
||||
else
|
||||
log_info "Downloading and installing Discord..."
|
||||
sudo zypper install -y "https://discord.com/api/download?platform=linux&format=rpm"
|
||||
check_status "Discord installation" "non-critical"
|
||||
fi
|
||||
}
|
||||
|
||||
install_1password() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing 1Password"
|
||||
log_info "----------------------------------------------------"
|
||||
if rpm -q 1password > /dev/null 2>&1; then
|
||||
log_info "1Password already installed."
|
||||
else
|
||||
log_info "Downloading and installing 1Password..."
|
||||
sudo rpm --import https://downloads.1password.com/linux/keys/1password.asc
|
||||
sudo zypper addrepo https://downloads.1password.com/linux/rpm/stable/x86_64 1password
|
||||
sudo zypper install -y 1password
|
||||
check_status "1Password installation" "non-critical"
|
||||
fi
|
||||
}
|
||||
|
||||
install_Windscribe() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Windscribe"
|
||||
log_info "----------------------------------------------------"
|
||||
if rpm -q windscribe-cli > /dev/null 2>&1 || command_exists windscribe; then
|
||||
log_info "Windscribe already installed."
|
||||
else
|
||||
log_info "Downloading and installing Windscribe..."
|
||||
sudo zypper install -y https://windscribe.com/install/desktop/linux_rpm_x64
|
||||
check_status "Windscribe installation" "non-critical"
|
||||
fi
|
||||
}
|
||||
|
||||
install_linuxtoys() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing LinuxToys"
|
||||
log_info "----------------------------------------------------"
|
||||
curl -fsSL https://linux.toys/install.sh | bash
|
||||
check_status "LinuxToys installation" "non-critical"
|
||||
}
|
||||
|
||||
install_shell_env() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Shell Environment (Starship, FZF, Zoxide, MyBash)"
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
# Install Starship
|
||||
if command_exists starship; then
|
||||
log_info "Starship already installed."
|
||||
else
|
||||
log_info "Installing Starship..."
|
||||
curl -sSL https://starship.rs/install.sh | sudo sh
|
||||
check_status "Starship installation" "non-critical"
|
||||
fi
|
||||
|
||||
# Install FZF (Fallback if not installed via Zypper)
|
||||
if ! command_exists fzf; then
|
||||
log_info "Installing FZF via git..."
|
||||
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
|
||||
~/.fzf/install --all
|
||||
fi
|
||||
|
||||
# Install Zoxide
|
||||
if command_exists zoxide; then
|
||||
log_info "Zoxide already installed."
|
||||
else
|
||||
log_info "Installing Zoxide..."
|
||||
curl -sSL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
|
||||
check_status "Zoxide installation" "non-critical"
|
||||
fi
|
||||
|
||||
# Clone MyBash
|
||||
log_info "Cloning MyBash configuration..."
|
||||
GITPATH="$HOME/.local/share/mybash"
|
||||
if [ -d "$GITPATH" ]; then
|
||||
rm -rf "$GITPATH"
|
||||
fi
|
||||
mkdir -p "$HOME/.local/share"
|
||||
|
||||
if git clone https://gitea.schantli.ca/jschantli/mybash.git "$GITPATH"; then
|
||||
log_info "MyBash cloned successfully."
|
||||
|
||||
# Link Config
|
||||
log_info "Linking configuration files..."
|
||||
OLD_BASHRC="$HOME/.bashrc"
|
||||
|
||||
# Check if .bashrc exists in the cloned repo
|
||||
if [ -f "$GITPATH/.bashrc" ]; then
|
||||
if [ -e "$OLD_BASHRC" ] && [ ! -e "$HOME/.bashrc.bak" ]; then
|
||||
log_info "Backing up .bashrc to .bashrc.bak..."
|
||||
mv "$OLD_BASHRC" "$HOME/.bashrc.bak"
|
||||
fi
|
||||
|
||||
log_info "Linking new .bashrc..."
|
||||
ln -svf "$GITPATH/.bashrc" "$HOME/.bashrc"
|
||||
|
||||
# Ensure Starship is initialized in the new .bashrc
|
||||
if ! grep -q "starship init bash" "$HOME/.bashrc"; then
|
||||
log_warn ".bashrc does not contain starship init. Appending it..."
|
||||
echo 'eval "$(starship init bash)"' >> "$HOME/.bashrc"
|
||||
fi
|
||||
else
|
||||
log_error "$GITPATH/.bashrc not found! Skipping .bashrc linking."
|
||||
fi
|
||||
|
||||
# Check if starship.toml exists in the cloned repo
|
||||
if [ -f "$GITPATH/starship.toml" ]; then
|
||||
log_info "Linking starship.toml..."
|
||||
mkdir -p "$HOME/.config"
|
||||
ln -svf "$GITPATH/starship.toml" "$HOME/.config/starship.toml"
|
||||
else
|
||||
log_warn "$GITPATH/starship.toml not found! Skipping Starship config linking."
|
||||
fi
|
||||
|
||||
# Check if config.jsonc exists in the cloned repo
|
||||
if [ -f "$GITPATH/config.jsonc" ]; then
|
||||
log_info "Linking config.jsonc..."
|
||||
mkdir -p "$HOME/.config/fastfetch/"
|
||||
ln -svf "$GITPATH/config.jsonc" "$HOME/.config/fastfetch/config.jsonc"
|
||||
else
|
||||
log_warn "$GITPATH/config.jsonc not found! Skipping fastfetch config linking."
|
||||
fi
|
||||
|
||||
check_status "Linking config files" "non-critical"
|
||||
else
|
||||
log_error "Failed to clone MyBash repository. Skipping shell configuration."
|
||||
fi
|
||||
}
|
||||
|
||||
install_topgrade() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Topgrade"
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
sudo zypper install -y topgrade
|
||||
check_status "Topgrade installation" "non-critical"
|
||||
}
|
||||
|
||||
install_gnome_extensions() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing GNOME extensions"
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
# Ensure pipx is installed and path is set
|
||||
if ! command -v pipx &> /dev/null; then
|
||||
log_info "pipx not found. Installing..."
|
||||
sudo zypper install -y python3-pipx
|
||||
pipx ensurepath
|
||||
fi
|
||||
|
||||
# Install gnome-extensions-cli
|
||||
log_info "Installing gnome-extensions-cli..."
|
||||
pipx install gnome-extensions-cli --system-site-packages
|
||||
check_status "gnome-extensions-cli installation" "non-critical"
|
||||
|
||||
# Define the tool path explicitly to avoid 'pipx run' overhead/warnings
|
||||
EXTENSION_TOOL="$HOME/.local/bin/gnome-extensions-cli"
|
||||
|
||||
log_info "Installing GNOME extensions..."
|
||||
log_info "NOTE: A popup may appear asking you to confirm installation for each extension."
|
||||
log_info "If the extension is already installed, no popup will appear."
|
||||
|
||||
for extension in "${GNOME_EXTENSIONS[@]}"; do
|
||||
log_info "Processing $extension..."
|
||||
|
||||
# Install (using the direct binary path)
|
||||
"$EXTENSION_TOOL" install "$extension"
|
||||
|
||||
# Attempt to enable the extension (in case it's installed but disabled)
|
||||
log_info "Ensuring $extension is enabled..."
|
||||
gnome-extensions enable "$extension"
|
||||
|
||||
# Prompt user to press Enter to continue
|
||||
read -p "Press Enter to continue (if a popup appeared, confirm it first)..."
|
||||
|
||||
check_status "GNOME Extension $extension" "non-critical"
|
||||
done
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Main Menu
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
show_menu() {
|
||||
clear
|
||||
echo "===================================================="
|
||||
echo " openSUSE Post-Install Script - Main Menu"
|
||||
echo "===================================================="
|
||||
echo "1. Install Everything (Recommended)"
|
||||
echo "2. Optimize Zypper"
|
||||
echo "3. Install Fonts"
|
||||
echo "4. Add Repositories (Packman)"
|
||||
echo "5. Install Software (Zypper & Flatpak)"
|
||||
echo "6. Install LinuxToys"
|
||||
echo "7. Install Shell Environment (Starship, MyBash)"
|
||||
echo "8. Install GNOME Extensions"
|
||||
echo "9. Install Discord"
|
||||
echo "10. Install 1Password"
|
||||
echo "11. Install Windscribe"
|
||||
echo "12. Install Topgrade"
|
||||
echo "0. Exit"
|
||||
echo "===================================================="
|
||||
read -p "Enter your choice [0-12]: " choice
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Main Execution
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
log_info "Starting Post-install script for openSUSE..."
|
||||
sleep 2
|
||||
|
||||
# Ensure sudo permissions are available upfront
|
||||
sudo -v
|
||||
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
|
||||
|
||||
while true; do
|
||||
show_menu
|
||||
case $choice in
|
||||
1)
|
||||
optimize_zypper
|
||||
install_fonts
|
||||
install_repos
|
||||
install_software
|
||||
install_discord
|
||||
install_1password
|
||||
install_Windscribe
|
||||
install_topgrade
|
||||
install_linuxtoys
|
||||
install_shell_env
|
||||
install_gnome_extensions
|
||||
log_info "All tasks completed successfully!"
|
||||
break
|
||||
;;
|
||||
2) optimize_zypper ;;
|
||||
3) install_fonts ;;
|
||||
4) install_repos ;;
|
||||
5) install_software ;;
|
||||
6) install_linuxtoys ;;
|
||||
7) install_shell_env ;;
|
||||
8) install_gnome_extensions ;;
|
||||
9) install_discord ;;
|
||||
10) install_1password ;;
|
||||
11) install_Windscribe ;;
|
||||
12) install_topgrade ;;
|
||||
0)
|
||||
log_info "Exiting..."
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
log_error "Invalid option. Please try again."
|
||||
sleep 2
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "$choice" != "1" ]; then
|
||||
read -p "Press Enter to return to the main menu..."
|
||||
fi
|
||||
done
|
||||
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Post-install script completed successfully!"
|
||||
log_info "Please restart your shell or run 'source ~/.bashrc' to see the changes."
|
||||
log_info "----------------------------------------------------"
|
||||
+82
-14
@@ -2,7 +2,7 @@
|
||||
|
||||
# Post install script for Fedora
|
||||
# Author: Jacob Schantli
|
||||
# Version: 0.90
|
||||
# Version: 1.0
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Global Configuration
|
||||
@@ -26,12 +26,13 @@ DNF_PACKAGES=(
|
||||
"git"
|
||||
"fzf"
|
||||
"syncthing"
|
||||
"mpv"
|
||||
"fuse"
|
||||
"fuse-libs"
|
||||
"nodejs"
|
||||
)
|
||||
|
||||
FLATPAK_PACKAGES=(
|
||||
"com.discordapp.Discord"
|
||||
"com.github.tchx84.Flatseal"
|
||||
"net.nokyan.Resources"
|
||||
"com.mattjakeman.ExtensionManager"
|
||||
@@ -49,18 +50,16 @@ FLATPAK_PACKAGES=(
|
||||
"io.github.swordpuffin.rewaita"
|
||||
"page.tesk.Refine"
|
||||
"io.gitlab.adhami3310.Converter"
|
||||
"com.bitwarden.desktop"
|
||||
"com.usebottles.bottles"
|
||||
"com.ulaa.Ulaa"
|
||||
"com.bambulab.BambuStudio"
|
||||
"com.collaboraoffice.Office"
|
||||
"org.mozilla.Thunderbird"
|
||||
"io.github.martchus.syncthingtray"
|
||||
"io.github.kolunmi.Bazaar"
|
||||
"com.fastmail.Fastmail"
|
||||
)
|
||||
|
||||
GNOME_EXTENSIONS=(
|
||||
"dash-to-dock@micxgx.gmail.com"
|
||||
"dhruva@narkagni"
|
||||
"app-grid-wizard@mirzadeh.pro"
|
||||
"appindicatorsupport@rgcjonas.gmail.com"
|
||||
"blur-my-shell@aunetx"
|
||||
@@ -71,6 +70,7 @@ GNOME_EXTENSIONS=(
|
||||
"lan-ip-address@mrhuber.com"
|
||||
"update-extension@purejava.org"
|
||||
"user-theme@gnome-shell-extensions.gcampax.github.com"
|
||||
"gnome-wallpaper-engine@gjs.com.zip"
|
||||
)
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -199,8 +199,8 @@ install_repos() {
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
sudo dnf install -y \
|
||||
https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
|
||||
https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
|
||||
"https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm" \
|
||||
"https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm"
|
||||
check_status "RPM Fusion repositories installation" "non-critical"
|
||||
}
|
||||
|
||||
@@ -213,6 +213,11 @@ install_software() {
|
||||
sudo dnf install -y "${DNF_PACKAGES[@]}"
|
||||
check_status "DNF packages installation" "non-critical"
|
||||
|
||||
# Install Gemini CLI
|
||||
log_info "Installing gemini-cli via Homebrew..."
|
||||
npm i @google/gemini-cli
|
||||
check_status "gemini-cli installation" "non-critical"
|
||||
|
||||
# Ensure flatpak is set up
|
||||
if ! command -v flatpak &> /dev/null; then
|
||||
log_info "Flatpak not found. Installing..."
|
||||
@@ -252,10 +257,45 @@ install_software() {
|
||||
check_status "Homebrew installation" "non-critical"
|
||||
fi
|
||||
|
||||
# Install Gemini CLI
|
||||
log_info "Installing gemini-cli via Homebrew..."
|
||||
brew install gemini-cli
|
||||
check_status "gemini-cli installation" "non-critical"
|
||||
}
|
||||
|
||||
install_discord() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Discord"
|
||||
log_info "----------------------------------------------------"
|
||||
if rpm -q discord > /dev/null 2>&1; then
|
||||
log_info "Discord already installed."
|
||||
else
|
||||
log_info "Downloading and installing Discord..."
|
||||
sudo dnf install -y "https://discord.com/api/download?platform=linux&format=rpm"
|
||||
check_status "Discord installation" "non-critical"
|
||||
fi
|
||||
}
|
||||
|
||||
install_1password() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing 1Password"
|
||||
log_info "----------------------------------------------------"
|
||||
if rpm -q 1password > /dev/null 2>&1; then
|
||||
log_info "1Password already installed."
|
||||
else
|
||||
log_info "Downloading and installing 1Password..."
|
||||
sudo dnf install -y https://downloads.1password.com/linux/rpm/stable/x86_64/1password-latest.rpm
|
||||
check_status "1Password installation" "non-critical"
|
||||
fi
|
||||
}
|
||||
|
||||
install_Windscribe() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Windscribe"
|
||||
log_info "----------------------------------------------------"
|
||||
if rpm -q windscribe-cli > /dev/null 2>&1 || command_exists windscribe; then
|
||||
log_info "Windscribe already installed."
|
||||
else
|
||||
log_info "Downloading and installing Windscribe..."
|
||||
sudo dnf install -y https://windscribe.com/install/desktop/linux_rpm_x64
|
||||
check_status "Windscribe installation" "non-critical"
|
||||
fi
|
||||
}
|
||||
|
||||
install_cachyos() {
|
||||
@@ -375,6 +415,18 @@ install_shell_env() {
|
||||
fi
|
||||
}
|
||||
|
||||
install_topgrade() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing Topgrade"
|
||||
log_info "----------------------------------------------------"
|
||||
|
||||
sudo dnf copr enable lilay/topgrade
|
||||
check_status "Enabling Topgrade" "non-critical"
|
||||
|
||||
sudo dnf install -y topgrade
|
||||
check_status "Topgrade installation" "non-critical"
|
||||
}
|
||||
|
||||
install_gnome_extensions() {
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Installing GNOME extensions"
|
||||
@@ -435,9 +487,13 @@ show_menu() {
|
||||
echo "8. Install LinuxToys"
|
||||
echo "9. Install Shell Environment (Starship, MyBash)"
|
||||
echo "10. Install GNOME Extensions"
|
||||
echo "11. Install Discord"
|
||||
echo "12. Install 1Password"
|
||||
echo "13. Install Windscribe"
|
||||
echo "14. Install Topgrade"
|
||||
echo "0. Exit"
|
||||
echo "===================================================="
|
||||
read -p "Enter your choice [0-10]: " choice
|
||||
read -p "Enter your choice [0-14]: " choice
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -459,6 +515,10 @@ while true; do
|
||||
install_fonts
|
||||
install_repos
|
||||
install_software
|
||||
install_discord
|
||||
install_1password
|
||||
install_Windscribe
|
||||
install_topgrade
|
||||
install_cachyos
|
||||
install_linuxtoys
|
||||
install_shell_env
|
||||
@@ -471,6 +531,10 @@ while true; do
|
||||
install_fonts
|
||||
install_repos
|
||||
install_software
|
||||
install_discord
|
||||
install_1password
|
||||
install_Windscribe
|
||||
install_topgrade
|
||||
# install_cachyos (Skipped)
|
||||
install_linuxtoys
|
||||
install_shell_env
|
||||
@@ -486,6 +550,10 @@ while true; do
|
||||
8) install_linuxtoys ;;
|
||||
9) install_shell_env ;;
|
||||
10) install_gnome_extensions ;;
|
||||
11) install_discord ;;
|
||||
12) install_1password ;;
|
||||
13) install_Windscribe ;;
|
||||
14) install_topgrade ;;
|
||||
0)
|
||||
log_info "Exiting..."
|
||||
exit 0
|
||||
@@ -504,4 +572,4 @@ done
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "Post-install script completed successfully!"
|
||||
log_info "Please restart your shell or run 'source ~/.bashrc' to see the changes."
|
||||
log_info "----------------------------------------------------"
|
||||
log_info "----------------------------------------------------"
|
||||
+279
@@ -0,0 +1,279 @@
|
||||
"$schema" = 'https://starship.rs/config-schema.json'
|
||||
|
||||
format = """
|
||||
[](red)\
|
||||
$os\
|
||||
$username\
|
||||
[](bg:peach fg:red)\
|
||||
$directory\
|
||||
[](bg:yellow fg:peach)\
|
||||
$git_branch\
|
||||
$git_status\
|
||||
[](fg:yellow bg:green)\
|
||||
$c\
|
||||
$rust\
|
||||
$golang\
|
||||
$nodejs\
|
||||
$php\
|
||||
$java\
|
||||
$kotlin\
|
||||
$haskell\
|
||||
$python\
|
||||
[](fg:green bg:sapphire)\
|
||||
$conda\
|
||||
[](fg:sapphire bg:lavender)\
|
||||
$time\
|
||||
[ ](fg:lavender)\
|
||||
$cmd_duration\
|
||||
$line_break\
|
||||
$character"""
|
||||
|
||||
palette = 'catppuccin_latte'
|
||||
|
||||
[os]
|
||||
disabled = false
|
||||
style = "bg:red fg:crust"
|
||||
|
||||
[os.symbols]
|
||||
Windows = ""
|
||||
Ubuntu = ""
|
||||
SUSE = ""
|
||||
Raspbian = ""
|
||||
Mint = ""
|
||||
Macos = ""
|
||||
Manjaro = ""
|
||||
Linux = ""
|
||||
Gentoo = ""
|
||||
Fedora = ""
|
||||
Alpine = ""
|
||||
Amazon = ""
|
||||
Android = ""
|
||||
AOSC = ""
|
||||
Arch = ""
|
||||
Artix = ""
|
||||
CentOS = ""
|
||||
Debian = ""
|
||||
Redhat = ""
|
||||
RedHatEnterprise = ""
|
||||
|
||||
[username]
|
||||
show_always = true
|
||||
style_user = "bg:red fg:crust"
|
||||
style_root = "bg:red fg:crust"
|
||||
format = '[ $user]($style)'
|
||||
|
||||
[directory]
|
||||
style = "bg:peach fg:crust"
|
||||
format = "[ $path ]($style)"
|
||||
truncation_length = 3
|
||||
truncation_symbol = "…/"
|
||||
|
||||
[directory.substitutions]
|
||||
"Documents" = " "
|
||||
"Downloads" = " "
|
||||
"Music" = " "
|
||||
"Pictures" = " "
|
||||
"Developer" = " "
|
||||
|
||||
[git_branch]
|
||||
symbol = ""
|
||||
style = "bg:yellow"
|
||||
format = '[[ $symbol $branch ](fg:crust bg:yellow)]($style)'
|
||||
|
||||
[git_status]
|
||||
style = "bg:yellow"
|
||||
format = '[[($all_status$ahead_behind )](fg:crust bg:yellow)]($style)'
|
||||
|
||||
[nodejs]
|
||||
symbol = ""
|
||||
style = "bg:green"
|
||||
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
|
||||
|
||||
[c]
|
||||
symbol = " "
|
||||
style = "bg:green"
|
||||
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
|
||||
|
||||
[rust]
|
||||
symbol = ""
|
||||
style = "bg:green"
|
||||
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
|
||||
|
||||
[golang]
|
||||
symbol = ""
|
||||
style = "bg:green"
|
||||
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
|
||||
|
||||
[php]
|
||||
symbol = ""
|
||||
style = "bg:green"
|
||||
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
|
||||
|
||||
[java]
|
||||
symbol = " "
|
||||
style = "bg:green"
|
||||
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
|
||||
|
||||
[kotlin]
|
||||
symbol = ""
|
||||
style = "bg:green"
|
||||
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
|
||||
|
||||
[haskell]
|
||||
symbol = ""
|
||||
style = "bg:green"
|
||||
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
|
||||
|
||||
[python]
|
||||
symbol = ""
|
||||
style = "bg:green"
|
||||
format = '[[ $symbol( $version)(\(#$virtualenv\)) ](fg:crust bg:green)]($style)'
|
||||
|
||||
[docker_context]
|
||||
symbol = ""
|
||||
style = "bg:sapphire"
|
||||
format = '[[ $symbol( $context) ](fg:crust bg:sapphire)]($style)'
|
||||
|
||||
[conda]
|
||||
symbol = " "
|
||||
style = "fg:crust bg:sapphire"
|
||||
format = '[$symbol$environment ]($style)'
|
||||
ignore_base = false
|
||||
|
||||
[time]
|
||||
disabled = false
|
||||
time_format = "%R"
|
||||
style = "bg:lavender"
|
||||
format = '[[ $time ](fg:crust bg:lavender)]($style)'
|
||||
|
||||
[line_break]
|
||||
disabled = true
|
||||
|
||||
[character]
|
||||
disabled = false
|
||||
success_symbol = '[❯](bold fg:green)'
|
||||
error_symbol = '[❯](bold fg:red)'
|
||||
vimcmd_symbol = '[❮](bold fg:green)'
|
||||
vimcmd_replace_one_symbol = '[❮](bold fg:lavender)'
|
||||
vimcmd_replace_symbol = '[❮](bold fg:lavender)'
|
||||
vimcmd_visual_symbol = '[❮](bold fg:yellow)'
|
||||
|
||||
[cmd_duration]
|
||||
show_milliseconds = true
|
||||
format = " in $duration "
|
||||
style = "bg:lavender"
|
||||
disabled = false
|
||||
show_notifications = true
|
||||
min_time_to_notify = 45000
|
||||
|
||||
[palettes.catppuccin_mocha]
|
||||
rosewater = "#f5e0dc"
|
||||
flamingo = "#f2cdcd"
|
||||
pink = "#f5c2e7"
|
||||
mauve = "#cba6f7"
|
||||
red = "#f38ba8"
|
||||
maroon = "#eba0ac"
|
||||
peach = "#fab387"
|
||||
yellow = "#f9e2af"
|
||||
green = "#a6e3a1"
|
||||
teal = "#94e2d5"
|
||||
sky = "#89dceb"
|
||||
sapphire = "#74c7ec"
|
||||
blue = "#89b4fa"
|
||||
lavender = "#b4befe"
|
||||
text = "#cdd6f4"
|
||||
subtext1 = "#bac2de"
|
||||
subtext0 = "#a6adc8"
|
||||
overlay2 = "#9399b2"
|
||||
overlay1 = "#7f849c"
|
||||
overlay0 = "#6c7086"
|
||||
surface2 = "#585b70"
|
||||
surface1 = "#45475a"
|
||||
surface0 = "#313244"
|
||||
base = "#1e1e2e"
|
||||
mantle = "#181825"
|
||||
crust = "#11111b"
|
||||
|
||||
[palettes.catppuccin_frappe]
|
||||
rosewater = "#f2d5cf"
|
||||
flamingo = "#eebebe"
|
||||
pink = "#f4b8e4"
|
||||
mauve = "#ca9ee6"
|
||||
red = "#e78284"
|
||||
maroon = "#ea999c"
|
||||
peach = "#ef9f76"
|
||||
yellow = "#e5c890"
|
||||
green = "#a6d189"
|
||||
teal = "#81c8be"
|
||||
sky = "#99d1db"
|
||||
sapphire = "#85c1dc"
|
||||
blue = "#8caaee"
|
||||
lavender = "#babbf1"
|
||||
text = "#c6d0f5"
|
||||
subtext1 = "#b5bfe2"
|
||||
subtext0 = "#a5adce"
|
||||
overlay2 = "#949cbb"
|
||||
overlay1 = "#838ba7"
|
||||
overlay0 = "#737994"
|
||||
surface2 = "#626880"
|
||||
surface1 = "#51576d"
|
||||
surface0 = "#414559"
|
||||
base = "#303446"
|
||||
mantle = "#292c3c"
|
||||
crust = "#232634"
|
||||
|
||||
[palettes.catppuccin_latte]
|
||||
rosewater = "#dc8a78"
|
||||
flamingo = "#dd7878"
|
||||
pink = "#ea76cb"
|
||||
mauve = "#8839ef"
|
||||
red = "#d20f39"
|
||||
maroon = "#e64553"
|
||||
peach = "#fe640b"
|
||||
yellow = "#df8e1d"
|
||||
green = "#40a02b"
|
||||
teal = "#179299"
|
||||
sky = "#04a5e5"
|
||||
sapphire = "#209fb5"
|
||||
blue = "#1e66f5"
|
||||
lavender = "#7287fd"
|
||||
text = "#4c4f69"
|
||||
subtext1 = "#5c5f77"
|
||||
subtext0 = "#6c6f85"
|
||||
overlay2 = "#7c7f93"
|
||||
overlay1 = "#8c8fa1"
|
||||
overlay0 = "#9ca0b0"
|
||||
surface2 = "#acb0be"
|
||||
surface1 = "#bcc0cc"
|
||||
surface0 = "#ccd0da"
|
||||
base = "#eff1f5"
|
||||
mantle = "#e6e9ef"
|
||||
crust = "#dce0e8"
|
||||
|
||||
[palettes.catppuccin_macchiato]
|
||||
rosewater = "#f4dbd6"
|
||||
flamingo = "#f0c6c6"
|
||||
pink = "#f5bde6"
|
||||
mauve = "#c6a0f6"
|
||||
red = "#ed8796"
|
||||
maroon = "#ee99a0"
|
||||
peach = "#f5a97f"
|
||||
yellow = "#eed49f"
|
||||
green = "#a6da95"
|
||||
teal = "#8bd5ca"
|
||||
sky = "#91d7e3"
|
||||
sapphire = "#7dc4e4"
|
||||
blue = "#8aadf4"
|
||||
lavender = "#b7bdf8"
|
||||
text = "#cad3f5"
|
||||
subtext1 = "#b8c0e0"
|
||||
subtext0 = "#a5adcb"
|
||||
overlay2 = "#939ab7"
|
||||
overlay1 = "#8087a2"
|
||||
overlay0 = "#6e738d"
|
||||
surface2 = "#5b6078"
|
||||
surface1 = "#494d64"
|
||||
surface0 = "#363a4f"
|
||||
base = "#24273a"
|
||||
mantle = "#1e2030"
|
||||
crust = "#181926"
|
||||
Executable
+156
@@ -0,0 +1,156 @@
|
||||
#!/bin/sh -e
|
||||
|
||||
# Define color codes using tput for better compatibility
|
||||
RC=$(tput sgr0)
|
||||
RED=$(tput setaf 1)
|
||||
YELLOW=$(tput setaf 3)
|
||||
GREEN=$(tput setaf 2)
|
||||
|
||||
LINUXTOOLBOXDIR="$HOME/linuxtoolbox"
|
||||
PACKAGER=""
|
||||
SUDO_CMD=""
|
||||
|
||||
print_colored() {
|
||||
color=$1
|
||||
message=$2
|
||||
printf "${color}%s${RC}\n" "$message"
|
||||
}
|
||||
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
determine_package_manager() {
|
||||
PACKAGEMANAGER='nala apt dnf yum pacman zypper emerge xbps-install nix-env'
|
||||
for pgm in $PACKAGEMANAGER; do
|
||||
if command_exists "$pgm"; then
|
||||
PACKAGER="$pgm"
|
||||
printf "Using %s\n" "$pgm"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$PACKAGER" ]; then
|
||||
print_colored "$RED" "Can't find a supported package manager"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
determine_sudo_command() {
|
||||
if command_exists sudo; then
|
||||
SUDO_CMD="sudo"
|
||||
elif command_exists doas && [ -f "/etc/doas.conf" ]; then
|
||||
SUDO_CMD="doas"
|
||||
else
|
||||
SUDO_CMD="su -c"
|
||||
fi
|
||||
|
||||
printf "Using %s as privilege escalation software\n" "$SUDO_CMD"
|
||||
}
|
||||
|
||||
uninstall_dependencies() {
|
||||
DEPENDENCIES='bash-completion bat tree multitail fastfetch neovim trash-cli'
|
||||
|
||||
print_colored "$YELLOW" "Uninstalling dependencies..."
|
||||
if [ "$PACKAGER" = "pacman" ]; then
|
||||
if command_exists yay; then
|
||||
yay -Rns --noconfirm ${DEPENDENCIES}
|
||||
elif command_exists paru; then
|
||||
paru -Rns --noconfirm ${DEPENDENCIES}
|
||||
else
|
||||
${SUDO_CMD} pacman -Rns --noconfirm ${DEPENDENCIES}
|
||||
fi
|
||||
elif [ "$PACKAGER" = "nala" ] || [ "$PACKAGER" = "apt" ]; then
|
||||
${SUDO_CMD} ${PACKAGER} purge -y ${DEPENDENCIES}
|
||||
elif [ "$PACKAGER" = "emerge" ]; then
|
||||
${SUDO_CMD} ${PACKAGER} --deselect app-shells/bash-completion sys-apps/bat app-text/tree app-text/multitail app-misc/fastfetch app-editors/neovim app-misc/trash-cli
|
||||
elif [ "$PACKAGER" = "xbps-install" ]; then
|
||||
${SUDO_CMD} xbps-remove -Ry ${DEPENDENCIES}
|
||||
elif [ "$PACKAGER" = "nix-env" ]; then
|
||||
${SUDO_CMD} ${PACKAGER} -e bash-completion bat tree multitail fastfetch neovim trash-cli
|
||||
elif [ "$PACKAGER" = "dnf" ] || [ "$PACKAGER" = "yum" ]; then
|
||||
${SUDO_CMD} ${PACKAGER} remove -y ${DEPENDENCIES}
|
||||
else
|
||||
${SUDO_CMD} ${PACKAGER} remove -y ${DEPENDENCIES}
|
||||
fi
|
||||
}
|
||||
|
||||
uninstall_font() {
|
||||
FONT_NAME="MesloLGS Nerd Font Mono"
|
||||
FONT_DIR="$HOME/.local/share/fonts/$FONT_NAME"
|
||||
|
||||
if [ -d "$FONT_DIR" ]; then
|
||||
print_colored "$YELLOW" "Removing font: $FONT_NAME"
|
||||
rm -rf "$FONT_DIR"
|
||||
fc-cache -fv
|
||||
print_colored "$GREEN" "Font removed: $FONT_NAME"
|
||||
else
|
||||
print_colored "$YELLOW" "Font not found: $FONT_NAME"
|
||||
fi
|
||||
}
|
||||
|
||||
uninstall_starship_and_fzf() {
|
||||
if command_exists starship; then
|
||||
print_colored "$YELLOW" "Uninstalling Starship..."
|
||||
${SUDO_CMD} rm -f "$(command -v starship)"
|
||||
print_colored "$GREEN" "Starship uninstalled"
|
||||
fi
|
||||
|
||||
if [ -d "$HOME/.fzf" ]; then
|
||||
print_colored "$YELLOW" "Uninstalling fzf..."
|
||||
"$HOME/.fzf/uninstall"
|
||||
rm -rf "$HOME/.fzf"
|
||||
print_colored "$GREEN" "fzf uninstalled"
|
||||
fi
|
||||
}
|
||||
|
||||
uninstall_zoxide() {
|
||||
if command_exists zoxide; then
|
||||
print_colored "$YELLOW" "Uninstalling Zoxide..."
|
||||
${SUDO_CMD} rm -f "$(command -v zoxide)"
|
||||
print_colored "$GREEN" "Zoxide uninstalled"
|
||||
fi
|
||||
}
|
||||
|
||||
remove_configs() {
|
||||
USER_HOME=$(getent passwd "${SUDO_USER:-$USER}" | cut -d: -f6)
|
||||
|
||||
print_colored "$YELLOW" "Removing configuration files..."
|
||||
|
||||
# Remove .bashrc symlink and restore backup if it exists
|
||||
if [ -L "$USER_HOME/.bashrc" ]; then
|
||||
rm "$USER_HOME/.bashrc"
|
||||
if [ -f "$USER_HOME/.bashrc.bak" ]; then
|
||||
mv "$USER_HOME/.bashrc.bak" "$USER_HOME/.bashrc"
|
||||
print_colored "$GREEN" "Restored original .bashrc"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Remove starship config
|
||||
rm -f "$USER_HOME/.config/starship.toml"
|
||||
|
||||
# Remove fastfetch config
|
||||
rm -f "$USER_HOME/.config/fastfetch/config.jsonc"
|
||||
|
||||
print_colored "$GREEN" "Configuration files removed"
|
||||
}
|
||||
|
||||
remove_linuxtoolbox() {
|
||||
if [ -d "$LINUXTOOLBOXDIR" ]; then
|
||||
print_colored "$YELLOW" "Removing linuxtoolbox directory..."
|
||||
rm -rf "$LINUXTOOLBOXDIR"
|
||||
print_colored "$GREEN" "linuxtoolbox directory removed"
|
||||
fi
|
||||
}
|
||||
|
||||
# Main execution
|
||||
determine_package_manager
|
||||
determine_sudo_command
|
||||
uninstall_dependencies
|
||||
uninstall_font
|
||||
uninstall_starship_and_fzf
|
||||
uninstall_zoxide
|
||||
remove_configs
|
||||
remove_linuxtoolbox
|
||||
|
||||
print_colored "$GREEN" "Uninstallation complete. Please restart your shell for changes to take effect."
|
||||
Reference in New Issue
Block a user