diff --git a/apt-update.sh b/apt-update.sh index 20d689b..181f2a7 100755 --- a/apt-update.sh +++ b/apt-update.sh @@ -1,30 +1,120 @@ -#!/bin/bash +#!/usr/bin/env bash +# +# Automatische veilige package-upgrade voor Debian/Ubuntu +# - Draait stil als er geen updates zijn (geschikt voor cron) +# - Toont output alleen bij echte upgrades +# - Robuuste foutafhandeling +# -# Stil stdout/stderr behalve bij echte actie -exec 3>&1 4>&2 +set -euo pipefail -# Systeem bijwerken -apt-get -qq update +# Veilige cron-omgeving +PATH=/usr/sbin:/usr/bin:/sbin:/bin +export DEBIAN_FRONTEND=noninteractive -# Upgradable packages ophalen (alleen namen) -listUpgrades=$(apt list --upgradable 2>/dev/null | grep -F '[upgradable from:' | cut -d/ -f1) +log() { + printf "[%s] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$*" +} -# Als er GEEN upgrades zijn, netjes afsluiten -if [ -z "$listUpgrades" ]; then +# ---- Lock timeout configuratie ---- +APT_LOCK_TIMEOUT=60 + +# ---- Update package index ---- +if ! apt-get -qq -o DPkg::Lock::Timeout="${APT_LOCK_TIMEOUT}" update; then + log "FOUT: apt-get update mislukt." + exit 1 +fi + +# ---- Detecteer beschikbare upgrades (robuste parsing) ---- +readarray -t packages < <( + apt-get -s upgrade \ + -o DPkg::Lock::Timeout="${APT_LOCK_TIMEOUT}" \ + | awk '/^Inst / {print $2}' +) + +# ---- Stop als er geen upgrades zijn ---- +if [ "${#packages[@]}" -eq 0 ]; then + log "Geen updates" exit 0 fi -# Anders: upgrades uitvoeren en output tonen (zodat cron mailt) -echo "De volgende pakketten worden bijgewerkt:" -echo "$listUpgrades" -echo "==============================" +log "De volgende pakketten worden bijgewerkt:" +printf ' - %s\n' "${packages[@]}" +log "=======================================" -# Upgrade uitvoeren -DEBIAN_FRONTEND=noninteractive apt-get --yes --assume-yes \ - -o DPkg::options::="--force-confdef" \ - -o DPkg::options::="--force-confold" \ - --only-upgrade -qq install $listUpgrades +# ---- Voer upgrade uit ---- +if ! apt-get -y \ + -o DPkg::Lock::Timeout="${APT_LOCK_TIMEOUT}" \ + -o DPkg::options::="--force-confdef" \ + -o DPkg::options::="--force-confold" \ + upgrade; then + log "FOUT: upgrade mislukt." + exit 1 +fi -# Opruimen -DEBIAN_FRONTEND=noninteractive apt-get --yes -qq autoremove -DEBIAN_FRONTEND=noninteractive apt-get -qq clean \ No newline at end of file +# ---- Opruimen ---- +apt-get -y -o DPkg::Lock::Timeout="${APT_LOCK_TIMEOUT}" autoremove +apt-get -qq clean + +log "Upgrade succesvol voltooid." +root@dt27:~# bash test.sh +[2026-03-04 09:17:10] Geen updates +root@dt27:~# cat test.sh +#!/usr/bin/env bash +# +# Automatische veilige package-upgrade voor Debian/Ubuntu +# - Draait stil als er geen updates zijn (geschikt voor cron) +# - Toont output alleen bij echte upgrades +# - Robuuste foutafhandeling +# + +set -euo pipefail + +# Veilige cron-omgeving +PATH=/usr/sbin:/usr/bin:/sbin:/bin +export DEBIAN_FRONTEND=noninteractive + +log() { + printf "[%s] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$*" +} + +# ---- Lock timeout configuratie ---- +APT_LOCK_TIMEOUT=60 + +# ---- Update package index ---- +if ! apt-get -qq -o DPkg::Lock::Timeout="${APT_LOCK_TIMEOUT}" update; then + log "FOUT: apt-get update mislukt." + exit 1 +fi + +# ---- Detecteer beschikbare upgrades (robuste parsing) ---- +readarray -t packages < <( + apt-get -s upgrade \ + -o DPkg::Lock::Timeout="${APT_LOCK_TIMEOUT}" \ + | awk '/^Inst / {print $2}' +) + +# ---- Stop als er geen upgrades zijn ---- +if [ "${#packages[@]}" -eq 0 ]; then + exit 0 +fi + +log "De volgende pakketten worden bijgewerkt:" +printf ' - %s\n' "${packages[@]}" +log "=======================================" + +# ---- Voer upgrade uit ---- +if ! apt-get -y \ + -o DPkg::Lock::Timeout="${APT_LOCK_TIMEOUT}" \ + -o DPkg::options::="--force-confdef" \ + -o DPkg::options::="--force-confold" \ + upgrade; then + log "FOUT: upgrade mislukt." + exit 1 +fi + +# ---- Opruimen ---- +apt-get -y -o DPkg::Lock::Timeout="${APT_LOCK_TIMEOUT}" autoremove +apt-get -qq clean + +log "Upgrade succesvol voltooid." \ No newline at end of file