#!/usr/bin/env bash script_name="$(basename $(realpath $0))" working_dir="$(dirname $(realpath $0))" conf_file="${working_dir}/conf/${script_name%%.*}.conf" log_file="$(mktemp)" random_prefix="$(head -c 300 /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 8)" backup_date=$(date +%Y-%m-%d-%H%M) # ============= # --- Some Variables # ============= export DEBIAN_FRONTEND=noninteractive removed_packages_log="/var/log/removed-debian-packages.log" updated_packages_log="/var/log/updated-debian-packages.log" # ============= # --- Some Functions # ============= clean_up() { if [[ -f "$_backup_crontab_file" ]]; then blank_line echononl " (Re)Install Crontab from previously saved crontab file '$_backup_crontab_file'.." crontab $_backup_crontab_file >> $log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $log_file)" fi fi # Perform program exit housekeeping rm -f $log_file rm -rf /tmp/*.${random_prefix} blank_line exit $1 } echononl(){ if $terminal ; then echo X\\c > /tmp/shprompt$$ if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then echo -e -n " $*\\c" 1>&2 else echo -e -n " $*" 1>&2 fi rm /tmp/shprompt$$ fi } echo_print_command() { if $terminal ; then echo X\\c > /tmp/shprompt$$ if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then echo -e -n "\033[60G - \033[1m$*\\c\033[m" 1>&2 else echo -e -n "\033[60G - \033[1m$*\033[m" 1>&2 fi rm /tmp/shprompt$$ fi } echo_done() { if $terminal ; then echo -e "\033[85G[ \033[32mdone\033[m ]" fi } echo_ok() { if $terminal ; then echo -e "\033[85G[ \033[32mok\033[m ]" fi } echo_ignore() { if $terminal ; then echo -e "\033[85G[ \033[33mignore\033[m ]" fi } echo_warning() { if $terminal ; then echo -e "\033[85G[ \033[33m\033[1mwarn\033[m ]" fi } echo_failed(){ if $terminal ; then echo -e "\033[85G[ \033[1;31mfailed\033[m ]" fi } echo_skipped() { if $terminal ; then echo -e "\033[85G[ \033[37mskipped\033[m ]" fi } fatal (){ blank_line if $terminal ; then echo -e " [ \033[31m\033[1mFatal\033[m ]: \033[37m\033[1m$*\033[m" echo "" echo -e " \033[31m\033[1m Script will be interrupted..\033[m\033[m" else echo "fatal: $*" echo "Script will be interrupted.." fi clean_up 1 } error(){ blank_line if $terminal ; then echo -e " [ \033[31m\033[1mFehler\033[m ]: $*" else echo "Error: $*" fi blank_line } warn (){ if $terminal ; then echo "" echo -e " [ \033[33m\033[1mWarning\033[m ]: $*" echo "" fi } info (){ if $terminal ; then echo "" echo -e " [ \033[32m\033[1mInfo\033[m ]: $*" echo "" fi } ## - Check if a given array (parameter 2) contains a given string (parameter 1) ## - containsElement () { local e for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done return 1 } trim() { local var="$*" var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters echo -n "$var" } blank_line() { if $terminal ; then echo "" fi } # ============= # --- Jobhandling # ============= # - Run 'clean_up' for signals SIGHUP SIGINT SIGTERM # - trap clean_up SIGHUP SIGINT SIGTERM # ============= # --- Some Checks # ============= # - Running in a terminal? # - if [[ -t 1 ]] ; then terminal=true else terminal=false fi if $terminal ; then echo "" echo -e "\033[1mUpgrade Packages with a 'smart' conflict resolution system\033[m" echo "" fi echononl "\033[32m\033[1mResynchronize the package index files\033[m" echo_print_command "apt-get update" apt-get -y update > $log_file 2>&1 if [[ $? -gt 0 ]]; then echo_failed fatal "$(cat $log_file)" else echo_done fi # - get list of upgradable packages # packages_updated="$(apt-get -V -s dist-upgrade | grep -E "^ .*=>.*" | awk '{print$1}')" #echononl "\033[32m\033[1mUpgrade Packages\033[m - \033[1mapt full-upgrade\033[m" #if [[ -n "$packages_updated" ]]; then # apt full-upgrade -y > $log_file 2>&1 # if [[ $? -gt 0 ]]; then # echo_failed # fatal "$(cat $log_file)" # else # echo_done # echo # echo " This packages have been updated:" # for _package in $packages_updated ; do # echo -e " \033[1m$_package\033[m" # done # echo "" # fi #else # echo_skipped #fi echononl "\033[32m\033[1mUpgrade Packages\033[m" echo_print_command "apt-get dist-upgrade" if [[ -n "$packages_updated" ]]; then apt-get dist-upgrade -y > $log_file 2>&1 if [[ $? -gt 0 ]]; then echo_failed fatal "$(cat $log_file)" else echo_done echo echo " This packages have been updated:" echo "[ $(date +%Y-%d-%m" "%H:%M) ] This packages have been updated:" >> "$updated_packages_log" for _package in $packages_updated ; do echo -e " \033[1m$_package\033[m" echo " $_package" >> "$updated_packages_log" done echo "" echo "" >> "$updated_packages_log" fi else echo_skipped fi echononl "\033[32m\033[1mRemove unused Packages\033[m" echo_print_command "apt-get autoremove" apt-get autoremove -y > $log_file 2>&1 if [[ $? -gt 0 ]]; then echo_failed fatal "$(cat $log_file)" else echo_done fi echononl "\033[32m\033[1mClear out the local repository of retrieved package files\033[m" echo_print_command "apt-get clean" apt-get clean -y > $log_file 2>&1 if [[ $? -gt 0 ]]; then echo_failed fatal "$(cat $log_file)" else echo_done fi if [[ -f "/var/run/reboot-required" ]]; then echo -e "\n\t[ \033[31m\033[1m Reboot required! \033[m\033[m ]\n" fi # - Get list of packages with onlx config files present # - rc_packages="$(dpkg --list | awk '/^rc/ { print $2 }')" blank_line if $terminal; then echo -e " \033[32m\033[1mRemove (purge) packages with only config files installed ((rc):\033[m" echo -en " \033[1mapt-get purge \$(dpkg --list | awk '/^rc/ { print $2 }')\033[m" fi if [[ -n "$rc_packages" ]] ; then apt-get purge -y $(dpkg --list | awk '/^rc/ { print $2 }') > $log_file 2>&1 if [[ $? -gt 0 ]]; then echo_failed fatal "$(cat $log_file)" else echo_done echo echo " This packages with only config files installed have been removed:" echo "[ $(date +%Y-%d-%m" "%H:%M) ] This packages with only config files installed have been removed:" >> "$removed_packages_log" for _package in $rc_packages ; do echo -e " \033[1m$_package\033[m" echo " $_package" >> "$removed_packages_log" done echo "" echo "" >> "$removed_packages_log" fi else echo_skipped fi if [[ -f "/var/run/reboot-required" ]]; then if $terminal ; then echo -e "\n\t[ \033[31m\033[1m Reboot required! \033[m\033[m ]\n" else echo "" echo " System was updated - Reboot required!" echo "" fi fi clean_up 0