rename err to bash-bear
[distro-setup] / filesystem / usr / local / bin / myupgrade
index e5401dc836675ab54f9aafb31490ca5cf08ed7e7..6c4ed879a7ee4baeb24c5e201e417534b967274b 100755 (executable)
@@ -2,12 +2,14 @@
 # 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
+source /usr/local/lib/bash-bear
 pre="${0##*/}:"
 PATH="/sbin:$PATH"
 m() { printf "$pre %s\n"  "$*"; "$@"; }
@@ -19,35 +21,77 @@ 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() {
   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
 }
 
 
-if [[ $HOSTNAME != "$MAIL_HOST" ]]; then
-  ksta=$(needrestart -b | sed -n 's/NEEDRESTART-KSTA: *//p');
-  case $ksta in
-    1) : ;;
-    [023]) myreboot ;;
-    *) err error: unknown kernel status ;;
-  esac
+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
 
-# needsrestarts automatic restarts failed.
-if ! out=$(/sbin/needrestart -p 2>&1); then
-  e "$out"
+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 -l &>/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