X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=filesystem%2Fusr%2Flocal%2Fbin%2Fmyupgrade;h=49197fb57c1fe7f7c3d2b4f0f6fc13844ba56cd9;hb=ec4efaeb603f21de169aeedff4907d2279bada3a;hp=7be700124f79cf8c50c741803d4d0ce0571ad315;hpb=77c0b307b372824b45e8d3f78f3add554e7229ab;p=distro-setup diff --git a/filesystem/usr/local/bin/myupgrade b/filesystem/usr/local/bin/myupgrade index 7be7001..49197fb 100755 --- a/filesystem/usr/local/bin/myupgrade +++ b/filesystem/usr/local/bin/myupgrade @@ -1,13 +1,33 @@ #!/bin/bash -# Copyright (C) 2019 Ian Kelling -# SPDX-License-Identifier: AGPL-3.0-or-later +# 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. -if [ -z "$BASH_VERSION" ]; then echo "error: shell is not bash" >&2; exit 1; fi +set -e; . /usr/local/lib/bash-bear; set +e -source /usr/local/lib/err pre="${0##*/}:" PATH="/sbin:$PATH" m() { printf "$pre %s\n" "$*"; "$@"; } @@ -19,32 +39,88 @@ err() { echo "[$(date +'%Y-%m-%d %H:%M:%S%z')]: $pre: $*" >&2; } 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 + 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" | pee cat "wall -n" + 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 + 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" | pee cat "wall -n" + 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 + +case $hn in + sy) + /b/fai/config/distro-install-common/install-stable-kernel-debs + ;; +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. -if ! out=$(/sbin/needrestart -p 2>&1); then - e "$out" - if [[ $HOSTNAME != "$MAIL_HOST" ]]; then +# 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