Skip to content

Instantly share code, notes, and snippets.

@bluPhy
Last active July 8, 2025 21:19
Show Gist options
  • Save bluPhy/e9979ef668d959c40ec70700dfb9fa92 to your computer and use it in GitHub Desktop.
Save bluPhy/e9979ef668d959c40ec70700dfb9fa92 to your computer and use it in GitHub Desktop.
Script to keep Linux updated and basic clean-up
#!/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