#!/bin/bash # Copyright (C) 2019 Ian Kelling # SPDX-License-Identifier: AGPL-3.0-or-later # usage: set DEBUG env var to anything to output to stdout # Note: running this inside a cronjob, it wont mail any output if we end # up rebooting from this script. if [ -z "$BASH_VERSION" ]; then echo "error: shell is not bash" >&2; exit 1; fi source /usr/local/lib/err pre="${0##*/}:" PATH="/sbin:$PATH" m() { printf "$pre %s\n" "$*"; "$@"; } e() { printf "$pre %s\n" "$*"; } err() { echo "[$(date +'%Y-%m-%d %H:%M:%S%z')]: $pre: $*" >&2; } [[ $EUID == 0 ]] || exec sudo -E "${BASH_SOURCE[0]}" "$@" hn=$(hostname -f) source /a/bin/bash_unpublished/source-state d() { if [[ $DEBUG ]]; then pee cat "wall -n" else sed 's/^/myupgrade /' | pee logger "wall -n" fi } myreboot() { for x in {30..1}; do echo "pid $$. unattended upgrade, rebooting in $((x*10)) seconds" | wall -n sleep 10 done for x in {30..1}; do if ! fuser /var/lib/dpkg/lock &> /dev/null; then echo "pid $$. unattended upgrade, rebooting now" | d /a/bin/ds/keyscript-on /sbin/reboot exit 0 fi echo "pid $$. unattended upgrade reboot waiting 10 seconds for dpkg lock" | wall -n sleep 10 done echo "pid $$. dpkg locked for 5 minutes, automatic reboot failed" | d } # TODO: executed from cron, this doesnt sent an email when we reboot, # because rebooting from the script stops the ability to send email. # We should figure some workaround. if ! out=$(/sbin/needrestart -p 2>&1); then if [[ $HOSTNAME == "$MAIL_HOST" ]]; then needrestart -r l else myreboot fi fi