2020-10-18 13:33:41 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
# With systemd, we can force logging to the journal. This is better than
|
|
|
|
# spamming the world with cron mails. You can then view these logs using
|
|
|
|
# "journalctl -rat upgrade-and-reboot".
|
2021-01-23 10:32:35 +00:00
|
|
|
if which logger >/dev/null 2>&1
|
2020-10-18 13:33:41 +00:00
|
|
|
then
|
2021-03-26 08:02:48 +00:00
|
|
|
# Dump stdout and stderr to logger, which will then put everything
|
|
|
|
# into the journal.
|
2021-01-23 10:32:35 +00:00
|
|
|
exec 1> >(logger -t upgrade-and-reboot -p user.info)
|
2021-03-26 08:02:48 +00:00
|
|
|
exec 2> >(logger -t upgrade-and-reboot -p user.error)
|
2020-10-18 13:33:41 +00:00
|
|
|
fi
|
|
|
|
|
2020-11-21 09:30:05 +00:00
|
|
|
statusfile="/var/tmp/unattended_upgrades.status"
|
2020-11-10 08:50:20 +00:00
|
|
|
# Workaround, because /var/tmp is usually 1777
|
|
|
|
[[ "$UID" == 0 ]] && chown root:root "$statusfile"
|
2020-10-18 13:33:41 +00:00
|
|
|
|
2020-11-10 08:50:20 +00:00
|
|
|
logins=$(ps h -C sshd -o euser | awk '$1 != "root" && $1 != "sshd" && $1 != "sshmon"')
|
2020-10-18 13:33:41 +00:00
|
|
|
if [[ -n "$logins" ]]
|
|
|
|
then
|
|
|
|
echo "Will abort now, there are active SSH logins: $logins"
|
2020-11-10 08:50:20 +00:00
|
|
|
echo "abort_ssh" > "$statusfile"
|
2020-10-18 13:33:41 +00:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
softlockdir=/var/lib/bundlewrap/soft-${node.name}
|
|
|
|
mkdir -p "$softlockdir"
|
|
|
|
printf '{"comment": "UPDATE", "date": %s, "expiry": %s, "id": "UNATTENDED", "items": ["*"], "user": "root@localhost"}\n' \
|
|
|
|
$(date +%s) \
|
|
|
|
$(date -d 'now + 30 mins' +%s) \
|
|
|
|
>"$softlockdir"/UNATTENDED
|
|
|
|
trap 'rm -f "$softlockdir"/UNATTENDED' EXIT
|
|
|
|
|
2020-11-10 08:50:20 +00:00
|
|
|
(
|
|
|
|
apt-get update
|
|
|
|
DEBIAN_FRONTEND=noninteractive apt-get -y -q -o Dpkg::Options::=--force-confold -o Dpkg::Options::=--force-confdef dist-upgrade
|
|
|
|
)
|
2020-10-18 13:33:41 +00:00
|
|
|
ret=$?
|
2020-11-21 17:07:01 +00:00
|
|
|
|
|
|
|
echo "apt-get dist-upgrade exited $ret"
|
|
|
|
echo "$ret" > "$statusfile"
|
|
|
|
|
2020-10-18 13:33:41 +00:00
|
|
|
if (( $ret != 0 ))
|
|
|
|
then
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2020-10-23 02:33:01 +00:00
|
|
|
DEBIAN_FRONTEND=noninteractive apt-get -y -q autoclean
|
|
|
|
DEBIAN_FRONTEND=noninteractive apt-get -y -q autoremove
|
2020-10-18 13:33:41 +00:00
|
|
|
|
2021-04-02 06:11:17 +00:00
|
|
|
% if clean_old_kernels:
|
|
|
|
existing=$(dpkg --get-selections | grep -E '^linux-(image|headers)-[0-9]' || true)
|
|
|
|
|
|
|
|
if [[ -z "$existing" ]]
|
|
|
|
then
|
|
|
|
echo "ERROR: No installed kernels found! Aborting!" >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
current=$(uname -r | sed -r 's/-[a-zA-Z]+$//')
|
|
|
|
latest=$(echo "$existing" | sort --version-sort -t- -k 3,4 | tail -n 1 | sed -r 's/[^0-9]+([0-9]\.[^-]+-[0-9]+).*/\1/')
|
|
|
|
todelete=$(echo "$existing" | grep -v -E "($current|$latest)" | awk '{ print $1 }' || true)
|
|
|
|
|
|
|
|
if [[ -n "$todelete" ]]
|
|
|
|
then
|
|
|
|
DEBIAN_FRONTEND=noninteractive apt-get -qy purge $todelete
|
|
|
|
fi
|
|
|
|
% endif
|
|
|
|
|
|
|
|
|
2020-10-18 13:33:41 +00:00
|
|
|
if [[ -f /var/run/reboot-required ]]
|
|
|
|
then
|
2021-01-17 17:43:30 +00:00
|
|
|
% if 'mail' in data:
|
2020-10-23 02:33:01 +00:00
|
|
|
date | mail -s "SYSREBOOTNOW ${node.name}" ${data['mail']}
|
2021-01-17 17:43:30 +00:00
|
|
|
% endif
|
2020-10-18 13:33:41 +00:00
|
|
|
systemctl reboot
|
2021-04-02 06:12:51 +00:00
|
|
|
% if restart_triggers
|
|
|
|
else
|
|
|
|
% for affected, restarts in sorted(restart_triggers.items()):
|
|
|
|
up_since=$(systemctl show "${affected}" | sed -n 's/^ActiveEnterTimestamp=//p' || echo 0)
|
|
|
|
up_since_ts=$(date -d "$up_since" +%s || echo 0)
|
|
|
|
now=$(date +%s)
|
|
|
|
|
|
|
|
if [ $((now - up_since_ts)) -lt 3600 ]
|
|
|
|
then
|
|
|
|
% for restart in sorted(restarts):
|
|
|
|
systemctl restart "${restart}" || true
|
|
|
|
% endfor
|
|
|
|
fi
|
|
|
|
% endfor
|
|
|
|
% endif
|
2020-10-18 13:33:41 +00:00
|
|
|
fi
|