Skip to content

Instantly share code, notes, and snippets.

@smoser
Last active October 26, 2023 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save smoser/2217cde1a876d9d1e014 to your computer and use it in GitHub Desktop.
Save smoser/2217cde1a876d9d1e014 to your computer and use it in GitHub Desktop.
upgrade [apt-get update/upgrade system and log / time ]

upgrade

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment