#!/usr/bin/env bash # A script to upgrade a RHEL derivative (Fedora, CentOS, ...). If you have ansible or puppet: # this is way more simple with an automation framework. This script works with the paradigm # that you only have a bash available and you want to see what happens without being murdered # by gazillions of output lines. # This script avoids combining options, e.g. dnf -C -q instead of dnf -Cq, since # dnf is perfectly capable of POSIX standards, but yum fails at combined parameters. # So we'll leave it this way in case of conversion of this script to yum or extension # to be capable of both. (tl;dr no combined options because yum sucks at POSIX standards) ROK="\033[666D[ \033[32mOK\033[0m ]\033[u\033[K" RWRN="\033[666D[\033[33mWARN\033[0m]\033[u\033[K" RERR="\033[666D[\033[31mFAIL\033[0m]\033[u\033[K" RINF="\033[666D[\033[37mINFO\033[0m]\033[u\033[K" UPDAVAIL=1 SCMD="$(command -v snap 2>/dev/null)" UCMD="$(command -v dnf 2>/dev/null)" [ "$?" -ne 0 ]&&UCMD="$(command -v yum 2>/dev/null)" [ -z "$UCMD" ]&&printf "Neither yum nor dnf found!\n" >&2&&exit 1 RETVAL=0 function radd { [ -z "$1" ]&&return 1 printf "\033[666D\033[u\033[K \033[37m(%b)\033[0m" "$1" } function rbeg { [ -z "$1" ]&&return 1 printf "[....] %b.\033[s.." "$1" } function rok { case "$1" in "") printf "%b\n" "$ROK";; *) printf "%b" "$ROK" radd "$1" printf "\n" ;; esac } function rwrn { case "$1" in "") printf "%b\n" "$RWRN";; *) printf "%b" "$RWRN" radd "$1" printf "\n" ;; esac } function rerr { case "$1" in "") printf "%b\n" "$RERR";; *) printf "%b" "$RERR" radd "$1" printf "\n" ;; esac } function rinf { case "$1" in "") printf "%b\n" "$RINF";; *) printf "%b" "$RINF" radd "$1" printf "\n" ;; esac } function supgrade { printf "Listing updates...:\n" sudo "${UCMD}" -C -q check-upgrade case "$?" in 0|100) ;; *) RETVAL=1;return 1;; esac rbeg "Upgrading system packages" sudo "${UCMD}" -q -y upgrade case "$?" in 0) rok;; 1) rwrn "error occurred but was handled by dnf" case "RETVAL" in 0) RETVAL=255;; esac ;; 255) rwrn "Upgrade done but updates remaining" case "$RETVAL" in 0) RETVAL=255;; esac ;; *) rerr RETVAL=1;return 1 ;; esac printf "Checking for outdated running services or necessity to reboot...:\n" sudo "${UCMD}" needs-restarting } function snrefresh { rbeg "Refreshing snapd snaps" sudo "${SCMD}" refresh >/dev/null 2>&1 case "$?" in 0) rok;; *) rerr;RETVAL=1;return 1;; esac } rbeg "Updating dnf cache" sudo "${UCMD}" -q makecache case "$?" in 0) rok;; 100) rwrn;; *) rerr;exit 1;; esac rbeg "Checking for upgrades" sudo "${UCMD}" -C -q check-upgrade case "$?" in 0) rinf "No updates" ;; 100) rok "Updates found" UPDAVAIL=0 ;; esac if [ "$UPDAVAIL" -eq 0 ];then supgrade fi if [ ! -z "$SCMD" ];then snrefresh fi