Last active
July 8, 2025 21:19
-
-
Save bluPhy/e9979ef668d959c40ec70700dfb9fa92 to your computer and use it in GitHub Desktop.
Script to keep Linux updated and basic clean-up
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# Function to check if a command exists | |
commandExists() { | |
if command -v "$1" &>/dev/null; then | |
#msg "Command $1 exists\n" "success" | |
return 0 # Command exists | |
else | |
msg "Command $1 does not exist\n" "danger" | |
return 1 # Command does not exist | |
fi | |
} | |
# Prints colored text | |
msg() { | |
# Examples | |
# msg "This is a green text " "success"; | |
# msg "This is a yellow text " "warning"; | |
# msg "This is a light blue with a \t tab " "info"; | |
# msg "This is a red text with a \n new line " "danger"; | |
# msg "This has no color"; | |
if [ "$2" = "info" ]; then | |
COLOR="96m" | |
elif [ "$2" = "success" ]; then | |
COLOR="92m" | |
elif [ "$2" = "warning" ]; then | |
COLOR="93m" | |
elif [ "$2" = "danger" ]; then | |
COLOR="91m" | |
else #default color | |
COLOR="0m" | |
fi | |
STARTCOLOR="\e[$COLOR" | |
ENDCOLOR="\e[0m" | |
printf "$STARTCOLOR%b$ENDCOLOR" "$1" | |
} | |
# Function to detect operating system and CPU architecture | |
detectOsAndArch() { | |
OS=$(uname -s) | |
ARCH=$(uname -m) | |
case $OS in | |
Linux) | |
if [ -f /etc/os-release ]; then | |
source /etc/os-release | |
if [ -n "$PRETTY_NAME" ]; then | |
OS_PRETTY_NAME="$PRETTY_NAME" | |
else | |
OS_PRETTY_NAME="$ID ${VERSION_ID}" | |
fi | |
fi | |
if [ -f /etc/redhat-release ]; then | |
OS_PRETTY_NAME=$(cat /etc/redhat-release) | |
elif [ -f /etc/SuSE-release ]; then | |
OS_PRETTY_NAME=$(cat /etc/SuSE-release) | |
fi | |
;; | |
Darwin) | |
OS_PRETTY_NAME=$(sw_vers -productName) | |
VER=$(sw_vers -productVersion) | |
OS_PRETTY_NAME="$OS_PRETTY_NAME $VER" | |
;; | |
FreeBSD) | |
OS_PRETTY_NAME="FreeBSD $(freebsd-version)" | |
;; | |
OpenBSD) | |
OS_PRETTY_NAME="OpenBSD $(uname -r)" | |
;; | |
DragonFly) | |
OS_PRETTY_NAME="DragonFly BSD $(uname -r)" | |
;; | |
NetBSD) | |
OS_PRETTY_NAME="NetBSD $(uname -r)" | |
;; | |
esac | |
OS=$(echo "$OS" | tr -d '"' | tr -d '\n') | |
msg "Operating System: $OS\n" "info" | |
msg "Descriptive OS Name: $OS_PRETTY_NAME\n" "info" | |
msg "CPU Architecture: $ARCH\n" "info" | |
} | |
# Detect the package manager | |
detectPackageManager() { | |
if commandExists apt-get; then | |
msg "Detected APT package manager.\n" "info" | |
package_manager="apt" | |
elif commandExists dnf; then | |
msg "Detected DNF package manager.\n" "info" | |
package_manager="dnf" | |
elif commandExists yum; then | |
msg "Detected YUM package manager.\n" "info" | |
package_manager="yum" | |
elif commandExists zypper; then | |
msg "Detected Zypper package manager.\n" "info" | |
package_manager="zypper" | |
elif commandExists pacman; then | |
msg "Detected Pacman package manager.\n" "info" | |
package_manager="pacman" | |
elif commandExists pkg; then | |
msg "Detected *BSD (FreeBSD,OpenBSD,NetBSD,etc) pkg package manager.\n" "info" | |
package_manager="pkg" | |
else | |
msg "Error: Unable to detect the package manager.\n" "danger" | |
fi | |
} | |
updatePackages() { | |
local package_manager=$1 | |
case $package_manager in | |
apt) | |
msg "Updating using $package_manager...\n" "info" | |
DEBIAN_FRONTEND=noninteractive sudo $package_manager update | |
DEBIAN_FRONTEND=noninteractive sudo $package_manager -o APT::Get::Always-Include-Phased-Updates=true dist-upgrade -y | |
DEBIAN_FRONTEND=noninteractive sudo $package_manager autoremove -y | |
;; | |
yum) | |
msg "Updating using $package_manager...\n" "info" | |
sudo $package_manager update -y | |
sudo $package_manager clean all -y | |
;; | |
dnf) | |
msg "Updating using $package_manager...\n" "info" | |
sudo $package_manager update -y | |
sudo $package_manager clean all -y | |
;; | |
zypper) | |
msg "Updating using $package_manager...\n" "info" | |
sudo $package_manager --non-interactive refresh | |
sudo $package_manager --non-interactive dup -y | |
sudo $package_manager --non-interactive clean --all | |
;; | |
pacman) | |
msg "Updating using $package_manager...\n" "info" | |
sudo $package_manager -Syy | |
sudo $package_manager -Syu | |
sudo $package_manager -Rc | |
;; | |
pkg) | |
msg "Updating using $package_manager...\n" "info" | |
sudo $package_manager update -f | |
sudo $package_manager upgrade -y | |
;; | |
*) | |
msg "Unsupported distribution: $ID\n" "danger" | |
;; | |
esac | |
} | |
# Function to detect distribution-independent packaging formats | |
detectIndependentPackageManagers() { | |
APPIMAGE_FOUND=false | |
FLATPAK_FOUND=false | |
SNAP_FOUND=false | |
if command -v appimage &> /dev/null; then | |
APPIMAGE_FOUND=true | |
msg "AppImage found\n" "info" | |
fi | |
if command -v flatpak &> /dev/null; then | |
FLATPAK_FOUND=true | |
msg "Flatpak found\n" "info" | |
fi | |
if command -v snap &> /dev/null; then | |
SNAP_FOUND=true | |
msg "Snap found\n" "info" | |
fi | |
} | |
# Function to update distribution-independent packages | |
updateIndependentPackages() { | |
if [ "$FLATPAK_FOUND" = true ]; then | |
msg "Updating Flatpak packages..." "info" | |
flatpak update -y | |
fi | |
if [ "$SNAP_FOUND" = true ]; then | |
msg "Updating Snap packages..." "info" | |
snap refresh | |
fi | |
if [ "$APPIMAGE_FOUND" = true ]; then | |
msg "Listing installed AppImages (manual update required)..." "info" | |
find ~ -iname "*.AppImage" | |
fi | |
} | |
# Function to update Homebrew and packages | |
updateHomebrew() { | |
if commandExists brew; then | |
msg "Updating Homebrew...\n" "info" | |
brew cleanup | |
brew doctor | |
brew update | |
brew upgrade | |
brew upgrade --cask | |
else | |
msg "Homebrew is not installed. Skipping.\n" "danger" | |
fi | |
} | |
# Function to update Docker or Podman images and clean up dangling images | |
updateDockerImages() { | |
local container_cmd="" | |
if commandExists docker; then | |
container_cmd="docker" | |
msg "Docker detected. Updating images and cleaning up...\n" "info" | |
elif commandExists podman; then | |
container_cmd="podman" | |
msg "Podman detected. Updating images and cleaning up...\n" "info" | |
else | |
msg "Neither Docker nor Podman is installed, skipping image update and cleanup.\n" "warning" | |
return | |
fi | |
sudo $container_cmd images --format '{{.Repository}}:{{.Tag}}' | grep -v 'REPOSITORY\|none' | xargs -L1 sudo $container_cmd pull | |
if sudo $container_cmd images -f "dangling=true" -q | grep -q .; then | |
msg "Removing dangling images...\n" "info" | |
sudo $container_cmd rmi $(sudo $container_cmd images -f "dangling=true" -q) || true | |
else | |
msg "No dangling images found.\n" "info" | |
fi | |
} | |
# Function to update GitHub CLI extensions | |
updateGithubCliExtensions() { | |
if commandExists gh; then | |
msg "\nUpgrading GitHub CLI\n" "info" | |
gh extension upgrade --all | |
else | |
msg "GitHub CLI is not installed, skipping extension upgrade.\n" "warning" | |
fi | |
} | |
# Function to clean journal logs if systemd is available | |
cleanJournalLogs() { | |
if commandExists systemctl; then | |
msg "Cleaning journal logs...\n" "info" | |
sudo journalctl --vacuum-time 1d | |
else | |
msg "Systemd is not available, skipping log cleanup.\n" "warning" | |
fi | |
} | |
# Main execution | |
detectOsAndArch | |
detectPackageManager | |
updatePackages "$package_manager" | |
detectIndependentPackageManagers | |
updateIndependentPackages | |
updateHomebrew | |
updateDockerImages | |
updateGithubCliExtensions | |
cleanJournalLogs |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment