Compare commits

..

14 Commits

Author SHA1 Message Date
jschantli 322cd72cc6 Added an option to use script in opensuse. 2026-05-24 21:34:37 -07:00
jschantli 3c1fc38fae 1.
Removed "com.discordapp.Discord" from the FLATPAK_PACKAGES array.
2.
Added a new install_discord function that installs the Discord RPM directly using the link provided.
3.
Updated the main menu and switch cases (options 1, 2, and 11) to include the install_discord step and execute it when running the installation commands.
2026-05-16 09:18:51 -07:00
jschantli fca58a98c7 Added topgrade, mpv and windscribe as packages installed. Added option 12 and 13 for install of windscribe and topgrade. 2026-05-05 20:15:34 -07:00
jschantli b593617163 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	bazzite-postinstall.sh
2026-05-05 20:06:17 -07:00
Jacob Schantli 84522b8b8a Update postinstall.sh
Added extension gnome-wallpaper-engine
2026-05-05 20:04:35 -07:00
Jacob Schantli 79a66c0d4b Removed linuxtoys 2026-04-21 20:17:22 -07:00
Jacob Schantli 3a4845d999 Add bazzite-postinstall.sh
Adding a script to install my packages in Bazzite (Atomic Fedora). This is a WIP and is not done.
2026-04-21 19:34:31 -07:00
jschantli 09ff03a527 Adding a script to install my packages in Bazzite (Atomic Fedora) 2026-04-21 19:30:29 -07:00
Jacob Schantli c361a8bd12 Update postinstall.sh
Added fastmail to flatpak packages
2026-04-14 17:25:52 -07:00
Jacob Schantli 2a13d31a94 Update README.md
Updated Instructions.
2026-04-07 18:54:24 -07:00
jschantli edb22899e6 Updated script to what I use now. 2026-04-07 18:48:49 -07:00
jschantli 26c7b549d7 Updated script to what I use now. 2026-04-07 18:48:19 -07:00
jschantli de695092c0 test 2026-04-07 18:37:06 -07:00
jschantli cea2204433 test 2026-04-07 18:37:02 -07:00
16 changed files with 2954 additions and 18 deletions
+633
View File
@@ -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)"
+10
View File
@@ -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/
+9
View File
@@ -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>
+6
View File
@@ -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>
+8
View File
@@ -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
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
+8
View File
@@ -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>
-4
View File
@@ -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
+449
View File
@@ -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 "----------------------------------------------------"
+425
View File
@@ -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
View File
@@ -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
View File
@@ -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>
+525
View File
@@ -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 "----------------------------------------------------"
+81 -13
View File
@@ -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
+279
View File
@@ -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
View File
@@ -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."