#!/bin/bash # I, Ian Kelling, follow the GNU license recommendations at # https://www.gnu.org/licenses/license-recommendations.en.html. They # recommend that small programs, < 300 lines, be licensed under the # Apache License 2.0. This file contains or is part of one or more small # programs. If a small program grows beyond 300 lines, I plan to switch # its license to GPL. # Copyright 2024 Ian Kelling # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # 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. set -e; . /usr/local/lib/bash-bear; set +e 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 # 2>/dev/null hopefully gets rid of errors like: wall: /dev/pts/0: No such file or directory sed 's/^/myupgrade /' | pee logger "wall -n" 2>/dev/null fi } myreboot() { if [[ -e /tmp/myupgrade-noreboot ]]; then e "would rebooted but /tmp/myupgrade-noreboot exists" return fi for x in {30..1}; do echo "pid $$. unattended upgrade, rebooting in $((x*10)) seconds" | wall -n 2>/dev/null 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 2>/dev/null sleep 10 done echo "pid $$. dpkg locked for 5 minutes, automatic reboot failed" | d } case $hn in kd) /c/roles/prom/files/simple/usr/local/bin/fsf-install-prometheus /c/roles/prom_export/files/simple/usr/local/bin/fsf-install-node-exporter -l 127.0.0.1 ;; li|bk|je) /c/roles/prom_export/files/simple/usr/local/bin/fsf-install-node-exporter -l 127.0.0.1 ;; *) /c/roles/prom_export/files/simple/usr/local/bin/fsf-install-node-exporter ;; esac # 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. # I originally had the idea that for MAIL_HOST, I'd just send an email # if something needs restarting. But atm, I have a bad habit of ignoring # those emails. if ! needrestart -p -k &>/dev/null; then myreboot fi needrestart -b -l -r a |& logger -t myupgrade sleep 1 # Restart based on library doesnt always work. If we still # detect outdated libraries after trying to automatically restart, # then do a reboot unless we are on systems we care a bit more about # uptime, then send us an email. # # Note: I've noticed restart based on library has tended to screw up # desktop related daemons because they have bugs when restarted in # isolation instead of as part of bring up and down the whole desktop. # But, I'd rather something gets messed up than things not get # restarted. if ! /sbin/needrestart -p &>/dev/null; then if [[ $hn == "$MAIL_HOST" || $hn == kd ]]; then # send us an email so we can decide what to do needrestart -r l else myreboot fi fi