This is a simple script (scripts) to run the typical apt-get upgrade, and collect the logs to a directory.
Also included here is 'purge-kernels' to get rid of old kernels in your /boot.
#!/bin/sh | |
# like purge-old-kernels from byobu, but with some improvements. | |
sort_by_ver() { | |
python3 -c ' | |
#!/usr/bin/python3 | |
import functools, re, subprocess, sys | |
def sort_vers(a, b): | |
if a == b: | |
return 0 | |
a = a[re.search("\d", a).start():] | |
b = b[re.search("\d", b).start():] | |
r = subprocess.call(["dpkg", "--compare-versions", a, "lt", b]) | |
if r == 0: | |
return -1 | |
return 1 | |
print(" ".join(sorted(sys.argv[1:], key=functools.cmp_to_key(sort_vers)))) | |
' "$@" | |
} | |
cur_ver_flav=$(uname -r) | |
cand="" | |
considered="" | |
keeps="" | |
for k in $(sort_by_ver /boot/vmlinu?-*); do | |
[ "${k%.signed}" = "$k" ] || continue | |
ver_flav=${k#/boot/vmlinu?-} | |
considered="${considered} ${k}" | |
ver=${ver_flav%-*} | |
#echo "ver_flav=${ver_flav} cur=${cur}" | |
case " $keeps " in | |
*\ ${ver_flav}\ ) echo "keeping $ver_flav"; continue;; | |
esac | |
if [ "${ver_flav}" = "$cur_ver_flav" ]; then | |
echo "skipping current: $k" | |
else | |
cand="$ver${cand:+ ${cand}}" | |
fi | |
newest="$ver_flav" | |
newest_ver="$ver" | |
done | |
echo "considered: $considered" | |
echo "newest: $newest" | |
# cand contains versions in newest to oldest. with current and keeps removed. | |
# take newest out of the list. | |
cand=$(for c in $cand; do [ "$c" = "${newest_ver}" ] && continue; echo "$c"; done) | |
if [ -z "$cand" ]; then | |
echo "nothing to remove kept cur=$cur_ver_flav newest=$ver_flav" | |
exit 0 | |
fi | |
echo "cand: $cand" | |
purge_re="" | |
set -f | |
for x in ${cand}; do | |
purge_re="${purge_re:+${purge_re} }linux-.*$x-.*" | |
done | |
dry="" | |
[ "$1" = "--dry-run" ] && dry="echo" | |
assume_yes="" | |
if [ "$1" = "--assume-yes" ]; then | |
assume_yes="--assume-yes" | |
fi | |
# shellcheck disable=SC2086 | |
$dry sudo apt-get ${assume_yes} --purge remove $purge_re |
#!/bin/bash | |
# | |
# from https://gist.github.com/smoser/2217cde1a876d9d1e014 | |
_sudo() { | |
msg running "$@" | |
sudo "$@" | |
} | |
error() { echo "$@" 1>&2; } | |
main() { | |
local log="$HOME/upgrade-logs/$date.log" me="" date="" sudo="env" pst="" | |
date=$(date --utc +"%Y%m%d-%H%M") | |
[ -d "${log%/*}" ] || mkdir -p "${log%/*}" || return 1 | |
[ "$ID" = "0" ] || sudo="_sudo" | |
me=$(readlink -f "$0") || return 1 | |
: > "$log" || { error "failed write to $log"; return 1; } | |
$sudo UPGRADE_LOG="$log" \ | |
UPGRADE_SUMMARY="${log%/*}/summary.log" \ | |
"$me" run_upgrade "$@" 2>&1 | tee "$log" | |
pst=( "${PIPESTATUS[@]}" ) | |
echo "exit: ${pst[*]}" >> "$log" | |
for e in "${pst[@]}"; do [ "$e" = "0" ] || return "$e"; done | |
return 0 | |
} | |
msg() { | |
local now | |
now="$(date -R)" | |
echo ":: $now:" "$@" 1>&2; | |
[ -z "$UPGRADE_SUMMARY" ] || | |
echo ":: $now:" "$@" >> "$UPGRADE_SUMMARY" | |
} | |
run() { | |
local opname="$1" ss=${SECONDS} ret="" summary="" | |
shift | |
msg "$opname start" | |
"$@" | |
ret=$? | |
summary=$(sed -n \ | |
"/^::.*: $opname start/ { | |
s///; :a; n; /^[0-9]\+ upgraded,/p; /^::/q; ba; }" "$UPGRADE_LOG") | |
msg "$opname finish [$ret] took $((SECONDS-ss))s${summary:+ [$summary]}" | |
return $ret | |
} | |
run_upgrade() { | |
local aquiet="--assume-yes --quiet" | |
local rr_ts="" rr="/var/run/reboot-required" pkgs="" | |
if [ -f "$rr" ]; then | |
if ! rr_ts=$(stat --printf='%Y\n' "$rr"); then | |
msg "stat of $rr failed" | |
rr_ts="" | |
fi | |
fi | |
# shellcheck disable=SC2086 | |
run apt-update apt-get update --error-on=any $aquiet && | |
run apt-download apt-get dist-upgrade $aquiet --download-only && | |
run apt-dist-upgrade apt-get dist-upgrade $aquiet --no-download </dev/null && | |
run apt-autoremove apt-get $aquiet autoremove | |
local pk="${0%/*}/purge-kernels" | |
if [ ! -x "$pk" ]; then | |
pk=$(which purge-kernels) | |
fi | |
if [ -n "$pk" ]; then | |
run "purge-kernels" "$pk" --assume-yes | |
fi | |
if [ -f "$rr" ]; then | |
local pmsg="" rr_ts_new="" | |
rr_ts_new=$(stat --printf '%Y\n' "$rr") | |
if [ -z "${rr_ts}" ]; then | |
pmsg="Created during upgrade." | |
elif [ "${rr_ts}" = "${rr_ts_new}" ]; then | |
pmsg="Previously existed." | |
else | |
pmsg="Updated during upgrade." | |
fi | |
if [ -f "${rr}.pkgs" ]; then | |
pkgs=$(tr '\n' ' ' <"$rr.pkgs") | |
pkgs=${pkgs% } | |
fi | |
msg "Reboot is required. $pmsg [$pkgs]" | |
else | |
msg "Reboot not required." | |
fi | |
} | |
ID=$(id -u) | |
if [ "$1" = "run_upgrade" ]; then | |
run full-process run_upgrade | |
elif [ "${1:-main}" = "main" ] || [ "$ID" = "0" ]; then | |
main "$@" | |
exit | |
else | |
echo "confused by $1" | |
exit 1 | |
fi |